aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--ChangeLog.txt2236
-rw-r--r--RELEASE_NOTES.txt330
-rw-r--r--linden/doc/contributions.txt8
-rw-r--r--linden/indra/cmake/00-Common.cmake23
-rw-r--r--linden/indra/cmake/CopyWinLibs.cmake8
-rw-r--r--linden/indra/cmake/GStreamer.cmake48
-rw-r--r--linden/indra/cmake/OPENAL.cmake3
-rw-r--r--linden/indra/cmake/Python.cmake4
-rw-r--r--linden/indra/cmake/UI.cmake7
-rwxr-xr-xlinden/indra/develop.py48
-rw-r--r--linden/indra/lib/python/indra/base/lluuid.py5
-rw-r--r--linden/indra/lib/python/indra/ipc/llmessage.py6
-rw-r--r--linden/indra/llaudio/audioengine.h2
-rw-r--r--linden/indra/llcommon/llchat.h13
-rw-r--r--linden/indra/llcommon/llstring.h1
-rw-r--r--linden/indra/llcommon/llversionviewer.h4
-rw-r--r--linden/indra/llmath/llvolume.cpp12
-rw-r--r--linden/indra/llmath/xform.h2
-rw-r--r--linden/indra/llmedia/llmediaimplgstreamer.cpp39
-rw-r--r--linden/indra/llmedia/llmediaimplgstreamer.h6
-rw-r--r--linden/indra/llmedia/llmediaobserver.h1
-rw-r--r--linden/indra/llui/llclipboard.cpp41
-rw-r--r--linden/indra/llui/llclipboard.h11
-rw-r--r--linden/indra/llui/llfloater.cpp6
-rw-r--r--linden/indra/llui/llfloater.h2
-rw-r--r--linden/indra/llui/llkeywords.cpp4
-rw-r--r--linden/indra/llui/lllineeditor.cpp83
-rw-r--r--linden/indra/llui/lllineeditor.h13
-rw-r--r--linden/indra/llui/llscrolllistctrl.cpp12
-rw-r--r--linden/indra/llui/llscrolllistctrl.h1
-rw-r--r--linden/indra/llui/llspinctrl.cpp5
-rw-r--r--linden/indra/llui/lltexteditor.cpp97
-rw-r--r--linden/indra/llui/lltexteditor.h12
-rw-r--r--linden/indra/llui/llview.cpp80
-rw-r--r--linden/indra/llui/llview.h6
-rw-r--r--linden/indra/llvfs/lldir.cpp12
-rw-r--r--linden/indra/llvfs/lldir.h4
-rw-r--r--linden/indra/llwindow/CMakeLists.txt1
-rw-r--r--linden/indra/llwindow/llmousehandler.cpp59
-rw-r--r--linden/indra/llwindow/llmousehandler.h21
-rw-r--r--linden/indra/llwindow/llwindow.cpp16
-rw-r--r--linden/indra/llwindow/llwindow.h7
-rw-r--r--linden/indra/llwindow/llwindowsdl.cpp66
-rw-r--r--linden/indra/llwindow/llwindowsdl.h6
-rw-r--r--linden/indra/llwindow/llwindowwin32.cpp12
-rw-r--r--linden/indra/llwindow/llwindowwin32.h1
-rw-r--r--linden/indra/newview/CMakeLists.txt35
-rw-r--r--linden/indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--linden/indra/newview/Info-Imprudence.plist2
-rw-r--r--linden/indra/newview/app_settings/default_grids.xml37
-rw-r--r--linden/indra/newview/app_settings/settings.xml411
-rw-r--r--linden/indra/newview/app_settings/settings_per_account.xml13
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default1.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default2.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default3.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20neutral.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city%20weirdlights.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20night.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor2.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20shadows.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio1.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio2.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio3.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio4.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio5.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio6.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio7.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio8.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio9.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%202012.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Alien%20planet.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20An%20incongruent%20truth.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arid%20nestler.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arrakissed.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asian%20red%20dawn.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asiatix.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation%202.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Barcelon%20variation%202.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Beautiful%20again.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Breaking%20firmament.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Brillianter%20sunset.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Bubble%20sun%20severance.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Castle%20vain.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Climacontrasty.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Clouds%20indifferent.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Cobraring.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Coral%20reef.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Damage%20down.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Dark%20came%20over.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Das%20fog.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Deep%20blue%20sky.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Desert%20Sunset%20mod.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Early%20warning.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Eno%20would%20be%20proud.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Evil%20machinery.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Farmatronic%20sepia.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Fogvari.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Grit%20%26%20shame.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Herr%20Gracken.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Holy%20romance.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Hong%20Kong.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Ivory%20flowers.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Liz%20gluft.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Lonely%20cyberpunks.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Moon%20berries.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Noxumic.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Oriental%20delight.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Our%20night%20together.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Polaron%20charge%20II.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Red%20city.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Sparz%20puft.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Stay%20stonkin%27.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Study%20vessels.xml1
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Teak%20weak.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Wuxia%20nights.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/Rouge%201.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/Rouge%202.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/Rouge%203.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/Rouge%204.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/Rouge%205.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/skies/Rouge%206.xml141
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Arrakissed%20variation.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist%202.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Bayouette.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Chivandria%20clair.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Claira.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Coral%20reef.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Crosshatched%20plans.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Eyeballin%27.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Fantastuck.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Featuresque.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Freak%2DA%2Ddermia.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Glaznost.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Grantamount.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Hpmod.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Ice%2Dlike.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Impure.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Linear%20puddles.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Listeryne.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Liz%20Taylor.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Maldives.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Meridian%20verde.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Negative%20ultraspace.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Placida%20brite.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Pretty%20placid.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Raw%20sewage.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Showing%20age.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Soldier%27s%20legacy.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Subtleties.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Trandshan.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Watermelon%20juice.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Waterslides.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20What%27s%20on%20TV.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Wickedly.xml43
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20You%27re%20in%20luck.xml41
-rw-r--r--linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Yung%20buk.xml43
-rw-r--r--linden/indra/newview/floaterlogin.cpp723
-rw-r--r--linden/indra/newview/floaterlogin.h90
-rw-r--r--linden/indra/newview/gpu_table.txt4
-rw-r--r--linden/indra/newview/hippoGridManager.cpp819
-rw-r--r--linden/indra/newview/hippoGridManager.h174
-rw-r--r--linden/indra/newview/hippoLimits.cpp56
-rw-r--r--linden/indra/newview/hippoLimits.h33
-rw-r--r--linden/indra/newview/hippoRestRequest.cpp56
-rw-r--r--linden/indra/newview/hippoRestRequest.h16
-rw-r--r--linden/indra/newview/hippoUpdate.cpp92
-rw-r--r--linden/indra/newview/hippoUpdate.h12
-rw-r--r--linden/indra/newview/jcfloater_animation_list.cpp462
-rw-r--r--linden/indra/newview/jcfloater_animation_list.h88
-rw-r--r--linden/indra/newview/llagent.cpp335
-rw-r--r--linden/indra/newview/llagent.h11
-rw-r--r--linden/indra/newview/llappviewer.cpp205
-rw-r--r--linden/indra/newview/llappviewer.h27
-rw-r--r--linden/indra/newview/llappviewerlinux.h3
-rw-r--r--linden/indra/newview/llappviewerwin32.cpp4
-rw-r--r--linden/indra/newview/llassetuploadresponders.cpp2
-rw-r--r--linden/indra/newview/llcallingcard.cpp12
-rw-r--r--linden/indra/newview/llcallingcard.h2
-rw-r--r--linden/indra/newview/llchatbar.cpp121
-rw-r--r--linden/indra/newview/llchatbar.h7
-rw-r--r--linden/indra/newview/lldrawable.h1
-rw-r--r--linden/indra/newview/llfilepicker.cpp18
-rw-r--r--linden/indra/newview/llfilepicker.h3
-rw-r--r--linden/indra/newview/llfirstuse.cpp48
-rw-r--r--linden/indra/newview/llfirstuse.h18
-rw-r--r--linden/indra/newview/llfloaterabout.cpp10
-rw-r--r--linden/indra/newview/llfloateractivespeakers.cpp19
-rw-r--r--linden/indra/newview/llfloaterassetbrowser.cpp466
-rw-r--r--linden/indra/newview/llfloaterassetbrowser.h84
-rw-r--r--linden/indra/newview/llfloaterbeacons.cpp10
-rw-r--r--linden/indra/newview/llfloaterchat.cpp115
-rw-r--r--linden/indra/newview/llfloaterchat.h2
-rw-r--r--linden/indra/newview/llfloaterchatterbox.cpp11
-rw-r--r--linden/indra/newview/llfloaterchatterbox.h9
-rw-r--r--linden/indra/newview/llfloatercustomize.cpp222
-rw-r--r--linden/indra/newview/llfloatercustomize.h4
-rw-r--r--linden/indra/newview/llfloatergroups.cpp15
-rw-r--r--linden/indra/newview/llfloaterinspect.cpp24
-rw-r--r--linden/indra/newview/llfloaterland.cpp44
-rw-r--r--linden/indra/newview/llfloaterland.h4
-rw-r--r--linden/indra/newview/llfloatermap.cpp894
-rw-r--r--linden/indra/newview/llfloatermap.h71
-rw-r--r--linden/indra/newview/llfloateropenobject.cpp13
-rw-r--r--linden/indra/newview/llfloaterproperties.cpp16
-rw-r--r--linden/indra/newview/llfloaterregioninfo.cpp19
-rw-r--r--linden/indra/newview/llfloaterregioninfo.h3
-rw-r--r--linden/indra/newview/llfloaterreporter.cpp35
-rw-r--r--linden/indra/newview/llfloatersettingsdebug.cpp31
-rw-r--r--linden/indra/newview/llfloatersnapshot.cpp17
-rw-r--r--linden/indra/newview/llfloatertools.cpp50
-rw-r--r--linden/indra/newview/llfloatertools.h1
-rw-r--r--linden/indra/newview/llfloaterwater.cpp85
-rw-r--r--linden/indra/newview/llfloaterwater.h3
-rw-r--r--linden/indra/newview/llfloaterwindlight.cpp99
-rw-r--r--linden/indra/newview/llfloaterwindlight.h5
-rw-r--r--linden/indra/newview/llfloaterworldmap.cpp36
-rw-r--r--linden/indra/newview/llfloaterworldmap.h7
-rw-r--r--linden/indra/newview/llfolderview.cpp92
-rw-r--r--linden/indra/newview/llfolderview.h12
-rw-r--r--linden/indra/newview/llglsandbox.cpp28
-rw-r--r--linden/indra/newview/llhoverview.cpp38
-rw-r--r--linden/indra/newview/llhudtext.cpp39
-rw-r--r--linden/indra/newview/llhudtext.h8
-rw-r--r--linden/indra/newview/llimpanel.cpp77
-rw-r--r--linden/indra/newview/llimpanel.h1
-rw-r--r--linden/indra/newview/llimview.cpp13
-rw-r--r--linden/indra/newview/llinventoryactions.cpp61
-rw-r--r--linden/indra/newview/llinventorybridge.cpp296
-rw-r--r--linden/indra/newview/llinventorymodel.cpp27
-rw-r--r--linden/indra/newview/llinventorymodel.h6
-rw-r--r--linden/indra/newview/llinventoryview.cpp30
-rw-r--r--linden/indra/newview/llinventoryview.h28
-rw-r--r--linden/indra/newview/llmanipscale.cpp26
-rw-r--r--linden/indra/newview/llmanipscale.h3
-rw-r--r--linden/indra/newview/llmaniptranslate.cpp11
-rw-r--r--linden/indra/newview/llnetmap.cpp152
-rw-r--r--linden/indra/newview/llnetmap.h21
-rw-r--r--linden/indra/newview/llnotify.cpp12
-rw-r--r--linden/indra/newview/lloverlaybar.cpp74
-rw-r--r--linden/indra/newview/lloverlaybar.h8
-rw-r--r--linden/indra/newview/llpanelavatar.cpp172
-rw-r--r--linden/indra/newview/llpanelavatar.h1
-rw-r--r--linden/indra/newview/llpanelclassified.cpp11
-rw-r--r--linden/indra/newview/llpanelcontents.cpp20
-rw-r--r--linden/indra/newview/llpaneldisplay.cpp21
-rw-r--r--linden/indra/newview/llpaneldisplay.h2
-rw-r--r--linden/indra/newview/llpanelgeneral.cpp12
-rw-r--r--linden/indra/newview/llpanelgeneral.h3
-rw-r--r--linden/indra/newview/llpanelinventory.cpp86
-rw-r--r--linden/indra/newview/llpanelland.cpp6
-rw-r--r--linden/indra/newview/llpanellogin.cpp159
-rw-r--r--linden/indra/newview/llpanellogin.h7
-rw-r--r--linden/indra/newview/llpanelobject.cpp17
-rw-r--r--linden/indra/newview/llpanelpermissions.cpp67
-rw-r--r--linden/indra/newview/llpanelpermissions.h1
-rw-r--r--linden/indra/newview/llpanelpick.cpp16
-rw-r--r--linden/indra/newview/llprefschat.cpp19
-rw-r--r--linden/indra/newview/llprefsim.cpp14
-rw-r--r--linden/indra/newview/llpreview.cpp29
-rw-r--r--linden/indra/newview/llpreview.h1
-rw-r--r--linden/indra/newview/llpreviewscript.cpp84
-rw-r--r--linden/indra/newview/llpreviewscript.h2
-rw-r--r--linden/indra/newview/llprogressview.cpp2
-rw-r--r--linden/indra/newview/llselectmgr.cpp17
-rw-r--r--linden/indra/newview/llspatialpartition.cpp2
-rw-r--r--linden/indra/newview/llstartup.cpp241
-rw-r--r--linden/indra/newview/llstartup.h9
-rw-r--r--linden/indra/newview/llstatusbar.cpp15
-rw-r--r--linden/indra/newview/llstylemap.cpp2
-rw-r--r--linden/indra/newview/lltexturectrl.cpp7
-rw-r--r--linden/indra/newview/lltool.cpp15
-rw-r--r--linden/indra/newview/lltool.h3
-rw-r--r--linden/indra/newview/lltoolbar.cpp8
-rw-r--r--linden/indra/newview/lltooldraganddrop.cpp85
-rw-r--r--linden/indra/newview/lltoolface.cpp10
-rw-r--r--linden/indra/newview/lltoolgrab.cpp24
-rw-r--r--linden/indra/newview/lltoolpie.cpp72
-rw-r--r--linden/indra/newview/lltoolplacer.cpp20
-rw-r--r--linden/indra/newview/lltoolselect.cpp49
-rw-r--r--linden/indra/newview/lltracker.cpp24
-rw-r--r--linden/indra/newview/lluserauth.cpp53
-rw-r--r--linden/indra/newview/llviewercontrol.cpp21
-rw-r--r--linden/indra/newview/llviewerdisplay.cpp12
-rw-r--r--linden/indra/newview/llviewerjointattachment.h4
-rw-r--r--linden/indra/newview/llviewermenu.cpp1034
-rw-r--r--linden/indra/newview/llviewermenufile.cpp15
-rw-r--r--linden/indra/newview/llviewermessage.cpp442
-rw-r--r--linden/indra/newview/llviewermessage.h2
-rw-r--r--linden/indra/newview/llviewernetwork.cpp201
-rw-r--r--linden/indra/newview/llviewernetwork.h63
-rw-r--r--linden/indra/newview/llviewerobject.cpp17
-rw-r--r--linden/indra/newview/llviewerobject.h1
-rw-r--r--linden/indra/newview/llviewerobjectlist.cpp26
-rw-r--r--linden/indra/newview/llviewerobjectlist.h1
-rw-r--r--linden/indra/newview/llviewerregion.cpp6
-rw-r--r--linden/indra/newview/llviewertexteditor.cpp86
-rw-r--r--linden/indra/newview/llviewertexteditor.h2
-rw-r--r--linden/indra/newview/llviewerthrottle.cpp2
-rw-r--r--linden/indra/newview/llviewerwindow.cpp586
-rw-r--r--linden/indra/newview/llviewerwindow.h9
-rw-r--r--linden/indra/newview/llvlcomposition.cpp9
-rw-r--r--linden/indra/newview/llvoavatar.cpp204
-rw-r--r--linden/indra/newview/llvoavatar.h4
-rw-r--r--linden/indra/newview/llvovolume.cpp16
-rw-r--r--linden/indra/newview/llwearable.cpp69
-rw-r--r--linden/indra/newview/llwearable.h4
-rw-r--r--linden/indra/newview/llwearablelist.cpp10
-rw-r--r--linden/indra/newview/llwindlightremotectrl.cpp312
-rw-r--r--linden/indra/newview/llwindlightremotectrl.h60
-rw-r--r--linden/indra/newview/llwlparammanager.cpp40
-rw-r--r--linden/indra/newview/llwlparammanager.h17
-rw-r--r--linden/indra/newview/llworld.cpp1
-rw-r--r--linden/indra/newview/llworldmapview.cpp80
-rw-r--r--linden/indra/newview/llworldmapview.h6
-rw-r--r--linden/indra/newview/pipeline.cpp14
-rw-r--r--linden/indra/newview/primbackup.cpp1106
-rw-r--r--linden/indra/newview/primbackup.h134
-rw-r--r--linden/indra/newview/res/viewerRes.rc9
-rw-r--r--linden/indra/newview/rlvdefines.h212
-rw-r--r--linden/indra/newview/rlvevent.h227
-rw-r--r--linden/indra/newview/rlvextensions.cpp497
-rw-r--r--linden/indra/newview/rlvextensions.h45
-rw-r--r--linden/indra/newview/rlvfloaterbehaviour.cpp152
-rw-r--r--linden/indra/newview/rlvfloaterbehaviour.h49
-rw-r--r--linden/indra/newview/rlvhandler.cpp2592
-rw-r--r--linden/indra/newview/rlvhandler.h445
-rw-r--r--linden/indra/newview/rlvhelper.cpp668
-rw-r--r--linden/indra/newview/rlvhelper.h416
-rw-r--r--linden/indra/newview/rlvmultistringsearch.cpp196
-rw-r--r--linden/indra/newview/rlvmultistringsearch.h191
-rw-r--r--linden/indra/newview/skins/default/colors_base.xml8
-rw-r--r--linden/indra/newview/skins/default/html/en-us/loading/imprudence_loading.pngbin0 -> 10714 bytes
-rw-r--r--linden/indra/newview/skins/default/html/en-us/loading/loading.html2
-rw-r--r--linden/indra/newview/skins/default/textures/arrow_left.tgabin0 -> 510 bytes
-rw-r--r--linden/indra/newview/skins/default/textures/arrow_right.tgabin0 -> 510 bytes
-rw-r--r--linden/indra/newview/skins/default/textures/map_avatar_32.tgabin0 -> 2894 bytes
-rw-r--r--linden/indra/newview/skins/default/textures/map_avatar_above_32.tgabin0 -> 2909 bytes
-rw-r--r--linden/indra/newview/skins/default/textures/map_avatar_below_32.tgabin0 -> 3037 bytes
-rw-r--r--linden/indra/newview/skins/default/textures/map_avatar_you_32.tgabin0 -> 3395 bytes
-rw-r--r--linden/indra/newview/skins/default/textures/textures.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/de/floater_about.xml19
-rw-r--r--linden/indra/newview/skins/default/xui/de/floater_choose_group.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/de/panel_groups.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/alerts.xml2915
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_about.xml23
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_animation_list.xml74
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_asset_browser.xml29
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_chatterbox_vertical.xml14
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_choose_group.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_customize.xml23
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_directory.xml50
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml22
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_login.xml260
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_media_browser.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml110
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_postcard.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_prim_import.xml5
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_profile.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_rlv_behaviour.xml11
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_snapshot.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_tools.xml124
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_water.xml16
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml24
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml7
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml59
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml126
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/notify.xml1097
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml582
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml10
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_groups.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_login.xml212
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_overlaybar.xml17
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml74
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml26
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml28
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml25
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_windlight_controls.xml14
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote.xml34
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml52
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_about.xml87
-rw-r--r--linden/indra/newview/skins/default/xui/ja/floater_about.xml21
-rw-r--r--linden/indra/newview/skins/default/xui/ja/floater_choose_group.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/ja/panel_groups.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/ko/floater_about.xml19
-rw-r--r--linden/indra/newview/skins/default/xui/ko/floater_choose_group.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/ko/panel_groups.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/zh/floater_about.xml19
-rw-r--r--linden/indra/newview/skins/silver/colors_base.xml9
-rw-r--r--linden/indra/newview/skins/silver/textures/arrow_left.tgabin0 -> 424 bytes
-rw-r--r--linden/indra/newview/skins/silver/textures/arrow_right.tgabin0 -> 424 bytes
-rw-r--r--linden/indra/newview/skins/silver/xui/en-us/floater_chatterbox.xml12
-rw-r--r--linden/indra/newview/skins/silver/xui/en-us/floater_script_ed_panel.xml86
-rw-r--r--linden/indra/newview/skins/silver/xui/en-us/floater_script_queue.xml13
-rw-r--r--linden/indra/newview/skins/silver/xui/en-us/floater_windlight_options.xml24
-rw-r--r--linden/indra/newview/skins/silver/xui/en-us/panel_avatar.xml430
-rwxr-xr-xlinden/indra/newview/viewer_manifest.py58
-rw-r--r--linden/install.xml145
-rwxr-xr-xlinden/scripts/install.py6
409 files changed, 35251 insertions, 2969 deletions
diff --git a/ChangeLog.txt b/ChangeLog.txt
index a42b4be..5ec4b88 100644
--- a/ChangeLog.txt
+++ b/ChangeLog.txt
@@ -1,289 +1,2087 @@
1=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
2=- 1.3.0 -=
3=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
4
52009-10-18 McCabe Maxsted <hakushakukun@gmail.com>
6
7 * Merged working branch of 1.2 into LL 1.23 merge.
8
9
10REMOVE ME!
11=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
12=- 1.2.0 misc. -=
13=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
14REMOVE ME!
15
162009-10-17 McCabe Maxsted <hakushakukun@gmail.com>
17
18 * Ported notecard security fix from LL's 1.23.5 viewer.
19
20 modified: linden/indra/newview/llassetuploadresponders.cpp
21 modified: linden/indra/newview/llpreview.cpp
22 modified: linden/indra/newview/llpreview.h
23
24
252009-10-16 McCabe Maxsted <hakushakukun@gmail.com>
26
27 * Applied RLVa-1.0.4e_20091010_SL-1.22.11-diff.patch.
28
29 modified: linden/indra/newview/app_settings/settings.xml
30 modified: linden/indra/newview/llagent.cpp
31 modified: linden/indra/newview/llchatbar.cpp
32 modified: linden/indra/newview/llinventorybridge.cpp
33 modified: linden/indra/newview/llpanelinventory.cpp
34 modified: linden/indra/newview/llviewermenu.cpp
35 modified: linden/indra/newview/llviewermessage.cpp
36 modified: linden/indra/newview/llviewertexteditor.cpp
37 modified: linden/indra/newview/rlvdefines.h
38 modified: linden/indra/newview/rlvextensions.cpp
39 modified: linden/indra/newview/rlvextensions.h
40 modified: linden/indra/newview/rlvhandler.cpp
41 modified: linden/indra/newview/rlvhandler.h
42 modified: linden/indra/newview/rlvhelper.cpp
43 modified: linden/indra/newview/rlvhelper.h
44
45
462009-10-13 McCabe Maxsted <hakushakukun@gmail.com>
47
48 * Applied patch for VWR-6787 by Alissa Sabre - 'none' text in group window not translatable.
49
50 modified: indra/newview/llfloatergroups.cpp
51 modified: indra/newview/skins/default/xui/de/floater_choose_group.xml
52 modified: indra/newview/skins/default/xui/de/panel_groups.xml
53 modified: indra/newview/skins/default/xui/en-us/floater_choose_group.xml
54 modified: indra/newview/skins/default/xui/en-us/panel_groups.xml
55 modified: indra/newview/skins/default/xui/ja/floater_choose_group.xml
56 modified: indra/newview/skins/default/xui/ja/panel_groups.xml
57 modified: indra/newview/skins/default/xui/ko/floater_choose_group.xml
58 modified: indra/newview/skins/default/xui/ko/panel_groups.xml
59
60
61 * Combine the two mini-map mute buttons into one.
62
63 modified: linden/indra/newview/llfloatermap.cpp
64 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
65
66
67 * Parcel highlighting when selecting a name in radar is less buggy.
68
69 modified: linden/indra/newview/llfloatermap.cpp
70 modified: linden/indra/newview/llfloatermap.h
71 modified: linden/indra/newview/llviewermessage.cpp
72
73
74 * Added history button for group chat as well.
75
76 modified: linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
77
78
79 * Disable IM history button for Linux and Mac users.
80
81 modified: linden/indra/newview/llimpanel.cpp
82 modified: linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
83
84
85 * Applied show IM logs button from Emerald viewer and added an alert if there is no history.
86
87 modified: linden/indra/llwindow/llwindow.h
88 modified: linden/indra/llwindow/llwindowwin32.cpp
89 modified: linden/indra/llwindow/llwindowwin32.h
90 modified: linden/indra/newview/llimpanel.cpp
91 modified: linden/indra/newview/llimpanel.h
92 modified: linden/indra/newview/skins/default/xui/en-us/alerts.xml
93 modified: linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
94
95
96 * Updated inventory search to include description (from Emerald).
97
98 modified: linden/indra/newview/llfolderview.cpp
99 modified: linden/indra/newview/llfolderview.h
100 modified: linden/indra/newview/llinventoryactions.cpp
101 modified: linden/indra/newview/llinventoryview.cpp
102 modified: linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml
103
104
105 * Disable avatar appearance facelight when local lighting turned off.
106
107 modified: linden/indra/newview/pipeline.cpp
108
109
1102009-10-12 McCabe Maxsted <hakushakukun@gmail.com>
111
112 * Only enable import/export of shapes if they're full perm and you're the creator.
113
114 modified: linden/indra/newview/llfloatercustomize.cpp
115
116
117 * Removed Emerald viewer modifier for avatar height label in customize window.
118
119 modified: linden/indra/newview/llfloatercustomize.cpp
120
121
122 * Added avatar shape import and export from Meerkat viewer.
123
124 modified: linden/indra/newview/llfloatercustomize.cpp
125 modified: linden/indra/newview/llfloatercustomize.h
126 modified: linden/indra/newview/llwearable.cpp
127 modified: linden/indra/newview/llwearable.h
128 modified: linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
129
130
131 * Added check/uncheck all buttons for make outfit from Meerkat viewer.
132
133 modified: linden/indra/newview/llfloatercustomize.cpp
134 modified: linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
135
136
137 * Removed reference to 'Second Life' from postcard message a la Meerkat.
138
139 modified: linden/indra/newview/skins/default/xui/en-us/floater_postcard.xml
140
141
142 * Added script load/save from Meerkat viewer.
143
144 modified: linden/indra/newview/llfilepicker.cpp
145 modified: linden/indra/newview/llfilepicker.h
146 modified: linden/indra/newview/llpreviewscript.cpp
147 modified: linden/indra/newview/llpreviewscript.h
148 modified: linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml
149 deleted: linden/indra/newview/skins/silver/xui/en-us/floater_script_ed_panel.xml
150 deleted: linden/indra/newview/skins/silver/xui/en-us/floater_script_queue.xml
151
152
1532009-10-11 McCabe Maxsted <hakushakukun@gmail.com>
154
155 * Added particle count to windlight toolbar.
156
157 modified: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml
158
159
160 * Made advanced water toggle.
161
162 modified: linden/indra/newview/llfloaterwater.cpp
163
164
165 * Added advanced water and windlight sky tabs to sky presets pulldown.
166
167 modified: linden/indra/newview/llfloaterwindlight.cpp
168 modified: linden/indra/newview/llfloaterwindlight.h
169 modified: linden/indra/newview/llwindlightremotectrl.cpp
170 modified: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote.xml
171 modified: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml
172
173
174 * Added next/prev buttons to windlight water window.
175
176 modified: linden/indra/newview/llfloaterwater.cpp
177 modified: linden/indra/newview/llfloaterwater.h
178 modified: linden/indra/newview/skins/default/xui/en-us/floater_water.xml
179
180
1812009-10-10 McCabe Maxsted <hakushakukun@gmail.com>
182
183 * Force minimize button focus to the top of Mini-Map.
184
185 modified: linden/indra/newview/llfloatermap.cpp
186
187
188 * Added and tweaked vertical IM option from Emerald viewer.
189
190 new file: linden/indra/newview/skins/default/xui/en-us/floater_chatterbox_vertical.xml
191 modified: linden/indra/newview/app_settings/settings.xml
192 modified: linden/indra/newview/llfloaterchatterbox.cpp
193 modified: linden/indra/newview/llprefsim.cpp
194 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
195
196
197=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
198=- 1.2.0 BETA 2 -=
199=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
200
2012009-10-09 Jacek Antonelli <jacek.antonelli@gmail.com>
202
203 * Updated and added some Linux libs.
204 Updated: glib, gstreamer, gtk-etc, ogg-vorbis, openal, libxml
205 Added: gstreamer-plugins, theora
206
207 modified: linden/indra/newview/viewer_manifest.py
208 modified: linden/indra/cmake/GStreamer.cmake
209 modified: linden/indra/cmake/UI.cmake
210 modified: linden/install.xml
211
212
2132009-10-09 McCabe Maxsted <hakushakukun@gmail.com>
214
215 * Updated version info to 1.2.0 beta 2, added changelog banner.
216
217 modified: linden/indra/llcommon/llversionviewer.h
218 modified: linden/indra/newview/English.lproj/InfoPlist.strings
219 modified: linden/indra/newview/Info-Imprudence.plist
220 modified: linden/indra/newview/res/viewerRes.rc
221
222
223 * Fixed new search window size hiding next/prev buttons.
224
225 modified: linden/indra/newview/skins/default/xui/en-us/floater_directory.xml
226
227
228 * Mini-map can now be minimized.
229
230 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
231
232
233 * Added missing RLVa header file: rlvdefines.h.
234
235 new file: linden/indra/newview/rlvdefines.h
236
237
2382009-10-08 McCabe Maxsted <hakushakukun@gmail.com>
239
240 * Applied lldialog spam throttle from Emerald viewer.
241
242 modified: linden/indra/newview/app_settings/settings.xml
243 modified: linden/indra/newview/llviewermessage.cpp
244
245
246 * Don't show lldialog boxes from muted avatars anymore.
247
248 modified: linden/indra/newview/llviewermessage.cpp
249
250
251 * Fixed money change notification happening after logout/login.
252
253 modified: linden/indra/newview/llviewermessage.cpp
254
255
256 * Fixed entering sim notification being tied to radar range.
257
258 modified: linden/indra/newview/llfloatermap.cpp
259
260
261 * Fixed stupid error on my part that broke clickable names in chat history.
262
263 modified: linden/indra/newview/llfloaterchat.cpp
264
265
2662009-10-07 McCabe Maxsted <hakushakukun@gmail.com>
267
268 * Clickable IMs in chat history was causing readability problems at varying distances,
269 decided it was a bug and fixed it.
270
271 modified: linden/indra/newview/llfloaterchat.cpp
272
273
274 * Mini-map radar now can notify you when someone enters the sim.
275
276 modified: linden/indra/newview/app_settings/settings.xml
277 modified: linden/indra/newview/llfloatermap.cpp
278 modified: linden/indra/newview/llfloatermap.h
279 modified: linden/indra/newview/llpanelgeneral.cpp
280 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
281 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
282
283
284 * Added typing info to mini-map radar.
285
286 modified: linden/indra/newview/llfloatermap.cpp
287 modified: linden/indra/newview/llfloatermap.h
288 modified: linden/indra/newview/llviewermessage.cpp
289 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
290
291
292 * Applied avatar height in customize window from Emerald viewer.
293
294 modified: linden/indra/newview/llfloatercustomize.cpp
295 modified: linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
296
297
298 * Fixed random mouseclicks on the edge of the window.
299
300 modified: linden/indra/newview/llviewerwindow.cpp
301
302
3032009-10-06 McCabe Maxsted <hakushakukun@gmail.com>
304
305 * Applied RLVa-1.0.3e_20091005_Imprudence-1.2.0-diff.patch by Kitty Barnett.
306
307 modified: linden/indra/newview/CMakeLists.txt
308 modified: linden/indra/newview/app_settings/settings.xml
309 modified: linden/indra/newview/llfirstuse.cpp
310 modified: linden/indra/newview/llfirstuse.h
311 modified: linden/indra/newview/llviewermenu.cpp
312 modified: linden/indra/newview/llviewermessage.cpp
313 modified: linden/indra/newview/rlvevent.h
314 modified: linden/indra/newview/rlvextensions.cpp
315 modified: linden/indra/newview/rlvhandler.cpp
316 modified: linden/indra/newview/rlvhandler.h
317 modified: linden/indra/newview/rlvhelper.cpp
318 modified: linden/indra/newview/rlvhelper.h
319 modified: linden/indra/newview/skins/default/xui/en-us/alerts.xml
320 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
321
322
323modified: linden/indra/newview/skins/default/xui/en-us/notify.xml
324
325
326 * Applied RLVa-1.0.2c_20091005_Imprudence-1.2.0-diff.patch by Kitty Barnett.
327
328 modified: linden/indra/newview/llinventorybridge.cpp
329 modified: linden/indra/newview/lltooldraganddrop.cpp
330 modified: linden/indra/newview/llviewermenu.cpp
331 modified: linden/indra/newview/llviewermessage.cpp
332 modified: linden/indra/newview/rlvhandler.cpp
333 modified: linden/indra/newview/rlvhandler.h
334 modified: linden/indra/newview/rlvhelper.cpp
335 modified: linden/indra/newview/rlvhelper.h
336
337
3382009-10-05 McCabe Maxsted <hakushakukun@gmail.com>
339
340 * Renamed 'Create' in object pie to 'Build,' moved it to top right and switched 'Wear' and 'Return.'
341
342 modified: indra/newview/skins/default/xui/en-us/menu_pie_object.xml
343
344
3452009-10-04 McCabe Maxsted <hakushakukun@gmail.com>
346
347 * Changes that should improve sculpty LOD.
348
349 modified: linden/indra/llmath/llvolume.cpp
350
351
352 * Fixed mini-map distance label and rounding.
353
354 modified: linden/indra/newview/llfloatermap.cpp
355
356
357 * Mini-map radar now notifies when someone enters chat range, and how far away they are.
358
359 modified: linden/indra/newview/app_settings/settings.xml
360 modified: linden/indra/newview/llfloatermap.cpp
361 modified: linden/indra/newview/llfloatermap.h
362 modified: linden/indra/newview/llpanelgeneral.cpp
363 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
364 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
365
366
3672009-10-03 Jacek Antonelli <jacek.antonelli@gmail.com>
368
369 * Updated and added some Linux libs to install.xml.
370 Updated: glib, gstreamer, ogg-vorbis, openal
371 Added: gstreamer-plugins, theora
372
373 modified: linden/install.xml
374
375
376 * Grid manager no longer appends "/" to URIs.
377 This was causing trouble with URIs that shouldn't end in "/".
378
379 modified: linden/indra/newview/hippoGridManager.cpp
380
381
3822009-10-03 McCabe Maxsted <hakushakukun@gmail.com>
383
384 * Disable camera constraints now disables max zoom for the scrollwheel.
385
386 modified: linden/indra/newview/llagent.cpp
387
388
389 * Fixed layout of debug permissions in tools window.
390
391 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
392
393
394 * Reverted slviewer-0-v12100-AllowDiscardForCreator.patch.
395 (Was causing usability issues with new notecard creation).
396
397 modified: linden/indra/newview/llviewermessage.cpp
398
399
400 * Added confirmation alerts for double-click tp and auto-pilot.
401
402 modified: linden/indra/newview/llviewermenu.cpp
403 modified: linden/indra/newview/skins/default/xui/en-us/alerts.xml
404
405
406 * Fixed extern C issue in llmediaimplgstreamer.h for Windows.
407
408 modified: linden/indra/llmedia/llmediaimplgstreamer.h
409
410
411 * Fixed account label not showing up in profiles.
412
413 modified: linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
414
415
416 * Fixed an issue with llkeywords.cpp(385) and Visual Studio.
417
418 modified: linden/indra/llui/llkeywords.cpp
419
420
421 * Fixed search window height being too small for new profile layout.
422
423 modified: linden/indra/newview/skins/default/xui/en-us/floater_directory.xml
424
425
4262009-10-02 McCabe Maxsted <hakushakukun@gmail.com>
427
428 * Added new color setting for Object IMs.
429
430 modified: linden/indra/llcommon/llchat.h
431 modified: linden/indra/newview/app_settings/settings.xml
432 modified: linden/indra/newview/llfloaterchat.cpp
433 modified: linden/indra/newview/llviewermessage.cpp
434 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
435
436
437 * Fixed 1.2 beta features missing from silver skin.
438
439 deleted: linden/indra/newview/skins/silver/xui/en-us/floater_chatterbox.xml
440 modified: linden/indra/newview/skins/silver/xui/en-us/floater_windlight_options.xml
441
442
443 * Applied clickable object names for whisper/say/shout from Emerald viewer.
444
445 modified: linden/indra/newview/llviewermessage.cpp
446
447
448 * Object IMs are now prefixed with "IM: ".
449 As a side effect, names are now clickable when show IMs in chat is enabled.
450
451 modified: linden/indra/newview/llfloaterchat.cpp
452 modified: linden/indra/newview/llviewermessage.cpp
453
454
4552009-10-01 McCabe Maxsted <hakushakukun@gmail.com>
456
457 * Added mini-map partner dot color for future use (currently unused).
458
459 modified: linden/indra/newview/skins/default/colors_base.xml
460 modified: linden/indra/newview/skins/silver/colors_base.xml
461
462
463 * Draw Imprudence developers as purple dots in the mini-map (name list in LLFloaterMap).
464
465 modified: linden/indra/newview/llfloatermap.cpp
466 modified: linden/indra/newview/llfloatermap.h
467 modified: linden/indra/newview/llnetmap.cpp
468 modified: linden/indra/newview/skins/default/colors_base.xml
469 modified: linden/indra/newview/skins/silver/colors_base.xml
470
471
472 * Draw selected avatars last (and fixed silver skin missing selection color).
473
474 modified: linden/indra/newview/llnetmap.cpp
475 modified: linden/indra/newview/skins/default/colors_base.xml
476 modified: linden/indra/newview/skins/silver/colors_base.xml
477
478
479 * Fixed switched Buy and Create locations in object pie menu (regression).
480
481 modified: linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
482
483
484 * Fixed inability to teleport to adult regions in Imprudence 1.2.
485 (Ugly. Only use on 1.22 code base)
486
487 modified: linden/indra/newview/app_settings/settings.xml
488 modified: linden/indra/newview/llagent.cpp
489 modified: linden/indra/newview/llagent.h
490 modified: linden/indra/newview/llstartup.cpp
491 modified: linden/indra/newview/llviewerregion.cpp
492
493
494 * Changed the minimum draw distance from 64m to 32m.
495
496 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
497 modified: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml
498
499
500 * Suspected partial crash fix for Logout.
501
502 modified: linden/indra/newview/llappviewer.cpp
503
504
505 * Fixed 1.2 thinking it was on the Teen Grid.
506
507 modified: linden/indra/newview/llstartup.cpp
508
509
510 * Updated gpu_table.txt to latest version in Snowglobe.
511
512 modified: linden/indra/newview/gpu_table.txt
513
514
5152009-09-29 McCabe Maxsted <hakushakukun@gmail.com>
516
517 * Fixed Unlink not enabling when Edit Linked Parts enabled.
518
519 modified: linden/indra/newview/llfloatertools.cpp
520 modified: linden/indra/newview/llviewermenu.cpp
521
522
523 * Fixed Join Call button truncated in group IMs (regression).
524
525 modified: linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
526
527
528 * Fixed reset UI size to default button missing from preferences > general (regression).
529 Changed incremets to 0.001 to be more Liberation Sans-friendly.
530
531 modified: linden/indra/newview/llpanelgeneral.cpp
532 modified: linden/indra/newview/llpanelgeneral.h
533 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
534
535
536 * Renamed preferences checkbox to 'show WindLight toolbar,' removed reference to 'Second Life.'
537
538 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
539
540
541 * Adjusted 2nd Life profile tab layout for French language.
542
543 modified: linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
544
545
546 * Added the name box back to avatar profiles.
547
548 modified: linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
549
550
5512009-09-28 McCabe Maxsted <hakushakukun@gmail.com>
552
553 * Fixed first windlight toolbar entry toggling Advanced Sky.
554
555 modified: linden/indra/newview/llwindlightremotectrl.cpp
556
557
558 * Renamed ScriptBgReadOnlyColor to ScrollReadOnlyColor so we don't lose it in a merge.
559
560 modified: linden/indra/newview/llpanelavatar.cpp
561 modified: linden/indra/newview/skins/default/colors_base.xml
562 modified: linden/indra/newview/skins/silver/colors_base.xml
563
564
565 * Fixed Advanced Sky only toggling once.
566
567 modified: linden/indra/newview/llfloaterwindlight.cpp
568
569
570=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
571=- 1.2.0 BETA -=
572=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
573
574
5752009-09-28 Jacek Antonelli <jacek.antonelli@gmail.com>
576
577 * Updated viewer version in Mac and Windows installer files.
578
579 modified: linden/indra/newview/English.lproj/InfoPlist.strings
580 modified: linden/indra/newview/Info-Imprudence.plist
581 modified: linden/indra/newview/res/viewerRes.rc
582
583
584 * Tweaked Imprudence credits, copied to other languages' credits.
585
586 modified: linden/indra/newview/skins/default/xui/de/floater_about.xml
587 modified: linden/indra/newview/skins/default/xui/en-us/floater_about.xml
588 modified: linden/indra/newview/skins/default/xui/fr/floater_about.xml
589 modified: linden/indra/newview/skins/default/xui/ja/floater_about.xml
590 modified: linden/indra/newview/skins/default/xui/ko/floater_about.xml
591 modified: linden/indra/newview/skins/default/xui/zh/floater_about.xml
592
593
5942009-09-27 Jacek Antonelli <jacek.antonelli@gmail.com>
595
596 * Rearranged the Import stuff in the File menu.
597
598 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
599
600
601 * Changed "Backup" to "Export" in object pie menu.
602
603 modified: linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
604
605
606 * Fixed and cleaned up the export permissions check.
607
608 modified: linden/indra/newview/llviewermenu.cpp
609 modified: linden/indra/newview/primbackup.cpp
610 modified: linden/indra/newview/primbackup.h
611
612
613 * Updated Imprudence version to "1.2.0 beta".
614
615 linden/indra/llcommon/llversionviewer.h
616
617
618 * Re-enabled "allow first life" userauth stuff.
619 It was commented out when grid manager was added, but it
620 makes certain Profile window pieces disappear.
621
622 modified: linden/indra/newview/llstartup.cpp
623
624
6252009-09-27 McCabe Maxsted <hakushakukun@gmail.com>
626
627 * Added Imprudence-specific credits to Help > About Imprudence.
628
629 modified: linden/indra/newview/skins/default/xui/en-us/floater_about.xml
630
631
632 * Show disabled buttons for own profile rather than hiding them.
633
634 modified: linden/indra/newview/llpanelavatar.cpp
635 modified: linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
636
637
638 * Fixed bad merge in llnetmap.cpp.
639
640 modified: linden/indra/newview/llnetmap.cpp
641
642
643 * Fixed JPEG quality slider displaying over high-res checkbox in snapshot floater (IMP-140).
644
645 modified: linden/indra/newview/llfloatersnapshot.cpp
646 modified: linden/indra/newview/skins/default/xui/en-us/floater_snapshop.xml
647
648
649 * Deleted duplicate Torley windlight sky preset.
650
651 deleted: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Gelatto%20.xml
652
653
654 * Added missing Torley windlight water presets.
655
656 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Arrakissed%20variation.xml
657 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist%202.xml
658 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist.xml
659 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Bayouette.xml
660 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Chivandria%20clair.xml
661 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Claira.xml
662 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Coral%20reef.xml
663 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Crosshatched%20plans.xml
664 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Eyeballin%27.xml
665 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Fantastuck.xml
666 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Featuresque.xml
667 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Freak%2DA%2Ddermia.xml
668 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Glaznost.xml
669 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Grantamount.xml
670 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Hpmod.xml
671 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Ice%2Dlike.xml
672 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Impure.xml
673 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Linear%20puddles.xml
674 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Listeryne.xml
675 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Liz%20Taylor.xml
676 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Maldives.xml
677 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Meridian%20verde.xml
678 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Negative%20ultraspace.xml
679 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Placida%20brite.xml
680 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Pretty%20placid.xml
681 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Raw%20sewage.xml
682 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Showing%20age.xml
683 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Soldier%27s%20legacy.xml
684 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Subtleties.xml
685 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Trandshan.xml
686 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Watermelon%20juice.xml
687 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Waterslides.xml
688 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20What%27s%20on%20TV.xml
689 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Wickedly.xml
690 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20You%27re%20in%20luck.xml
691 new file: linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Yung%20buk.xml
692
693
694 * Changes to make the grid manager compile on Windows.
695
696 modified: linden/indra/newview/hippoGridManager.cpp
697 modified: linden/indra/newview/hippoLimits.cpp
698 modified: linden/indra/newview/hippoRestRequest.cpp
699 modified: linden/indra/newview/llappviewer.h
700 modified: linden/indra/newview/llappviewerwin32.cpp
701
702
7032009-09-26 Jacek Antonelli <jacek.antonelli@gmail.com>
704
705 * Renamed 'Restrained Life Active' to 'Restrained Life Support'.
706
707 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
708
709
710 * Removed redundant warning about export perms.
711
712 modified: linden/indra/newview/llviewermenu.cpp
713
714
7152009-09-26 McCabe Maxsted <hakushakukun@gmail.com>
716
717 * Made the windlight floater toggle.
718
719 modified: linden/indra/newview/llfloaterwindlight.cpp
720
721
722 * Added select Torley Windlight presets to Imprudence.
723 Presets good for photography, mainly.
724
725 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%202012.xml
726 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Alien%20planet.xml
727 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20An%20incongruent%20truth.xml
728 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arid%20nestler.xml
729 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arrakissed.xml
730 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asian%20red%20dawn.xml
731 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asiatix.xml
732 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation%202.xml
733 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation.xml
734 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Barcelon%20variation%202.xml
735 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Beautiful%20again.xml
736 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Breaking%20firmament.xml
737 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Brillianter%20sunset.xml
738 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Bubble%20sun%20severance.xml
739 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Castle%20vain.xml
740 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Climacontrasty.xml
741 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Clouds%20indifferent.xml
742 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Cobraring.xml
743 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Coral%20reef.xml
744 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Damage%20down.xml
745 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Dark%20came%20over.xml
746 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Das%20fog.xml
747 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Deep%20blue%20sky.xml
748 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Desert%20Sunset%20mod.xml
749 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Early%20warning.xml
750 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Eno%20would%20be%20proud.xml
751 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Evil%20machinery.xml
752 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Farmatronic%20sepia.xml
753 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Fogvari.xml
754 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Gelatto%20.xml
755 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Grit%20%26%20shame.xml
756 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Herr%20Gracken.xml
757 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Holy%20romance.xml
758 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Hong%20Kong.xml
759 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Ivory%20flowers.xml
760 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Liz%20gluft.xml
761 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Lonely%20cyberpunks.xml
762 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Moon%20berries.xml
763 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Noxumic.xml
764 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Oriental%20delight.xml
765 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Our%20night%20together.xml
766 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Polaron%20charge%20II.xml
767 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Red%20city.xml
768 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Sparz%20puft.xml
769 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Stay%20stonkin%27.xml
770 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Study%20vessels.xml
771 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Teak%20weak.xml
772 new file: linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Wuxia%20nights.xml
773
774
775 * Removed overridden /oy compiler option.
776
777 modified: linden/indra/cmake/00-Common.cmake
778
779
780 * Changed radar label from 'meters' to 'm'.
781
782 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
783
784
785 * Added Windlight presets by Ana Lutetia to Imprudence.
786
787 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default1.xml
788 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default2.xml
789 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default3.xml
790 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20neutral.xml
791 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city%20weirdlights.xml
792 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city.xml
793 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20night.xml
794 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor2.xml
795 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20shadows.xml
796 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio1.xml
797 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio2.xml
798 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio3.xml
799 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio4.xml
800 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio5.xml
801 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio6.xml
802 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio7.xml
803 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio8.xml
804 new file: linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio9.xml
805
806
807 * Added missing FloaterAnimationListRect to settings.xml
808
809 modified: linden/indra/newview/app_settings/settings.xml
810
811
8122009-09-25 Jacek Antonelli <jacek.antonelli@gmail.com>
813
814 * Removed the multiple accounts tip from grid manager.
815
816 linden/indra/newview/skins/default/xui/en-us/floater_login.xml
817
818
819 * Removed 'Set Default' button from grid manager floater.
820
821 modified: linden/indra/newview/floaterlogin.cpp
822 modified: linden/indra/newview/skins/default/xui/en-us/floater_login.xml
823
824
825 * Made HippoGridManager's sanitation code more sane.
826
827 modified: linden/indra/newview/floaterlogin.cpp
828 modified: linden/indra/newview/hippoGridManager.cpp
829 modified: linden/indra/newview/hippoGridManager.h
830
831
832 * Moved many HippoGridManager methods defs out of the header.
833 There's no good reason for these to be in the header, it
834 just breaks encapsulation for no significant gain.
835
836 linden/indra/newview/hippoGridManager.cpp
837 linden/indra/newview/hippoGridManager.h
838
839
840 * Removed grid stuff from World Map (for now).
841
842 modified: linden/indra/newview/llfloaterworldmap.cpp
843 modified: linden/indra/newview/skins/default/xui/en-us/floater_world_map.xml
844
845
846 * Hid "Start Location" from grid manager floater. Not used anyway.
847
848 modified: linden/indra/newview/skins/default/xui/en-us/floater_login.xml
849
850
851 * Made grid manager update from Imprudence site, not Meerkat.
852
853 modified: linden/indra/newview/hippoGridManager.cpp:
854
855
856 * Renamed default grid "local" -> "localhost".
857 So it matches the one downloaded from the web.
858
859 modified: linden/indra/newview/app_settings/default_grids.xml
860
861
862 * Fixed HippoGridInfo::cleanUpUri appending "/" stupidly.
863 It was appending it to an empty string, "/", "//", etc.
864
865 modified: linden/indra/newview/hippoGridManager.cpp
866
867
868 * Rearranged login screen and cleaned up XUI.
869
870 modified: linden/indra/newview/skins/default/xui/en-us/panel_login.xml
871
872
873 * Login screen fields shouldn't be set from grid (for now).
874
875 modified: linden/indra/newview/llpanellogin.cpp
876 modified: linden/indra/newview/llstartup.cpp
877
878
879 * Disabled avatar name and password fields in grid manager.
880 Temporary, until we implement a decent account manager.
881
882 modified: linden/indra/newview/floaterlogin.cpp
883 modified: linden/indra/newview/hippoGridManager.cpp
884 modified: linden/indra/newview/skins/default/xui/en-us/floater_login.xml
885
886
887 * Reverted "grid-firstname_lastname" user directories.
888 Back to "firstname_lastname", like it was without grid manager.
889
890 modified: linden/indra/llvfs/lldir.cpp
891
892
8932009-09-25 McCabe Maxsted <hakushakukun@gmail.com>
894
895 * Removed problematic /MP flag.
896
897 modified: linden/indra/cmake/00-Common.cmake
898
899
900 * Fixed Windows using wrong GStreamer library names.
901
902 modified: linden/indra/cmake/GStreamer.cmake
903
904
905 * Fixed region names not showing up on regions with zero avatars.
906
907 modified: linden/indra/newview/llworldmapview.cpp
908
909
910 * Temporarily disable chat channel control in chat history until it's fixed.
911
912 modified: linden/indra/newview/llchatbar.cpp
913 modified: linden/indra/newview/llfloaterchat.cpp
914 modified: linden/indra/newview/llprefschat.cpp
915
916
917 * Fixed chat channel control value not updating when Return key pressed.
918
919 modified: linden/indra/llui/llspinctrl.cpp
920
921
9222009-09-24 McCabe Maxsted <hakushakukun@gmail.com>
923
924 * Applied RLVa patch for Imprudence 1.2 by Kitty Barnett.
925
926 modified: linden/indra/newview/llfloatermap.cpp
927 modified: linden/indra/newview/llinventorybridge.cpp
928 modified: linden/indra/newview/llnetmap.cpp
929 modified: linden/indra/newview/llpanelpermissions.cpp
930 modified: linden/indra/newview/llwindlightremotectrl.cpp
931
932
933 * Fixed Add button being enabled for friends in the radar.
934
935 modified: linden/indra/newview/llfloatermap.cpp
936
937
938 * Fixed Last Owner text in tools window not disabling.
939
940 modified: linden/indra/newview/llpanelpermissions.cpp
941 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
942
943
9442009-09-23 Jacek Antonelli <jacek.antonelli@gmail.com>
945
946 * Moved "Show HUD Attachments" back to View, restored shortcut.
947 Reverts earlier change (Jan 27) which moved it to Advanced menu.
948
949 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
950
951
9522009-09-22 McCabe Maxsted <hakushakukun@gmail.com>
953
954 * Fixed RLVa issue in LLNetMap the right way (thanks Kitty).
955
956 modified: linden/indra/newview/llnetmap.cpp
957
958
959 * Clarifed Mini-Map menu option: 'Show Map' to 'Show World Map'.
960
961 modified: linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml
962
963
964 * Applied particle chat feature from Emerald viewer.
965 (Tell an object it's selected on channel 9000).
966
967 modified: linden/indra/newview/app_settings/settings.xml
968 modified: linden/indra/newview/llvoavatar.cpp
969 modified: linden/indra/newview/llvoavatar.h
970
971
9722009-09-21 McCabe Maxsted <hakushakukun@gmail.com>
973
974 * Changed 'Presets' button to 'Sky'.
975
976 modified: linden/indra/newview/skins/default/xui/en-us/panel_overlaybar.xml
977 modified: linden/indra/newview/skins/default/xui/en-us/panel_windlight_controls.xml
978 modified: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote.xml
979 modified: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml
980
981
982 * Applied Jacek's patch to show number of avatars in world map.
983
984 modified: linden/indra/newview/app_settings/settings.xml
985 modified: linden/indra/newview/llworldmapview.cpp
986
987
988 * Fixed map textures displaying an X.
989
990 modified: linden/indra/newview/llworldmapview.cpp
991
992
993 * Display selected avatars larger than normal, zoom in at a
994 reasonable speed. Included missing artwork.
995
996 modified: linden/indra/newview/llnetmap.cpp
997 new file: linden/indra/newview/skins/default/textures/map_avatar_32.tga
998 new file: linden/indra/newview/skins/default/textures/map_avatar_above_32.tga
999 new file: linden/indra/newview/skins/default/textures/map_avatar_below_32.tga
1000 new file: linden/indra/newview/skins/default/textures/map_avatar_you_32.tga
1001
1002
10032009-09-20 McCabe Maxsted <hakushakukun@gmail.com>
1004
1005 * Dynamically change max prim size depending upon LL/OpenSim grid
1006 (Added setting for opensim detection: LoggedIntoOpenSim).
1007 OpenSim max is 128m.
1008
1009 modified: linden/indra/llmath/xform.h
1010 modified: linden/indra/newview/app_settings/settings
1011 modified: linden/indra/newview/llmanipscale.cpp
1012 modified: linden/indra/newview/llmanipscale.h
1013 modified: linden/indra/newview/llpanelobject.cpp
1014 modified: linden/indra/newview/llviewermessage.cpp
1015 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
1016
1017
1018 * Fixed inventory offers not avatar name (another RLVa bug).
1019
1020 modified: linden/indra/newview/llviewermessage.cpp
1021
1022
1023 * Fixed group titles showing up as ?.
1024
1025 modified: linden/indra/newview/llvoavatar.cpp
1026
1027
1028 * Added adult compliant flag.
1029
1030 modified: linden/indra/newview/llstartup.cpp
1031
1032
10332009-09-18 McCabe Maxsted <hakushakukun@gmail.com>
1034
1035 * Applied patch by Aleric Inglewood for VWR-13996
1036 Avatars using 1.22 completely invisible on first sight.
1037
1038 modified: linden/indra/newview/llspatialpartition.cpp
1039
1040
10412009-09-16 McCabe Maxsted <hakushakukun@gmail.com>
1042
1043 * Estate and track buttons now disable when they should,
1044 tweaked spacing.
1045
1046 modified: linden/indra/newview/llfloatermap.cpp
1047 modified: linden/indra/newview/llfloatermap.h
1048 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
1049
1050
10512009-09-15 McCabe Maxsted <hakushakukun@gmail.com>
1052
1053 * Applied patch by Robin Cornelius for VWR-11128
1054 Python not always detected by develop.py.
1055
1056 modified: linden/indra/cmake/Python.cmake
1057
1058
1059 * Applied patch by Robin Cornelius for VWR-11138
1060 Make develop.py play nicely with express editions of Visual Studio.
1061
1062 modified: linden/indra/develop.py
1063
1064
1065 * Added Codebastard Redgrave's windlight presets to Imprudence.
1066
1067 new file: linden/indra/newview/app_settings/windlight/skies/Rouge%201.xml
1068 new file: linden/indra/newview/app_settings/windlight/skies/Rouge%202.xml
1069 new file: linden/indra/newview/app_settings/windlight/skies/Rouge%203.xml
1070 new file: linden/indra/newview/app_settings/windlight/skies/Rouge%204.xml
1071 new file: linden/indra/newview/app_settings/windlight/skies/Rouge%205.xml
1072 new file: linden/indra/newview/app_settings/windlight/skies/Rouge%206.xml
1073
1074
1075 * Added tabs to mini-map radar.
1076
1077 modified: linden/indra/newview/llfloatermap.cpp
1078 modified: linden/indra/newview/llfloatermap.h
1079 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
1080
1081
1082 * Some code cleanup.
1083
1084 modified: linden/indra/newview/llfloatermap.cpp
1085 modified: linden/indra/newview/llfloatermap.h
1086 modified: linden/indra/newview/llnetmap.cpp
1087
1088
1089 * Fixed bad RLVa behavior in minimap.
1090
1091 modified: linden/indra/newview/llnetmap.cpp
1092
1093
1094 * Don't track avatars when focus lost.
1095
1096 modified: linden/indra/newview/llfloatermap.cpp
1097
1098
1099 * Fixed min minimap size.
1100
1101 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
1102
1103
1104 * Moved Rotate Mini-Map option to mini-map menu, added first use dialog.
1105
1106 modified: linden/indra/newview/llfirstuse.cpp
1107 modified: linden/indra/newview/llfirstuse.h
1108 modified: linden/indra/newview/llfloatermap.cpp
1109 modified: linden/indra/newview/llnetmap.cpp
1110 modified: linden/indra/newview/llnetmap.h
1111 modified: linden/indra/newview/llpanelgeneral.cpp
1112 modified: linden/indra/newview/app_settings/settings.xml
1113 modified: linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml
1114 modified: linden/indra/newview/skins/default/xui/en-us/notify.xml
1115 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
1116
1117
11182009-09-14 McCabe Maxsted <hakushakukun@gmail.com>
1119
1120 * Small improvement to hide selection outlines in LLSelectMgr.
1121
1122 modified: linden/indra/newview/llselectmgr.cpp
1123
1124
1125 * Small performance change from Emerald viewer in LLVLComposition.
1126
1127 modified: linden/indra/newview/llvlcomposition.cpp
1128
1129
1130 * Applied BlockClickSit debug setting from Emerald
1131 to block sit click action.
1132
1133 modified: linden/indra/newview/app_settings/settings.xml
1134 modified: linden/indra/newview/lltoolpie.cpp
1135
1136
1137 * Fixed unhandled exception in llviewerobjectlist.cpp
1138
1139 modified: linden/indra/newview/llviewerobjectlist.cpp
1140
1141
11422009-09-13 McCabe Maxsted <hakushakukun@gmail.com>
1143
1144 * Added prev/next buttons for windlight presets, cleaned up some stuff.
1145
1146 modified: linden/indra/newview/llfloaterwindlight.cpp
1147 modified: linden/indra/newview/llfloaterwindlight.h
1148 modified: linden/indra/newview/llwindlightremotectrl.cpp
1149 modified: linden/indra/newview/llwlparammanager.cpp
1150 modified: linden/indra/newview/llwlparammanager.h
1151 modified: linden/indra/newview/skins/default/textures/textures.xml
1152 modified: linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml
1153
1154
1155 * Fixed World options not showing up when windlight remote expanded.
1156
1157 modified: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml
1158
1159
1160 * Added missing left/right arrow textures.
1161
1162 new file: linden/indra/newview/skins/default/textures/arrow_left.tga
1163 new file: linden/indra/newview/skins/default/textures/arrow_right.tga
1164 new file: linden/indra/newview/skins/silver/textures/arrow_left.tga
1165 new file: linden/indra/newview/skins/silver/textures/arrow_right.tga
1166
1167
11682009-09-12 McCabe Maxsted <hakushakukun@gmail.com>
1169
1170 * Clarified 'show in search' in profile.
1171
1172 modified: linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
1173
1174
1175 * Fixed windlight toolbar not updating windlight floater pulldown.
1176
1177 modified: linden/indra/newview/llfloaterwindlight.cpp
1178 modified: linden/indra/newview/llwindlightremotectrl.cpp
1179 modified: linden/indra/newview/llwlparammanager.cpp
1180 modified: linden/indra/newview/llwlparammanager.h
1181
1182
1183 * Fixed windlight toolbar presets not applying when region default.
1184
1185 modified: linden/indra/newview/llwindlightremotectrl.cpp
1186
1187
11882009-09-11 McCabe Maxsted <hakushakukun@gmail.com>
1189
1190 * Applied inventory Search menu from Emerald viewer (still ugly).
1191
1192 modified: newview/app_settings/settings.xml
1193 modified: newview/llfolderview.cpp
1194 modified: newview/llfolderview.h
1195 modified: newview/llinventoryactions.cpp
1196 modified: newview/llinventoryview.cpp
1197 modified: newview/skins/default/xui/en-us/floater_inventory.xml
1198
1199
1200 * Applied patch for long distance opensim hypergrid tps (SVC-2941)
1201 (Feature currently disabled in OpenSim)
1202
1203 modified: linden/indra/newview/llviewermessage.cpp
1204
1205
1206 * Fixed browser window showing wrong title.
1207
1208 modified: linden/indra/newview/skins/default/xui/en-us/floater_media_browser.xml
1209
1210
1211 * Fixed double click tp from working on HUDs.
1212
1213 modified: linden/indra/newview/lltoolpie.cpp
1214
1215
1216 * Added minimize to snapshot window.
1217
1218 modified: linden/indra/newview/skins/default/xui/en-us/floater_snapshot.xml
1219
1220
1221 * Upped the max bandwidth setting to 5000kbps (default 1000kbps).
1222
1223 modified: linden/indra/newview/llviewerthrottle.cpp
1224 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
1225 modified: linden/indra/newview/app_settings/settings.xml
1226
1227
1228 * Applied patch to wear multiple attachments at once (VWR-5063).
1229
1230 modified: linden/indra/newview/llinventoryactions.cpp
1231 modified: linden/indra/newview/llinventorybridge.cpp
1232
1233
1234 * Fixed profile account info spacing.
1235
1236 modified: indra/newview/skins/default/xui/en-us/panel_avatar.xml
1237
1238
1239 * Applied patch by Latif Khalifa for VWR-5370
1240 (Detached "Contacts" panel cannot be hidden/closed via menu
1241 or shortcut (Ctrl/Cmd-Shift-F))
1242
1243 modified: linden/indra/newview/llfloaterchatterbox.h
1244
1245
1246 * Applied and modified Emerald viewer feature that shows what
1247 groups are hidden in your profile.
1248
1249 modified: linden/indra/newview/llpanelavatar.cpp
1250 modified: linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
1251
1252
12532009-09-10 McCabe Maxsted <hakushakukun@gmail.com>
1254
1255 * Created new toolbar control for windlight presets and options.
1256
1257 new file: linden/indra/newview/llwindlightremotectrl.cpp
1258 new file: linden/indra/newview/llwindlightremotectrl.h
1259 new file: linden/indra/newview/skins/default/xui/en-us/panel_windlight_controls.xml
1260 new file: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote.xml
1261 new file: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml
1262 modified: linden/indra/newview/CMakeLists.txt
1263 modified: linden/indra/newview/app_settings/settings.xml
1264 modified: linden/indra/newview/llfloaterwindlight.cpp
1265 modified: linden/indra/newview/lloverlaybar.cpp
1266 modified: linden/indra/newview/lloverlaybar.h
1267 modified: linden/indra/newview/llpaneldisplay.cpp
1268 modified: linden/indra/newview/llpaneldisplay.h
1269 modified: linden/indra/newview/llwlparammanager.cpp
1270 modified: linden/indra/newview/llwlparammanager.h
1271 modified: linden/indra/newview/skins/default/xui/en-us/panel_overlaybar.xml
1272 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
1273
1274
1275 * Fixed missing 'm' for draw distance slider.
1276
1277 modified: linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml
1278
1279
12802009-09-09 McCabe Maxsted <hakushakukun@gmail.com>
1281
1282 * Backported clickable object names from 1.23.
1283
1284 new file: llcommon/llcursortypes.cpp
1285 new file: llcommon/llcursortypes.h
1286 new file: newview/llfloaterobjectiminfo.cpp
1287 new file: newview/llfloaterobjectiminfo.h
1288 new file: newview/skins/default/xui/en-us/floater_object_im_info.xm
1289 modified: llcommon/CMakeLists.txt
1290 modified: llcommon/llchat.h
1291 modified: llui/llpanel.cpp
1292 modified: llui/llpanel.h
1293 modified: llui/lltextbox.cpp
1294 modified: llui/lltextbox.h
1295 modified: llui/lltexteditor.cpp
1296 modified: llui/lltexteditor.h
1297 modified: llui/llview.cpp
1298 modified: llui/llview.h
1299 modified: llwindow/llwindow.h
1300 modified: newview/CMakeLists.txt
1301 modified: newview/app_settings/settings.xml
1302 modified: newview/llfloaterabout.cpp
1303 modified: newview/llfloaterchat.cpp
1304 modified: newview/llgroupnotify.cpp
1305 modified: newview/llimpanel.cpp
1306 modified: newview/llstylemap.cpp
1307 modified: newview/llstylemap.h
1308 modified: newview/llviewermessage.cpp
1309 modified: newview/skins/default/colors_base.xml
1310 modified: newview/skins/silver/colors_base.xml
1311
1312
1313 * Applied ReinstateShowTextureUUID Cool Viewer patch.
1314 Reverts the "fix" for VWR-1919.
1315 Patch by Henri Beauchamp, modified by McCabe Maxsted.
1316
1317 modified: linden/indra/newview/lltexturectrl.cpp
1318 modified: linden/indra/newview/llviewermenu.cpp
1319
1320
1321 * Fixed unlink option enabling when selecting textures.
1322
1323 modified: linden/indra/newview/llfloatertools.cpp
1324 modified: linden/indra/newview/llviewermenu.cpp
1325
1326
1327 * Redid layout of profile window, added group invite button.
1328
1329 modified: linden/indra/newview/llpanelavatar.cpp
1330 modified: linden/indra/newview/llpanelavatar.h
1331 modified: linden/indra/newview/skins/default/xui/en-us/floater_profile.xml
1332 modified: linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
1333 deleted: linden/indra/newview/skins/silver/xui/en-us/panel_avatar.xml
1334
1335
1336 * Admin options now only show for other people's profiles.
1337
1338 modified: linden/indra/newview/llpanelavatar.cpp
1339
1340
13412009-09-09 Jacek Antonelli <jacek.antonelli@gmail.com>
1342
1343 * Updated Grid Manager from Meerkat's SVN (as of r215).
1344
1345 modified: linden/indra/llvfs/lldir.cpp
1346 modified: linden/indra/llvfs/lldir.h
1347 modified: linden/indra/newview/CMakeLists.txt
1348 modified: linden/indra/newview/app_settings/default_grids.xml
1349 deleted: linden/indra/newview/authentication_controller.cpp
1350 deleted: linden/indra/newview/authentication_controller.h
1351 deleted: linden/indra/newview/authentication_floater.cpp
1352 deleted: linden/indra/newview/authentication_floater.h
1353 deleted: linden/indra/newview/authentication_model.cpp
1354 deleted: linden/indra/newview/authentication_model.h
1355 deleted: linden/indra/newview/controllerlogin.cpp
1356 deleted: linden/indra/newview/controllerlogin.h
1357 deleted: linden/indra/newview/controllerpasswords.cpp
1358 deleted: linden/indra/newview/controllerpasswords.h
1359 modified: linden/indra/newview/floaterlogin.cpp
1360 modified: linden/indra/newview/floaterlogin.h
1361 modified: linden/indra/newview/hippoGridManager.cpp
1362 modified: linden/indra/newview/hippoGridManager.h
1363 modified: linden/indra/newview/llfloaterworldmap.cpp
1364 modified: linden/indra/newview/llpanellogin.cpp
1365 modified: linden/indra/newview/llprefsim.cpp
1366 modified: linden/indra/newview/llstartup.cpp
1367 deleted: linden/indra/newview/prefpanelpasswords.cpp
1368 deleted: linden/indra/newview/prefpanelpasswords.h
1369 modified: linden/indra/newview/skins/default/xui/en-us/floater_login.xml
1370
1371
1372 * Merged in Grid Manager, etc. (thanks Armin).
1373
1374 modified: linden/indra/llcommon/llstring.h
1375 modified: linden/indra/newview/CMakeLists.txt
1376 new file: linden/indra/newview/app_settings/default_grids.xml
1377 modified: linden/indra/newview/app_settings/settings.xml
1378 new file: linden/indra/newview/authentication_controller.cpp
1379 new file: linden/indra/newview/authentication_controller.h
1380 new file: linden/indra/newview/authentication_floater.cpp
1381 new file: linden/indra/newview/authentication_floater.h
1382 new file: linden/indra/newview/authentication_model.cpp
1383 new file: linden/indra/newview/authentication_model.h
1384 new file: linden/indra/newview/controllerlogin.cpp
1385 new file: linden/indra/newview/controllerlogin.h
1386 new file: linden/indra/newview/controllerpasswords.cpp
1387 new file: linden/indra/newview/controllerpasswords.h
1388 new file: linden/indra/newview/floaterlogin.cpp
1389 new file: linden/indra/newview/floaterlogin.h
1390 new file: linden/indra/newview/hippoGridManager.cpp
1391 new file: linden/indra/newview/hippoGridManager.h
1392 new file: linden/indra/newview/hippoLimits.cpp
1393 new file: linden/indra/newview/hippoLimits.h
1394 new file: linden/indra/newview/hippoRestRequest.cpp
1395 new file: linden/indra/newview/hippoRestRequest.h
1396 new file: linden/indra/newview/hippoUpdate.cpp
1397 new file: linden/indra/newview/hippoUpdate.h
1398 modified: linden/indra/newview/llagent.cpp
1399 modified: linden/indra/newview/llappviewer.cpp
1400 modified: linden/indra/newview/llappviewer.h
1401 modified: linden/indra/newview/llappviewerlinux.h
1402 modified: linden/indra/newview/llcallingcard.cpp
1403 modified: linden/indra/newview/llcallingcard.h
1404 modified: linden/indra/newview/llchatbar.cpp
1405 modified: linden/indra/newview/lldrawable.h
1406 modified: linden/indra/newview/llfloaterworldmap.cpp
1407 modified: linden/indra/newview/llfloaterworldmap.h
1408 modified: linden/indra/newview/llinventorymodel.cpp
1409 modified: linden/indra/newview/llinventorymodel.h
1410 modified: linden/indra/newview/llinventoryview.cpp
1411 modified: linden/indra/newview/llpanellogin.cpp
1412 modified: linden/indra/newview/llpanellogin.h
1413 modified: linden/indra/newview/llprogressview.cpp
1414 modified: linden/indra/newview/llstartup.cpp
1415 modified: linden/indra/newview/llstartup.h
1416 modified: linden/indra/newview/lluserauth.cpp
1417 modified: linden/indra/newview/llviewerjointattachment.h
1418 modified: linden/indra/newview/llviewermenu.cpp
1419 modified: linden/indra/newview/llviewermenufile.cpp
1420 modified: linden/indra/newview/llviewermessage.cpp
1421 modified: linden/indra/newview/llviewermessage.h
1422 modified: linden/indra/newview/llviewernetwork.cpp
1423 modified: linden/indra/newview/llviewernetwork.h
1424 modified: linden/indra/newview/llviewerobject.h
1425 modified: linden/indra/newview/llviewerwindow.cpp
1426 modified: linden/indra/newview/llvoavatar.cpp
1427 modified: linden/indra/newview/llwearablelist.cpp
1428 modified: linden/indra/newview/llworld.cpp
1429 new file: linden/indra/newview/prefpanelpasswords.cpp
1430 new file: linden/indra/newview/prefpanelpasswords.h
1431 modified: linden/indra/newview/skins/default/xui/en-us/alerts.xml
1432 new file: linden/indra/newview/skins/default/xui/en-us/floater_login.xml
1433 modified: linden/indra/newview/skins/default/xui/en-us/floater_world_map.xml
1434 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1435 modified: linden/indra/newview/skins/default/xui/en-us/panel_login.xml
1436 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
1437
1438
1439 * Commented out Linux tarball building.
1440 It's a waste of time to package after every compile.
1441
1442 modified: linden/indra/newview/viewer_manifest.py
1443
1444
14452009-09-08 McCabe Maxsted <hakushakukun@gmail.com>
1446
1447 * Created my own version of Emerald's chat channel tool.
1448
1449 modified: linden/indra/newview/app_settings/settings.xml
1450 modified: linden/indra/newview/llchatbar.cpp
1451 modified: linden/indra/newview/llchatbar.h
1452 modified: linden/indra/newview/llfloaterchat.cpp
1453 modified: linden/indra/newview/llfloaterchat.h
1454 modified: linden/indra/newview/llprefschat.cpp
1455 modified: linden/indra/newview/llprefsim.cpp
1456 modified: linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
1457 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
1458 modified: linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
1459
1460
1461 * New chat channel preference should change only on apply.
1462
1463 modified: linden/indra/newview/llprefschat.cpp
1464 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
1465
1466
1467 * Commented out permissions button in object contents.
1468 (Todo: backport this if there's time).
1469
1470 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
1471
1472
14732009-09-07 McCabe Maxsted <hakushakukun@gmail.com>
1474
1475 * Fixed tool brush size.
1476
1477 modified: linden/indra/newview/app_settings/settings.xml
1478 modified: linden/indra/newview/llfloatertools.cpp
1479 modified: linden/indra/newview/lltoolbrush.cpp
1480 modified: linden/indra/newview/lltoolbrush.h
1481 modified: linden/scripts/messages/message_template.msg
1482
1483
1484 * Applied and tweaked last owner in tools window from Emerald viewer.
1485
1486 modified: linden/indra/newview/llpanelpermissions.cpp
1487 modified: linden/indra/newview/llpanelpermissions.h
1488 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
1489
1490
14912009-09-06 McCabe Maxsted <hakushakukun@gmail.com>
1492
1493 * Applied sit anywhere feature from Emerald viewer.
1494
1495 modified: linden/indra/newview/llviewermenu.cpp
1496 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1497
1498
1499 * Applied phantom avatar feature from Emerald viewer.
1500
1501 modified: linden/indra/newview/llagent.cpp
1502 modified: linden/indra/newview/llagent.h
1503 modified: linden/indra/newview/llappviewer.cpp
1504 modified: linden/indra/newview/llviewermenu.cpp
1505 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1506
1507
1508 * Start fetching inventory at startup.
1509
1510 modified: linden/indra/newview/llstartup.cpp
1511
1512
1513 * Added Emerald viewer's animation list.
1514
1515 new file: linden/indra/newview/jcfloater_animation_list.cpp
1516 new file: linden/indra/newview/jcfloater_animation_list.h
1517 new file: linden/indra/newview/skins/default/xui/en-us/floater_animation_list.xml
1518 modified: linden/indra/newview/CMakeLists.txt
1519 modified: linden/indra/newview/llviewermenu.cpp
1520 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1521
1522
1523 * Added Emerald viewer's asset browser.
1524
1525 new file: linden/indra/newview/llfloaterassetbrowser.cpp
1526 new file: linden/indra/newview/llfloaterassetbrowser.h
1527 new file: linden/indra/newview/skins/default/xui/en-us/floater_asset_browser.xml
1528 modified: linden/indra/newview/CMakeLists.txt
1529 modified: linden/indra/newview/llfloaterassetbrowser.cpp
1530 modified: linden/indra/newview/llviewermenu.cpp
1531 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1532
1533
1534 * Added LLScrollListCtrl::getSelectedIDs().
1535
1536 modified: linden/indra/llui/llscrolllistctrl.cpp
1537 modified: linden/indra/llui/llscrolllistctrl.h
1538
1539
1540 * Fixed reference to missing colors.xml entry.
1541
1542 modified: linden/indra/newview/jcfloater_animation_list.cpp
1543
1544
1545 * Fixed ground sit menu entry missing check.
1546
1547 modified: linden/indra/newview/llviewermenu.cpp
1548 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1549
1550
15512009-09-05 Jacek Antonelli <jacek.antonelli@gmail.com>
1552
1553 * Converted RLVa menu items to XUI.
1554
1555 modified: linden/indra/newview/llviewermenu.cpp
1556 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1557
1558
15592009-09-04 Jacek Antonelli <jacek.antonelli@gmail.com>
1560
1561 * Applied Kitty Barnett's RLVa 1.0.1h (Restrained Life) patch.
1562 Made a few non-functional changes to help it apply.
1563
1564 modified: linden/indra/llcommon/llchat.h
1565 modified: linden/indra/newview/CMakeLists.txt
1566 modified: linden/indra/newview/app_settings/settings.xml
1567 modified: linden/indra/newview/app_settings/settings_per_account.xml
1568 modified: linden/indra/newview/llagent.cpp
1569 modified: linden/indra/newview/llagent.h
1570 modified: linden/indra/newview/llappviewer.cpp
1571 modified: linden/indra/newview/llchatbar.cpp
1572 modified: linden/indra/newview/llfloaterabout.cpp
1573 modified: linden/indra/newview/llfloateractivespeakers.cpp
1574 modified: linden/indra/newview/llfloaterbeacons.cpp
1575 modified: linden/indra/newview/llfloaterchat.cpp
1576 modified: linden/indra/newview/llfloaterinspect.cpp
1577 modified: linden/indra/newview/llfloaterland.cpp
1578 modified: linden/indra/newview/llfloaterland.h
1579 modified: linden/indra/newview/llfloatermap.cpp
1580 modified: linden/indra/newview/llfloatermap.h
1581 modified: linden/indra/newview/llfloateropenobject.cpp
1582 modified: linden/indra/newview/llfloaterproperties.cpp
1583 modified: linden/indra/newview/llfloaterregioninfo.cpp
1584 modified: linden/indra/newview/llfloaterregioninfo.h
1585 modified: linden/indra/newview/llfloaterreporter.cpp
1586 modified: linden/indra/newview/llfloatersettingsdebug.cpp
1587 modified: linden/indra/newview/llfloaterwindlight.cpp
1588 modified: linden/indra/newview/llfloaterworldmap.cpp
1589 modified: linden/indra/newview/llglsandbox.cpp
1590 modified: linden/indra/newview/llhoverview.cpp
1591 modified: linden/indra/newview/llhudtext.cpp
1592 modified: linden/indra/newview/llhudtext.h
1593 modified: linden/indra/newview/llimpanel.cpp
1594 modified: linden/indra/newview/llimview.cpp
1595 modified: linden/indra/newview/llinventorybridge.cpp
1596 modified: linden/indra/newview/llinventorymodel.cpp
1597 modified: linden/indra/newview/llinventoryview.cpp
1598 modified: linden/indra/newview/llinventoryview.h
1599 modified: linden/indra/newview/llmaniptranslate.cpp
1600 modified: linden/indra/newview/llnetmap.cpp
1601 modified: linden/indra/newview/llnotify.cpp
1602 modified: linden/indra/newview/lloverlaybar.cpp
1603 modified: linden/indra/newview/llpanelavatar.cpp
1604 modified: linden/indra/newview/llpanelclassified.cpp
1605 modified: linden/indra/newview/llpanelcontents.cpp
1606 modified: linden/indra/newview/llpaneldisplay.cpp
1607 modified: linden/indra/newview/llpanelinventory.cpp
1608 modified: linden/indra/newview/llpanelland.cpp
1609 modified: linden/indra/newview/llpanellogin.cpp
1610 modified: linden/indra/newview/llpanelobject.cpp
1611 modified: linden/indra/newview/llpanelpermissions.cpp
1612 modified: linden/indra/newview/llpanelpick.cpp
1613 modified: linden/indra/newview/llprefsim.cpp
1614 modified: linden/indra/newview/llpreviewscript.cpp
1615 modified: linden/indra/newview/llselectmgr.cpp
1616 modified: linden/indra/newview/llstartup.cpp
1617 modified: linden/indra/newview/llstatusbar.cpp
1618 modified: linden/indra/newview/lltoolbar.cpp
1619 modified: linden/indra/newview/lltooldraganddrop.cpp
1620 modified: linden/indra/newview/lltoolface.cpp
1621 modified: linden/indra/newview/lltoolgrab.cpp
1622 modified: linden/indra/newview/lltoolpie.cpp
1623 modified: linden/indra/newview/lltoolplacer.cpp
1624 modified: linden/indra/newview/lltoolselect.cpp
1625 modified: linden/indra/newview/lltracker.cpp
1626 modified: linden/indra/newview/llviewercontrol.cpp
1627 modified: linden/indra/newview/llviewerdisplay.cpp
1628 modified: linden/indra/newview/llviewermenu.cpp
1629 modified: linden/indra/newview/llviewermessage.cpp
1630 modified: linden/indra/newview/llviewerobject.cpp
1631 modified: linden/indra/newview/llviewertexteditor.cpp
1632 modified: linden/indra/newview/llviewerwindow.cpp
1633 modified: linden/indra/newview/llvoavatar.cpp
1634 modified: linden/indra/newview/llvovolume.cpp
1635 modified: linden/indra/newview/llworldmapview.cpp
1636 modified: linden/indra/newview/pipeline.cpp
1637 new file: linden/indra/newview/rlvevent.h
1638 new file: linden/indra/newview/rlvextensions.cpp
1639 new file: linden/indra/newview/rlvextensions.h
1640 new file: linden/indra/newview/rlvfloaterbehaviour.cpp
1641 new file: linden/indra/newview/rlvfloaterbehaviour.h
1642 new file: linden/indra/newview/rlvhandler.cpp
1643 new file: linden/indra/newview/rlvhandler.h
1644 new file: linden/indra/newview/rlvhelper.cpp
1645 new file: linden/indra/newview/rlvhelper.h
1646 new file: linden/indra/newview/rlvmultistringsearch.cpp
1647 new file: linden/indra/newview/rlvmultistringsearch.h
1648 new file: linden/indra/newview/skins/default/xui/en-us/floater_rlv_behaviour.xml
1649
1650
16512009-09-04 McCabe Maxsted <hakushakukun@gmail.com>
1652
1653 * Updated GStreamer and Zlib windows libs.
1654
1655 modified: linden/indra/cmake/CopyWinLibs.cmake
1656 modified: linden/install.xml
1657
1658
1659 * Fixed inability to minimize chat history.
1660
1661 modified: linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
1662
1663
1664 * Rebranded startup loading page to Imprudence.
1665
1666 modified: linden/indra/newview/skins/default/html/en-us/loading/loading.html
1667 new file: linden/indra/newview/skins/default/html/en-us/loading/imprudence_loading.png
1668
1669
1670 * Cherry-picked Armin's middle mouse copy branch.
1671
1672
1673 * Cherry-picked Armin's double-click tp inworld branch.
1674
1675
1676 * Added 'Go Here' to object pie menu.
1677
1678 modified: linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
1679
1680
1681 * Integrated 1.23's tool floater with link/unlink buttons.
1682
1683 modified: linden/indra/newview/llfloatertelehub.cpp
1684 modified: linden/indra/newview/llfloatertools.cpp
1685 modified: linden/indra/newview/llfloatertools.h
1686 modified: linden/indra/newview/llviewermenu.cpp
1687 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
1688
1689
1690 * Fixed tree/grass label not hiding.
1691
1692 modified: linden/indra/newview/llfloatertools.cpp
1693
1694
16952009-09-03 Jacek Antonelli <jacek.antonelli@gmail.com>
1696
1697 * Backported 1.23 fix for animation joint assertion crash.
1698
1699 modified: linden/indra/llcharacter/llkeyframemotion.cpp
1700
1701
1702 * Updated object backup feature to Meerkat's SVN, imported floater.
1703
1704 modified: linden/indra/newview/primbackup.cpp
1705 modified: linden/indra/newview/primbackup.h
1706 new file: linden/indra/newview/skins/default/xui/en-us/floater_prim_import.xml
1707
1708
1709 * Imported Meerkat's object backup feature.
1710
1711 modified: linden/indra/newview/CMakeLists.txt
1712 modified: linden/indra/newview/app_settings/settings.xml
1713 modified: linden/indra/newview/llviewermenu.cpp
1714 modified: linden/indra/newview/llviewerobjectlist.cpp
1715 new file: linden/indra/newview/primbackup.cpp
1716 new file: linden/indra/newview/primbackup.h
1717 modified: linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
1718 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1719
1720
1721 * Updated some python scripts to not use deprecated modules.
1722
1723 modified: linden/indra/lib/python/indra/base/lluuid.py
1724 modified: linden/indra/lib/python/indra/ipc/llmessage.py
1725 modified: linden/scripts/install.py
1726
1727
17282009-08-29 McCabe Maxsted <hakushakukun@gmail.com>
1729
1730 * Fixed OpenAL CMake error
1731
1732 modified: linden/indra/cmake/OPENAL.cmake
1733
1734
1735 * Fixed CMake not finding GLib on windows.
1736
1737 modified: linden/indra/cmake/GStreamer.cmake
1738
1739
17402009-08-12 McCabe Maxsted <hakushakukun@gmail.com>
1741
1742 * Added basic radar to the minimap.
1743
1744 modified: linden/indra/newview/llfloatermap.cpp
1745 modified: linden/indra/newview/llfloatermap.h
1746 modified: linden/indra/newview/llnetmap.cpp
1747 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
1748
1749
12009-06-14 McCabe Maxsted <hakushakukun@gmail.com> 17502009-06-14 McCabe Maxsted <hakushakukun@gmail.com>
2 1751
3 * Added IM preference for showing IMs in either main or local chat. 1752 * Added IM preference for showing IMs in either main or local chat.
4 1753
5 modified: linden/indra/newview/app_settings/settings.xml 1754 modified: linden/indra/newview/app_settings/settings.xml
6 modified: linden/indra/newview/llfloaterchat.cpp 1755 modified: linden/indra/newview/llfloaterchat.cpp
7 modified: linden/indra/newview/llprefsim.cpp 1756 modified: linden/indra/newview/llprefsim.cpp
8 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml 1757 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
9 1758
10 1759
11 * Online/Offline notifications now always show in IM windows. 1760 * Online/Offline notifications now always show in IM windows.
12 1761
13 modified: linden/indra/newview/llcallingcard.cpp 1762 modified: linden/indra/newview/llcallingcard.cpp
1763
1764
1765 * Audio stream track info displayed in chat instead of notices.
1766
1767 modified: indra/newview/lloverlaybar.cpp
1768
1769
1770 * Fixed stream info not updating.
1771
1772 modified: indra/llmedia/llmediaimplgstreamer.cpp
1773
1774
17752009-06-14 Dale Glass <email@unknown.com>
1776
1777 * VWR-12655: Add support for displaying the title of the song.
1778
1779 modified: indra/llaudio/audioengine.h
1780 modified: indra/llmedia/llmediaimplgstreamer.cpp
1781 modified: indra/llmedia/llmediaimplgstreamer.h
1782 modified: indra/llmedia/llmediaobserver.h
1783 modified: indra/newview/app_settings/settings.xml
1784 modified: indra/newview/lloverlaybar.cpp
1785 modified: indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml
14 1786
15 1787
162009-06-13 McCabe Maxsted <hakushakukun@gmail.com> 17882009-06-13 McCabe Maxsted <hakushakukun@gmail.com>
17 1789
18 * Added 'Show Map' option to the mini-map menu. 1790 * Added 'Show Map' option to the mini-map menu.
19 1791
20 modified: linden/indra/newview/llnetmap.cpp 1792 modified: linden/indra/newview/llnetmap.cpp
21 modified: linden/indra/newview/llnetmap.h 1793 modified: linden/indra/newview/llnetmap.h
22 modified: linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml 1794 modified: linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml
23 1795
24 1796
25 * Moved mini-map tooltips to XML, added panning tooltip. 1797 * Moved mini-map tooltips to XML, added panning tooltip.
26 1798
27 modified: linden/indra/newview/llnetmap.cpp 1799 modified: linden/indra/newview/llnetmap.cpp
28 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml 1800 modified: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
29 modified: linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml 1801 modified: linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml
30 1802
31 1803
32 * Removed double click tp checkbox from preferences as it keeps the two maps more in sync, 1804 * Removed double click tp checkbox from preferences as it keeps
33 and Show Map is in the minimap now. Keeping the debug setting. 1805 the two maps more in sync, and Show Map is in the minimap now.
34 1806 Keeping the debug setting.
35 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml 1807
1808 modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
36 1809
37 1810
38 * Forgot tooltip for map opening, fixed typo. 1811 * Forgot tooltip for map opening, fixed typo.
39 1812
40 modified: linden/indra/newview/llnetmap.cpp 1813 modified: linden/indra/newview/llnetmap.cpp
41 modified: linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml 1814 modified: linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml
42 1815
43 1816
44 * Show muted avatars as grey in the mini-map. 1817 * Show muted avatars as grey in the mini-map.
45 1818
46 modified: linden/indra/newview/llnetmap.cpp 1819 modified: linden/indra/newview/llnetmap.cpp
47 modified: linden/indra/newview/llworldmapview.cpp 1820 modified: linden/indra/newview/llworldmapview.cpp
48 modified: linden/indra/newview/skins/default/colors_base.xml 1821 modified: linden/indra/newview/skins/default/colors_base.xml
49 modified: linden/indra/newview/skins/silver/colors_base.xml 1822 modified: linden/indra/newview/skins/silver/colors_base.xml
50 1823
51 1824
52 * Cleaned up some old unused references. 1825 * Cleaned up some old unused references.
53 1826
54 modified: linden/indra/newview/llappviewer.cpp 1827 modified: linden/indra/newview/llappviewer.cpp
55 modified: linden/indra/newview/llappviewer.h 1828 modified: linden/indra/newview/llappviewer.h
56 modified: linden/indra/newview/llfloaterreporter.cpp 1829 modified: linden/indra/newview/llfloaterreporter.cpp
57 modified: linden/indra/newview/llnetmap.cpp 1830 modified: linden/indra/newview/llnetmap.cpp
58 modified: linden/indra/newview/llviewermessage.cpp 1831 modified: linden/indra/newview/llviewermessage.cpp
59 1832
60 1833
61 Aimee Trescothick <aimee@ama-zing.co.uk> 18342009-06-13 Aimee Trescothick <aimee@ama-zing.co.uk>
62 1835
63 * VWR-4106: Mini-map beacon icon doesn't display correctly when beacon position above or below camera. 1836 * VWR-4106: Mini-map beacon icon doesn't display correctly
64 1837 when beacon position above or below camera.
65 modified: linden/indra/newview/llworldmapview.cpp 1838
66 modified: linden/indra/newview/llworldmapview.h 1839 modified: linden/indra/newview/llworldmapview.cpp
67 1840 modified: linden/indra/newview/llworldmapview.h
68 1841
69 * VWR-12631: setting to adjust the maximum size of objects displayed on the minimap (MiniMapPrimMaxRadius). 1842
70 1843 * VWR-12631: setting to adjust the maximum size of objects
71 modified: linden/indra/newview/app_settings/settings.xml 1844 displayed on the minimap (MiniMapPrimMaxRadius).
72 modified: linden/indra/newview/llnetmap.cpp 1845
73 modified: linden/indra/newview/llviewerobjectlist.cpp 1846 modified: linden/indra/newview/app_settings/settings.xml
74 1847 modified: linden/indra/newview/llnetmap.cpp
75 1848 modified: linden/indra/newview/llviewerobjectlist.cpp
76 Armin Weatherwax <email@unknown.com> 1849
77 1850
18512009-06-13 Armin Weatherwax <email@unknown.com>
1852
78 * Updated OpenJpeg to 1.3 for Linux. 1853 * Updated OpenJpeg to 1.3 for Linux.
79 1854
80 modified: linden/indra/newview/viewer_manifest.py 1855 modified: linden/indra/newview/viewer_manifest.py
81 modified: linden/install.xml 1856 modified: linden/install.xml
82 1857
83 1858
842009-06-12 McCabe Maxsted <hakushakukun@gmail.com> 18592009-06-12 McCabe Maxsted <hakushakukun@gmail.com>
85 1860
86 * Applied patch by Robin Cornelius for VWR-12686: 1861 * Applied patch by Robin Cornelius for VWR-12686
87 LLTextureCache::writeToCache() does not cache textures smaller than TEXTURE_CACHE_ENTRY_SIZE 1862 LLTextureCache::writeToCache() does not cache textures
88 1863 smaller than TEXTURE_CACHE_ENTRY_SIZE
89 modified: linden/indra/newview/lltexturecache.cpp 1864
90 1865 modified: linden/indra/newview/lltexturecache.cpp
91 1866
92 Aimee Trescothick <aimee@ama-zing.co.uk> 1867
93 18682009-06-12 Aimee Trescothick <aimee@ama-zing.co.uk>
1869
94 * VWR-6918: Hide/Show Selection Outlines. 1870 * VWR-6918: Hide/Show Selection Outlines.
95 1871
96 modified: indra/newview/app_settings/settings.xml 1872 modified: indra/newview/app_settings/settings.xml
97 modified: indra/newview/llappviewer.cpp 1873 modified: indra/newview/llappviewer.cpp
98 modified: indra/newview/llselectmgr.cpp 1874 modified: indra/newview/llselectmgr.cpp
99 modified: indra/newview/llselectmgr.h 1875 modified: indra/newview/llselectmgr.h
100 modified: indra/newview/llviewermenu.cpp 1876 modified: indra/newview/llviewermenu.cpp
101 modified: indra/newview/skins/default/xui/en-us/menu_viewer.xml 1877 modified: indra/newview/skins/default/xui/en-us/menu_viewer.xml
102 1878
103 1879
104 * VWR-13221: Allow panning of the mini-map. 1880 * VWR-13221: Allow panning of the mini-map.
105 1881
106 modified: indra/newview/app_settings/settings.xml 1882 modified: indra/newview/app_settings/settings.xml
107 modified: indra/newview/llnetmap.cpp 1883 modified: indra/newview/llnetmap.cpp
108 modified: indra/newview/llnetmap.h 1884 modified: indra/newview/llnetmap.h
109 modified: indra/newview/skins/default/xui/en-us/menu_mini_map.xml 1885 modified: indra/newview/skins/default/xui/en-us/menu_mini_map.xml
110 1886
111 1887
1122009-06-11 McCabe Maxsted <hakushakukun@gmail.com> 18882009-06-11 McCabe Maxsted <hakushakukun@gmail.com>
113 1889
114 * Moved 'Duplicate' to the Tools menu. 1890 * Moved 'Duplicate' to the Tools menu.
115 * Renamed 'Select Tool' to 'Choose Tool', moved Selection options into a flyout menu. 1891
116 * Renamed 'Set permissions on selected task inventory' to 'Set Bulk Permissions'. 1892 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
117 1893
118 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml 1894
119 1895 * Renamed 'Select Tool' to 'Choose Tool', moved Selection options
120 1896 into a flyout menu.
1897
1898 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1899
1900
1901 * Renamed 'Set permissions on selected task inventory'
1902 to 'Set Bulk Permissions'.
1903
1904 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
1905
1906
121 * Added missing mini-map xui files. 1907 * Added missing mini-map xui files.
122 1908
123 new file: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml 1909 new file: linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
124 new file: linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml 1910 new file: linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml
125 new file: linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml 1911 new file: linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml
126 1912
127 1913
128 * Added patch and .pyc files to .gitignore. 1914 * Added patch and .pyc files to .gitignore.
129 1915
130 modified: .gitignore 1916 modified: .gitignore
131 1917
132 1918
133 * Added Link/Unlink buttons to the Tools floater. 1919 * Added Link/Unlink buttons to the Tools floater.
134 1920
135 modified: linden/indra/newview/llfloatertools.cpp 1921 modified: linden/indra/newview/llfloatertools.cpp
136 modified: linden/indra/newview/llfloatertools.h 1922 modified: linden/indra/newview/llfloatertools.h
137 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml 1923 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
138 1924
139 1925
140 * Fixed 'Unlink' not toggling in Tools menu. 1926 * Fixed 'Unlink' not toggling in Tools menu.
141 1927
142 modified: linden/indra/newview/llviewermenu.cpp 1928 modified: linden/indra/newview/llviewermenu.cpp
143 1929
144 1930
145 * Added Link/Unlink options to the object pie menu. 1931 * Added Link/Unlink options to the object pie menu.
146 1932
147 modified: linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml 1933 modified: linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
148 1934
149 1935
150 * Double clicking inventory objects toggles wear/detach. 1936 * Double clicking inventory objects toggles wear/detach.
151 Patch originally by Nicholaz Beresford with additions by Henri Beauchamp. 1937 Patch originally by Nicholaz Beresford with additions
152 1938 by Henri Beauchamp.
153 modified: indra/newview/llinventorybridge.cpp 1939
1940 modified: indra/newview/llinventorybridge.cpp
154 1941
155 1942
1562009-06-10 McCabe Maxsted <hakushakukun@gmail.com> 19432009-06-10 McCabe Maxsted <hakushakukun@gmail.com>
157 1944
158 * Fixed Communicate window not toggling from menu. 1945 * Fixed Communicate window not toggling from menu.
159 1946
160 modified: indra/newview/llviewermenu.cpp 1947 modified: indra/newview/llviewermenu.cpp
161 1948
162 1949
163 * Applied MJM's tree and grass pulldown list from the Hippo Viewer. 1950 * Applied MJM's tree and grass pulldown list from the Hippo Viewer.
164 1951
165 modified: linden/indra/newview/app_settings/grass.xml 1952 modified: linden/indra/newview/app_settings/grass.xml
166 modified: linden/indra/newview/app_settings/settings.xml 1953 modified: linden/indra/newview/app_settings/settings.xml
167 modified: linden/indra/newview/app_settings/trees.xml 1954 modified: linden/indra/newview/app_settings/trees.xml
168 modified: linden/indra/newview/llfloatertools.cpp 1955 modified: linden/indra/newview/llfloatertools.cpp
169 modified: linden/indra/newview/llfloatertools.h 1956 modified: linden/indra/newview/llfloatertools.h
170 modified: linden/indra/newview/lltoolplacer.cpp 1957 modified: linden/indra/newview/lltoolplacer.cpp
171 modified: linden/indra/newview/llvograss.cpp 1958 modified: linden/indra/newview/llvograss.cpp
172 modified: linden/indra/newview/llvograss.h 1959 modified: linden/indra/newview/llvograss.h
173 modified: linden/indra/newview/llvotree.cpp 1960 modified: linden/indra/newview/llvotree.cpp
174 modified: linden/indra/newview/llvotree.h 1961 modified: linden/indra/newview/llvotree.h
175 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml 1962 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
176 1963
177 1964
178 * Added pulldown label and fixed combobox not hiding. 1965 * Added pulldown label and fixed combobox not hiding.
179 1966
180 modified: linden/indra/newview/llfloatertools.cpp 1967 modified: linden/indra/newview/llfloatertools.cpp
181 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml 1968 modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
182 1969
183 1970
184 * Applied Armin's patch to create an Advanced Menu menu item. 1971 * Applied Armin's patch to create an Advanced Menu menu item.
185 (Placed it in View and changed it to a check.) 1972 Placed it in View and changed it to a check.
186 1973
187 modified: linden/indra/newview/llviewermenu.cpp 1974 modified: linden/indra/newview/llviewermenu.cpp
188 modified: linden/indra/newview/llviewerwindow.cpp 1975 modified: linden/indra/newview/llviewerwindow.cpp
189 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml 1976 modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
190 1977
191 1978
1922009-06-09 McCabe Maxsted <hakushakukun@gmail.com> 19792009-06-09 McCabe Maxsted <hakushakukun@gmail.com>
193 1980
194 * Backported 1.23's minimap conversion to XUI. 1981 * Backported 1.23's minimap conversion to XUI.
195 1982
196 modified: indra/llui/llui.cpp 1983 modified: indra/llui/llui.cpp
197 modified: indra/llui/llui.h 1984 modified: indra/llui/llui.h
198 modified: indra/newview/CMakeLists.txt 1985 modified: indra/newview/CMakeLists.txt
199 modified: indra/newview/llagent.cpp 1986 modified: indra/newview/llagent.cpp
200 modified: indra/newview/llcolorscheme.cpp 1987 modified: indra/newview/llcolorscheme.cpp
201 modified: indra/newview/llcolorscheme.h 1988 modified: indra/newview/llcolorscheme.h
202 modified: indra/newview/llfloatermap.cpp 1989 modified: indra/newview/llfloatermap.cpp
203 modified: indra/newview/llfloatermap.h 1990 modified: indra/newview/llfloatermap.h
204 modified: indra/newview/llmenucommands.cpp 1991 modified: indra/newview/llmenucommands.cpp
205 modified: indra/newview/llnetmap.cpp 1992 modified: indra/newview/llnetmap.cpp
206 modified: indra/newview/llnetmap.h 1993 modified: indra/newview/llnetmap.h
207 modified: indra/newview/llstartup.cpp 1994 modified: indra/newview/llstartup.cpp
208 modified: indra/newview/llviewercontrol.cpp 1995 modified: indra/newview/llviewercontrol.cpp
209 modified: indra/newview/llviewermenu.cpp 1996 modified: indra/newview/llviewermenu.cpp
210 modified: indra/newview/llviewerobject.cpp 1997 modified: indra/newview/llviewerobject.cpp
211 modified: indra/newview/llviewerregion.cpp 1998 modified: indra/newview/llviewerregion.cpp
212 modified: indra/newview/llviewerwindow.cpp 1999 modified: indra/newview/llviewerwindow.cpp
213 modified: indra/newview/llworldmapview.cpp 2000 modified: indra/newview/llworldmapview.cpp
214 modified: indra/newview/skins/default/colors_base.xml 2001 modified: indra/newview/skins/default/colors_base.xml
215 modified: indra/newview/skins/silver/colors_base.xml 2002 modified: indra/newview/skins/silver/colors_base.xml
2003
2004
2005 * Applied Aimee's minimap magnify patch.
2006
2007 modified: doc/contributions.txt
2008 modified: indra/newview/app_settings/settings.xml
2009 modified: indra/newview/llnetmap.cpp
2010 modified: indra/newview/llnetmap.h
2011 modified: indra/newview/llworldmapview.cpp
2012 modified: indra/newview/llworldmapview.h
2013 modified: indra/newview/skins/default/textures/textures.xml
216 2014
217 2015
2182009-06-08 McCabe Maxsted <hakushakukun@gmail.com> 20162009-06-08 McCabe Maxsted <hakushakukun@gmail.com>
219 2017
220 * Changed 'IM Received' button to '__ New IMs'. 2018 * Changed 'IM Received' button to '__ New IMs'.
221 2019
222 modified: linden/indra/newview/llfloaterchatterbox.cpp 2020 modified: linden/indra/newview/llfloaterchatterbox.cpp
223 modified: linden/indra/newview/llimview.cpp 2021 modified: linden/indra/newview/llimview.cpp
224 modified: linden/indra/newview/llimview.h 2022 modified: linden/indra/newview/llimview.h
225 modified: linden/indra/newview/lloverlaybar.cpp 2023 modified: linden/indra/newview/lloverlaybar.cpp
226 modified: linden/indra/newview/lloverlaybar.h 2024 modified: linden/indra/newview/lloverlaybar.h
227 modified: linden/indra/newview/skins/default/xui/en-us/panel_overlaybar.xml 2025 modified: linden/indra/newview/skins/default/xui/en-us/panel_overlaybar.xml
228 2026
229 2027
230 * Backported LL's version of VWR-2681 from 1.23. 2028 * Backported LL's version of VWR-2681 from 1.23.
231 2029
232 modified: indra/newview/app_settings/settings.xml 2030 modified: indra/newview/app_settings/settings.xml
233 modified: indra/newview/llfloateravatarpicker.cpp 2031 modified: indra/newview/llfloateravatarpicker.cpp
234 modified: indra/newview/llfloateravatarpicker.h 2032 modified: indra/newview/llfloateravatarpicker.h
235 modified: indra/newview/llfloatergodtools.cpp 2033 modified: indra/newview/llfloatergodtools.cpp
236 modified: indra/newview/llglsandbox.cpp 2034 modified: indra/newview/llglsandbox.cpp
237 modified: indra/newview/llnetmap.cpp 2035 modified: indra/newview/llnetmap.cpp
238 modified: indra/newview/llviewerobjectlist.cpp 2036 modified: indra/newview/llviewerobjectlist.cpp
239 modified: indra/newview/llworld.cpp 2037 modified: indra/newview/llworld.cpp
240 modified: indra/newview/llworld.h 2038 modified: indra/newview/llworld.h
241 modified: indra/newview/pipeline.cpp 2039 modified: indra/newview/pipeline.cpp
242 modified: indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml 2040 modified: indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml
243 2041
244 2042
245 * Fixed the Resident Chooser showing hair instead of calling cards. 2043 * Fixed the Resident Chooser showing hair instead of calling cards.
246 2044
247 modified: indra/newview/llfloateravatarpicker.cpp 2045 modified: indra/newview/llfloateravatarpicker.cpp
248 2046
249 2047
2502009-06-07 McCabe Maxsted <hakushakukun@gmail.com> 20482009-06-07 McCabe Maxsted <hakushakukun@gmail.com>
251 2049
252 * Fixed CopyWinLibs.CMake errors (removed vivox). 2050 * Fixed CopyWinLibs.CMake errors (removed vivox).
253 2051
254 modified: linden/indra/cmake/CopyWinLibs.cmake 2052 modified: linden/indra/cmake/CopyWinLibs.cmake
255 modified: linden/install.xml 2053 modified: linden/install.xml
256 2054
257 2055
258 * Fixed VC++ error C2864: 'LLAudioEngine_OpenAL::WIND_BUFFER_SIZE_SEC' : 2056 * Fixed VC++ error C2864: 'LLAudioEngine_OpenAL::WIND_BUFFER_SIZE_SEC' :
259 only static const integral data members can be initialized within a class. 2057 only static const integral data members can be initialized within a class.
260 2058
261 modified: linden/indra/llaudio/audioengine_openal.cpp 2059 modified: linden/indra/llaudio/audioengine_openal.cpp
262 modified: linden/indra/llaudio/audioengine_openal.h 2060 modified: linden/indra/llaudio/audioengine_openal.h
263 2061
264 2062
265 * Fixed VC++ warning C4305: '=' : truncation from 'double' to 'float' for mVolume. 2063 * Fixed VC++ warning C4305: '=' : truncation from 'double' to 'float' for mVolume.
266 2064
267 modified: linden/indra/llmedia/llmediaimplgstreamer.cpp 2065 modified: linden/indra/llmedia/llmediaimplgstreamer.cpp
268 2066
269 2067
270 * Removed bad entries from copy_win_libs. 2068 * Removed bad entries from copy_win_libs.
271 * Restored zlib1.dll (not a bad entry). 2069 * Restored zlib1.dll (not a bad entry).
272 2070
273 modified: linden/indra/cmake/CopyWinLibs.cmake 2071 modified: linden/indra/cmake/CopyWinLibs.cmake
274 2072
275 2073
276 * Removed old linden glib entry that was interfering. 2074 * Removed old linden glib entry that was interfering.
277 * Updated windows zlib archive. 2075 * Updated windows zlib archive.
278 * Updated windows iconv archive. 2076 * Updated windows iconv archive.
279 2077
280 modified: linden/install.xml 2078 modified: linden/install.xml
281 2079
282 2080
283 * Placed the gstreamer plugins in newview where they belong. 2081 * Placed the gstreamer plugins in newview where they belong.
284 2082
285 modified: linden/indra/cmake/CopyWinLibs.cmake 2083 modified: linden/indra/cmake/CopyWinLibs.cmake
286 modified: linden/install.xml 2084 modified: linden/install.xml
287 2085
288 2086
2892009-05-30 Jacek Antonelli <jacek.antonelli@gmail.com> 20872009-05-30 Jacek Antonelli <jacek.antonelli@gmail.com>
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index 94454ee..53061c0 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -4,6 +4,336 @@
4 4
5 5
6 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 6 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
7 =- 1.2.0 BETA -=
8 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
9
10
11 KNOWN ISSUES
12
13 * When you try to quit after having logged out at least once, the
14 viewer may crash (Linux & Mac) or not quit (Windows). As a
15 work-around (particularly for Windows users), we recommend not
16 using "File > Logout" until this has been fixed.
17
18 * Many new UI additions only provide English text. We'd love to
19 have some bilingual users help us translate them. If you can
20 help, please post in the forums.
21
22 * The custom chat channel number entry doesn't behave properly
23 for channel numbers longer than 6 digits. As a temporary
24 work-around until we fix this, use the old "/NUMBER" (e.g.
25 "/123456789 Hi") and "//" chat commands for chatting on large
26 channel numbers.
27
28 * The grid selection box on the login screen always defaults to
29 "secondlife" at startup, when it should default to the most
30 recently used grid.
31
32 * The grid selection box on the login screen always shows
33 "secondlife" after logging out, but behaves like it is still
34 set to the grid you logged out from.
35
36 * The minimap radar cannot be hidden yet. We're working on it.
37
38 * The Windlight Water settings window doesn't have previous/next
39 arrows like the Sky window does.
40
41 * The Windlight toolbar sometimes forgets the last selected
42 preset.
43
44 * "File > Import" and "File > Upload & Import" may not work
45 correctly for Mac users.
46
47
48 CHANGES
49
50 This version of Imprudence includes the following changes (as
51 compared to Imprudence 1.1.0).
52
53
54 VERSION HIGHLIGHTS
55
56 * Object Backup. You can now download objects that you have
57 created and have full permissions for to your computer, and
58 upload them back into the world (or another grid). Thanks to
59 the Meerkat Viewer for developing this feature, and to Armin
60 for helping us import it!
61
62 * Grid Manager. You can now modify the list of grids available
63 at the login screen. We have further plans for extending this
64 feature, but this will serve for now. Thanks to the Hippo
65 Viewer and Meerkat Viewer for this, and to Armin for helping
66 import it!
67
68 * Restrained Life support. Imprudence now provides optional
69 support for the Restrained Life API (used by BDSM items and
70 various scripted gadgets). Enable it with "Advanced >
71 Restrained Life Support". Many thanks to Kitty Barnett for
72 developing RLVa and working with us to integrate it into
73 Imprudence!
74
75 * Radar. The minimap now features a list of nearby avatars.
76 Thanks so much, McCabe and Dale Glass!
77
78 * Emerald features. We've imported a variety of features from
79 the Green Life Emerald Viewer. Thanks to the Emerald folks
80 for developing these, and McCabe for importing them!
81
82 - "Advanced > Asset Browser" (Alt-Shift-A). Visual browser
83 for textures in your inventory.
84
85 - "Advanced > Animation List". Lists the animations you are
86 playing, and allows you to selectively stop them and revoke
87 animation permissions from scripted objects.
88
89 - "Advanced > Phantom Avatar" (Ctrl-Alt-P). Prevents your
90 avatar from being pushed, but also prevents you from
91 moving.
92
93 - "Advanced > Ground Sit" (Ctrl-Alt-S). Makes your avatar sit
94 down at your current location.
95
96 - Build tool shows objects' Last (previous) Owner.
97
98 - When viewing your own profile, the Profile window indicates
99 which of your groups are hidden.
100
101 - You can now search your inventory by Creator name.
102 ("Search" menu in the Inventory window.)
103
104 - You can now double-click on a location in the 3D world to
105 teleport there.
106
107 - Added "BlockClickSit" debug setting. Set it to true to
108 prevent yourself from sitting on things when you accidently
109 click on them.
110
111 - Particle chat, which sends a message on channel 9000 when
112 you select an object, for enhanced integration with
113 scripted objects. You can disable this feature by changing
114 the "ParticleChat" setting to False in "Advanced > Debug
115 Settings".
116
117
118 BUILDING
119
120 * You can now choose which kind of grass or tree to rez.
121 Before, it always rezzed a random kind. Thanks to Mana Janus
122 for this!
123
124 * Added "Link" and "Unlink" to the pie menu for objects.
125 Thanks, McCabe!
126
127 * Added "Link" and "Unlink" buttons to the Build window.
128 Thanks, McCabe!
129
130 * Several changes to the main menus. Thanks, McCabe!
131
132 - "Edit > Duplicate" is now in the Tools menu.
133
134 - Moved the selection-related options in the Tools menu to a
135 new submenu, "Tools > Selection Options".
136
137 - The "Tools > Select Tool" submenu has been renamed to
138 "Choose Tool" to avoid confusion with the Selection
139 Options.
140
141 - "Tools > Set permissions on selected task inventory" has
142 been renamed to "Set Bulk Permissions".
143
144 * "Advanced > Rendering > Selected Texture Info" now displays
145 partial UUIDs for the textures. Thanks to Henri Beauchamp and
146 McCabe for developing this!
147
148 * Added "Tools > Selection Options > Hide Selection Outline"
149 (VWR-6918). This can help make it easier to see when editing
150 small objects, and improves performance when selecting a
151 large number of prims. Thanks a bunch, Aimee Trescothick!
152
153
154 MAP & MINIMAP
155
156 * The minimap has many improvements. Our enduring gratitude to
157 Aimee Trescothick for these!
158
159 - Enhanced zoom behavior and range.
160
161 - It can be panned with Shift-Click and drag. (Right click
162 the minimap and disable "Center on Camera" if you want to
163 stop it from moving back automatically.)
164
165 - Hovering the mouse over someone's dot on the minimap will
166 show their name in the tooltip. Right click on a dot and
167 choose "Profile" to open that person's profile window.
168
169 - Window layout converted to XUI under the hood.
170
171 * But wait — the minimap has other improvements, too. Thanks to
172 McCabe for these!
173
174 - Muted avatars are colored gray in the minimap.
175
176 - Added "Show World Map" to the minimap right-click menu.
177
178 - Moved "Rotate Mini-Map" to the minimap right-click menu.
179
180 * The World Map displays the number of avatars in each sim,
181 above the sim's name. That's pretty handy, Jacek and McCabe!
182
183
184 MISC. UI
185
186 * The Communicate window title and "IM Received" popup button
187 now show the number of unread IMs you've received. Nice work,
188 McCabe!
189
190 * The "About Land" window displays the L$/sqm cost for land for
191 sale. Thanks to Linden Lab for this feature in SL 1.23.
192
193 * The Resident chooser now has a "Near Me" tab with a list of
194 nearby people (VWR-2681). Thanks to Matthew Dowd, Vadim
195 Bigbear, and Coco Linden for developing this feature.
196
197 * Double clicking an object in your inventory wears it (or
198 detaches it, if you are already wearing it). Thanks to
199 Nicholaz Beresford and Henri Beauchamp for developing this!
200
201 * Quick access to Windlight presets and draw distance from the
202 toolbar. You can toggle this in "Preferences > Graphics >
203 Show environment control in toolbar" (a checkbox near the top
204 right corner of the window). Nice work, McCabe!
205
206 * When listening to audio streams, song info is output to your
207 chat window. You can toggle this in "Preferences > Audio &
208 Video > Show stream info in chat" (a checkbox about halfway
209 down the window). Thanks to Dale Glass for developing this
210 feature!
211
212 * IM windows inform you when the other person has gone on or
213 offline even if you have turned off "Show online Friend
214 notifications". That's pretty handy, McCabe!
215
216 * Added "View > Advanced Menu" to toggle the Advanced menu.
217 Thanks, Armin!
218
219 * The layout of the Profile window has been revamped. Thanks,
220 McCabe!
221
222 * In the Local Chat window, you can now click the name of
223 objects that IM you to view information about the object and
224 its owner. Thanks to Linden Lab for developing this in SL
225 1.23.
226
227 * The Snapshot window can now be minimized. It's the little
228 things, McCabe!
229
230 * The Windlight sky settings window now has arrow buttons for
231 quickly changing to the previous or next preset in the list.
232 Thanks, McCabe!
233
234 * "Show HUD Attachments" has been moved back to the View menu,
235 and its shortcut (Alt-Shift-H) has been restored. It was
236 moved to the Advanced menu and lost its shortcut in
237 Imprudence 1.1. Thanks to mashaeilde on the forums for giving
238 us feedback about this!
239
240 * You can now select a default channel number to chat on, for
241 interacting with scripted devices. Turn on "Preferences >
242 Text Chat > Show custom chat channel" (a checkbox near the
243 bottom of the window), then set the channel using the new
244 number entry field on the chat bar. Channel 0 is normal chat,
245 all other channels are only seen by scripts. You can still
246 chat to other channels using "/1", etc. Thanks to the Emerald
247 Viewer for the inspiration, and to McCabe for the
248 implementation!
249
250
251 OTHER
252
253 * Imprudence 1.2 has been rebased to SL 1.22.11. Previous
254 versions of Imprudence were based on SL 1.21.6. Thanks,
255 Jacek!
256
257 * Ability to logout without quitting and restarting the viewer
258 (File > Logout). Thanks to the Meerkat Viewer for this!
259
260 * Several bundled software libraries have been updated to new
261 versions:
262
263 - Gstreamer, Zlib and Iconv on Windows. Thanks, McCabe!
264
265 - OpenJPEG on Linux. Thanks, Armin!
266
267 * The login screen displays the awesome Imprudence logo while
268 the login page is still loading, instead of that smelly old
269 SL logo. Way to go, McCabe!
270
271 * Linux-style middle mouse paste on Linux viewers. Thanks,
272 Armin!
273
274 * The maximum bandwidth setting has been raised to 5000kbps,
275 and the default set to 1000kbps. Thanks, McCabe!
276
277 * Added several new windlight settings by CodeBastard Redgrave,
278 Ana Lutetia, and Torley Linden. Thanks, Codie, Ana, and
279 Torley!
280
281 * Added the adult_compliant capability, for teleport
282 compatibility with Linden Lab's adult content policy. Thanks
283 for providing a patch for this, Linden Lab!
284
285 * Added two patches (VWR-11128 and VWR-11138) to support Visual
286 Studio Express. Thanks, Robin Cornelius!
287
288
289 BUG FIXES
290
291 * "Stop All Animations" (aka "Stop Animating My Avatar") only
292 affected your own viewer; other people would still see your
293 avatar being animated (VWR-2850). Thanks to Tofu Linden for
294 fixing that in SL 1.23.
295
296 * The Resident chooser was showing hair instead of calling
297 cards. Thanks for fixing that, McCabe!
298
299 * "View > Communicate" wasn't toggling the Communicate window
300 like it was supposed to. Thanks for fixing it, McCabe!
301
302 * Small textures weren't being cached (VWR-12686). Thanks for
303 fixing that, Robin Cornelius!
304
305 * Certain malformed animations could cause the viewer to abort
306 with an assertion about the joint number. Thanks to Linden
307 Lab for fixing this in SL 1.23.
308
309 * The chat history window couldn't be minimized. Thanks,
310 McCabe!
311
312 * The Contacts window couldn't be toggled with "Edit > Friends"
313 (Ctrl-Shift-F) if it was detached from the Communicate window
314 (VWR-5370). Thanks to Latif Khalifa for making the patch to
315 fix that!
316
317 * When trying to attach multiple objects at once from your
318 inventory, it would fail with a message, "Cannot complete
319 attachment. An Attachment is pending for that spot". Many
320 thanks to Kitty Barnett for fixing that awful bug!
321
322 * Teleporting very long distances on OpenSim Hypergrid would
323 sometimes cause weird issues (SVC-2941). Thanks to Mana Janus
324 for the fix!
325
326 * Avatars would be invisible until you zoomed in on them (in SL
327 1.22). Thanks for the patch to fix this, Aleric Inglewood!
328
329 * Special symbols in group titles were appearing as question
330 marks in avatar name tags. McCabe fixed the heck outta that
331 one!
332
333
334
335
336 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
7 =- 1.1.0 -= 337 =- 1.1.0 -=
8 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 338 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
9 339
diff --git a/linden/doc/contributions.txt b/linden/doc/contributions.txt
index fae2e88..0c3fbdb 100644
--- a/linden/doc/contributions.txt
+++ b/linden/doc/contributions.txt
@@ -36,6 +36,7 @@ Aimee Trescothick
36 VWR-8482 36 VWR-8482
37 VWR-9255 37 VWR-9255
38 VWR-11844 38 VWR-11844
39 VWR-12748
39Alejandro Rosenthal 40Alejandro Rosenthal
40 VWR-1184 41 VWR-1184
41Aleric Inglewood 42Aleric Inglewood
@@ -81,6 +82,11 @@ Alissa Sabre
81 VWR-7087 82 VWR-7087
82 VWR-7153 83 VWR-7153
83 VWR-7168 84 VWR-7168
85<<<<<<< HEAD
86=======
87 VWR-7087
88 VWR-7086
89>>>>>>> origin/next
84 VWR-9190 90 VWR-9190
85 VWR-10728 91 VWR-10728
86Angus Boyd 92Angus Boyd
@@ -89,6 +95,8 @@ Ann Congrejo
89 CT-193 95 CT-193
90Argent Stonecutter 96Argent Stonecutter
91 VWR-68 97 VWR-68
98Armin Weatherwax
99 VWR-8436
92Asuka Neely 100Asuka Neely
93 VWR-3434 101 VWR-3434
94 VWR-8179 102 VWR-8179
diff --git a/linden/indra/cmake/00-Common.cmake b/linden/indra/cmake/00-Common.cmake
index e867df8..a0bb951 100644
--- a/linden/indra/cmake/00-Common.cmake
+++ b/linden/indra/cmake/00-Common.cmake
@@ -31,9 +31,15 @@ if (WINDOWS)
31 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO 31 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
32 "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD" 32 "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD"
33 CACHE STRING "C++ compiler release-with-debug options" FORCE) 33 CACHE STRING "C++ compiler release-with-debug options" FORCE)
34 set(CMAKE_CXX_FLAGS_RELEASE 34 if (MSVC80)
35 set(CMAKE_CXX_FLAGS_RELEASE
36 "${CMAKE_CXX_FLAGS_RELEASE} /O2 /Ob2 /Oi /Ot /GT /Zi /MT"
37 CACHE STRING "C++ compiler release options" FORCE)
38 else (MSVC80)
39 set(CMAKE_CXX_FLAGS_RELEASE
35 "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD" 40 "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD"
36 CACHE STRING "C++ compiler release options" FORCE) 41 CACHE STRING "C++ compiler release options" FORCE)
42 endif (MSVC80)
37 43
38 set(CMAKE_CXX_STANDARD_LIBRARIES "") 44 set(CMAKE_CXX_STANDARD_LIBRARIES "")
39 set(CMAKE_C_STANDARD_LIBRARIES "") 45 set(CMAKE_C_STANDARD_LIBRARIES "")
@@ -60,21 +66,6 @@ if (WINDOWS)
60 /Zc:wchar_t- 66 /Zc:wchar_t-
61 ) 67 )
62 endif (MSVC80 OR MSVC90) 68 endif (MSVC80 OR MSVC90)
63
64 # VS optimization flags
65 if(MSVC80)
66
67 set(NUMBER_OF_CORES $ENV{NUMBER_OF_PROCESSORS})
68
69 set(CMAKE_CXX_FLAGS_RELEASE
70 "${CMAKE_CXX_FLAGS_RELEASE} /Ob2 /Oi /Ot /GT"
71 CACHE STRING "C++ compiler release options" FORCE)
72
73 add_definitions(
74 /MP${NUMBER_OF_CORES}
75 )
76
77 endif (MSVC80)
78 69
79 # Are we using the crummy Visual Studio KDU build workaround? 70 # Are we using the crummy Visual Studio KDU build workaround?
80 if (NOT VS_DISABLE_FATAL_WARNINGS) 71 if (NOT VS_DISABLE_FATAL_WARNINGS)
diff --git a/linden/indra/cmake/CopyWinLibs.cmake b/linden/indra/cmake/CopyWinLibs.cmake
index e10b0da..3adba60 100644
--- a/linden/indra/cmake/CopyWinLibs.cmake
+++ b/linden/indra/cmake/CopyWinLibs.cmake
@@ -26,6 +26,7 @@ set(debug_files
26 windbgdlg.exe 26 windbgdlg.exe
27 iconv.dll 27 iconv.dll
28 libxml2.dll 28 libxml2.dll
29 libcairo-2.dll
29 libgio-2.0-0.dll 30 libgio-2.0-0.dll
30 libglib-2.0-0.dll 31 libglib-2.0-0.dll
31 libgmodule-2.0-0.dll 32 libgmodule-2.0-0.dll
@@ -55,6 +56,8 @@ set(debug_files
55 libgstsdp.dll 56 libgstsdp.dll
56 libgsttag.dll 57 libgsttag.dll
57 libgstvideo.dll 58 libgstvideo.dll
59 libjpeg.dll
60 libmp3lame-0.dll
58 libneon-27.dll 61 libneon-27.dll
59 libogg-0.dll 62 libogg-0.dll
60 liboil-0.3-0.dll 63 liboil-0.3-0.dll
@@ -66,6 +69,7 @@ set(debug_files
66 libvorbis-0.dll 69 libvorbis-0.dll
67 libvorbisenc-2.dll 70 libvorbisenc-2.dll
68 libxml2-2.dll 71 libxml2-2.dll
72 glew32.dll
69 xvidcore.dll 73 xvidcore.dll
70 zlib1.dll 74 zlib1.dll
71 ) 75 )
@@ -97,6 +101,7 @@ set(release_files
97 xul.dll 101 xul.dll
98 iconv.dll 102 iconv.dll
99 libxml2.dll 103 libxml2.dll
104 libcairo-2.dll
100 libgio-2.0-0.dll 105 libgio-2.0-0.dll
101 libglib-2.0-0.dll 106 libglib-2.0-0.dll
102 libgmodule-2.0-0.dll 107 libgmodule-2.0-0.dll
@@ -126,6 +131,8 @@ set(release_files
126 libgstsdp.dll 131 libgstsdp.dll
127 libgsttag.dll 132 libgsttag.dll
128 libgstvideo.dll 133 libgstvideo.dll
134 libjpeg.dll
135 libmp3lame-0.dll
129 libneon-27.dll 136 libneon-27.dll
130 libogg-0.dll 137 libogg-0.dll
131 liboil-0.3-0.dll 138 liboil-0.3-0.dll
@@ -137,6 +144,7 @@ set(release_files
137 libvorbis-0.dll 144 libvorbis-0.dll
138 libvorbisenc-2.dll 145 libvorbisenc-2.dll
139 libxml2-2.dll 146 libxml2-2.dll
147 glew32.dll
140 xvidcore.dll 148 xvidcore.dll
141 zlib1.dll 149 zlib1.dll
142 ) 150 )
diff --git a/linden/indra/cmake/GStreamer.cmake b/linden/indra/cmake/GStreamer.cmake
index 880233e..51e1550 100644
--- a/linden/indra/cmake/GStreamer.cmake
+++ b/linden/indra/cmake/GStreamer.cmake
@@ -1,17 +1,19 @@
1# -*- cmake -*- 1# -*- cmake -*-
2include(Prebuilt) 2include(Prebuilt)
3 3
4 # possible libxml should have its own .cmake file instead 4 # Maybe libxml and glib should have their own .cmake files
5 use_prebuilt_binary(libxml) 5 use_prebuilt_binary(libxml)
6 use_prebuilt_binary(glib)
7
6 set(GSTREAMER_FOUND ON FORCE BOOL) 8 set(GSTREAMER_FOUND ON FORCE BOOL)
7 set(GSTREAMER_PLUGINS_BASE_FOUND ON FORCE BOOL) 9 set(GSTREAMER_PLUGINS_BASE_FOUND ON FORCE BOOL)
10
8 use_prebuilt_binary(gstreamer) 11 use_prebuilt_binary(gstreamer)
12 use_prebuilt_binary(gstreamer-plugins)
9 13
10if (WINDOWS) 14if (WINDOWS)
11 15
12 use_prebuilt_binary(libxml)
13 use_prebuilt_binary(iconv) 16 use_prebuilt_binary(iconv)
14 use_prebuilt_binary(gstreamer-plugins)
15 set(GSTREAMER_FOUND ON FORCE BOOL) 17 set(GSTREAMER_FOUND ON FORCE BOOL)
16 set(GSTREAMER_INCLUDE_DIRS 18 set(GSTREAMER_INCLUDE_DIRS
17 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib 19 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib
@@ -28,23 +30,23 @@ if (WINDOWS)
28 gmodule-2.0 30 gmodule-2.0
29 gobject-2.0 31 gobject-2.0
30 gthread-2.0 32 gthread-2.0
31 libgstvideo-0.10 33 libgstvideo.lib
32 libgsttag-0.10 34 libgsttag.lib
33 libgstsdp-0.10 35 libgstsdp.lib
34 libgstrtsp-0.10 36 libgstrtsp.lib
35 libgstrtp-0.10 37 libgstrtp.lib
36 libgstriff-0.10 38 libgstriff.lib
37 libgstreamer-0.10 39 libgstreamer-0.10.lib
38 libgstpbutils-0.10 40 libgstpbutils.lib
39 libgstnetbuffer-0.10 41 libgstnetbuffer.lib
40 libgstnet-0.10 42 libgstnet-0.10.lib
41 libgstinterfaces-0.10 43 libgstinterfaces.lib
42 libgstdshow-0.10 44 libgstdshow.lib
43 libgstdataprotocol-0.10 45 libgstdataprotocol-0.10.lib
44 libgstcontroller-0.10 46 libgstcontroller-0.10.lib
45 libgstbase-0.10 47 libgstbase-0.10.lib
46 libgstaudio-0.10 48 libgstaudio.lib
47 libgstapp-0.10 49 libgstapp.lib
48 libxml2 50 libxml2
49 libxml2_a 51 libxml2_a
50 libxml2_a_dll 52 libxml2_a_dll
@@ -62,7 +64,7 @@ else (WINDOWS)
62 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/libxml2 64 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/libxml2
63 ) 65 )
64 66
65 if (DARWIN) 67 if (DARWIN) # Mac
66 68
67 find_library( XML2_LIB 69 find_library( XML2_LIB
68 NAMES xml2.2 70 NAMES xml2.2
@@ -88,7 +90,9 @@ else (WINDOWS)
88 ${XML2_LIB} 90 ${XML2_LIB}
89 ) 91 )
90 92
91 else (DARWIN) 93 else (DARWIN) # Linux
94
95 use_prebuilt_binary(theora)
92 96
93 set(GSTREAMER_LIBRARIES 97 set(GSTREAMER_LIBRARIES
94 gstvideo-0.10 98 gstvideo-0.10
diff --git a/linden/indra/cmake/OPENAL.cmake b/linden/indra/cmake/OPENAL.cmake
index 94fa75d..ad26d4c 100644
--- a/linden/indra/cmake/OPENAL.cmake
+++ b/linden/indra/cmake/OPENAL.cmake
@@ -11,7 +11,8 @@ if (OPENAL)
11 # message(STATUS "Building with OpenAL audio support") 11 # message(STATUS "Building with OpenAL audio support")
12 12
13 # OPENAL_LIB 13 # OPENAL_LIB
14 14 use_prebuilt_binary(openal)
15
15 if (WINDOWS) 16 if (WINDOWS)
16 find_library(OPENAL_LIB 17 find_library(OPENAL_LIB
17 NAMES openal32 18 NAMES openal32
diff --git a/linden/indra/cmake/Python.cmake b/linden/indra/cmake/Python.cmake
index 4f86d32..0901c1b 100644
--- a/linden/indra/cmake/Python.cmake
+++ b/linden/indra/cmake/Python.cmake
@@ -13,6 +13,10 @@ if (WINDOWS)
13 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] 13 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
14 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] 14 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
15 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] 15 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath]
16 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath]
17 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
18 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
19 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath]
16 ) 20 )
17elseif (EXISTS /etc/debian_version) 21elseif (EXISTS /etc/debian_version)
18 # On Debian and Ubuntu, avoid Python 2.4 if possible. 22 # On Debian and Ubuntu, avoid Python 2.4 if possible.
diff --git a/linden/indra/cmake/UI.cmake b/linden/indra/cmake/UI.cmake
index f529f5b..b70a531 100644
--- a/linden/indra/cmake/UI.cmake
+++ b/linden/indra/cmake/UI.cmake
@@ -31,13 +31,13 @@ if (STANDALONE)
31 add_definitions(${${pkg}_CFLAGS_OTHERS}) 31 add_definitions(${${pkg}_CFLAGS_OTHERS})
32 endforeach(pkg) 32 endforeach(pkg)
33else (STANDALONE) 33else (STANDALONE)
34 use_prebuilt_binary(gtk-atk-pango-glib) 34 use_prebuilt_binary(gtk-etc)
35 if (LINUX) 35 if (LINUX)
36 set(UI_LIBRARIES 36 set(UI_LIBRARIES
37 atk-1.0 37 atk-1.0
38 cairo
38 gdk-x11-2.0 39 gdk-x11-2.0
39 gdk_pixbuf-2.0 40 gdk_pixbuf-2.0
40 Xinerama
41 glib-2.0 41 glib-2.0
42 gmodule-2.0 42 gmodule-2.0
43 gobject-2.0 43 gobject-2.0
@@ -47,11 +47,14 @@ else (STANDALONE)
47 pangoft2-1.0 47 pangoft2-1.0
48 pangox-1.0 48 pangox-1.0
49 pangoxft-1.0 49 pangoxft-1.0
50 pixman-1
50 ) 51 )
51 endif (LINUX) 52 endif (LINUX)
52 53
53 include_directories ( 54 include_directories (
54 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include 55 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include
56 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/cairo
57 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/pixman-1
55 ${LIBS_PREBUILT_DIR}/include 58 ${LIBS_PREBUILT_DIR}/include
56 ) 59 )
57 foreach(include ${${LL_ARCH}_INCLUDES}) 60 foreach(include ${${LL_ARCH}_INCLUDES})
diff --git a/linden/indra/develop.py b/linden/indra/develop.py
index 370a008..6388592 100755
--- a/linden/indra/develop.py
+++ b/linden/indra/develop.py
@@ -482,8 +482,15 @@ class WindowsSetup(PlatformSetup):
482 print 'Building with ', self.gens[version]['gen'] 482 print 'Building with ', self.gens[version]['gen']
483 break 483 break
484 else: 484 else:
485 print >> sys.stderr, 'Cannot find a Visual Studio installation!' 485 print >> sys.stderr, 'Cannot find a Visual Studio installation, testing for express editions'
486 eys.exit(1) 486 for version in 'vc80 vc90 vc71'.split():
487 if self.find_visual_studio_express(version):
488 self._generator = version
489 print 'Building with ', self.gens[version]['gen'] , "Express edition"
490 break
491 else:
492 print >> sys.stderr, 'Cannot find any Visual Studio installation'
493 eys.exit(1)
487 return self._generator 494 return self._generator
488 495
489 def _set_generator(self, gen): 496 def _set_generator(self, gen):
@@ -536,6 +543,28 @@ class WindowsSetup(PlatformSetup):
536 print >> sys.stderr, "Didn't find ", self.gens[gen]['gen'] 543 print >> sys.stderr, "Didn't find ", self.gens[gen]['gen']
537 return '' 544 return ''
538 545
546 def find_visual_studio_express(self, gen=None):
547 if gen is None:
548 gen = self._generator
549 gen = gen.lower()
550 try:
551 import _winreg
552 key_str = (r'SOFTWARE\Microsoft\VCExpress\%s\Setup\VC' %
553 self.gens[gen]['ver'])
554 value_str = (r'ProductDir')
555 print ('Reading VS environment from HKEY_LOCAL_MACHINE\%s\%s' %
556 (key_str, value_str))
557 print key_str
558
559 reg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
560 key = _winreg.OpenKey(reg, key_str)
561 value = _winreg.QueryValueEx(key, value_str)[0]+"IDE"
562 print 'Found: %s' % value
563 return value
564 except WindowsError, err:
565 print >> sys.stderr, "Didn't find ", self.gens[gen]['gen']
566 return ''
567
539 def get_build_cmd(self): 568 def get_build_cmd(self):
540 if self.incredibuild: 569 if self.incredibuild:
541 config = self.build_type 570 config = self.build_type
@@ -543,10 +572,23 @@ class WindowsSetup(PlatformSetup):
543 config = '\"%s|Win32\"' % config 572 config = '\"%s|Win32\"' % config
544 573
545 return "buildconsole %s.sln /build %s" % (self.project_name, config) 574 return "buildconsole %s.sln /build %s" % (self.project_name, config)
575
576 environment = self.find_visual_studio()
577 if environment == '':
578 environment = self.find_visual_studio_express()
579 if environment == '':
580 print >> sys.stderr, "Something went very wrong during build stage, could not find a Visual Studio?"
581 else:
582 print >> sys.stderr, "\nSolution generation complete, as you are using an express edition the final\n stages will need to be completed by hand"
583 build_dirs=self.build_dirs();
584 print >> sys.stderr, "Solution can now be found in:", build_dirs[0]
585 print >> sys.stderr, "Set %s as startup project" % self.project_name
586 print >> sys.stderr, "Set build target is Release or RelWithDbgInfo"
587 exit(0)
546 588
547 # devenv.com is CLI friendly, devenv.exe... not so much. 589 # devenv.com is CLI friendly, devenv.exe... not so much.
548 return ('"%sdevenv.com" %s.sln /build %s' % 590 return ('"%sdevenv.com" %s.sln /build %s' %
549 (self.find_visual_studio(), self.project_name, self.build_type)) 591 (environment, self.project_name, self.build_type))
550 592
551 def run(self, command, name=None): 593 def run(self, command, name=None):
552 '''Run a program. If the program fails, raise an exception.''' 594 '''Run a program. If the program fails, raise an exception.'''
diff --git a/linden/indra/lib/python/indra/base/lluuid.py b/linden/indra/lib/python/indra/base/lluuid.py
index aceea29..40ce818 100644
--- a/linden/indra/lib/python/indra/base/lluuid.py
+++ b/linden/indra/lib/python/indra/base/lluuid.py
@@ -26,7 +26,8 @@ THE SOFTWARE.
26$/LicenseInfo$ 26$/LicenseInfo$
27""" 27"""
28 28
29import md5, random, socket, string, time, re 29import random, socket, string, time, re
30from hashlib import md5
30import uuid 31import uuid
31 32
32def _int2binstr(i,l): 33def _int2binstr(i,l):
@@ -196,7 +197,7 @@ class UUID(object):
196 from c++ implementation for portability reasons. 197 from c++ implementation for portability reasons.
197 Returns self. 198 Returns self.
198 """ 199 """
199 m = md5.new() 200 m = md5()
200 m.update(uuid.uuid1().bytes) 201 m.update(uuid.uuid1().bytes)
201 self._bits = m.digest() 202 self._bits = m.digest()
202 return self 203 return self
diff --git a/linden/indra/lib/python/indra/ipc/llmessage.py b/linden/indra/lib/python/indra/ipc/llmessage.py
index 6161bad..91fb36b 100644
--- a/linden/indra/lib/python/indra/ipc/llmessage.py
+++ b/linden/indra/lib/python/indra/ipc/llmessage.py
@@ -26,8 +26,6 @@ THE SOFTWARE.
26$/LicenseInfo$ 26$/LicenseInfo$
27""" 27"""
28 28
29from sets import Set, ImmutableSet
30
31from compatibility import Incompatible, Older, Newer, Same 29from compatibility import Incompatible, Older, Newer, Same
32from tokenstream import TokenStream 30from tokenstream import TokenStream
33 31
@@ -44,8 +42,8 @@ class Template:
44 42
45 def compatibleWithBase(self, base): 43 def compatibleWithBase(self, base):
46 messagenames = ( 44 messagenames = (
47 ImmutableSet(self.messages.keys()) 45 frozenset(self.messages.keys())
48 | ImmutableSet(base.messages.keys()) 46 | frozenset(base.messages.keys())
49 ) 47 )
50 48
51 compatibility = Same() 49 compatibility = Same()
diff --git a/linden/indra/llaudio/audioengine.h b/linden/indra/llaudio/audioengine.h
index 5c8333c..574ed95 100644
--- a/linden/indra/llaudio/audioengine.h
+++ b/linden/indra/llaudio/audioengine.h
@@ -183,6 +183,8 @@ public:
183 static void assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status); 183 static void assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status);
184 184
185 friend class LLPipeline; // For debugging 185 friend class LLPipeline; // For debugging
186
187 LLMediaBase * getStreamMedia() { return mInternetStreamMedia; }
186public: 188public:
187 F32 mMaxWindGain; // Hack. Public to set before fade in? 189 F32 mMaxWindGain; // Hack. Public to set before fade in?
188 190
diff --git a/linden/indra/llcommon/llchat.h b/linden/indra/llcommon/llchat.h
index 7b010d6..6f9b8c4 100644
--- a/linden/indra/llcommon/llchat.h
+++ b/linden/indra/llcommon/llchat.h
@@ -43,7 +43,8 @@ typedef enum e_chat_source_type
43{ 43{
44 CHAT_SOURCE_SYSTEM = 0, 44 CHAT_SOURCE_SYSTEM = 0,
45 CHAT_SOURCE_AGENT = 1, 45 CHAT_SOURCE_AGENT = 1,
46 CHAT_SOURCE_OBJECT = 2 46 CHAT_SOURCE_OBJECT = 2,
47 CHAT_SOURCE_OBJECT_IM = 3
47} EChatSourceType; 48} EChatSourceType;
48 49
49typedef enum e_chat_type 50typedef enum e_chat_type
@@ -73,6 +74,10 @@ public:
73 : mText(text), 74 : mText(text),
74 mFromName(), 75 mFromName(),
75 mFromID(), 76 mFromID(),
77// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
78 mRlvLocFiltered(FALSE),
79 mRlvNamesFiltered(FALSE),
80// [/RLVa:KB]
76 mSourceType(CHAT_SOURCE_AGENT), 81 mSourceType(CHAT_SOURCE_AGENT),
77 mChatType(CHAT_TYPE_NORMAL), 82 mChatType(CHAT_TYPE_NORMAL),
78 mAudible(CHAT_AUDIBLE_FULLY), 83 mAudible(CHAT_AUDIBLE_FULLY),
@@ -81,10 +86,14 @@ public:
81 mPosAgent(), 86 mPosAgent(),
82 mURL() 87 mURL()
83 { } 88 { }
84 89
85 std::string mText; // UTF-8 line of text 90 std::string mText; // UTF-8 line of text
86 std::string mFromName; // agent or object name 91 std::string mFromName; // agent or object name
87 LLUUID mFromID; // agent id or object id 92 LLUUID mFromID; // agent id or object id
93// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
94 BOOL mRlvLocFiltered;
95 BOOL mRlvNamesFiltered;
96// [/RLVa:KB]
88 EChatSourceType mSourceType; 97 EChatSourceType mSourceType;
89 EChatType mChatType; 98 EChatType mChatType;
90 EChatAudible mAudible; 99 EChatAudible mAudible;
diff --git a/linden/indra/llcommon/llstring.h b/linden/indra/llcommon/llstring.h
index 99a9b9e..7db62bc 100644
--- a/linden/indra/llcommon/llstring.h
+++ b/linden/indra/llcommon/llstring.h
@@ -39,6 +39,7 @@
39#include <wctype.h> 39#include <wctype.h>
40#include <wchar.h> 40#include <wchar.h>
41#endif 41#endif
42#include "linden_common.h"
42 43
43#include <string.h> 44#include <string.h>
44 45
diff --git a/linden/indra/llcommon/llversionviewer.h b/linden/indra/llcommon/llversionviewer.h
index 826111f..bf08879 100644
--- a/linden/indra/llcommon/llversionviewer.h
+++ b/linden/indra/llcommon/llversionviewer.h
@@ -44,8 +44,8 @@ const char * const LL_VIEWER_NAME = "Second Life";
44const char * const IMP_VIEWER_NAME = "Imprudence"; 44const char * const IMP_VIEWER_NAME = "Imprudence";
45 45
46const S32 IMP_VERSION_MAJOR = 1; 46const S32 IMP_VERSION_MAJOR = 1;
47const S32 IMP_VERSION_MINOR = 1; 47const S32 IMP_VERSION_MINOR = 2;
48const S32 IMP_VERSION_PATCH = 0; 48const S32 IMP_VERSION_PATCH = 0;
49const char * const IMP_VERSION_TEST = ""; 49const char * const IMP_VERSION_TEST = "beta 2";
50 50
51#endif 51#endif
diff --git a/linden/indra/llmath/llvolume.cpp b/linden/indra/llmath/llvolume.cpp
index 1250f53..a1cfe1d 100644
--- a/linden/indra/llmath/llvolume.cpp
+++ b/linden/indra/llmath/llvolume.cpp
@@ -2208,10 +2208,16 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
2208 S32 requested_sizeS = 0; 2208 S32 requested_sizeS = 0;
2209 S32 requested_sizeT = 0; 2209 S32 requested_sizeT = 0;
2210 2210
2211 sculpt_calc_mesh_resolution(sculpt_width, sculpt_height, sculpt_type, mDetail, requested_sizeS, requested_sizeT); 2211 // create oblong sculpties with high LOD always
2212 F32 sculpt_detail = mDetail;
2213 if (sculpt_width != sculpt_height && sculpt_detail < 4.0)
2214 {
2215 sculpt_detail = 4.0;
2216 }
2217 sculpt_calc_mesh_resolution(sculpt_width, sculpt_height, sculpt_type, sculpt_detail, requested_sizeS, requested_sizeT);
2212 2218
2213 mPathp->generate(mParams.getPathParams(), mDetail, 0, TRUE, requested_sizeS); 2219 mPathp->generate(mParams.getPathParams(), sculpt_detail, 0, TRUE, requested_sizeS);
2214 mProfilep->generate(mParams.getProfileParams(), mPathp->isOpen(), mDetail, 0, TRUE, requested_sizeT); 2220 mProfilep->generate(mParams.getProfileParams(), mPathp->isOpen(), sculpt_detail, 0, TRUE, requested_sizeT);
2215 2221
2216 S32 sizeS = mPathp->mPath.size(); // we requested a specific size, now see what we really got 2222 S32 sizeS = mPathp->mPath.size(); // we requested a specific size, now see what we really got
2217 S32 sizeT = mProfilep->mProfile.size(); // we requested a specific size, now see what we really got 2223 S32 sizeT = mProfilep->mProfile.size(); // we requested a specific size, now see what we really got
diff --git a/linden/indra/llmath/xform.h b/linden/indra/llmath/xform.h
index d3be28f..7055a87 100644
--- a/linden/indra/llmath/xform.h
+++ b/linden/indra/llmath/xform.h
@@ -38,7 +38,7 @@
38 38
39const F32 MAX_OBJECT_Z = 4096.f; // should match REGION_HEIGHT_METERS, Pre-havok4: 768.f 39const F32 MAX_OBJECT_Z = 4096.f; // should match REGION_HEIGHT_METERS, Pre-havok4: 768.f
40const F32 MIN_OBJECT_Z = -256.f; 40const F32 MIN_OBJECT_Z = -256.f;
41const F32 DEFAULT_MAX_PRIM_SCALE = 10.f; 41//const F32 DEFAULT_MAX_PRIM_SCALE = 10.f; set in llmanipscale.cpp now
42const F32 MIN_PRIM_SCALE = 0.01f; 42const F32 MIN_PRIM_SCALE = 0.01f;
43const F32 MAX_PRIM_SCALE = 65536.f; // something very high but not near FLT_MAX 43const F32 MAX_PRIM_SCALE = 65536.f; // something very high but not near FLT_MAX
44 44
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp
index d1bab29..a9e0004 100644
--- a/linden/indra/llmedia/llmediaimplgstreamer.cpp
+++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp
@@ -89,6 +89,7 @@ LLMediaImplGStreamer () :
89 mPump ( NULL ), 89 mPump ( NULL ),
90 mPlaybin ( NULL ), 90 mPlaybin ( NULL ),
91 mVideoSink ( NULL ), 91 mVideoSink ( NULL ),
92 mLastTitle ( "" ),
92 mState( GST_STATE_NULL ), 93 mState( GST_STATE_NULL ),
93 mPlayThread ( NULL ) 94 mPlayThread ( NULL )
94{ 95{
@@ -470,6 +471,8 @@ gboolean LLMediaImplGStreamer::bus_callback(GstBus *bus, GstMessage *message, gp
470 case GST_STATE_PAUSED: 471 case GST_STATE_PAUSED:
471 break; 472 break;
472 case GST_STATE_PLAYING: 473 case GST_STATE_PLAYING:
474 //impl->mLastTitle = "";
475
473 LLMediaEvent event( impl, 100 ); 476 LLMediaEvent event( impl, 100 );
474 impl->getEventEmitter().update( &LLMediaObserver::onUpdateProgress, event ); 477 impl->getEventEmitter().update( &LLMediaObserver::onUpdateProgress, event );
475 // emit an event to say that a media source was loaded 478 // emit an event to say that a media source was loaded
@@ -521,18 +524,28 @@ gboolean LLMediaImplGStreamer::bus_callback(GstBus *bus, GstMessage *message, gp
521 } 524 }
522 case GST_MESSAGE_TAG: 525 case GST_MESSAGE_TAG:
523 { 526 {
524 GstTagList *tag_list; 527 GstTagList *new_tags;
525 gchar *title; 528
526 gchar *artist; 529 gst_message_parse_tag( message, &new_tags );
527 gst_message_parse_tag(message, &tag_list); 530
528 gboolean hazTitle = gst_tag_list_get_string(tag_list, 531 gchar *title;
529 GST_TAG_TITLE, &title); 532
530 gboolean hazArtist = gst_tag_list_get_string(tag_list, 533 if ( gst_tag_list_get_string(new_tags, GST_TAG_TITLE, &title) )
531 GST_TAG_ARTIST, &artist); 534 {
532 if(hazTitle) 535 LL_INFOS("MediaInfo") << "Title: " << title << LL_ENDL;
533 LL_INFOS("MediaInfo") << "Title: " << title << LL_ENDL; 536 std::string newtitle(title);
534 if(hazArtist) 537 gst_tag_list_free(new_tags);
535 LL_INFOS("MediaInfo") << "Artist: " << artist << LL_ENDL; 538
539 if ( newtitle != impl->mLastTitle && newtitle != "" )
540 {
541 impl->mLastTitle = newtitle;
542 LLMediaEvent event( impl, impl->mLastTitle );
543 impl->getEventEmitter().update( &LLMediaObserver::onMediaTitleChange, event );
544 }
545
546 g_free(title);
547 }
548
536 break; 549 break;
537 } 550 }
538 case GST_MESSAGE_EOS: 551 case GST_MESSAGE_EOS:
@@ -551,10 +564,10 @@ gboolean LLMediaImplGStreamer::bus_callback(GstBus *bus, GstMessage *message, gp
551 impl->addCommand(LLMediaBase::COMMAND_STOP); 564 impl->addCommand(LLMediaBase::COMMAND_STOP);
552 } 565 }
553 break; 566 break;
567 }
554 default: 568 default:
555 /* unhandled message */ 569 /* unhandled message */
556 break; 570 break;
557 }
558 } 571 }
559 /* we want to be notified again the next time there is a message 572 /* we want to be notified again the next time there is a message
560 * on the bus, so return true (false means we want to stop watching 573 * on the bus, so return true (false means we want to stop watching
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.h b/linden/indra/llmedia/llmediaimplgstreamer.h
index baefdaf..8d2e756 100644
--- a/linden/indra/llmedia/llmediaimplgstreamer.h
+++ b/linden/indra/llmedia/llmediaimplgstreamer.h
@@ -40,12 +40,13 @@
40///#if LL_GSTREAMER_ENABLED 40///#if LL_GSTREAMER_ENABLED
41 41
42extern "C" { 42extern "C" {
43#include <stdio.h>
44#include <gst/gst.h> 43#include <gst/gst.h>
44}
45 45
46#include <stdio.h>
46#include "apr_pools.h" 47#include "apr_pools.h"
47#include "apr_dso.h" 48#include "apr_dso.h"
48} 49
49 50
50#include "llmediaimplgstreamervidplug.h" 51#include "llmediaimplgstreamervidplug.h"
51#include "llgstplaythread.h" 52#include "llgstplaythread.h"
@@ -127,6 +128,7 @@ class LLMediaImplGStreamer:
127 GMainLoop *mPump; // event pump for this media 128 GMainLoop *mPump; // event pump for this media
128 GstElement *mPlaybin; 129 GstElement *mPlaybin;
129 GstSLVideo *mVideoSink; 130 GstSLVideo *mVideoSink;
131 std::string mLastTitle;
130 GstState mState; 132 GstState mState;
131 GstState getState() const { return mState; } 133 GstState getState() const { return mState; }
132 134
diff --git a/linden/indra/llmedia/llmediaobserver.h b/linden/indra/llmedia/llmediaobserver.h
index 5f794bb..ab8d755 100644
--- a/linden/indra/llmedia/llmediaobserver.h
+++ b/linden/indra/llmedia/llmediaobserver.h
@@ -103,6 +103,7 @@ class LLMediaObserver
103 virtual void onMediaSizeChange( const EventType& event_in ) { } 103 virtual void onMediaSizeChange( const EventType& event_in ) { }
104 virtual void onMediaContentsChange( const EventType& event_in ) { } 104 virtual void onMediaContentsChange( const EventType& event_in ) { }
105 virtual void onMediaStatusTextChange( const EventType& event_in ) { } 105 virtual void onMediaStatusTextChange( const EventType& event_in ) { }
106 virtual void onMediaTitleChange( const EventType &event_in ) { }
106 virtual void onNavigateBegin( const EventType& event_in ) { } 107 virtual void onNavigateBegin( const EventType& event_in ) { }
107 virtual void onNavigateComplete( const EventType& event_in ) { } 108 virtual void onNavigateComplete( const EventType& event_in ) { }
108 virtual void onUpdateProgress( const EventType& event_in ) { } 109 virtual void onUpdateProgress( const EventType& event_in ) { }
diff --git a/linden/indra/llui/llclipboard.cpp b/linden/indra/llui/llclipboard.cpp
index 8a7a214..2cb8197 100644
--- a/linden/indra/llui/llclipboard.cpp
+++ b/linden/indra/llui/llclipboard.cpp
@@ -93,3 +93,44 @@ BOOL LLClipboard::canPasteString() const
93{ 93{
94 return LLView::getWindow()->isClipboardTextAvailable(); 94 return LLView::getWindow()->isClipboardTextAvailable();
95} 95}
96
97
98void LLClipboard::copyFromPrimarySubstring(const LLWString &src, S32 pos, S32 len, const LLUUID& source_id )
99{
100 mSourceID = source_id;
101 mString = src.substr(pos, len);
102 LLView::getWindow()->copyTextToPrimary( mString );
103}
104
105
106const LLWString& LLClipboard::getPastePrimaryWString( LLUUID* source_id )
107{
108 if( mSourceID.notNull() )
109 {
110 LLWString temp_string;
111 LLView::getWindow()->pasteTextFromPrimary(temp_string);
112
113 if( temp_string != mString )
114 {
115 mSourceID.setNull();
116 mString = temp_string;
117 }
118 }
119 else
120 {
121 LLView::getWindow()->pasteTextFromPrimary(mString);
122 }
123
124 if( source_id )
125 {
126 *source_id = mSourceID;
127 }
128
129 return mString;
130}
131
132
133BOOL LLClipboard::canPastePrimaryString() const
134{
135 return LLView::getWindow()->isPrimaryTextAvailable();
136}
diff --git a/linden/indra/llui/llclipboard.h b/linden/indra/llui/llclipboard.h
index 37ed1ff..034a7a6 100644
--- a/linden/indra/llui/llclipboard.h
+++ b/linden/indra/llui/llclipboard.h
@@ -44,10 +44,19 @@ public:
44 LLClipboard(); 44 LLClipboard();
45 ~LLClipboard(); 45 ~LLClipboard();
46 46
47 /* We support two flavors of clipboard. The default is the explicitly
48 copy-and-pasted clipboard. The second is the so-called 'primary' clipboard
49 which is implicitly copied upon selection on platforms which expect this
50 (i.e. X11/Linux). */
51
47 void copyFromSubstring(const LLWString &copy_from, S32 pos, S32 len, const LLUUID& source_id = LLUUID::null ); 52 void copyFromSubstring(const LLWString &copy_from, S32 pos, S32 len, const LLUUID& source_id = LLUUID::null );
48 BOOL canPasteString() const; 53 BOOL canPasteString() const;
49 const LLWString& getPasteWString(LLUUID* source_id = NULL); 54 const LLWString& getPasteWString(LLUUID* source_id = NULL);
50 55
56 void copyFromPrimarySubstring(const LLWString &copy_from, S32 pos, S32 len, const LLUUID& source_id = LLUUID::null );
57 BOOL canPastePrimaryString() const;
58 const LLWString& getPastePrimaryWString(LLUUID* source_id = NULL);
59
51private: 60private:
52 LLUUID mSourceID; 61 LLUUID mSourceID;
53 LLWString mString; 62 LLWString mString;
diff --git a/linden/indra/llui/llfloater.cpp b/linden/indra/llui/llfloater.cpp
index 94af186..defe200 100644
--- a/linden/indra/llui/llfloater.cpp
+++ b/linden/indra/llui/llfloater.cpp
@@ -1193,6 +1193,12 @@ BOOL LLFloater::handleRightMouseDown(S32 x, S32 y, MASK mask)
1193 return was_minimized || LLPanel::handleRightMouseDown( x, y, mask ); 1193 return was_minimized || LLPanel::handleRightMouseDown( x, y, mask );
1194} 1194}
1195 1195
1196BOOL LLFloater::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
1197{
1198 bringToFront( x, y );
1199 return LLPanel::handleMiddleMouseDown( x, y, mask );
1200}
1201
1196 1202
1197// virtual 1203// virtual
1198BOOL LLFloater::handleDoubleClick(S32 x, S32 y, MASK mask) 1204BOOL LLFloater::handleDoubleClick(S32 x, S32 y, MASK mask)
diff --git a/linden/indra/llui/llfloater.h b/linden/indra/llui/llfloater.h
index a8f7c21..0e3d148 100644
--- a/linden/indra/llui/llfloater.h
+++ b/linden/indra/llui/llfloater.h
@@ -195,7 +195,7 @@ public:
195 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); 195 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
196 virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); 196 virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
197 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); 197 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
198 198 virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
199 virtual void draw(); 199 virtual void draw();
200 200
201 virtual void onOpen() {} 201 virtual void onOpen() {}
diff --git a/linden/indra/llui/llkeywords.cpp b/linden/indra/llui/llkeywords.cpp
index 9ecd744..93da44c 100644
--- a/linden/indra/llui/llkeywords.cpp
+++ b/linden/indra/llui/llkeywords.cpp
@@ -381,9 +381,9 @@ void LLKeywords::findSegments(std::vector<LLTextSegment *>* seg_list, const LLWS
381 seg_start = cur - base; 381 seg_start = cur - base;
382 cur += cur_delimiter->getLength(); 382 cur += cur_delimiter->getLength();
383 383
384 if( cur_delimiter->getType() == LLKeywordToken::TWO_SIDED_DELIMITER || LLKeywordToken::TWO_SIDED_DELIMITER_ESC) 384 LLKeywordToken::TOKEN_TYPE type = cur_delimiter->getType();
385 if (type == LLKeywordToken::TWO_SIDED_DELIMITER || type == LLKeywordToken::TWO_SIDED_DELIMITER_ESC)
385 { 386 {
386 llassert( cur_delimiter->getDelimiter() != NULL );
387 while( *cur && !cur_delimiter->isTail(cur)) 387 while( *cur && !cur_delimiter->isTail(cur))
388 { 388 {
389 // Check for an escape sequence. 389 // Check for an escape sequence.
diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp
index f35fa58..fc33dcf 100644
--- a/linden/indra/llui/lllineeditor.cpp
+++ b/linden/indra/llui/lllineeditor.cpp
@@ -494,6 +494,9 @@ BOOL LLLineEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
494 // delay cursor flashing 494 // delay cursor flashing
495 mKeystrokeTimer.reset(); 495 mKeystrokeTimer.reset();
496 496
497 // take selection to 'primary' clipboard
498 updatePrimary();
499
497 return TRUE; 500 return TRUE;
498} 501}
499 502
@@ -576,6 +579,17 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)
576 return TRUE; 579 return TRUE;
577} 580}
578 581
582BOOL LLLineEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
583{
584 // llinfos << "MiddleMouseDown" << llendl;
585 setFocus( TRUE );
586 if( canPastePrimary() )
587 {
588 setCursorAtLocalPos(x);
589 pastePrimary();
590 }
591 return TRUE;
592}
579 593
580BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask) 594BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask)
581{ 595{
@@ -670,6 +684,9 @@ BOOL LLLineEditor::handleMouseUp(S32 x, S32 y, MASK mask)
670 { 684 {
671 // delay cursor flashing 685 // delay cursor flashing
672 mKeystrokeTimer.reset(); 686 mKeystrokeTimer.reset();
687
688 // take selection to 'primary' clipboard
689 updatePrimary();
673 } 690 }
674 691
675 return handled; 692 return handled;
@@ -873,7 +890,12 @@ BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask)
873 } 890 }
874 } 891 }
875 892
876 893 if(handled)
894 {
895 // take selection to 'primary' clipboard
896 updatePrimary();
897 }
898
877 return handled; 899 return handled;
878} 900}
879 901
@@ -946,20 +968,42 @@ BOOL LLLineEditor::canPaste() const
946 return !mReadOnly && gClipboard.canPasteString(); 968 return !mReadOnly && gClipboard.canPasteString();
947} 969}
948 970
949
950// paste from clipboard
951void LLLineEditor::paste() 971void LLLineEditor::paste()
952{ 972{
953 if (canPaste()) 973 bool is_primary = false;
974 pasteHelper(is_primary);
975}
976
977void LLLineEditor::pastePrimary()
978{
979 bool is_primary = true;
980 pasteHelper(is_primary);
981}
982
983// paste from primary (is_primary==true) or clipboard (is_primary==false)
984void LLLineEditor::pasteHelper(bool is_primary)
985{
986 bool can_paste_it;
987 if (is_primary)
988 can_paste_it = canPastePrimary();
989 else
990 can_paste_it = canPaste();
991
992 if (can_paste_it)
954 { 993 {
955 LLWString paste = gClipboard.getPasteWString(); 994 LLWString paste;
995 if (is_primary)
996 paste = gClipboard.getPastePrimaryWString();
997 else
998 paste = gClipboard.getPasteWString();
999
956 if (!paste.empty()) 1000 if (!paste.empty())
957 { 1001 {
958 // Prepare for possible rollback 1002 // Prepare for possible rollback
959 LLLineEditorRollback rollback(this); 1003 LLLineEditorRollback rollback(this);
960 1004
961 // Delete any selected characters 1005 // Delete any selected characters
962 if (hasSelection()) 1006 if ((!is_primary) && hasSelection())
963 { 1007 {
964 deleteSelection(); 1008 deleteSelection();
965 } 1009 }
@@ -995,7 +1039,7 @@ void LLLineEditor::paste()
995 clean_string = clean_string.substr(0, wchars_that_fit); 1039 clean_string = clean_string.substr(0, wchars_that_fit);
996 reportBadKeystroke(); 1040 reportBadKeystroke();
997 } 1041 }
998 1042
999 mText.insert(getCursor(), clean_string); 1043 mText.insert(getCursor(), clean_string);
1000 setCursor( getCursor() + (S32)clean_string.length() ); 1044 setCursor( getCursor() + (S32)clean_string.length() );
1001 deselect(); 1045 deselect();
@@ -1016,7 +1060,30 @@ void LLLineEditor::paste()
1016 } 1060 }
1017} 1061}
1018 1062
1019 1063// copy selection to primary
1064void LLLineEditor::copyPrimary()
1065{
1066 if( canCopy() )
1067 {
1068 S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
1069 S32 length = abs( mSelectionStart - mSelectionEnd );
1070 gClipboard.copyFromPrimarySubstring( mText.getWString(), left_pos, length );
1071 }
1072}
1073
1074BOOL LLLineEditor::canPastePrimary() const
1075{
1076 return !mReadOnly && gClipboard.canPastePrimaryString();
1077}
1078
1079void LLLineEditor::updatePrimary()
1080{
1081 if(canCopy() )
1082 {
1083 copyPrimary();
1084 }
1085}
1086
1020BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) 1087BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
1021{ 1088{
1022 BOOL handled = FALSE; 1089 BOOL handled = FALSE;
diff --git a/linden/indra/llui/lllineeditor.h b/linden/indra/llui/lllineeditor.h
index cc12aa1..a670b21 100644
--- a/linden/indra/llui/lllineeditor.h
+++ b/linden/indra/llui/lllineeditor.h
@@ -90,6 +90,7 @@ public:
90 /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); 90 /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
91 /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); 91 /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
92 /*virtual*/ BOOL handleDoubleClick(S32 x,S32 y,MASK mask); 92 /*virtual*/ BOOL handleDoubleClick(S32 x,S32 y,MASK mask);
93 /*virtual*/ BOOL handleMiddleMouseDown(S32 x,S32 y,MASK mask);
93 /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask ); 94 /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
94 /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char); 95 /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char);
95 /*virtual*/ void onMouseCaptureLost(); 96 /*virtual*/ void onMouseCaptureLost();
@@ -97,13 +98,16 @@ public:
97 // LLEditMenuHandler overrides 98 // LLEditMenuHandler overrides
98 virtual void cut(); 99 virtual void cut();
99 virtual BOOL canCut() const; 100 virtual BOOL canCut() const;
100
101 virtual void copy(); 101 virtual void copy();
102 virtual BOOL canCopy() const; 102 virtual BOOL canCopy() const;
103
104 virtual void paste(); 103 virtual void paste();
105 virtual BOOL canPaste() const; 104 virtual BOOL canPaste() const;
106 105
106 virtual void updatePrimary();
107 virtual void copyPrimary();
108 virtual void pastePrimary();
109 virtual BOOL canPastePrimary() const;
110
107 virtual void doDelete(); 111 virtual void doDelete();
108 virtual BOOL canDoDelete() const; 112 virtual BOOL canDoDelete() const;
109 113
@@ -220,6 +224,9 @@ public:
220 224
221private: 225private:
222 // private helper methods 226 // private helper methods
227
228 void pasteHelper(bool is_primary);
229
223 void removeChar(); 230 void removeChar();
224 void addChar(const llwchar c); 231 void addChar(const llwchar c);
225 void setCursorAtLocalPos(S32 local_mouse_x); 232 void setCursorAtLocalPos(S32 local_mouse_x);
diff --git a/linden/indra/llui/llscrolllistctrl.cpp b/linden/indra/llui/llscrolllistctrl.cpp
index 7b6c125..460b29f 100644
--- a/linden/indra/llui/llscrolllistctrl.cpp
+++ b/linden/indra/llui/llscrolllistctrl.cpp
@@ -743,6 +743,18 @@ std::vector<LLScrollListItem*> LLScrollListCtrl::getAllSelected() const
743 return ret; 743 return ret;
744} 744}
745 745
746LLDynamicArray<LLUUID> LLScrollListCtrl::getSelectedIDs()
747{
748 LLUUID selected_id;
749 LLDynamicArray<LLUUID> ids;
750 std::vector<LLScrollListItem*> selected = this->getAllSelected();
751 for(std::vector<LLScrollListItem*>::iterator itr = selected.begin(); itr != selected.end(); ++itr)
752 {
753 ids.push_back((*itr)->getUUID());
754 }
755 return ids;
756}
757
746S32 LLScrollListCtrl::getFirstSelectedIndex() const 758S32 LLScrollListCtrl::getFirstSelectedIndex() const
747{ 759{
748 S32 CurSelectedIndex = 0; 760 S32 CurSelectedIndex = 0;
diff --git a/linden/indra/llui/llscrolllistctrl.h b/linden/indra/llui/llscrolllistctrl.h
index 72d8894..516e4f1 100644
--- a/linden/indra/llui/llscrolllistctrl.h
+++ b/linden/indra/llui/llscrolllistctrl.h
@@ -458,6 +458,7 @@ public:
458 LLScrollListItem* getFirstSelected() const; 458 LLScrollListItem* getFirstSelected() const;
459 virtual S32 getFirstSelectedIndex() const; 459 virtual S32 getFirstSelectedIndex() const;
460 std::vector<LLScrollListItem*> getAllSelected() const; 460 std::vector<LLScrollListItem*> getAllSelected() const;
461 LLDynamicArray<LLUUID> getSelectedIDs();
461 LLScrollListItem* getLastSelectedItem() const { return mLastSelected; } 462 LLScrollListItem* getLastSelectedItem() const { return mLastSelected; }
462 463
463 // iterate over all items 464 // iterate over all items
diff --git a/linden/indra/llui/llspinctrl.cpp b/linden/indra/llui/llspinctrl.cpp
index 1e973c0..2f531a2 100644
--- a/linden/indra/llui/llspinctrl.cpp
+++ b/linden/indra/llui/llspinctrl.cpp
@@ -469,6 +469,11 @@ BOOL LLSpinCtrl::handleKeyHere(KEY key, MASK mask)
469 LLSpinCtrl::onDownBtn(this); 469 LLSpinCtrl::onDownBtn(this);
470 return TRUE; 470 return TRUE;
471 } 471 }
472 if(key == KEY_RETURN)
473 {
474 forceEditorCommit();
475 return TRUE;
476 }
472 } 477 }
473 return FALSE; 478 return FALSE;
474} 479}
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index ccdf44b..32106f1 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -1205,6 +1205,18 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
1205} 1205}
1206 1206
1207 1207
1208BOOL LLTextEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
1209{
1210 setFocus( TRUE );
1211 if( canPastePrimary() )
1212 {
1213 setCursorAtLocalPos( x, y, TRUE );
1214 pastePrimary();
1215 }
1216 return TRUE;
1217}
1218
1219
1208BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask) 1220BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask)
1209{ 1221{
1210 BOOL handled = FALSE; 1222 BOOL handled = FALSE;
@@ -1327,6 +1339,9 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
1327 endSelection(); 1339 endSelection();
1328 1340
1329 updateScrollFromCursor(); 1341 updateScrollFromCursor();
1342
1343 // take selection to primary clipboard
1344 updatePrimary();
1330 } 1345 }
1331 1346
1332 if( !hasSelection() ) 1347 if( !hasSelection() )
@@ -1334,6 +1349,9 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
1334 handleMouseUpOverSegment( x, y, mask ); 1349 handleMouseUpOverSegment( x, y, mask );
1335 } 1350 }
1336 1351
1352 // take selection to 'primary' clipboard
1353 updatePrimary();
1354
1337 handled = TRUE; 1355 handled = TRUE;
1338 } 1356 }
1339 1357
@@ -1396,8 +1414,12 @@ BOOL LLTextEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
1396 // delay cursor flashing 1414 // delay cursor flashing
1397 resetKeystrokeTimer(); 1415 resetKeystrokeTimer();
1398 1416
1417 // take selection to 'primary' clipboard
1418 updatePrimary();
1419
1399 handled = TRUE; 1420 handled = TRUE;
1400 } 1421 }
1422
1401 return handled; 1423 return handled;
1402} 1424}
1403 1425
@@ -1693,6 +1715,12 @@ BOOL LLTextEditor::handleSelectionKey(const KEY key, const MASK mask)
1693 } 1715 }
1694 } 1716 }
1695 1717
1718 if( handled )
1719 {
1720 // take selection to 'primary' clipboard
1721 updatePrimary();
1722 }
1723
1696 return handled; 1724 return handled;
1697} 1725}
1698 1726
@@ -1872,22 +1900,46 @@ BOOL LLTextEditor::canPaste() const
1872 return !mReadOnly && gClipboard.canPasteString(); 1900 return !mReadOnly && gClipboard.canPasteString();
1873} 1901}
1874 1902
1875
1876// paste from clipboard 1903// paste from clipboard
1877void LLTextEditor::paste() 1904void LLTextEditor::paste()
1878{ 1905{
1879 if (!canPaste()) 1906 bool is_primary = false;
1907 pasteHelper(is_primary);
1908}
1909
1910// paste from primary
1911void LLTextEditor::pastePrimary()
1912{
1913 bool is_primary = true;
1914 pasteHelper(is_primary);
1915}
1916
1917// paste from primary (itsprimary==true) or clipboard (itsprimary==false)
1918void LLTextEditor::pasteHelper(bool is_primary)
1919{
1920 bool can_paste_it;
1921 if (is_primary)
1922 can_paste_it = canPastePrimary();
1923 else
1924 can_paste_it = canPaste();
1925
1926 if (!can_paste_it)
1880 { 1927 {
1881 return; 1928 return;
1882 } 1929 }
1883 LLUUID source_id; 1930 LLUUID source_id;
1884 LLWString paste = gClipboard.getPasteWString(&source_id); 1931 LLWString paste;
1932 if (is_primary)
1933 paste = gClipboard.getPastePrimaryWString(&source_id);
1934 else
1935 paste = gClipboard.getPasteWString(&source_id);
1936
1885 if (paste.empty()) 1937 if (paste.empty())
1886 { 1938 {
1887 return; 1939 return;
1888 } 1940 }
1889 // Delete any selected characters (the paste replaces them) 1941 // Delete any selected characters (the paste replaces them)
1890 if( hasSelection() ) 1942 if( (!is_primary) && hasSelection() )
1891 { 1943 {
1892 deleteSelection(TRUE); 1944 deleteSelection(TRUE);
1893 } 1945 }
@@ -1921,6 +1973,32 @@ void LLTextEditor::paste()
1921} 1973}
1922 1974
1923 1975
1976
1977// copy selection to primary
1978void LLTextEditor::copyPrimary()
1979{
1980 if( !canCopy() )
1981 {
1982 return;
1983 }
1984 S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
1985 S32 length = abs( mSelectionStart - mSelectionEnd );
1986 gClipboard.copyFromPrimarySubstring(mWText, left_pos, length, mSourceID);
1987}
1988
1989BOOL LLTextEditor::canPastePrimary() const
1990{
1991 return !mReadOnly && gClipboard.canPastePrimaryString();
1992}
1993
1994void LLTextEditor::updatePrimary()
1995{
1996 if (canCopy())
1997 {
1998 copyPrimary();
1999 }
2000}
2001
1924BOOL LLTextEditor::handleControlKey(const KEY key, const MASK mask) 2002BOOL LLTextEditor::handleControlKey(const KEY key, const MASK mask)
1925{ 2003{
1926 BOOL handled = FALSE; 2004 BOOL handled = FALSE;
@@ -1996,6 +2074,11 @@ BOOL LLTextEditor::handleControlKey(const KEY key, const MASK mask)
1996 } 2074 }
1997 } 2075 }
1998 2076
2077 if (handled)
2078 {
2079 updatePrimary();
2080 }
2081
1999 return handled; 2082 return handled;
2000} 2083}
2001 2084
@@ -3537,9 +3620,9 @@ void LLTextEditor::appendColoredText(const std::string &new_text,
3537} 3620}
3538 3621
3539void LLTextEditor::appendStyledText(const std::string &new_text, 3622void LLTextEditor::appendStyledText(const std::string &new_text,
3540 bool allow_undo, 3623 bool allow_undo,
3541 bool prepend_newline, 3624 bool prepend_newline,
3542 LLStyleSP stylep) 3625 const LLStyleSP stylep)
3543{ 3626{
3544 S32 part = (S32)LLTextParser::WHOLE; 3627 S32 part = (S32)LLTextParser::WHOLE;
3545 if(mParseHTML) 3628 if(mParseHTML)
@@ -3576,7 +3659,7 @@ void LLTextEditor::appendStyledText(const std::string &new_text,
3576 3659
3577 html->setLinkHREF(text.substr(start,end-start)); 3660 html->setLinkHREF(text.substr(start,end-start));
3578 appendText(text.substr(start, end-start),allow_undo, prepend_newline, html); 3661 appendText(text.substr(start, end-start),allow_undo, prepend_newline, html);
3579 if (end < (S32)text.length()) 3662 if (end < (S32)text.length())
3580 { 3663 {
3581 text = text.substr(end,text.length() - end); 3664 text = text.substr(end,text.length() - end);
3582 end=0; 3665 end=0;
diff --git a/linden/indra/llui/lltexteditor.h b/linden/indra/llui/lltexteditor.h
index 12195f2..a62f01d 100644
--- a/linden/indra/llui/lltexteditor.h
+++ b/linden/indra/llui/lltexteditor.h
@@ -84,6 +84,8 @@ public:
84 virtual BOOL handleHover(S32 x, S32 y, MASK mask); 84 virtual BOOL handleHover(S32 x, S32 y, MASK mask);
85 virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); 85 virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
86 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask ); 86 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask );
87 virtual BOOL handleMiddleMouseDown(S32 x,S32 y,MASK mask);
88
87 virtual BOOL handleKeyHere(KEY key, MASK mask ); 89 virtual BOOL handleKeyHere(KEY key, MASK mask );
88 virtual BOOL handleUnicodeCharHere(llwchar uni_char); 90 virtual BOOL handleUnicodeCharHere(llwchar uni_char);
89 91
@@ -119,6 +121,10 @@ public:
119 virtual BOOL canCopy() const; 121 virtual BOOL canCopy() const;
120 virtual void paste(); 122 virtual void paste();
121 virtual BOOL canPaste() const; 123 virtual BOOL canPaste() const;
124 virtual void updatePrimary();
125 virtual void copyPrimary();
126 virtual void pastePrimary();
127 virtual BOOL canPastePrimary() const;
122 virtual void doDelete(); 128 virtual void doDelete();
123 virtual BOOL canDoDelete() const; 129 virtual BOOL canDoDelete() const;
124 virtual void selectAll(); 130 virtual void selectAll();
@@ -144,12 +150,12 @@ public:
144 void appendText(const std::string &wtext, bool allow_undo, bool prepend_newline, 150 void appendText(const std::string &wtext, bool allow_undo, bool prepend_newline,
145 const LLStyleSP stylep = NULL); 151 const LLStyleSP stylep = NULL);
146 152
147 void appendColoredText(const std::string &wtext, bool allow_undo, 153 void appendColoredText(const std::string &wtext, bool allow_undo,
148 bool prepend_newline, 154 bool prepend_newline,
149 const LLColor4 &color, 155 const LLColor4 &color,
150 const std::string& font_name = LLStringUtil::null); 156 const std::string& font_name = LLStringUtil::null);
151 // if styled text starts a line, you need to prepend a newline. 157 // if styled text starts a line, you need to prepend a newline.
152 void appendStyledText(const std::string &new_text, bool allow_undo, 158 void appendStyledText(const std::string &new_text, bool allow_undo,
153 bool prepend_newline, 159 bool prepend_newline,
154 LLStyleSP stylep = NULL); 160 LLStyleSP stylep = NULL);
155 void appendHighlightedText(const std::string &new_text, bool allow_undo, 161 void appendHighlightedText(const std::string &new_text, bool allow_undo,
@@ -431,6 +437,8 @@ private:
431 // 437 //
432 // Methods 438 // Methods
433 // 439 //
440 void pasteHelper(bool is_primary);
441
434 void updateSegments(); 442 void updateSegments();
435 void pruneSegments(); 443 void pruneSegments();
436 444
diff --git a/linden/indra/llui/llview.cpp b/linden/indra/llui/llview.cpp
index 7047afc..36bc850 100644
--- a/linden/indra/llui/llview.cpp
+++ b/linden/indra/llui/llview.cpp
@@ -984,6 +984,30 @@ BOOL LLView::handleRightMouseUp(S32 x, S32 y, MASK mask)
984 } 984 }
985 return handled; 985 return handled;
986} 986}
987
988BOOL LLView::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
989{
990 LLView* handled_view = childrenHandleMiddleMouseDown( x, y, mask );
991 BOOL handled = (handled_view != NULL);
992 if( !handled && blockMouseEvent(x, y) )
993 {
994 handled = TRUE;
995 handled_view = this;
996 }
997
998 return handled;
999}
1000
1001BOOL LLView::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
1002{
1003 BOOL handled = childrenHandleMiddleMouseUp( x, y, mask ) != NULL;
1004 if( !handled && blockMouseEvent(x, y) )
1005 {
1006 handled = TRUE;
1007 }
1008 return handled;
1009}
1010
987 1011
988LLView* LLView::childrenHandleScrollWheel(S32 x, S32 y, S32 clicks) 1012LLView* LLView::childrenHandleScrollWheel(S32 x, S32 y, S32 clicks)
989{ 1013{
@@ -1145,6 +1169,34 @@ LLView* LLView::childrenHandleRightMouseDown(S32 x, S32 y, MASK mask)
1145 return handled_view; 1169 return handled_view;
1146} 1170}
1147 1171
1172LLView* LLView::childrenHandleMiddleMouseDown(S32 x, S32 y, MASK mask)
1173{
1174 LLView* handled_view = NULL;
1175
1176 if (getVisible() && getEnabled() )
1177 {
1178 for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
1179 {
1180 LLView* viewp = *child_it;
1181 S32 local_x = x - viewp->getRect().mLeft;
1182 S32 local_y = y - viewp->getRect().mBottom;
1183 if (viewp->pointInView(local_x, local_y) &&
1184 viewp->getVisible() &&
1185 viewp->getEnabled() &&
1186 viewp->handleMiddleMouseDown( local_x, local_y, mask ))
1187 {
1188 if (sDebugMouseHandling)
1189 {
1190 sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage;
1191 }
1192 handled_view = viewp;
1193 break;
1194 }
1195 }
1196 }
1197 return handled_view;
1198}
1199
1148LLView* LLView::childrenHandleDoubleClick(S32 x, S32 y, MASK mask) 1200LLView* LLView::childrenHandleDoubleClick(S32 x, S32 y, MASK mask)
1149{ 1201{
1150 LLView* handled_view = NULL; 1202 LLView* handled_view = NULL;
@@ -1230,6 +1282,32 @@ LLView* LLView::childrenHandleRightMouseUp(S32 x, S32 y, MASK mask)
1230 return handled_view; 1282 return handled_view;
1231} 1283}
1232 1284
1285LLView* LLView::childrenHandleMiddleMouseUp(S32 x, S32 y, MASK mask)
1286{
1287 LLView* handled_view = NULL;
1288 if( getVisible() && getEnabled() )
1289 {
1290 for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
1291 {
1292 LLView* viewp = *child_it;
1293 S32 local_x = x - viewp->getRect().mLeft;
1294 S32 local_y = y - viewp->getRect().mBottom;
1295 if (viewp->pointInView(local_x, local_y) &&
1296 viewp->getVisible() &&
1297 viewp->getEnabled() &&
1298 viewp->handleMiddleMouseUp( local_x, local_y, mask ))
1299 {
1300 if (sDebugMouseHandling)
1301 {
1302 sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage;
1303 }
1304 handled_view = viewp;
1305 break;
1306 }
1307 }
1308 }
1309 return handled_view;
1310}
1233 1311
1234void LLView::draw() 1312void LLView::draw()
1235{ 1313{
@@ -2555,7 +2633,7 @@ void LLView::initFromXML(LLXMLNodePtr node, LLView* parent)
2555 node->getAttributeString("hover_cursor", cursor_string); 2633 node->getAttributeString("hover_cursor", cursor_string);
2556 mHoverCursor = getCursorFromString(cursor_string); 2634 mHoverCursor = getCursorFromString(cursor_string);
2557 } 2635 }
2558 2636
2559 node->getAttributeBOOL("use_bounding_rect", mUseBoundingRect); 2637 node->getAttributeBOOL("use_bounding_rect", mUseBoundingRect);
2560 node->getAttributeBOOL("mouse_opaque", mMouseOpaque); 2638 node->getAttributeBOOL("mouse_opaque", mMouseOpaque);
2561 2639
diff --git a/linden/indra/llui/llview.h b/linden/indra/llui/llview.h
index b5a34bd..539adea 100644
--- a/linden/indra/llui/llview.h
+++ b/linden/indra/llui/llview.h
@@ -465,6 +465,8 @@ public:
465 /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); 465 /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
466 /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); 466 /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
467 /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); 467 /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
468 /*virtual*/ BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask);
469 /*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
468 /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); 470 /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
469 /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); 471 /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
470 /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); 472 /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
@@ -603,6 +605,8 @@ protected:
603 LLView* childrenHandleHover(S32 x, S32 y, MASK mask); 605 LLView* childrenHandleHover(S32 x, S32 y, MASK mask);
604 LLView* childrenHandleMouseUp(S32 x, S32 y, MASK mask); 606 LLView* childrenHandleMouseUp(S32 x, S32 y, MASK mask);
605 LLView* childrenHandleMouseDown(S32 x, S32 y, MASK mask); 607 LLView* childrenHandleMouseDown(S32 x, S32 y, MASK mask);
608 LLView* childrenHandleMiddleMouseUp(S32 x, S32 y, MASK mask);
609 LLView* childrenHandleMiddleMouseDown(S32 x, S32 y, MASK mask);
606 LLView* childrenHandleDoubleClick(S32 x, S32 y, MASK mask); 610 LLView* childrenHandleDoubleClick(S32 x, S32 y, MASK mask);
607 LLView* childrenHandleScrollWheel(S32 x, S32 y, S32 clicks); 611 LLView* childrenHandleScrollWheel(S32 x, S32 y, S32 clicks);
608 LLView* childrenHandleRightMouseDown(S32 x, S32 y, MASK mask); 612 LLView* childrenHandleRightMouseDown(S32 x, S32 y, MASK mask);
@@ -658,7 +662,7 @@ private:
658 boost::signals::connection mControlConnection; 662 boost::signals::connection mControlConnection;
659 663
660 ECursorType mHoverCursor; 664 ECursorType mHoverCursor;
661 665
662public: 666public:
663 static BOOL sDebugRects; // Draw debug rects behind everything. 667 static BOOL sDebugRects; // Draw debug rects behind everything.
664 static BOOL sDebugKeys; 668 static BOOL sDebugKeys;
diff --git a/linden/indra/llvfs/lldir.cpp b/linden/indra/llvfs/lldir.cpp
index f695c4c..29a3771 100644
--- a/linden/indra/llvfs/lldir.cpp
+++ b/linden/indra/llvfs/lldir.cpp
@@ -535,19 +535,23 @@ std::string LLDir::getForbiddenFileChars()
535 return "\\/:*?\"<>|"; 535 return "\\/:*?\"<>|";
536} 536}
537 537
538void LLDir::setLindenUserDir(const std::string &first, const std::string &last) 538void LLDir::setLindenUserDir(const std::string &grid, const std::string &first, const std::string &last)
539{ 539{
540 // if both first and last aren't set, assume we're grabbing the cached dir 540 // if both first and last aren't set, assume we're grabbing the cached dir
541 if (!first.empty() && !last.empty()) 541 if (!first.empty() && !last.empty())
542 { 542 {
543 // some platforms have case-sensitive filesystems, so be 543 // some platforms have case-sensitive filesystems, so be
544 // utterly consistent with our firstname/lastname case. 544 // utterly consistent with our firstname/lastname case.
545 // std::string gridlower(grid);
546 // LLStringUtil::toLower(gridlower);
545 std::string firstlower(first); 547 std::string firstlower(first);
546 LLStringUtil::toLower(firstlower); 548 LLStringUtil::toLower(firstlower);
547 std::string lastlower(last); 549 std::string lastlower(last);
548 LLStringUtil::toLower(lastlower); 550 LLStringUtil::toLower(lastlower);
549 mLindenUserDir = getOSUserAppDir(); 551 mLindenUserDir = getOSUserAppDir();
550 mLindenUserDir += mDirDelimiter; 552 mLindenUserDir += mDirDelimiter;
553 // mLindenUserDir += gridlower;
554 // mLindenUserDir += "-";
551 mLindenUserDir += firstlower; 555 mLindenUserDir += firstlower;
552 mLindenUserDir += "_"; 556 mLindenUserDir += "_";
553 mLindenUserDir += lastlower; 557 mLindenUserDir += lastlower;
@@ -572,19 +576,23 @@ void LLDir::setChatLogsDir(const std::string &path)
572 } 576 }
573} 577}
574 578
575void LLDir::setPerAccountChatLogsDir(const std::string &first, const std::string &last) 579void LLDir::setPerAccountChatLogsDir(const std::string &grid, const std::string &first, const std::string &last)
576{ 580{
577 // if both first and last aren't set, assume we're grabbing the cached dir 581 // if both first and last aren't set, assume we're grabbing the cached dir
578 if (!first.empty() && !last.empty()) 582 if (!first.empty() && !last.empty())
579 { 583 {
580 // some platforms have case-sensitive filesystems, so be 584 // some platforms have case-sensitive filesystems, so be
581 // utterly consistent with our firstname/lastname case. 585 // utterly consistent with our firstname/lastname case.
586 // std::string gridlower(grid);
587 // LLStringUtil::toLower(gridlower);
582 std::string firstlower(first); 588 std::string firstlower(first);
583 LLStringUtil::toLower(firstlower); 589 LLStringUtil::toLower(firstlower);
584 std::string lastlower(last); 590 std::string lastlower(last);
585 LLStringUtil::toLower(lastlower); 591 LLStringUtil::toLower(lastlower);
586 mPerAccountChatLogsDir = getChatLogsDir(); 592 mPerAccountChatLogsDir = getChatLogsDir();
587 mPerAccountChatLogsDir += mDirDelimiter; 593 mPerAccountChatLogsDir += mDirDelimiter;
594 // mPerAccountChatLogsDir += gridlower;
595 // mPerAccountChatLogsDir += "-";
588 mPerAccountChatLogsDir += firstlower; 596 mPerAccountChatLogsDir += firstlower;
589 mPerAccountChatLogsDir += "_"; 597 mPerAccountChatLogsDir += "_";
590 mPerAccountChatLogsDir += lastlower; 598 mPerAccountChatLogsDir += lastlower;
diff --git a/linden/indra/llvfs/lldir.h b/linden/indra/llvfs/lldir.h
index 760b651..21dcf5b 100644
--- a/linden/indra/llvfs/lldir.h
+++ b/linden/indra/llvfs/lldir.h
@@ -125,8 +125,8 @@ class LLDir
125 static std::string getForbiddenFileChars(); 125 static std::string getForbiddenFileChars();
126 126
127 virtual void setChatLogsDir(const std::string &path); // Set the chat logs dir to this user's dir 127 virtual void setChatLogsDir(const std::string &path); // Set the chat logs dir to this user's dir
128 virtual void setPerAccountChatLogsDir(const std::string &first, const std::string &last); // Set the per user chat log directory. 128 virtual void setPerAccountChatLogsDir(const std::string &grid, const std::string &first, const std::string &last); // Set the per user chat log directory.
129 virtual void setLindenUserDir(const std::string &first, const std::string &last); // Set the linden user dir to this user's dir 129 virtual void setLindenUserDir(const std::string &grid, const std::string &first, const std::string &last); // Set the linden user dir to this user's dir
130 virtual void setSkinFolder(const std::string &skin_folder); 130 virtual void setSkinFolder(const std::string &skin_folder);
131 virtual bool setCacheDir(const std::string &path); 131 virtual bool setCacheDir(const std::string &path);
132 132
diff --git a/linden/indra/llwindow/CMakeLists.txt b/linden/indra/llwindow/CMakeLists.txt
index 95e315f..afce0c0 100644
--- a/linden/indra/llwindow/CMakeLists.txt
+++ b/linden/indra/llwindow/CMakeLists.txt
@@ -46,6 +46,7 @@ set(llwindows_HEADER_FILES
46 46
47set(viewer_SOURCE_FILES 47set(viewer_SOURCE_FILES
48 llwindow.cpp 48 llwindow.cpp
49 llmousehandler.cpp
49 ) 50 )
50 51
51set(viewer_HEADER_FILES 52set(viewer_HEADER_FILES
diff --git a/linden/indra/llwindow/llmousehandler.cpp b/linden/indra/llwindow/llmousehandler.cpp
new file mode 100644
index 0000000..ae2f147
--- /dev/null
+++ b/linden/indra/llwindow/llmousehandler.cpp
@@ -0,0 +1,59 @@
1/**
2 * @file llmousehandler.cpp
3 * @brief LLMouseHandler class implementation
4 *
5 * $LicenseInfo:firstyear=2001&license=viewergpl$
6 *
7 * Copyright (c) 2001-2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#include "llmousehandler.h"
33
34//virtual
35BOOL LLMouseHandler::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down)
36{
37 BOOL handled = FALSE;
38 if (down)
39 {
40 switch (clicktype)
41 {
42 case CLICK_LEFT: handled = handleMouseDown(x, y, mask); break;
43 case CLICK_RIGHT: handled = handleRightMouseDown(x, y, mask); break;
44 case CLICK_MIDDLE: handled = handleMiddleMouseDown(x, y, mask); break;
45 case CLICK_DOUBLELEFT: handled = handleDoubleClick(x, y, mask); break;
46 }
47 }
48 else
49 {
50 switch (clicktype)
51 {
52 case CLICK_LEFT: handled = handleMouseUp(x, y, mask); break;
53 case CLICK_RIGHT: handled = handleRightMouseUp(x, y, mask); break;
54 case CLICK_MIDDLE: handled = handleMiddleMouseUp(x, y, mask); break;
55 case CLICK_DOUBLELEFT: handled = handleDoubleClick(x, y, mask); break;
56 }
57 }
58 return handled;
59}
diff --git a/linden/indra/llwindow/llmousehandler.h b/linden/indra/llwindow/llmousehandler.h
index f3a2edd..7bd0f2e 100644
--- a/linden/indra/llwindow/llmousehandler.h
+++ b/linden/indra/llwindow/llmousehandler.h
@@ -33,9 +33,10 @@
33#ifndef LL_MOUSEHANDLER_H 33#ifndef LL_MOUSEHANDLER_H
34#define LL_MOUSEHANDLER_H 34#define LL_MOUSEHANDLER_H
35 35
36#include "llstring.h" 36#include "linden_common.h"
37#include "llrect.h"
37 38
38// Abstract interface. 39// Mostly-abstract interface.
39// Intended for use via multiple inheritance. 40// Intended for use via multiple inheritance.
40// A class may have as many interfaces as it likes, but never needs to inherit one more than once. 41// A class may have as many interfaces as it likes, but never needs to inherit one more than once.
41 42
@@ -49,13 +50,23 @@ public:
49 SHOW_IF_NOT_BLOCKED, 50 SHOW_IF_NOT_BLOCKED,
50 SHOW_ALWAYS, 51 SHOW_ALWAYS,
51 } EShowToolTip; 52 } EShowToolTip;
53 typedef enum {
54 CLICK_LEFT,
55 CLICK_MIDDLE,
56 CLICK_RIGHT,
57 CLICK_DOUBLELEFT
58 } EClickType;
59 virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down);
52 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) = 0; 60 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) = 0;
53 virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) = 0; 61 virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) = 0;
54 virtual BOOL handleHover(S32 x, S32 y, MASK mask) = 0; 62 virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask) = 0;
55 virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) = 0; 63 virtual BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask) = 0;
56 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) = 0;
57 virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) = 0; 64 virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) = 0;
58 virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask) = 0; 65 virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask) = 0;
66 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) = 0;
67
68 virtual BOOL handleHover(S32 x, S32 y, MASK mask) = 0;
69 virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) = 0;
59 virtual BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen) = 0; 70 virtual BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen) = 0;
60 virtual EShowToolTip getShowToolTip() { return SHOW_IF_NOT_BLOCKED; }; 71 virtual EShowToolTip getShowToolTip() { return SHOW_IF_NOT_BLOCKED; };
61 virtual const std::string& getName() const = 0; 72 virtual const std::string& getName() const = 0;
diff --git a/linden/indra/llwindow/llwindow.cpp b/linden/indra/llwindow/llwindow.cpp
index fb4770e..53ca68d 100644
--- a/linden/indra/llwindow/llwindow.cpp
+++ b/linden/indra/llwindow/llwindow.cpp
@@ -308,6 +308,22 @@ void *LLWindow::getMediaWindow()
308 return getPlatformWindow(); 308 return getPlatformWindow();
309} 309}
310 310
311//virtual
312BOOL LLWindow::isPrimaryTextAvailable()
313{
314 return FALSE; // no
315}
316//virtual
317BOOL LLWindow::pasteTextFromPrimary(LLWString &dst)
318{
319 return FALSE; // fail
320}
321// virtual
322BOOL LLWindow::copyTextToPrimary(const LLWString &src)
323{
324 return FALSE; // fail
325}
326
311// static 327// static
312std::vector<std::string> LLWindow::getDynamicFallbackFontList() 328std::vector<std::string> LLWindow::getDynamicFallbackFontList()
313{ 329{
diff --git a/linden/indra/llwindow/llwindow.h b/linden/indra/llwindow/llwindow.h
index 9e01596..a649766 100644
--- a/linden/indra/llwindow/llwindow.h
+++ b/linden/indra/llwindow/llwindow.h
@@ -144,9 +144,15 @@ public:
144 virtual void captureMouse() = 0; 144 virtual void captureMouse() = 0;
145 virtual void releaseMouse() = 0; 145 virtual void releaseMouse() = 0;
146 virtual void setMouseClipping( BOOL b ) = 0; 146 virtual void setMouseClipping( BOOL b ) = 0;
147
147 virtual BOOL isClipboardTextAvailable() = 0; 148 virtual BOOL isClipboardTextAvailable() = 0;
148 virtual BOOL pasteTextFromClipboard(LLWString &dst) = 0; 149 virtual BOOL pasteTextFromClipboard(LLWString &dst) = 0;
149 virtual BOOL copyTextToClipboard(const LLWString &src) = 0; 150 virtual BOOL copyTextToClipboard(const LLWString &src) = 0;
151
152 virtual BOOL isPrimaryTextAvailable();
153 virtual BOOL pasteTextFromPrimary(LLWString &dst);
154 virtual BOOL copyTextToPrimary(const LLWString &src);
155
150 virtual void flashIcon(F32 seconds) = 0; 156 virtual void flashIcon(F32 seconds) = 0;
151 virtual F32 getGamma() = 0; 157 virtual F32 getGamma() = 0;
152 virtual BOOL setGamma(const F32 gamma) = 0; // Set the gamma 158 virtual BOOL setGamma(const F32 gamma) = 0; // Set the gamma
@@ -197,6 +203,7 @@ public:
197 virtual void updateLanguageTextInputArea() {} 203 virtual void updateLanguageTextInputArea() {}
198 virtual void interruptLanguageTextInput() {} 204 virtual void interruptLanguageTextInput() {}
199 virtual void spawnWebBrowser(const std::string& escaped_url) {}; 205 virtual void spawnWebBrowser(const std::string& escaped_url) {};
206 virtual void ShellEx(const std::string& command) {};
200 207
201 static std::vector<std::string> getDynamicFallbackFontList(); 208 static std::vector<std::string> getDynamicFallbackFontList();
202 209
diff --git a/linden/indra/llwindow/llwindowsdl.cpp b/linden/indra/llwindow/llwindowsdl.cpp
index f9c170e..4dd0550 100644
--- a/linden/indra/llwindow/llwindowsdl.cpp
+++ b/linden/indra/llwindow/llwindowsdl.cpp
@@ -1230,7 +1230,6 @@ void LLWindowSDL::flashIcon(F32 seconds)
1230#endif // LL_X11 1230#endif // LL_X11
1231} 1231}
1232 1232
1233
1234#if LL_GTK 1233#if LL_GTK
1235BOOL LLWindowSDL::isClipboardTextAvailable() 1234BOOL LLWindowSDL::isClipboardTextAvailable()
1236{ 1235{
@@ -1274,22 +1273,80 @@ BOOL LLWindowSDL::copyTextToClipboard(const LLWString &text)
1274 return FALSE; // failure 1273 return FALSE; // failure
1275} 1274}
1276 1275
1277#else 1276BOOL LLWindowSDL::isPrimaryTextAvailable()
1277{
1278 if (ll_try_gtk_init())
1279 {
1280 GtkClipboard * const clipboard =
1281 gtk_clipboard_get(GDK_SELECTION_PRIMARY);
1282 return gtk_clipboard_wait_is_text_available(clipboard) ?
1283 TRUE : FALSE;
1284 }
1285 return FALSE; // failure
1286}
1287
1288BOOL LLWindowSDL::pasteTextFromPrimary(LLWString &text)
1289{
1290 if (ll_try_gtk_init())
1291 {
1292 GtkClipboard * const clipboard =
1293 gtk_clipboard_get(GDK_SELECTION_PRIMARY);
1294 gchar * const data = gtk_clipboard_wait_for_text(clipboard);
1295 if (data)
1296 {
1297 text = LLWString(utf8str_to_wstring(data));
1298 g_free(data);
1299 return TRUE;
1300 }
1301 }
1302 return FALSE; // failure
1303}
1278 1304
1305BOOL LLWindowSDL::copyTextToPrimary(const LLWString &text)
1306{
1307 if (ll_try_gtk_init())
1308 {
1309 const std::string utf8 = wstring_to_utf8str(text);
1310 GtkClipboard * const clipboard =
1311 gtk_clipboard_get(GDK_SELECTION_PRIMARY);
1312 gtk_clipboard_set_text(clipboard, utf8.c_str(), utf8.length());
1313 return TRUE;
1314 }
1315 return FALSE; // failure
1316}
1317
1318#else
1319
1279BOOL LLWindowSDL::isClipboardTextAvailable() 1320BOOL LLWindowSDL::isClipboardTextAvailable()
1280{ 1321{
1281 return FALSE; // unsupported 1322 return FALSE; // unsupported
1282} 1323}
1283 1324
1284BOOL LLWindowSDL::pasteTextFromClipboard(LLWString &dst) 1325BOOL LLWindowSDL::pasteTextFromClipboard(LLWString &dst)
1285{ 1326{
1286 return FALSE; // unsupported 1327 return FALSE; // unsupported
1287} 1328}
1329
1288 1330
1289BOOL LLWindowSDL::copyTextToClipboard(const LLWString &s) 1331BOOL LLWindowSDL::copyTextToClipboard(const LLWString &s)
1290{ 1332{
1291 return FALSE; // unsupported 1333 return FALSE; // unsupported
1292} 1334}
1335
1336BOOL LLWindowSDL::isPrimaryTextAvailable()
1337{
1338 return FALSE; // unsupported
1339}
1340
1341BOOL LLWindowSDL::pasteTextFromPrimary(LLWString &dst)
1342{
1343 return FALSE; // unsupported
1344}
1345
1346BOOL LLWindowSDL::copyTextToPrimary(const LLWString &s)
1347{
1348 return FALSE; // unsupported
1349}
1293#endif // LL_GTK 1350#endif // LL_GTK
1294 1351
1295LLWindow::LLWindowResolution* LLWindowSDL::getSupportedResolutions(S32 &num_resolutions) 1352LLWindow::LLWindowResolution* LLWindowSDL::getSupportedResolutions(S32 &num_resolutions)
@@ -2092,8 +2149,7 @@ S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 typ
2092 buttons = GTK_BUTTONS_YES_NO; 2149 buttons = GTK_BUTTONS_YES_NO;
2093 break; 2150 break;
2094 } 2151 }
2095 win = gtk_message_dialog_new(NULL, flags, messagetype, buttons, "%s", 2152 win = gtk_message_dialog_new(NULL,flags, messagetype, buttons, "%s", text.c_str());
2096 text.c_str());
2097 2153
2098# if LL_X11 2154# if LL_X11
2099 // Make GTK tell the window manager to associate this 2155 // Make GTK tell the window manager to associate this
diff --git a/linden/indra/llwindow/llwindowsdl.h b/linden/indra/llwindow/llwindowsdl.h
index cebb151..632d8fc 100644
--- a/linden/indra/llwindow/llwindowsdl.h
+++ b/linden/indra/llwindow/llwindowsdl.h
@@ -80,9 +80,15 @@ public:
80 /*virtual*/ void captureMouse(); 80 /*virtual*/ void captureMouse();
81 /*virtual*/ void releaseMouse(); 81 /*virtual*/ void releaseMouse();
82 /*virtual*/ void setMouseClipping( BOOL b ); 82 /*virtual*/ void setMouseClipping( BOOL b );
83
83 /*virtual*/ BOOL isClipboardTextAvailable(); 84 /*virtual*/ BOOL isClipboardTextAvailable();
84 /*virtual*/ BOOL pasteTextFromClipboard(LLWString &dst); 85 /*virtual*/ BOOL pasteTextFromClipboard(LLWString &dst);
85 /*virtual*/ BOOL copyTextToClipboard(const LLWString & src); 86 /*virtual*/ BOOL copyTextToClipboard(const LLWString & src);
87
88 /*virtual*/ BOOL isPrimaryTextAvailable();
89 /*virtual*/ BOOL pasteTextFromPrimary(LLWString &dst);
90 /*virtual*/ BOOL copyTextToPrimary(const LLWString & src);
91
86 /*virtual*/ void flashIcon(F32 seconds); 92 /*virtual*/ void flashIcon(F32 seconds);
87 /*virtual*/ F32 getGamma(); 93 /*virtual*/ F32 getGamma();
88 /*virtual*/ BOOL setGamma(const F32 gamma); // Set the gamma 94 /*virtual*/ BOOL setGamma(const F32 gamma); // Set the gamma
diff --git a/linden/indra/llwindow/llwindowwin32.cpp b/linden/indra/llwindow/llwindowwin32.cpp
index 6280868..b2826c8 100644
--- a/linden/indra/llwindow/llwindowwin32.cpp
+++ b/linden/indra/llwindow/llwindowwin32.cpp
@@ -2918,6 +2918,18 @@ S32 OSMessageBoxWin32(const std::string& text, const std::string& caption, U32 t
2918 return retval; 2918 return retval;
2919} 2919}
2920 2920
2921void LLWindowWin32::ShellEx(const std::string& command )
2922{
2923 LLWString url_wstring = utf8str_to_wstring( command );
2924 llutf16string url_utf16 = wstring_to_utf16str( url_wstring );
2925
2926 SHELLEXECUTEINFO sei = { sizeof( sei ) };
2927 sei.fMask = SEE_MASK_FLAG_DDEWAIT;
2928 sei.nShow = SW_SHOWNORMAL;
2929 sei.lpVerb = L"open";
2930 sei.lpFile = url_utf16.c_str();
2931 ShellExecuteEx( &sei );
2932}
2921 2933
2922void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url ) 2934void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url )
2923{ 2935{
diff --git a/linden/indra/llwindow/llwindowwin32.h b/linden/indra/llwindow/llwindowwin32.h
index 237f834..d3ae325 100644
--- a/linden/indra/llwindow/llwindowwin32.h
+++ b/linden/indra/llwindow/llwindowwin32.h
@@ -111,6 +111,7 @@ public:
111 /*virtual*/ void updateLanguageTextInputArea(); 111 /*virtual*/ void updateLanguageTextInputArea();
112 /*virtual*/ void interruptLanguageTextInput(); 112 /*virtual*/ void interruptLanguageTextInput();
113 /*virtual*/ void spawnWebBrowser(const std::string& escaped_url); 113 /*virtual*/ void spawnWebBrowser(const std::string& escaped_url);
114 /*virtual*/ void ShellEx(const std::string& command);
114 115
115 static std::vector<std::string> getDynamicFallbackFontList(); 116 static std::vector<std::string> getDynamicFallbackFontList();
116 117
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index 954ce7d..0e2ddf2 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -64,6 +64,11 @@ include_directories(
64 ) 64 )
65 65
66set(viewer_SOURCE_FILES 66set(viewer_SOURCE_FILES
67 floaterlogin.cpp
68 hippoGridManager.cpp
69 hippoLimits.cpp
70 hippoRestRequest.cpp
71 jcfloater_animation_list.cpp
67 llagent.cpp 72 llagent.cpp
68 llagentaccess.cpp 73 llagentaccess.cpp
69 llagentdata.cpp 74 llagentdata.cpp
@@ -125,6 +130,7 @@ set(viewer_SOURCE_FILES
125 llfloaterabout.cpp 130 llfloaterabout.cpp
126 llfloateractivespeakers.cpp 131 llfloateractivespeakers.cpp
127 llfloateranimpreview.cpp 132 llfloateranimpreview.cpp
133 llfloaterassetbrowser.cpp
128 llfloaterauction.cpp 134 llfloaterauction.cpp
129 llfloateravatarinfo.cpp 135 llfloateravatarinfo.cpp
130 llfloateravatarpicker.cpp 136 llfloateravatarpicker.cpp
@@ -433,6 +439,7 @@ set(viewer_SOURCE_FILES
433 llwearablelist.cpp 439 llwearablelist.cpp
434 llweb.cpp 440 llweb.cpp
435 llwebbrowserctrl.cpp 441 llwebbrowserctrl.cpp
442 llwindlightremotectrl.cpp
436 llwind.cpp 443 llwind.cpp
437 llwlanimator.cpp 444 llwlanimator.cpp
438 llwldaycycle.cpp 445 llwldaycycle.cpp
@@ -444,6 +451,12 @@ set(viewer_SOURCE_FILES
444 llxmlrpctransaction.cpp 451 llxmlrpctransaction.cpp
445 noise.cpp 452 noise.cpp
446 pipeline.cpp 453 pipeline.cpp
454 primbackup.cpp
455 rlvhandler.cpp
456 rlvhelper.cpp
457 rlvmultistringsearch.cpp
458 rlvextensions.cpp
459 rlvfloaterbehaviour.cpp
447 ) 460 )
448 461
449set(VIEWER_BINARY_NAME "imprudence-bin" CACHE STRING 462set(VIEWER_BINARY_NAME "imprudence-bin" CACHE STRING
@@ -466,7 +479,11 @@ endif (LINUX)
466set(viewer_HEADER_FILES 479set(viewer_HEADER_FILES
467 CMakeLists.txt 480 CMakeLists.txt
468 ViewerInstall.cmake 481 ViewerInstall.cmake
469 482 floaterlogin.h
483 hippoGridManager.h
484 hippoLimits.h
485 hippoRestRequest.h
486 jcfloater_animation_list.h
470 llagent.h 487 llagent.h
471 llagentaccess.h 488 llagentaccess.h
472 llagentdata.h 489 llagentdata.h
@@ -530,6 +547,7 @@ set(viewer_HEADER_FILES
530 llfloaterabout.h 547 llfloaterabout.h
531 llfloateractivespeakers.h 548 llfloateractivespeakers.h
532 llfloateranimpreview.h 549 llfloateranimpreview.h
550 llfloaterassetbrowser.h
533 llfloaterauction.h 551 llfloaterauction.h
534 llfloateravatarinfo.h 552 llfloateravatarinfo.h
535 llfloateravatarpicker.h 553 llfloateravatarpicker.h
@@ -843,6 +861,7 @@ set(viewer_HEADER_FILES
843 llwebbrowserctrl.h 861 llwebbrowserctrl.h
844 llwind.h 862 llwind.h
845 llwindebug.h 863 llwindebug.h
864 llwindlightremotectrl.h
846 llwlanimator.h 865 llwlanimator.h
847 llwldaycycle.h 866 llwldaycycle.h
848 llwlparammanager.h 867 llwlparammanager.h
@@ -854,9 +873,17 @@ set(viewer_HEADER_FILES
854 macmain.h 873 macmain.h
855 noise.h 874 noise.h
856 pipeline.h 875 pipeline.h
876 primbackup.h
857 randgauss.h 877 randgauss.h
858 VertexCache.h 878 VertexCache.h
859 VorbisFramework.h 879 VorbisFramework.h
880 rlvdefines.h
881 rlvevent.h
882 rlvhandler.h
883 rlvhelper.h
884 rlvmultistringsearch.h
885 rlvextensions.h
886 rlvfloaterbehaviour.h
860 ) 887 )
861 888
862source_group("CMake Rules" FILES ViewerInstall.cmake) 889source_group("CMake Rules" FILES ViewerInstall.cmake)
@@ -1042,7 +1069,9 @@ set(viewer_XUI_FILES
1042 skins/default/xui/en-us/floater_about_land.xml 1069 skins/default/xui/en-us/floater_about_land.xml
1043 skins/default/xui/en-us/floater_about.xml 1070 skins/default/xui/en-us/floater_about.xml
1044 skins/default/xui/en-us/floater_active_speakers.xml 1071 skins/default/xui/en-us/floater_active_speakers.xml
1072 skins/default/xui/en-us/floater_animation_list.xml
1045 skins/default/xui/en-us/floater_animation_preview.xml 1073 skins/default/xui/en-us/floater_animation_preview.xml
1074 skins/default/xui/en-us/floater_asset_browser.xml
1046 skins/default/xui/en-us/floater_auction.xml 1075 skins/default/xui/en-us/floater_auction.xml
1047 skins/default/xui/en-us/floater_audio_volume.xml 1076 skins/default/xui/en-us/floater_audio_volume.xml
1048 skins/default/xui/en-us/floater_avatar_picker.xml 1077 skins/default/xui/en-us/floater_avatar_picker.xml
@@ -1224,6 +1253,9 @@ set(viewer_XUI_FILES
1224 skins/default/xui/en-us/panel_voice_options.xml 1253 skins/default/xui/en-us/panel_voice_options.xml
1225 skins/default/xui/en-us/panel_voice_remote_expanded.xml 1254 skins/default/xui/en-us/panel_voice_remote_expanded.xml
1226 skins/default/xui/en-us/panel_voice_remote.xml 1255 skins/default/xui/en-us/panel_voice_remote.xml
1256 skins/default/xui/en-us/panel_windlight_controls.xml
1257 skins/default/xui/en-us/panel_windlight_remote.xml
1258 skins/default/xui/en-us/panel_windlight_remote_expanded.xml
1227 skins/default/xui/en-us/role_actions.xml 1259 skins/default/xui/en-us/role_actions.xml
1228 skins/default/xui/en-us/strings.xml 1260 skins/default/xui/en-us/strings.xml
1229 skins/default/xui/en-us/teleport_strings.xml 1261 skins/default/xui/en-us/teleport_strings.xml
@@ -1415,6 +1447,7 @@ if (WINDOWS)
1415endif (WINDOWS) 1447endif (WINDOWS)
1416 1448
1417target_link_libraries(${VIEWER_BINARY_NAME} 1449target_link_libraries(${VIEWER_BINARY_NAME}
1450 ${NDOF_LIBRARY}
1418 ${LLAUDIO_LIBRARIES} 1451 ${LLAUDIO_LIBRARIES}
1419 ${LLCHARACTER_LIBRARIES} 1452 ${LLCHARACTER_LIBRARIES}
1420 ${LLIMAGE_LIBRARIES} 1453 ${LLIMAGE_LIBRARIES}
diff --git a/linden/indra/newview/English.lproj/InfoPlist.strings b/linden/indra/newview/English.lproj/InfoPlist.strings
index 50e6503..14a0102 100644
--- a/linden/indra/newview/English.lproj/InfoPlist.strings
+++ b/linden/indra/newview/English.lproj/InfoPlist.strings
@@ -1,5 +1,5 @@
1/* Localized versions of Info.plist keys */ 1/* Localized versions of Info.plist keys */
2 2
3CFBundleName = "Imprudence"; 3CFBundleName = "Imprudence";
4CFBundleShortVersionString = "Imprudence version 1.1.0"; 4CFBundleShortVersionString = "Imprudence version 1.2.0 beta 2";
5CFBundleGetInfoString = "Imprudence version 1.1.0"; 5CFBundleGetInfoString = "Imprudence version 1.2.0 beta 2";
diff --git a/linden/indra/newview/Info-Imprudence.plist b/linden/indra/newview/Info-Imprudence.plist
index 7c79a11..e44dcbe 100644
--- a/linden/indra/newview/Info-Imprudence.plist
+++ b/linden/indra/newview/Info-Imprudence.plist
@@ -32,7 +32,7 @@
32 </dict> 32 </dict>
33 </array> 33 </array>
34 <key>CFBundleVersion</key> 34 <key>CFBundleVersion</key>
35 <string>1.1.0</string> 35 <string>1.2.0 beta 2</string>
36 <key>CSResourcesFileMapped</key> 36 <key>CSResourcesFileMapped</key>
37 <true/> 37 <true/>
38</dict> 38</dict>
diff --git a/linden/indra/newview/app_settings/default_grids.xml b/linden/indra/newview/app_settings/default_grids.xml
new file mode 100644
index 0000000..13293cf
--- /dev/null
+++ b/linden/indra/newview/app_settings/default_grids.xml
@@ -0,0 +1,37 @@
1<llsd>
2 <array>
3
4 <!--
5 This file contains fallback settings only.
6 The actual list of grids is loaded from a web server.
7 -->
8
9 <map>
10 <key>default_grids_version</key><string>0</string>
11 </map>
12
13 <!-- Second Life -->
14 <map>
15 <key>gridnick</key><string>secondlife</string>
16 <key>gridname</key><string>Second Life</string>
17 <key>platform</key><string>SecondLife</string>
18 <key>loginuri</key><string>https://login.agni.lindenlab.com/cgi-bin/login.cgi</string>
19 <key>loginpage</key><string>http://secondlife.com/app/login/</string>
20 <key>helperuri</key><string>https://secondlife.com/helpers/</string>
21 <key>website</key><string>http://secondlife.com/</string>
22 <key>support</key><string>http://secondlife.com/support/</string>
23 <key>register</key><string>http://secondlife.com/registration/</string>
24 <key>password</key><string>http://secondlife.com/account/request.php</string>
25 </map>
26
27 <!-- Local Host -->
28 <map>
29 <key>gridnick</key><string>localhost</string>
30 <key>gridname</key><string>Local Host</string>
31 <key>platform</key><string>OpenSim</string>
32 <key>loginuri</key><string>http://127.0.0.1:9000/</string>
33 <key>helperuri</key><string>http://127.0.0.1:9000/</string>
34 </map>
35
36 </array>
37</llsd>
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 7e18cea..18c80eb 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -1,7 +1,150 @@
1<?xml version="1.0" ?> 1<?xml version="1.0" ?>
2<llsd> 2<llsd>
3<map> 3<map>
4 <key>AFKTimeout</key> 4 <key>RestrainedLife</key>
5 <map>
6 <key>Comment</key>
7 <string>Toggles the RestrainedLife features (BDSM lockable toys support). Needs a restart of the viewer.</string>
8 <key>Persist</key>
9 <integer>1</integer>
10 <key>Type</key>
11 <string>Boolean</string>
12 <key>Value</key>
13 <integer>0</integer>
14 </map>
15 <key>RestrainedLifeDebug</key>
16 <map>
17 <key>Comment</key>
18 <string>Toggles the RestrainedLife debug mode (displays the commands when in debug mode).</string>
19 <key>Persist</key>
20 <integer>1</integer>
21 <key>Type</key>
22 <string>Boolean</string>
23 <key>Value</key>
24 <integer>0</integer>
25 </map>
26 <key>RestrainedLifeNoSetEnv</key>
27 <map>
28 <key>Comment</key>
29 <string>When TRUE, forbids to set the environment (time of day and Windlight settings) via RestrainedLife. Needs a restart of the viewer.</string>
30 <key>Persist</key>
31 <integer>1</integer>
32 <key>Type</key>
33 <string>Boolean</string>
34 <key>Value</key>
35 <integer>0</integer>
36 </map>
37 <key>RestrainedLifeForbidGiveToRLV</key>
38 <map>
39 <key>Comment</key>
40 <string>When FALSE, allows to give sub-folders to the #RLV RestrainedLife folder.</string>
41 <key>Persist</key>
42 <integer>1</integer>
43 <key>Type</key>
44 <string>Boolean</string>
45 <key>Value</key>
46 <integer>1</integer>
47 </map>
48 <key>RLVaEnableLegacyNaming</key>
49 <map>
50 <key>Comment</key>
51 <string>Enables legacy naming convention for folders</string>
52 <key>Persist</key>
53 <integer>1</integer>
54 <key>Type</key>
55 <string>Boolean</string>
56 <key>Value</key>
57 <integer>1</integer>
58 </map>
59 <key>RLVaEnableWear</key>
60 <map>
61 <key>Comment</key>
62 <string>When TRUE, enables the "Wear" option on the inventory item context menu for attachments.</string>
63 <key>Persist</key>
64 <integer>1</integer>
65 <key>Type</key>
66 <string>Boolean</string>
67 <key>Value</key>
68 <integer>1</integer>
69 </map>
70 <key>RLVaHideLockedLayers</key>
71 <map>
72 <key>Comment</key>
73 <string>When TRUE, hides worn but "remove outfit" restricted clothing layers from @getoufit</string>
74 <key>Persist</key>
75 <integer>1</integer>
76 <key>Type</key>
77 <string>Boolean</string>
78 <key>Value</key>
79 <integer>0</integer>
80 </map>
81 <key>RLVaHideLockedAttachments</key>
82 <map>
83 <key>Comment</key>
84 <string>When TRUE, hides worn but "no detach" restricted attachments from @getattach</string>
85 <key>Persist</key>
86 <integer>1</integer>
87 <key>Type</key>
88 <string>Boolean</string>
89 <key>Value</key>
90 <integer>0</integer>
91 </map>
92 <key>RLVaShowNameTags</key>
93 <map>
94 <key>Comment</key>
95 <string>Display of names above avatars is subject to the general "Show Names" setting when @shownames=n restricted</string>
96 <key>Persist</key>
97 <integer>1</integer>
98 <key>Type</key>
99 <string>Boolean</string>
100 <key>Value</key>
101 <integer>0</integer>
102 </map>
103 <key>WarnFirstRLVDetach</key>
104 <map>
105 <key>Comment</key>
106 <string>Enables FirstRLVDetach warning dialog</string>
107 <key>Persist</key>
108 <integer>1</integer>
109 <key>Type</key>
110 <string>Boolean</string>
111 <key>Value</key>
112 <integer>1</integer>
113 </map>
114 <key>WarnFirstRLVEnableWear</key>
115 <map>
116 <key>Comment</key>
117 <string>Enables RLVEnableWear warning dialog</string>
118 <key>Persist</key>
119 <integer>1</integer>
120 <key>Type</key>
121 <string>Boolean</string>
122 <key>Value</key>
123 <integer>1</integer>
124 </map>
125 <key>WarnFirstRLVFartouch</key>
126 <map>
127 <key>Comment</key>
128 <string>Enables FirstRLVFartouch warning dialog</string>
129 <key>Persist</key>
130 <integer>1</integer>
131 <key>Type</key>
132 <string>Boolean</string>
133 <key>Value</key>
134 <integer>1</integer>
135 </map>
136 <key>WarnFirstRLVGiveToRLV</key>
137 <map>
138 <key>Comment</key>
139 <string>Enables FirstRLVGiveToRLV warning dialog</string>
140 <key>Persist</key>
141 <integer>1</integer>
142 <key>Type</key>
143 <string>Boolean</string>
144 <key>Value</key>
145 <integer>1</integer>
146 </map>
147 <key>AFKTimeout</key>
5 <map> 148 <map>
6 <key>Comment</key> 149 <key>Comment</key>
7 <string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string> 150 <string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string>
@@ -664,6 +807,17 @@
664 <key>Value</key> 807 <key>Value</key>
665 <integer>0</integer> 808 <integer>0</integer>
666 </map> 809 </map>
810 <key>BlockClickSit</key>
811 <map>
812 <key>Comment</key>
813 <string>Block click sit</string>
814 <key>Persist</key>
815 <integer>1</integer>
816 <key>Type</key>
817 <string>Boolean</string>
818 <key>Value</key>
819 <integer>0</integer>
820 </map>
667 <key>BrowserHome</key> 821 <key>BrowserHome</key>
668 <map> 822 <map>
669 <key>Comment</key> 823 <key>Comment</key>
@@ -1325,6 +1479,17 @@
1325 <key>Value</key> 1479 <key>Value</key>
1326 <real>0.5</real> 1480 <real>0.5</real>
1327 </map> 1481 </map>
1482 <key>ChatChannelSelect</key>
1483 <map>
1484 <key>Comment</key>
1485 <string>Toggle custom channel controls in the chat bar</string>
1486 <key>Persist</key>
1487 <integer>1</integer>
1488 <key>Type</key>
1489 <string>Boolean</string>
1490 <key>Value</key>
1491 <integer>0</integer>
1492 </map>
1328 <key>ChatFontSize</key> 1493 <key>ChatFontSize</key>
1329 <map> 1494 <map>
1330 <key>Comment</key> 1495 <key>Comment</key>
@@ -3059,6 +3224,17 @@
3059 <key>Value</key> 3224 <key>Value</key>
3060 <integer>0</integer> 3225 <integer>0</integer>
3061 </map> 3226 </map>
3227 <key>DoubleClickTeleport</key>
3228 <map>
3229 <key>Comment</key>
3230 <string>Enable double-click teleport</string>
3231 <key>Persist</key>
3232 <integer>1</integer>
3233 <key>Type</key>
3234 <string>Boolean</string>
3235 <key>Value</key>
3236 <integer>1</integer>
3237 </map>
3062 <key>DragAndDropToolTipDelay</key> 3238 <key>DragAndDropToolTipDelay</key>
3063 <map> 3239 <map>
3064 <key>Comment</key> 3240 <key>Comment</key>
@@ -3185,6 +3361,17 @@
3185 <key>Value</key> 3361 <key>Value</key>
3186 <integer>1</integer> 3362 <integer>1</integer>
3187 </map> 3363 </map>
3364 <key>EnableWindlightRemote</key>
3365 <map>
3366 <key>Comment</key>
3367 <string>Enable windlight quick access remote in toolbar</string>
3368 <key>Persist</key>
3369 <integer>1</integer>
3370 <key>Type</key>
3371 <string>Boolean</string>
3372 <key>Value</key>
3373 <integer>1</integer>
3374 </map>
3188 <key>EnergyFromTop</key> 3375 <key>EnergyFromTop</key>
3189 <map> 3376 <map>
3190 <key>Comment</key> 3377 <key>Comment</key>
@@ -3469,6 +3656,22 @@
3469 <integer>0</integer> 3656 <integer>0</integer>
3470 </array> 3657 </array>
3471 </map> 3658 </map>
3659 <key>FloaterAnimationListRect</key>
3660 <map>
3661 <key>Comment</key>
3662 <string>Rectangle for Animation List</string>
3663 <key>Persist</key>
3664 <integer>1</integer>
3665 <key>Type</key>
3666 <string>Rect</string>
3667 <key>Value</key>
3668 <array>
3669 <integer>0</integer>
3670 <integer>275</integer>
3671 <integer>1000</integer>
3672 <integer>0</integer>
3673 </array>
3674 </map>
3472 <key>FloaterAudioVolumeRect</key> 3675 <key>FloaterAudioVolumeRect</key>
3473 <map> 3676 <map>
3474 <key>Comment</key> 3677 <key>Comment</key>
@@ -3920,7 +4123,6 @@
3920 <integer>0</integer> 4123 <integer>0</integer>
3921 </array> 4124 </array>
3922 </map> 4125 </map>
3923
3924 <key>FloaterObjectIMInfo</key> 4126 <key>FloaterObjectIMInfo</key>
3925 <map> 4127 <map>
3926 <key>Comment</key> 4128 <key>Comment</key>
@@ -3985,6 +4187,22 @@
3985 <integer>200</integer> 4187 <integer>200</integer>
3986 </array> 4188 </array>
3987 </map> 4189 </map>
4190 <key>FloaterPrimImport</key>
4191 <map>
4192 <key>Comment</key>
4193 <string>Rectangle for import/export</string>
4194 <key>Persist</key>
4195 <integer>1</integer>
4196 <key>Type</key>
4197 <string>Rect</string>
4198 <key>Value</key>
4199 <array>
4200 <integer>0</integer>
4201 <integer>25</integer>
4202 <integer>400</integer>
4203 <integer>0</integer>
4204 </array>
4205 </map>
3988 <key>FloaterRegionInfo</key> 4206 <key>FloaterRegionInfo</key>
3989 <map> 4207 <map>
3990 <key>Comment</key> 4208 <key>Comment</key>
@@ -4895,6 +5113,17 @@
4895 <key>Value</key> 5113 <key>Value</key>
4896 <real>1.0</real> 5114 <real>1.0</real>
4897 </map> 5115 </map>
5116 <key>InventorySearchType</key>
5117 <map>
5118 <key>Comment</key>
5119 <string>Controls what type of inventory search we perform.</string>
5120 <key>Persist</key>
5121 <integer>0</integer>
5122 <key>Type</key>
5123 <string>U32</string>
5124 <key>Value</key>
5125 <integer>0</integer>
5126 </map>
4898 <key>InventorySortOrder</key> 5127 <key>InventorySortOrder</key>
4899 <map> 5128 <map>
4900 <key>Comment</key> 5129 <key>Comment</key>
@@ -5451,6 +5680,17 @@
5451 <key>Value</key> 5680 <key>Value</key>
5452 <integer>0</integer> 5681 <integer>0</integer>
5453 </map> 5682 </map>
5683 <key>LoggedIntoOpenSim</key>
5684 <map>
5685 <key>Comment</key>
5686 <string>Check whether or not we're in an OpenSimulator (default 0)</string>
5687 <key>Persist</key>
5688 <integer>1</integer>
5689 <key>Type</key>
5690 <string>Boolean</string>
5691 <key>Value</key>
5692 <integer>0</integer>
5693 </map>
5454 <key>LoginAsGod</key> 5694 <key>LoginAsGod</key>
5455 <map> 5695 <map>
5456 <key>Comment</key> 5696 <key>Comment</key>
@@ -5528,6 +5768,17 @@
5528 <key>Value</key> 5768 <key>Value</key>
5529 <real>128.0</real> 5769 <real>128.0</real>
5530 </map> 5770 </map>
5771 <key>MapShowAgentCount</key>
5772 <map>
5773 <key>Comment</key>
5774 <string>Show number of agents next to region names on world map</string>
5775 <key>Persist</key>
5776 <integer>1</integer>
5777 <key>Type</key>
5778 <string>Boolean</string>
5779 <key>Value</key>
5780 <integer>1</integer>
5781 </map>
5531 <key>MapShowEvents</key> 5782 <key>MapShowEvents</key>
5532 <map> 5783 <map>
5533 <key>Comment</key> 5784 <key>Comment</key>
@@ -5748,6 +5999,28 @@
5748 <key>Value</key> 5999 <key>Value</key>
5749 <integer>1</integer> 6000 <integer>1</integer>
5750 </map> 6001 </map>
6002 <key>MiniMapNotifyChatRange</key>
6003 <map>
6004 <key>Comment</key>
6005 <string>Notify when avatars enter chat range</string>
6006 <key>Persist</key>
6007 <integer>1</integer>
6008 <key>Type</key>
6009 <string>Boolean</string>
6010 <key>Value</key>
6011 <integer>1</integer>
6012 </map>
6013 <key>MiniMapNotifySimRange</key>
6014 <map>
6015 <key>Comment</key>
6016 <string>Notify when avatars enters the current sim</string>
6017 <key>Persist</key>
6018 <integer>1</integer>
6019 <key>Type</key>
6020 <string>Boolean</string>
6021 <key>Value</key>
6022 <integer>0</integer>
6023 </map>
5751 <key>MiniMapPrimMaxRadius</key> 6024 <key>MiniMapPrimMaxRadius</key>
5752 <map> 6025 <map>
5753 <key>Comment</key> 6026 <key>Comment</key>
@@ -5784,7 +6057,7 @@
5784 <key>MiniMapScale</key> 6057 <key>MiniMapScale</key>
5785 <map> 6058 <map>
5786 <key>Comment</key> 6059 <key>Comment</key>
5787 <string>Miniature world map zoom levle (pixels per region)</string> 6060 <string>Miniature world map zoom level (pixels per region)</string>
5788 <key>Persist</key> 6061 <key>Persist</key>
5789 <integer>1</integer> 6062 <integer>1</integer>
5790 <key>Type</key> 6063 <key>Type</key>
@@ -5976,7 +6249,7 @@
5976 <key>Type</key> 6249 <key>Type</key>
5977 <string>F32</string> 6250 <string>F32</string>
5978 <key>Value</key> 6251 <key>Value</key>
5979 <integer>20</integer> 6252 <integer>96</integer>
5980 </map> 6253 </map>
5981 <key>NextOwnerCopy</key> 6254 <key>NextOwnerCopy</key>
5982 <map> 6255 <map>
@@ -6186,6 +6459,22 @@
6186 <real>1</real> 6459 <real>1</real>
6187 </array> 6460 </array>
6188 </map> 6461 </map>
6462 <key>ObjectIMColor</key>
6463 <map>
6464 <key>Comment</key>
6465 <string>Color of IMs from objects</string>
6466 <key>Persist</key>
6467 <integer>1</integer>
6468 <key>Type</key>
6469 <string>Color4</string>
6470 <key>Value</key>
6471 <array>
6472 <real>0.699999988079</real>
6473 <real>0.899999976158</real>
6474 <real>0.699999988079</real>
6475 <real>1</real>
6476 </array>
6477 </map>
6189 <key>OpenDebugStatAdvanced</key> 6478 <key>OpenDebugStatAdvanced</key>
6190 <map> 6479 <map>
6191 <key>Comment</key> 6480 <key>Comment</key>
@@ -6356,6 +6645,17 @@
6356 <key>Value</key> 6645 <key>Value</key>
6357 <integer>0</integer> 6646 <integer>0</integer>
6358 </map> 6647 </map>
6648 <key>ParticleChat</key>
6649 <map>
6650 <key>Comment</key>
6651 <string>Chat target of effect beam to channel 9000</string>
6652 <key>Persist</key>
6653 <integer>1</integer>
6654 <key>Type</key>
6655 <string>Boolean</string>
6656 <key>Value</key>
6657 <integer>1</integer>
6658 </map>
6359 <key>PerAccountSettingsFile</key> 6659 <key>PerAccountSettingsFile</key>
6360 <map> 6660 <map>
6361 <key>Comment</key> 6661 <key>Comment</key>
@@ -6513,7 +6813,7 @@
6513 <key>Type</key> 6813 <key>Type</key>
6514 <string>U32</string> 6814 <string>U32</string>
6515 <key>Value</key> 6815 <key>Value</key>
6516 <integer>13</integer> 6816 <integer>13</integer>
6517 </map> 6817 </map>
6518 <key>PreviewAnimRect</key> 6818 <key>PreviewAnimRect</key>
6519 <map> 6819 <map>
@@ -8811,6 +9111,17 @@
8811 <key>Value</key> 9111 <key>Value</key>
8812 <integer>0</integer> 9112 <integer>0</integer>
8813 </map> 9113 </map>
9114 <key>ShowStreamTitle</key>
9115 <map>
9116 <key>Comment</key>
9117 <string>Show the title of the song playing on the parcel's stream</string>
9118 <key>Persist</key>
9119 <integer>1</integer>
9120 <key>Type</key>
9121 <string>Boolean</string>
9122 <key>Value</key>
9123 <integer>1</integer>
9124 </map>
8814 <key>ShowTangentBasis</key> 9125 <key>ShowTangentBasis</key>
8815 <map> 9126 <map>
8816 <key>Comment</key> 9127 <key>Comment</key>
@@ -8877,6 +9188,17 @@
8877 <key>Value</key> 9188 <key>Value</key>
8878 <integer>0</integer> 9189 <integer>0</integer>
8879 </map> 9190 </map>
9191 <key>ShowWindlightSettingsPopup</key>
9192 <map>
9193 <key>Comment</key>
9194 <string>Show environment settings popup</string>
9195 <key>Persist</key>
9196 <integer>1</integer>
9197 <key>Type</key>
9198 <string>Boolean</string>
9199 <key>Value</key>
9200 <integer>0</integer>
9201 </map>
8880 <key>ShowWorldMap</key> 9202 <key>ShowWorldMap</key>
8881 <map> 9203 <map>
8882 <key>Comment</key> 9204 <key>Comment</key>
@@ -9126,6 +9448,28 @@
9126 <key>Value</key> 9448 <key>Value</key>
9127 <integer>0</integer> 9449 <integer>0</integer>
9128 </map> 9450 </map>
9451 <key>SpamCount</key>
9452 <map>
9453 <key>Comment</key>
9454 <string>Number of items spammed per time set in SpamTime. RECOMMENDED IS 4.000</string>
9455 <key>Persist</key>
9456 <integer>1</integer>
9457 <key>Type</key>
9458 <string>F32</string>
9459 <key>Value</key>
9460 <real>4.0</real>
9461 </map>
9462 <key>SpamTime</key>
9463 <map>
9464 <key>Comment</key>
9465 <string>Time of Evalulating spam. RECOMMENDED NUMBER IS 1.000</string>
9466 <key>Persist</key>
9467 <integer>1</integer>
9468 <key>Type</key>
9469 <string>F32</string>
9470 <key>Value</key>
9471 <real>1.0</real>
9472 </map>
9129 <key>SpeakingColor</key> 9473 <key>SpeakingColor</key>
9130 <map> 9474 <map>
9131 <key>Comment</key> 9475 <key>Comment</key>
@@ -9381,7 +9725,7 @@
9381 <key>Type</key> 9725 <key>Type</key>
9382 <string>F32</string> 9726 <string>F32</string>
9383 <key>Value</key> 9727 <key>Value</key>
9384 <real>500.0</real> 9728 <real>1000.0</real>
9385 </map> 9729 </map>
9386 <key>ToolHelpRect</key> 9730 <key>ToolHelpRect</key>
9387 <map> 9731 <map>
@@ -11219,6 +11563,17 @@
11219 <key>Value</key> 11563 <key>Value</key>
11220 <integer>0</integer> 11564 <integer>0</integer>
11221 </map> 11565 </map>
11566 <key>VerticalIMTabs</key>
11567 <map>
11568 <key>Comment</key>
11569 <string>Enable vertical layout for IM tabs</string>
11570 <key>Persist</key>
11571 <integer>1</integer>
11572 <key>Type</key>
11573 <string>Boolean</string>
11574 <key>Value</key>
11575 <integer>0</integer>
11576 </map>
11222 <key>VivoxAutoPostCrashDumps</key> 11577 <key>VivoxAutoPostCrashDumps</key>
11223 <map> 11578 <map>
11224 <key>Comment</key> 11579 <key>Comment</key>
@@ -11626,6 +11981,17 @@
11626 <key>Value</key> 11981 <key>Value</key>
11627 <integer>1</integer> 11982 <integer>1</integer>
11628 </map> 11983 </map>
11984 <key>WarnFirstMiniMap</key>
11985 <map>
11986 <key>Comment</key>
11987 <string>Enables FirstMiniMap warning dialog</string>
11988 <key>Persist</key>
11989 <integer>1</integer>
11990 <key>Type</key>
11991 <string>Boolean</string>
11992 <key>Value</key>
11993 <integer>1</integer>
11994 </map>
11629 <key>WarnFirstOverrideKeys</key> 11995 <key>WarnFirstOverrideKeys</key>
11630 <map> 11996 <map>
11631 <key>Comment</key> 11997 <key>Comment</key>
@@ -12016,5 +12382,38 @@
12016 <key>Value</key> 12382 <key>Value</key>
12017 <integer>0</integer> 12383 <integer>0</integer>
12018 </map> 12384 </map>
12385 <key>DefaultGrid</key>
12386 <map>
12387 <key>Comment</key>
12388 <string>Nickname of the default grid</string>
12389 <key>Persist</key>
12390 <integer>1</integer>
12391 <key>Type</key>
12392 <string>String</string>
12393 <key>Value</key>
12394 <string>secondlife</string>
12395 </map>
12396 <key>KeepAppearance</key>
12397 <map>
12398 <key>Comment</key>
12399 <string>Keep appearance across grid teleport</string>
12400 <key>Persist</key>
12401 <integer>1</integer>
12402 <key>Type</key>
12403 <string>Boolean</string>
12404 <key>Value</key>
12405 <string>0</string>
12406 </map>
12407 <key>CheckForGridUpdates</key>
12408 <map>
12409 <key>Comment</key>
12410 <string>Check for grid info updates on the web server</string>
12411 <key>Persist</key>
12412 <integer>1</integer>
12413 <key>Type</key>
12414 <string>Boolean</string>
12415 <key>Value</key>
12416 <integer>1</integer>
12417 </map>
12019 </map> 12418 </map>
12020</llsd> 12419</llsd>
diff --git a/linden/indra/newview/app_settings/settings_per_account.xml b/linden/indra/newview/app_settings/settings_per_account.xml
index 90c7b11..59caac4 100644
--- a/linden/indra/newview/app_settings/settings_per_account.xml
+++ b/linden/indra/newview/app_settings/settings_per_account.xml
@@ -1,6 +1,17 @@
1<llsd> 1<llsd>
2 <map> 2 <map>
3 <key>BusyModeResponse</key> 3 <key>RLVaLoginLastLocation</key>
4 <map>
5 <key>Comment</key>
6 <string>Determines whether the next login will be forced to the last logoff location (set by the viewer)</string>
7 <key>Persist</key>
8 <integer>1</integer>
9 <key>Type</key>
10 <string>Boolean</string>
11 <key>Value</key>
12 <integer>1</integer>
13 </map>
14 <key>BusyModeResponse</key>
4 <map> 15 <map>
5 <key>Comment</key> 16 <key>Comment</key>
6 <string>Auto response to instant messages while in busy mode.</string> 17 <string>Auto response to instant messages while in busy mode.</string>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default1.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default1.xml
new file mode 100644
index 0000000..a9d0f0e
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default1.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.0384939114611456</real>
6 <real>0.95795135955843591</real>
7 <real>0.95795135955843591</real>
8 <real>0.60696905358246056</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.20658362946772124</real>
13 <real>0.43003502308076946</real>
14 <real>0.77534221609780829</real>
15 <real>0.61779229342937469</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.34674560611608651</real>
20 <real>0.38732792231055679</real>
21 <real>0.49042100459337234</real>
22 <real>0.58080440759658813</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.33948845342081757</real>
27 <real>0.33948845342081757</real>
28 <real>0.33948845342081757</real>
29 <real>0.6362861692905426</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1.6884100437164307</real>
34 <real>0.52609699964523315</real>
35 <real>0.95397572096092276</real>
36 <real>1.0000000298023224</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>1.6884100437164307</real>
41 <real>0.52609699964523315</real>
42 <real>0.1250000037252903</real>
43 <real>1.0000000298023224</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998722208165</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1.0000000298023224</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.314831098603321</real>
55 <real>10.011000171161356</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.26999998092651367</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1.0000000298023224</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.0002873900482277883</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1.0000000298023224</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>0.87670719623565674</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1.0000000298023224</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0000000298023224</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1.0000000298023224</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5.0000001490116119</real>
95 <real>0.0010000000917914607</real>
96 <real>-0.48000001257440683</real>
97 <real>1.0000000298023224</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.70000002224998603</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1.0000000298023224</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.1784939272396473</real>
109 <real>0.1991560042470284</real>
110 <real>0.1991560042470284</real>
111 <real>1.0000000298023224</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0</real>
116 <real>0.49086946249008179</real>
117 <real>-0.87123316526412964</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1205.163865879178</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1.0000000298023224</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>2.6285052299499512</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.5413080077610317</real>
136 <real>1.5705089192829433</real>
137 <real>1.6435112576923672</real>
138 <real>0.56847512722015381</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default2.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default2.xml
new file mode 100644
index 0000000..5367387
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default2.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.0499999505996698</real>
6 <real>1.0499999505996698</real>
7 <real>1.0499999505996698</real>
8 <real>0.34999999382495872</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.24475815546304436</real>
13 <real>0.44872327986443139</real>
14 <real>0.759999978199005</real>
15 <real>0.38000001338005091</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.49548382238803412</real>
20 <real>0.49548381855426504</real>
21 <real>0.64000000093460097</real>
22 <real>0.32000000046730048</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.40999999671936077</real>
27 <real>0.40999999671936077</real>
28 <real>0.40999999671936077</real>
29 <real>0.40999999671936077</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1.6884100437164307</real>
34 <real>0.52609699964523315</real>
35 <real>0.99999999999999623</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>1.6884100437164307</real>
41 <real>0.52609699964523315</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999999237537178</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.200000040817258</real>
55 <real>10.010999893335338</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.26999998092651367</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00017999998592350524</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>0.80000001235008633</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5</real>
95 <real>0.0010000000503715134</real>
96 <real>-0.47999998292446122</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.69999998764991744</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.18999999454975031</real>
109 <real>0.19915600071018602</real>
110 <real>0.19915600071018602</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0</real>
116 <real>0.91269153356552124</real>
117 <real>-0.40864923596382141</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1604.9999921321869</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>1.9917699098587036</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.73421055009741187</real>
136 <real>0.78157896155557771</real>
137 <real>0.89999997529983111</real>
138 <real>0.29999998147487428</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default3.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default3.xml
new file mode 100644
index 0000000..5185175
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20default3.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.0499999460917593</real>
6 <real>1.0499999460917593</real>
7 <real>1.0499999460917593</real>
8 <real>0.34999999512411506</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.2447581519847149</real>
13 <real>0.44872328351986113</real>
14 <real>0.75999999517881633</real>
15 <real>0.38000003464613324</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.49548381839263711</real>
20 <real>0.49548381254157786</real>
21 <real>0.63999999116870609</real>
22 <real>0.31999999558435305</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.40999999615399413</real>
27 <real>0.40999999615399413</real>
28 <real>0.40999999615399413</real>
29 <real>0.40999999615399413</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1.6884100437164307</real>
34 <real>0.52609699964523315</real>
35 <real>0.99999999999999423</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>1.6884100437164307</real>
41 <real>0.52609699964523315</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998778293413</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.199999843971682</real>
55 <real>10.010999677075688</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.26999998092651367</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00017999998844229546</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>0.80000000975177565</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5</real>
95 <real>0.0010000000429292444</real>
96 <real>-0.47999999271352323</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.69999999024823012</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.18999999879470264</real>
109 <real>0.19915600203784933</real>
110 <real>0.19915600203784933</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0</real>
116 <real>0.80060893297195435</real>
117 <real>-0.59918725490570068</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1604.9999940395355</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>2.2132818698883057</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.73421055652810585</real>
136 <real>0.78157895060378157</real>
137 <real>0.89999998049645447</real>
138 <real>0.29999998164705199</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20neutral.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20neutral.xml
new file mode 100644
index 0000000..e0cdfb1
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20neutral.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.89999997615814209</real>
6 <real>0.89999997615814209</real>
7 <real>0.89999997615814209</real>
8 <real>0.29999998211860657</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.91235297918319702</real>
13 <real>0.93999999761581421</real>
14 <real>0.88470596075057983</real>
15 <real>0.4699999988079071</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.68000000715255737</real>
20 <real>0.93999999761581421</real>
21 <real>1.4399999380111694</real>
22 <real>1.4399999380111694</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.30162510275840759</real>
27 <real>0.30162510275840759</real>
28 <real>0.30162510275840759</real>
29 <real>0.75779753923416138</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1.6884100437164307</real>
34 <real>0.52609699964523315</real>
35 <real>0.92926150560379028</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>1.6884100437164307</real>
41 <real>0.52609699964523315</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998688697815</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.376492500305176</real>
55 <real>10.01099967956543</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.26999998092651367</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00013000000035390258</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>0.69999998807907104</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.5499999523162842</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>15.799999237060547</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.64999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.96999996900558472</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0</real>
116 <real>0.49818512797355652</real>
117 <real>0.86707067489624023</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>295</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0.52150440216064453</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.32999998331069946</real>
136 <real>0.26999998092651367</real>
137 <real>0.26999998092651367</real>
138 <real>0.51999998092651367</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city%20weirdlights.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city%20weirdlights.xml
new file mode 100644
index 0000000..c2daa99
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city%20weirdlights.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.71999996900558472</real>
6 <real>0.71999996900558472</real>
7 <real>0.71999996900558472</real>
8 <real>0.23999999463558197</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0</real>
13 <real>0</real>
14 <real>0</real>
15 <real>0</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0</real>
20 <real>0</real>
21 <real>0.43999999761581421</real>
22 <real>0.2199999988079071</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.14000000059604645</real>
27 <real>0.14000000059604645</real>
28 <real>0.14000000059604645</real>
29 <real>0.14000000059604645</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.74000000953674316</real>
34 <real>0.93999999761581421</real>
35 <real>0.20999999344348907</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.65999996662139893</real>
41 <real>0.52999997138977051</real>
42 <real>0.0099999997764825821</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.070000000298023224</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>18</real>
55 <real>20</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.34000000357627869</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00018000000272877514</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>6.7000002861022949</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.5185837745666504</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0399999618530273</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>17.399999618530273</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.64999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.34999999403953552</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.17000000178813934</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.36812454462051392</real>
116 <real>1.7484555314695172e-007</real>
117 <real>-0.92977648973464966</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>263</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>24</integer>
129 <key>star_brightness</key>
130 <real>1.0399999618530273</real>
131 <key>sun_angle</key>
132 <real>6.2831854820251465</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.5899999141693115</real>
136 <real>1.5899999141693115</real>
137 <real>1.5899999141693115</real>
138 <real>1.5899999141693115</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city.xml
new file mode 100644
index 0000000..0728f66
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20city.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.71999996900558472</real>
6 <real>0.71999996900558472</real>
7 <real>0.71999996900558472</real>
8 <real>0.23999999463558197</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0</real>
13 <real>0</real>
14 <real>0</real>
15 <real>0</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0</real>
20 <real>0</real>
21 <real>0.43999999761581421</real>
22 <real>0.2199999988079071</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.14000000059604645</real>
27 <real>0.14000000059604645</real>
28 <real>0.14000000059604645</real>
29 <real>0.14000000059604645</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.74000000953674316</real>
34 <real>0.93999999761581421</real>
35 <real>0.20999999344348907</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.65999996662139893</real>
41 <real>0.52999997138977051</real>
42 <real>0.0099999997764825821</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.070000000298023224</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>18</real>
55 <real>20</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.34000000357627869</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00018000000272877514</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>6.7000002861022949</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.5185837745666504</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0399999618530273</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>17.399999618530273</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.64999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.34999999403953552</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.17000000178813934</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.36776852607727051</real>
116 <real>0.043968122452497482</real>
117 <real>-0.92887729406356812</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>263</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>24</integer>
129 <key>star_brightness</key>
130 <real>1.0399999618530273</real>
131 <key>sun_angle</key>
132 <real>0.043982300907373428</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.5899999141693115</real>
136 <real>1.5899999141693115</real>
137 <real>1.5899999141693115</real>
138 <real>1.5899999141693115</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20night.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20night.xml
new file mode 100644
index 0000000..2f5cfb8
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor%20night.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0</real>
6 <real>0</real>
7 <real>0</real>
8 <real>0</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.13997539444089213</real>
13 <real>0.38665792478461469</real>
14 <real>0.77332294252195766</real>
15 <real>0.95108884837904384</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0</real>
20 <real>0.22876684367656708</real>
21 <real>0.290018230676651</real>
22 <real>0.31999999284744263</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.25999999046325684</real>
27 <real>0.28883209824562073</real>
28 <real>0.28994369506835938</real>
29 <real>0.28999999165534973</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.17999999225139618</real>
34 <real>0.50999999046325684</real>
35 <real>0.91999995708465576</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0.079999998211860657</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.25</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.436104517528292</real>
55 <real>10</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.0002899999963119626</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>1.3000000715255737</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>2.2619466781616211</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.5399999618530273</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>20</real>
95 <real>0.0010000000474974513</real>
96 <real>0</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.12999999523162842</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.14999999105930328</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.024202039465308189</real>
116 <real>0.99950659275054932</real>
117 <real>-0.020021669566631317</real>
118 <real>1</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>394.39999389648437</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>2</real>
131 <key>sun_angle</key>
132 <real>4.6809735298156738</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.98999994993209839</real>
136 <real>0.95999997854232788</real>
137 <real>0.95999997854232788</real>
138 <real>1.0799999237060547</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor2.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor2.xml
new file mode 100644
index 0000000..c2e5792
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20outdoor2.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.0384939114611456</real>
6 <real>0.95795135955843591</real>
7 <real>0.95795135955843591</real>
8 <real>0.60696905358246056</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.20658362946772124</real>
13 <real>0.43003502308076946</real>
14 <real>0.77534221609780829</real>
15 <real>0.61779229342937469</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.34674560611608651</real>
20 <real>0.38732792231055679</real>
21 <real>0.49042100459337234</real>
22 <real>0.58080440759658813</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.33948845342081757</real>
27 <real>0.33948845342081757</real>
28 <real>0.33948845342081757</real>
29 <real>0.6362861692905426</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1.6884100437164307</real>
34 <real>0.52609699964523315</real>
35 <real>0.95397572096092276</real>
36 <real>1.0000000298023224</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>1.6884100437164307</real>
41 <real>0.52609699964523315</real>
42 <real>0.1250000037252903</real>
43 <real>1.0000000298023224</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998722208165</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1.0000000298023224</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.314831098603321</real>
55 <real>10.011000171161356</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.26999998092651367</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1.0000000298023224</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.0002873900482277883</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1.0000000298023224</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>0.87670719623565674</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1.0000000298023224</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.1415927410125732</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0000000298023224</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1.0000000298023224</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5.0000001490116119</real>
95 <real>0.0010000000917914607</real>
96 <real>-0.48000001257440683</real>
97 <real>1.0000000298023224</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.70000002224998603</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1.0000000298023224</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.1784939272396473</real>
109 <real>0.1991560042470284</real>
110 <real>0.1991560042470284</real>
111 <real>1.0000000298023224</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>8.7422776573475858e-008</real>
116 <real>0</real>
117 <real>-1</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1205.163865879178</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1.0000000298023224</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.5413080077610317</real>
136 <real>1.5705089192829433</real>
137 <real>1.6435112576923672</real>
138 <real>0.56847512722015381</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20shadows.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20shadows.xml
new file mode 100644
index 0000000..01d06a1
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20shadows.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.2226010262966156</real>
6 <real>0.26450860500335693</real>
7 <real>0.35999998450279236</real>
8 <real>0.11999999731779099</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.14522500336170197</real>
13 <real>0.39999699592590332</real>
14 <real>0.80000197887420654</real>
15 <real>1</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.15130999684333801</real>
20 <real>0.30000001192092896</real>
21 <real>0.35131001472473145</real>
22 <real>1</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.12862999737262726</real>
27 <real>0.12862999737262726</real>
28 <real>0.12862999737262726</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.88419097661972046</real>
34 <real>0.53047597408294678</real>
35 <real>0.4270470142364502</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.38419300317764282</real>
41 <real>0.5</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998688697815</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10</real>
55 <real>10</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.0001250890054507181</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>11.40000057220459</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>1.8849555253982544</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.7300000190734863</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>0.19999980926513672</real>
95 <real>0.0012815999798476696</real>
96 <real>0</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>1.6499999761581421</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.14999999105930328</real>
109 <real>0.21744099259376526</real>
110 <real>0.21744099259376526</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.95105654001235962</real>
116 <real>0</real>
117 <real>-0.30901694297790527</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>4000</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>2</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>3</real>
136 <real>3</real>
137 <real>3</real>
138 <real>1</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio1.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio1.xml
new file mode 100644
index 0000000..ca448d0
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio1.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.51940256357192993</real>
6 <real>0.61718720197677612</real>
7 <real>0.84000003337860107</real>
8 <real>0.2800000011920929</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.14522500336170197</real>
13 <real>0.39999699592590332</real>
14 <real>0.80000197887420654</real>
15 <real>1</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.15130999684333801</real>
20 <real>0.30000001192092896</real>
21 <real>0.35131001472473145</real>
22 <real>1</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.12862999737262726</real>
27 <real>0.12862999737262726</real>
28 <real>0.12862999737262726</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.88419097661972046</real>
34 <real>0.53047597408294678</real>
35 <real>0.4270470142364502</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.38419300317764282</real>
41 <real>0.5</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998688697815</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10</real>
55 <real>10</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.59999996423721313</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>7.9999997979030013e-005</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>11.40000057220459</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0099999904632568</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>6.4079799652099609</real>
95 <real>0.0012815999798476696</real>
96 <real>-0.42292699217796326</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>4</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.21744099259376526</real>
109 <real>0.21744099259376526</real>
110 <real>0.21744099259376526</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0</real>
116 <real>0.21200713515281677</real>
117 <real>0.97726809978485107</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>4000</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>2</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0.21362832188606262</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>3</real>
136 <real>3</real>
137 <real>3</real>
138 <real>1</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio2.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio2.xml
new file mode 100644
index 0000000..fc32f29
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio2.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.80999994277954102</real>
6 <real>0.6044776439666748</real>
7 <real>0.6044776439666748</real>
8 <real>0.26999998092651367</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.63999998569488525</real>
13 <real>1.1799999475479126</real>
14 <real>2</real>
15 <real>2</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.23999999463558197</real>
20 <real>0.23999999463558197</real>
21 <real>0.31999999284744263</real>
22 <real>0.31999999284744263</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.12862999737262726</real>
27 <real>0.12862999737262726</real>
28 <real>0.12862999737262726</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.88419097661972046</real>
34 <real>0.53047597408294678</real>
35 <real>0.4270470142364502</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.38419300317764282</real>
41 <real>0.5</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998688697815</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10</real>
55 <real>10</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.12999999523162842</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00017999998817685992</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>2</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>1.0053097009658813</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0799999237060547</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5</real>
95 <real>0.0012815999798476696</real>
96 <real>-0.49999997019767761</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.64999997615814209</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.08999999612569809</real>
109 <real>0.21744099259376526</real>
110 <real>0.21744099259376526</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.84432792663574219</real>
116 <real>0</real>
117 <real>0.53582674264907837</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>188</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>2</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.5799999237060547</real>
136 <real>2.5799999237060547</real>
137 <real>2.5799999237060547</real>
138 <real>2.5799999237060547</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio3.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio3.xml
new file mode 100644
index 0000000..af5676b
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio3.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.71999996900558472</real>
6 <real>0.53731358051300049</real>
7 <real>0.53731358051300049</real>
8 <real>0.23999999463558197</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.47999998927116394</real>
13 <real>1.1799999475479126</real>
14 <real>2</real>
15 <real>2</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.23999999463558197</real>
20 <real>0.23999999463558197</real>
21 <real>0.31999999284744263</real>
22 <real>0.31999999284744263</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.12862999737262726</real>
27 <real>0.12862999737262726</real>
28 <real>0.12862999737262726</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.88419097661972046</real>
34 <real>0.53047597408294678</real>
35 <real>0.4270470142364502</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.38419300317764282</real>
41 <real>0.5</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998688697815</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10</real>
55 <real>10</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.12999999523162842</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00017999998817685992</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>2</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.2200000286102295</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>4.8000001907348633</real>
95 <real>0.0012815999798476696</real>
96 <real>-0.44999998807907104</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>1</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.08999999612569809</real>
109 <real>0.21744099259376526</real>
110 <real>0.21744099259376526</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0</real>
116 <real>0.32094338536262512</real>
117 <real>-0.94709837436676025</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>188</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>2</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>2.8148672580718994</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.5799999237060547</real>
136 <real>2.5799999237060547</real>
137 <real>2.5799999237060547</real>
138 <real>2.5799999237060547</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio4.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio4.xml
new file mode 100644
index 0000000..c2e5792
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio4.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.0384939114611456</real>
6 <real>0.95795135955843591</real>
7 <real>0.95795135955843591</real>
8 <real>0.60696905358246056</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.20658362946772124</real>
13 <real>0.43003502308076946</real>
14 <real>0.77534221609780829</real>
15 <real>0.61779229342937469</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.34674560611608651</real>
20 <real>0.38732792231055679</real>
21 <real>0.49042100459337234</real>
22 <real>0.58080440759658813</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.33948845342081757</real>
27 <real>0.33948845342081757</real>
28 <real>0.33948845342081757</real>
29 <real>0.6362861692905426</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1.6884100437164307</real>
34 <real>0.52609699964523315</real>
35 <real>0.95397572096092276</real>
36 <real>1.0000000298023224</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>1.6884100437164307</real>
41 <real>0.52609699964523315</real>
42 <real>0.1250000037252903</real>
43 <real>1.0000000298023224</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998722208165</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1.0000000298023224</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.314831098603321</real>
55 <real>10.011000171161356</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.26999998092651367</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1.0000000298023224</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.0002873900482277883</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1.0000000298023224</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>0.87670719623565674</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1.0000000298023224</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.1415927410125732</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0000000298023224</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1.0000000298023224</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5.0000001490116119</real>
95 <real>0.0010000000917914607</real>
96 <real>-0.48000001257440683</real>
97 <real>1.0000000298023224</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.70000002224998603</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1.0000000298023224</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.1784939272396473</real>
109 <real>0.1991560042470284</real>
110 <real>0.1991560042470284</real>
111 <real>1.0000000298023224</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>8.7422776573475858e-008</real>
116 <real>0</real>
117 <real>-1</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1205.163865879178</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1.0000000298023224</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.5413080077610317</real>
136 <real>1.5705089192829433</real>
137 <real>1.6435112576923672</real>
138 <real>0.56847512722015381</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio5.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio5.xml
new file mode 100644
index 0000000..fde46ae
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio5.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>2.0099997520446777</real>
6 <real>1.9199999570846558</real>
7 <real>1.8899999856948853</real>
8 <real>2.0099997520446777</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.63999998569488525</real>
13 <real>1.1799999475479126</real>
14 <real>2</real>
15 <real>2</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.23999999463558197</real>
20 <real>0.23999999463558197</real>
21 <real>0.31999999284744263</real>
22 <real>0.31999999284744263</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.39050509865536398</real>
27 <real>0.39050509865536398</real>
28 <real>0.39050509865536398</real>
29 <real>0.39050509865536398</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1.6884100437164307</real>
34 <real>0.52609699964523315</real>
35 <real>1</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>1.6884100437164307</real>
41 <real>0.52609699964523315</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998254906856</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.199999735331062</real>
55 <real>10.010999579794088</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.12999999523162842</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00017999998391111764</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>2</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.1499999761581421</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>4.9999998807907104</real>
95 <real>0.0010000000478643939</real>
96 <real>-0.47999998436731417</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.64999997615814209</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.08999999612569809</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0</real>
116 <real>0</real>
117 <real>1</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>188</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.5799999237060547</real>
136 <real>2.5799999237060547</real>
137 <real>2.5799999237060547</real>
138 <real>2.5799999237060547</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio6.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio6.xml
new file mode 100644
index 0000000..f18cc75
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio6.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.5299999713897705</real>
6 <real>1.5299999713897705</real>
7 <real>1.5299999713897705</real>
8 <real>0.50999999046325684</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.72533315420150757</real>
13 <real>0.995555579662323</real>
14 <real>1.2799999713897705</real>
15 <real>0.63999998569488525</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.19999998807907104</real>
20 <real>0.2199999988079071</real>
21 <real>0.23999999463558197</real>
22 <real>0.23999999463558197</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.39999997615814209</real>
27 <real>0.40999999642372131</real>
28 <real>0.40999999642372131</real>
29 <real>0.40999999642372131</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1</real>
34 <real>1</real>
35 <real>0.29999998211860657</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.29999998211860657</real>
41 <real>0.29999998211860657</real>
42 <real>0.08999999612569809</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.69999998807907104</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.069999776780605</real>
55 <real>10.069999776780605</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00011000000085914508</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>15.5</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0099999904632568</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>12</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.89999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.26999998092651367</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0</real>
116 <real>0.95105654001235962</real>
117 <real>0.30901697278022766</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>913</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>1.2566370964050293</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.17999999225139618</real>
136 <real>0.17999999225139618</real>
137 <real>0.17999999225139618</real>
138 <real>0.059999998658895493</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio7.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio7.xml
new file mode 100644
index 0000000..05deb2e
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio7.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.5299999713897705</real>
6 <real>1.5299999713897705</real>
7 <real>1.5299999713897705</real>
8 <real>0.50999999046325684</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.72533315420150757</real>
13 <real>0.995555579662323</real>
14 <real>1.2799999713897705</real>
15 <real>0.63999998569488525</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.19999998807907104</real>
20 <real>0.2199999988079071</real>
21 <real>0.23999999463558197</real>
22 <real>0.23999999463558197</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.39999997615814209</real>
27 <real>0.40999999642372131</real>
28 <real>0.40999999642372131</real>
29 <real>0.40999999642372131</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1</real>
34 <real>1</real>
35 <real>0.29999998211860657</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.29999998211860657</real>
41 <real>0.29999998211860657</real>
42 <real>0.08999999612569809</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.69999998807907104</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.069999776780605</real>
55 <real>10.069999776780605</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00011000000085914508</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>15.5</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.2200000286102295</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>11.80000114440918</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.89999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.26999998092651367</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0</real>
116 <real>0.95105654001235962</real>
117 <real>0.30901697278022766</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>913</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>1.2566370964050293</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.23999999463558197</real>
136 <real>0.23999999463558197</real>
137 <real>0.23999999463558197</real>
138 <real>0.079999998211860657</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio8.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio8.xml
new file mode 100644
index 0000000..0fff0a1
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio8.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.1100000143051147</real>
6 <real>1.1100000143051147</real>
7 <real>1.1100000143051147</real>
8 <real>0.37000000476837158</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.72533315420150757</real>
13 <real>0.995555579662323</real>
14 <real>1.2799999713897705</real>
15 <real>0.63999998569488525</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.19999998807907104</real>
20 <real>0.2199999988079071</real>
21 <real>0.23999999463558197</real>
22 <real>0.23999999463558197</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.39999997615814209</real>
27 <real>0.40999999642372131</real>
28 <real>0.40999999642372131</real>
29 <real>0.40999999642372131</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1</real>
34 <real>1</real>
35 <real>0.29999998211860657</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.29999998211860657</real>
41 <real>0.29999998211860657</real>
42 <real>0.08999999612569809</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.69999998807907104</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.069999776780605</real>
55 <real>10.069999776780605</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00011000000085914508</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>15.5</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.8199999332427979</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>12</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.89999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.26999998092651367</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0</real>
116 <real>0.97452688217163086</real>
117 <real>0.22427067160606384</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>913</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>1.3446017503738403</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.23999999463558197</real>
136 <real>0.23999999463558197</real>
137 <real>0.23999999463558197</real>
138 <real>0.079999998211860657</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio9.xml b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio9.xml
new file mode 100644
index 0000000..198ff7e
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%2EAnaLu%2E%20studio9.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.0799999237060547</real>
6 <real>1.0799999237060547</real>
7 <real>1.0799999237060547</real>
8 <real>0.35999998450279236</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.72533315420150757</real>
13 <real>0.995555579662323</real>
14 <real>1.2799999713897705</real>
15 <real>0.63999998569488525</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.19999998807907104</real>
20 <real>0.2199999988079071</real>
21 <real>0.23999999463558197</real>
22 <real>0.23999999463558197</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.39999997615814209</real>
27 <real>0.40999999642372131</real>
28 <real>0.40999999642372131</real>
29 <real>0.40999999642372131</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1</real>
34 <real>1</real>
35 <real>0.29999998211860657</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.29999998211860657</real>
41 <real>0.29999998211860657</real>
42 <real>0.08999999612569809</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.69999998807907104</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.069999776780605</real>
55 <real>10.069999776780605</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00011000000085914508</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>15.5</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.2200000286102295</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>12</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.89999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.26999998092651367</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0</real>
116 <real>0.84094464778900146</real>
117 <real>0.54112118482589722</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>913</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0.99902653694152832</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.65999996662139893</real>
136 <real>0.65999996662139893</real>
137 <real>0.65999996662139893</real>
138 <real>0.2199999988079071</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%202012.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%202012.xml
new file mode 100644
index 0000000..657f423
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%202012.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>1</real><real>0.45923501253128052</real><real>0</real><real>1</real></array><key>blue_density</key><array><real>0.25613615825332658</real><real>0.41819368084009056</real><real>0.6726322016895665</real><real>1</real></array><key>blue_horizon</key><array><real>0.47774650705002841</real><real>0.80108383983144904</real><real>0.91266119477967322</real><real>0.98532241580704749</real></array><key>cloud_color</key><array><real>0.52756190160579308</real><real>0.52756190160579308</real><real>0.52756190160579308</real><real>1</real></array><key>cloud_pos_density1</key><array><real>0.72999995946884155</real><real>0.34000000357627869</real><real>0.32999998331069946</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.28999999165534973</real><real>0.84999996423721313</real><real>0.019999999552965164</real><real>1</real></array><key>cloud_scale</key><array><real>0.32999998058761548</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.499399946934318</real><real>10.010999746491507</real></array><key>cloud_shadow</key><array><real>0.34999999403953552</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>9.9999997473787516e-006</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>0.69999999890643494</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>0.9424777626991272</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.610000025154136</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>5.7999992370605469</real><real>0.0010000000474974513</real><real>-1.0499999523162842</real><real>1</real></array><key>haze_density</key><array><real>1.5557675468824073</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.33174386620521545</real><real>0.1991559842625179</real><real>0.1991559842625179</real><real>1</real></array><key>lightnorm</key><array><real>-0.76118850708007813</real><real>0.33873793482780457</real><real>0.55303585529327393</real><real>0</real></array><key>max_y</key><array><real>711.42973550362512</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0</real><key>sun_angle</key><real>0.34557521343231201</real><key>sunlight_color</key><array><real>2.3399999141693115</real><real>0.35999998450279236</real><real>0.44999998807907104</real><real>2.3399999141693115</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Alien%20planet.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Alien%20planet.xml
new file mode 100644
index 0000000..ff69e15
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Alien%20planet.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.82999998331069946</real><real>0.18999999761581421</real><real>0.20999999344348907</real><real>0.82999998331069946</real></array><key>blue_density</key><array><real>0</real><real>0.49500009417533875</real><real>0.62999999523162842</real><real>0.62999999523162842</real></array><key>blue_horizon</key><array><real>0.51675063371658325</real><real>0.34671968221664429</real><real>0.65999996662139893</real><real>0.65999996662139893</real></array><key>cloud_color</key><array><real>0.18999999761581421</real><real>0.070000000298023224</real><real>0</real><real>0.18999999761581421</real></array><key>cloud_pos_density1</key><array><real>0.68999999761581421</real><real>0.32999998331069946</real><real>0.51999998092651367</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.2199999988079071</real><real>0.84999996423721313</real><real>0.12999999523162842</real><real>1</real></array><key>cloud_scale</key><array><real>0.47999998927116394</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.453993749294909</real><real>10.026071512513319</real></array><key>cloud_shadow</key><array><real>0.28999999165534973</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>1.9999999494757503e-005</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>26.80000114440918</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>4.5867252349853516</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>0.87000000476837158</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>0.19999980926513672</real><real>0.0010000000474974513</real><real>-0.49999997019767761</real><real>1</real></array><key>haze_density</key><array><real>2.2100000381469727</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.25999999046325684</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.86939668655395508</real><real>0.48175376653671265</real><real>0.10983037948608398</real><real>0</real></array><key>max_y</key><array><real>394.39999389648437</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>1.1000000238418579</real><key>sun_angle</key><real>2.6389377117156982</real><key>sunlight_color</key><array><real>1.4399999380111694</real><real>1.8300000429153442</real><real>3</real><real>3</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20An%20incongruent%20truth.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20An%20incongruent%20truth.xml
new file mode 100644
index 0000000..a780e5d
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20An%20incongruent%20truth.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0</real><real>0</real><real>0.44999998807907104</real><real>0.44999998807907104</real></array><key>blue_density</key><array><real>0.13997539444089213</real><real>0.38665792478461469</real><real>0.77332294252195766</real><real>0.95108884837904384</real></array><key>blue_horizon</key><array><real>0</real><real>0.22876684367656708</real><real>0.290018230676651</real><real>0.31999999284744263</real></array><key>cloud_color</key><array><real>0.25999999046325684</real><real>0.28883209824562073</real><real>0.28994369506835938</real><real>0.28999999165534973</real></array><key>cloud_pos_density1</key><array><real>0.17999999225139618</real><real>0.50999999046325684</real><real>0.91999995708465576</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.5</real><real>0.5</real><real>0.079999998211860657</real><real>1</real></array><key>cloud_scale</key><array><real>0.25</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.436104517528292</real><real>10.032009389655741</real></array><key>cloud_shadow</key><array><real>0.34000000357627869</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.0002899999963119626</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>1.3000000715255737</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>2.2619466781616211</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.5399999618530273</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>4.0000009536743164</real><real>0.0010000000474974513</real><real>-0.74999994039535522</real><real>1</real></array><key>haze_density</key><array><real>0.12999999523162842</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.14999999105930328</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.74630618095397949</real><real>0.24868990480899811</real><real>-0.61739814281463623</real><real>0</real></array><key>max_y</key><array><real>394.39999389648437</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0.44999998807907104</real><key>sun_angle</key><real>0.25132742524147034</real><key>sunlight_color</key><array><real>2.6999998092651367</real><real>2.3490002155303955</real><real>1.4040002822875977</real><real>0.89999997615814209</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arid%20nestler.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arid%20nestler.xml
new file mode 100644
index 0000000..1eff3af
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arid%20nestler.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.054342277348041534</real>
6 <real>0.249813511967659</real>
7 <real>0.34000000357627869</real>
8 <real>0.34000000357627869</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.4699999988079071</real>
13 <real>0.4699999988079071</real>
14 <real>0.4699999988079071</real>
15 <real>0.4699999988079071</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.2799564003944397</real>
20 <real>0.2199999988079071</real>
21 <real>0.64999997615814209</real>
22 <real>0.64999997615814209</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.34000000357627869</real>
27 <real>0.16604645550251007</real>
28 <real>0.16918087005615234</real>
29 <real>0.34000000357627869</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.26999998092651367</real>
34 <real>0.099999994039535522</real>
35 <real>1</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.32999998331069946</real>
41 <real>0.52999997138977051</real>
42 <real>0.059999998658895493</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998688697815</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>9.644780158996582</real>
55 <real>10.423800468444824</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.31000000238418579</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>5.999999848427251e-005</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>15.40000057220459</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0.18849556148052216</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.5399999618530273</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.24999998509883881</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.66999995708465576</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.15999999642372131</real>
109 <real>0.13210900127887726</real>
110 <real>0.13210900127887726</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.18643523752689362</real>
116 <real>0.10036152601242065</real>
117 <real>-0.97732770442962646</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>737</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>3</integer>
129 <key>star_brightness</key>
130 <real>0.62999999523162842</real>
131 <key>sun_angle</key>
132 <real>3.0410618782043457</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.2200000286102295</real>
136 <real>2.2200000286102295</real>
137 <real>2.2200000286102295</real>
138 <real>0.74000000953674316</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arrakissed.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arrakissed.xml
new file mode 100644
index 0000000..66dfef5
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Arrakissed.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.17999999225139618</real>
6 <real>0.14482758939266205</real>
7 <real>0.14999999105930328</real>
8 <real>0.21000000834465027</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0</real>
13 <real>0.22999770939350128</real>
14 <real>0.45999997854232788</real>
15 <real>0.65999996662139893</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0</real>
20 <real>0.54652589559555054</real>
21 <real>0.63999998569488525</real>
22 <real>0.31999999284744263</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.61000001430511475</real>
27 <real>0</real>
28 <real>0</real>
29 <real>0.61000001430511475</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.53999996185302734</real>
34 <real>0.50999999046325684</real>
35 <real>0.23999999463558197</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0.059999998658895493</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.2800000011920929</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>20</real>
55 <real>20</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.11999999731779099</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00022000000171829015</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>0</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>2.8274333477020264</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.7599999904632568</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>0.39999961853027344</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.74999994039535522</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>2.679999828338623</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.40999999642372131</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.30239814519882202</real>
116 <real>0.20586305856704712</real>
117 <real>-0.93068563938140869</real>
118 <real>1</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1128</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>0.68000000715255737</real>
131 <key>sun_angle</key>
132 <real>3.3489382266998291</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.0999999046325684</real>
136 <real>0.59999978542327881</real>
137 <real>0.31500005722045898</real>
138 <real>0.69999998807907104</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asian%20red%20dawn.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asian%20red%20dawn.xml
new file mode 100644
index 0000000..39813c2
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asian%20red%20dawn.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.039999999105930328</real><real>0.029999999329447746</real><real>0</real><real>0.039999999105930328</real></array><key>blue_density</key><array><real>0</real><real>0.25999999046325684</real><real>0.5</real><real>0.5</real></array><key>blue_horizon</key><array><real>0</real><real>0</real><real>0</real><real>0</real></array><key>cloud_color</key><array><real>0.25999999046325684</real><real>0</real><real>0</real><real>0.25999999046325684</real></array><key>cloud_pos_density1</key><array><real>0.68999999761581421</real><real>0.68999999761581421</real><real>0.5</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.51999998092651367</real><real>0.81000000238418579</real><real>0.10999999940395355</real><real>1</real></array><key>cloud_scale</key><array><real>0.34999999403953552</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>20</real><real>20</real></array><key>cloud_shadow</key><array><real>0.34999999403953552</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00019999999494757503</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>22.100000381469727</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>1.5707963705062866</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.2099999189376831</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>20</real><real>0.0010000000474974513</real><real>0</real><real>1</real></array><key>haze_density</key><array><real>0.0099999997764825821</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>0.99802672863006592</real><real>0.062790460884571075</real><real>4.362513550404401e-008</real><real>0</real></array><key>max_y</key><array><real>1014.1000366210937</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0.75999999046325684</real><key>sun_angle</key><real>3.0787608623504639</real><key>sunlight_color</key><array><real>1.619999885559082</real><real>1.2690000534057617</real><real>0.91800004243850708</real><real>0.53999996185302734</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asiatix.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asiatix.xml
new file mode 100644
index 0000000..bf35008
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Asiatix.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.32999998331069946</real>
6 <real>0.059999998658895493</real>
7 <real>0</real>
8 <real>0.32999998331069946</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.083504162728786469</real>
13 <real>0.22999770939350128</real>
14 <real>0.45999997854232788</real>
15 <real>0.45999997854232788</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.31871956586837769</real>
20 <real>0.6319204568862915</real>
21 <real>0.74000000953674316</real>
22 <real>0.74000000953674316</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>1</real>
27 <real>0.47999998927116394</real>
28 <real>0.69999998807907104</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.5</real>
34 <real>0.5</real>
35 <real>0.22999998927116394</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.28999999165534973</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>20</real>
55 <real>20</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.38999998569488525</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00016999999934341758</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>10.699999809265137</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.5814156532287598</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.5399999618530273</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>6.6000008583068848</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.89999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>3.2599999904632568</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.4699999988079071</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.4257793128490448</real>
116 <real>0</real>
117 <real>-0.9048270583152771</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1267.5999755859375</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.3199999332427979</real>
136 <real>0.84000003337860107</real>
137 <real>0.37800011038780212</real>
138 <real>1.3199999332427979</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation%202.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation%202.xml
new file mode 100644
index 0000000..2edb929
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation%202.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.029999999329447746</real><real>0</real><real>0</real><real>0.029999999329447746</real></array><key>blue_density</key><array><real>0.097999997437000275</real><real>0.2800000011920929</real><real>1</real><real>1</real></array><key>blue_horizon</key><array><real>0.11999999731779099</real><real>0.35094299912452698</real><real>1</real><real>1</real></array><key>cloud_color</key><array><real>0.48999997973442078</real><real>0.79000002145767212</real><real>0.80000001192092896</real><real>1</real></array><key>cloud_pos_density1</key><array><real>0.48999997973442078</real><real>0.5</real><real>0.18999999761581421</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.38999998569488525</real><real>0.5</real><real>0.25999999046325684</real><real>1</real></array><key>cloud_scale</key><array><real>0.37000000476837158</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>9.9300004821488983</real><real>10.199999788063906</real></array><key>cloud_shadow</key><array><real>0.28999999165534973</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00021999998716637492</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>4</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>3.2044246196746826</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.5399999618530273</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>3.8000010331979865</real><real>0.001000000059761974</real><real>-0.49999996688498527</real><real>1</real></array><key>haze_density</key><array><real>0.20999999344348907</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.049999997019767761</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.062759645283222198</real><real>0.031410921365022659</real><real>0.99753427505493164</real><real>0</real></array><key>max_y</key><array><real>676.10003662109375</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0.44999998807907104</real><key>sun_angle</key><real>3.1101765632629395</real><key>sunlight_color</key><array><real>1.7999999523162842</real><real>1.4099999666213989</real><real>1.0199999809265137</real><real>1.7999999523162842</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation.xml
new file mode 100644
index 0000000..4ee8115
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Azure%20desertation.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.029999999329447746</real><real>0</real><real>0</real><real>0.029999999329447746</real></array><key>blue_density</key><array><real>0.097999997437000275</real><real>0.2800000011920929</real><real>1</real><real>1</real></array><key>blue_horizon</key><array><real>0.11999999731779099</real><real>0.35094299912452698</real><real>1</real><real>1</real></array><key>cloud_color</key><array><real>0.48999997973442078</real><real>0.79000002145767212</real><real>0.80000001192092896</real><real>1</real></array><key>cloud_pos_density1</key><array><real>0.53999996185302734</real><real>0.5</real><real>0.39999997615814209</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.38999998569488525</real><real>0.5</real><real>0.08999999612569809</real><real>1</real></array><key>cloud_scale</key><array><real>0.34999999403953552</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>9.9300004821488983</real><real>10.199999788063906</real></array><key>cloud_shadow</key><array><real>0.31000000238418579</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00021999998716637492</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>4</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>3.2044246196746826</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.5399999618530273</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>3.8000010331979865</real><real>0.001000000059761974</real><real>-0.49999996688498527</real><real>1</real></array><key>haze_density</key><array><real>0.20999999344348907</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.049999997019767761</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>0.056814663112163544</real><real>0.42577928304672241</real><real>-0.90304160118103027</real><real>0</real></array><key>max_y</key><array><real>676.10003662109375</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0.44999998807907104</real><key>sun_angle</key><real>0.4398229718208313</real><key>sunlight_color</key><array><real>1.7999999523162842</real><real>1.4099999666213989</real><real>1.0199999809265137</real><real>1.7999999523162842</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Barcelon%20variation%202.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Barcelon%20variation%202.xml
new file mode 100644
index 0000000..ca17be5
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Barcelon%20variation%202.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.32999998331069946</real>
6 <real>0.106283999979496</real>
7 <real>0.14465400576591492</real>
8 <real>0.32999998331069946</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.14522500336170197</real>
13 <real>0.39999699592590332</real>
14 <real>0.80000197887420654</real>
15 <real>1</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.56000000238418579</real>
20 <real>0.30000001192092896</real>
21 <real>0.35131001472473145</real>
22 <real>0.56000000238418579</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.51999998092651367</real>
27 <real>0.41999998688697815</real>
28 <real>0.71999996900558472</real>
29 <real>0.71999996900558472</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.50999999046325684</real>
34 <real>0.47999998927116394</real>
35 <real>0.68999999761581421</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0.039999999105930328</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.38999998569488525</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.49940013885498</real>
55 <real>10.01099967956543</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.32999998331069946</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00014000000373926014</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>25.5</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>2.5132739543914795</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.6100000143051147</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>4.2000007629394531</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.59999996423721313</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.53999996185302734</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.34999999403953552</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.4798322319984436</real>
116 <real>0.57757276296615601</real>
117 <real>-0.66043221950531006</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>632</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>21</integer>
129 <key>star_brightness</key>
130 <real>0.059999998658895493</real>
131 <key>sun_angle</key>
132 <real>0.61575222015380859</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.0099997520446777</real>
136 <real>1.3500000238418579</real>
137 <real>1.3500000238418579</real>
138 <real>2.0099997520446777</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Beautiful%20again.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Beautiful%20again.xml
new file mode 100644
index 0000000..4020b04
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Beautiful%20again.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.75</real>
6 <real>0</real>
7 <real>0.43269237875938416</real>
8 <real>0.25</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.45999997854232788</real>
13 <real>0.38665792346000671</real>
14 <real>0.7733229398727417</real>
15 <real>0.81999999284744263</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.39999997615814209</real>
20 <real>0.22876684367656708</real>
21 <real>0.290018230676651</real>
22 <real>0.39999997615814209</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.25999999046325684</real>
27 <real>0.28883209824562073</real>
28 <real>0.28994369506835938</real>
29 <real>0.28999999165534973</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.17999999225139618</real>
34 <real>0.50999999046325684</real>
35 <real>0.91999995708465576</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0.079999998211860657</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.25</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.436104517528292</real>
55 <real>10</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.34000000357627869</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00017999998817685992</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>26.80000114440918</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>1.8849555253982544</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.6699999570846558</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>9.0000009536743164</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.69999998807907104</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.45999997854232788</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.070000000298023224</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.93839412927627563</real>
116 <real>0.16263717412948608</real>
117 <real>-0.30490267276763916</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>395</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>1.3999999761581421</real>
131 <key>sun_angle</key>
132 <real>0.16336283087730408</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.3399999141693115</real>
136 <real>1.5422734022140503</real>
137 <real>0.92181861400604248</real>
138 <real>0.77999997138977051</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Breaking%20firmament.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Breaking%20firmament.xml
new file mode 100644
index 0000000..ff87474
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Breaking%20firmament.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.059999998658895493</real><real>0</real><real>0</real><real>0.059999998658895493</real></array><key>blue_density</key><array><real>0.31999999284744263</real><real>0.31999999284744263</real><real>0.82999998331069946</real><real>0.82999998331069946</real></array><key>blue_horizon</key><array><real>0.5</real><real>0.35999998450279236</real><real>0.5</real><real>0.59999996423721313</real></array><key>cloud_color</key><array><real>0.14000000059604645</real><real>0.14000000059604645</real><real>0.14000000059604645</real><real>0.14000000059604645</real></array><key>cloud_pos_density1</key><array><real>0.81999999284744263</real><real>0.93999999761581421</real><real>0.75</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.44999998807907104</real><real>0.35999998450279236</real><real>0.019999999552965164</real><real>1</real></array><key>cloud_scale</key><array><real>0.17999999225139618</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>20</real><real>20</real></array><key>cloud_shadow</key><array><real>0.37000000476837158</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00016999999934341758</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>0</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>3.0787608623504639</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.809999942779541</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>7.5999999046325684</real><real>0.0010000000474974513</real><real>-0.64999997615814209</real><real>1</real></array><key>haze_density</key><array><real>0.22999998927116394</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.18999999761581421</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.062017403542995453</real><real>0.15643446147441864</real><real>-0.98573935031890869</real><real>0</real></array><key>max_y</key><array><real>253.5</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>24</integer><key>star_brightness</key><real>0.39999997615814209</real><key>sun_angle</key><real>0.15707962214946747</real><key>sunlight_color</key><array><real>2.0399999618530273</real><real>2.0399999618530273</real><real>2.0399999618530273</real><real>0.68000000715255737</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Brillianter%20sunset.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Brillianter%20sunset.xml
new file mode 100644
index 0000000..5e9a17f
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Brillianter%20sunset.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.32999998331069946</real><real>0.073474660515785217</real><real>0.099999994039535522</real><real>0.32999998331069946</real></array><key>blue_density</key><array><real>0.13251747190952301</real><real>0.36499634385108948</real><real>0.72999995946884155</real><real>0.72999995946884155</real></array><key>blue_horizon</key><array><real>0.16366751492023468</real><real>0.32450026273727417</real><real>0.37999999523162842</real><real>0.37999999523162842</real></array><key>cloud_color</key><array><real>0.23999999463558197</real><real>0.17508696019649506</real><real>0.17508696019649506</real><real>0.23999999463558197</real></array><key>cloud_pos_density1</key><array><real>0.79999995231628418</real><real>0.75999999046325684</real><real>0.74000000953674316</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.44999998807907104</real><real>0.35999998450279236</real><real>0.079999998211860657</real><real>1</real></array><key>cloud_scale</key><array><real>0.28999999165534973</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.49940013885498</real><real>10.01099967956543</real></array><key>cloud_shadow</key><array><real>0.32999998331069946</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00032999998074956238</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>2.7000000476837158</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>3.0787608623504639</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.5999999046325684</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>7.5999999046325684</real><real>0.0010000000474974513</real><real>-2.25</real><real>1</real></array><key>haze_density</key><array><real>0.079999998211860657</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.049999997019767761</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.06251179426908493</real><real>0.094108313322067261</real><real>-0.99359744787216187</real><real>0</real></array><key>max_y</key><array><real>605</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>24</integer><key>star_brightness</key><real>0.12999999523162842</real><key>sun_angle</key><real>0.094247780740261078</real><key>sunlight_color</key><array><real>2.0699999332427979</real><real>2.0024998188018799</real><real>1.5974999666213989</real><real>0.68999999761581421</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Bubble%20sun%20severance.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Bubble%20sun%20severance.xml
new file mode 100644
index 0000000..2d10b90
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Bubble%20sun%20severance.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.28999999165534973</real><real>0.099999994039535522</real><real>0.19999998807907104</real><real>0.31000000238418579</real></array><key>blue_density</key><array><real>0</real><real>0.39999699592590332</real><real>0.80000197887420654</real><real>1</real></array><key>blue_horizon</key><array><real>0.051684476435184479</real><real>0.10247376561164856</real><real>0.11999999731779099</real><real>0.11999999731779099</real></array><key>cloud_color</key><array><real>0.63231253623962402</real><real>0.64999997615814209</real><real>0.64999997615814209</real><real>0.64999997615814209</real></array><key>cloud_pos_density1</key><array><real>0.50999999046325684</real><real>0.45999997854232788</real><real>0.82999998331069946</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.48999997973442078</real><real>0.5</real><real>0.079999998211860657</real><real>1</real></array><key>cloud_scale</key><array><real>0.32999998331069946</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.49940013885498</real><real>10.01099967956543</real></array><key>cloud_shadow</key><array><real>0.25999999046325684</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00041999999666586518</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>16.80000114440918</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>6.2203531265258789</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.7300000190734863</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>5</real><real>0.0010000000474974513</real><real>-0.59999996423721313</real><real>1</real></array><key>haze_density</key><array><real>0.40999999642372131</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.2199999988079071</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>0.062759861350059509</real><real>0.031410761177539825</real><real>0.99753421545028687</real><real>0</real></array><key>max_y</key><array><real>605</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0.14000000059604645</real><key>sun_angle</key><real>0.031415928155183792</real><key>sunlight_color</key><array><real>2.6100001335144043</real><real>2.6100001335144043</real><real>2.6100001335144043</real><real>0.87000000476837158</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Castle%20vain.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Castle%20vain.xml
new file mode 100644
index 0000000..6122d61
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Castle%20vain.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.17000000178813934</real><real>0.11609756201505661</real><real>0.062195118516683578</real><real>0.17000000178813934</real></array><key>blue_density</key><array><real>0</real><real>0.25</real><real>0.13500000536441803</real><real>0.25</real></array><key>blue_horizon</key><array><real>0.10961377620697021</real><real>0.073546595871448517</real><real>0.14000000059604645</real><real>0.14000000059604645</real></array><key>cloud_color</key><array><real>0.18999999761581421</real><real>0.059999998658895493</real><real>0.049999997019767761</real><real>0.22999998927116394</real></array><key>cloud_pos_density1</key><array><real>0.69999998807907104</real><real>0.37000000476837158</real><real>0.87999999523162842</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.2199999988079071</real><real>0.75999999046325684</real><real>0.079999998211860657</real><real>1</real></array><key>cloud_scale</key><array><real>0.47999998927116394</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.453993749294909</real><real>10.026071512513319</real></array><key>cloud_shadow</key><array><real>0.29999998211860657</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>1.9999999494757503e-005</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>37.600002288818359</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>3.2672562599182129</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.2799999713897705</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>0.19999980926513672</real><real>0.0010000000474974513</real><real>-0.49999997019767761</real><real>1</real></array><key>haze_density</key><array><real>1.2599999904632568</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.35999998450279236</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.11792353540658951</real><real>0.33873796463012695</real><real>0.93346166610717773</real><real>0</real></array><key>max_y</key><array><real>309.89999389648437</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>1.0799999237060547</real><key>sun_angle</key><real>2.7960174083709717</real><key>sunlight_color</key><array><real>0.93000000715255737</real><real>0.44639992713928223</real><real>0.66030013561248779</real><real>0.31000000238418579</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Climacontrasty.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Climacontrasty.xml
new file mode 100644
index 0000000..3f8483a
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Climacontrasty.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.84000003337860107</real>
6 <real>0.71999996900558472</real>
7 <real>0.84000003337860107</real>
8 <real>0.2800000011920929</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.38399907946586609</real>
13 <real>0.63999354839324951</real>
14 <real>1.2799999713897705</real>
15 <real>0.63999998569488525</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.31999999284744263</real>
20 <real>0.26181814074516296</real>
21 <real>0.31999999284744263</real>
22 <real>0.15999999642372131</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.2800000011920929</real>
27 <real>0.22615399956703186</real>
28 <real>0.22615399956703186</real>
29 <real>0.2800000011920929</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.14000000059604645</real>
34 <real>0.09771379828453064</real>
35 <real>0.87000000476837158</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.40999999642372131</real>
41 <real>0.4699999988079071</real>
42 <real>0.079999998211860657</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.39999997615814209</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.49940013885498</real>
55 <real>10.01099967956543</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.28999999165534973</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00042999998549930751</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>3.4000000953674316</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0.56548666954040527</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>0.4699999988079071</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>6.2000012397766113</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.47999998927116394</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.69999998807907104</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.15999999642372131</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.53277301788330078</real>
116 <real>0.10661106556653976</real>
117 <real>-0.83951592445373535</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>644</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>3</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>3.0347785949707031</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.5799999237060547</real>
136 <real>2.5799999237060547</real>
137 <real>2.5799999237060547</real>
138 <real>0.85999995470046997</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Clouds%20indifferent.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Clouds%20indifferent.xml
new file mode 100644
index 0000000..3b6ebe9
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Clouds%20indifferent.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0</real><real>0</real><real>0.26999998092651367</real><real>0.26999998092651367</real></array><key>blue_density</key><array><real>0.34457135200500488</real><real>0.55514287948608398</real><real>0.66999995708465576</real><real>0.66999995708465576</real></array><key>blue_horizon</key><array><real>0.33888885378837585</real><real>0.47444438934326172</real><real>0.61000001430511475</real><real>0.61000001430511475</real></array><key>cloud_color</key><array><real>0.70999997854232788</real><real>0.74000000953674316</real><real>1</real><real>1</real></array><key>cloud_pos_density1</key><array><real>0.79999995231628418</real><real>0.90999996662139893</real><real>0.69999998807907104</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.44999998807907104</real><real>0.35999998450279236</real><real>0.0099999997764825821</real><real>1</real></array><key>cloud_scale</key><array><real>0.14000000059604645</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>20</real><real>20</real></array><key>cloud_shadow</key><array><real>0.35999998450279236</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00049999996554106474</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>0.10000000149011612</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>4.0840702056884766</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.7400000095367432</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>13.19999885559082</real><real>0.0010000000474974513</real><real>-1.4499999284744263</real><real>1</real></array><key>haze_density</key><array><real>0.25999999046325684</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.18999999761581421</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>0.80542641878128052</real><real>0.094108313322067261</real><real>-0.58517682552337646</real><real>0</real></array><key>max_y</key><array><real>112.70000457763672</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>24</integer><key>star_brightness</key><real>0.20999999344348907</real><key>sun_angle</key><real>0.094247780740261078</real><key>sunlight_color</key><array><real>1.0499999523162842</real><real>1.5299999713897705</real><real>1.6500000953674316</real><real>1.6500000953674316</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Cobraring.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Cobraring.xml
new file mode 100644
index 0000000..e05abc6
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Cobraring.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0</real><real>0</real><real>0</real><real>0</real></array><key>blue_density</key><array><real>0</real><real>0.35499647259712219</real><real>0.70999997854232788</real><real>0.70999997854232788</real></array><key>blue_horizon</key><array><real>0</real><real>0.79999995231628418</real><real>1</real><real>1</real></array><key>cloud_color</key><array><real>0.39999997615814209</real><real>0.34999999403953552</real><real>0.099999994039535522</real><real>0.39999997615814209</real></array><key>cloud_pos_density1</key><array><real>0.51999998092651367</real><real>0.40999999642372131</real><real>0.69999998807907104</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.5</real><real>0.5</real><real>0.029999999329447746</real><real>1</real></array><key>cloud_scale</key><array><real>0.14999999105930328</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.49940013885498</real><real>10.01099967956543</real></array><key>cloud_shadow</key><array><real>0.47999998927116394</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00038999997195787728</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>8.6999998092651367</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>0.8796459436416626</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.0900000333786011</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>8.600001335144043</real><real>0.0010000000474974513</real><real>-1.1999999284744263</real><real>1</real></array><key>haze_density</key><array><real>0.71999996900558472</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.14999999105930328</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.74749541282653809</real><real>0.2425992339849472</real><real>0.61838197708129883</real><real>0</real></array><key>max_y</key><array><real>158</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0</real><key>sun_angle</key><real>0.24504423141479492</real><key>sunlight_color</key><array><real>3</real><real>1.2599999904632568</real><real>0.27000004053115845</real><real>3</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Coral%20reef.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Coral%20reef.xml
new file mode 100644
index 0000000..0f2ebdb
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Coral%20reef.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.25356096029281616</real>
6 <real>0.40908080339431763</real>
7 <real>0.65999996662139893</real>
8 <real>0.2199999988079071</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.3884127140045166</real>
13 <real>0.63416171073913574</real>
14 <real>1.0199999809265137</real>
15 <real>0.50999999046325684</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.79566740989685059</real>
20 <real>1.3341723680496216</real>
21 <real>1.5199999809265137</real>
22 <real>0.75999999046325684</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.35999998450279236</real>
27 <real>0.35834389925003052</real>
28 <real>0.35834389925003052</real>
29 <real>0.35999998450279236</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.65999996662139893</real>
34 <real>0.34000000357627869</real>
35 <real>0.32999998331069946</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.28999999165534973</real>
41 <real>0.84999996423721313</real>
42 <real>0</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.32999998058761548</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.499399946934318</real>
55 <real>10.010999746491507</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.31999999284744263</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00045999998110346496</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>2</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>2.8274333477020264</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.3500000238418579</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>4.2366936635580714</real>
95 <real>0.0010000000718780599</real>
96 <real>-0.49272174722960926</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>1.2699999809265137</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.32999998331069946</real>
109 <real>0.19915598630905151</real>
110 <real>0.19915598630905151</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.2967471182346344</real>
116 <real>0.27899089455604553</real>
117 <real>0.91329360008239746</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>403</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>2.8588495254516602</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.56603914499282837</real>
136 <real>0.62662863731384277</real>
137 <real>0.77999997138977051</real>
138 <real>0.25999999046325684</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Damage%20down.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Damage%20down.xml
new file mode 100644
index 0000000..7fe8a59
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Damage%20down.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>2.5199999809265137</real>
6 <real>0.89999997615814209</real>
7 <real>0</real>
8 <real>0.8399999737739563</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.31999999284744263</real>
13 <real>0.22953487932682037</real>
14 <real>0.41999998688697815</real>
15 <real>0.5</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.39999997615814209</real>
20 <real>0.35094299912452698</real>
21 <real>0.8399999737739563</real>
22 <real>0.87999999523162842</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.56049990653991699</real>
27 <real>0.7504999041557312</real>
28 <real>0.75999999046325684</real>
29 <real>0.75999999046325684</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.10999999940395355</real>
34 <real>5.6909198760986328</real>
35 <real>0.74000000953674316</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.14000000059604645</real>
41 <real>6.9909601211547852</real>
42 <real>0.079999998211860657</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.35999998450279236</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>12.40999960899353</real>
55 <real>10.199999809265137</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.34000000357627869</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00026999998954124749</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>1.3000000715255737</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.6100000143051147</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.94999998807907104</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.91999995708465576</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.10999999940395355</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0</real>
116 <real>0.55164581537246704</real>
117 <real>-0.83407843112945557</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>2228</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>24</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>2.5572564601898193</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.4600000381469727</real>
136 <real>1.5</real>
137 <real>0.89999997615814209</real>
138 <real>2.4600000381469727</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Dark%20came%20over.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Dark%20came%20over.xml
new file mode 100644
index 0000000..e184cdc
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Dark%20came%20over.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.08999999612569809</real><real>0.08999999612569809</real><real>0</real><real>0.08999999612569809</real></array><key>blue_density</key><array><real>0.10500001907348633</real><real>0.29999998211860657</real><real>0.59999996423721313</real><real>0.59999996423721313</real></array><key>blue_horizon</key><array><real>0.11220983415842056</real><real>0.32816043496131897</real><real>0.68999999761581421</real><real>0.68999999761581421</real></array><key>cloud_color</key><array><real>0.63999998569488525</real><real>0.56685715913772583</real><real>0.31085717678070068</real><real>0.63999998569488525</real></array><key>cloud_pos_density1</key><array><real>0.79999995231628418</real><real>1</real><real>0.87000000476837158</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.69999998807907104</real><real>0.70999997854232788</real><real>0.079999998211860657</real><real>1</real></array><key>cloud_scale</key><array><real>0.19999998807907104</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>9.9300003051757813</real><real>10.199999809265137</real></array><key>cloud_shadow</key><array><real>0.31999999284744263</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00047999998787418008</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>7.4000000953674316</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>2.6389377117156982</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.3399999141693115</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>2.9999995231628418</real><real>0.0010000000474974513</real><real>-0.99999994039535522</real><real>1</real></array><key>haze_density</key><array><real>0.53999996185302734</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.12999999523162842</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>0.47582259774208069</real><real>0.15643444657325745</real><real>0.86551785469055176</real><real>0</real></array><key>max_y</key><array><real>1971.800048828125</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>24</integer><key>star_brightness</key><real>0.56000000238418579</real><key>sun_angle</key><real>2.9845130443572998</real><key>sunlight_color</key><array><real>0.87000000476837158</real><real>0.6421428918838501</real><real>0.42000001668930054</real><real>0.28999999165534973</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Das%20fog.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Das%20fog.xml
new file mode 100644
index 0000000..3dc815f
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Das%20fog.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>3</real>
6 <real>3</real>
7 <real>3</real>
8 <real>1</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0</real>
13 <real>0</real>
14 <real>0</real>
15 <real>0</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0</real>
20 <real>0</real>
21 <real>0</real>
22 <real>0</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>1</real>
27 <real>1</real>
28 <real>1</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1</real>
34 <real>1</real>
35 <real>1</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>1</real>
41 <real>1</real>
42 <real>1</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>1</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10</real>
55 <real>10</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>1</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00089999998454004526</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>100</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>6.2831854820251465</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>0.19999980926513672</real>
95 <real>0.0010000000474974513</real>
96 <real>-2.5</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.25</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.14000000059604645</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-1.7484555314695172e-007</real>
116 <real>1.7484555314695172e-007</real>
117 <real>1</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>4000</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>2</real>
131 <key>sun_angle</key>
132 <real>6.2831854820251465</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>3</real>
136 <real>3</real>
137 <real>3</real>
138 <real>1</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Deep%20blue%20sky.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Deep%20blue%20sky.xml
new file mode 100644
index 0000000..212da90
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Deep%20blue%20sky.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.28464806749374816</real><real>0.45923502031814678</real><real>0.7409173846244812</real><real>0.7409173846244812</real></array><key>blue_density</key><array><real>0.25613615825332658</real><real>0.41819368084009056</real><real>0.6726322016895665</real><real>1</real></array><key>blue_horizon</key><array><real>0.47774650705002841</real><real>0.80108383983144904</real><real>0.91266119477967322</real><real>0.98532241580704749</real></array><key>cloud_color</key><array><real>0.52756190160579308</real><real>0.52756190160579308</real><real>0.52756190160579308</real><real>1</real></array><key>cloud_pos_density1</key><array><real>0.72999995946884155</real><real>0.34000000357627869</real><real>0.32999998331069946</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.28999999165534973</real><real>0.84999996423721313</real><real>0.019999999552965164</real><real>1</real></array><key>cloud_scale</key><array><real>0.32999998058761548</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.499399946934318</real><real>10.010999746491507</real></array><key>cloud_shadow</key><array><real>0.25999999046325684</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>9.9999997473787516e-006</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>0.69999999890643494</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>3.1415927410125732</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.610000025154136</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>4.2366936635580714</real><real>0.0010000000718780599</real><real>-0.49272174722960926</real><real>1</real></array><key>haze_density</key><array><real>1.5557675468824073</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.33174386620521545</real><real>0.1991559842625179</real><real>0.1991559842625179</real><real>1</real></array><key>lightnorm</key><array><real>-6.1817239327410789e-008</real><real>0.70710676908493042</real><real>0.70710676908493042</real><real>0</real></array><key>max_y</key><array><real>711.42973550362512</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0</real><key>sun_angle</key><real>2.3561944961547852</real><key>sunlight_color</key><array><real>0.62994743245872087</real><real>0.69737775977682759</real><real>0.86806544391379248</real><real>0.28935515608276319</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Desert%20Sunset%20mod.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Desert%20Sunset%20mod.xml
new file mode 100644
index 0000000..2e2a2f3
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Desert%20Sunset%20mod.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.48999997973442078</real>
6 <real>0.088169597089290619</real>
7 <real>0.11999999731779099</real>
8 <real>0.48999997973442078</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.14522500336170197</real>
13 <real>0.39999997615814209</real>
14 <real>0.80000197887420654</real>
15 <real>1</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.10767599940299988</real>
20 <real>0.18999999761581421</real>
21 <real>0.25</real>
22 <real>0.26999998092651367</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.22615399956703186</real>
27 <real>0.37000000476837158</real>
28 <real>0.22615399956703186</real>
29 <real>0.37000000476837158</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>1.6884100437164307</real>
34 <real>0.50999999046325684</real>
35 <real>1</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>1.6884100437164307</real>
41 <real>0.52609699964523315</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998688697815</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.199999809265137</real>
55 <real>10.01099967956543</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.35999998450279236</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00046999999904073775</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>7.4000000953674316</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>5.2778754234313965</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.6100000143051147</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>3.8000011444091797</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.64999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.87000000476837158</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.12999999523162842</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.84266197681427002</real>
116 <real>0.062790460884571075</real>
117 <real>-0.53476929664611816</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>553</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>3.0787608623504639</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.1899998188018799</real>
136 <real>2.8385701179504395</real>
137 <real>2.8385701179504395</real>
138 <real>1</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Early%20warning.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Early%20warning.xml
new file mode 100644
index 0000000..43c343a
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Early%20warning.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.87000000476837158</real>
6 <real>0.54375004768371582</real>
7 <real>0.24468749761581421</real>
8 <real>0.28999999165534973</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.31000000238418579</real>
13 <real>0.36606386303901672</real>
14 <real>0.62000000476837158</real>
15 <real>0.31000000238418579</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.85999995470046997</real>
20 <real>0.35698121786117554</real>
21 <real>0.56792449951171875</real>
22 <real>0.42999997735023499</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.31428584456443787</real>
27 <real>0.55000001192092896</real>
28 <real>0.39285731315612793</real>
29 <real>0.55000001192092896</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.65999996662139893</real>
34 <real>0.45999997854232788</real>
35 <real>1</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.71999996900558472</real>
41 <real>0.41999998688697815</real>
42 <real>0.059999998658895493</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.44999998807907104</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.200000040817258</real>
55 <real>10.010999893335338</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.31999999284744263</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00016999999934341758</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>4.7000002861022949</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>6.0946898460388184</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>0.94999998807907104</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>7.7999997138977051</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.55000001192092896</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.75999999046325684</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.19999998807907104</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.17994101345539093</real>
116 <real>0.27899089455604553</real>
117 <real>-0.94328433275222778</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1208</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0.95999997854232788</real>
131 <key>sun_angle</key>
132 <real>2.8588495254516602</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.2899999618530273</real>
136 <real>0.78157889842987061</real>
137 <real>0.89999997615814209</real>
138 <real>0.42999997735023499</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Eno%20would%20be%20proud.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Eno%20would%20be%20proud.xml
new file mode 100644
index 0000000..dede67c
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Eno%20would%20be%20proud.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.2800000011920929</real>
6 <real>0.14962118864059448</real>
7 <real>0.2036362886428833</real>
8 <real>0.2800000011920929</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.13977900147438049</real>
13 <real>0.38499599695205688</real>
14 <real>0.93999999761581421</real>
15 <real>0.93999999761581421</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.39999997615814209</real>
20 <real>0.18999999761581421</real>
21 <real>0.079999998211860657</real>
22 <real>0.41999998688697815</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.53999996185302734</real>
27 <real>0.50999999046325684</real>
28 <real>0.22615399956703186</real>
29 <real>0.53999996185302734</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.51999998092651367</real>
34 <real>0.62000000476837158</real>
35 <real>0.41999998688697815</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.29999998211860657</real>
41 <real>0.48999997973442078</real>
42 <real>0.079999998211860657</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.20999999344348907</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.739999771118164</real>
55 <real>10.600000381469727</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.39999997615814209</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00038999997195787728</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>8.1000003814697266</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0.12566371262073517</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>0.89999997615814209</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>4.8000001907348633</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.49999997019767761</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>1.2099999189376831</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.10999999940395355</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.11373797059059143</real>
116 <real>0.42008551955223083</real>
117 <real>-0.90032875537872314</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>789</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>28</integer>
129 <key>star_brightness</key>
130 <real>0.099999994039535522</real>
131 <key>sun_angle</key>
132 <real>2.7080531120300293</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.1610879898071289</real>
136 <real>1.5523307323455811</real>
137 <real>2.8799998760223389</real>
138 <real>0.95999997854232788</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Evil%20machinery.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Evil%20machinery.xml
new file mode 100644
index 0000000..22e82a3
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Evil%20machinery.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.5899999141693115</real>
6 <real>0.53999996185302734</real>
7 <real>0</real>
8 <real>1.5899999141693115</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.52199989557266235</real>
13 <real>0.32480010390281677</real>
14 <real>0.57999998331069946</real>
15 <real>0.28999999165534973</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.85999995470046997</real>
20 <real>0.63999998569488525</real>
21 <real>1</real>
22 <real>1.059999942779541</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.37000000476837158</real>
27 <real>0.25999999046325684</real>
28 <real>0.039999999105930328</real>
29 <real>0.37000000476837158</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.51999998092651367</real>
34 <real>0.38999998569488525</real>
35 <real>0.68999999761581421</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0</real>
41 <real>0</real>
42 <real>0</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.17000000178813934</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.49940013885498</real>
55 <real>10.01099967956543</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.5</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00089999998454004526</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>100</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0.12566371262073517</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>0.4699999988079071</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>11.600000381469727</real>
95 <real>0.0010000000474974513</real>
96 <real>-1.4999998807907104</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.0099999997764825821</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.10497009009122849</real>
116 <real>0.54639440774917603</real>
117 <real>0.83092385530471802</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>4</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>0.57805311679840088</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.3499999046325684</real>
136 <real>1.559999942779541</real>
137 <real>0.56999999284744263</real>
138 <real>1.559999942779541</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Farmatronic%20sepia.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Farmatronic%20sepia.xml
new file mode 100644
index 0000000..d2b489d
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Farmatronic%20sepia.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0</real><real>0</real><real>0</real><real>0</real></array><key>blue_density</key><array><real>0</real><real>0.099999994039535522</real><real>0.11999999731779099</real><real>0.11999999731779099</real></array><key>blue_horizon</key><array><real>0.029999999329447746</real><real>0.029999999329447746</real><real>0.029999999329447746</real><real>0.029999999329447746</real></array><key>cloud_color</key><array><real>0.37999999523162842</real><real>0.31999999284744263</real><real>0.22999998927116394</real><real>0.37999999523162842</real></array><key>cloud_pos_density1</key><array><real>0.74000000953674316</real><real>0.93999999761581421</real><real>0.84999996423721313</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.65999996662139893</real><real>0.52999997138977051</real><real>0.039999999105930328</real><real>1</real></array><key>cloud_scale</key><array><real>0.18999999761581421</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>20</real><real>20</real></array><key>cloud_shadow</key><array><real>0.32999998331069946</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00013000000035390258</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>1.3000000715255737</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>2.3247785568237305</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.9499999284744263</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>17.399999618530273</real><real>0.0010000000474974513</real><real>-0.64999997615814209</real><real>1</real></array><key>haze_density</key><array><real>0.62000000476837158</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.20999999344348907</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.72322046756744385</real><real>0.12533323466777802</real><real>-0.67914927005767822</real><real>0</real></array><key>max_y</key><array><real>281.70001220703125</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>24</integer><key>star_brightness</key><real>0.39999997615814209</real><key>sun_angle</key><real>0.12566371262073517</real><key>sunlight_color</key><array><real>1.5899999141693115</real><real>1.5299999713897705</real><real>1.5899999141693115</real><real>1.5899999141693115</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Fogvari.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Fogvari.xml
new file mode 100644
index 0000000..addb480
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Fogvari.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.3952941596508026123046875</real>
6 <real>0.3952941596508026123046875</real>
7 <real>0.420000016689300537109375</real>
8 <real>0.1400000005960464477539062</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.1452250033617019653320312</real>
13 <real>0.3999969959259033203125</real>
14 <real>0.80000197887420654296875</real>
15 <real>1</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.430702149868011474609375</real>
20 <real>0.853946685791015625</real>
21 <real>1</real>
22 <real>1</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.699999988079071044921875</real>
27 <real>0.699999988079071044921875</real>
28 <real>0.699999988079071044921875</real>
29 <real>0.699999988079071044921875</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.5</real>
34 <real>0.5</real>
35 <real>0.53999996185302734375</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0.125</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.2999999821186065673828125</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.49940013885498046875</real>
55 <real>10.0109996795654296875</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.2199999988079071044921875</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.0003100000030826777219772339</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>8.1000003814697265625</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>0.949999988079071044921875</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>0.99999904632568359375</real>
95 <real>0.001000000047497451305389404</real>
96 <real>-2.5</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>4</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.64999997615814208984375</real>
109 <real>0.1991560012102127075195312</real>
110 <real>0.1991560012102127075195312</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0</real>
116 <real>0.99715888500213623046875</real>
117 <real>-0.0753269493579864501953125</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>54</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>1.6461946964263916015625</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.599999964237213134765625</real>
136 <real>0.599999964237213134765625</real>
137 <real>0.599999964237213134765625</real>
138 <real>0.199999988079071044921875</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Grit%20%26%20shame.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Grit%20%26%20shame.xml
new file mode 100644
index 0000000..a9fda37
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Grit%20%26%20shame.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.26999998092651367</real>
6 <real>0.22736841440200806</real>
7 <real>0</real>
8 <real>0.08999999612569809</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.038261249661445618</real>
13 <real>0.43999999761581421</real>
14 <real>0.11478374153375626</real>
15 <real>0.2199999988079071</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0</real>
20 <real>0.60503017902374268</real>
21 <real>0.89999997615814209</real>
22 <real>0.44999998807907104</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>1</real>
27 <real>0</real>
28 <real>0</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.53999996185302734</real>
34 <real>0.45999997854232788</real>
35 <real>0.61000001430511475</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0.039999999105930328</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.29999998211860657</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>20</real>
55 <real>20</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.31999999284744263</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00014999999257270247</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>10.100000381469727</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.6442475318908691</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.2799999713897705</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>0.39999961853027344</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.55000001192092896</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>2.8599998950958252</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.44999998807907104</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.48175370693206787</real>
116 <real>1.7484555314695172e-007</real>
117 <real>-0.87630665302276611</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>886</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>6.2831854820251465</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.86999994516372681</real>
136 <real>0.71999996900558472</real>
137 <real>1.7699999809265137</real>
138 <real>1.7699999809265137</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Herr%20Gracken.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Herr%20Gracken.xml
new file mode 100644
index 0000000..ab35e75
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Herr%20Gracken.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.68999993801116943</real>
6 <real>0.55225539207458496</real>
7 <real>0.5645453929901123</real>
8 <real>0.22999998927116394</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.079999998211860657</real>
13 <real>0.21999964118003845</real>
14 <real>0.39999997615814209</real>
15 <real>0.39999997615814209</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>1.1200000047683716</real>
20 <real>0.37999999523162842</real>
21 <real>0.19999998807907104</real>
22 <real>1.1200000047683716</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.55000001192092896</real>
27 <real>0.47999998927116394</real>
28 <real>0.31999999284744263</real>
29 <real>0.55000001192092896</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.89999997615814209</real>
34 <real>0.94999998807907104</real>
35 <real>0.75999999046325684</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.26999998092651367</real>
41 <real>0.18999999761581421</real>
42 <real>0.049999997019767761</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.25</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>9.993240904292179</real>
55 <real>10.179008409703329</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.34999999403953552</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00022000000171829015</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>39.900001525878906</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>1.7592918872833252</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0799999237060547</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>3.600001335144043</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.39999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>1.1100000143051147</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.14999999105930328</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.073992699384689331</real>
116 <real>0.99715888500213623</real>
117 <real>0.014114863239228725</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>456</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>24</integer>
129 <key>star_brightness</key>
130 <real>0.26999998092651367</real>
131 <key>sun_angle</key>
132 <real>1.6461946964263916</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.8899999856948853</real>
136 <real>1.2300000190734863</real>
137 <real>1.2899999618530273</real>
138 <real>1.8899999856948853</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Holy%20romance.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Holy%20romance.xml
new file mode 100644
index 0000000..4515e5e
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Holy%20romance.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.31535112857818604</real>
6 <real>0.37471914291381836</real>
7 <real>0.50999999046325684</real>
8 <real>0.17000000178813934</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.019999999552965164</real>
13 <real>0.31999650597572327</real>
14 <real>0.63999998569488525</real>
15 <real>0.69999998807907104</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.37999999523162842</real>
20 <real>0.34158006310462952</real>
21 <real>0.39999997615814209</real>
22 <real>0.39999997615814209</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.34000000357627869</real>
27 <real>0.21396400034427643</real>
28 <real>0.21396400034427643</real>
29 <real>0.34000000357627869</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.27044001221656799</real>
34 <real>1</real>
35 <real>1</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0.10062900185585022</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.41999998688697815</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>9.644780158996582</real>
55 <real>10.423800468444824</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.32704401016235352</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00015849100600462407</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>3.4000000953674316</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5</real>
95 <real>0.0013735899701714516</real>
96 <real>-0.55000001192092896</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.6792449951171875</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.13210900127887726</real>
109 <real>0.13210900127887726</real>
110 <real>0.13210900127887726</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0</real>
116 <real>0.031410444527864456</real>
117 <real>-0.99950659275054932</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1308.1800537109375</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>5</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>3.1101770401000977</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>3</real>
136 <real>3</real>
137 <real>3</real>
138 <real>1</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Hong%20Kong.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Hong%20Kong.xml
new file mode 100644
index 0000000..6f16a16
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Hong%20Kong.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.81999999284744263</real><real>0.34119853377342224</real><real>0.60482907295227051</real><real>0.81999999284744263</real></array><key>blue_density</key><array><real>0</real><real>0.54214274883270264</real><real>0.68999999761581421</real><real>0.68999999761581421</real></array><key>blue_horizon</key><array><real>0.32884129881858826</real><real>0.22063982486724854</real><real>0.41999998688697815</real><real>0.41999998688697815</real></array><key>cloud_color</key><array><real>0.34999999403953552</real><real>0.13600000739097595</real><real>0.17000000178813934</real><real>0.34999999403953552</real></array><key>cloud_pos_density1</key><array><real>0.68999999761581421</real><real>0.34000000357627869</real><real>0.70999997854232788</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.28999999165534973</real><real>0.84999996423721313</real><real>0.14000000059604645</real><real>1</real></array><key>cloud_scale</key><array><real>0.39999997615814209</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.453993749294909</real><real>10.026071512513319</real></array><key>cloud_shadow</key><array><real>0.37000000476837158</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>1.9999999494757503e-005</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>24.80000114440918</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>5.5292034149169922</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>0.53999996185302734</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>14.800000190734863</real><real>0.0010000000474974513</real><real>-0.79999995231628418</real><real>1</real></array><key>haze_density</key><array><real>1.1000000238418579</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.28999999165534973</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.68420904874801636</real><real>0.031410921365022659</real><real>-0.72860914468765259</real><real>0</real></array><key>max_y</key><array><real>394.39999389648437</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>1.1799999475479126</real><key>sun_angle</key><real>3.1101765632629395</real><key>sunlight_color</key><array><real>1.2422535419464111</real><real>1.9665026664733887</real><real>2.5199999809265137</real><real>0.8399999737739563</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Ivory%20flowers.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Ivory%20flowers.xml
new file mode 100644
index 0000000..7838e49
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Ivory%20flowers.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.87000000476837158</real>
6 <real>0.69088232517242432</real>
7 <real>0.69088232517242432</real>
8 <real>0.28999999165534973</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.63999998569488525</real>
13 <real>0.39999699592590332</real>
14 <real>0.80000197887420654</real>
15 <real>1</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.71999996900558472</real>
20 <real>0.37999999523162842</real>
21 <real>0.39999997615814209</real>
22 <real>0.71999996900558472</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.31999999284744263</real>
27 <real>0.17000000178813934</real>
28 <real>0.22615399956703186</real>
29 <real>0.31999999284744263</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.4699999988079071</real>
34 <real>0.31999999284744263</real>
35 <real>0.75999999046325684</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.69999998807907104</real>
41 <real>0.35999998450279236</real>
42 <real>0.25</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.56999999284744263</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>5.1099996566772461</real>
55 <real>9.339999794960022</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.37999999523162842</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.0004400000034365803</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>3.4000000953674316</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>5.4035391807556152</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>0.94999998807907104</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>11.400001525878906</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.39999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.31999999284744263</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.10999999940395355</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.76612204313278198</real>
116 <real>0.10661106556653976</real>
117 <real>-0.63379108905792236</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>859</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0.19999998807907104</real>
131 <key>sun_angle</key>
132 <real>3.0347785949707031</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.4600000381469727</real>
136 <real>2.4600000381469727</real>
137 <real>2.4600000381469727</real>
138 <real>0.81999999284744263</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Liz%20gluft.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Liz%20gluft.xml
new file mode 100644
index 0000000..2c5b7f8
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Liz%20gluft.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.23999999463558197</real><real>0.3031410276889801</real><real>0.30667626857757568</real><real>0.32999998331069946</real></array><key>blue_density</key><array><real>0.10031381994485855</real><real>0.2849995493888855</real><real>0.56999999284744263</real><real>0.56999999284744263</real></array><key>blue_horizon</key><array><real>0.15806560218334198</real><real>0.31211113929748535</real><real>0.52999997138977051</real><real>0.52999997138977051</real></array><key>cloud_color</key><array><real>0.62000000476837158</real><real>0.72737622261047363</real><real>0.73626559972763062</real><real>1</real></array><key>cloud_pos_density1</key><array><real>0.89999997615814209</real><real>0.93999999761581421</real><real>0.96999996900558472</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.41999998688697815</real><real>0.23999999463558197</real><real>0.029999999329447746</real><real>1</real></array><key>cloud_scale</key><array><real>0.29999998211860657</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>9.993240904292179</real><real>10.179008409703329</real></array><key>cloud_shadow</key><array><real>0.31000000238418579</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00018000000272877514</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>6.7000002861022949</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>2.1362831592559814</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.5399999618530273</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>3.600001335144043</real><real>0.0010000000474974513</real><real>-0.14999999105930328</real><real>1</real></array><key>haze_density</key><array><real>0.74000000953674316</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.18999999761581421</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.82937246561050415</real><real>0.187381312251091</real><real>-0.5263359546661377</real><real>0</real></array><key>max_y</key><array><real>1105</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>24</integer><key>star_brightness</key><real>0.18999999761581421</real><key>sun_angle</key><real>0.18849556148052216</real><key>sunlight_color</key><array><real>1.2599999904632568</real><real>1.2599999904632568</real><real>1.2599999904632568</real><real>0.41999998688697815</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Lonely%20cyberpunks.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Lonely%20cyberpunks.xml
new file mode 100644
index 0000000..e3281cf
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Lonely%20cyberpunks.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.14999999105930328</real>
6 <real>0.051724139600992203</real>
7 <real>0.10344827920198441</real>
8 <real>0.049999997019767761</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0</real>
13 <real>0.39999699592590332</real>
14 <real>0.80000197887420654</real>
15 <real>1</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.051684476435184479</real>
20 <real>0.31999999284744263</real>
21 <real>0.11999999731779099</real>
22 <real>0.31999999284744263</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.63231253623962402</real>
27 <real>0.64999997615814209</real>
28 <real>0.64999997615814209</real>
29 <real>0.64999997615814209</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.50999999046325684</real>
34 <real>0.45999997854232788</real>
35 <real>0.68000000715255737</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.48999997973442078</real>
41 <real>0.5</real>
42 <real>0.079999998211860657</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.32999998331069946</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.49940013885498</real>
55 <real>10.01099967956543</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.23999999463558197</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00031999999191612005</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>49.299999237060547</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>5.9690260887145996</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.7300000190734863</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>4.2000007629394531</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.79999995231628418</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.69999998807907104</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.2199999988079071</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.30879738926887512</real>
116 <real>0.037690185010433197</real>
117 <real>0.95038080215454102</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>940</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>0.14000000059604645</real>
131 <key>sun_angle</key>
132 <real>0.03769911453127861</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.95999997854232788</real>
136 <real>0.6731034517288208</real>
137 <real>0.95999997854232788</real>
138 <real>0.31999999284744263</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Moon%20berries.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Moon%20berries.xml
new file mode 100644
index 0000000..864933b
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Moon%20berries.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.079999998211860657</real><real>0.070000000298023224</real><real>0</real><real>0.099999994039535522</real></array><key>blue_density</key><array><real>0.13125002384185791</real><real>0.375</real><real>0.75</real><real>0.75</real></array><key>blue_horizon</key><array><real>0.12196721881628036</real><real>0.35669612884521484</real><real>0.75</real><real>0.75</real></array><key>cloud_color</key><array><real>0.69999998807907104</real><real>0.62000000476837158</real><real>0.34000000357627869</real><real>0.77999997138977051</real></array><key>cloud_pos_density1</key><array><real>0.79999995231628418</real><real>1</real><real>1</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.69999998807907104</real><real>0.70999997854232788</real><real>0.10999999940395355</real><real>1</real></array><key>cloud_scale</key><array><real>0.20999999344348907</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>9.9300003051757813</real><real>10.199999809265137</real></array><key>cloud_shadow</key><array><real>0.31000000238418579</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00036000000545755029</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>7.4000000953674316</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>2.7017695903778076</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.5399999618530273</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>4.0000009536743164</real><real>0.0010000000474974513</real><real>-0.89999997615814209</real><real>1</real></array><key>haze_density</key><array><real>0.14999999105930328</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.23999999463558197</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.35949742794036865</real><real>0.53582680225372314</real><real>-0.76397073268890381</real><real>0</real></array><key>max_y</key><array><real>2084.5</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>24</integer><key>star_brightness</key><real>0.68000000715255737</real><key>sun_angle</key><real>0.56548666954040527</real><key>sunlight_color</key><array><real>1.2599999904632568</real><real>0.93000000715255737</real><real>0.89999997615814209</real><real>1.2599999904632568</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Noxumic.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Noxumic.xml
new file mode 100644
index 0000000..3471ed2
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Noxumic.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.40799996256828308</real>
6 <real>0.42000001668930054</real>
7 <real>0.26400002837181091</real>
8 <real>0.14000000059604645</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.17045657336711884</real>
13 <real>0.77999997138977051</real>
14 <real>0.529285728931427</real>
15 <real>0.38999998569488525</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.69882345199584961</real>
20 <real>0.71999996900558472</real>
21 <real>0.58235287666320801</real>
22 <real>0.35999998450279236</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.25999999046325684</real>
27 <real>0.28999999165534973</real>
28 <real>0.57999998331069946</real>
29 <real>0.57999998331069946</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.4699999988079071</real>
34 <real>0.32999998331069946</real>
35 <real>0.77999997138977051</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.26999998092651367</real>
41 <real>0.15999999642372131</real>
42 <real>0.08999999612569809</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.34000000357627869</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.069999776780605</real>
55 <real>9.6399997770786285</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.2800000011920929</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00019999999494757503</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>7.4000000953674316</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0099999904632568</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>13.399999618530273</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.39999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>1.2400000095367432</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.31999999284744263</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0</real>
116 <real>0.23649881780147552</real>
117 <real>-0.97163176536560059</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>725</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>22</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>2.9028317928314209</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.3499999046325684</real>
136 <real>1.3240385055541992</real>
137 <real>1.2201924324035645</real>
138 <real>0.44999998807907104</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Oriental%20delight.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Oriental%20delight.xml
new file mode 100644
index 0000000..679b9e8
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Oriental%20delight.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.89999997615814209</real><real>0.22999998927116394</real><real>0</real><real>0.89999997615814209</real></array><key>blue_density</key><array><real>0.5444445013999939</real><real>0.4714285135269165</real><real>0.59999996423721313</real><real>0.59999996423721313</real></array><key>blue_horizon</key><array><real>0.62999999523162842</real><real>0.29418638348579407</real><real>0.20999999344348907</real><real>0.62999999523162842</real></array><key>cloud_color</key><array><real>0.12999999523162842</real><real>0.079999998211860657</real><real>0</real><real>0.12999999523162842</real></array><key>cloud_pos_density1</key><array><real>0.25999999046325684</real><real>0.31000000238418579</real><real>0.52999997138977051</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.18999999761581421</real><real>0.89999997615814209</real><real>0.070000000298023224</real><real>1</real></array><key>cloud_scale</key><array><real>0.41999998688697815</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.453993749294909</real><real>10.026071512513319</real></array><key>cloud_shadow</key><array><real>0.32999998331069946</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>3.9999998989515007e-005</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>4.7000002861022949</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>3.5185837745666504</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>0.93999999761581421</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>18.599998474121094</real><real>0.0010000000474974513</real><real>-1.25</real><real>1</real></array><key>haze_density</key><array><real>0.87000000476837158</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.53999996185302734</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>-0.35010725259780884</real><real>0.30901703238487244</real><real>0.88426995277404785</real><real>0</real></array><key>max_y</key><array><real>366.20001220703125</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0.37999999523162842</real><key>sun_angle</key><real>2.8274333477020264</real><key>sunlight_color</key><array><real>1.5899999141693115</real><real>1.1811429262161255</real><real>0.95783114433288574</real><real>0.52999997138977051</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Our%20night%20together.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Our%20night%20together.xml
new file mode 100644
index 0000000..1ee2df7
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Our%20night%20together.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.15812495350837708</real>
6 <real>0.10834565013647079</real>
7 <real>0.32999998331069946</real>
8 <real>0.32999998331069946</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0</real>
13 <real>0.22842106223106384</real>
14 <real>0.56000000238418579</real>
15 <real>0.56000000238418579</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.34999999403953552</real>
20 <real>0.21593084931373596</real>
21 <real>0.30163845419883728</real>
22 <real>0.34999999403953552</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.68507599830627441</real>
27 <real>0.80405128002166748</real>
28 <real>0.81000000238418579</real>
29 <real>0.81000000238418579</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.5</real>
34 <real>0.5</real>
35 <real>0.20999999344348907</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0.11999999731779099</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.31000000238418579</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.33593833803161</real>
55 <real>10.065257411083678</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.37999999523162842</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00026000000070780516</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>43</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>2.7646017074584961</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.8600000143051147</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>8.8000011444091797</real>
95 <real>0.0010000000474974513</real>
96 <real>-1.0499999523162842</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>1.4900000095367432</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.14999999105930328</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.36322319507598877</real>
116 <real>0.16263668239116669</real>
117 <real>0.91739749908447266</real>
118 <real>1</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1474</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>1.6499999761581421</real>
131 <key>sun_angle</key>
132 <real>6.1198229789733887</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.9799998998641968</real>
136 <real>1.3627382516860962</real>
137 <real>1.1429417133331299</real>
138 <real>0.65999996662139893</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Polaron%20charge%20II.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Polaron%20charge%20II.xml
new file mode 100644
index 0000000..2547726
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Polaron%20charge%20II.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.84000003337860107</real>
6 <real>0.2892836332321167</real>
7 <real>0.39371848106384277</real>
8 <real>0.2800000011920929</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0</real>
13 <real>0.85999995470046997</real>
14 <real>0.68083322048187256</real>
15 <real>0.85999995470046997</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.77999997138977051</real>
20 <real>0.19999998807907104</real>
21 <real>0.42999997735023499</real>
22 <real>0.77999997138977051</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.51999998092651367</real>
27 <real>0.56999999284744263</real>
28 <real>0.44999998807907104</real>
29 <real>0.62999999523162842</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.5899999737739563</real>
34 <real>0.37000000476837158</real>
35 <real>0.57999998331069946</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.14999999105930328</real>
41 <real>0.84999996423721313</real>
42 <real>0</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.31999999284744263</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.499399908684609</real>
55 <real>10.010999908119629</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.17999999225139618</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00033999999868683517</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>17.600000381469727</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.0159289836883545</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.1999999284744263</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>9.2000007629394531</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.85000002384185791</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>1.7799999713897705</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.2800000011920929</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.12533320486545563</real>
116 <real>0</real>
117 <real>0.99211472272872925</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>537</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>0.63999998569488525</real>
131 <key>sun_angle</key>
132 <real>3.1604423522949219</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.90927821397781372</real>
136 <real>2.9399998188018799</real>
137 <real>1.6367011070251465</real>
138 <real>0.97999995946884155</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Red%20city.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Red%20city.xml
new file mode 100644
index 0000000..924c2b6
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Red%20city.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1</real>
6 <real>0.019999999552965164</real>
7 <real>0</real>
8 <real>1</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.099999994039535522</real>
13 <real>0.24640001356601715</real>
14 <real>0.87999999523162842</real>
15 <real>0.87999999523162842</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>1</real>
20 <real>0.70652174949645996</real>
21 <real>0.95652180910110474</real>
22 <real>1</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.59800004959106445</real>
27 <real>0.68137490749359131</real>
28 <real>0.68999999761581421</real>
29 <real>0.68999999761581421</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.5899999737739563</real>
34 <real>0.53999996185302734</real>
35 <real>0.37000000476837158</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0</real>
41 <real>0</real>
42 <real>0</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.20999999344348907</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10</real>
55 <real>10</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.28999999165534973</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00026000000070780516</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>10.100000381469727</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>4.9008846282958984</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.3999999761581421</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>15</real>
95 <real>0.0010000000474974513</real>
96 <real>-2.5</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.40999999642372131</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.08999999612569809</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.98180252313613892</real>
116 <real>0.031410444527864456</real>
117 <real>-0.18728893995285034</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>632</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>1.059999942779541</real>
131 <key>sun_angle</key>
132 <real>3.1101770401000977</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>3</real>
136 <real>2.0099997520446777</real>
137 <real>1.2721518278121948</real>
138 <real>1</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Sparz%20puft.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Sparz%20puft.xml
new file mode 100644
index 0000000..a127d36
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Sparz%20puft.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>1.4699999094009399</real>
6 <real>1.4699999094009399</real>
7 <real>1.4699999094009399</real>
8 <real>0.48999997973442078</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.50068968534469604</real>
13 <real>0.65999996662139893</real>
14 <real>0.59172403812408447</real>
15 <real>0.32999998331069946</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.81999999284744263</real>
20 <real>0.59653842449188232</real>
21 <real>0.4696153998374939</real>
22 <real>0.81999999284744263</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.22999998927116394</real>
27 <real>0.17000000178813934</real>
28 <real>0.17000000178813934</real>
29 <real>0.22999998927116394</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.89999997615814209</real>
34 <real>0.42999997735023499</real>
35 <real>0.2800000011920929</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0</real>
41 <real>0.19999998807907104</real>
42 <real>0.45999997854232788</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.42999997735023499</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.200000040817258</real>
55 <real>10.010999893335338</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.22999998927116394</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>1.9999999494757503e-005</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>12.800000190734863</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0.62831848859786987</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>0.87999999523162842</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>9.8000001907348633</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.85000002384185791</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>3.0499999523162842</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.17999999225139618</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.42594048380851746</real>
116 <real>0.68911367654800415</real>
117 <real>-0.58625680208206177</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>295</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>27</integer>
129 <key>star_brightness</key>
130 <real>1.0799999237060547</real>
131 <key>sun_angle</key>
132 <real>2.3813273906707764</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.2599999904632568</real>
136 <real>0.72947371006011963</real>
137 <real>0.84000003337860107</real>
138 <real>1.2599999904632568</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Stay%20stonkin%27.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Stay%20stonkin%27.xml
new file mode 100644
index 0000000..57ce616
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Stay%20stonkin%27.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.079999998211860657</real><real>0.2800000011920929</real><real>0.28653734922409058</real><real>0.31000000238418579</real></array><key>blue_density</key><array><real>0.78999996185302734</real><real>0.34725272655487061</real><real>0</real><real>0.78999996185302734</real></array><key>blue_horizon</key><array><real>0.45999997854232788</real><real>0.35633799433708191</real><real>0.34338021278381348</real><real>0.45999997854232788</real></array><key>cloud_color</key><array><real>0.25777778029441833</real><real>0.43999999761581421</real><real>0</real><real>0.43999999761581421</real></array><key>cloud_pos_density1</key><array><real>0.47999998927116394</real><real>0.77999997138977051</real><real>0.78999996185302734</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.5</real><real>0.5</real><real>0.17000000178813934</real><real>1</real></array><key>cloud_scale</key><array><real>0.26999998092651367</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>10.072908222972274</real><real>10.152564609237686</real></array><key>cloud_shadow</key><array><real>0.25999999046325684</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00014000000373926014</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>8.1000003814697266</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>6.2831854820251465</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.4699999094009399</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>4.101177011798768</real><real>0.0010000000397674888</real><real>-0.49498037251770732</real><real>1</real></array><key>haze_density</key><array><real>0</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.50999999046325684</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>7.4445637210374116e-008</real><real>0.90482699871063232</real><real>-0.42577937245368958</real><real>0</real></array><key>max_y</key><array><real>921</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0</real><key>sun_angle</key><real>2.0106194019317627</real><key>sunlight_color</key><array><real>1.9499999284744263</real><real>0.71999996900558472</real><real>1.6899898052215576</real><real>1.9499999284744263</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Study%20vessels.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Study%20vessels.xml
new file mode 100644
index 0000000..0047172
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Study%20vessels.xml
@@ -0,0 +1 @@
<llsd><map><key>ambient</key><array><real>0.53999996185302734</real><real>0</real><real>0</real><real>0.53999996185302734</real></array><key>blue_density</key><array><real>0.086239993572235107</real><real>0.24640001356601715</real><real>0.87999999523162842</real><real>0.87999999523162842</real></array><key>blue_horizon</key><array><real>0.10560000687837601</real><real>0.30882984399795532</real><real>0.87999999523162842</real><real>0.87999999523162842</real></array><key>cloud_color</key><array><real>0.47774997353553772</real><real>0.77024996280670166</real><real>0.77999997138977051</real><real>0.77999997138977051</real></array><key>cloud_pos_density1</key><array><real>0.48999997973442078</real><real>0.5</real><real>0.35999998450279236</real><real>1</real></array><key>cloud_pos_density2</key><array><real>0.34000000357627869</real><real>0.42999997735023499</real><real>0.37000000476837158</real><real>1</real></array><key>cloud_scale</key><array><real>0.28999999165534973</real><real>0</real><real>0</real><real>1</real></array><key>cloud_scroll_rate</key><array><real>9.930000339250185</real><real>10.199999625297616</real></array><key>cloud_shadow</key><array><real>0.35999998450279236</real><real>0</real><real>0</real><real>1</real></array><key>density_multiplier</key><array><real>0.00016999999934341758</real><real>0</real><real>0</real><real>1</real></array><key>distance_multiplier</key><array><real>29.5</real><real>0</real><real>0</real><real>1</real></array><key>east_angle</key><real>1.8221237659454346</real><key>enable_cloud_scroll</key><array><boolean>0</boolean><boolean>0</boolean></array><key>gamma</key><array><real>1.4800000190734863</real><real>0</real><real>0</real><real>1</real></array><key>glow</key><array><real>11.200000762939453</real><real>0.0010000000474974513</real><real>-2.3999998569488525</real><real>1</real></array><key>haze_density</key><array><real>0.5899999737739563</real><real>0</real><real>0</real><real>1</real></array><key>haze_horizon</key><array><real>0.48999997973442078</real><real>0.19915600121021271</real><real>0.19915600121021271</real><real>1</real></array><key>lightnorm</key><array><real>0.96810519695281982</real><real>0.031410921365022659</real><real>0.24856719374656677</real><real>0</real></array><key>max_y</key><array><real>450.70001220703125</real><real>0</real><real>0</real><real>1</real></array><key>preset_num</key><integer>18</integer><key>star_brightness</key><real>0.68999999761581421</real><key>sun_angle</key><real>3.1101765632629395</real><key>sunlight_color</key><array><real>2.0099997520446777</real><real>1.3892644643783569</real><real>1.0049998760223389</real><real>0.66999995708465576</real></array></map></llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Teak%20weak.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Teak%20weak.xml
new file mode 100644
index 0000000..c865b39
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Teak%20weak.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.42000001668930054</real>
6 <real>0</real>
7 <real>0</real>
8 <real>0.42000001668930054</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.019999999552965164</real>
13 <real>0.059999998658895493</real>
14 <real>0.019999999552965164</real>
15 <real>0.059999998658895493</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.89999997615814209</real>
20 <real>0.71999996900558472</real>
21 <real>0.53999996185302734</real>
22 <real>1.0799999237060547</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0</real>
27 <real>0</real>
28 <real>0</real>
29 <real>0</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.47999998927116394</real>
34 <real>0.23999999463558197</real>
35 <real>0.34999999403953552</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.5</real>
41 <real>0.5</real>
42 <real>0.17000000178813934</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.26999998092651367</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.072908222972274</real>
55 <real>10.152564609237686</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.25999999046325684</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00018999999156221747</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>9.5</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0.8796459436416626</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0799999237060547</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>4.101177011798768</real>
95 <real>0.0010000000397674888</real>
96 <real>-0.49498037251770732</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.52999997138977051</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.43309280276298523</real>
116 <real>0.82708048820495605</real>
117 <real>-0.35828551650047302</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>993</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>0</real>
131 <key>sun_angle</key>
132 <real>2.1676990985870361</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.9499999284744263</real>
136 <real>1.3799998760223389</real>
137 <real>1.6899898052215576</real>
138 <real>1.9499999284744263</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Wuxia%20nights.xml b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Wuxia%20nights.xml
new file mode 100644
index 0000000..2774c08
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/%5BTOR%5D%20Wuxia%20nights.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.87185126543045044</real>
6 <real>1.0359940528869629</real>
7 <real>1.4099999666213989</real>
8 <real>0.4699999988079071</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.5</real>
13 <real>0.019999999552965164</real>
14 <real>0.5</real>
15 <real>0.51999998092651367</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.84959989786148071</real>
20 <real>1.1799999475479126</real>
21 <real>1.1799999475479126</real>
22 <real>0.5899999737739563</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.22615399956703186</real>
27 <real>0.22615399956703186</real>
28 <real>0.22615399956703186</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0</real>
34 <real>0.23999999463558197</real>
35 <real>0.34999999403953552</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>5.9584097862243652</real>
41 <real>6.9909601211547852</real>
42 <real>0.0099999997764825821</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.37999999523162842</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>10.49940013885498</real>
55 <real>10.01099967956543</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.19999998807907104</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00026999998954124749</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>0.5</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>0</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>0</boolean>
83 <boolean>0</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>5</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.69999998807907104</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>1.6799999475479126</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>1</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0</real>
116 <real>0</real>
117 <real>1</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>18</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>24</integer>
129 <key>star_brightness</key>
130 <real>2</real>
131 <key>sun_angle</key>
132 <real>6.1512389183044434</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.32999998331069946</real>
136 <real>1.6170113086700439</real>
137 <real>3</real>
138 <real>1</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/Rouge%201.xml b/linden/indra/newview/app_settings/windlight/skies/Rouge%201.xml
new file mode 100644
index 0000000..896abf6
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/Rouge%201.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.35999998450279236</real>
6 <real>0.42000001668930054</real>
7 <real>0.42000001668930054</real>
8 <real>0.42000001668930054</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.51999998092651367</real>
13 <real>0.2800000011920929</real>
14 <real>0.51999998092651367</real>
15 <real>0.51999998092651367</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.69999998807907104</real>
20 <real>0.69999998807907104</real>
21 <real>0.68000000715255737</real>
22 <real>0.69999998807907104</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>1</real>
27 <real>0.79000002145767212</real>
28 <real>0.80000001192092896</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.40999999642372131</real>
34 <real>0.39999997615814209</real>
35 <real>0.88999998569488525</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.28999999165534973</real>
41 <real>0.32999998331069946</real>
42 <real>0.039999999105930328</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.37999999523162842</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>11.809999465942383</real>
55 <real>12.799999237060547</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.31999999284744263</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00021999998716637492</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>4</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.8327431678771973</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.5399999618530273</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>14.40000057220459</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.85000002384185791</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>2.0399999618530273</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.049999997019767761</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.63680768013000488</real>
116 <real>0.043968122452497482</real>
117 <real>-0.76976805925369263</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>676.10003662109375</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>2</real>
131 <key>sun_angle</key>
132 <real>0.043982300907373428</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.369999885559082</real>
136 <real>1.4099999666213989</real>
137 <real>1.0199999809265137</real>
138 <real>2.369999885559082</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/Rouge%202.xml b/linden/indra/newview/app_settings/windlight/skies/Rouge%202.xml
new file mode 100644
index 0000000..3b170ac
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/Rouge%202.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.84000003337860107</real>
6 <real>0.56999999284744263</real>
7 <real>0.56999999284744263</real>
8 <real>0.84000003337860107</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>1.0799999237060547</real>
13 <real>0.51999998092651367</real>
14 <real>0.51999998092651367</real>
15 <real>1.0799999237060547</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.57999998331069946</real>
20 <real>0.25999999046325684</real>
21 <real>0.25999999046325684</real>
22 <real>0.57999998331069946</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>1</real>
27 <real>0.79000002145767212</real>
28 <real>0.80000001192092896</real>
29 <real>1</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.40999999642372131</real>
34 <real>0.39999997615814209</real>
35 <real>0.88999998569488525</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.28999999165534973</real>
41 <real>0.32999998331069946</real>
42 <real>0.039999999105930328</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.37999999523162842</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>11.809999465942383</real>
55 <real>12.799999237060547</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.31999999284744263</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.0002899999963119626</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>5.5999999046325684</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.8327431678771973</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.5399999618530273</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>14.40000057220459</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.85000002384185791</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>2.0399999618530273</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.049999997019767761</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.63495957851409912</real>
116 <real>0.087851203978061676</real>
117 <real>-0.76753407716751099</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>676.10003662109375</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>18</integer>
129 <key>star_brightness</key>
130 <real>2</real>
131 <key>sun_angle</key>
132 <real>0.087964601814746857</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>2.2799999713897705</real>
136 <real>0.75</real>
137 <real>0.59999996423721313</real>
138 <real>2.2799999713897705</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/Rouge%203.xml b/linden/indra/newview/app_settings/windlight/skies/Rouge%203.xml
new file mode 100644
index 0000000..5cc7a61
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/Rouge%203.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.71999996900558472</real>
6 <real>0.71999996900558472</real>
7 <real>0.71999996900558472</real>
8 <real>0.23999999463558197</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.31999999284744263</real>
13 <real>0.094117648899555206</real>
14 <real>0.094117648899555206</real>
15 <real>0.15999999642372131</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.45999997854232788</real>
20 <real>0</real>
21 <real>0.039999999105930328</real>
22 <real>0.45999997854232788</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.14000000059604645</real>
27 <real>0.14000000059604645</real>
28 <real>0.14000000059604645</real>
29 <real>0.14000000059604645</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.74000000953674316</real>
34 <real>0.93999999761581421</real>
35 <real>0.20999999344348907</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.65999996662139893</real>
41 <real>0.52999997138977051</real>
42 <real>0.0099999997764825821</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.070000000298023224</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>18</real>
55 <real>20</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.34000000357627869</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00018000000272877514</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>6.7000002861022949</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.5185837745666504</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.0399999618530273</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>17.399999618530273</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.64999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.40999999642372131</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.17000000178813934</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.3677685558795929</real>
116 <real>0.043968122452497482</real>
117 <real>-0.92887735366821289</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>263</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>24</integer>
129 <key>star_brightness</key>
130 <real>1.0399999618530273</real>
131 <key>sun_angle</key>
132 <real>0.043982300907373428</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.5899999141693115</real>
136 <real>1.5899999141693115</real>
137 <real>1.5899999141693115</real>
138 <real>1.5899999141693115</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/Rouge%204.xml b/linden/indra/newview/app_settings/windlight/skies/Rouge%204.xml
new file mode 100644
index 0000000..d48a4a2
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/Rouge%204.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.42000001668930054</real>
6 <real>0.29999998211860657</real>
7 <real>0.29999998211860657</real>
8 <real>0.42000001668930054</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.59999996423721313</real>
13 <real>0.15999999642372131</real>
14 <real>0.2199999988079071</real>
15 <real>0.59999996423721313</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.029999999329447746</real>
20 <real>0</real>
21 <real>0</real>
22 <real>0.079999998211860657</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0.81999999284744263</real>
27 <real>0.18999999761581421</real>
28 <real>0.039999999105930328</real>
29 <real>0.81999999284744263</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.74000000953674316</real>
34 <real>0.93999999761581421</real>
35 <real>0.20999999344348907</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.65999996662139893</real>
41 <real>0.52999997138977051</real>
42 <real>0.0099999997764825821</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.14000000059604645</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>18</real>
55 <real>20</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.37999999523162842</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00015999999595806003</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>17.399999618530273</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>2.3247785568237305</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.5299999713897705</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>17.399999618530273</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.64999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.32999998331069946</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.079999998211860657</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>-0.72615015506744385</real>
116 <real>0.087851203978061676</real>
117 <real>-0.68190038204193115</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>1048</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>24</integer>
129 <key>star_brightness</key>
130 <real>1.3199999332427979</real>
131 <key>sun_angle</key>
132 <real>0.087964601814746857</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>1.5899999141693115</real>
136 <real>0.47999998927116394</real>
137 <real>0.53999996185302734</real>
138 <real>1.5899999141693115</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/Rouge%205.xml b/linden/indra/newview/app_settings/windlight/skies/Rouge%205.xml
new file mode 100644
index 0000000..3ceb600
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/Rouge%205.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.77999997138977051</real>
6 <real>0.29999998211860657</real>
7 <real>0.29999998211860657</real>
8 <real>0.77999997138977051</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>1.5799999237060547</real>
13 <real>0.45999997854232788</real>
14 <real>0.45999997854232788</real>
15 <real>1.5799999237060547</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.97999995946884155</real>
20 <real>0.34000000357627869</real>
21 <real>0.35999998450279236</real>
22 <real>0.97999995946884155</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0</real>
27 <real>0</real>
28 <real>0</real>
29 <real>0</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.74000000953674316</real>
34 <real>0.93999999761581421</real>
35 <real>0.19999998807907104</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.65999996662139893</real>
41 <real>0.69999998807907104</real>
42 <real>0</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.070000000298023224</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>2.8600001335144043</real>
55 <real>17.589999675750732</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.42999997735023499</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00015999999595806003</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>2.1000001430511475</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.7699110507965088</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.1100000143051147</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>14.000000953674316</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.89999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.82999998331069946</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.48999997973442078</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.58778512477874756</real>
116 <real>0</real>
117 <real>-0.80901706218719482</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>276</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>24</integer>
129 <key>star_brightness</key>
130 <real>1.1699999570846558</real>
131 <key>sun_angle</key>
132 <real>0</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.29999998211860657</real>
136 <real>0.29999998211860657</real>
137 <real>0.29999998211860657</real>
138 <real>0.099999994039535522</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/skies/Rouge%206.xml b/linden/indra/newview/app_settings/windlight/skies/Rouge%206.xml
new file mode 100644
index 0000000..c36da85
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/skies/Rouge%206.xml
@@ -0,0 +1,141 @@
1<llsd>
2 <map>
3 <key>ambient</key>
4 <array>
5 <real>0.77999997138977051</real>
6 <real>0.29999998211860657</real>
7 <real>0.29999998211860657</real>
8 <real>0.77999997138977051</real>
9 </array>
10 <key>blue_density</key>
11 <array>
12 <real>0.65999996662139893</real>
13 <real>0.58384609222412109</real>
14 <real>0.58384609222412109</real>
15 <real>0.32999998331069946</real>
16 </array>
17 <key>blue_horizon</key>
18 <array>
19 <real>0.37999999523162842</real>
20 <real>0.34000000357627869</real>
21 <real>0.35999998450279236</real>
22 <real>0.37999999523162842</real>
23 </array>
24 <key>cloud_color</key>
25 <array>
26 <real>0</real>
27 <real>0</real>
28 <real>0</real>
29 <real>0</real>
30 </array>
31 <key>cloud_pos_density1</key>
32 <array>
33 <real>0.74000000953674316</real>
34 <real>0.93999999761581421</real>
35 <real>0.19999998807907104</real>
36 <real>1</real>
37 </array>
38 <key>cloud_pos_density2</key>
39 <array>
40 <real>0.65999996662139893</real>
41 <real>0.69999998807907104</real>
42 <real>0</real>
43 <real>1</real>
44 </array>
45 <key>cloud_scale</key>
46 <array>
47 <real>0.070000000298023224</real>
48 <real>0</real>
49 <real>0</real>
50 <real>1</real>
51 </array>
52 <key>cloud_scroll_rate</key>
53 <array>
54 <real>2.8600001335144043</real>
55 <real>17.589999675750732</real>
56 </array>
57 <key>cloud_shadow</key>
58 <array>
59 <real>0.42999997735023499</real>
60 <real>0</real>
61 <real>0</real>
62 <real>1</real>
63 </array>
64 <key>density_multiplier</key>
65 <array>
66 <real>0.00015999999595806003</real>
67 <real>0</real>
68 <real>0</real>
69 <real>1</real>
70 </array>
71 <key>distance_multiplier</key>
72 <array>
73 <real>2.1000001430511475</real>
74 <real>0</real>
75 <real>0</real>
76 <real>1</real>
77 </array>
78 <key>east_angle</key>
79 <real>3.7699110507965088</real>
80 <key>enable_cloud_scroll</key>
81 <array>
82 <boolean>1</boolean>
83 <boolean>1</boolean>
84 </array>
85 <key>gamma</key>
86 <array>
87 <real>1.1100000143051147</real>
88 <real>0</real>
89 <real>0</real>
90 <real>1</real>
91 </array>
92 <key>glow</key>
93 <array>
94 <real>14.000000953674316</real>
95 <real>0.0010000000474974513</real>
96 <real>-0.89999997615814209</real>
97 <real>1</real>
98 </array>
99 <key>haze_density</key>
100 <array>
101 <real>0.82999998331069946</real>
102 <real>0</real>
103 <real>0</real>
104 <real>1</real>
105 </array>
106 <key>haze_horizon</key>
107 <array>
108 <real>0.2800000011920929</real>
109 <real>0.19915600121021271</real>
110 <real>0.19915600121021271</real>
111 <real>1</real>
112 </array>
113 <key>lightnorm</key>
114 <array>
115 <real>0.58778512477874756</real>
116 <real>0</real>
117 <real>-0.80901706218719482</real>
118 <real>0</real>
119 </array>
120 <key>max_y</key>
121 <array>
122 <real>276</real>
123 <real>0</real>
124 <real>0</real>
125 <real>1</real>
126 </array>
127 <key>preset_num</key>
128 <integer>24</integer>
129 <key>star_brightness</key>
130 <real>1.1699999570846558</real>
131 <key>sun_angle</key>
132 <real>0</real>
133 <key>sunlight_color</key>
134 <array>
135 <real>0.29999998211860657</real>
136 <real>0.29999998211860657</real>
137 <real>0.29999998211860657</real>
138 <real>0.099999994039535522</real>
139 </array>
140 </map>
141</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Arrakissed%20variation.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Arrakissed%20variation.xml
new file mode 100644
index 0000000..138b9c3
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Arrakissed%20variation.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0</real>
5 <key>fresnelOffset</key>
6 <real>0.44999998807907104</real>
7 <key>fresnelScale</key>
8 <real>0.29999998211860657</real>
9 <key>normScale</key>
10 <array>
11 <real>4.2000002861022949</real>
12 <real>3.2000000476837158</real>
13 <real>5</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>d0512dd3-2d6f-8970-1d16-3829d8f8299d</uuid>
17 <key>scaleAbove</key>
18 <real>0.39999997615814209</real>
19 <key>scaleBelow</key>
20 <real>0.2800000011920929</real>
21 <key>underWaterFogMod</key>
22 <real>0.98999994993209839</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0</real>
26 <real>0</real>
27 <real>0.5</real>
28 <real>1</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>29.857057571411133</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>1.2199999094009399</real>
35 <real>-0.22000008821487427</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>-2.7200000286102295</real>
40 <real>-0.67000001668930054</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist%202.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist%202.xml
new file mode 100644
index 0000000..c0c422b
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist%202.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.010000000707805157</real>
5 <key>fresnelOffset</key>
6 <real>0.87000000476837158</real>
7 <key>fresnelScale</key>
8 <real>0.70999997854232788</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>0.30000001192092896</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>d727239c-056f-cce0-0681-e190ba7d9e50</uuid>
17 <key>scaleAbove</key>
18 <real>0.099999994039535522</real>
19 <key>scaleBelow</key>
20 <real>0.20000000298023224</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0</real>
24 <real>0.25</real>
25 <real>0.5</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>0.57434922456741333</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.10000008344650269</real>
33 <real>-0.11000008881092072</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-0.12000008672475815</real>
38 <real>0.23999990522861481</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist.xml
new file mode 100644
index 0000000..49aa4e1
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Atomist.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.0020000000949949026</real>
5 <key>fresnelOffset</key>
6 <real>0.87999999523162842</real>
7 <key>fresnelScale</key>
8 <real>1</real>
9 <key>normScale</key>
10 <array>
11 <real>0.30000001192092896</real>
12 <real>0.60000002384185791</real>
13 <real>1.2000000476837158</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.099999994039535522</real>
19 <key>scaleBelow</key>
20 <real>0.20000000298023224</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0</real>
24 <real>0.25</real>
25 <real>0.5</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>0.088388346135616302</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.10000008344650269</real>
33 <real>-0.11000008881092072</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-0.12000008672475815</real>
38 <real>0.23999990522861481</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Bayouette.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Bayouette.xml
new file mode 100644
index 0000000..2ab6743
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Bayouette.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.024000000208616257</real>
5 <key>fresnelOffset</key>
6 <real>0.42999997735023499</real>
7 <key>fresnelScale</key>
8 <real>0.17000000178813934</real>
9 <key>normScale</key>
10 <array>
11 <real>1.8999999761581421</real>
12 <real>1.1000000238418579</real>
13 <real>0.69999998807907104</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.039999999105930328</real>
19 <key>scaleBelow</key>
20 <real>0.15999999642372131</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.79999995231628418</real>
24 <real>0.40000015497207642</real>
25 <real>0</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>18.379177093505859</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.58000010251998901</real>
33 <real>-0.21000008285045624</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>0.46999990940093994</real>
38 <real>-0.16000008583068848</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Chivandria%20clair.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Chivandria%20clair.xml
new file mode 100644
index 0000000..6f4ac78
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Chivandria%20clair.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0</real>
5 <key>fresnelOffset</key>
6 <real>0.65999996662139893</real>
7 <key>fresnelScale</key>
8 <real>0.059999998658895493</real>
9 <key>normScale</key>
10 <array>
11 <real>1</real>
12 <real>1</real>
13 <real>1</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>1a29d128-f6cb-874f-b39a-bbb68605f950</uuid>
17 <key>scaleAbove</key>
18 <real>1</real>
19 <key>scaleBelow</key>
20 <real>0.099999994039535522</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.5</real>
24 <real>0</real>
25 <real>1</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>0.5</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.260000079870224</real>
33 <real>-0.260000079870224</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-0.260000079870224</real>
38 <real>-0.260000079870224</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Claira.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Claira.xml
new file mode 100644
index 0000000..d6476dd
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Claira.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.017000000923871994</real>
5 <key>fresnelOffset</key>
6 <real>0.69999998807907104</real>
7 <key>fresnelScale</key>
8 <real>0.59999996423721313</real>
9 <key>normScale</key>
10 <array>
11 <real>2</real>
12 <real>1</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.049999997019767761</real>
19 <key>scaleBelow</key>
20 <real>0.099999994039535522</real>
21 <key>underWaterFogMod</key>
22 <real>0</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0.059999998658895493</real>
26 <real>0.37999999523162842</real>
27 <real>0.52999997138977051</real>
28 <real>0.52999997138977051</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>1</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-1.3300000429153442</real>
35 <real>-1.8799999952316284</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>-1.8100000619888306</real>
40 <real>-1.3300000429153442</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Coral%20reef.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Coral%20reef.xml
new file mode 100644
index 0000000..0da3e52
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Coral%20reef.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.0080000003799796104</real>
5 <key>fresnelOffset</key>
6 <real>1</real>
7 <key>fresnelScale</key>
8 <real>1</real>
9 <key>normScale</key>
10 <array>
11 <real>10</real>
12 <real>5</real>
13 <real>2.5</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>2211e97d-e6ed-c592-3bac-c00cad2a86c0</uuid>
17 <key>scaleAbove</key>
18 <real>0.039999999105930328</real>
19 <key>scaleBelow</key>
20 <real>0.039999999105930328</real>
21 <key>underWaterFogMod</key>
22 <real>0.25</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>1</real>
26 <real>0.5</real>
27 <real>0</real>
28 <real>1</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>0.61557221412658691</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-0.20000007748603821</real>
35 <real>-0.25000008940696716</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>0.099999904632568359</real>
40 <real>0.14999990165233612</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Crosshatched%20plans.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Crosshatched%20plans.xml
new file mode 100644
index 0000000..cee0a26
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Crosshatched%20plans.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.0040000001899898052</real>
5 <key>fresnelOffset</key>
6 <real>0.5899999737739563</real>
7 <key>fresnelScale</key>
8 <real>0.17999999225139618</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>1.6000000238418579</real>
13 <real>0.5</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>22229d16-3871-7dee-2042-dbfa25cd8bce</uuid>
17 <key>scaleAbove</key>
18 <real>0.049999997019767761</real>
19 <key>scaleBelow</key>
20 <real>0.14999999105930328</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.39999997615814209</real>
24 <real>0.39999997615814209</real>
25 <real>1</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>4.9245781898498535</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-1.0500000715255737</real>
33 <real>-1.0500000715255737</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-1.0500000715255737</real>
38 <real>-0.95000004768371582</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Eyeballin%27.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Eyeballin%27.xml
new file mode 100644
index 0000000..d95bd6d
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Eyeballin%27.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0</real>
5 <key>fresnelOffset</key>
6 <real>0.87999999523162842</real>
7 <key>fresnelScale</key>
8 <real>0.64999997615814209</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>0</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.0099999997764825821</real>
19 <key>scaleBelow</key>
20 <real>0.019999999552965164</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>1</real>
24 <real>1</real>
25 <real>1</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>3.2490098476409912</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>0.049999907612800598</real>
33 <real>0.10999990999698639</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>0.049999907612800598</real>
38 <real>0.11999990791082382</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Fantastuck.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Fantastuck.xml
new file mode 100644
index 0000000..652efdb
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Fantastuck.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.0070000002160668373</real>
5 <key>fresnelOffset</key>
6 <real>1</real>
7 <key>fresnelScale</key>
8 <real>0.26999998092651367</real>
9 <key>normScale</key>
10 <array>
11 <real>3.1000001430511475</real>
12 <real>2.6000001430511475</real>
13 <real>1.3999999761581421</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>5748decc-f629-461c-9a36-a35a221fe21f</uuid>
17 <key>scaleAbove</key>
18 <real>0.049999997019767761</real>
19 <key>scaleBelow</key>
20 <real>0</real>
21 <key>underWaterFogMod</key>
22 <real>0</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0</real>
26 <real>1</real>
27 <real>0.5</real>
28 <real>1</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>1</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-0.010000089183449745</real>
35 <real>-8.9406967163085938e-008</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>-8.9406967163085938e-008</real>
40 <real>0.009999910369515419</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Featuresque.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Featuresque.xml
new file mode 100644
index 0000000..98bec18
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Featuresque.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0</real>
5 <key>fresnelOffset</key>
6 <real>0.79999995231628418</real>
7 <key>fresnelScale</key>
8 <real>1</real>
9 <key>normScale</key>
10 <array>
11 <real>4.7000002861022949</real>
12 <real>0</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>f9df2fcd-4895-77ec-3fcd-4cb1cef21588</uuid>
17 <key>scaleAbove</key>
18 <real>0.039999999105930328</real>
19 <key>scaleBelow</key>
20 <real>0</real>
21 <key>underWaterFogMod</key>
22 <real>0.25</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0.79999995231628418</real>
26 <real>0.40000015497207642</real>
27 <real>0</real>
28 <real>1</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>18.379177093505859</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-0.58000010251998901</real>
35 <real>-0.21000008285045624</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>0.46999990940093994</real>
40 <real>-0.16000008583068848</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Freak%2DA%2Ddermia.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Freak%2DA%2Ddermia.xml
new file mode 100644
index 0000000..d9c715a
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Freak%2DA%2Ddermia.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0</real>
5 <key>fresnelOffset</key>
6 <real>1</real>
7 <key>fresnelScale</key>
8 <real>1</real>
9 <key>normScale</key>
10 <array>
11 <real>10</real>
12 <real>10</real>
13 <real>10</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>1a29d128-f6cb-874f-b39a-bbb68605f950</uuid>
17 <key>scaleAbove</key>
18 <real>1</real>
19 <key>scaleBelow</key>
20 <real>1</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>1</real>
24 <real>0</real>
25 <real>0.5</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>32</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>3.9999997615814209</real>
33 <real>3.9999997615814209</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>3.9999997615814209</real>
38 <real>3.9999997615814209</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Glaznost.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Glaznost.xml
new file mode 100644
index 0000000..267f786
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Glaznost.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.082000002264976501</real>
5 <key>fresnelOffset</key>
6 <real>0.66999995708465576</real>
7 <key>fresnelScale</key>
8 <real>0</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>0</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0</real>
19 <key>scaleBelow</key>
20 <real>0</real>
21 <key>underWaterFogMod</key>
22 <real>0</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0.049999997019767761</real>
26 <real>0.37999999523162842</real>
27 <real>0.52999997138977051</real>
28 <real>0.52999997138977051</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>1</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-8.9406967163085938e-008</real>
35 <real>-8.9406967163085938e-008</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>-8.9406967163085938e-008</real>
40 <real>-8.9406967163085938e-008</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Grantamount.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Grantamount.xml
new file mode 100644
index 0000000..4ec8b36
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Grantamount.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.16000001132488251</real>
5 <key>fresnelOffset</key>
6 <real>1</real>
7 <key>fresnelScale</key>
8 <real>1</real>
9 <key>normScale</key>
10 <array>
11 <real>10</real>
12 <real>10</real>
13 <real>10</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.88999998569488525</real>
19 <key>scaleBelow</key>
20 <real>1</real>
21 <key>underWaterFogMod</key>
22 <real>0.31999999284744263</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>1</real>
26 <real>0</real>
27 <real>0.5</real>
28 <real>1</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>1024</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-4</real>
35 <real>-3.8299999237060547</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>-4</real>
40 <real>-3.8299999237060547</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Hpmod.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Hpmod.xml
new file mode 100644
index 0000000..10994dc
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Hpmod.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.014000000432133675</real>
5 <key>fresnelOffset</key>
6 <real>0.65999996662139893</real>
7 <key>fresnelScale</key>
8 <real>0.070000000298023224</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>0</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0</real>
19 <key>scaleBelow</key>
20 <real>0</real>
21 <key>underWaterFogMod</key>
22 <real>0</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0.059999998658895493</real>
26 <real>0.37999999523162842</real>
27 <real>0.52999997138977051</real>
28 <real>0.52999997138977051</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>64</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-8.9406967163085938e-008</real>
35 <real>-8.9406967163085938e-008</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>-8.9406967163085938e-008</real>
40 <real>-8.9406967163085938e-008</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Ice%2Dlike.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Ice%2Dlike.xml
new file mode 100644
index 0000000..8489a2e
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Ice%2Dlike.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.040000002831220627</real>
5 <key>fresnelOffset</key>
6 <real>0.25</real>
7 <key>fresnelScale</key>
8 <real>0.5</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>0</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0</real>
19 <key>scaleBelow</key>
20 <real>0</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>1</real>
24 <real>1</real>
25 <real>1</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>64</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-8.9406967163085938e-008</real>
33 <real>-8.9406967163085938e-008</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-8.9406967163085938e-008</real>
38 <real>-8.9406967163085938e-008</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Impure.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Impure.xml
new file mode 100644
index 0000000..b118198
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Impure.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.01100000087171793</real>
5 <key>fresnelOffset</key>
6 <real>0.39999997615814209</real>
7 <key>fresnelScale</key>
8 <real>0.55000001192092896</real>
9 <key>normScale</key>
10 <array>
11 <real>10</real>
12 <real>10</real>
13 <real>10</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>0db3718c-49e9-ad61-b6c4-4e5b84d9e589</uuid>
17 <key>scaleAbove</key>
18 <real>0.15999999642372131</real>
19 <key>scaleBelow</key>
20 <real>0.34999999403953552</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.5</real>
24 <real>0.5</real>
25 <real>0.5</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>16</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.16000008583068848</real>
33 <real>-0.21000008285045624</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-0.32000008225440979</real>
38 <real>-0.32000008225440979</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Linear%20puddles.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Linear%20puddles.xml
new file mode 100644
index 0000000..08d82a6
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Linear%20puddles.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.024000000208616257</real>
5 <key>fresnelOffset</key>
6 <real>0.50999999046325684</real>
7 <key>fresnelScale</key>
8 <real>0.81000000238418579</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>1</real>
13 <real>2</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>78b6ea66-f557-811f-dec7-b21552cc5c51</uuid>
17 <key>scaleAbove</key>
18 <real>0.039999999105930328</real>
19 <key>scaleBelow</key>
20 <real>0.029999999329447746</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0</real>
24 <real>0.43750005960464478</real>
25 <real>0.43749997019767761</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>8.574188232421875</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-1.0500000715255737</real>
33 <real>-1.0000001192092896</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-1.3200000524520874</real>
38 <real>-1.4200000762939453</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Listeryne.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Listeryne.xml
new file mode 100644
index 0000000..1036fe4
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Listeryne.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.018000001087784767</real>
5 <key>fresnelOffset</key>
6 <real>0.47999998927116394</real>
7 <key>fresnelScale</key>
8 <real>0.11999999731779099</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>1.6000000238418579</real>
13 <real>1.7000000476837158</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>2124abf0-8733-8e3e-ff9b-2245f11884f5</uuid>
17 <key>scaleAbove</key>
18 <real>0.049999997019767761</real>
19 <key>scaleBelow</key>
20 <real>0.099999994039535522</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0</real>
24 <real>0.5</real>
25 <real>0</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>1.4142136573791504</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>0.8899998664855957</real>
33 <real>0.52999991178512573</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-0.47000008821487427</real>
38 <real>-0.11000008881092072</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Liz%20Taylor.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Liz%20Taylor.xml
new file mode 100644
index 0000000..c36dd7f
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Liz%20Taylor.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.029000001028180122</real>
5 <key>fresnelOffset</key>
6 <real>0.37999999523162842</real>
7 <key>fresnelScale</key>
8 <real>0.23999999463558197</real>
9 <key>normScale</key>
10 <array>
11 <real>1</real>
12 <real>0.90000003576278687</real>
13 <real>0.60000002384185791</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>d727239c-056f-cce0-0681-e190ba7d9e50</uuid>
17 <key>scaleAbove</key>
18 <real>0.059999998658895493</real>
19 <key>scaleBelow</key>
20 <real>0.11999999731779099</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.47399908304214478</real>
24 <real>0.361328125</real>
25 <real>0.638671875</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>14.928528785705566</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.42000007629394531</real>
33 <real>-0.050000086426734924</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-0.050000086426734924</real>
38 <real>-0.050000086426734924</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Maldives.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Maldives.xml
new file mode 100644
index 0000000..6da53e8
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Maldives.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.0030000000260770321</real>
5 <key>fresnelOffset</key>
6 <real>0.50999999046325684</real>
7 <key>fresnelScale</key>
8 <real>0.19999998807907104</real>
9 <key>normScale</key>
10 <array>
11 <integer>2</integer>
12 <integer>2</integer>
13 <integer>2</integer>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.079999998211860657</real>
19 <key>scaleBelow</key>
20 <real>0.20000000298023224</real>
21 <key>underWaterFogMod</key>
22 <real>0.25</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0</real>
26 <real>0</real>
27 <real>0.5</real>
28 <real>1</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>21.112127304077148</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>0.5</real>
35 <real>-0.17000000178813934</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>0.57999998331069946</real>
40 <real>-0.67000001668930054</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Meridian%20verde.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Meridian%20verde.xml
new file mode 100644
index 0000000..6e52b20
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Meridian%20verde.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.01900000125169754</real>
5 <key>fresnelOffset</key>
6 <real>0.38999998569488525</real>
7 <key>fresnelScale</key>
8 <real>0.62999999523162842</real>
9 <key>normScale</key>
10 <array>
11 <real>3.2000000476837158</real>
12 <real>2.7000000476837158</real>
13 <real>1.8999999761581421</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>1a5348cb-7164-b03e-8a45-70ad4cabe682</uuid>
17 <key>scaleAbove</key>
18 <real>0.19999998807907104</real>
19 <key>scaleBelow</key>
20 <real>0.19999998807907104</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0</real>
24 <real>0.25</real>
25 <real>0.25</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>3.4822025299072266</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-1.0000001192092896</real>
33 <real>-0.90000009536743164</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-0.80000007152557373</real>
38 <real>-0.70000004768371582</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Negative%20ultraspace.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Negative%20ultraspace.xml
new file mode 100644
index 0000000..3cb1d07
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Negative%20ultraspace.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.0080000003799796104</real>
5 <key>fresnelOffset</key>
6 <real>1</real>
7 <key>fresnelScale</key>
8 <real>1</real>
9 <key>normScale</key>
10 <array>
11 <real>10</real>
12 <real>5</real>
13 <real>2.5</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>2211e97d-e6ed-c592-3bac-c00cad2a86c0</uuid>
17 <key>scaleAbove</key>
18 <real>0.039999999105930328</real>
19 <key>scaleBelow</key>
20 <real>0.039999999105930328</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>1</real>
24 <real>0.5</real>
25 <real>0</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>0.61557221412658691</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.20000007748603821</real>
33 <real>-0.25000008940696716</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>0.099999904632568359</real>
38 <real>0.14999990165233612</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Placida%20brite.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Placida%20brite.xml
new file mode 100644
index 0000000..b822322
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Placida%20brite.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.01100000087171793</real>
5 <key>fresnelOffset</key>
6 <real>0.65999996662139893</real>
7 <key>fresnelScale</key>
8 <real>0</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>0</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0</real>
19 <key>scaleBelow</key>
20 <real>0</real>
21 <key>underWaterFogMod</key>
22 <real>0</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0</real>
26 <real>0</real>
27 <real>0.5</real>
28 <real>1</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>1</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-0.010000089183449745</real>
35 <real>-8.9406967163085938e-008</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>-8.9406967163085938e-008</real>
40 <real>0.009999910369515419</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Pretty%20placid.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Pretty%20placid.xml
new file mode 100644
index 0000000..4f5a18b
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Pretty%20placid.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.013000000268220901</real>
5 <key>fresnelOffset</key>
6 <real>0.39999997615814209</real>
7 <key>fresnelScale</key>
8 <real>0.19999998807907104</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>0.20000000298023224</real>
13 <real>0.40000000596046448</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>0db3718c-49e9-ad61-b6c4-4e5b84d9e589</uuid>
17 <key>scaleAbove</key>
18 <real>0.049999997019767761</real>
19 <key>scaleBelow</key>
20 <real>0.10999999940395355</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.19013670086860657</real>
24 <real>0.2818920910358429</real>
25 <real>0.39986327290534973</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>4.5947937965393066</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.010000089183449745</real>
33 <real>-0.020000088959932327</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>0.24999991059303284</real>
38 <real>0.39999991655349731</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Raw%20sewage.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Raw%20sewage.xml
new file mode 100644
index 0000000..d072409
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Raw%20sewage.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0</real>
5 <key>fresnelOffset</key>
6 <real>0.19999998807907104</real>
7 <key>fresnelScale</key>
8 <real>0.79999995231628418</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>0</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>56b9a89e-6851-0ca6-6200-beddd03e08e0</uuid>
17 <key>scaleAbove</key>
18 <real>0</real>
19 <key>scaleBelow</key>
20 <real>0</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.15906250476837158</real>
24 <real>0.13064941763877869</real>
25 <real>0.00093749165534973145</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>16</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-8.9406967163085938e-008</real>
33 <real>-8.9406967163085938e-008</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-8.9406967163085938e-008</real>
38 <real>-8.9406967163085938e-008</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Showing%20age.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Showing%20age.xml
new file mode 100644
index 0000000..deb6638
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Showing%20age.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.02200000174343586</real>
5 <key>fresnelOffset</key>
6 <real>0.099999994039535522</real>
7 <key>fresnelScale</key>
8 <real>0.91999995708465576</real>
9 <key>normScale</key>
10 <array>
11 <real>10</real>
12 <real>0</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>56b9a89e-6851-0ca6-6200-beddd03e08e0</uuid>
17 <key>scaleAbove</key>
18 <real>0.31999999284744263</real>
19 <key>scaleBelow</key>
20 <real>0.15999999642372131</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.084000006318092346</real>
24 <real>0.1586667001247406</real>
25 <real>0.19599999487400055</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>29.857057571411133</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.32000008225440979</real>
33 <real>-0.260000079870224</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-0.260000079870224</real>
38 <real>-0.32000008225440979</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Soldier%27s%20legacy.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Soldier%27s%20legacy.xml
new file mode 100644
index 0000000..9b93f3a
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Soldier%27s%20legacy.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.040000002831220627</real>
5 <key>fresnelOffset</key>
6 <real>0.32999998331069946</real>
7 <key>fresnelScale</key>
8 <real>0.62999999523162842</real>
9 <key>normScale</key>
10 <array>
11 <real>3</real>
12 <real>3.1000001430511475</real>
13 <real>3.2000000476837158</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>0297ce61-77f8-581e-b19d-2509881463e8</uuid>
17 <key>scaleAbove</key>
18 <real>0.039999999105930328</real>
19 <key>scaleBelow</key>
20 <real>0.14999999105930328</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.1803436279296875</real>
24 <real>0.2337188720703125</real>
25 <real>0.19869136810302734</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>64</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-1.6800000667572021</real>
33 <real>-1.6800000667572021</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>0.46999990940093994</real>
38 <real>0.31999990344047546</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Subtleties.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Subtleties.xml
new file mode 100644
index 0000000..e8b730d
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Subtleties.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.0040000001899898052</real>
5 <key>fresnelOffset</key>
6 <real>0.47999998927116394</real>
7 <key>fresnelScale</key>
8 <real>0.32999998331069946</real>
9 <key>normScale</key>
10 <array>
11 <real>1.2000000476837158</real>
12 <real>1.3000000715255737</real>
13 <real>1.3999999761581421</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.079999998211860657</real>
19 <key>scaleBelow</key>
20 <real>0.15999999642372131</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.065683603286743164</real>
24 <real>0.41682437062263489</real>
25 <real>0.52431637048721313</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>5.6568551063537598</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>0.45999988913536072</real>
33 <real>-0.18000008165836334</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-0.260000079870224</real>
38 <real>-0.69000005722045898</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Trandshan.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Trandshan.xml
new file mode 100644
index 0000000..d0211b6
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Trandshan.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.069000005722045898</real>
5 <key>fresnelOffset</key>
6 <real>0.59999996423721313</real>
7 <key>fresnelScale</key>
8 <real>0.41999998688697815</real>
9 <key>normScale</key>
10 <array>
11 <real>2</real>
12 <real>1</real>
13 <real>2</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.11999999731779099</real>
19 <key>scaleBelow</key>
20 <real>0.28999999165534973</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0</real>
24 <real>0.5</real>
25 <real>1</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>12.125733375549316</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-0.84000009298324585</real>
33 <real>-0.95000004768371582</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-2</real>
38 <real>-1.0500000715255737</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Watermelon%20juice.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Watermelon%20juice.xml
new file mode 100644
index 0000000..b6413a9
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Watermelon%20juice.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.0050000003539025784</real>
5 <key>fresnelOffset</key>
6 <real>0.43999999761581421</real>
7 <key>fresnelScale</key>
8 <real>0.14000000059604645</real>
9 <key>normScale</key>
10 <array>
11 <real>3</real>
12 <real>3</real>
13 <real>3</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.14000000059604645</real>
19 <key>scaleBelow</key>
20 <real>0.2800000011920929</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>1</real>
24 <real>0</real>
25 <real>0.5</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>21.112127304077148</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>0.43999990820884705</real>
33 <real>0.43999990820884705</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>0.43999990820884705</real>
38 <real>0.43999990820884705</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Waterslides.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Waterslides.xml
new file mode 100644
index 0000000..097748d
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Waterslides.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.0040000001899898052</real>
5 <key>fresnelOffset</key>
6 <real>0.59999996423721313</real>
7 <key>fresnelScale</key>
8 <real>0.64999997615814209</real>
9 <key>normScale</key>
10 <array>
11 <real>2</real>
12 <real>4</real>
13 <real>8</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.039999999105930328</real>
19 <key>scaleBelow</key>
20 <real>0.079999998211860657</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0</real>
24 <real>1</real>
25 <real>1</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>2.1435470581054687</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-2</real>
33 <real>-2</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>0.99999988079071045</real>
38 <real>0.99999988079071045</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20What%27s%20on%20TV.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20What%27s%20on%20TV.xml
new file mode 100644
index 0000000..beed3cc
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20What%27s%20on%20TV.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.040000002831220627</real>
5 <key>fresnelOffset</key>
6 <real>1</real>
7 <key>fresnelScale</key>
8 <real>1</real>
9 <key>normScale</key>
10 <array>
11 <real>10</real>
12 <real>5</real>
13 <real>2.5</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>22229d16-3871-7dee-2042-dbfa25cd8bce</uuid>
17 <key>scaleAbove</key>
18 <real>0.039999999105930328</real>
19 <key>scaleBelow</key>
20 <real>0.039999999105930328</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.5</real>
24 <real>0.5</real>
25 <real>1</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>0.26794338226318359</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>3.9999997615814209</real>
33 <real>-8.9406967163085938e-008</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>-4</real>
38 <real>-8.9406967163085938e-008</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Wickedly.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Wickedly.xml
new file mode 100644
index 0000000..510614c
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Wickedly.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0</real>
5 <key>fresnelOffset</key>
6 <real>1</real>
7 <key>fresnelScale</key>
8 <real>0</real>
9 <key>normScale</key>
10 <array>
11 <real>0</real>
12 <real>0</real>
13 <real>0</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>cb51029b-360b-81e6-a3e1-5620c44e0b71</uuid>
17 <key>scaleAbove</key>
18 <real>0.50999999046325684</real>
19 <key>scaleBelow</key>
20 <real>0.099999994039535522</real>
21 <key>underWaterFogMod</key>
22 <real>0</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0.5</real>
26 <real>0</real>
27 <real>1</real>
28 <real>1</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>25.992082595825195</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-2.3900001049041748</real>
35 <real>-1.8900001049041748</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>-1.3300000429153442</real>
40 <real>-1.0000001192092896</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20You%27re%20in%20luck.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20You%27re%20in%20luck.xml
new file mode 100644
index 0000000..72fe40d
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20You%27re%20in%20luck.xml
@@ -0,0 +1,41 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0</real>
5 <key>fresnelOffset</key>
6 <real>0.50999999046325684</real>
7 <key>fresnelScale</key>
8 <real>0.48999997973442078</real>
9 <key>normScale</key>
10 <array>
11 <real>3</real>
12 <real>2.9000000953674316</real>
13 <real>2.7999999523162842</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>822ded49-9a6c-f61c-cb89-6df54f42cdf4</uuid>
17 <key>scaleAbove</key>
18 <real>0.099999994039535522</real>
19 <key>scaleBelow</key>
20 <real>0.099999994039535522</real>
21 <key>waterFogColor</key>
22 <array>
23 <real>0.63937491178512573</real>
24 <real>0.65999996662139893</real>
25 <real>0</real>
26 <real>1</real>
27 </array>
28 <key>waterFogDensity</key>
29 <real>6.4980192184448242</real>
30 <key>wave1Dir</key>
31 <array>
32 <real>-8.9406967163085938e-008</real>
33 <real>0.099999904632568359</real>
34 </array>
35 <key>wave2Dir</key>
36 <array>
37 <real>0.19999989867210388</real>
38 <real>0.2999998927116394</real>
39 </array>
40 </map>
41</llsd>
diff --git a/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Yung%20buk.xml b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Yung%20buk.xml
new file mode 100644
index 0000000..2067b7c
--- /dev/null
+++ b/linden/indra/newview/app_settings/windlight/water/%5BTOR%5D%20Yung%20buk.xml
@@ -0,0 +1,43 @@
1<llsd>
2 <map>
3 <key>blurMultiplier</key>
4 <real>0.048000000417232513</real>
5 <key>fresnelOffset</key>
6 <real>0.72999995946884155</real>
7 <key>fresnelScale</key>
8 <real>0.26999998092651367</real>
9 <key>normScale</key>
10 <array>
11 <real>3.1000001430511475</real>
12 <real>2.6000001430511475</real>
13 <real>2.7000000476837158</real>
14 </array>
15 <key>normalMap</key>
16 <uuid>5748decc-f629-461c-9a36-a35a221fe21f</uuid>
17 <key>scaleAbove</key>
18 <real>0</real>
19 <key>scaleBelow</key>
20 <real>0</real>
21 <key>underWaterFogMod</key>
22 <real>0</real>
23 <key>waterFogColor</key>
24 <array>
25 <real>0</real>
26 <real>1</real>
27 <real>0.5</real>
28 <real>1</real>
29 </array>
30 <key>waterFogDensity</key>
31 <real>4</real>
32 <key>wave1Dir</key>
33 <array>
34 <real>-0.010000089183449745</real>
35 <real>-8.9406967163085938e-008</real>
36 </array>
37 <key>wave2Dir</key>
38 <array>
39 <real>-8.9406967163085938e-008</real>
40 <real>0.009999910369515419</real>
41 </array>
42 </map>
43</llsd>
diff --git a/linden/indra/newview/floaterlogin.cpp b/linden/indra/newview/floaterlogin.cpp
new file mode 100644
index 0000000..f1afc53
--- /dev/null
+++ b/linden/indra/newview/floaterlogin.cpp
@@ -0,0 +1,723 @@
1/*
2 * floaterlogin.cpp (floatergridmanager.cpp pls)
3 * This is Meerkats grid manager, and I accidentally finished it with the wrong name :)
4 * -Patrick Sapinski (Monday, August 17, 2009)
5 */
6
7#include "llviewerprecompiledheaders.h"
8
9#include <boost/algorithm/string.hpp>
10#include "llviewercontrol.h"
11#include "llviewerbuild.h"
12#include "llcombobox.h"
13#include "llscrolllistctrl.h"
14#include "llmd5.h"
15#include "llurlsimstring.h"
16#include "lluictrlfactory.h"
17#include "floaterlogin.h"
18#include "hippoGridManager.h"
19#include "llviewernetwork.h"
20#include "llpanellogin.h"
21
22#define PASSWORD_FILLER "123456789!123456"
23
24LoginFloater* LoginFloater::sInstance = NULL;
25LoginController* LoginFloater::sController = NULL;
26bool LoginFloater::sIsInitialLogin;
27std::string LoginFloater::sGrid;
28
29LoginFloater::LoginFloater()
30: LLFloater("floater_login")
31{
32
33 mState = NORMAL;
34 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_login.xml");
35
36
37 llwarns << "LoginFloater called" << llendl;
38
39
40 // configure the floater interface for non-initial login
41 setCanMinimize(!sIsInitialLogin);
42 setCanClose(!sIsInitialLogin);
43 setCanDrag(!sIsInitialLogin);
44 childSetVisible("server_combo", sIsInitialLogin);
45
46 if(!sIsInitialLogin)
47 {
48 LLButton* quit_btn = getChild<LLButton>("quit_btn");
49 quit_btn->setLabel(std::string("Cancel"));
50 setTitle(std::string("Grid Manager"));
51 }
52
53 center();
54 LLLineEditor* edit = getChild<LLLineEditor>("avatar_password_edit");
55 if (edit) edit->setDrawAsterixes(TRUE);
56 LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
57 combo->setAllowTextEntry(TRUE, 128, FALSE);
58
59 BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation");
60 std::string sim_string = LLURLSimString::sInstance.mSimString;
61 if (!sim_string.empty())
62 {
63 // Replace "<Type region name>" with this region name
64 combo->remove(2);
65 combo->add( sim_string );
66 combo->setTextEntry(sim_string);
67 combo->setCurrentByIndex( 2 );
68 }
69 else if (login_last)
70 {
71 combo->setCurrentByIndex( 1 );
72 }
73 else
74 {
75 combo->setCurrentByIndex( 0 );
76 }
77}
78
79
80LoginFloater::~LoginFloater()
81{
82 LoginFloater::sController = NULL;
83 LoginFloater::sInstance = NULL;
84}
85
86void LoginFloater::close()
87{
88 if(sInstance)
89 {
90 delete sInstance;
91 sInstance = NULL;
92 }
93}
94
95BOOL LoginFloater::postBuild()
96{
97 requires<LLScrollListCtrl>("grid_selector");
98 requires<LLLineEditor>("gridnick");
99 requires<LLLineEditor>("gridname");
100 requires<LLLineEditor>("loginuri");
101 requires<LLLineEditor>("loginpage");
102 requires<LLLineEditor>("helperuri");
103 requires<LLLineEditor>("website");
104 requires<LLLineEditor>("support");
105 requires<LLLineEditor>("register");
106 requires<LLLineEditor>("password");
107 requires<LLLineEditor>("first_name");
108 requires<LLLineEditor>("last_name");
109 requires<LLLineEditor>("avatar_password");
110 //requires<LLLineEditor>("search");
111 requires<LLButton>("btn_delete");
112 requires<LLButton>("btn_add");
113 requires<LLButton>("btn_copy");
114 requires<LLButton>("set_default");
115 requires<LLButton>("btn_gridinfo");
116 requires<LLButton>("btn_help_render_compat");
117 if (!checkRequirements()) return false;
118 LLLineEditor* password_edit = getChild<LLLineEditor>("avatar_password");
119 if (password_edit) password_edit->setDrawAsterixes(TRUE);
120
121 childSetAction("btn_delete", onClickDelete, this);
122 childSetAction("btn_add", onClickAdd, this);
123 childSetAction("btn_copy", onClickCopy, this);
124 childSetAction("btn_ok", onClickOk, this);
125 childSetAction("btn_apply", onClickApply, this);
126 // childSetAction("set_default", onClickDefault, this);
127 childSetAction("btn_cancel", onClickCancel, this);
128 childSetAction("btn_gridinfo", onClickGridInfo, this);
129 // childSetAction("btn_help_render_compat", onClickHelpRenderCompat, this);
130
131 childSetCommitCallback("grid_selector", onSelectGrid, this);
132//KOW childSetCommitCallback("platform", onSelectPlatform, this);
133
134 // !!!### server_choice_combo->setFocusLostCallback(onServerComboLostFocus);
135
136//KOW update();
137 return TRUE;
138}
139
140void LoginFloater::refresh_grids()
141{
142 const std::string &defaultGrid = gHippoGridManager->getDefaultGridNick();
143 LLScrollListCtrl *grids = sInstance->getChild<LLScrollListCtrl>("grid_selector");
144 S32 selectIndex = -1, i = 0;
145 grids->deleteAllItems();
146 if (defaultGrid != "") {
147 LLSD value;
148 value["id"] = defaultGrid;
149 value["columns"][0]["column"] = "grid";
150 value["columns"][0]["value"] = defaultGrid;
151 grids->addElement(value);
152 selectIndex = i++;
153 }
154
155 HippoGridManager::GridIterator it, end = gHippoGridManager->endGrid();
156 for (it = gHippoGridManager->beginGrid(); it != end; ++it) {
157 const std::string &grid = it->second->getGridNick();
158 if (grid != defaultGrid) {
159 LLSD value;
160 value["id"] = grid;
161 value["columns"][0]["column"] = "grid";
162 value["columns"][0]["value"] = grid;
163 grids->addElement(value);
164
165 if (grid == sInstance->mCurGrid) selectIndex = i;
166 i++;
167 }
168 }
169 if ((sInstance->mState == ADD_NEW) || (sInstance->mState == ADD_COPY)) {
170 grids->addElement("<new>");
171 selectIndex = i++;
172 }
173 if (selectIndex >= 0) {
174 //grids->setCurrentByIndex(selectIndex);
175 } else {
176 //grids->setLabel(LLStringExplicit("")); // LLComboBox::removeall() does not clear the label
177 }
178
179 // sInstance->childSetTextArg("default_grid", "[DEFAULT]", (defaultGrid != "")? defaultGrid: " ");
180
181 sInstance->childSetEnabled("btn_delete", (selectIndex >= 0));
182 sInstance->childSetEnabled("btn_copy", (sInstance->mState == NORMAL) && (selectIndex >= 0));
183 // sInstance->childSetEnabled("set_default", (sInstance->mState == NORMAL) && (selectIndex > 0));
184 sInstance->childSetEnabled("gridnick", (sInstance->mState == ADD_NEW) || (sInstance->mState == ADD_COPY));
185
186 if (sInstance->mState == NORMAL) {
187 HippoGridInfo *gridInfo = gHippoGridManager->getGrid(sInstance->mCurGrid);
188 if (gridInfo) {
189 sInstance->childSetText("gridnick", gridInfo->getGridNick());
190 //sInstance->childSetText("grid_name", gridInfo->getGridName());
191 sInstance->childSetText("loginuri", gridInfo->getLoginUri());
192 sInstance->childSetText("loginpage", gridInfo->getLoginPage());
193 sInstance->childSetText("helperuri", gridInfo->getHelperUri());
194 sInstance->childSetText("website", gridInfo->getWebSite());
195 sInstance->childSetText("support", gridInfo->getSupportUrl());
196 sInstance->childSetText("register", gridInfo->getRegisterUrl());
197 sInstance->childSetText("password", gridInfo->getPasswordUrl());
198
199 // sInstance->childSetText("first_name", gridInfo->getFirstName());
200 // sInstance->childSetText("last_name", gridInfo->getLastName());
201 // if(gridInfo->getAvatarPassword().length() == 32)
202 // sInstance->childSetText("avatar_password", std::string(PASSWORD_FILLER));
203 // else if(gridInfo->getPasswordUrl().empty())
204 // sInstance->childSetText("avatar_password", std::string(""));
205
206 // if (gridInfo->getPlatform() == HippoGridInfo::PLATFORM_SECONDLIFE) {
207 // //childSetEnabled("search", false);
208 // //childSetText("search", LLStringExplicit(""));
209 // childSetEnabled("render_compat", false);
210 // childSetValue("render_compat", false);
211 // } else {
212 // //childSetEnabled("search", true);
213 // //childSetText("search", gridInfo->getSearchUrl());
214 // childSetEnabled("render_compat", true);
215 // childSetValue("render_compat", gridInfo->isRenderCompat());
216 // }
217
218 } else {
219 std::string empty = "";
220 sInstance->childSetText("gridnick", empty);
221 sInstance->childSetText("gridname", empty);
222 sInstance->childSetText("loginuri", empty);
223 sInstance->childSetText("loginpage", empty);
224 sInstance->childSetText("helperuri", empty);
225 sInstance->childSetText("website", empty);
226 // sInstance->childSetText("first_name", empty);
227 // sInstance->childSetText("last_name", empty);
228 // sInstance->childSetText("avatar_password", empty);
229 }
230 } else if (sInstance->mState == ADD_NEW) {
231 llwarns << "ADD_NEW" << llendl;
232 std::string required = "<required>";
233 std::string empty = "";
234 sInstance->childSetText("gridnick", required);
235 sInstance->childSetText("gridname", empty);
236 sInstance->childSetText("loginuri", required);
237 sInstance->childSetText("loginpage", empty);
238 sInstance->childSetText("helperuri", empty);
239 sInstance->childSetText("website", empty);
240 sInstance->childSetText("support", empty);
241 sInstance->childSetText("register", empty);
242 sInstance->childSetText("password", empty);
243 // sInstance->childSetText("first_name", empty);
244 // sInstance->childSetText("last_name", empty);
245 // sInstance->childSetText("avatar_password", empty);
246 //childSetEnabled("search", true);
247 //childSetText("search", empty);
248 } else if (sInstance->mState == ADD_COPY) {
249 llwarns << "ADD_COPY" << llendl;
250 sInstance->childSetText("gridnick", LLStringExplicit("<required>"));
251 } else {
252 llwarns << "Illegal state " << sInstance->mState << '.' << llendl;
253 }
254 return;
255}
256
257void LoginFloater::update()
258{
259 mState = NORMAL;
260 mCurGrid = gHippoGridManager->getCurrentGridNick();
261 refresh_grids();
262 //KOW gHippoLimits->setLimits();
263}
264
265void LoginFloater::applyChanges()
266{
267 HippoGridInfo *gridInfo = gHippoGridManager->getGrid(mCurGrid);
268 if (gridInfo)
269 {
270 if (gridInfo->getGridNick() == childGetValue("gridnick").asString())
271 {
272 gridInfo->setGridName(childGetValue("gridname"));
273 gridInfo->setLoginUri(childGetValue("loginuri"));
274 gridInfo->setLoginPage(childGetValue("loginpage"));
275 gridInfo->setHelperUri(childGetValue("helperuri"));
276 gridInfo->setWebSite(childGetValue("website"));
277 gridInfo->setSupportUrl(childGetValue("support"));
278 gridInfo->setRegisterUrl(childGetValue("register"));
279 gridInfo->setPasswordUrl(childGetValue("password"));
280 //gridInfo->setSearchUrl(childGetValue("search"));
281 gridInfo->setRenderCompat(childGetValue("render_compat"));
282
283 // gridInfo->setFirstName(childGetValue("first_name"));
284 // gridInfo->setLastName(childGetValue("last_name"));
285 // if(childGetValue("avatar_password").asString().empty())
286 // gridInfo->setAvatarPassword(std::string(""));
287 // else if(childGetValue("avatar_password").asString() != std::string(PASSWORD_FILLER))
288 // {
289 // // store account authentication data
290 // std::string auth_password = childGetValue("avatar_password");
291 // std::string hashed_password;
292 // hashPassword(auth_password, hashed_password);
293 // gridInfo->setAvatarPassword(hashed_password);
294 // }
295
296 //this bug was a feature -Patrick Sapinski (Friday, August 21, 2009)
297 //LLPanelLogin::setFields(gridInfo->getFirstName(), gridInfo->getLastName(),
298 // gridInfo->getAvatarPassword(), true);
299 }
300 else
301 {
302 llwarns << "Grid nickname mismatch, ignoring changes." << llendl;
303 }
304 }
305}
306
307
308bool LoginFloater::createNewGrid()
309{
310 // check nickname
311 std::string gridnick = childGetValue("gridnick");
312 if (gridnick == "<required>") gridnick = "";
313 if (gridnick == "") {
314 //KOW gViewerWindow->alertXml("GridsNoNick");
315 return false;
316 }
317 if (gHippoGridManager->getGrid(gridnick)) {
318 LLStringUtil::format_map_t args;
319 args["[NAME]"] = gridnick;
320 //KOW gViewerWindow->alertXml("GridExists", args);
321 return false;
322 }
323
324 // check login URI
325 std::string loginuri = childGetValue("loginuri");
326 if ((loginuri == "") || (loginuri == "<required>")) {
327 LLStringUtil::format_map_t args;
328 args["[NAME]"] = gridnick;
329 //KOW gViewerWindow->alertXml("GridsNoLoginUri", args);
330 return false;
331 }
332
333 // create new grid
334 HippoGridInfo *grid = new HippoGridInfo(gridnick);
335 grid->setGridName(childGetValue("gridname"));
336 grid->setLoginUri(loginuri);
337 grid->setLoginPage(childGetValue("loginpage"));
338 grid->setHelperUri(childGetValue("helperuri"));
339 grid->setWebSite(childGetValue("website"));
340 grid->setSupportUrl(childGetValue("support"));
341 grid->setRegisterUrl(childGetValue("register"));
342 grid->setPasswordUrl(childGetValue("password"));
343 //grid->setSearchUrl(childGetValue("search"));
344 grid->setRenderCompat(childGetValue("render_compat"));
345 gHippoGridManager->addGrid(grid);
346
347 // grid->setFirstName(childGetValue("first_name"));
348 // grid->setLastName(childGetValue("last_name"));
349 // if(childGetValue("avatar_password").asString().empty())
350 // grid->setAvatarPassword(std::string(""));
351 // else
352 // {
353 // std::string hashed_password;
354 // hashPassword(childGetValue("avatar_password"), hashed_password);
355 // grid->setAvatarPassword(hashed_password);
356 // }
357
358 mCurGrid = gridnick;
359 return true;
360}
361
362void LoginFloater::retrieveGridInfo()
363{
364 std::string loginuri = childGetValue("loginuri");
365 if ((loginuri == "") || (loginuri == "<required>")) {
366 //KOW gViewerWindow->alertXml("GridInfoNoLoginUri");
367 return;
368 }
369
370 HippoGridInfo *grid = 0;
371 bool cleanupGrid = false;
372 if (mState == NORMAL) {
373 grid = gHippoGridManager->getGrid(mCurGrid);
374 } else if ((mState == ADD_NEW) || (mState == ADD_COPY)) {
375 grid = new HippoGridInfo("");
376 cleanupGrid = true;
377 } else {
378 llerrs << "Illegal state " << mState << '.' << llendl;
379 return;
380 }
381 if (!grid) {
382 llerrs << "Internal error retrieving grid info." << llendl;
383 return;
384 }
385
386 grid->setLoginUri(loginuri);
387 if (grid->retrieveGridInfo()) {
388 if (grid->getGridNick() != "") childSetText("gridnick", grid->getGridNick());
389 if (grid->getGridName() != "") childSetText("gridname", grid->getGridName());
390 if (grid->getLoginUri() != "") childSetText("loginuri", grid->getLoginUri());
391 if (grid->getLoginPage() != "") childSetText("loginpage", grid->getLoginPage());
392 if (grid->getHelperUri() != "") childSetText("helperuri", grid->getHelperUri());
393 if (grid->getWebSite() != "") childSetText("website", grid->getWebSite());
394 if (grid->getSupportUrl() != "") childSetText("support", grid->getSupportUrl());
395 if (grid->getRegisterUrl() != "") childSetText("register", grid->getRegisterUrl());
396 if (grid->getPasswordUrl() != "") childSetText("password", grid->getPasswordUrl());
397 //if (grid->getSearchUrl() != "") childSetText("search", grid->getSearchUrl());
398 } else {
399 //KOW gViewerWindow->alertXml("GridInfoError");
400 }
401
402 if (cleanupGrid) delete grid;
403}
404
405void LoginFloater::apply()
406{
407 if (mState == NORMAL) {
408 applyChanges();
409 } else if ((mState == ADD_NEW) || (mState == ADD_COPY)) {
410 if (!createNewGrid()) return;
411 } else {
412 llwarns << "Illegal state " << mState << '.' << llendl;
413 return;
414 }
415 //gHippoGridManager->setCurrentGrid(mCurGrid);
416 //gHippoGridManager->setDefaultGrid(mCurGrid);
417 //LLPanelLogin::refreshLoginPage();
418 gHippoGridManager->saveFile();
419 LLPanelLogin::addServer(LLViewerLogin::getInstance()->getGridLabel());
420}
421
422void LoginFloater::setDefault()
423{
424 if (mState == NORMAL) {
425 applyChanges();
426 } else if ((mState == ADD_NEW) || (mState == ADD_COPY)) {
427 if (!createNewGrid()) return;
428 } else {
429 llwarns << "Illegal state " << mState << '.' << llendl;
430 return;
431 }
432 gHippoGridManager->setCurrentGrid(mCurGrid);
433 gHippoGridManager->setDefaultGrid(mCurGrid);
434 gHippoGridManager->saveFile();
435 LLPanelLogin::addServer(LLViewerLogin::getInstance()->getGridLabel());
436}
437
438void LoginFloater::cancel()
439{
440 gHippoGridManager->discardAndReload();
441 update();
442}
443
444void LoginFloater::onSelectGrid(LLUICtrl* ctrl, void *data)
445{
446 LoginFloater* self = (LoginFloater*)data;
447 if (self->mState == NORMAL) {
448 self->applyChanges();
449 } else if ((self->mState == ADD_NEW) || (self->mState == ADD_COPY)) {
450 if (self->createNewGrid()) {
451 self->mState = NORMAL;
452 } else {
453 //LLScrollListCtrl *grids = self->getChild<LLScrollListCtrl>("grid_selector");
454 //grids->setCurrentByIndex(grids->getItemCount() - 1);
455 return;
456 }
457 } else {
458 llwarns << "Illegal state " << self->mState << '.' << llendl;
459 return;
460 }
461 self->mCurGrid = ctrl->getValue().asString();
462 self->refresh_grids();
463}
464
465//static
466void LoginFloater::onClickDelete(void *data)
467{
468 llwarns << "onclickdelete" << llendl;
469 LoginFloater* self = (LoginFloater*)data;
470 if (self->mState == NORMAL)
471 gHippoGridManager->deleteGrid(self->mCurGrid);
472 self->update();
473}
474
475//static
476void LoginFloater::onClickAdd(void *data)
477{
478 llwarns << "add" << llendl;
479 LoginFloater* self = (LoginFloater*)data;
480 self->mState = ADD_NEW;
481 self->refresh_grids();
482}
483
484
485//static
486void LoginFloater::onClickCopy(void *data)
487{
488 llwarns << "copy" << llendl;
489 LoginFloater* self = (LoginFloater*)data;
490 self->mState = ADD_COPY;
491 self->refresh_grids();
492}
493
494// static
495void LoginFloater::onClickOk(void* data)
496{
497 if(NULL==sInstance)
498 return;
499
500 sInstance->apply();
501 sInstance->close();
502}
503
504//static
505void LoginFloater::onClickApply(void *data)
506{
507 if(NULL==sInstance)
508 return;
509
510 sInstance->apply();
511 refresh_grids();
512}
513
514//static
515void LoginFloater::onClickDefault(void *data)
516{
517 sInstance->setDefault();
518 sInstance->refresh_grids();
519}
520
521//static
522void LoginFloater::onClickGridInfo(void *data)
523{
524 //HippoPanelGrids* self = (HippoPanelGrids*)data;
525 sInstance->retrieveGridInfo();
526}
527
528//static
529void LoginFloater::onClickCancel(void *data)
530{
531 sInstance->cancel();
532}
533
534void LoginFloater::setAlwaysRefresh(bool refresh)
535{
536 // wargames 2: dead code, LLPanelLogin compatibility
537 return;
538}
539
540void LoginFloater::refreshLocation( bool force_visible )
541{
542
543 llwarns << "refreshLocation called" << llendl;
544
545 if (!sInstance) return;
546
547 LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
548
549 if (LLURLSimString::parse())
550 {
551 combo->setCurrentByIndex( 3 ); // BUG? Maybe 2?
552 combo->setTextEntry(LLURLSimString::sInstance.mSimString);
553 }
554 else
555 {
556 BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation");
557 combo->setCurrentByIndex( login_last ? 1 : 0 );
558 }
559
560 BOOL show_start = TRUE;
561
562 if ( ! force_visible )
563 show_start = gSavedSettings.getBOOL("ShowStartLocation");
564
565 sInstance->childSetVisible("start_location_combo", show_start);
566 sInstance->childSetVisible("start_location_text", show_start);
567 sInstance->childSetVisible("server_combo", TRUE);
568}
569
570void LoginFloater::newShow(const std::string &grid, bool initialLogin)
571{
572
573 llwarns << "newShow called" << llendl;
574 if(NULL==sInstance)
575 {
576 LoginFloater::sGrid = grid;
577 LoginFloater::sIsInitialLogin = initialLogin;
578 sInstance = new LoginFloater();
579
580 llwarns << "sInstance assigned. sInstance=" << sInstance << llendl;
581 }
582
583 llwarns << "newshow called" << llendl;
584 sInstance->mCurGrid = gHippoGridManager->getCurrentGridNick();
585 refresh_grids();
586
587 sInstance->open(); /*Flawfinder: ignore*/
588 // we're important
589 //sInstance->setFrontmost(TRUE);
590 //sInstance->setFocus(TRUE);
591
592}
593
594void LoginFloater::show(const LLRect &rect, BOOL show_server,
595 void (*callback)(S32 option, void* user_data),
596 void* callback_data)
597{
598 // we don't need a grid passed in because this is old-style login
599 std::string grid = "";
600 newShow(grid, TRUE);
601}
602
603void LoginFloater::setFocus(BOOL b)
604{
605 if(b != hasFocus())
606 {
607 if(b)
608 {
609 LoginFloater::giveFocus();
610 }
611 else
612 {
613 LLPanel::setFocus(b);
614 }
615 }
616}
617
618void LoginFloater::giveFocus()
619{
620 LLScrollListCtrl *combo = NULL;
621
622 if(NULL==sInstance)
623 {
624 llwarns << "giveFocus has no LoginFloater instance. sInstance=" << sInstance << llendl;
625 return;
626 }
627
628 // for our combo box approach, selecting the combo box is almost always
629 // the right thing to do on the floater receiving focus
630 combo = sInstance->getChild<LLScrollListCtrl>("grid_selector");
631 combo->setFocus(TRUE);
632}
633
634BOOL LoginFloater::isGridComboDirty()
635{
636 BOOL user_picked = FALSE;
637 if (!sInstance)
638 {
639 llwarns << "Attempted getServer with no login view shown" << llendl;
640 }
641 else
642 {
643 LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
644 user_picked = combo->isDirty();
645 }
646 return user_picked;
647}
648
649void LoginFloater::getLocation(std::string &location)
650{
651 if (!sInstance)
652 {
653 llwarns << "Attempted getLocation with no login view shown" << llendl;
654 return;
655 }
656
657 LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
658 location = combo->getValue().asString();
659}
660
661std::string& LoginFloater::getPassword()
662{
663 return mMungedPassword;
664}
665
666void LoginFloater::setPassword(std::string &password)
667{
668 mMungedPassword = password;
669}
670
671bool LoginFloater::isSamePassword(std::string &password)
672{
673 return mMungedPassword == password;
674}
675
676void LoginFloater::addServer(const std::string& server, S32 domain_name)
677{
678 if (!sInstance)
679 {
680 llwarns << "Attempted addServer with no login view shown" << llendl;
681 return;
682 }
683
684 LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
685 combo->add(server, LLSD(domain_name) );
686 combo->setCurrentByIndex(0);
687}
688
689void LoginFloater::cancel_old()
690{
691 if(NULL==sInstance)
692 return;
693
694 if(sInstance->sIsInitialLogin)
695 {
696 // send a callback that indicates we're quitting or closing
697 if(sInstance->mCallback)
698 sInstance->mCallback(LOGIN_OPTION_QUIT, sInstance->mCallbackData);
699 return;
700 }
701
702 sInstance->close();
703}
704
705void LoginFloater::hashPassword(const std::string& password, std::string& hashedPassword)
706{
707 // Max "actual" password length is 16 characters.
708 // Hex digests are always 32 characters.
709 if (password.length() == 32)
710 {
711 hashedPassword = password;
712 }
713 else
714 {
715 // this is a normal text password
716 LLMD5 pass((unsigned char *)password.c_str());
717 char munged_password[MD5HEX_STR_SIZE];
718 pass.hex_digest(munged_password);
719 hashedPassword = munged_password;
720 }
721
722}
723
diff --git a/linden/indra/newview/floaterlogin.h b/linden/indra/newview/floaterlogin.h
new file mode 100644
index 0000000..cdb60b0
--- /dev/null
+++ b/linden/indra/newview/floaterlogin.h
@@ -0,0 +1,90 @@
1/*
2 * floaterlogin.h (floatergridmanager.h pls)
3 * This is Meerkats grid manager, and I accidentally finished it with the wrong name :)
4 * -Patrick Sapinski (Monday, August 17, 2009)
5 */
6
7#ifndef PL_floaterlogin_H
8#define PL_floaterlogin_H
9
10#define LOGIN_OPTION_CONNECT 0
11#define LOGIN_OPTION_QUIT 1
12
13#include "llfloater.h"
14
15class LoginController;
16class AuthenticationModel;
17
18class LoginFloater : public LLFloater
19{
20public:
21 LoginFloater();
22 virtual ~LoginFloater();
23
24 virtual BOOL postBuild();
25
26 static void refresh_grids();
27 void apply();
28 void setDefault();
29 void cancel();
30
31 // new-style login methods
32 static void newShow(const std::string &grid, bool initialLogin);
33 virtual std::string& getPassword();
34 virtual void setPassword(std::string &password);
35 virtual bool isSamePassword(std::string &password);
36 static void getFields(std::string &loginname, std::string &password,
37 BOOL &remember);
38 static void setFields(const std::string &loginname, const std::string &password,
39 BOOL remember);
40
41 // LLLoginPanel compatibility
42 //TODO: Make this not suck
43 static void show(const LLRect &rect, BOOL show_server,
44 void (*callback)(S32 option, void *user_data),
45 void *callback_data);
46 static void close();
47 static void setAlwaysRefresh(bool refresh);
48 static void refreshLocation(bool force_visible);
49 virtual void setFocus(BOOL b);
50 static void giveFocus();
51 static void getLocation(std::string &location);
52 static BOOL isGridComboDirty();
53 static void addServer(const std::string& server, S32 domain_name);
54 static void cancel_old();
55 static void hashPassword(const std::string& password, std::string& hashedPassword);
56protected:
57 static bool sIsInitialLogin;
58 static std::string sGrid;
59private:
60 enum State { NORMAL, ADD_NEW, ADD_COPY };
61 State mState;
62 std::string mCurGrid;
63
64 std::string mIncomingPassword;
65 std::string mMungedPassword;
66
67 void applyChanges();
68 bool createNewGrid();
69 void update();
70 void retrieveGridInfo();
71
72 static void onSelectGrid(LLUICtrl *ctrl, void *data);
73 static void onClickDelete(void *data);
74 static void onClickAdd(void *data);
75 static void onClickCopy(void *data);
76 static void onClickOk(void *data);
77 static void onClickApply(void *data);
78 static void onClickDefault(void *data);
79 static void onClickGridInfo(void *data);
80 static void onClickCancel(void *data);
81
82 static LoginFloater *sInstance;
83 static LoginController *sController;
84 static AuthenticationModel *sModel;
85
86 void (*mCallback)(S32 option, void *userdata);
87 void *mCallbackData;
88};
89
90#endif // PL_floaterlogin_H
diff --git a/linden/indra/newview/gpu_table.txt b/linden/indra/newview/gpu_table.txt
index 56de9c6..c08e2b5 100644
--- a/linden/indra/newview/gpu_table.txt
+++ b/linden/indra/newview/gpu_table.txt
@@ -162,7 +162,11 @@ Intel Montara .*Intel.*Montara.* 0 0
162Intel Springdale .*Intel.*Springdale.* 0 0 162Intel Springdale .*Intel.*Springdale.* 0 0
163Matrox .*Matrox.* 0 0 163Matrox .*Matrox.* 0 0
164Mesa .*Mesa.* 0 0 164Mesa .*Mesa.* 0 0
165NVIDIA GT 120 .*NVIDIA.*GeForce.*GT.*12.* 2 1
166NVIDIA GT 130 .*NVIDIA.*GeForce.*GT.*13.* 3 1
167NVIDIA GTS 250 .*NVIDIA.*GeForce.*GTS.*25.* 3 1
165NVIDIA GTX 260 .*NVIDIA.*GeForce.*GTX.*26.* 3 1 168NVIDIA GTX 260 .*NVIDIA.*GeForce.*GTX.*26.* 3 1
169NVIDIA GTX 270 .*NVIDIA.*GeForce.*GTX.*27.* 3 1
166NVIDIA GTX 280 .*NVIDIA.*GeForce.*GTX.*28.* 3 1 170NVIDIA GTX 280 .*NVIDIA.*GeForce.*GTX.*28.* 3 1
167NVIDIA GTX 290 .*NVIDIA.*GeForce.*GTX.*29.* 3 1 171NVIDIA GTX 290 .*NVIDIA.*GeForce.*GTX.*29.* 3 1
168NVIDIA C51 .*NVIDIA.*C51.* 0 1 172NVIDIA C51 .*NVIDIA.*C51.* 0 1
diff --git a/linden/indra/newview/hippoGridManager.cpp b/linden/indra/newview/hippoGridManager.cpp
new file mode 100644
index 0000000..71e3a95
--- /dev/null
+++ b/linden/indra/newview/hippoGridManager.cpp
@@ -0,0 +1,819 @@
1
2
3#include "llviewerprecompiledheaders.h"
4
5#include "hippoGridManager.h"
6
7#include <cctype>
8
9#include <stdtypes.h>
10#include <lldir.h>
11#include <lleconomy.h>
12#include <llerror.h>
13#include <llfile.h>
14#include <llhttpclient.h>
15#include <llsdserialize.h>
16#include "llviewercontrol.h"
17#include "llweb.h"
18
19#include "hippoRestRequest.h"
20
21
22// ********************************************************************
23// Global Variables
24
25HippoGridManager *gHippoGridManager = 0;
26
27HippoGridInfo HippoGridInfo::FALLBACK_GRIDINFO("");
28
29
30
31// ********************************************************************
32// ********************************************************************
33// HippoGridInfo
34// ********************************************************************
35// ********************************************************************
36
37
38// ********************************************************************
39// Initialize
40
41HippoGridInfo::HippoGridInfo(const std::string &gridNick) :
42 mPlatform(PLATFORM_OTHER),
43 mRenderCompat(true),
44 mCurrencySymbol("OS$"),
45 mRealCurrencySymbol("US$"),
46 mDirectoryFee(30)
47{
48 std::string nick = gridNick;
49 mGridNick = sanitizeGridNick( nick );
50}
51
52
53// ********************************************************************
54// Getters
55
56HippoGridInfo::Platform HippoGridInfo::getPlatform()
57{
58 return mPlatform;
59}
60
61bool HippoGridInfo::isOpenSimulator() const
62{
63 return (mPlatform == HippoGridInfo::PLATFORM_OPENSIM);
64}
65
66bool HippoGridInfo::isSecondLife() const
67{
68 return (mPlatform == HippoGridInfo::PLATFORM_SECONDLIFE);
69}
70
71const std::string& HippoGridInfo::getGridNick() const
72{
73 return mGridNick;
74}
75
76const std::string& HippoGridInfo::getGridName() const
77{
78 return mGridName;
79}
80
81const std::string& HippoGridInfo::getLoginUri() const
82{
83 return mLoginUri;
84}
85
86const std::string& HippoGridInfo::getLoginPage() const
87{
88 return mLoginPage;
89}
90
91const std::string& HippoGridInfo::getHelperUri() const
92{
93 return mHelperUri;
94}
95
96const std::string& HippoGridInfo::getWebSite() const
97{
98 return mWebSite;
99}
100
101const std::string& HippoGridInfo::getSupportUrl() const
102{
103 return mSupportUrl;
104}
105
106const std::string& HippoGridInfo::getRegisterUrl() const
107{
108 return mRegisterUrl;
109}
110
111const std::string& HippoGridInfo::getPasswordUrl() const
112{
113 return mPasswordUrl;
114}
115
116const std::string& HippoGridInfo::getSearchUrl() const
117{
118 return mSearchUrl;
119}
120
121const std::string& HippoGridInfo::getFirstName() const
122{
123 return mFirstName;
124}
125
126const std::string& HippoGridInfo::getLastName() const
127{
128 return mLastName;
129}
130
131const std::string& HippoGridInfo::getAvatarPassword() const
132{
133 return mAvatarPassword;
134}
135
136bool HippoGridInfo::isRenderCompat() const
137{
138 return mRenderCompat;
139}
140
141const std::string& HippoGridInfo::getCurrencySymbol() const
142{
143 return mCurrencySymbol;
144}
145
146const std::string& HippoGridInfo::getRealCurrencySymbol() const
147{
148 return mRealCurrencySymbol;
149}
150
151
152
153// ********************************************************************
154// Setters
155
156void HippoGridInfo::setPlatform(Platform platform)
157{
158 mPlatform = platform;
159 mCurrencySymbol = (mPlatform == PLATFORM_SECONDLIFE)? "L$": "OS$";
160}
161
162
163void HippoGridInfo::setPlatform(const std::string &platform)
164{
165 std::string tmp = platform;
166 for (unsigned i=0; i<platform.size(); i++)
167 tmp[i] = tolower(tmp[i]);
168
169 if (tmp == "opensim") {
170 setPlatform(PLATFORM_OPENSIM);
171 } else if (tmp == "secondlife") {
172 setPlatform(PLATFORM_SECONDLIFE);
173 } else {
174 setPlatform(PLATFORM_OTHER);
175 llwarns << "Unknown platform '" << platform << "'." << llendl;
176 }
177}
178
179void HippoGridInfo::setGridName(const std::string &gridName)
180{
181 mGridName = gridName;
182}
183
184void HippoGridInfo::setLoginUri(const std::string &loginUri)
185{
186 std::string uri = loginUri;
187 mLoginUri = sanitizeUri(uri);
188}
189
190void HippoGridInfo::setLoginPage(const std::string &loginPage)
191{
192 mLoginPage = loginPage;
193}
194
195void HippoGridInfo::setHelperUri(const std::string &helperUri)
196{
197 std::string uri = helperUri;
198 mHelperUri = sanitizeUri(uri);
199}
200
201void HippoGridInfo::setWebSite(const std::string &website)
202{
203 mWebSite = website;
204}
205
206void HippoGridInfo::setSupportUrl(const std::string &url)
207{
208 mSupportUrl = url;
209}
210
211void HippoGridInfo::setRegisterUrl(const std::string &url)
212{
213 mRegisterUrl = url;
214}
215
216void HippoGridInfo::setPasswordUrl(const std::string &url)
217{
218 mPasswordUrl = url;
219}
220
221void HippoGridInfo::setSearchUrl(const std::string &url)
222{
223 mSearchUrl = url;
224}
225
226void HippoGridInfo::setFirstName(const std::string &firstName)
227{
228 mFirstName = firstName;
229}
230
231void HippoGridInfo::setLastName(const std::string &lastName)
232{
233 mLastName = lastName;
234}
235
236void HippoGridInfo::setAvatarPassword(const std::string &avatarPassword)
237{
238 mAvatarPassword = avatarPassword;
239}
240
241void HippoGridInfo::setRenderCompat(bool compat)
242{
243 mRenderCompat = compat;
244}
245
246void HippoGridInfo::setCurrencySymbol(const std::string &sym)
247{
248 mCurrencySymbol = sym.substr(0, 3);
249}
250
251void HippoGridInfo::setRealCurrencySymbol(const std::string &sym)
252{
253 mRealCurrencySymbol = sym.substr(0, 3);
254}
255
256void HippoGridInfo::setDirectoryFee(int fee)
257{
258 mDirectoryFee = fee;
259}
260
261
262
263// ********************************************************************
264// Grid Info
265
266std::string HippoGridInfo::getSearchUrl(SearchType ty) const
267{
268 if ((mPlatform == PLATFORM_SECONDLIFE) || mSearchUrl.empty()) {
269 // Second Life defaults
270 if (ty == SEARCH_ALL_EMPTY) {
271 return gSavedSettings.getString("SearchURLDefault");
272 } else if (ty == SEARCH_ALL_QUERY) {
273 return gSavedSettings.getString("SearchURLQuery");
274 } else if (ty == SEARCH_ALL_TEMPLATE) {
275 return gSavedSettings.getString("SearchURLSuffix2");
276 } else {
277 llinfos << "Illegal search URL type " << ty << llendl;
278 return "";
279 }
280 } else {
281 // OpenSim and other
282 if (ty == SEARCH_ALL_EMPTY) {
283 return (mSearchUrl + "panel=All&");
284 } else if (ty == SEARCH_ALL_QUERY) {
285 return (mSearchUrl + "q=[QUERY]&s=[COLLECTION]&");
286 } else if (ty == SEARCH_ALL_TEMPLATE) {
287 return "lang=[LANG]&m=[MATURE]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION]";
288 } else {
289 llinfos << "Illegal search URL type " << ty << llendl;
290 return "";
291 }
292 }
293}
294
295
296//static
297void HippoGridInfo::onXmlElementStart(void *userData, const XML_Char *name, const XML_Char **atts)
298{
299 HippoGridInfo *self = (HippoGridInfo*)userData;
300 if (strcasecmp(name, "gridnick") == 0)
301 self->mXmlState = XML_GRIDNICK;
302 else if (strcasecmp(name, "gridname") == 0)
303 self->mXmlState = XML_GRIDNAME;
304 else if (strcasecmp(name, "platform") == 0)
305 self->mXmlState = XML_PLATFORM;
306 else if ((strcasecmp(name, "login") == 0) || (strcasecmp(name, "loginuri") == 0))
307 self->mXmlState = XML_LOGINURI;
308 else if ((strcasecmp(name, "welcome") == 0) || (strcasecmp(name, "loginpage") == 0))
309 self->mXmlState = XML_LOGINPAGE;
310 else if ((strcasecmp(name, "economy") == 0) || (strcasecmp(name, "helperuri") == 0))
311 self->mXmlState = XML_HELPERURI;
312 else if ((strcasecmp(name, "about") == 0) || (strcasecmp(name, "website") == 0))
313 self->mXmlState = XML_WEBSITE;
314 else if ((strcasecmp(name, "help") == 0) || (strcasecmp(name, "support") == 0))
315 self->mXmlState = XML_SUPPORT;
316 else if ((strcasecmp(name, "register") == 0) || (strcasecmp(name, "account") == 0))
317 self->mXmlState = XML_REGISTER;
318 else if (strcasecmp(name, "password") == 0)
319 self->mXmlState = XML_PASSWORD;
320 //else if (strcasecmp(name, "search") == 0)
321 //self->mXmlState = XML_SEARCH;
322}
323
324//static
325void HippoGridInfo::onXmlElementEnd(void *userData, const XML_Char *name)
326{
327 HippoGridInfo *self = (HippoGridInfo*)userData;
328 self->mXmlState = XML_VOID;
329}
330
331//static
332void HippoGridInfo::onXmlCharacterData(void *userData, const XML_Char *s, int len)
333{
334 HippoGridInfo *self = (HippoGridInfo*)userData;
335 switch (self->mXmlState) {
336
337 case XML_GRIDNICK: {
338 if (self->mGridNick == "") self->mGridNick.assign(s, len);
339 self->mGridNick = sanitizeGridNick(self->mGridNick);
340 break;
341 }
342
343 case XML_PLATFORM: {
344 std::string platform(s, len);
345 self->setPlatform(platform);
346 break;
347 }
348
349 case XML_LOGINURI: {
350 std::string loginuri(s, len);
351 self->mLoginUri = sanitizeUri( loginuri );
352 break;
353 }
354
355 case XML_HELPERURI: {
356 std::string helperuri(s, len);
357 self->mHelperUri = sanitizeUri( helperuri );
358 break;
359 }
360
361 case XML_SEARCH: {
362 //self->mSearchUrl.assign(s, len);
363 //sanitizeQueryUrl(mSearchUrl);
364 break;
365 }
366
367 case XML_GRIDNAME: self->mGridName.assign(s, len); break;
368 case XML_LOGINPAGE: self->mLoginPage.assign(s, len); break;
369 case XML_WEBSITE: self->mWebSite.assign(s, len); break;
370 case XML_SUPPORT: self->mSupportUrl.assign(s, len); break;
371 case XML_REGISTER: self->mRegisterUrl.assign(s, len); break;
372 case XML_PASSWORD: self->mPasswordUrl.assign(s, len); break;
373
374 case XML_VOID: break;
375 }
376}
377
378
379bool HippoGridInfo::retrieveGridInfo()
380{
381 if (mLoginUri == "") return false;
382
383 std::string reply;
384 int result = HippoRestRequest::getBlocking(mLoginUri + "get_grid_info", &reply);
385 if (result != 200) return false;
386
387 llinfos << "Received: " << reply << llendl;
388
389 bool success = true;
390 XML_Parser parser = XML_ParserCreate(0);
391 XML_SetUserData(parser, this);
392 XML_SetElementHandler(parser, onXmlElementStart, onXmlElementEnd);
393 XML_SetCharacterDataHandler(parser, onXmlCharacterData);
394 mXmlState = XML_VOID;
395 if (!XML_Parse(parser, reply.data(), reply.size(), TRUE)) {
396 llwarns << "XML Parse Error: " << XML_ErrorString(XML_GetErrorCode(parser)) << llendl;
397 success = false;
398 }
399 XML_ParserFree(parser);
400
401 return success;
402}
403
404
405std::string HippoGridInfo::getUploadFee() const
406{
407 std::string fee;
408 formatFee(fee, LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(), true);
409 return fee;
410}
411
412std::string HippoGridInfo::getGroupCreationFee() const
413{
414 std::string fee;
415 formatFee(fee, LLGlobalEconomy::Singleton::getInstance()->getPriceGroupCreate(), false);
416 return fee;
417}
418
419std::string HippoGridInfo::getDirectoryFee() const
420{
421 std::string fee;
422 formatFee(fee, mDirectoryFee, true);
423 if (fee != "free") fee += "/week";
424 return fee;
425}
426
427void HippoGridInfo::formatFee(std::string &fee, int cost, bool showFree) const
428{
429 if (showFree && (cost == 0)) {
430 fee = "free";
431 } else {
432 fee = llformat("%s%d", getCurrencySymbol().c_str(), cost);
433 }
434}
435
436
437// ********************************************************************
438// Static Helpers
439
440// static
441const char *HippoGridInfo::getPlatformString(Platform platform)
442{
443 static const char *platformStrings[PLATFORM_LAST] = {
444 "Other", "OpenSim", "SecondLife"
445 };
446
447 if ((platform < PLATFORM_OTHER) || (platform >= PLATFORM_LAST))
448 platform = PLATFORM_OTHER;
449 return platformStrings[platform];
450}
451
452
453// static
454std::string HippoGridInfo::sanitizeGridNick(std::string &gridnick)
455{
456 std::string tmp;
457 int size = gridnick.size();
458 for (int i=0; i<size; i++) {
459 char c = gridnick[i];
460 if ((c == '_') || isalnum(c)) {
461 tmp += tolower(c);
462 } else if (isspace(c)) {
463 tmp += "_";
464 }
465 }
466 return tmp;
467}
468
469// static
470std::string HippoGridInfo::sanitizeUri(std::string &uri)
471{
472 // if (uri.empty()) {
473 // return "";
474 // }
475
476 // // If last character in uri is not "/"
477 // // NOTE: This wrongly assumes that all URIs should end with "/"!
478 // if (uri.compare(uri.length()-1, 1, "/") != 0) {
479 // return uri + '/';
480 // }
481
482 return uri;
483}
484
485
486void HippoGridInfo::initFallback()
487{
488 FALLBACK_GRIDINFO.mGridNick = "secondlife";
489 FALLBACK_GRIDINFO.setPlatform(PLATFORM_SECONDLIFE);
490 FALLBACK_GRIDINFO.setGridName("Second Life");
491 FALLBACK_GRIDINFO.setLoginUri("https://login.agni.lindenlab.com/cgi-bin/login.cgi");
492 FALLBACK_GRIDINFO.setLoginPage("http://secondlife.com/app/login/");
493 FALLBACK_GRIDINFO.setHelperUri("https://secondlife.com/helpers/");
494 FALLBACK_GRIDINFO.setWebSite("http://secondlife.com/");
495}
496
497
498
499// ********************************************************************
500// ********************************************************************
501// HippoGridManager
502// ********************************************************************
503// ********************************************************************
504
505
506// ********************************************************************
507// Initialize
508
509HippoGridManager::HippoGridManager() :
510 mConnectedGrid(0),
511 mDefaultGridsVersion(0)
512{
513}
514
515HippoGridManager::~HippoGridManager()
516{
517 cleanup();
518}
519
520
521void HippoGridManager::cleanup()
522{
523 std::map<std::string, HippoGridInfo*>::iterator it, end = mGridInfo.end();
524 for (it=mGridInfo.begin(); it != end; ++it) {
525 delete it->second;
526 }
527 mGridInfo.clear();
528}
529
530
531void HippoGridManager::init()
532{
533 HippoGridInfo::initFallback();
534 loadFromFile();
535
536 // !!!### gSavedSettings.getControl("CmdLineLoginURI");
537 // !!!### gSavedSettings.getString("CmdLineLoginPage");
538 // !!!### gSavedSettings.getString("CmdLineHelperURI");
539 // !!!### LLString::compareInsensitive(gGridInfo[grid_index].mLabel, grid_name.c_str()))
540}
541
542
543void HippoGridManager::discardAndReload()
544{
545 cleanup();
546 loadFromFile();
547}
548
549
550// ********************************************************************
551// Public Access
552
553HippoGridInfo* HippoGridManager::getGrid(const std::string &grid) const
554{
555 std::map<std::string, HippoGridInfo*>::const_iterator it;
556 it = mGridInfo.find(grid);
557 if (it != mGridInfo.end()) {
558 return it->second;
559 } else {
560 return 0;
561 }
562}
563
564
565HippoGridInfo* HippoGridManager::getConnectedGrid() const
566{
567 return (mConnectedGrid)? mConnectedGrid: getCurrentGrid();
568}
569
570
571HippoGridInfo* HippoGridManager::getCurrentGrid() const
572{
573 HippoGridInfo *grid = getGrid(mCurrentGrid);
574 if (grid) {
575 return grid;
576 } else {
577 return &HippoGridInfo::FALLBACK_GRIDINFO;
578 }
579}
580
581const std::string& HippoGridManager::getDefaultGridNick() const
582{
583 return mDefaultGrid;
584}
585
586const std::string& HippoGridManager::getCurrentGridNick() const
587{
588 return mCurrentGrid;
589}
590
591void HippoGridManager::setCurrentGridAsConnected()
592{
593 mConnectedGrid = getCurrentGrid();
594}
595
596
597void HippoGridManager::addGrid(HippoGridInfo *grid)
598{
599 if (!grid) return;
600 const std::string &nick = grid->getGridNick();
601 if (nick == "") {
602 llwarns << "Ignoring to try adding grid with empty nick." << llendl;
603 delete grid;
604 return;
605 }
606 if (mGridInfo.find(nick) != mGridInfo.end()) {
607 llwarns << "Ignoring to try adding existing grid " << nick << '.' << llendl;
608 delete grid;
609 return;
610 }
611 mGridInfo[nick] = grid;
612}
613
614
615void HippoGridManager::deleteGrid(const std::string &grid)
616{
617 GridIterator it = mGridInfo.find(grid);
618 if (it == mGridInfo.end()) {
619 llwarns << "Trying to delete non-existing grid " << grid << '.' << llendl;
620 return;
621 }
622 mGridInfo.erase(it);
623 llinfos << "Number of grids now: " << mGridInfo.size() << llendl;
624 if (mGridInfo.empty()) llinfos << "Grid info map is empty." << llendl;
625 if (grid == mDefaultGrid)
626 setDefaultGrid(""); // sets first grid, if map not empty
627 if (grid == mCurrentGrid)
628 mCurrentGrid = mDefaultGrid;
629}
630
631
632void HippoGridManager::setDefaultGrid(const std::string &grid)
633{
634 GridIterator it = mGridInfo.find(grid);
635 if (it != mGridInfo.end()) {
636 mDefaultGrid = grid;
637 } else if (mGridInfo.find("secondlife") != mGridInfo.end()) {
638 mDefaultGrid = "secondlife";
639 } else if (!mGridInfo.empty()) {
640 mDefaultGrid = mGridInfo.begin()->first;
641 } else {
642 mDefaultGrid = "";
643 }
644}
645
646
647void HippoGridManager::setCurrentGrid(const std::string &grid)
648{
649 GridIterator it = mGridInfo.find(grid);
650 if (it != mGridInfo.end()) {
651 mCurrentGrid = grid;
652 } else if (!mGridInfo.empty()) {
653 llwarns << "Unknown grid '" << grid << "'. Setting to default grid." << llendl;
654 mCurrentGrid = mDefaultGrid;
655 }
656}
657
658
659// ********************************************************************
660// Persistent Store
661
662void HippoGridManager::loadFromFile()
663{
664 mDefaultGridsVersion = 0;
665 // load user grid info
666 parseFile(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "grid_info.xml"), false);
667 // merge default grid info, if newer. Force load, if list of grids is empty.
668 parseFile(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "default_grids.xml"), !mGridInfo.empty());
669 // merge grid info from web site, if newer. Force load, if list of grids is empty.
670 if (gSavedSettings.getBOOL("CheckForGridUpdates"))
671 parseUrl("http://imprudenceviewer.org/app/grids/", !mGridInfo.empty());
672
673 setDefaultGrid(gSavedSettings.getString("DefaultGrid"));
674 setCurrentGrid(gSavedSettings.getString("DefaultGrid"));
675}
676
677
678void HippoGridManager::parseUrl(const char *url, bool mergeIfNewer)
679{
680 llinfos << "Loading grid info from '" << url << "'." << llendl;
681
682 // query update server
683 std::string escaped_url = LLWeb::escapeURL(url);
684 LLSD response = LLHTTPClient::blockingGet(url);
685
686 // check response, return on error
687 S32 status = response["status"].asInteger();
688 if ((status != 200) || !response["body"].isArray()) {
689 llinfos << "GridInfo Update failed (" << status << "): "
690 << (response["body"].isString()? response["body"].asString(): "<unknown error>")
691 << llendl;
692 return;
693 }
694
695 LLSD gridInfo = response["body"];
696 parseData(gridInfo, mergeIfNewer);
697}
698
699void HippoGridManager::parseFile(const std::string &fileName, bool mergeIfNewer)
700{
701 llifstream infile;
702 infile.open(fileName.c_str());
703 if(!infile.is_open()) {
704 llwarns << "Cannot find grid info file " << fileName << " to load." << llendl;
705 return;
706 }
707
708 LLSD gridInfo;
709 if (LLSDSerialize::fromXML(gridInfo, infile) <= 0) {
710 llwarns << "Unable to parse grid info file " << fileName << '.' << llendl;
711 return;
712 }
713
714 llinfos << "Loading grid info file " << fileName << '.' << llendl;
715 parseData(gridInfo, mergeIfNewer);
716}
717
718
719void HippoGridManager::parseData(LLSD &gridInfo, bool mergeIfNewer)
720{
721 if (mergeIfNewer) {
722 LLSD::array_const_iterator it, end = gridInfo.endArray();
723 for (it = gridInfo.beginArray(); it != end; ++it) {
724 LLSD gridMap = *it;
725 if (gridMap.has("default_grids_version")) {
726 int version = gridMap["default_grids_version"];
727 if (version <= mDefaultGridsVersion) return;
728 else break;
729 }
730 }
731 if (it == end) {
732 llwarns << "Grid data has no version number." << llendl;
733 return;
734 }
735 }
736
737 llinfos << "Loading grid data." << llendl;
738
739 LLSD::array_const_iterator it, end = gridInfo.endArray();
740 for (it = gridInfo.beginArray(); it != end; ++it) {
741 LLSD gridMap = *it;
742 if (gridMap.has("default_grids_version")) {
743 mDefaultGridsVersion = gridMap["default_grids_version"];
744 } else if (gridMap.has("gridnick") && gridMap.has("loginuri")) {
745 std::string gridnick = gridMap["gridnick"];
746 HippoGridInfo *grid;
747 GridIterator it = mGridInfo.find(gridnick);
748 bool newGrid = (it == mGridInfo.end());
749 if (newGrid) {
750 // create new grid info
751 grid = new HippoGridInfo(gridnick);
752 } else {
753 // update existing grid info
754 grid = it->second;
755 }
756 grid->setLoginUri(gridMap["loginuri"]);
757 if (gridMap.has("platform")) grid->setPlatform(gridMap["platform"]);
758 if (gridMap.has("gridname")) grid->setGridName(gridMap["gridname"]);
759 if (gridMap.has("loginpage")) grid->setLoginPage(gridMap["loginpage"]);
760 if (gridMap.has("helperuri")) grid->setHelperUri(gridMap["helperuri"]);
761 if (gridMap.has("website")) grid->setWebSite(gridMap["website"]);
762 if (gridMap.has("support")) grid->setSupportUrl(gridMap["support"]);
763 if (gridMap.has("register")) grid->setRegisterUrl(gridMap["register"]);
764 if (gridMap.has("password")) grid->setPasswordUrl(gridMap["password"]);
765 //if (gridMap.has("search")) grid->setSearchUrl(gridMap["search"]);
766 if (gridMap.has("render_compat")) grid->setRenderCompat(gridMap["render_compat"]);
767 // if (gridMap.has("firstname")) grid->setFirstName(gridMap["firstname"]);
768 // if (gridMap.has("lastname")) grid->setLastName(gridMap["lastname"]);
769 // if (gridMap.has("avatarpassword")) grid->setAvatarPassword(gridMap["avatarpassword"]);
770 if (newGrid) addGrid(grid);
771 }
772 }
773}
774
775
776void HippoGridManager::saveFile()
777{
778 // save default grid to client settings
779 gSavedSettings.setString("DefaultGrid", mDefaultGrid);
780
781 // build LLSD
782 LLSD gridInfo;
783 gridInfo[0]["default_grids_version"] = mDefaultGridsVersion;
784
785 // add grids
786 S32 i = 1;
787 GridIterator it, end = mGridInfo.end();
788 for (it = mGridInfo.begin(); it != end; ++it, i++) {
789 HippoGridInfo *grid = it->second;
790 gridInfo[i]["gridnick"] = grid->getGridNick();
791 gridInfo[i]["platform"] = HippoGridInfo::getPlatformString(grid->getPlatform());
792 gridInfo[i]["gridname"] = grid->getGridName();
793 gridInfo[i]["loginuri"] = grid->getLoginUri();
794 gridInfo[i]["loginpage"] = grid->getLoginPage();
795 gridInfo[i]["helperuri"] = grid->getHelperUri();
796 gridInfo[i]["website"] = grid->getWebSite();
797 gridInfo[i]["support"] = grid->getSupportUrl();
798 gridInfo[i]["register"] = grid->getRegisterUrl();
799 gridInfo[i]["password"] = grid->getPasswordUrl();
800 // gridInfo[i]["firstname"] = grid->getFirstName();
801 // gridInfo[i]["lastname"] = grid->getLastName();
802 // gridInfo[i]["avatarpassword"] = grid->getAvatarPassword();
803
804 //gridInfo[i]["search"] = grid->getSearchUrl();
805 gridInfo[i]["render_compat"] = grid->isRenderCompat();
806 }
807
808 // write client grid info file
809 std::string fileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "grid_info.xml");
810 llofstream file;
811 file.open(fileName.c_str());
812 if (file.is_open()) {
813 LLSDSerialize::toPrettyXML(gridInfo, file);
814 file.close();
815 llinfos << "Saved grids to " << fileName << llendl;
816 } else {
817 llerrs << "Unable to open grid info file: " << fileName << llendl;
818 }
819}
diff --git a/linden/indra/newview/hippoGridManager.h b/linden/indra/newview/hippoGridManager.h
new file mode 100644
index 0000000..ef351d9
--- /dev/null
+++ b/linden/indra/newview/hippoGridManager.h
@@ -0,0 +1,174 @@
1#ifndef __HIPPO_GRID_MANAGER_H__
2#define __HIPPO_GRID_MANAGER_H__
3
4
5#include <map>
6#include <string>
7
8#ifndef XML_STATIC
9#define XML_STATIC
10#endif
11
12#ifdef LL_STANDALONE
13#include <expat.h>
14#else
15#include "expat/expat.h"
16#endif
17
18class LLSD;
19
20
21class HippoGridInfo
22{
23public:
24 enum Platform {
25 PLATFORM_OTHER = 0,
26 PLATFORM_OPENSIM,
27 PLATFORM_SECONDLIFE,
28 PLATFORM_LAST
29 };
30 enum SearchType {
31 SEARCH_ALL_EMPTY,
32 SEARCH_ALL_QUERY,
33 SEARCH_ALL_TEMPLATE
34 };
35
36 explicit HippoGridInfo(const std::string &gridNick);
37
38 Platform getPlatform();
39 bool isOpenSimulator() const;
40 bool isSecondLife() const;
41 const std::string& getGridNick() const;
42 const std::string& getGridName() const;
43 const std::string& getLoginUri() const;
44 const std::string& getLoginPage() const;
45 const std::string& getHelperUri() const;
46 const std::string& getWebSite() const;
47 const std::string& getSupportUrl() const;
48 const std::string& getRegisterUrl() const;
49 const std::string& getPasswordUrl() const;
50 const std::string& getSearchUrl() const;
51 const std::string& getFirstName() const;
52 const std::string& getLastName() const;
53 const std::string& getAvatarPassword() const;
54 std::string getSearchUrl(SearchType ty) const;
55 bool isRenderCompat() const;
56
57 const std::string& getCurrencySymbol() const;
58 const std::string& getRealCurrencySymbol() const;
59 std::string getUploadFee() const;
60 std::string getGroupCreationFee() const;
61 std::string getDirectoryFee() const;
62
63 void setPlatform (const std::string &platform);
64 void setPlatform (Platform platform);
65 void setGridName (const std::string &gridName);
66 void setLoginUri (const std::string &loginUri);
67 void setLoginPage(const std::string &loginPage);
68 void setHelperUri(const std::string &helperUri);
69 void setWebSite (const std::string &website);
70 void setSupportUrl(const std::string &url);
71 void setRegisterUrl(const std::string &url);
72 void setPasswordUrl(const std::string &url);
73 void setSearchUrl(const std::string &url);
74 void setRenderCompat(bool compat);
75 void setFirstName(const std::string &firstName);
76 void setLastName(const std::string &lastName);
77 void setAvatarPassword(const std::string &avatarPassword);
78
79 void setCurrencySymbol(const std::string &sym);
80 void setRealCurrencySymbol(const std::string &sym);
81 void setDirectoryFee(int fee);
82
83 bool retrieveGridInfo();
84
85 static const char *getPlatformString(Platform platform);
86 static std::string sanitizeGridNick(std::string &gridnick);
87
88 static HippoGridInfo FALLBACK_GRIDINFO;
89 static void initFallback();
90
91private:
92 Platform mPlatform;
93 std::string mGridNick;
94 std::string mGridName;
95 std::string mLoginUri;
96 std::string mLoginPage;
97 std::string mHelperUri;
98 std::string mWebSite;
99 std::string mSupportUrl;
100 std::string mRegisterUrl;
101 std::string mPasswordUrl;
102 std::string mSearchUrl;
103 std::string mFirstName;
104 std::string mLastName;
105 std::string mAvatarPassword;
106 bool mRenderCompat;
107
108 std::string mCurrencySymbol;
109 std::string mRealCurrencySymbol;
110 int mDirectoryFee;
111
112 // for parsing grid info XML
113 enum XmlState {
114 XML_VOID, XML_GRIDNICK, XML_PLATFORM, XML_GRIDNAME,
115 XML_LOGINURI, XML_LOGINPAGE, XML_HELPERURI,
116 XML_WEBSITE, XML_SUPPORT, XML_REGISTER, XML_PASSWORD, XML_SEARCH
117 };
118 XmlState mXmlState;
119
120 static std::string sanitizeUri(std::string &uri);
121 void formatFee(std::string &fee, int cost, bool showFree) const;
122
123 static void onXmlElementStart(void *userData, const XML_Char *name, const XML_Char **atts);
124 static void onXmlElementEnd(void *userData, const XML_Char *name);
125 static void onXmlCharacterData(void *userData, const XML_Char *s, int len);
126};
127
128
129class HippoGridManager
130{
131public:
132 HippoGridManager();
133 ~HippoGridManager();
134
135 void init();
136 void saveFile();
137 void discardAndReload();
138
139 HippoGridInfo* getGrid(const std::string &grid) const;
140 HippoGridInfo* getConnectedGrid() const;
141 HippoGridInfo* getCurrentGrid() const;
142 const std::string& getDefaultGridNick() const;
143 const std::string& getCurrentGridNick() const;
144
145 void setDefaultGrid(const std::string &grid);
146 void setCurrentGrid(const std::string &grid);
147 void setCurrentGridAsConnected();
148
149 void addGrid(HippoGridInfo *grid);
150 void deleteGrid(const std::string &grid);
151
152 typedef std::map<std::string, HippoGridInfo*>::iterator GridIterator;
153 GridIterator beginGrid() { return mGridInfo.begin(); }
154 GridIterator endGrid() { return mGridInfo.end(); }
155
156private:
157 std::map<std::string, HippoGridInfo*> mGridInfo;
158 std::string mDefaultGrid;
159 std::string mCurrentGrid;
160 HippoGridInfo *mConnectedGrid;
161 int mDefaultGridsVersion;
162
163 void cleanup();
164 void loadFromFile();
165 void parseFile(const std::string &fileName, bool mergeIfNewer);
166 void parseUrl(const char *url, bool mergeIfNewer);
167 void parseData(LLSD &gridInfo, bool mergeIfNewer);
168};
169
170
171extern HippoGridManager *gHippoGridManager;
172
173
174#endif
diff --git a/linden/indra/newview/hippoLimits.cpp b/linden/indra/newview/hippoLimits.cpp
new file mode 100644
index 0000000..dae81a6
--- /dev/null
+++ b/linden/indra/newview/hippoLimits.cpp
@@ -0,0 +1,56 @@
1
2
3#include "llviewerprecompiledheaders.h"
4
5#include "hippoLimits.h"
6
7#include "hippoGridManager.h"
8
9#include <llerror.h>
10
11
12HippoLimits *gHippoLimits = 0;
13
14
15HippoLimits::HippoLimits()
16{
17 setLimits();
18}
19
20
21void HippoLimits::setLimits()
22{
23 if (gHippoGridManager->getConnectedGrid()->getPlatform() == HippoGridInfo::PLATFORM_SECONDLIFE) {
24 setSecondLifeLimits();
25 } else {
26 setOpenSimLimits();
27 }
28}
29
30
31void HippoLimits::setOpenSimLimits()
32{
33 mMaxAgentGroups = 100;
34 mMaxPrimScale = 256.0f;
35 mMaxHeight = 10000.0f;
36 if (gHippoGridManager->getConnectedGrid()->isRenderCompat()) {
37 llinfos << "Using rendering compatible OpenSim limits." << llendl;
38 mMinHoleSize = 0.05f;
39 mMaxHollow = 0.95f;
40 } else {
41 llinfos << "Using Hippo OpenSim limits." << llendl;
42 mMinHoleSize = 0.01f;
43 mMaxHollow = 0.99f;
44 }
45}
46
47void HippoLimits::setSecondLifeLimits()
48{
49 llinfos << "Using Second Life limits." << llendl;
50 mMaxAgentGroups = 25;
51 mMaxPrimScale = 10.0f;
52 mMaxHeight = 4096.0f;
53 mMinHoleSize = 0.05f;
54 mMaxHollow = 0.95f;
55}
56
diff --git a/linden/indra/newview/hippoLimits.h b/linden/indra/newview/hippoLimits.h
new file mode 100644
index 0000000..900480b
--- /dev/null
+++ b/linden/indra/newview/hippoLimits.h
@@ -0,0 +1,33 @@
1#ifndef __HIPPO_LIMITS_H__
2#define __HIPPO_LIMITS_H__
3
4
5class HippoLimits
6{
7public:
8 HippoLimits();
9
10 int getMaxAgentGroups() const { return mMaxAgentGroups; }
11 float getMaxHeight() const { return mMaxHeight; }
12 float getMinHoleSize() const { return mMinHoleSize; }
13 float getMaxHollow() const { return mMaxHollow; }
14 float getMaxPrimScale() const { return mMaxPrimScale; }
15
16 void setLimits();
17
18private:
19 int mMaxAgentGroups;
20 float mMaxHeight;
21 float mMinHoleSize;
22 float mMaxHollow;
23 float mMaxPrimScale;
24
25 void setOpenSimLimits();
26 void setSecondLifeLimits();
27};
28
29
30extern HippoLimits *gHippoLimits;
31
32
33#endif
diff --git a/linden/indra/newview/hippoRestRequest.cpp b/linden/indra/newview/hippoRestRequest.cpp
new file mode 100644
index 0000000..20e6187
--- /dev/null
+++ b/linden/indra/newview/hippoRestRequest.cpp
@@ -0,0 +1,56 @@
1
2
3#include "llviewerprecompiledheaders.h"
4
5#include "hippoRestRequest.h"
6
7#ifndef CURL_STATICLIB
8#define CURL_STATICLIB 1
9#endif
10#include <curl/curl.h>
11
12#include <stdtypes.h>
13#include <llerror.h>
14
15
16static size_t curlWrite(void *ptr, size_t size, size_t nmemb, void *userData)
17{
18 std::string *result = (std::string*)userData;
19 size_t bytes = (size * nmemb);
20 result->append((char*)ptr, bytes);
21 return nmemb;
22}
23
24
25//static
26int HippoRestRequest::getBlocking(const std::string &url, std::string *result)
27{
28 llinfos << "Requesting: " << url << llendl;
29
30 char curlErrorBuffer[CURL_ERROR_SIZE];
31 CURL* curlp = curl_easy_init();
32
33 curl_easy_setopt(curlp, CURLOPT_NOSIGNAL, 1); // don't use SIGALRM for timeouts
34 curl_easy_setopt(curlp, CURLOPT_TIMEOUT, 5); // seconds
35
36 curl_easy_setopt(curlp, CURLOPT_WRITEFUNCTION, curlWrite);
37 curl_easy_setopt(curlp, CURLOPT_WRITEDATA, result);
38 curl_easy_setopt(curlp, CURLOPT_URL, url.c_str());
39 curl_easy_setopt(curlp, CURLOPT_ERRORBUFFER, curlErrorBuffer);
40 curl_easy_setopt(curlp, CURLOPT_FAILONERROR, 1);
41
42 *result = "";
43 S32 curlSuccess = curl_easy_perform(curlp);
44 S32 httpStatus = 499;
45 curl_easy_getinfo(curlp, CURLINFO_RESPONSE_CODE, &httpStatus);
46
47 if (curlSuccess != 0) {
48 llwarns << "CURL ERROR (HTTP Status " << httpStatus << "): " << curlErrorBuffer << llendl;
49 } else if (httpStatus != 200) {
50 llwarns << "HTTP Error " << httpStatus << ", but no Curl error." << llendl;
51 }
52
53 curl_easy_cleanup(curlp);
54 return httpStatus;
55}
56
diff --git a/linden/indra/newview/hippoRestRequest.h b/linden/indra/newview/hippoRestRequest.h
new file mode 100644
index 0000000..1dcb4a0
--- /dev/null
+++ b/linden/indra/newview/hippoRestRequest.h
@@ -0,0 +1,16 @@
1#ifndef __HIPPO_REST_REQTUEST_H__
2#define __HIPPO_REST_REQTUEST_H__
3
4
5#include <string>
6
7
8class HippoRestRequest
9{
10 public:
11 static int getBlocking(const std::string &url, std::string *result);
12
13};
14
15
16#endif
diff --git a/linden/indra/newview/hippoUpdate.cpp b/linden/indra/newview/hippoUpdate.cpp
new file mode 100644
index 0000000..872ca30
--- /dev/null
+++ b/linden/indra/newview/hippoUpdate.cpp
@@ -0,0 +1,92 @@
1
2#include "hippoUpdate.h"
3
4#include <cstdio>
5#include <list>
6#include <vector>
7
8#include <stdtypes.h>
9#include <llhttpclient.h>
10#include <llmemory.h>
11#include <llversionviewer.h>
12#include "llviewercontrol.h"
13#include "llviewernetwork.h"
14#include "llweb.h"
15#include <llwindow.h>
16
17
18std::string gHippoChannel;
19
20
21// static
22bool HippoUpdate::checkUpdate()
23{
24 llinfos << "Hippo Update Check..." << llendl;
25
26 // get channel name
27 gHippoChannel = gSavedSettings.getString("ChannelName");
28
29 // get mac address
30 char macAddress[18];
31 sprintf(macAddress, "%02x:%02x:%02x:%02x:%02x:%02x",
32 gMACAddress[0], gMACAddress[1], gMACAddress[2], gMACAddress[3], gMACAddress[4], gMACAddress[5]);
33
34 // build URL for update check
35 char url[1000];
36 snprintf(url, 1000,
37/* "http://update.mjm.game-host.org/os/viewer.php?"
38 "product=%s&channel=%s&"
39 "version_major=%d&version_minor=%d&version_patch=%d&version_base=%s&"
40 "platform=%s&mac=%s",
41 LL_PRODUCT, LL_CHANNEL_CSTR,
42 LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VERSION_BASE,
43 LL_PLATFORM*/"", macAddress);
44
45 // query update server
46 std::string escaped_url = LLWeb::escapeURL(url);
47 LLSD response = LLHTTPClient::blockingGet(escaped_url.c_str());
48
49 // check response, return on error
50 S32 status = response["status"].asInteger();
51 if ((status != 200) || !response["body"].isMap()) {
52 llinfos << "Hippo Update failed (" << status << "): "
53 << (response["body"].isString()? response["body"].asString(): "<unknown error>")
54 << llendl;
55 return true;
56 }
57
58 // get data from response
59 LLSD data = response["body"];
60 std::string webpage = (data.has("webpage") && data["webpage"].isString())? data["webpage"].asString(): "";
61 std::string message = (data.has("message") && data["message"].isString())? data["message"].asString(): "";
62 std::string yourVersion = (data.has("yourVersion") && data["yourVersion"].isString())? data["yourVersion"].asString(): "";
63 std::string curVersion = (data.has("curVersion") && data["curVersion"].isString())? data["curVersion"].asString(): "";
64 bool update = (data.has("update") && data["update"].isBoolean())? data["update"].asBoolean(): false;
65 bool mandatory = (data.has("mandatory") && data["mandatory"].isBoolean())? data["mandatory"].asBoolean(): false;
66
67 // log and return, if no update available
68 llinfos << "Your version is " << yourVersion << ", current version is " << curVersion << '.' << llendl;
69 if (!update) return true;
70 llinfos << "Update is " << (mandatory? "mandatory.": "optional.") << llendl;
71
72 // show update dialog
73 char msg[1000];
74 snprintf(msg, 1000,
75 "There is a new viewer version available.\n"
76 "\n"
77 "Your version: %s\n"
78 "Current version: %s\n"
79 "%s\n"
80 "Do you want to visit the web site?",
81 yourVersion.c_str(), curVersion.c_str(),
82 mandatory? "\nThis is a mandatory update.\n": "");
83 S32 button = OSMessageBox(msg, "Hippo OpenSim Viewer Update", OSMB_YESNO);
84 if (button == OSBTN_YES) {
85 llinfos << "Taking user to " << webpage << llendl;
86 LLWeb::loadURLExternal(webpage);
87 // exit the viewer
88 return false;
89 }
90
91 return !mandatory;
92}
diff --git a/linden/indra/newview/hippoUpdate.h b/linden/indra/newview/hippoUpdate.h
new file mode 100644
index 0000000..559c8b3
--- /dev/null
+++ b/linden/indra/newview/hippoUpdate.h
@@ -0,0 +1,12 @@
1#ifndef __HIPPO_UPDATE_H__
2#define __HIPPO_UPDATE_H__
3
4
5class HippoUpdate
6{
7 public:
8 static bool checkUpdate();
9};
10
11
12#endif
diff --git a/linden/indra/newview/jcfloater_animation_list.cpp b/linden/indra/newview/jcfloater_animation_list.cpp
new file mode 100644
index 0000000..368e7d6
--- /dev/null
+++ b/linden/indra/newview/jcfloater_animation_list.cpp
@@ -0,0 +1,462 @@
1/* Copyright (c) 2009
2 *
3 * Modular Systems Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or
6 * without modification, are permitted provided that the following
7 * conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following
13 * disclaimer in the documentation and/or other materials provided
14 * with the distribution.
15 * 3. Neither the name Modular Systems Ltd nor the names of its contributors
16 * may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS LTD AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29 * THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include "llviewerprecompiledheaders.h"
33
34#include "lluuid.h"
35#include "lluictrlfactory.h"
36#include "llvoavatar.h"
37
38#include "llagent.h"
39
40#include "llscrolllistctrl.h"
41
42#include "llviewerobjectlist.h"
43
44#include "jcfloater_animation_list.h"
45
46#include "llviewercontrol.h"
47
48#include "llinventorymodel.h"
49
50#include "llcategory.h"
51
52#include "llfloaterchat.h"
53
54#include "llfloateravatarinfo.h"
55
56
57
58
59
60//std::map<LLUUID, AObjectData> JCFloaterAnimList::mObjectOwners;
61
62JCFloaterAnimList::JCFloaterAnimList(const LLSD& seed) :
63 LLFloater(std::string("animation list")),
64 mAnimList(0)
65{
66 BOOL no_open = FALSE;
67 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_animation_list.xml",&getFactoryMap(),no_open);
68}
69
70JCFloaterAnimList::~JCFloaterAnimList()
71{
72}
73
74//static
75bool JCFloaterAnimList::visible(LLFloater* instance, const LLSD& key)
76{
77 return VisibilityPolicy<LLFloater>::visible(instance, key);
78}
79
80//static
81void JCFloaterAnimList::show(LLFloater* instance, const LLSD& key)
82{
83 VisibilityPolicy<LLFloater>::show(instance, key);
84}
85
86//static
87void JCFloaterAnimList::hide(LLFloater* instance, const LLSD& key)
88{
89 VisibilityPolicy<LLFloater>::hide(instance, key);
90}
91
92void JCFloaterAnimList::onVisibilityChange(BOOL new_visibility)
93{
94 if(!new_visibility) {
95 // *HACK: clean up memory on hiding
96 mObjectOwners.clear();
97 }
98}
99
100BOOL JCFloaterAnimList::postBuild()
101{
102 mAnimList = getChild<LLScrollListCtrl>("animation_list");
103 mAnimList->setCallbackUserData(this);
104 mAnimList->setDoubleClickCallback(onDoubleClick);
105 mAnimList->sortByColumn("animation_uuid", TRUE);
106
107 childSetAction("Stop Selected",StopSelected,this);
108 childSetAction("Revoke Selected",RevokeSelected,this);
109 childSetAction("Stop+Revoke Selected",StopRevokeSelected,this);
110 childSetAction("Open Owner Profile",OpenProfile,this);
111
112 return 1;
113}
114
115void JCFloaterAnimList::StopSelected(void *userdata )
116{
117 JCFloaterAnimList *self = (JCFloaterAnimList*)userdata;
118 LLDynamicArray<LLUUID> ids;
119 std::vector< LLScrollListItem * > items = self->mAnimList->getAllSelected();
120 for( std::vector< LLScrollListItem * >::iterator itr = items.begin(); itr != items.end(); itr++ )
121 {
122 LLScrollListItem *item = *itr;
123 const LLUUID &id = item->getColumn(LIST_ANIMATION_UUID)->getValue().asUUID();
124 if( ids.find(id) == LLDynamicArray<LLUUID>::FAIL )
125 {
126 ids.put(id);
127 }
128 }
129 gAgent.sendAnimationRequests(ids,ANIM_REQUEST_STOP);
130}
131
132void JCFloaterAnimList::RevokeSelected(void *userdata )
133{
134 JCFloaterAnimList *self = (JCFloaterAnimList*)userdata;
135 LLDynamicArray<LLUUID> ids;
136 std::vector< LLScrollListItem * > items = self->mAnimList->getAllSelected();
137 for( std::vector< LLScrollListItem * >::iterator itr = items.begin(); itr != items.end(); itr++ )
138 {
139 LLScrollListItem *item = *itr;
140 const LLUUID &id = item->getColumn(LIST_OBJECT_UUID)->getValue().asUUID();
141 if( ids.find(id) == LLDynamicArray<LLUUID>::FAIL )
142 {
143 ids.put(id);
144 }
145 }
146 if( !ids.empty() )
147 {
148 for(LLDynamicArray<LLUUID>::iterator itr = ids.begin(); itr != ids.end(); ++itr)
149 {
150 LLUUID id = *itr;
151 LLMessageSystem* msg = gMessageSystem;
152 msg->newMessageFast(_PREHASH_RevokePermissions);
153 msg->nextBlockFast(_PREHASH_AgentData);
154 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
155 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
156 msg->nextBlockFast(_PREHASH_Data);
157 msg->addUUIDFast(_PREHASH_ObjectID, id);
158 msg->addU32Fast(_PREHASH_ObjectPermissions, U32_MAX);
159 gAgent.sendReliableMessage();
160 }
161 }
162}
163
164void JCFloaterAnimList::StopRevokeSelected(void *userdata )
165{
166 StopSelected(userdata);
167 RevokeSelected(userdata);
168}
169
170void JCFloaterAnimList::OpenProfile(void *userdata )
171{
172 JCFloaterAnimList *self = (JCFloaterAnimList*)userdata;
173 std::vector< LLScrollListItem * > items = self->mAnimList->getAllSelected();
174 if(!items.empty())
175 {
176 //LLVOAvatar* avatarp = gAgent.getAvatarObject();
177 for(std::vector< LLScrollListItem * >::iterator itr = items.begin(); itr != items.end(); ++itr)
178 {
179 LLScrollListItem *item = *itr;
180 const LLUUID &object_id = item->getColumn(LIST_OBJECT_UUID)->getValue().asUUID();
181 LLFloaterAvatarInfo::showFromDirectory(self->mObjectOwners[object_id].owner_id);
182 }
183 }
184}
185
186/*void JCFloaterAnimList::ReturnSelected(void *userdata )
187{
188 JCFloaterAnimList *self = (JCFloaterAnimList*)userdata;
189 LLDynamicArray<LLUUID> ids = self->mAnimList->getSelectedIDs();
190 if(ids.size() > 0)
191 {
192 LLVOAvatar* avatarp = gAgent.getAvatarObject();
193 for(LLDynamicArray<LLUUID>::iterator itr = ids.begin(); itr != ids.end(); ++itr)
194 {
195 LLUUID id = *itr;
196
197 }
198 }
199}*/
200
201void JCFloaterAnimList::draw()
202{
203 refresh();
204 LLFloater::draw();
205}
206//LLScrollListCtrl::getSelectedIDs();
207void JCFloaterAnimList::refresh()
208{
209 LLDynamicArray<LLUUID> selected = mAnimList->getSelectedIDs();
210 S32 scrollpos = mAnimList->getScrollPos();
211 mAnimList->deleteAllItems();
212 LLVOAvatar* avatarp = gAgent.getAvatarObject();
213 if (avatarp)
214 {
215 LLVOAvatar::AnimSourceIterator ai;
216
217 for(ai = avatarp->mAnimationSources.begin(); ai != avatarp->mAnimationSources.end(); ++ai)
218 {
219 LLSD element;
220 const LLUUID &aifirst = ai->first;
221 LLViewerInventoryItem* item = gInventory.getItem(findItemID(ai->second,0));
222
223 // *NOTE: conceal id to prevent bugs, use
224 // item->getColumn(LIST_ANIMATION_UUID)->getValue().asUUID()
225 // instead
226 element["id"] = LLUUID::null.combine(ai->second);
227 element["columns"][LIST_ANIMATION_NAME]["column"] = "Anim Name";
228 element["columns"][LIST_ANIMATION_NAME]["type"] = "text";
229 element["columns"][LIST_ANIMATION_NAME]["color"] = gColors.getColor("ScrollUnselectedColor").getValue();
230 if(item)
231 {
232 element["columns"][LIST_ANIMATION_NAME]["value"] = item->getName();//ai->second//"avatar_icon";
233 }else
234 {
235 element["columns"][LIST_ANIMATION_NAME]["value"] = "Not in Inventory";
236 }
237 element["columns"][LIST_ANIMATION_UUID]["column"] = "Animation UUID";
238 element["columns"][LIST_ANIMATION_UUID]["type"] = "text";
239 element["columns"][LIST_ANIMATION_UUID]["color"] = gColors.getColor("ScrollUnselectedColor").getValue();
240 element["columns"][LIST_ANIMATION_UUID]["value"] = ai->second;
241 element["columns"][LIST_OBJECT_UUID]["column"] = "Source Object UUID";
242 element["columns"][LIST_OBJECT_UUID]["type"] = "text";
243 element["columns"][LIST_OBJECT_UUID]["color"] = gColors.getColor("ScrollUnselectedColor").getValue();
244 element["columns"][LIST_OBJECT_UUID]["value"] = aifirst;
245 element["columns"][LIST_OBJECT_OWNER]["column"] = "Source Owner";
246 element["columns"][LIST_OBJECT_OWNER]["type"] = "text";
247 element["columns"][LIST_OBJECT_OWNER]["color"] = gColors.getColor("ScrollUnselectedColor").getValue();
248 std::string name("?");
249 LLViewerObject *object = gObjectList.findObject(aifirst);
250 bool is_first = ( mObjectOwners.count( aifirst ) == 0 );
251 bool just_shown = false;
252 LLUUID owner_id(LLUUID::null);
253
254 if( !is_first )
255 {
256 name = mObjectOwners[aifirst].owner_name;
257 owner_id = mObjectOwners[aifirst].owner_id;
258 }
259
260 if( object )
261 {
262 if( object->permYouOwner() )
263 {
264 owner_id = gAgent.getID();
265 gAgent.getName(name);
266 }
267 else
268 {
269 object = (LLViewerObject *) object->getRoot();
270 if( object->isAvatar() )
271 {
272 owner_id = object->getID();
273 name = ((LLVOAvatar *)object)->getFullname();
274 }
275 }
276 }
277
278 {
279 AObjectData &data = mObjectOwners[aifirst];
280 if( object )
281 {
282 if( !data.in_object_list )
283 {
284 just_shown = true;
285 data.in_object_list = true;
286 }
287 data.root_id = ( (LLViewerObject*)object->getRoot() )->getID();
288 }
289 data.owner_name = name;
290 data.owner_id = owner_id;
291 }
292
293 if( is_first || just_shown ) {
294 if( name == "?" && !aifirst.isNull()) {
295 LLMessageSystem* msg = gMessageSystem;
296 msg->newMessageFast(_PREHASH_RequestObjectPropertiesFamily);
297 msg->nextBlockFast(_PREHASH_AgentData);
298 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
299 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
300 msg->nextBlockFast(_PREHASH_ObjectData);
301 msg->addU32Fast(_PREHASH_RequestFlags, 0 );
302 if( object )
303 {
304 LL_INFOS("Avatar List") << "Sending RequestObjectPropertiesFamily packet for id( " << aifirst.asString() << " ) on object( " << object->getID().asString() << " )" << LL_ENDL;
305 msg->addUUIDFast(_PREHASH_ObjectID, object->getID());
306 }
307 else
308 {
309 LL_INFOS("Avatar List") << "Sending RequestObjectPropertiesFamily packet for id( " << aifirst.asString() << " )" << LL_ENDL;
310 msg->addUUIDFast(_PREHASH_ObjectID, aifirst);
311 }
312 gAgent.sendReliableMessage();
313 }
314 }
315 element["columns"][LIST_OBJECT_OWNER]["value"] = name;
316 mAnimList->addElement(element, ADD_BOTTOM);
317 //LLViewerObject* objectp = gObjectList.findObject(ai->first);
318 //if(objectp)
319 //{
320 // //objectp->
321 //}
322
323 //object_ids.insert(ai->first);
324 //animation_ids.insert(ai->second);
325 }
326 }
327
328 mAnimList->sortItems();
329 mAnimList->selectMultiple(selected);
330 mAnimList->setScrollPos(scrollpos);
331}
332
333void JCFloaterAnimList::callbackLoadOwnerName(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data)
334{
335 LLUUID *oid = (LLUUID*)data;
336 JCFloaterAnimList *self = JCFloaterAnimList::getInstance(LLSD());
337 if(self->mObjectOwners.count( *oid ) > 0)
338 {
339 self->mObjectOwners[*oid].owner_name = first + " " + last;
340 }
341 delete oid;
342}
343
344void JCFloaterAnimList::processObjectPropertiesFamily(LLMessageSystem* msg, void** user_data)
345{
346 if(!JCFloaterAnimList::instanceVisible(LLSD())) return;
347 JCFloaterAnimList *self = JCFloaterAnimList::getInstance(LLSD());
348 LLUUID object_id;
349 U32 request_flags;
350 LLUUID creator_id;
351 LLUUID owner_id;
352 LLUUID group_id;
353 LLUUID extra_id;
354 U32 base_mask, owner_mask, group_mask, everyone_mask, next_owner_mask;
355 LLSaleInfo sale_info;
356 LLCategory category;
357 msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_RequestFlags, request_flags );
358 msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, object_id );
359 msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id );
360 msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_GroupID, group_id );
361 msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_BaseMask, base_mask );
362 msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_OwnerMask, owner_mask );
363 msg->getU32Fast(_PREHASH_ObjectData,_PREHASH_GroupMask, group_mask );
364 msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_EveryoneMask, everyone_mask );
365 msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_NextOwnerMask, next_owner_mask);
366 sale_info.unpackMessage(msg, _PREHASH_ObjectData);
367 category.unpackMessage(msg, _PREHASH_ObjectData);
368 LLUUID last_owner_id;
369 msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id );
370 std::string name;
371 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, name);
372 std::string desc;
373 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, desc);
374
375 for( std::map<LLUUID, AObjectData>::iterator di = self->mObjectOwners.begin(); di != self->mObjectOwners.end(); di++ )
376 {
377 const LLUUID &id = di->first;
378 const AObjectData &data = di->second;
379
380 if(data.root_id == object_id || data.owner_id == object_id)
381 {
382 LLUUID* ref = new LLUUID(id);
383 self->mObjectOwners[id].owner_id = owner_id;
384 gCacheName->get(owner_id, FALSE, callbackLoadOwnerName, (void*)ref);
385 }
386 }
387}
388
389const LLUUID& JCFloaterAnimList::findItemID(const LLUUID& asset_id, BOOL copyable_only)
390{
391 LLViewerInventoryCategory::cat_array_t cats;
392 LLViewerInventoryItem::item_array_t items;
393 LLAssetIDMatches asset_id_matches(asset_id);
394 gInventory.collectDescendentsIf(LLUUID::null,
395 cats,
396 items,
397 LLInventoryModel::INCLUDE_TRASH,
398 asset_id_matches);
399
400 if (items.count())
401 {
402 // search for copyable version first
403 for (S32 i = 0; i < items.count(); i++)
404 {
405 LLInventoryItem* itemp = items[i];
406 LLPermissions item_permissions = itemp->getPermissions();
407 if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID()))
408 {
409 return itemp->getUUID();
410 }
411 }
412 // otherwise just return first instance, unless copyable requested
413 if (copyable_only)
414 {
415 return LLUUID::null;
416 }
417 else
418 {
419 return items[0]->getUUID();
420 }
421 }
422
423 return LLUUID::null;
424}
425
426/*void JCFloaterAnimList::onClickCopyAnimationUUID(void *userdata)
427{
428 LLFloaterAvatarList *self = (LLFloaterAvatarList*)userdata;
429 LLScrollListItem *item = self->mAvatarList->getFirstSelected();
430
431 if ( NULL == item ) return;
432
433 LLUUID agent_id = item->getUUID();
434
435 char buffer[UUID_STR_LENGTH];
436 agent_id.toString(buffer);
437
438 gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer));
439}*/
440
441void JCFloaterAnimList::onDoubleClick(void *userdata)
442{
443 //JCFloaterAnimList *self = (JCFloaterAnimList*)userdata;
444 //LLScrollListItem *item = self->mAnimList->getFirstSelected();
445 //if(!item)return;
446 //LLUUID agent_id = item->getUUID();
447
448 //gAgent.setFocusObject(gObjectList.findObject(agent_id));
449 //gAgent.setFocusOnAvatar(FALSE, TRUE);
450}
451
452void JCFloaterAnimList::close(bool app)
453{
454 //sInstance->setVisible(0);
455//#ifdef RECONSTRUCT_ON_TOGGLE
456// sInstance = NULL;
457 LLFloater::close(app);
458//#else
459// sInstance->setVisible(!(sInstance->getVisible()));
460//#endif
461}
462
diff --git a/linden/indra/newview/jcfloater_animation_list.h b/linden/indra/newview/jcfloater_animation_list.h
new file mode 100644
index 0000000..61bf635
--- /dev/null
+++ b/linden/indra/newview/jcfloater_animation_list.h
@@ -0,0 +1,88 @@
1/* Copyright (c) 2009
2 *
3 * Modular Systems Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or
6 * without modification, are permitted provided that the following
7 * conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following
13 * disclaimer in the documentation and/or other materials provided
14 * with the distribution.
15 * 3. Neither the name Modular Systems Ltd nor the names of its contributors
16 * may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS LTD AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29 * THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include "llfloater.h"
33#include "lluuid.h"
34#include "llstring.h"
35
36struct AObjectData
37{
38 std::string owner_name;
39 LLUUID owner_id;
40 LLUUID root_id;
41 bool in_object_list;
42};
43
44class JCFloaterAnimList : public LLFloater, public LLUISingleton<JCFloaterAnimList, JCFloaterAnimList>
45{
46public:
47 JCFloaterAnimList(const LLSD& seed);
48 virtual ~JCFloaterAnimList();
49
50 /*virtual*/ BOOL postBuild();
51 /*virtual*/ void draw();
52 /*virtual*/ void onVisibilityChange(BOOL new_visibility);
53
54 /*virtual*/ void close(bool app = 0);
55 void refresh();
56
57 const LLUUID& findItemID(const LLUUID& asset_id, BOOL copyable_only);
58
59 static void callbackLoadOwnerName(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data);
60
61 static void processObjectPropertiesFamily(LLMessageSystem* msg, void** user_data);
62
63 static bool visible(LLFloater* instance, const LLSD& key);
64 static void show(LLFloater* instance, const LLSD& key);
65 static void hide(LLFloater* instance, const LLSD& key);
66
67private:
68
69 enum ANIMATION_COLUMN_ORDER
70 {
71 LIST_ANIMATION_NAME,
72 LIST_ANIMATION_UUID,
73 LIST_OBJECT_UUID,
74 LIST_OBJECT_OWNER
75 };
76
77 LLScrollListCtrl* mAnimList;
78
79 std::map<LLUUID, AObjectData> mObjectOwners;
80
81 static void StopSelected(void *userdata );
82 static void RevokeSelected(void *userdata );
83 static void StopRevokeSelected(void *userdata );
84 static void OpenProfile(void *userdata );
85 static void onDoubleClick(void *userdata);
86
87};
88
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index 1193d22..b3321fc 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -192,6 +192,8 @@ const F32 OBJECT_MIN_ZOOM = 0.02f;
192const F32 APPEARANCE_MIN_ZOOM = 0.39f; 192const F32 APPEARANCE_MIN_ZOOM = 0.39f;
193const F32 APPEARANCE_MAX_ZOOM = 8.f; 193const F32 APPEARANCE_MAX_ZOOM = 8.f;
194 194
195const F32 DIST_FUDGE = 16.f; // meters
196
195// fidget constants 197// fidget constants
196const F32 MIN_FIDGET_TIME = 8.f; // seconds 198const F32 MIN_FIDGET_TIME = 8.f; // seconds
197const F32 MAX_FIDGET_TIME = 20.f; // seconds 199const F32 MAX_FIDGET_TIME = 20.f; // seconds
@@ -216,6 +218,7 @@ LLAgent gAgent;
216// 218//
217// Statics 219// Statics
218// 220//
221BOOL LLAgent::sPhantom = FALSE;
219 222
220const F32 LLAgent::TYPING_TIMEOUT_SECS = 5.f; 223const F32 LLAgent::TYPING_TIMEOUT_SECS = 5.f;
221 224
@@ -452,6 +455,10 @@ void LLAgent::init()
452//----------------------------------------------------------------------------- 455//-----------------------------------------------------------------------------
453void LLAgent::cleanup() 456void LLAgent::cleanup()
454{ 457{
458 mInitialized = FALSE;
459 mWearablesLoaded = FALSE;
460 mShowAvatar = TRUE;
461
455 setSitCamera(LLUUID::null); 462 setSitCamera(LLUUID::null);
456 mAvatarObject = NULL; 463 mAvatarObject = NULL;
457 if(mLookAt) 464 if(mLookAt)
@@ -751,6 +758,9 @@ void LLAgent::movePitch(S32 direction)
751// Does this parcel allow you to fly? 758// Does this parcel allow you to fly?
752BOOL LLAgent::canFly() 759BOOL LLAgent::canFly()
753{ 760{
761// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0c)
762 if (gRlvHandler.hasBehaviour(RLV_BHVR_FLY)) return FALSE;
763// [/RLVa:KB]
754 if (isGodlike()) return TRUE; 764 if (isGodlike()) return TRUE;
755 765
756 LLViewerRegion* regionp = getRegion(); 766 LLViewerRegion* regionp = getRegion();
@@ -790,6 +800,13 @@ void LLAgent::setFlying(BOOL fly)
790 800
791 if (fly) 801 if (fly)
792 { 802 {
803// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0c)
804 if (gRlvHandler.hasBehaviour(RLV_BHVR_FLY))
805 {
806 return;
807 }
808// [/RLVa:KB]
809
793 BOOL was_flying = getFlying(); 810 BOOL was_flying = getFlying();
794 if (!canFly() && !was_flying) 811 if (!canFly() && !was_flying)
795 { 812 {
@@ -829,6 +846,35 @@ void LLAgent::toggleFlying()
829 846
830 847
831//----------------------------------------------------------------------------- 848//-----------------------------------------------------------------------------
849// togglePhantom()
850//-----------------------------------------------------------------------------
851void LLAgent::togglePhantom()
852{
853 BOOL phan = !(sPhantom);
854
855 setPhantom( phan );
856}
857
858
859//-----------------------------------------------------------------------------
860// setPhantom() lgg
861//-----------------------------------------------------------------------------
862void LLAgent::setPhantom(BOOL phantom)
863{
864 sPhantom = phantom;
865}
866
867
868//-----------------------------------------------------------------------------
869// getPhantom() lgg
870//-----------------------------------------------------------------------------
871BOOL LLAgent::getPhantom()
872{
873 return sPhantom;
874}
875
876
877//-----------------------------------------------------------------------------
832// setRegion() 878// setRegion()
833//----------------------------------------------------------------------------- 879//-----------------------------------------------------------------------------
834void LLAgent::setRegion(LLViewerRegion *regionp) 880void LLAgent::setRegion(LLViewerRegion *regionp)
@@ -1670,6 +1716,10 @@ F32 LLAgent::getCameraZoomFraction()
1670 // already [0,1] 1716 // already [0,1]
1671 return mHUDTargetZoom; 1717 return mHUDTargetZoom;
1672 } 1718 }
1719 else if (gSavedSettings.getBOOL("DisableCameraConstraints"))
1720 {
1721 return mCameraZoomFraction;
1722 }
1673 else if (mFocusOnAvatar && cameraThirdPerson()) 1723 else if (mFocusOnAvatar && cameraThirdPerson())
1674 { 1724 {
1675 return clamp_rescale(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION, 1.f, 0.f); 1725 return clamp_rescale(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION, 1.f, 0.f);
@@ -1682,7 +1732,6 @@ F32 LLAgent::getCameraZoomFraction()
1682 else 1732 else
1683 { 1733 {
1684 F32 min_zoom; 1734 F32 min_zoom;
1685 const F32 DIST_FUDGE = 16.f; // meters
1686 F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE, 1735 F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
1687 LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE, 1736 LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
1688 MAX_CAMERA_DISTANCE_FROM_AGENT); 1737 MAX_CAMERA_DISTANCE_FROM_AGENT);
@@ -1731,10 +1780,9 @@ void LLAgent::setCameraZoomFraction(F32 fraction)
1731 else 1780 else
1732 { 1781 {
1733 F32 min_zoom = LAND_MIN_ZOOM; 1782 F32 min_zoom = LAND_MIN_ZOOM;
1734 const F32 DIST_FUDGE = 16.f; // meters
1735 F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE, 1783 F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
1736 LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE, 1784 LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
1737 MAX_CAMERA_DISTANCE_FROM_AGENT); 1785 MAX_CAMERA_DISTANCE_FROM_AGENT);
1738 1786
1739 if (mFocusObject.notNull()) 1787 if (mFocusObject.notNull())
1740 { 1788 {
@@ -1753,7 +1801,14 @@ void LLAgent::setCameraZoomFraction(F32 fraction)
1753 1801
1754 LLVector3d camera_offset_dir = mCameraFocusOffsetTarget; 1802 LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
1755 camera_offset_dir.normalize(); 1803 camera_offset_dir.normalize();
1756 mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom); 1804 if (gSavedSettings.getBOOL("DisableCameraConstraints"))
1805 {
1806 mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 262140.f, 1.f, min_zoom);
1807 }
1808 else
1809 {
1810 mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom);
1811 }
1757 } 1812 }
1758 startCameraAnimation(); 1813 startCameraAnimation();
1759} 1814}
@@ -1852,29 +1907,32 @@ void LLAgent::cameraZoomIn(const F32 fraction)
1852 } 1907 }
1853 } 1908 }
1854 1909
1855 new_distance = llmax(new_distance, min_zoom);
1856
1857 // Don't zoom too far back 1910 // Don't zoom too far back
1858 const F32 DIST_FUDGE = 16.f; // meters 1911 // Actually, let's when disable camera constraints is active -- McCabe
1859 F32 max_distance = llmin(mDrawDistance - DIST_FUDGE, 1912 if (!gSavedSettings.getBOOL("DisableCameraConstraints"))
1860 LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
1861
1862 if (new_distance > max_distance)
1863 { 1913 {
1864 new_distance = max_distance; 1914 new_distance = llmax(new_distance, min_zoom);
1865 1915
1866 /* 1916 F32 max_distance = llmin(mDrawDistance - DIST_FUDGE,
1867 // Unless camera is unlocked 1917 LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
1868 if (!LLViewerCamera::sDisableCameraConstraints) 1918
1919 if (new_distance > max_distance)
1869 { 1920 {
1870 return; 1921 new_distance = max_distance;
1922
1923 /*
1924 // Unless camera is unlocked
1925 if (!LLViewerCamera::sDisableCameraConstraints)
1926 {
1927 return;
1928 }
1929 */
1871 } 1930 }
1872 */
1873 }
1874 1931
1875 if( cameraCustomizeAvatar() ) 1932 if( cameraCustomizeAvatar() )
1876 { 1933 {
1877 new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM ); 1934 new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM );
1935 }
1878 } 1936 }
1879 1937
1880 mCameraFocusOffsetTarget = new_distance * camera_offset_unit; 1938 mCameraFocusOffsetTarget = new_distance * camera_offset_unit;
@@ -1905,40 +1963,41 @@ void LLAgent::cameraOrbitIn(const F32 meters)
1905 LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); 1963 LLVector3d camera_offset_unit(mCameraFocusOffsetTarget);
1906 F32 current_distance = (F32)camera_offset_unit.normalize(); 1964 F32 current_distance = (F32)camera_offset_unit.normalize();
1907 F32 new_distance = current_distance - meters; 1965 F32 new_distance = current_distance - meters;
1908 F32 min_zoom = LAND_MIN_ZOOM; 1966
1909 1967 // Don't zoom too far back
1910 // Don't move through focus point 1968 // Actually, let's when disable camera constraints is active -- McCabe
1911 if (mFocusObject.notNull()) 1969 if (!gSavedSettings.getBOOL("DisableCameraConstraints"))
1912 { 1970 {
1913 if (mFocusObject->isAvatar()) 1971 F32 min_zoom = LAND_MIN_ZOOM;
1914 { 1972 F32 max_distance;
1915 min_zoom = AVATAR_MIN_ZOOM; 1973
1916 } 1974 // Don't move through focus point
1917 else 1975 if (mFocusObject.notNull())
1918 { 1976 {
1919 min_zoom = OBJECT_MIN_ZOOM; 1977 if (mFocusObject->isAvatar())
1978 {
1979 min_zoom = AVATAR_MIN_ZOOM;
1980 }
1981 else
1982 {
1983 min_zoom = OBJECT_MIN_ZOOM;
1984 }
1920 } 1985 }
1921 }
1922 1986
1923 new_distance = llmax(new_distance, min_zoom); 1987 new_distance = llmax(new_distance, min_zoom);
1924 1988
1925 // Don't zoom too far back 1989 max_distance = llmin(mDrawDistance - DIST_FUDGE,
1926 const F32 DIST_FUDGE = 16.f; // meters 1990 LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
1927 F32 max_distance = llmin(mDrawDistance - DIST_FUDGE,
1928 LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
1929 1991
1930 if (new_distance > max_distance) 1992 if (new_distance > max_distance)
1931 {
1932 // Unless camera is unlocked
1933 if (!gSavedSettings.getBOOL("DisableCameraConstraints"))
1934 { 1993 {
1935 return; 1994 return;
1936 } 1995 }
1937 }
1938 1996
1939 if( CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode() ) 1997 if( CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode() )
1940 { 1998 {
1941 new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM ); 1999 new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM );
2000 }
1942 } 2001 }
1943 2002
1944 // Compute new camera offset 2003 // Compute new camera offset
@@ -4214,6 +4273,13 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani
4214 return; 4273 return;
4215 } 4274 }
4216 4275
4276// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
4277 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (mAvatarObject.notNull()) && (mAvatarObject->mIsSitting) )
4278 {
4279 return;
4280 }
4281// [/RLVa:KB]
4282
4217 setControlFlags(AGENT_CONTROL_STAND_UP); // force stand up 4283 setControlFlags(AGENT_CONTROL_STAND_UP); // force stand up
4218 gViewerWindow->getWindow()->resetBusyCount(); 4284 gViewerWindow->getWindow()->resetBusyCount();
4219 4285
@@ -5142,6 +5208,14 @@ BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOO
5142// utility to build a location string 5208// utility to build a location string
5143void LLAgent::buildLocationString(std::string& str) 5209void LLAgent::buildLocationString(std::string& str)
5144{ 5210{
5211// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
5212 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
5213 {
5214 str = rlv_handler_t::cstrHidden;
5215 return;
5216 }
5217// [/RLVa:KB]
5218
5145 const LLVector3& agent_pos_region = getPositionAgent(); 5219 const LLVector3& agent_pos_region = getPositionAgent();
5146 S32 pos_x = S32(agent_pos_region.mV[VX]); 5220 S32 pos_x = S32(agent_pos_region.mV[VX]);
5147 S32 pos_y = S32(agent_pos_region.mV[VY]); 5221 S32 pos_y = S32(agent_pos_region.mV[VY]);
@@ -6035,6 +6109,15 @@ void LLAgent::teleportRequest(
6035// Landmark ID = LLUUID::null means teleport home 6109// Landmark ID = LLUUID::null means teleport home
6036void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id) 6110void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
6037{ 6111{
6112// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
6113 if ( (rlv_handler_t::isEnabled()) &&
6114 ( (gRlvHandler.hasBehaviour(RLV_BHVR_TPLM)) ||
6115 ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (mAvatarObject.notNull()) && (mAvatarObject->mIsSitting)) ))
6116 {
6117 return;
6118 }
6119// [/RLVa:KB]
6120
6038 LLViewerRegion *regionp = getRegion(); 6121 LLViewerRegion *regionp = getRegion();
6039 if(regionp && teleportCore()) 6122 if(regionp && teleportCore())
6040 { 6123 {
@@ -6099,6 +6182,17 @@ void LLAgent::teleportCancel()
6099 6182
6100void LLAgent::teleportViaLocation(const LLVector3d& pos_global) 6183void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
6101{ 6184{
6185// [RLVa:KB] - Alternate: Snowglobe-1.0 | Checked: 2009-07-07 (RLVa-1.0.0d)
6186 // If we're getting teleported due to @tpto we should disregard any @tploc=n or @unsit=n restrictions from the same object
6187 if ( (rlv_handler_t::isEnabled()) &&
6188 ( (gRlvHandler.hasBehaviourExcept(RLV_BHVR_TPLOC, gRlvHandler.getCurrentObject())) ||
6189 ( (mAvatarObject.notNull()) && (mAvatarObject->mIsSitting) &&
6190 (gRlvHandler.hasBehaviourExcept(RLV_BHVR_UNSIT, gRlvHandler.getCurrentObject()))) ) )
6191 {
6192 return;
6193 }
6194// [/RLVa:KB]
6195
6102 LLViewerRegion* regionp = getRegion(); 6196 LLViewerRegion* regionp = getRegion();
6103 LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); 6197 LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
6104 if(regionp && info) 6198 if(regionp && info)
@@ -6175,6 +6269,13 @@ void LLAgent::setTeleportState(ETeleportState state)
6175 // We're outa here. Save "back" slurl. 6269 // We're outa here. Save "back" slurl.
6176 mTeleportSourceSLURL = getSLURL(); 6270 mTeleportSourceSLURL = getSLURL();
6177 } 6271 }
6272
6273// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-07 (RLVa-1.0.0d) | Added: RLVa-0.2.0b
6274 if ( (rlv_handler_t::isEnabled()) && (TELEPORT_NONE == mTeleportState) )
6275 {
6276 gRlvHandler.setCanCancelTp(true);
6277 }
6278// [/RLVa:KB]
6178} 6279}
6179 6280
6180void LLAgent::stopCurrentAnimations() 6281void LLAgent::stopCurrentAnimations()
@@ -6742,11 +6843,19 @@ BOOL LLAgent::isWearingItem( const LLUUID& item_id )
6742// static 6843// static
6743void LLAgent::processAgentInitialWearablesUpdate( LLMessageSystem* mesgsys, void** user_data ) 6844void LLAgent::processAgentInitialWearablesUpdate( LLMessageSystem* mesgsys, void** user_data )
6744{ 6845{
6846 if (gNoRender)
6847 {
6848 return;
6849 }
6850
6745 // We should only receive this message a single time. Ignore subsequent AgentWearablesUpdates 6851 // We should only receive this message a single time. Ignore subsequent AgentWearablesUpdates
6746 // that may result from AgentWearablesRequest having been sent more than once. 6852 // that may result from AgentWearablesRequest having been sent more than once.
6853 // If we do this, then relogging won't work. - Gigs
6854 /*
6747 static bool first = true; 6855 static bool first = true;
6748 if (!first) return; 6856 if (!first) return;
6749 first = false; 6857 first = false;
6858 */
6750 6859
6751 LLUUID agent_id; 6860 LLUUID agent_id;
6752 gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 6861 gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
@@ -6804,10 +6913,17 @@ void LLAgent::processAgentInitialWearablesUpdate( LLMessageSystem* mesgsys, void
6804 } 6913 }
6805 6914
6806 // now that we have the asset ids...request the wearable assets 6915 // now that we have the asset ids...request the wearable assets
6916// [RLVa:KB] - Checked: 2009-08-08 (RLVa-1.0.1g) | Added: RLVa-1.0.1g
6917 LLInventoryFetchObserver::item_ref_t rlvItems;
6918// [/RLVa:KB]
6807 for( i = 0; i < WT_COUNT; i++ ) 6919 for( i = 0; i < WT_COUNT; i++ )
6808 { 6920 {
6809 if( !gAgent.mWearableEntry[i].mItemID.isNull() ) 6921 if( !gAgent.mWearableEntry[i].mItemID.isNull() )
6810 { 6922 {
6923// [RLVa:KB] - Checked: 2009-08-08 (RLVa-1.0.1g) | Added: RLVa-1.0.1g
6924 if (rlv_handler_t::isEnabled())
6925 rlvItems.push_back(gAgent.mWearableEntry[i].mItemID);
6926// [/RLVa:KB]
6811 gWearableList.getAsset( 6927 gWearableList.getAsset(
6812 asset_id_array[i], 6928 asset_id_array[i],
6813 LLStringUtil::null, 6929 LLStringUtil::null,
@@ -6815,6 +6931,15 @@ void LLAgent::processAgentInitialWearablesUpdate( LLMessageSystem* mesgsys, void
6815 LLAgent::onInitialWearableAssetArrived, (void*)(intptr_t)i ); 6931 LLAgent::onInitialWearableAssetArrived, (void*)(intptr_t)i );
6816 } 6932 }
6817 } 6933 }
6934
6935// [RLVa:KB] - Checked: 2009-08-08 (RLVa-1.0.1g) | Added: RLVa-1.0.1g
6936 // TODO-RLVa: checking that we're in STATE_STARTED is probably not needed, but leave it until we can be absolutely sure
6937 if ( (rlv_handler_t::isEnabled()) && (LLStartUp::getStartupState() == STATE_STARTED) )
6938 {
6939 RlvCurrentlyWorn f;
6940 f.fetchItems(rlvItems);
6941 }
6942// [/RLVa:KB]
6818 } 6943 }
6819} 6944}
6820 6945
@@ -7314,6 +7439,13 @@ void LLAgent::removeWearable( EWearableType type )
7314 return; 7439 return;
7315 } 7440 }
7316 7441
7442// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-07 (RLVa-1.0.0d)
7443 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isRemovable(type)) )
7444 {
7445 return;
7446 }
7447// [/RLVa:KB]
7448
7317 if( old_wearable ) 7449 if( old_wearable )
7318 { 7450 {
7319 if( old_wearable->isDirty() ) 7451 if( old_wearable->isDirty() )
@@ -7440,15 +7572,17 @@ void LLAgent::setWearableOutfit(
7440 wearables_to_remove[WT_SKIN] = FALSE; 7572 wearables_to_remove[WT_SKIN] = FALSE;
7441 wearables_to_remove[WT_HAIR] = FALSE; 7573 wearables_to_remove[WT_HAIR] = FALSE;
7442 wearables_to_remove[WT_EYES] = FALSE; 7574 wearables_to_remove[WT_EYES] = FALSE;
7443 wearables_to_remove[WT_SHIRT] = remove; 7575// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Added: RLVa-0.2.2a
7444 wearables_to_remove[WT_PANTS] = remove; 7576 wearables_to_remove[WT_SHIRT] = remove && gRlvHandler.isRemovable(WT_SHIRT);
7445 wearables_to_remove[WT_SHOES] = remove; 7577 wearables_to_remove[WT_PANTS] = remove && gRlvHandler.isRemovable(WT_PANTS);
7446 wearables_to_remove[WT_SOCKS] = remove; 7578 wearables_to_remove[WT_SHOES] = remove && gRlvHandler.isRemovable(WT_SHOES);
7447 wearables_to_remove[WT_JACKET] = remove; 7579 wearables_to_remove[WT_SOCKS] = remove && gRlvHandler.isRemovable(WT_SOCKS);
7448 wearables_to_remove[WT_GLOVES] = remove; 7580 wearables_to_remove[WT_JACKET] = remove && gRlvHandler.isRemovable(WT_JACKET);
7449 wearables_to_remove[WT_UNDERSHIRT] = (!gAgent.isTeen()) & remove; 7581 wearables_to_remove[WT_GLOVES] = remove && gRlvHandler.isRemovable(WT_GLOVES);
7450 wearables_to_remove[WT_UNDERPANTS] = (!gAgent.isTeen()) & remove; 7582 wearables_to_remove[WT_UNDERSHIRT] = (!gAgent.isTeen()) && remove && gRlvHandler.isRemovable(WT_UNDERSHIRT);
7451 wearables_to_remove[WT_SKIRT] = remove; 7583 wearables_to_remove[WT_UNDERPANTS] = (!gAgent.isTeen()) && remove && gRlvHandler.isRemovable(WT_UNDERPANTS);
7584 wearables_to_remove[WT_SKIRT] = remove && gRlvHandler.isRemovable(WT_SKIRT);
7585// [/RLVa:KB]
7452 7586
7453 S32 count = wearables.count(); 7587 S32 count = wearables.count();
7454 llassert( items.count() == count ); 7588 llassert( items.count() == count );
@@ -7538,6 +7672,15 @@ void LLAgent::setWearable( LLInventoryItem* new_item, LLWearable* new_wearable )
7538 EWearableType type = new_wearable->getType(); 7672 EWearableType type = new_wearable->getType();
7539 7673
7540 LLWearable* old_wearable = mWearableEntry[ type ].mWearable; 7674 LLWearable* old_wearable = mWearableEntry[ type ].mWearable;
7675
7676// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
7677 // Block if: we can't wear on that layer; or we're already wearing something there we can't take off
7678 if ( (rlv_handler_t::isEnabled()) && ((!gRlvHandler.isWearable(type)) || ((old_wearable) && (!gRlvHandler.isRemovable(type)))) )
7679 {
7680 return;
7681 }
7682// [/RLVa:KB]
7683
7541 if( old_wearable ) 7684 if( old_wearable )
7542 { 7685 {
7543 const LLUUID& old_item_id = mWearableEntry[ type ].mItemID; 7686 const LLUUID& old_item_id = mWearableEntry[ type ].mItemID;
@@ -7750,10 +7893,13 @@ void LLAgent::userRemoveAllAttachments( void* userdata )
7750 return; 7893 return;
7751 } 7894 }
7752 7895
7753 gMessageSystem->newMessage("ObjectDetach"); 7896// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Added: RLVa-0.2.0c
7754 gMessageSystem->nextBlockFast(_PREHASH_AgentData); 7897 // NOTE-RLVa: This function is called from inside RlvHandler as well, hence the rather heavy modifications
7755 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); 7898 std::list<U32> rlvAttachments;
7756 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); 7899 // TODO-RLVa: Once we have the improved "removeWearable" logic implemented we can just get rid of the whole "rlvCompFolders" hassle
7900 #ifdef RLV_EXPERIMENTAL_COMPOSITES
7901 std::list<LLUUID> rlvCompFolders;
7902 #endif // RLV_EXPERIMENTAL_COMPOSITES
7757 7903
7758 for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); 7904 for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
7759 iter != avatarp->mAttachmentPoints.end(); ) 7905 iter != avatarp->mAttachmentPoints.end(); )
@@ -7763,11 +7909,78 @@ void LLAgent::userRemoveAllAttachments( void* userdata )
7763 LLViewerObject* objectp = attachment->getObject(); 7909 LLViewerObject* objectp = attachment->getObject();
7764 if (objectp) 7910 if (objectp)
7765 { 7911 {
7912 if (rlv_handler_t::isEnabled())
7913 {
7914 if (!gRlvHandler.isDetachable(curiter->first))
7915 continue;
7916
7917 // Check if we're being called in response to an RLV command (that would be @detach=force)
7918 if ( (gRlvHandler.getCurrentCommand()) && (attachment->getItemID().notNull()) )
7919 {
7920 if (!gRlvHandler.isStrippable(attachment->getItemID())) // "nostrip" can be taken off by the user but not @detach
7921 continue;
7922
7923 #ifdef RLV_EXPERIMENTAL_COMPOSITES
7924 LLViewerInventoryCategory* pFolder;
7925 if (gRlvHandler.getCompositeInfo(attachment->getItemID(), NULL, &pFolder))
7926 {
7927 #ifdef RLV_EXPERIMENTAL_COMPOSITE_LOCKING
7928 if (!gRlvHandler.canTakeOffComposite(pFolder))
7929 continue;
7930 #endif // RLV_EXPERIMENTAL_COMPOSITE_LOCKING
7931
7932 // The attachment belongs to a composite folder so there may be additional things we need to take off
7933 if (std::find(rlvCompFolders.begin(), rlvCompFolders.end(), pFolder->getUUID()) != rlvCompFolders.end())
7934 rlvCompFolders.push_back(pFolder->getUUID());
7935 }
7936 #endif // RLV_EXPERIMENTAL_COMPOSITES
7937 }
7938 }
7939 rlvAttachments.push_back(objectp->getLocalID());
7940 }
7941 }
7942
7943 // Only send the message if we actually have something to detach
7944 if (rlvAttachments.size() > 0)
7945 {
7946 gMessageSystem->newMessage("ObjectDetach");
7947 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
7948 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
7949 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
7950
7951 for (std::list<U32>::const_iterator itAttach = rlvAttachments.begin(); itAttach != rlvAttachments.end(); ++itAttach)
7952 {
7766 gMessageSystem->nextBlockFast(_PREHASH_ObjectData); 7953 gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
7767 gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, objectp->getLocalID()); 7954 gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, *itAttach);
7768 } 7955 }
7956
7957 gMessageSystem->sendReliable( gAgent.getRegionHost() );
7769 } 7958 }
7770 gMessageSystem->sendReliable( gAgent.getRegionHost() ); 7959
7960 #ifdef RLV_EXPERIMENTAL_COMPOSITES
7961 if (rlv_handler_t::isEnabled)
7962 {
7963 // If we encountered any composite folders then we need to @detach all of them
7964 for (std::list<LLUUID>::const_iterator itFolder = rlvCompFolders.begin(); itFolder != rlvCompFolders.end(); ++itFolder)
7965 {
7966 std::string strFolder = gRlvHandler.getSharedPath(*itFolder);
7967
7968 // It shouldn't happen but make absolutely sure that we don't issue @detach:=force and reenter this function
7969 if (!strFolder.empty())
7970 {
7971 std::string strCmd = "detach:" + strFolder + "=force";
7972 #ifdef RLV_DEBUG
7973 RLV_INFOS << "\t- detaching composite folder: @" << strCmd << LL_ENDL;
7974 #endif // RLV_DEBUG
7975
7976 // HACK-RLV: executing a command while another command is currently executing isn't the best thing to do, however
7977 // in this specific case it is safe (and still better than making processForceCommand public)
7978 gRlvHandler.processCommand(gRlvHandler.getCurrentObject(), strCmd);
7979 }
7980 }
7981 }
7982 #endif // RLV_EXPERIMENTAL_COMPOSITES
7983// [/RLVa:KB]
7771} 7984}
7772 7985
7773void LLAgent::observeFriends() 7986void LLAgent::observeFriends()
diff --git a/linden/indra/newview/llagent.h b/linden/indra/newview/llagent.h
index 5e771e4..a6f1d74 100644
--- a/linden/indra/newview/llagent.h
+++ b/linden/indra/newview/llagent.h
@@ -69,6 +69,10 @@
69#include "llfollowcam.h" 69#include "llfollowcam.h"
70// end Ventrella 70// end Ventrella
71 71
72// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
73#include "rlvhandler.h"
74// [/RLVa:KB]
75
72const U8 AGENT_STATE_TYPING = 0x04; // Typing indication 76const U8 AGENT_STATE_TYPING = 0x04; // Typing indication
73const U8 AGENT_STATE_EDITING = 0x10; // Set when agent has objects selected 77const U8 AGENT_STATE_EDITING = 0x10; // Set when agent has objects selected
74 78
@@ -396,6 +400,11 @@ public:
396 // Does this parcel allow you to fly? 400 // Does this parcel allow you to fly?
397 BOOL canFly(); 401 BOOL canFly();
398 402
403 //lgg crap
404 static BOOL getPhantom();// const { return emeraldPhantom; }
405 static void setPhantom(BOOL phantom);
406 static void togglePhantom();
407
399 // Animation functions 408 // Animation functions
400 void stopCurrentAnimations(); 409 void stopCurrentAnimations();
401 void requestStopMotion( LLMotion* motion ); 410 void requestStopMotion( LLMotion* motion );
@@ -824,6 +833,8 @@ private:
824 LLVector3d mCameraSmoothingLastPositionGlobal; 833 LLVector3d mCameraSmoothingLastPositionGlobal;
825 LLVector3d mCameraSmoothingLastPositionAgent; 834 LLVector3d mCameraSmoothingLastPositionAgent;
826 BOOL mCameraSmoothingStop; 835 BOOL mCameraSmoothingStop;
836
837 static BOOL sPhantom;
827 838
828 LLVector3 mCameraUpVector; // camera's up direction in world coordinates (determines the 'roll' of the view) 839 LLVector3 mCameraUpVector; // camera's up direction in world coordinates (determines the 'roll' of the view)
829 840
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index 58c1c2b..74fb563 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -127,6 +127,7 @@
127#include "llvectorperfoptions.h" 127#include "llvectorperfoptions.h"
128#include "llurlsimstring.h" 128#include "llurlsimstring.h"
129#include "llwatchdog.h" 129#include "llwatchdog.h"
130#include "llcallingcard.h"
130 131
131// Included so that constants/settings might be initialized 132// Included so that constants/settings might be initialized
132// in save_settings_to_globals() 133// in save_settings_to_globals()
@@ -166,6 +167,10 @@
166 167
167#include "llcommandlineparser.h" 168#include "llcommandlineparser.h"
168 169
170#include "hippoGridManager.h"
171#include "hippoLimits.h"
172#include "hippoUpdate.h"
173
169// *FIX: These extern globals should be cleaned up. 174// *FIX: These extern globals should be cleaned up.
170// The globals either represent state/config/resource-storage of either 175// The globals either represent state/config/resource-storage of either
171// this app, or another 'component' of the viewer. App globals should be 176// this app, or another 'component' of the viewer. App globals should be
@@ -187,22 +192,35 @@
187 192
188//---------------------------------------------------------------------------- 193//----------------------------------------------------------------------------
189// viewer.cpp - these are only used in viewer, should be easily moved. 194// viewer.cpp - these are only used in viewer, should be easily moved.
195extern void disable_win_error_reporting();
190 196
191#if LL_DARWIN 197#if LL_DARWIN
198#include <Carbon/Carbon.h>
192extern void init_apple_menu(const char* product); 199extern void init_apple_menu(const char* product);
200extern OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
201extern OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
202extern OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata);
203#include <boost/tokenizer.hpp>
193#endif // LL_DARWIN 204#endif // LL_DARWIN
194 205
206
195extern BOOL gRandomizeFramerate; 207extern BOOL gRandomizeFramerate;
196extern BOOL gPeriodicSlowFrame; 208extern BOOL gPeriodicSlowFrame;
197extern BOOL gDebugGL; 209extern BOOL gDebugGL;
198 210
199//////////////////////////////////////////////////////////// 211////////////////////////////////////////////////////////////
200// All from the last globals push... 212// All from the last globals push...
213
214
201const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard 215const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard
202 216
203F32 gSimLastTime; // Used in LLAppViewer::init and send_stats() 217F32 gSimLastTime; // Used in LLAppViewer::init and send_stats()
204F32 gSimFrames; 218F32 gSimFrames;
205 219
220std::string gDisabledMessage; // Set in LLAppViewer::initConfiguration used in idle_startup
221
222BOOL gHideLinks = FALSE; // Set in LLAppViewer::initConfiguration, used externally
223
206BOOL gAllowIdleAFK = TRUE; 224BOOL gAllowIdleAFK = TRUE;
207BOOL gAllowTapTapHoldRun = TRUE; 225BOOL gAllowTapTapHoldRun = TRUE;
208BOOL gShowObjectUpdates = FALSE; 226BOOL gShowObjectUpdates = FALSE;
@@ -228,7 +246,7 @@ F32 gFPSClamped = 10.f; // Pretend we start at target rate.
228F32 gFrameDTClamped = 0.f; // Time between adjacent checks to network for packets 246F32 gFrameDTClamped = 0.f; // Time between adjacent checks to network for packets
229U64 gStartTime = 0; // gStartTime is "private", used only to calculate gFrameTimeSeconds 247U64 gStartTime = 0; // gStartTime is "private", used only to calculate gFrameTimeSeconds
230U32 gFrameStalls = 0; 248U32 gFrameStalls = 0;
231const F64 FRAME_STALL_THRESHOLD = 1.0; 249const F64 FRAME_STALL_THRESHOLD = 5.0;
232 250
233LLTimer gRenderStartTime; 251LLTimer gRenderStartTime;
234LLFrameTimer gForegroundTime; 252LLFrameTimer gForegroundTime;
@@ -297,7 +315,8 @@ std::string gLoginPage;
297std::vector<std::string> gLoginURIs; 315std::vector<std::string> gLoginURIs;
298static std::string gHelperURI; 316static std::string gHelperURI;
299 317
300LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ; 318//FIXME
319//LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
301 320
302void idle_afk_check() 321void idle_afk_check()
303{ 322{
@@ -448,7 +467,7 @@ static void settings_modify()
448 gSavedSettings.setBOOL("VectorizeSkin", FALSE); 467 gSavedSettings.setBOOL("VectorizeSkin", FALSE);
449#endif 468#endif
450} 469}
451 470/*
452void LLAppViewer::initGridChoice() 471void LLAppViewer::initGridChoice()
453{ 472{
454 // Load up the initial grid choice from: 473 // Load up the initial grid choice from:
@@ -465,7 +484,7 @@ void LLAppViewer::initGridChoice()
465 if(grid_choice.empty()) 484 if(grid_choice.empty())
466 { 485 {
467 S32 server = gSavedSettings.getS32("ServerChoice"); 486 S32 server = gSavedSettings.getS32("ServerChoice");
468 server = llclamp(server, 0, (S32)GRID_INFO_COUNT - 1); 487 //server = llclamp(server, 0, (S32)GRID_INFO_COUNT - 1);
469 if(server == GRID_INFO_OTHER) 488 if(server == GRID_INFO_OTHER)
470 { 489 {
471 std::string custom_server = gSavedSettings.getString("CustomServer"); 490 std::string custom_server = gSavedSettings.getString("CustomServer");
@@ -473,11 +492,12 @@ void LLAppViewer::initGridChoice()
473 } 492 }
474 else if(server != (S32)GRID_INFO_NONE) 493 else if(server != (S32)GRID_INFO_NONE)
475 { 494 {
476 LLViewerLogin::getInstance()->setGridChoice((EGridInfo)server); 495 llwarns << "setgridchoice = " << server << llendl;
496 LLViewerLogin::getInstance()->setGridChoice(server);
477 } 497 }
478 } 498 }
479} 499}
480 500*/
481//virtual 501//virtual
482bool LLAppViewer::initSLURLHandler() 502bool LLAppViewer::initSLURLHandler()
483{ 503{
@@ -516,6 +536,7 @@ LLAppViewer::LLAppViewer() :
516 mSecondInstance(false), 536 mSecondInstance(false),
517 mSavedFinalSnapshot(false), 537 mSavedFinalSnapshot(false),
518 mQuitRequested(false), 538 mQuitRequested(false),
539 mLogoutRequested(false),
519 mLogoutRequestSent(false), 540 mLogoutRequestSent(false),
520 mYieldTime(-1), 541 mYieldTime(-1),
521 mMainloopTimeout(NULL), 542 mMainloopTimeout(NULL),
@@ -639,7 +660,6 @@ bool LLAppViewer::init()
639 ui_audio_callback, 660 ui_audio_callback,
640 &LLUI::sGLScaleFactor); 661 &LLUI::sGLScaleFactor);
641 LLWeb::initClass(); // do this after LLUI 662 LLWeb::initClass(); // do this after LLUI
642
643 LLTextEditor::setURLCallbacks(&LLWeb::loadURL, 663 LLTextEditor::setURLCallbacks(&LLWeb::loadURL,
644 &LLURLDispatcher::dispatchFromTextEditor, 664 &LLURLDispatcher::dispatchFromTextEditor,
645 &LLURLDispatcher::dispatchFromTextEditor); 665 &LLURLDispatcher::dispatchFromTextEditor);
@@ -660,6 +680,7 @@ bool LLAppViewer::init()
660 // load MIME type -> media impl mappings 680 // load MIME type -> media impl mappings
661 LLMIMETypes::parseMIMETypes( std::string("mime_types.xml") ); 681 LLMIMETypes::parseMIMETypes( std::string("mime_types.xml") );
662 682
683
663 // Copy settings to globals. *TODO: Remove or move to appropriage class initializers 684 // Copy settings to globals. *TODO: Remove or move to appropriage class initializers
664 settings_to_globals(); 685 settings_to_globals();
665 // Setup settings listeners 686 // Setup settings listeners
@@ -1112,12 +1133,21 @@ bool LLAppViewer::cleanup()
1112 // to ensure shutdown order 1133 // to ensure shutdown order
1113 LLMortician::setZealous(TRUE); 1134 LLMortician::setZealous(TRUE);
1114 1135
1136 if (mQuitRequested)
1115 LLVoiceClient::terminate(); 1137 LLVoiceClient::terminate();
1116 1138
1117 disconnectViewer(); 1139 disconnectViewer();
1118 1140
1119 llinfos << "Viewer disconnected" << llendflush; 1141 llinfos << "Viewer disconnected" << llendflush;
1120 1142
1143
1144
1145
1146
1147 //this deletes all your buddies
1148 LLAvatarTracker::instance().reset();
1149
1150 if (mQuitRequested)
1121 display_cleanup(); 1151 display_cleanup();
1122 1152
1123 release_start_screen(); // just in case 1153 release_start_screen(); // just in case
@@ -1135,6 +1165,13 @@ bool LLAppViewer::cleanup()
1135 1165
1136 LLKeyframeDataCache::clear(); 1166 LLKeyframeDataCache::clear();
1137 1167
1168 //clear all the chat off the screen
1169 gConsole->clear();
1170
1171 if (!mQuitRequested) //if we are doing a soft cleanup, bail here
1172 {
1173 return true;
1174 }
1138 // End TransferManager before deleting systems it depends on (Audio, VFS, AssetStorage) 1175 // End TransferManager before deleting systems it depends on (Audio, VFS, AssetStorage)
1139#if 0 // this seems to get us stuck in an infinite loop... 1176#if 0 // this seems to get us stuck in an infinite loop...
1140 gTransferManager.cleanup(); 1177 gTransferManager.cleanup();
@@ -1238,6 +1275,9 @@ bool LLAppViewer::cleanup()
1238 // viewer UI relies on keyboard so keep it aound until viewer UI isa gone 1275 // viewer UI relies on keyboard so keep it aound until viewer UI isa gone
1239 delete gKeyboard; 1276 delete gKeyboard;
1240 gKeyboard = NULL; 1277 gKeyboard = NULL;
1278 // Clean up selection managers after UI is destroyed, as UI
1279 // may be observing them.
1280 LLSelectMgr::cleanupGlobals();
1241 1281
1242 LLViewerObject::cleanupVOClasses(); 1282 LLViewerObject::cleanupVOClasses();
1243 1283
@@ -1247,6 +1287,7 @@ bool LLAppViewer::cleanup()
1247 1287
1248 LLTracker::cleanupInstance(); 1288 LLTracker::cleanupInstance();
1249 1289
1290
1250 // *FIX: This is handled in LLAppViewerWin32::cleanup(). 1291 // *FIX: This is handled in LLAppViewerWin32::cleanup().
1251 // I'm keeping the comment to remember its order in cleanup, 1292 // I'm keeping the comment to remember its order in cleanup,
1252 // in case of unforseen dependency. 1293 // in case of unforseen dependency.
@@ -1322,6 +1363,7 @@ bool LLAppViewer::cleanup()
1322 // save mute list. gMuteList used to also be deleted here too. 1363 // save mute list. gMuteList used to also be deleted here too.
1323 LLMuteList::getInstance()->cache(gAgent.getID()); 1364 LLMuteList::getInstance()->cache(gAgent.getID());
1324 1365
1366
1325 if (mPurgeOnExit) 1367 if (mPurgeOnExit)
1326 { 1368 {
1327 llinfos << "Purging all cache files on exit" << llendflush; 1369 llinfos << "Purging all cache files on exit" << llendflush;
@@ -1831,7 +1873,14 @@ bool LLAppViewer::initConfiguration()
1831 } 1873 }
1832 } 1874 }
1833 1875
1834 initGridChoice(); 1876 //init Hippo grid manager
1877 if (!gHippoGridManager) {
1878 gHippoGridManager = new HippoGridManager();
1879 gHippoGridManager->init();
1880 }
1881
1882
1883 //initGridChoice();
1835 1884
1836 // If we have specified crash on startup, set the global so we'll trigger the crash at the right time 1885 // If we have specified crash on startup, set the global so we'll trigger the crash at the right time
1837 if(clp.hasOption("crashonstartup")) 1886 if(clp.hasOption("crashonstartup"))
@@ -1848,7 +1897,6 @@ bool LLAppViewer::initConfiguration()
1848 // achieve this. For now... 1897 // achieve this. For now...
1849 1898
1850 // *NOTE:Mani The command line parser parses tokens and is 1899 // *NOTE:Mani The command line parser parses tokens and is
1851 // setup to bail after parsing the '--url' option or the
1852 // first option specified without a '--option' flag (or 1900 // first option specified without a '--option' flag (or
1853 // any other option that uses the 'last_option' setting - 1901 // any other option that uses the 'last_option' setting -
1854 // see LLControlGroupCLP::configure()) 1902 // see LLControlGroupCLP::configure())
@@ -1906,6 +1954,22 @@ bool LLAppViewer::initConfiguration()
1906 // llerrs << "Failed to parse skin definition." << llendl; 1954 // llerrs << "Failed to parse skin definition." << llendl;
1907 // } 1955 // }
1908 1956
1957 // LLXmlTreeNode* rootp = skin_def_tree.getRoot();
1958 // LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message");
1959 // if (disabled_message_node)
1960 // {
1961 // gDisabledMessage = disabled_message_node->getContents();
1962 // }
1963
1964 // static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links");
1965 // rootp->getFastAttributeBOOL(hide_links_string, gHideLinks);
1966
1967 // // Legacy string. This flag really meant we didn't want to expose references to "Second Life".
1968 // // Just set gHideLinks instead.
1969 // static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update");
1970 // BOOL silent_update;
1971 // rootp->getFastAttributeBOOL(silent_string, silent_update);
1972 // gHideLinks = (gHideLinks || silent_update);
1909 //} 1973 //}
1910 1974
1911#if LL_DARWIN 1975#if LL_DARWIN
@@ -2365,7 +2429,7 @@ void LLAppViewer::handleViewerCrash()
2365 gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName(); 2429 gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
2366 gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath(); 2430 gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath();
2367 gDebugInfo["SessionLength"] = F32(LLFrameTimer::getElapsedSeconds()); 2431 gDebugInfo["SessionLength"] = F32(LLFrameTimer::getElapsedSeconds());
2368 gDebugInfo["StartupState"] = LLStartUp::getStartupStateString(); 2432//FIXME gDebugInfo["StartupState"] = LLStartUp::getStartupStateString();
2369 gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer) getCurrentRSS() >> 10; 2433 gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer) getCurrentRSS() >> 10;
2370 gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin(); 2434 gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin();
2371 gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall"); 2435 gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall");
@@ -2594,29 +2658,56 @@ void LLAppViewer::removeMarkerFile(bool leave_logout_marker)
2594 } 2658 }
2595} 2659}
2596 2660
2661
2662//this gets called after we get a packet back from the
2663//server saying we are logged out, or if the packet times
2664//out
2597void LLAppViewer::forceQuit() 2665void LLAppViewer::forceQuit()
2598{ 2666{
2667
2668 LL_INFOS("forceQuit") << "Destroying the entire world" << LL_ENDL;
2669 if (mQuitRequested)
2599 LLApp::setQuitting(); 2670 LLApp::setQuitting();
2671 else
2672 {
2673 if (mLogoutRequested) //we just finished a logout request
2674 {
2675 //LLStartUp::setStartupState( STATE_LOGIN_SHOW );
2676 LLStartUp::resetLogin();
2677 cleanup();
2678 mLogoutRequested=false;
2679 mLogoutRequestSent=false;
2680 }
2681 }
2600} 2682}
2601 2683
2602void LLAppViewer::requestQuit() 2684void LLAppViewer::requestLogout(bool quit_after)
2603{ 2685{
2604 llinfos << "requestQuit" << llendl; 2686
2687 mLogoutRequested=true;
2688 if(quit_after)
2689 mQuitRequested=true;
2690 else
2691 mQuitRequested=false;
2692
2693 llinfos << "requestLogout" << llendl;
2605 2694
2606 LLViewerRegion* region = gAgent.getRegion(); 2695 LLViewerRegion* region = gAgent.getRegion();
2607 2696
2608 if( (LLStartUp::getStartupState() < STATE_STARTED) || !region ) 2697 if( (LLStartUp::getStartupState() >= STATE_STARTED) && region )
2609 { 2698 {
2610 // Quit immediately
2611 forceQuit();
2612 return;
2613 }
2614
2615 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); 2699 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
2616 effectp->setPositionGlobal(gAgent.getPositionGlobal()); 2700 effectp->setPositionGlobal(gAgent.getPositionGlobal());
2617 effectp->setColor(LLColor4U(gAgent.getEffectColor())); 2701 effectp->setColor(LLColor4U(gAgent.getEffectColor()));
2618 LLHUDManager::getInstance()->sendEffects(); 2702 LLHUDManager::getInstance()->sendEffects();
2619 effectp->markDead() ;//remove it. 2703 effectp->markDead() ;//remove it.
2704 send_stats();
2705 }
2706 else
2707 {
2708 mQuitRequested=true;
2709 LLAppViewer::instance()->forceQuit();
2710 }
2620 2711
2621 // Attempt to close all floaters that might be 2712 // Attempt to close all floaters that might be
2622 // editing things. 2713 // editing things.
@@ -2626,10 +2717,7 @@ void LLAppViewer::requestQuit()
2626 gFloaterView->closeAllChildren(true); 2717 gFloaterView->closeAllChildren(true);
2627 } 2718 }
2628 2719
2629 send_stats();
2630
2631 gLogoutTimer.reset(); 2720 gLogoutTimer.reset();
2632 mQuitRequested = true;
2633} 2721}
2634 2722
2635static bool finish_quit(const LLSD& notification, const LLSD& response) 2723static bool finish_quit(const LLSD& notification, const LLSD& response)
@@ -2638,7 +2726,7 @@ static bool finish_quit(const LLSD& notification, const LLSD& response)
2638 2726
2639 if (option == 0) 2727 if (option == 0)
2640 { 2728 {
2641 LLAppViewer::instance()->requestQuit(); 2729 LLAppViewer::instance()->requestLogout(true);
2642 } 2730 }
2643 return false; 2731 return false;
2644} 2732}
@@ -2649,6 +2737,12 @@ void LLAppViewer::userQuit()
2649 LLNotifications::instance().add("ConfirmQuit"); 2737 LLNotifications::instance().add("ConfirmQuit");
2650} 2738}
2651 2739
2740//static
2741void LLAppViewer::userLogout(void *userdata)
2742{
2743 LLAppViewer::instance()->requestLogout(false);
2744}
2745
2652static bool finish_early_exit(const LLSD& notification, const LLSD& response) 2746static bool finish_early_exit(const LLSD& notification, const LLSD& response)
2653{ 2747{
2654 LLAppViewer::instance()->forceQuit(); 2748 LLAppViewer::instance()->forceQuit();
@@ -2674,6 +2768,7 @@ void LLAppViewer::abortQuit()
2674{ 2768{
2675 llinfos << "abortQuit()" << llendl; 2769 llinfos << "abortQuit()" << llendl;
2676 mQuitRequested = false; 2770 mQuitRequested = false;
2771 mLogoutRequested = false;
2677} 2772}
2678 2773
2679void LLAppViewer::migrateCacheDirectory() 2774void LLAppViewer::migrateCacheDirectory()
@@ -2994,7 +3089,7 @@ bool finish_forced_disconnect(const LLSD& notification, const LLSD& response)
2994 3089
2995void LLAppViewer::forceDisconnect(const std::string& mesg) 3090void LLAppViewer::forceDisconnect(const std::string& mesg)
2996{ 3091{
2997 if (gDoDisconnect) 3092 if (gDoDisconnect||mQuitRequested||mLogoutRequested)
2998 { 3093 {
2999 // Already popped up one of these dialogs, don't 3094 // Already popped up one of these dialogs, don't
3000 // do this again. 3095 // do this again.
@@ -3225,7 +3320,12 @@ void LLAppViewer::idle()
3225 { 3320 {
3226 // Send avatar and camera info 3321 // Send avatar and camera info
3227 last_control_flags = gAgent.getControlFlags(); 3322 last_control_flags = gAgent.getControlFlags();
3228 send_agent_update(TRUE); 3323
3324 if(!gAgent.getPhantom())
3325 {
3326 send_agent_update(TRUE);
3327 }
3328
3229 agent_update_timer.reset(); 3329 agent_update_timer.reset();
3230 } 3330 }
3231 } 3331 }
@@ -3298,9 +3398,12 @@ void LLAppViewer::idle()
3298 // Check for away from keyboard, kick idle agents. 3398 // Check for away from keyboard, kick idle agents.
3299 idle_afk_check(); 3399 idle_afk_check();
3300 3400
3401 if (!gDisconnected) //check again
3402 {
3301 // Update statistics for this frame 3403 // Update statistics for this frame
3302 update_statistics(gFrameCount); 3404 update_statistics(gFrameCount);
3303 } 3405 }
3406 }
3304 3407
3305 //////////////////////////////////////// 3408 ////////////////////////////////////////
3306 // 3409 //
@@ -3501,7 +3604,7 @@ void LLAppViewer::idle()
3501 // Handle shutdown process, for example, 3604 // Handle shutdown process, for example,
3502 // wait for floaters to close, send quit message, 3605 // wait for floaters to close, send quit message,
3503 // forcibly quit if it has taken too long 3606 // forcibly quit if it has taken too long
3504 if (mQuitRequested) 3607 if (mQuitRequested || mLogoutRequested)
3505 { 3608 {
3506 idleShutdown(); 3609 idleShutdown();
3507 } 3610 }
@@ -3604,12 +3707,12 @@ void LLAppViewer::sendLogoutRequest()
3604 if (mLogoutMarkerFile) 3707 if (mLogoutMarkerFile)
3605 { 3708 {
3606 llinfos << "Created logout marker file " << mLogoutMarkerFileName << llendl; 3709 llinfos << "Created logout marker file " << mLogoutMarkerFileName << llendl;
3607 apr_file_close(mLogoutMarkerFile);
3608 } 3710 }
3609 else 3711 else
3610 { 3712 {
3611 llwarns << "Cannot create logout marker file " << mLogoutMarkerFileName << llendl; 3713 llwarns << "Cannot create logout marker file " << mLogoutMarkerFileName << llendl;
3612 } 3714 }
3715 apr_file_close(mLogoutMarkerFile);
3613 } 3716 }
3614} 3717}
3615 3718
@@ -3626,6 +3729,9 @@ static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
3626 3729
3627void LLAppViewer::idleNetwork() 3730void LLAppViewer::idleNetwork()
3628{ 3731{
3732 if (gDisconnected)
3733 return;
3734
3629 pingMainloopTimeout("idleNetwork"); 3735 pingMainloopTimeout("idleNetwork");
3630 LLError::LLCallStacks::clear() ; 3736 LLError::LLCallStacks::clear() ;
3631 llpushcallstacks ; 3737 llpushcallstacks ;
@@ -3714,7 +3820,11 @@ void LLAppViewer::idleNetwork()
3714 llpushcallstacks ; 3820 llpushcallstacks ;
3715 gObjectList.mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects); 3821 gObjectList.mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects);
3716 3822
3823 if (gDisconnected)
3824 return;
3825
3717 // Retransmit unacknowledged packets. 3826 // Retransmit unacknowledged packets.
3827 if (gXferManager)
3718 gXferManager->retransmitUnackedPackets(); 3828 gXferManager->retransmitUnackedPackets();
3719 gAssetStorage->checkForTimeouts(); 3829 gAssetStorage->checkForTimeouts();
3720 llpushcallstacks ; 3830 llpushcallstacks ;
@@ -3724,7 +3834,7 @@ void LLAppViewer::idleNetwork()
3724 // Check that the circuit between the viewer and the agent's current 3834 // Check that the circuit between the viewer and the agent's current
3725 // region is still alive 3835 // region is still alive
3726 LLViewerRegion *agent_region = gAgent.getRegion(); 3836 LLViewerRegion *agent_region = gAgent.getRegion();
3727 if (agent_region) 3837 if ((agent_region)&&(LLStartUp::getStartupState() == STATE_STARTED))
3728 { 3838 {
3729 LLUUID this_region_id = agent_region->getRegionID(); 3839 LLUUID this_region_id = agent_region->getRegionID();
3730 bool this_region_alive = agent_region->isAlive(); 3840 bool this_region_alive = agent_region->isAlive();
@@ -3745,6 +3855,9 @@ void LLAppViewer::disconnectViewer()
3745 { 3855 {
3746 return; 3856 return;
3747 } 3857 }
3858
3859 //set this true now, to prevent things from trying to access the network we are destroying
3860 gDisconnected = TRUE;
3748 // 3861 //
3749 // Cleanup after quitting. 3862 // Cleanup after quitting.
3750 // 3863 //
@@ -3828,6 +3941,8 @@ void LLAppViewer::disconnectViewer()
3828 3941
3829 cleanup_xfer_manager(); 3942 cleanup_xfer_manager();
3830 gDisconnected = TRUE; 3943 gDisconnected = TRUE;
3944 if (mQuitRequested)
3945 cleanup_xfer_manager();
3831} 3946}
3832 3947
3833void LLAppViewer::forceErrorLLError() 3948void LLAppViewer::forceErrorLLError()
@@ -3940,31 +4055,31 @@ void LLAppViewer::handleLoginComplete()
3940 gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR; 4055 gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;
3941 gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH; 4056 gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH;
3942 gDebugInfo["ClientInfo"]["BuildVersion"] = LL_VERSION_BUILD; 4057 gDebugInfo["ClientInfo"]["BuildVersion"] = LL_VERSION_BUILD;
3943
3944 LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
3945 if ( parcel && parcel->getMusicURL()[0])
3946 {
3947 gDebugInfo["ParcelMusicURL"] = parcel->getMusicURL();
3948 }
3949 if ( parcel && parcel->getMediaURL()[0])
3950 {
3951 gDebugInfo["ParcelMediaURL"] = parcel->getMediaURL();
3952 }
3953
3954 gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile"); 4058 gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile");
3955 gDebugInfo["CAFilename"] = gDirUtilp->getCAFile(); 4059 gDebugInfo["CAFilename"] = gDirUtilp->getCAFile();
3956 gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName(); 4060 gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
3957 gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath(); 4061 gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath();
3958 4062
3959 if(gAgent.getRegion())
3960 {
3961 gDebugInfo["CurrentSimHost"] = gAgent.getRegionHost().getHostName();
3962 gDebugInfo["CurrentRegion"] = gAgent.getRegion()->getName();
3963 }
3964
3965 if(LLAppViewer::instance()->mMainloopTimeout) 4063 if(LLAppViewer::instance()->mMainloopTimeout)
3966 { 4064 {
3967 gDebugInfo["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState(); 4065 gDebugInfo["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState();
3968 } 4066 }
3969 writeDebugInfo(); 4067 writeDebugInfo();
4068
4069// [RLVa:KB] - Alternate: Snowglobe-1.0 | Checked: 2009-08-05 (RLVa-1.0.1e) | Modified: RLVa-1.0.1e
4070 // TODO-RLVa: find some way to initialize the lookup table when we need them *and* support toggling RLVa at runtime
4071 gRlvHandler.initLookupTables();
4072
4073 if (rlv_handler_t::isEnabled())
4074 {
4075 RlvCurrentlyWorn::fetchWorn();
4076 rlv_handler_t::fetchSharedInventory();
4077
4078 #ifdef RLV_EXTENSION_STARTLOCATION
4079 RlvSettings::updateLoginLastLocation();
4080 #endif // RLV_EXTENSION_STARTLOCATION
4081
4082 gRlvHandler.processRetainedCommands();
4083 }
4084// [/RLVa:KB]
3970} 4085}
diff --git a/linden/indra/newview/llappviewer.h b/linden/indra/newview/llappviewer.h
index 797f5dd..ada5557 100644
--- a/linden/indra/newview/llappviewer.h
+++ b/linden/indra/newview/llappviewer.h
@@ -62,14 +62,16 @@ public:
62 62
63 // Application control 63 // Application control
64 void forceQuit(); // Puts the viewer into 'shutting down without error' mode. 64 void forceQuit(); // Puts the viewer into 'shutting down without error' mode.
65 void requestQuit(); // Request a quit. A kinder, gentler quit. 65 void requestLogout(bool quit_after); // Request a logout, optionally quitting after
66 void userQuit(); // The users asks to quit. Confirm, then requestQuit() 66 void userQuit(); // The users asks to quit. Confirm, then requestQuit()
67 void earlyExit(const std::string& name, 67 void earlyExit(const std::string& name,
68 const LLSD& substitutions = LLSD()); // Display an error dialog and forcibly quit. 68 const LLSD& substitutions = LLSD()); // Display an error dialog and forcibly quit.
69 static void userLogout(void *userdata); //graceful logout without quit
69 void forceExit(S32 arg); // exit() immediately (after some cleanup). 70 void forceExit(S32 arg); // exit() immediately (after some cleanup).
70 void abortQuit(); // Called to abort a quit request. 71 void abortQuit(); // Called to abort a quit request.
71 72
72 bool quitRequested() { return mQuitRequested; } 73 bool quitRequested() { return mQuitRequested; }
74 bool logoutRequested() { return mLogoutRequested; }
73 bool logoutRequestSent() { return mLogoutRequestSent; } 75 bool logoutRequestSent() { return mLogoutRequestSent; }
74 76
75 void writeDebugInfo(); 77 void writeDebugInfo();
@@ -164,11 +166,12 @@ protected:
164 166
165 virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this. 167 virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this.
166 168
169
167private: 170private:
168 171
169 bool initThreads(); // Initialize viewer threads, return false on failure. 172 bool initThreads(); // Initialize viewer threads, return false on failure.
170 bool initConfiguration(); // Initialize settings from the command line/config file. 173 bool initConfiguration(); // Initialize settings from the command line/config file.
171 void initGridChoice(); 174 //void initGridChoice();
172 175
173 bool initCache(); // Initialize local client cache. 176 bool initCache(); // Initialize local client cache.
174 void purgeCache(); // Clear the local cache. 177 void purgeCache(); // Clear the local cache.
@@ -222,6 +225,7 @@ private:
222 bool mSavedFinalSnapshot; 225 bool mSavedFinalSnapshot;
223 226
224 bool mQuitRequested; // User wants to quit, may have modified documents open. 227 bool mQuitRequested; // User wants to quit, may have modified documents open.
228 bool mLogoutRequested; // User wants to log out, but not quit
225 bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim. 229 bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
226 S32 mYieldTime; 230 S32 mYieldTime;
227 LLSD mSettingsLocationList; 231 LLSD mSettingsLocationList;
@@ -232,14 +236,14 @@ private:
232 bool mAgentRegionLastAlive; 236 bool mAgentRegionLastAlive;
233 LLUUID mAgentRegionLastID; 237 LLUUID mAgentRegionLastID;
234 238
235public: 239//public:
236 //some information for updater 240// //some information for updater
237 typedef struct 241// typedef struct
238 { 242// {
239 std::string mUpdateExePath; 243// std::string mUpdateExePath;
240 std::ostringstream mParams; 244// std::ostringstream mParams;
241 }LLUpdaterInfo ; 245// }LLUpdaterInfo ;
242 static LLUpdaterInfo *sUpdaterInfo ; 246// static LLUpdaterInfo *sUpdaterInfo ;
243}; 247};
244 248
245// consts from viewer.h 249// consts from viewer.h
@@ -250,6 +254,9 @@ const S32 AGENT_UPDATES_PER_SECOND = 10;
250// 254//
251// "// llstartup" indicates that llstartup is the only client for this global. 255// "// llstartup" indicates that llstartup is the only client for this global.
252 256
257
258extern std::string gDisabledMessage; // llstartup
259extern BOOL gHideLinks; // used by llpanellogin, lllfloaterbuycurrency, llstartup
253extern LLSD gDebugInfo; 260extern LLSD gDebugInfo;
254 261
255extern BOOL gAllowIdleAFK; 262extern BOOL gAllowIdleAFK;
diff --git a/linden/indra/newview/llappviewerlinux.h b/linden/indra/newview/llappviewerlinux.h
index 365fcfe..d757639 100644
--- a/linden/indra/newview/llappviewerlinux.h
+++ b/linden/indra/newview/llappviewerlinux.h
@@ -62,9 +62,10 @@ public:
62 62
63protected: 63protected:
64 virtual bool beingDebugged(); 64 virtual bool beingDebugged();
65 65
66 virtual bool restoreErrorTrap(); 66 virtual bool restoreErrorTrap();
67 virtual void handleCrashReporting(bool reportFreeze); 67 virtual void handleCrashReporting(bool reportFreeze);
68
68 virtual void handleSyncCrashTrace(); 69 virtual void handleSyncCrashTrace();
69 70
70 virtual bool initLogging(); 71 virtual bool initLogging();
diff --git a/linden/indra/newview/llappviewerwin32.cpp b/linden/indra/newview/llappviewerwin32.cpp
index 7a8d486..e1c9471 100644
--- a/linden/indra/newview/llappviewerwin32.cpp
+++ b/linden/indra/newview/llappviewerwin32.cpp
@@ -263,13 +263,13 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
263 viewer_app_ptr = NULL; 263 viewer_app_ptr = NULL;
264 264
265 //start updater 265 //start updater
266 if(LLAppViewer::sUpdaterInfo) 266 /*if(LLAppViewer::sUpdaterInfo)
267 { 267 {
268 _spawnl(_P_NOWAIT, LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mParams.str().c_str(), NULL); 268 _spawnl(_P_NOWAIT, LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mParams.str().c_str(), NULL);
269 269
270 delete LLAppViewer::sUpdaterInfo ; 270 delete LLAppViewer::sUpdaterInfo ;
271 LLAppViewer::sUpdaterInfo = NULL ; 271 LLAppViewer::sUpdaterInfo = NULL ;
272 } 272 }*/
273 273
274 return 0; 274 return 0;
275} 275}
diff --git a/linden/indra/newview/llassetuploadresponders.cpp b/linden/indra/newview/llassetuploadresponders.cpp
index 4fca9b1..dfd7403 100644
--- a/linden/indra/newview/llassetuploadresponders.cpp
+++ b/linden/indra/newview/llassetuploadresponders.cpp
@@ -524,7 +524,6 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)
524 { 524 {
525 case LLAssetType::AT_NOTECARD: 525 case LLAssetType::AT_NOTECARD:
526 { 526 {
527
528 // Update the UI with the new asset. 527 // Update the UI with the new asset.
529 LLPreviewNotecard* nc; 528 LLPreviewNotecard* nc;
530 nc = (LLPreviewNotecard*)LLPreview::find(item_id); 529 nc = (LLPreviewNotecard*)LLPreview::find(item_id);
@@ -543,6 +542,7 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)
543 LLAssetType::AT_NOTECARD); 542 LLAssetType::AT_NOTECARD);
544 } 543 }
545 544
545 nc->setAssetId(content["new_asset"].asUUID());
546 nc->refreshFromInventory(); 546 nc->refreshFromInventory();
547 } 547 }
548 } 548 }
diff --git a/linden/indra/newview/llcallingcard.cpp b/linden/indra/newview/llcallingcard.cpp
index db28c7a..d5211d7 100644
--- a/linden/indra/newview/llcallingcard.cpp
+++ b/linden/indra/newview/llcallingcard.cpp
@@ -137,8 +137,20 @@ LLAvatarTracker::~LLAvatarTracker()
137 deleteTrackingData(); 137 deleteTrackingData();
138 std::for_each(mObservers.begin(), mObservers.end(), DeletePointer()); 138 std::for_each(mObservers.begin(), mObservers.end(), DeletePointer());
139 std::for_each(mBuddyInfo.begin(), mBuddyInfo.end(), DeletePairedPointer()); 139 std::for_each(mBuddyInfo.begin(), mBuddyInfo.end(), DeletePairedPointer());
140 mObservers.erase(mObservers.begin(), mObservers.end());
141 mBuddyInfo.erase(mBuddyInfo.begin(), mBuddyInfo.end());
140} 142}
141 143
144
145void LLAvatarTracker::reset()
146{
147 std::for_each(mBuddyInfo.begin(), mBuddyInfo.end(), DeletePairedPointer());
148 mBuddyInfo.erase(mBuddyInfo.begin(), mBuddyInfo.end());
149 mModifyMask |= LLFriendObserver::REMOVE;
150 notifyObservers();
151}
152
153
142void LLAvatarTracker::track(const LLUUID& avatar_id, const std::string& name) 154void LLAvatarTracker::track(const LLUUID& avatar_id, const std::string& name)
143{ 155{
144 deleteTrackingData(); 156 deleteTrackingData();
diff --git a/linden/indra/newview/llcallingcard.h b/linden/indra/newview/llcallingcard.h
index 85a1ab6..aad7cec 100644
--- a/linden/indra/newview/llcallingcard.h
+++ b/linden/indra/newview/llcallingcard.h
@@ -86,7 +86,7 @@ class LLAvatarTracker
86{ 86{
87public: 87public:
88 static LLAvatarTracker& instance() { return sInstance; } 88 static LLAvatarTracker& instance() { return sInstance; }
89 89 void reset();
90 void track(const LLUUID& avatar_id, const std::string& name); 90 void track(const LLUUID& avatar_id, const std::string& name);
91 void untrack(const LLUUID& avatar_id); 91 void untrack(const LLUUID& avatar_id);
92 bool isTrackedAgentValid() { return mTrackedAgentValid; } 92 bool isTrackedAgentValid() { return mTrackedAgentValid; }
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 41d2e08..44d1ad1 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -54,6 +54,7 @@
54#include "llkeyboard.h" 54#include "llkeyboard.h"
55#include "lllineeditor.h" 55#include "lllineeditor.h"
56#include "llstatusbar.h" 56#include "llstatusbar.h"
57#include "llspinctrl.h"
57#include "lltextbox.h" 58#include "lltextbox.h"
58#include "lluiconstants.h" 59#include "lluiconstants.h"
59#include "llviewergesture.h" // for triggering gestures 60#include "llviewergesture.h" // for triggering gestures
@@ -79,7 +80,10 @@ LLChatBar *gChatBar = NULL;
79 80
80// legacy calllback glue 81// legacy calllback glue
81void toggleChatHistory(void* user_data); 82void toggleChatHistory(void* user_data);
82void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel); 83//void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel);
84// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d) | Modified: RLVa-0.2.2a
85void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel);
86// [/RLVa:KB]
83 87
84 88
85class LLChatBarGestureObserver : public LLGestureManagerObserver 89class LLChatBarGestureObserver : public LLGestureManagerObserver
@@ -99,6 +103,7 @@ private:
99 103
100LLChatBar::LLChatBar() 104LLChatBar::LLChatBar()
101: LLPanel(LLStringUtil::null, LLRect(), BORDER_NO), 105: LLPanel(LLStringUtil::null, LLRect(), BORDER_NO),
106 mChanCtrlEnabled(FALSE),
102 mInputEditor(NULL), 107 mInputEditor(NULL),
103 mGestureLabelTimer(), 108 mGestureLabelTimer(),
104 mLastSpecialChatChannel(0), 109 mLastSpecialChatChannel(0),
@@ -153,6 +158,10 @@ BOOL LLChatBar::postBuild()
153 mInputEditor->setEnableLineHistory(TRUE); 158 mInputEditor->setEnableLineHistory(TRUE);
154 } 159 }
155 160
161 mChannelControl = getChild<LLSpinCtrl>("channel_control");
162
163 toggleChannelControl();
164
156 mIsBuilt = TRUE; 165 mIsBuilt = TRUE;
157 166
158 return TRUE; 167 return TRUE;
@@ -212,6 +221,7 @@ void LLChatBar::refresh()
212 221
213 childSetValue("History", LLFloaterChat::instanceVisible(LLSD())); 222 childSetValue("History", LLFloaterChat::instanceVisible(LLSD()));
214 223
224 //childSetValue("channel_control",( 1.f * ((S32)(mChannelControl->get()))) );
215 childSetEnabled("Say", mInputEditor->getText().size() > 0); 225 childSetEnabled("Say", mInputEditor->getText().size() > 0);
216 childSetEnabled("Shout", mInputEditor->getText().size() > 0); 226 childSetEnabled("Shout", mInputEditor->getText().size() > 0);
217 227
@@ -372,8 +382,11 @@ LLWString LLChatBar::stripChannelNumber(const LLWString &mesg, S32* channel)
372 } 382 }
373 else 383 else
374 { 384 {
375 // This is normal chat. 385 if (!mChanCtrlEnabled)
376 *channel = 0; 386 {
387 // This is normal chat.
388 *channel = 0;
389 }
377 return mesg; 390 return mesg;
378 } 391 }
379} 392}
@@ -389,7 +402,8 @@ void LLChatBar::sendChat( EChatType type )
389 // store sent line in history, duplicates will get filtered 402 // store sent line in history, duplicates will get filtered
390 if (mInputEditor) mInputEditor->updateHistory(); 403 if (mInputEditor) mInputEditor->updateHistory();
391 // Check if this is destined for another channel 404 // Check if this is destined for another channel
392 S32 channel = 0; 405 S32 channel = mChanCtrlEnabled ? (S32)(mChannelControl->get()) : 0;
406
393 stripChannelNumber(text, &channel); 407 stripChannelNumber(text, &channel);
394 408
395 std::string utf8text = wstring_to_utf8str(text); 409 std::string utf8text = wstring_to_utf8str(text);
@@ -427,6 +441,31 @@ void LLChatBar::sendChat( EChatType type )
427 } 441 }
428} 442}
429 443
444void LLChatBar::toggleChannelControl()
445{
446 LLRect input_rect = mInputEditor->getRect();
447 S32 chan_width = mChannelControl->getRect().getWidth();
448 BOOL visible = gSavedSettings.getBOOL("ChatChannelSelect");
449 BOOL control = mChannelControl->getVisible();
450
451 if (visible && !control)
452 {
453 input_rect.setLeftTopAndSize(input_rect.mLeft+chan_width, input_rect.mTop,
454 input_rect.getWidth()-chan_width, input_rect.getHeight());
455 }
456 else if (!visible && control)
457 {
458 input_rect.setLeftTopAndSize(input_rect.mLeft-chan_width, input_rect.mTop,
459 input_rect.getWidth()+chan_width, input_rect.getHeight());
460
461 }
462 mInputEditor->setRect(input_rect);
463
464 childSetVisible("channel_control", visible);
465 childSetEnabled("channel_control", visible);
466 mChanCtrlEnabled = visible;
467}
468
430 469
431//----------------------------------------------------------------------- 470//-----------------------------------------------------------------------
432// Static functions 471// Static functions
@@ -484,7 +523,10 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata )
484 523
485 S32 length = raw_text.length(); 524 S32 length = raw_text.length();
486 525
487 if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences 526 //if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
527// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
528 if ( (length > 0) && (raw_text[0] != '/') && (!gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT)) )
529// [/RLVa:KB]
488 { 530 {
489 gAgent.startTyping(); 531 gAgent.startTyping();
490 } 532 }
@@ -578,7 +620,8 @@ void LLChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type,
578void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate) 620void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate)
579{ 621{
580 // Look for "/20 foo" channel chats. 622 // Look for "/20 foo" channel chats.
581 S32 channel = 0; 623 S32 channel = mChanCtrlEnabled ? (S32)(mChannelControl->get()) : 0;
624
582 LLWString out_text = stripChannelNumber(wtext, &channel); 625 LLWString out_text = stripChannelNumber(wtext, &channel);
583 std::string utf8_out_text = wstring_to_utf8str(out_text); 626 std::string utf8_out_text = wstring_to_utf8str(out_text);
584 std::string utf8_text = wstring_to_utf8str(wtext); 627 std::string utf8_text = wstring_to_utf8str(wtext);
@@ -589,6 +632,21 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL
589 utf8_text = utf8str_truncate(utf8_text, MAX_STRING - 1); 632 utf8_text = utf8str_truncate(utf8_text, MAX_STRING - 1);
590 } 633 }
591 634
635// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d) | Modified: RLVa-0.2.0b
636 if ( (0 == channel) && (rlv_handler_t::isEnabled()) )
637 {
638 // Adjust the (public) chat "volume" on chat and gestures (also takes care of playing the proper animation)
639 if ( ((CHAT_TYPE_SHOUT == type) || (CHAT_TYPE_NORMAL == type)) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATNORMAL)) )
640 type = CHAT_TYPE_WHISPER;
641 else if ( (CHAT_TYPE_SHOUT == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATSHOUT)) )
642 type = CHAT_TYPE_NORMAL;
643 else if ( (CHAT_TYPE_WHISPER == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATWHISPER)) )
644 type = CHAT_TYPE_NORMAL;
645
646 animate &= !gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT);
647 }
648// [/RLVa:KB]
649
592 // Don't animate for chats people can't hear (chat to scripts) 650 // Don't animate for chats people can't hear (chat to scripts)
593 if (animate && (channel == 0)) 651 if (animate && (channel == 0))
594 { 652 {
@@ -624,8 +682,57 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL
624 send_chat_from_viewer(utf8_out_text, type, channel); 682 send_chat_from_viewer(utf8_out_text, type, channel);
625} 683}
626 684
627void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel) 685// void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel)
686// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d) | Modified: RLVa-0.2.2a
687void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel)
688// [/RLVa:KB]
628{ 689{
690// [RLVa:KB] - Checked: 2009-08-05 (RLVa-1.0.1e) | Modified: RLVa-1.0.1e
691 // Only process chat messages (ie not CHAT_TYPE_START, CHAT_TYPE_STOP, etc)
692 if ( (rlv_handler_t::isEnabled()) && ( (CHAT_TYPE_WHISPER == type) || (CHAT_TYPE_NORMAL == type) || (CHAT_TYPE_SHOUT == type) ) )
693 {
694 if (0 == channel)
695 {
696 // (We already did this before, but LLChatHandler::handle() calls this directly)
697 if ( ((CHAT_TYPE_SHOUT == type) || (CHAT_TYPE_NORMAL == type)) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATNORMAL)) )
698 type = CHAT_TYPE_WHISPER;
699 else if ( (CHAT_TYPE_SHOUT == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATSHOUT)) )
700 type = CHAT_TYPE_NORMAL;
701 else if ( (CHAT_TYPE_WHISPER == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATWHISPER)) )
702 type = CHAT_TYPE_NORMAL;
703
704 // Redirect chat if needed
705 if ( ( (gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT) || (gRlvHandler.hasBehaviour(RLV_BHVR_REDIREMOTE)) ) &&
706 (gRlvHandler.redirectChatOrEmote(utf8_out_text)) ) )
707 {
708 return;
709 }
710
711 // Filter public chat if sendchat restricted (and filter anything that redirchat didn't redirect)
712 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHAT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT)) )
713 gRlvHandler.filterChat(utf8_out_text, true);
714 }
715 else
716 {
717 // Don't allow chat on a non-public channel if sendchannel restricted (unless the channel is an exception)
718 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHANNEL)) && (!gRlvHandler.isException(RLV_BHVR_SENDCHANNEL, channel)) )
719 return;
720
721 // Don't allow chat on debug channel if @sendchat, @redirchat or @rediremote restricted (shows as public chat on viewers)
722 if (channel >= CHAT_CHANNEL_DEBUG)
723 {
724 bool fIsEmote = rlvIsEmote(utf8_out_text);
725 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHAT)) ||
726 ((!fIsEmote) && (gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT))) ||
727 ((fIsEmote) && (gRlvHandler.hasBehaviour(RLV_BHVR_REDIREMOTE))) )
728 {
729 return;
730 }
731 }
732 }
733 }
734// [/RLVa:KB]
735
629 LLMessageSystem* msg = gMessageSystem; 736 LLMessageSystem* msg = gMessageSystem;
630 msg->newMessageFast(_PREHASH_ChatFromViewer); 737 msg->newMessageFast(_PREHASH_ChatFromViewer);
631 msg->nextBlockFast(_PREHASH_AgentData); 738 msg->nextBlockFast(_PREHASH_AgentData);
diff --git a/linden/indra/newview/llchatbar.h b/linden/indra/newview/llchatbar.h
index 56a98a7..13332c7 100644
--- a/linden/indra/newview/llchatbar.h
+++ b/linden/indra/newview/llchatbar.h
@@ -44,6 +44,7 @@ class LLUUID;
44class LLFrameTimer; 44class LLFrameTimer;
45class LLChatBarGestureObserver; 45class LLChatBarGestureObserver;
46class LLComboBox; 46class LLComboBox;
47class LLSpinCtrl;
47 48
48class LLChatBar 49class LLChatBar
49: public LLPanel 50: public LLPanel
@@ -94,6 +95,8 @@ public:
94 static void startChat(const char* line); 95 static void startChat(const char* line);
95 static void stopChat(); 96 static void stopChat();
96 97
98 void toggleChannelControl();
99
97protected: 100protected:
98 void sendChat(EChatType type); 101 void sendChat(EChatType type);
99 void updateChat(); 102 void updateChat();
@@ -110,6 +113,10 @@ protected:
110 LLComboBox* mGestureCombo; 113 LLComboBox* mGestureCombo;
111 114
112 LLChatBarGestureObserver* mObserver; 115 LLChatBarGestureObserver* mObserver;
116
117private:
118 BOOL mChanCtrlEnabled;
119 LLSpinCtrl* mChannelControl;
113}; 120};
114 121
115extern LLChatBar *gChatBar; 122extern LLChatBar *gChatBar;
diff --git a/linden/indra/newview/lldrawable.h b/linden/indra/newview/lldrawable.h
index 6e0b6e8..21cc0c5 100644
--- a/linden/indra/newview/lldrawable.h
+++ b/linden/indra/newview/lldrawable.h
@@ -50,6 +50,7 @@
50#include "llviewerobject.h" 50#include "llviewerobject.h"
51#include "llrect.h" 51#include "llrect.h"
52#include "llappviewer.h" // for gFrameTimeSeconds 52#include "llappviewer.h" // for gFrameTimeSeconds
53#include "llimagej2c.h"
53 54
54class LLCamera; 55class LLCamera;
55class LLDrawPool; 56class LLDrawPool;
diff --git a/linden/indra/newview/llfilepicker.cpp b/linden/indra/newview/llfilepicker.cpp
index 8f58826..60fa608 100644
--- a/linden/indra/newview/llfilepicker.cpp
+++ b/linden/indra/newview/llfilepicker.cpp
@@ -329,6 +329,18 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
329 L"Targa, Bitmap Images (*.tga; *.bmp)\0*.tga;*.bmp\0" \ 329 L"Targa, Bitmap Images (*.tga; *.bmp)\0*.tga;*.bmp\0" \
330 L"\0"; 330 L"\0";
331 break; 331 break;
332 case FFSAVE_TEXT:
333 if (filename.empty())
334 {
335 wcsncpy( mFilesW,L"untitled.txt", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
336 }
337 mOFN.lpstrDefExt = L"txt";
338 mOFN.lpstrFilter =
339 L"Text files (*.txt)\0*.txt\0"
340 L"RTF Files (*.rtf)\0*.rtf\0"
341 L"LSL Files (*.lsl)\0*.lsl\0"
342 L"\0";
343 break;
332 case FFSAVE_WAV: 344 case FFSAVE_WAV:
333 if (filename.empty()) 345 if (filename.empty())
334 { 346 {
@@ -996,6 +1008,12 @@ GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::stri
996 (GTK_FILE_CHOOSER(win), 1008 (GTK_FILE_CHOOSER(win),
997 this_path->second.c_str()); 1009 this_path->second.c_str());
998 } 1010 }
1011 else if (getenv("HOME"))
1012 {
1013 gtk_file_chooser_set_current_folder
1014 (GTK_FILE_CHOOSER(win),
1015 getenv("HOME"));
1016 }
999 1017
1000# if LL_X11 1018# if LL_X11
1001 // Make GTK tell the window manager to associate this 1019 // Make GTK tell the window manager to associate this
diff --git a/linden/indra/newview/llfilepicker.h b/linden/indra/newview/llfilepicker.h
index 104e0df..63699b2 100644
--- a/linden/indra/newview/llfilepicker.h
+++ b/linden/indra/newview/llfilepicker.h
@@ -91,6 +91,7 @@ public:
91 FFLOAD_XML = 6, 91 FFLOAD_XML = 6,
92 FFLOAD_SLOBJECT = 7, 92 FFLOAD_SLOBJECT = 7,
93 FFLOAD_RAW = 8, 93 FFLOAD_RAW = 8,
94 FFLOAD_TEXT = 9,
94 }; 95 };
95 96
96 enum ESaveFilter 97 enum ESaveFilter
@@ -110,6 +111,8 @@ public:
110 FFSAVE_J2C = 12, 111 FFSAVE_J2C = 12,
111 FFSAVE_PNG = 13, 112 FFSAVE_PNG = 13,
112 FFSAVE_JPEG = 14, 113 FFSAVE_JPEG = 14,
114 FFSAVE_HPA = 15,
115 FFSAVE_TEXT = 16,
113 }; 116 };
114 117
115 // open the dialog. This is a modal operation 118 // open the dialog. This is a modal operation
diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp
index 9ee24d6..513cba3 100644
--- a/linden/indra/newview/llfirstuse.cpp
+++ b/linden/indra/newview/llfirstuse.cpp
@@ -45,6 +45,10 @@
45#include "llappviewer.h" 45#include "llappviewer.h"
46#include "lltracker.h" 46#include "lltracker.h"
47 47
48// [RLVa:KB] - Version: 1.22.11
49#include "llviewerwindow.h"
50// [/RLVa:KB]
51
48// static 52// static
49std::set<std::string> LLFirstUse::sConfigVariables; 53std::set<std::string> LLFirstUse::sConfigVariables;
50 54
@@ -132,6 +136,17 @@ void LLFirstUse::useMap()
132} 136}
133 137
134// static 138// static
139void LLFirstUse::useMiniMap()
140{
141 if (gSavedSettings.getWarning("FirstMiniMap"))
142 {
143 gSavedSettings.setWarning("FirstMiniMap", FALSE);
144
145 LLNotifyBox::showXml("FirstMiniMap");
146 }
147}
148
149// static
135void LLFirstUse::useGoTo() 150void LLFirstUse::useGoTo()
136{ 151{
137 // nothing for now JC 152 // nothing for now JC
@@ -277,3 +292,36 @@ void LLFirstUse::useMedia()
277 LLNotifications::instance().add("FirstMedia"); 292 LLNotifications::instance().add("FirstMedia");
278 } 293 }
279} 294}
295
296// [RLVa:KB] - Version: 1.22.11 | Checked: RLVa-1.0.3a (2009-09-10) | Added: RLVa-1.0.3a
297
298// SL-1.22.11 doesn't seem to have a way to check which notifications are currently open :(
299bool rlvHasVisibleFirstUseNotification()
300{
301 return false;
302}
303
304void LLFirstUse::showRlvFirstUseNotification(const std::string& strName)
305{
306 if ( (gSavedSettings.getWarning(strName)) && (!rlvHasVisibleFirstUseNotification()) )
307 {
308 gSavedSettings.setWarning(strName, FALSE);
309 LLNotifyBox::showXml(strName);
310 }
311}
312
313void LLFirstUse::warnRlvGiveToRLV()
314{
315 if ( (gSavedSettings.getWarning(RLV_SETTING_FIRSTUSE_GIVETORLV)) && (RlvSettings::getForbidGiveToRLV()) )
316 gViewerWindow->alertXml(RLV_SETTING_FIRSTUSE_GIVETORLV, LLStringUtil::format_map_t(), &LLFirstUse::onRlvGiveToRLVConfirmation, NULL);
317}
318
319void LLFirstUse::onRlvGiveToRLVConfirmation(S32 idxOption, void* /*pUserParam*/)
320{
321 gSavedSettings.setWarning(RLV_SETTING_FIRSTUSE_GIVETORLV, FALSE);
322
323 if ( (0 == idxOption) || (1 == idxOption) )
324 gSavedSettings.setBOOL(RLV_SETTING_FORBIDGIVETORLV, (idxOption == 1));
325}
326
327// [/RLVa:KB]
diff --git a/linden/indra/newview/llfirstuse.h b/linden/indra/newview/llfirstuse.h
index bb64cdd..3305ffe 100644
--- a/linden/indra/newview/llfirstuse.h
+++ b/linden/indra/newview/llfirstuse.h
@@ -36,6 +36,10 @@
36#include <vector> 36#include <vector>
37#include "llstring.h" 37#include "llstring.h"
38 38
39// [RLVa:KB]
40#include "rlvdefines.h"
41// [/RLVa:KB]
42
39/* 43/*
401. On first use of 'sit here', explain how to get up and rotate view. 441. On first use of 'sit here', explain how to get up and rotate view.
41 45
@@ -93,6 +97,7 @@ public:
93 static void useBalanceDecrease(S32 delta); 97 static void useBalanceDecrease(S32 delta);
94 static void useSit(); 98 static void useSit();
95 static void useMap(); 99 static void useMap();
100 static void useMiniMap();
96 static void useGoTo(); 101 static void useGoTo();
97 static void useBuild(); 102 static void useBuild();
98 static void useLeftClickNoHit(); 103 static void useLeftClickNoHit();
@@ -109,6 +114,19 @@ public:
109 114
110protected: 115protected:
111 static std::set<std::string> sConfigVariables; 116 static std::set<std::string> sConfigVariables;
117
118// [RLVa:KB] - Checked: RLVa-1.0.3a (2009-09-10) | Added: RLVa-1.0.3a
119public:
120 static void showRlvFirstUseNotification(const std::string& strName);
121
122 static void useRlvDetach() { showRlvFirstUseNotification(RLV_SETTING_FIRSTUSE_DETACH); }
123 static void useRlvEnableWear() { showRlvFirstUseNotification(RLV_SETTING_FIRSTUSE_ENABLEWEAR); }
124 static void useRlvFartouch() { showRlvFirstUseNotification(RLV_SETTING_FIRSTUSE_FARTOUCH); }
125
126 static void warnRlvGiveToRLV();
127protected:
128 static void onRlvGiveToRLVConfirmation(S32 idxOption, void* pUserParam);
129// [/RLVa:KB]
112}; 130};
113 131
114#endif 132#endif
diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp
index 32b2c18..686353b 100644
--- a/linden/indra/newview/llfloaterabout.cpp
+++ b/linden/indra/newview/llfloaterabout.cpp
@@ -139,7 +139,15 @@ LLFloaterAbout::LLFloaterAbout()
139 139
140 // Position 140 // Position
141 LLViewerRegion* region = gAgent.getRegion(); 141 LLViewerRegion* region = gAgent.getRegion();
142 if (region) 142// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-04 (RLVa-1.0.0a)
143 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
144 {
145 support.append(rlv_handler_t::cstrHidden);
146 support.append("\n\n");
147 }
148 else if (region)
149// [/RLVa:KB]
150// if (region)
143 { 151 {
144 LLStyleSP server_link_style(new LLStyle); 152 LLStyleSP server_link_style(new LLStyle);
145 server_link_style->setVisible(true); 153 server_link_style->setVisible(true);
diff --git a/linden/indra/newview/llfloateractivespeakers.cpp b/linden/indra/newview/llfloateractivespeakers.cpp
index c19c0c4..51e7b89 100644
--- a/linden/indra/newview/llfloateractivespeakers.cpp
+++ b/linden/indra/newview/llfloateractivespeakers.cpp
@@ -100,6 +100,11 @@ void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, c
100 if (speaker_ptr) 100 if (speaker_ptr)
101 { 101 {
102 speaker_ptr->mDisplayName = first + " " + last; 102 speaker_ptr->mDisplayName = first + " " + last;
103// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-1.0.0g
104 // TODO-RLVa: this seems to get called per frame which is very likely an LL bug that will eventuall get fixed
105 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
106 speaker_ptr->mDisplayName = gRlvHandler.getAnonym(speaker_ptr->mDisplayName);
107// [/RLVa:KB]
103 } 108 }
104} 109}
105 110
@@ -712,6 +717,13 @@ void LLPanelActiveSpeakers::onVolumeChange(LLUICtrl* source, void* user_data)
712//static 717//static
713void LLPanelActiveSpeakers::onClickProfile(void* user_data) 718void LLPanelActiveSpeakers::onClickProfile(void* user_data)
714{ 719{
720// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-1.0.0g
721 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
722 {
723 return;
724 }
725// [/RLVa:KB]
726
715 LLPanelActiveSpeakers* panelp = (LLPanelActiveSpeakers*)user_data; 727 LLPanelActiveSpeakers* panelp = (LLPanelActiveSpeakers*)user_data;
716 LLUUID speaker_id = panelp->mSpeakerList->getValue().asUUID(); 728 LLUUID speaker_id = panelp->mSpeakerList->getValue().asUUID();
717 729
@@ -721,6 +733,13 @@ void LLPanelActiveSpeakers::onClickProfile(void* user_data)
721//static 733//static
722void LLPanelActiveSpeakers::onDoubleClickSpeaker(void* user_data) 734void LLPanelActiveSpeakers::onDoubleClickSpeaker(void* user_data)
723{ 735{
736// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-1.0.0g
737 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
738 {
739 return;
740 }
741// [/RLVa:KB]
742
724 LLPanelActiveSpeakers* panelp = (LLPanelActiveSpeakers*)user_data; 743 LLPanelActiveSpeakers* panelp = (LLPanelActiveSpeakers*)user_data;
725 LLUUID speaker_id = panelp->mSpeakerList->getValue().asUUID(); 744 LLUUID speaker_id = panelp->mSpeakerList->getValue().asUUID();
726 745
diff --git a/linden/indra/newview/llfloaterassetbrowser.cpp b/linden/indra/newview/llfloaterassetbrowser.cpp
new file mode 100644
index 0000000..615d21a
--- /dev/null
+++ b/linden/indra/newview/llfloaterassetbrowser.cpp
@@ -0,0 +1,466 @@
1/**
2 * @file llfloaterassetbrowser.cpp
3 * @brief LLFloaterAssetBrowser class implementation
4 * Phox wuz hurr
5 */
6
7#include "llviewerprecompiledheaders.h"
8#include "llfloaterassetbrowser.h"
9#include "llinventoryview.h"
10#include "llinventorymodel.h"
11#include "llviewerimagelist.h"
12#include "llbutton.h"
13#include "lltextbox.h"
14#include "llpreview.h"
15#include "llinventorybridge.h"
16#include "llagent.h"
17#include "lltooldraganddrop.h"
18#include "llfocusmgr.h"
19#include "llview.h"
20
21// Externs
22extern LLInventoryModel gInventory;
23
24// Statics
25LLFloaterAssetBrowser* LLFloaterAssetBrowser::sInstance = NULL;
26
27LLFloaterAssetBrowser::LLFloaterAssetBrowser()
28: LLFloater("floater_asset_browser")
29{
30 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_asset_browser.xml");
31
32 mInventoryPanel = getChild<LLInventoryPanel>("inventory panel");
33
34 //Open all folders and close them in order to make item list up-to-date
35 //if(gInventory.getItemCount()==0)
36 mInventoryPanel->openAllFolders();
37
38 //gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLAssetType::AT_TEXTURE));
39
40
41 childSetAction("button next", onClickNext, this);
42 childSetAction("button previous", onClickPrevious, this);
43 childSetAction("button refresh", onClickRefresh, this);
44
45 initialize();
46 createThumbnails();
47 mInventoryPanel->closeAllFolders();
48}
49
50// static
51void LLFloaterAssetBrowser::show(void*)
52{
53 if (!sInstance)
54 sInstance = new LLFloaterAssetBrowser();
55
56 sInstance->open();
57}
58
59// virtual
60LLFloaterAssetBrowser::~LLFloaterAssetBrowser()
61{
62 clearAssetInfoTexts();
63 mTextureAssets.clear();
64 mMaxIndex = 0;
65 mFirstIndex = 0;
66 mMouseOverIndex = 0;
67 mMouseOverUUID = LLUUID::null;
68 mMouseOverAssetUUID = LLUUID::null;
69 mFloaterTitle = "";
70 clearNoAssetsText();
71 sInstance=NULL;
72}
73
74void LLFloaterAssetBrowser::initialize()
75{
76 mMaxIndex = ITEMS_PER_PAGE;
77 mFirstIndex = 0;
78 mAssetInfoLabelList.clear();
79 mAssetInfoIndex = 0;
80 mFloaterHeight = getRect().getHeight();
81 mFloaterWidth = getRect().getWidth();
82 mMouseOverIndex = 0;
83 mMouseOverUUID = LLUUID::null;
84 mMouseOverAssetUUID = LLUUID::null;
85 mFloaterTitle = "";
86
87 S32 image_top = getRect().getHeight();
88 S32 image_bottom = BTN_HEIGHT_SMALL;
89 S32 image_middle = (image_top + image_bottom) / 2;
90 S32 line_height = llround(LLFontGL::sSansSerifSmall->getLineHeight());
91
92 mNoAssetsLabel = new LLTextBox("mNoAssetsLabel.",
93 LLRect(getRect().getWidth()/2,
94 image_middle + line_height / 2,
95 getRect().getWidth(),
96 image_middle - line_height / 2 ),
97 "No assets found.",
98 LLFontGL::sSansSerifSmall );
99 mNoAssetsLabel->setFollowsAll();
100 addChild(mNoAssetsLabel);
101 mNoAssetsLabel->setVisible(FALSE);
102}
103
104void LLFloaterAssetBrowser::createThumbnails()
105{
106 LLViewerInventoryCategory::cat_array_t cats;
107 LLViewerInventoryItem::item_array_t items;
108 LLIsType isType(LLAssetType::AT_TEXTURE);
109
110 gInventory.collectDescendentsIf(LLUUID::null,
111 cats,
112 items,
113 LLInventoryModel::INCLUDE_TRASH,
114 isType);
115
116 //Get UUID, asset UUID and name
117 for(S32 i = 0; i < items.count(); i++)
118 {
119 LLInventoryItem* itemp = items[i];
120 LLAssetSelection temp;
121 temp.mAssetUUID = itemp->getAssetUUID();
122 temp.mUUID = itemp->getUUID();
123 temp.mName = itemp->getName();
124 temp.mTexturep = NULL;
125 temp.mAssetRect = LLRect::null;
126 mTextureAssets.push_back(temp);
127 }
128
129 //Get Texturep
130 for(S32 i = 0; i < items.count(); i++)
131 {
132 mTextureAssets[i].mTexturep = gImageList.getImage(mTextureAssets[i].mAssetUUID, MIPMAP_YES, IMMEDIATE_NO);
133 mTextureAssets[i].mTexturep->setBoostLevel(LLViewerImage::BOOST_PREVIEW);
134 //mTextureAssets[i].mTexturep->processTextureStats();
135 }
136
137 //Generate the asset info text
138 /*for(S32 i = 0; i < items.count(); i++)
139 {
140 LLString asset_info;
141 LLString dimensions;
142
143 asset_info.append(mTextureAssets[i].mName);
144
145 //if(mTextureAssets[i].mTexturep->mFullWidth == 0
146 //|| mTextureAssets[i].mTexturep->mFullHeight == 0)
147
148 dimensions = llformat("\n%d x %d",
149 mTextureAssets[i].mTexturep->mFullWidth,
150 mTextureAssets[i].mTexturep->mFullHeight);
151 asset_info.append(dimensions);
152
153 mTextureAssets[i].mAssetInfo = asset_info;
154 }*/
155
156 mFloaterTitle = llformat("Asset Browser (%d assets fetched)", mTextureAssets.size());
157 setTitle(mFloaterTitle);
158}
159
160// virtual
161BOOL LLFloaterAssetBrowser::handleHover(S32 x, S32 y, MASK mask)
162{
163 if(mTextureAssets.size() > 0)
164 {
165 for(U32 i = mFirstIndex; i < mMaxIndex; i++)
166 {
167 if(i < mTextureAssets.size())
168 {
169 if(mTextureAssets[i].mAssetRect.pointInRect(x,y))
170 {
171 mMouseOverUUID = mTextureAssets[i].mUUID;
172 mMouseOverIndex = i;
173
174 if(hasMouseCapture())
175 {
176 S32 screen_x;
177 S32 screen_y;
178 LLUUID mObjectUUID= LLUUID::null;
179 const LLViewerInventoryItem *item = gInventory.getItem(mMouseOverUUID);
180
181 localPointToScreen(x, y, &screen_x, &screen_y );
182
183 if(item && item->getPermissions().allowCopyBy(gAgent.getID(), gAgent.getGroupID())
184 && LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y))
185 {
186 EDragAndDropType type;
187 type = LLAssetType::lookupDragAndDropType(item->getType());
188 LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_LIBRARY;
189
190 if(!mObjectUUID.isNull())
191 {
192 src = LLToolDragAndDrop::SOURCE_WORLD;
193 }
194 else if(item->getPermissions().getOwner() == gAgent.getID())
195 {
196 src = LLToolDragAndDrop::SOURCE_AGENT;
197 }
198 LLToolDragAndDrop::getInstance()->beginDrag(type,
199 item->getUUID(),
200 src,
201 mObjectUUID);
202 return LLToolDragAndDrop::getInstance()->handleHover(x, y, mask);
203 }
204 return TRUE;
205 }
206 return LLFloater::handleHover(x, y, mask);
207 }
208 }
209 }
210 return LLFloater::handleHover(x, y, mask);
211 }
212 else
213 {
214 mMouseOverUUID = LLUUID::null;
215 return LLFloater::handleHover(x, y, mask);
216 }
217}
218
219// virtual
220BOOL LLFloaterAssetBrowser::handleMouseDown(S32 x, S32 y, MASK mask)
221{
222 if(mTextureAssets.size() > 0)
223 {
224 if(mTextureAssets[mMouseOverIndex].mAssetRect.pointInRect(x,y))
225 {
226 if(mMouseOverUUID.notNull())
227 {
228 gFocusMgr.setMouseCapture(this);
229 S32 screen_x;
230 S32 screen_y;
231 localPointToScreen(x, y, &screen_x, &screen_y);
232 LLToolDragAndDrop::getInstance()->setDragStart(screen_x, screen_y);
233 return TRUE;
234 }
235 }
236 }
237 return LLFloater::handleMouseDown(x, y, mask);
238}
239
240// virtual
241BOOL LLFloaterAssetBrowser::handleMouseUp(S32 x, S32 y, MASK mask)
242{
243 if(hasMouseCapture())
244 {
245 gFocusMgr.setMouseCapture(NULL);
246 return TRUE;
247 }
248 return LLFloater::handleMouseUp(x, y, mask);
249}
250
251// virtual
252BOOL LLFloaterAssetBrowser::handleDoubleClick(S32 x, S32 y, MASK mask)
253{
254 if(mTextureAssets.size() > 0)
255 {
256 if(mTextureAssets[mMouseOverIndex].mAssetRect.pointInRect(x,y))
257 {
258 if(mMouseOverUUID.notNull())
259 {
260 open_texture(mMouseOverUUID, mTextureAssets[mMouseOverIndex].mName, FALSE);
261 return TRUE;
262 }
263 }
264 }
265 return LLFloater::handleDoubleClick(x, y, mask);
266}
267
268// virtual
269void LLFloaterAssetBrowser::draw()
270{
271 LLFloater::draw();
272
273 if(mTextureAssets.size() > 0)
274 {
275 S32 hor_pos = 0;
276 S32 ver_pos = 0;
277 U32 items_per_row = 0;
278 S32 height = getRect().getHeight()/8;
279 S32 width = height;
280
281 for(U32 i = mFirstIndex; i < mMaxIndex; i++)
282 {
283 if(i < mTextureAssets.size())
284 {
285 mTexturep = NULL;
286 mImageAssetID = mTextureAssets[i].mAssetUUID;
287
288 if(mImageAssetID.notNull())
289 {
290 mTexturep = gImageList.getImage(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO);
291 //mTexturep->setBoostLevel(LLViewerImage::BOOST_PREVIEW);
292 mTexturep->processTextureStats();
293 mTextureAssets[i].mWidth = mTexturep->mFullWidth;
294 mTextureAssets[i].mHeight = mTexturep->mFullHeight;
295 }
296
297 if(isMinimized())
298 {
299 return;
300 }
301
302 //Border
303 LLRect border;
304 border.mLeft = START_POS + ver_pos;
305 border.mTop = getRect().getHeight() - LLFLOATER_HEADER_SIZE - BORDER_PAD - hor_pos;
306 border.mRight = border.mLeft + width;
307 border.mBottom = border.mTop - height;
308
309 //Save the rect for each thumbnail
310 mTextureAssets[i].mAssetRect = border;
311
312 //Asset info rect
313 LLRect info_rect;
314 info_rect.mLeft = border.mLeft;
315 info_rect.mTop = border.mBottom - 3;
316 info_rect.mRight = border.mLeft + 130;
317 info_rect.mBottom = border.mBottom - 2*llround(LLFontGL::sSansSerifSmall->getLineHeight());
318
319 gl_rect_2d(border, LLColor4::black, FALSE);
320
321 // Interior
322 LLRect interior = border;
323 interior.stretch(1);
324
325 //Draw the image
326 if(mTexturep)
327 {
328 if(mTexturep->getComponents() == 4)
329 {
330 gl_rect_2d_checkerboard(interior);
331 }
332
333 gl_draw_scaled_image(interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep);
334 // Pump the priority
335 mTexturep->addTextureStats((F32)(interior.getWidth() * interior.getHeight()));
336
337 //Generate the asset info text
338 std::string asset_info;
339 asset_info.append(mTextureAssets[i].mName);
340 std::string dimensions = llformat("\n%d x %d",
341 mTexturep->mFullWidth /*mTextureAssets[i].mWidth*/,
342 mTexturep->mFullHeight /* mTextureAssets[i].mHeight*/);
343 asset_info.append(dimensions);
344
345 // Draw material info below the asset
346 // LLTextBox object has to be drawn only once, not non-stop like image
347 if(mAssetInfoIndex < ITEMS_PER_PAGE &&
348 mAssetInfoIndex < mTextureAssets.size() - mFirstIndex)
349 {
350 mAssetInfoLabel = new LLTextBox("Asset Info"/*mTextureAssets[i].mAssetInfo*/,
351 info_rect,
352 asset_info,
353 LLFontGL::sSansSerifSmall);
354 mAssetInfoLabel->setFollowsAll();
355 mAssetInfoLabelList.push_back(mAssetInfoLabel);
356 addChild(mAssetInfoLabelList[mAssetInfoIndex]);
357 mAssetInfoLabelList[mAssetInfoIndex]->setVisible(TRUE);
358 mAssetInfoIndex++;
359 }
360
361 }
362 else
363 {
364 // Draw X
365 gl_rect_2d(interior, LLColor4::grey, TRUE);
366 gl_draw_x(interior, LLColor4::black);
367 }
368 //Move to the right
369 ver_pos += getRect().getWidth()/6;
370 items_per_row++;
371
372 //Change the row
373 if(items_per_row % 4 == 0)
374 {
375 ver_pos = 0;
376 hor_pos += getRect().getHeight()/4;
377 }
378 }
379 }//for
380
381 //If the size of the floater has changed, clear the asset info texts
382 //in order to draw them again into the new position
383 if(getRect().getWidth() != mFloaterWidth || getRect().getHeight() != mFloaterHeight)
384 {
385 clearAssetInfoTexts();
386 //Save the size of the current floater
387 mFloaterWidth = getRect().getWidth();
388 mFloaterHeight = getRect().getHeight();
389 }
390 if(mMaxIndex >= mTextureAssets.size())
391 {
392 childDisable("button next");
393 childEnable("button previous");
394 }
395 else if(mFirstIndex <= 0)
396 {
397 childEnable("button next");
398 childDisable("button previous");
399 }
400 else
401 {
402 childEnable("button next");
403 childEnable("button previous");
404 }
405 }
406 else
407 {
408 //No assets found
409 mNoAssetsLabel->setVisible(TRUE);
410 childDisable("button next");
411 childDisable("button previous");
412 }
413}
414
415void LLFloaterAssetBrowser::clearAssetInfoTexts()
416{
417 for(U32 i = 0; i < mAssetInfoLabelList.size(); i++)
418 {
419 delete mAssetInfoLabelList[i];
420 mAssetInfoLabelList[i] = NULL;
421 }
422 mAssetInfoLabelList.clear();
423 mAssetInfoIndex = 0;
424}
425
426void LLFloaterAssetBrowser::clearNoAssetsText()
427{
428 if(mTextureAssets.size() > 0)
429 {
430 delete mNoAssetsLabel;
431 mNoAssetsLabel = NULL;
432 }
433}
434
435// static
436void LLFloaterAssetBrowser::onClickNext(void *userdata)
437{
438 LLFloaterAssetBrowser* self = (LLFloaterAssetBrowser*)userdata;
439 self->mFirstIndex = self->mMaxIndex;
440 self->mMaxIndex = self->mFirstIndex + ITEMS_PER_PAGE;
441 self->clearAssetInfoTexts();
442}
443
444// static
445void LLFloaterAssetBrowser::onClickPrevious(void *userdata)
446{
447 LLFloaterAssetBrowser* self = (LLFloaterAssetBrowser*)userdata;
448 self->mFirstIndex = self->mMaxIndex - (2 * ITEMS_PER_PAGE);
449 self->mMaxIndex = self->mMaxIndex - ITEMS_PER_PAGE;
450 self->clearAssetInfoTexts();
451}
452
453// static
454void LLFloaterAssetBrowser::onClickRefresh(void *userdata)
455{
456 LLFloaterAssetBrowser* self = (LLFloaterAssetBrowser*)userdata;
457 for(U32 i = 0; i < self->mTextureAssets.size(); i++)
458 {
459 self->mTextureAssets[i].mTexturep = NULL;
460 }
461
462 self->mTextureAssets.clear();
463 self->createThumbnails();
464 self->clearNoAssetsText();
465 self->clearAssetInfoTexts();
466}
diff --git a/linden/indra/newview/llfloaterassetbrowser.h b/linden/indra/newview/llfloaterassetbrowser.h
new file mode 100644
index 0000000..76eb3ba
--- /dev/null
+++ b/linden/indra/newview/llfloaterassetbrowser.h
@@ -0,0 +1,84 @@
1/**
2 * @file llfloaterassetbrowser.h
3 * @brief LLFloaterAssetBrowser class implementation
4 * Phox wuz hurr
5 */
6
7#ifndef LL_LLFLOATERASSETBROWSERVIEW_H
8#define LL_LLFLOATERASSETBROWSERVIEW_H
9
10#include "llfloater.h"
11#include "llinventorymodel.h"
12#include "llview.h"
13#include "llviewerimage.h"
14
15class LLInventoryPanel;
16
17struct LLAssetSelection
18{
19 LLUUID mUUID;
20 LLUUID mAssetUUID;
21 std::string mName;
22 std::string mAssetInfo;
23 S32 mWidth;
24 S32 mHeight;
25 LLTextBox* mAssetInfoTextBox;
26 LLPointer<LLViewerImage> mTexturep;
27 LLRect mAssetRect;
28};
29
30class LLFloaterAssetBrowser : public LLFloater
31{
32public:
33 LLFloaterAssetBrowser();
34
35 virtual ~LLFloaterAssetBrowser();
36
37 static void show(void*);
38
39 virtual BOOL handleHover(S32 x, S32 y, MASK mask);
40 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
41 virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
42 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
43 virtual void draw();
44
45 static LLFloaterAssetBrowser* getInstance(){ return sInstance; }
46
47private:
48 void initialize();
49 void createThumbnails();
50 void clearAssetInfoTexts();
51 void clearNoAssetsText();
52
53 static void onClickNext(void *userdata);
54 static void onClickPrevious(void *userdata);
55 static void onClickRefresh(void *userdata);
56
57 static LLFloaterAssetBrowser* sInstance;
58
59protected:
60 LLInventoryPanel* mInventoryPanel;
61 LLUUID mImageAssetID;
62 LLUUID mMouseOverUUID;
63 LLUUID mMouseOverAssetUUID;
64 LLPointer<LLViewerImage> mTexturep;
65 std::vector<LLAssetSelection> mTextureAssets;
66 std::vector<LLTextBox*> mAssetInfoLabelList;
67 U32 mLastIndex;
68 U32 mMaxIndex;
69 U32 mFirstIndex;
70 U32 mAssetInfoIndex;
71 S32 mFloaterHeight;
72 S32 mFloaterWidth;
73 S32 mMouseOverIndex;
74 LLTextBox* mNoAssetsLabel;
75 LLTextBox* mAssetInfoLabel;
76 std::string mFloaterTitle;
77};
78
79static const S32 HPAD = 4;
80static const S32 BORDER_PAD = HPAD;
81static const U32 ITEMS_PER_PAGE = 16;
82static const S32 START_POS = 250;
83
84#endif
diff --git a/linden/indra/newview/llfloaterbeacons.cpp b/linden/indra/newview/llfloaterbeacons.cpp
index 55e4862..5a5de77 100644
--- a/linden/indra/newview/llfloaterbeacons.cpp
+++ b/linden/indra/newview/llfloaterbeacons.cpp
@@ -38,6 +38,9 @@
38#include "llcheckboxctrl.h" 38#include "llcheckboxctrl.h"
39#include "pipeline.h" 39#include "pipeline.h"
40 40
41// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
42#include "llagent.h"
43// [/RLVa:KB]
41 44
42LLFloaterBeacons::LLFloaterBeacons(const LLSD& seed) 45LLFloaterBeacons::LLFloaterBeacons(const LLSD& seed)
43{ 46{
@@ -73,6 +76,13 @@ BOOL LLFloaterBeacons::postBuild()
73// Too bad we can't just add control_name="BeaconsEnabled" to the XML. 76// Too bad we can't just add control_name="BeaconsEnabled" to the XML.
74void LLFloaterBeacons::open() 77void LLFloaterBeacons::open()
75{ 78{
79// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0b)
80 if (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT))
81 {
82 return;
83 }
84// [/RLVa:KB]
85
76 LLFloater::open(); 86 LLFloater::open();
77 gSavedSettings.setBOOL( "BeaconsEnabled", TRUE); 87 gSavedSettings.setBOOL( "BeaconsEnabled", TRUE);
78} 88}
diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp
index 703811b..3681a6f 100644
--- a/linden/indra/newview/llfloaterchat.cpp
+++ b/linden/indra/newview/llfloaterchat.cpp
@@ -57,10 +57,11 @@
57#include "llfloaterchatterbox.h" 57#include "llfloaterchatterbox.h"
58#include "llfloatermute.h" 58#include "llfloatermute.h"
59#include "llkeyboard.h" 59#include "llkeyboard.h"
60//#include "lllineeditor.h" 60#include "lllineeditor.h"
61#include "llmutelist.h" 61#include "llmutelist.h"
62//#include "llresizehandle.h" 62//#include "llresizehandle.h"
63#include "llchatbar.h" 63#include "llchatbar.h"
64#include "llspinctrl.h"
64#include "llstatusbar.h" 65#include "llstatusbar.h"
65#include "llviewertexteditor.h" 66#include "llviewertexteditor.h"
66#include "llviewergesture.h" // for triggering gestures 67#include "llviewergesture.h" // for triggering gestures
@@ -110,6 +111,8 @@ LLFloaterChat::LLFloaterChat(const LLSD& seed)
110 childSetVisible("Chat History Editor with mute",FALSE); 111 childSetVisible("Chat History Editor with mute",FALSE);
111 childSetAction("toggle_active_speakers_btn", onClickToggleActiveSpeakers, this); 112 childSetAction("toggle_active_speakers_btn", onClickToggleActiveSpeakers, this);
112 setDefaultBtn("Chat"); 113 setDefaultBtn("Chat");
114
115 //toggleHistoryChannelControl(); temporarily disable until working
113} 116}
114 117
115LLFloaterChat::~LLFloaterChat() 118LLFloaterChat::~LLFloaterChat()
@@ -204,17 +207,32 @@ void add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, const LLColor4&
204 // If the msg is from an agent (not yourself though), 207 // If the msg is from an agent (not yourself though),
205 // extract out the sender name and replace it with the hotlinked name. 208 // extract out the sender name and replace it with the hotlinked name.
206 if (chat.mSourceType == CHAT_SOURCE_AGENT && 209 if (chat.mSourceType == CHAT_SOURCE_AGENT &&
207 chat.mFromID != LLUUID::null) 210 chat.mFromID != LLUUID::null &&
211// [RLVa] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
212 (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
213// [/RLVa]
208 { 214 {
209 chat.mURL = llformat("secondlife:///app/agent/%s/about",chat.mFromID.asString().c_str()); 215 chat.mURL = llformat("secondlife:///app/agent/%s/about",chat.mFromID.asString().c_str());
210 } 216 }
211 217
212 // If the chat line has an associated url, link it up to the name. 218 // If the chat line has an associated url, link it up to the name.
213 if (!chat.mURL.empty() 219 if ((!chat.mURL.empty() && line.length() > chat.mFromName.length()) &&
214 && (line.length() > chat.mFromName.length() && line.find(chat.mFromName,0) == 0)) 220 (line.find(chat.mFromName,0) == 0 || (line.find(chat.mFromName,0) == 4 &&
221 color == gSavedSettings.getColor4("ObjectIMColor")))) // hack to make sure IMs in chat history don't hightlight
215 { 222 {
216 std::string start_line = line.substr(0, chat.mFromName.length() + 1); 223 std::string start_line;
217 line = line.substr(chat.mFromName.length() + 1); 224 if (line.find(chat.mFromName,0) == 4) // IMs are prefaced with "IM: "
225 {
226 start_line = line.substr(4, chat.mFromName.length() + 1);
227 std::string source = line.substr(0, 4);
228 edit->appendColoredText(source, false, prepend_newline, color);
229 line = line.substr(chat.mFromName.length() + 5);
230 }
231 else
232 {
233 start_line = line.substr(0, chat.mFromName.length() + 1);
234 line = line.substr(chat.mFromName.length() + 1);
235 }
218 const LLStyleSP &sourceStyle = LLStyleMap::instance().lookup(chat.mFromID,chat.mURL); 236 const LLStyleSP &sourceStyle = LLStyleMap::instance().lookup(chat.mFromID,chat.mURL);
219 edit->appendStyledText(start_line, false, prepend_newline, sourceStyle); 237 edit->appendStyledText(start_line, false, prepend_newline, sourceStyle);
220 prepend_newline = false; 238 prepend_newline = false;
@@ -232,9 +250,61 @@ void log_chat_text(const LLChat& chat)
232 250
233 LLLogChat::saveHistory(std::string("chat"),histstr); 251 LLLogChat::saveHistory(std::string("chat"),histstr);
234} 252}
253
254// static
255void LLFloaterChat::toggleHistoryChannelControl()
256{
257 LLFloaterChat* chat_floater = LLFloaterChat::getInstance(LLSD());
258 BOOL visible = gSavedSettings.getBOOL("ChatChannelSelect");
259 BOOL control = chat_floater->getChild<LLSpinCtrl>("channel_control")->getVisible();
260
261 LLLineEditor* input = chat_floater->getChild<LLLineEditor>("Chat Editor");
262 LLRect input_rect = input->getRect();
263 S32 chan_width = chat_floater->getChild<LLSpinCtrl>("channel_control")->getRect().getWidth();
264
265 if (visible && !control)
266 {
267 input_rect.setLeftTopAndSize(input_rect.mLeft+chan_width+4, input_rect.mTop,
268 input_rect.getWidth()-chan_width, input_rect.getHeight());
269 }
270 else if (!visible && control)
271 {
272 input_rect.setLeftTopAndSize(input_rect.mLeft-chan_width-4, input_rect.mTop,
273 input_rect.getWidth()+chan_width, input_rect.getHeight());
274 }
275 input->setRect(input_rect);
276
277 chat_floater->childSetVisible("channel_control", visible);
278 chat_floater->childSetEnabled("channel_control", visible);
279}
280
235// static 281// static
236void LLFloaterChat::addChatHistory(const LLChat& chat, bool log_to_file) 282void LLFloaterChat::addChatHistory(const LLChat& chat, bool log_to_file)
237{ 283{
284// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
285 if (rlv_handler_t::isEnabled())
286 {
287 // TODO-RLVa: we might cast too broad a net by filtering here, needs testing
288 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) && (!chat.mRlvLocFiltered) && (CHAT_SOURCE_AGENT != chat.mSourceType) )
289 {
290 LLChat& rlvChat = const_cast<LLChat&>(chat);
291 gRlvHandler.filterLocation(rlvChat.mText);
292 rlvChat.mRlvLocFiltered = TRUE;
293 }
294 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!chat.mRlvNamesFiltered) )
295 {
296 // NOTE: this will also filter inventory accepted/declined text in the chat history
297 LLChat& rlvChat = const_cast<LLChat&>(chat);
298 if (CHAT_SOURCE_AGENT != chat.mSourceType)
299 {
300 // Filter object and system chat (names are filtered elsewhere to save ourselves an gObjectList lookup)
301 gRlvHandler.filterNames(rlvChat.mText);
302 }
303 rlvChat.mRlvNamesFiltered = TRUE;
304 }
305 }
306// [/RLVa:KB]
307
238 if ( gSavedPerAccountSettings.getBOOL("LogChat") && log_to_file) 308 if ( gSavedPerAccountSettings.getBOOL("LogChat") && log_to_file)
239 { 309 {
240 log_chat_text(chat); 310 log_chat_text(chat);
@@ -368,6 +438,30 @@ void LLFloaterChat::addChat(const LLChat& chat,
368 chat.mChatType == CHAT_TYPE_DEBUG_MSG 438 chat.mChatType == CHAT_TYPE_DEBUG_MSG
369 && !gSavedSettings.getBOOL("ScriptErrorsAsChat"); 439 && !gSavedSettings.getBOOL("ScriptErrorsAsChat");
370 440
441// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
442 if (rlv_handler_t::isEnabled())
443 {
444 // TODO-RLVa: we might cast too broad a net by filtering here, needs testing
445 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) && (!chat.mRlvLocFiltered) && (CHAT_SOURCE_AGENT != chat.mSourceType) )
446 {
447 LLChat& rlvChat = const_cast<LLChat&>(chat);
448 if (!from_instant_message)
449 gRlvHandler.filterLocation(rlvChat.mText);
450 rlvChat.mRlvLocFiltered = TRUE;
451 }
452 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!chat.mRlvNamesFiltered) )
453 {
454 LLChat& rlvChat = const_cast<LLChat&>(chat);
455 if ( (!from_instant_message) && (CHAT_SOURCE_AGENT != chat.mSourceType) )
456 {
457 // Filter object and system chat (names are filtered elsewhere to save ourselves an gObjectList lookup)
458 gRlvHandler.filterNames(rlvChat.mText);
459 }
460 rlvChat.mRlvNamesFiltered = TRUE;
461 }
462 }
463// [/RLVa:KB]
464
371#if LL_LCD_COMPILE 465#if LL_LCD_COMPILE
372 // add into LCD displays 466 // add into LCD displays
373 if (!invisible_script_debug_chat) 467 if (!invisible_script_debug_chat)
@@ -463,6 +557,9 @@ LLColor4 get_text_color(const LLChat& chat)
463 text_color = gSavedSettings.getColor4("ObjectChatColor"); 557 text_color = gSavedSettings.getColor4("ObjectChatColor");
464 } 558 }
465 break; 559 break;
560 case CHAT_SOURCE_OBJECT_IM:
561 text_color = gSavedSettings.getColor4("ObjectIMColor");
562 break;
466 default: 563 default:
467 text_color.setToWhite(); 564 text_color.setToWhite();
468 } 565 }
@@ -528,7 +625,11 @@ void LLFloaterChat::onClickToggleActiveSpeakers(void* userdata)
528{ 625{
529 LLFloaterChat* self = (LLFloaterChat*)userdata; 626 LLFloaterChat* self = (LLFloaterChat*)userdata;
530 627
531 self->childSetVisible("active_speakers_panel", !self->childIsVisible("active_speakers_panel")); 628// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
629 self->childSetVisible("active_speakers_panel",
630 (!self->childIsVisible("active_speakers_panel")) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) );
631// [/RLVa:KB]
632 //self->childSetVisible("active_speakers_panel", !self->childIsVisible("active_speakers_panel"));
532} 633}
533 634
534//static 635//static
diff --git a/linden/indra/newview/llfloaterchat.h b/linden/indra/newview/llfloaterchat.h
index b539386..e2bb54c 100644
--- a/linden/indra/newview/llfloaterchat.h
+++ b/linden/indra/newview/llfloaterchat.h
@@ -83,6 +83,8 @@ public:
83 static void* createSpeakersPanel(void* data); 83 static void* createSpeakersPanel(void* data);
84 static void* createChatPanel(void* data); 84 static void* createChatPanel(void* data);
85 85
86 static void toggleHistoryChannelControl();
87
86 // visibility policy for LLUISingleton 88 // visibility policy for LLUISingleton
87 static bool visible(LLFloater* instance, const LLSD& key); 89 static bool visible(LLFloater* instance, const LLSD& key);
88 static void show(LLFloater* instance, const LLSD& key); 90 static void show(LLFloater* instance, const LLSD& key);
diff --git a/linden/indra/newview/llfloaterchatterbox.cpp b/linden/indra/newview/llfloaterchatterbox.cpp
index fc39bce..1ef75d1 100644
--- a/linden/indra/newview/llfloaterchatterbox.cpp
+++ b/linden/indra/newview/llfloaterchatterbox.cpp
@@ -98,7 +98,16 @@ LLFloaterChatterBox::LLFloaterChatterBox(const LLSD& seed) :
98{ 98{
99 mAutoResize = FALSE; 99 mAutoResize = FALSE;
100 100
101 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_chatterbox.xml", NULL, FALSE); 101 // check if vertical tabs is selected
102 if (gSavedSettings.getBOOL("VerticalIMTabs"))
103 {
104 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_chatterbox_vertical.xml", NULL, FALSE);
105 }
106 else
107 {
108 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_chatterbox.xml", NULL, FALSE);
109 }
110
102 if (gSavedSettings.getBOOL("ContactsTornOff")) 111 if (gSavedSettings.getBOOL("ContactsTornOff"))
103 { 112 {
104 LLFloaterMyFriends* floater_contacts = LLFloaterMyFriends::getInstance(0); 113 LLFloaterMyFriends* floater_contacts = LLFloaterMyFriends::getInstance(0);
diff --git a/linden/indra/newview/llfloaterchatterbox.h b/linden/indra/newview/llfloaterchatterbox.h
index ff2f243..552ef81 100644
--- a/linden/indra/newview/llfloaterchatterbox.h
+++ b/linden/indra/newview/llfloaterchatterbox.h
@@ -150,7 +150,14 @@ public:
150 { 150 {
151 if (visible(instance, key)) 151 if (visible(instance, key))
152 { 152 {
153 LLFloaterChatterBox::hideInstance(); 153 if(instance->getHost())
154 {
155 LLFloaterChatterBox::hideInstance();
156 }
157 else
158 {
159 VisibilityPolicy<LLFloater>::hide(instance, key);
160 }
154 } 161 }
155 } 162 }
156 163
diff --git a/linden/indra/newview/llfloatercustomize.cpp b/linden/indra/newview/llfloatercustomize.cpp
index b5dd018..bfca034 100644
--- a/linden/indra/newview/llfloatercustomize.cpp
+++ b/linden/indra/newview/llfloatercustomize.cpp
@@ -220,6 +220,8 @@ public:
220 220
221 childSetAction("Save", onSave, this ); 221 childSetAction("Save", onSave, this );
222 childSetAction("Cancel", onCancel, this ); 222 childSetAction("Cancel", onCancel, this );
223 childSetAction("Check All", onCheckAll, this );
224 childSetAction("Uncheck All", onUncheckAll, this );
223 } 225 }
224 226
225 BOOL getRenameClothing() 227 BOOL getRenameClothing()
@@ -300,6 +302,26 @@ public:
300 LLMakeOutfitDialog* self = (LLMakeOutfitDialog*) userdata; 302 LLMakeOutfitDialog* self = (LLMakeOutfitDialog*) userdata;
301 self->close(); // destroys this object 303 self->close(); // destroys this object
302 } 304 }
305
306 static void onCheckAll( void* userdata )
307 {
308 LLMakeOutfitDialog* self = (LLMakeOutfitDialog*) userdata;
309 for( S32 i = 0; i < (S32)(self->mCheckBoxList.size()); i++)
310 {
311 std::string name = self->mCheckBoxList[i].first;
312 if(self->childIsEnabled(name))self->childSetValue(name,TRUE);
313 }
314 }
315
316 static void onUncheckAll( void* userdata )
317 {
318 LLMakeOutfitDialog* self = (LLMakeOutfitDialog*) userdata;
319 for( S32 i = 0; i < (S32)(self->mCheckBoxList.size()); i++)
320 {
321 std::string name = self->mCheckBoxList[i].first;
322 if(self->childIsEnabled(name))self->childSetValue(name,FALSE);
323 }
324 }
303}; 325};
304 326
305///////////////////////////////////////////////////////////////////// 327/////////////////////////////////////////////////////////////////////
@@ -492,10 +514,26 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart )
492 item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem(mType); 514 item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem(mType);
493 U32 perm_mask = 0x0; 515 U32 perm_mask = 0x0;
494 BOOL is_complete = FALSE; 516 BOOL is_complete = FALSE;
517 bool can_export = false;
518 bool can_import = false;
495 if(item) 519 if(item)
496 { 520 {
497 perm_mask = item->getPermissions().getMaskOwner(); 521 perm_mask = item->getPermissions().getMaskOwner();
498 is_complete = item->isComplete(); 522 is_complete = item->isComplete();
523
524 if (subpart <= 18) // body parts only
525 {
526 can_import = true;
527
528 if (is_complete &&
529 gAgent.getID() == item->getPermissions().getOwner() &&
530 gAgent.getID() == item->getPermissions().getCreator() &&
531 (PERM_ITEM_UNRESTRICTED &
532 perm_mask) == PERM_ITEM_UNRESTRICTED)
533 {
534 can_export = true;
535 }
536 }
499 } 537 }
500 setUIPermissions(perm_mask, is_complete); 538 setUIPermissions(perm_mask, is_complete);
501 BOOL editable = ((perm_mask & PERM_MODIFY) && is_complete) ? TRUE : FALSE; 539 BOOL editable = ((perm_mask & PERM_MODIFY) && is_complete) ? TRUE : FALSE;
@@ -519,7 +557,8 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart )
519 } 557 }
520 gFloaterCustomize->generateVisualParamHints(NULL, sorted_params); 558 gFloaterCustomize->generateVisualParamHints(NULL, sorted_params);
521 gFloaterCustomize->updateScrollingPanelUI(); 559 gFloaterCustomize->updateScrollingPanelUI();
522 560 gFloaterCustomize->childSetEnabled("Export", can_export);
561 gFloaterCustomize->childSetEnabled("Import", can_import);
523 562
524 // Update the camera 563 // Update the camera
525 gMorphView->setCameraTargetJoint( gAgent.getAvatarObject()->getJoint( part->mTargetJoint ) ); 564 gMorphView->setCameraTargetJoint( gAgent.getAvatarObject()->getJoint( part->mTargetJoint ) );
@@ -1188,6 +1227,17 @@ void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata)
1188 F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() ); 1227 F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() );
1189 if (current_weight != new_weight ) 1228 if (current_weight != new_weight )
1190 { 1229 {
1230 LLFloaterCustomize* floater_customize = gFloaterCustomize;
1231 if (!floater_customize) return;
1232
1233 //avatar height stuff -Patrick Sapinski (Wednesday, August 19, 2009)
1234 LLVOAvatar* avatar = gAgent.getAvatarObject();
1235 F32 avatar_size = (avatar->mBodySize.mV[VZ]) + (F32)0.17; //mBodySize is actually quite a bit off.
1236
1237 floater_customize->getChild<LLTextBox>("HeightText")->setValue(llformat("%.2f", avatar_size) + "m");
1238 floater_customize->getChild<LLTextBox>("HeightText2")->setValue(llformat("%.2f",llround(avatar_size / 0.3048)) + "'"
1239 + llformat("%.2f",llround(avatar_size * 39.37) % 12) + "\"");
1240
1191 gAgent.getAvatarObject()->setVisualParamWeight( param, new_weight, FALSE); 1241 gAgent.getAvatarObject()->setVisualParamWeight( param, new_weight, FALSE);
1192 gAgent.getAvatarObject()->updateVisualParams(); 1242 gAgent.getAvatarObject()->updateVisualParams();
1193 } 1243 }
@@ -1429,6 +1479,10 @@ BOOL LLFloaterCustomize::postBuild()
1429 childSetAction("Ok", LLFloaterCustomize::onBtnOk, (void*)this); 1479 childSetAction("Ok", LLFloaterCustomize::onBtnOk, (void*)this);
1430 childSetAction("Cancel", LLFloater::onClickClose, (void*)this); 1480 childSetAction("Cancel", LLFloater::onClickClose, (void*)this);
1431 1481
1482 // reX
1483 childSetAction("Import", LLFloaterCustomize::onBtnImport, (void*)this);
1484 childSetAction("Export", LLFloaterCustomize::onBtnExport, (void*)this);
1485
1432 // Wearable panels 1486 // Wearable panels
1433 initWearablePanels(); 1487 initWearablePanels();
1434 1488
@@ -1494,6 +1548,157 @@ void LLFloaterCustomize::setCurrentWearableType( EWearableType type )
1494 } 1548 }
1495} 1549}
1496 1550
1551
1552// reX: new function
1553void LLFloaterCustomize::onBtnImport( void* userdata )
1554{
1555 LLFilePicker& file_picker = LLFilePicker::instance();
1556 if( !file_picker.getOpenFile( LLFilePicker::FFLOAD_XML ) )
1557 {
1558 // User canceled import.
1559 return;
1560 }
1561
1562 const std::string filename = file_picker.getFirstFile();
1563
1564 FILE* fp = LLFile::fopen(filename, "rb");
1565
1566 //char text_buffer[2048]; /* Flawfinder: ignore */
1567 S32 c;
1568 S32 typ;
1569 S32 count;
1570 S32 param_id=0;
1571 F32 param_weight=0;
1572 S32 fields_read;
1573
1574 for( S32 i=0; i < WT_COUNT; i++ )
1575 {
1576 fields_read = fscanf( fp, "type %d\n", &typ);
1577 if( fields_read != 1 )
1578 {
1579 llwarns << "Bad asset type: early end of file" << llendl;
1580 return;
1581 }
1582
1583 fields_read = fscanf( fp, "parameters %d\n", &count);
1584 if( fields_read != 1 )
1585 {
1586 llwarns << "Bad parameters : early end of file" << llendl;
1587 return;
1588 }
1589 for(c=0;c<count;c++)
1590 {
1591 fields_read = fscanf( fp, "%d %f\n", &param_id, &param_weight );
1592 if( fields_read != 2 )
1593 {
1594 llwarns << "Bad parameters list: early end of file" << llendl;
1595 return;
1596 }
1597 gAgent.getAvatarObject()->setVisualParamWeight( param_id, param_weight, TRUE);
1598 gAgent.getAvatarObject()->updateVisualParams();
1599 }
1600 }
1601
1602
1603
1604 //for( S32 i=0; i < WT_COUNT; i++ )
1605 //{
1606 // fields_read = fscanf( fp, "type %d\n", &typ);
1607 // if( fields_read != 1 )
1608 // {
1609 // llwarns << "Bad asset type: early end of file" << llendl;
1610 // return;
1611 // }
1612 // fields_read = fscanf( fp, "textures %d\n", &count);
1613 // if( fields_read != 1 )
1614 // {
1615 // llwarns << "Bad textures: early end of file" << llendl;
1616 // return;
1617 // }
1618 //
1619 // for(c=0;c<count;c++)
1620 // {
1621 // fields_read = fscanf( fp, "%d %2047s\n",text_buffer);
1622 // if( fields_read != 2 )
1623 // {
1624 // llwarns << "Bad textures list: early end of file" << llendl;
1625 // return;
1626 // }
1627 // }
1628
1629
1630 fclose(fp);
1631 return;
1632}
1633
1634// reX: new function
1635void LLFloaterCustomize::onBtnExport( void* userdata )
1636{
1637 LLFilePicker& file_picker = LLFilePicker::instance();
1638 if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_XML ) )
1639 {
1640 // User canceled export.
1641 return;
1642 }
1643
1644 LLViewerInventoryItem* item;
1645 BOOL is_modifiable;
1646
1647 const std::string filename = file_picker.getFirstFile();
1648
1649 FILE* fp = LLFile::fopen(filename, "wb");
1650
1651 for( S32 i=0; i < WT_COUNT; i++ )
1652 {
1653 is_modifiable = FALSE;
1654 LLWearable* old_wearable = gAgent.getWearable((EWearableType)i);
1655 if( old_wearable )
1656 {
1657 item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem((EWearableType)i);
1658 if(item)
1659 {
1660 const LLPermissions& perm = item->getPermissions();
1661 is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
1662 }
1663 }
1664 if (is_modifiable)
1665 {
1666 old_wearable->FileExportParams(fp);
1667 }
1668 if (!is_modifiable)
1669 {
1670 fprintf( fp, "type %d\n",i);
1671 fprintf( fp, "parameters 0\n");
1672 }
1673 }
1674
1675 for( S32 i=0; i < WT_COUNT; i++ )
1676 {
1677 is_modifiable = FALSE;
1678 LLWearable* old_wearable = gAgent.getWearable((EWearableType)i);
1679 if( old_wearable )
1680 {
1681 item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem((EWearableType)i);
1682 if(item)
1683 {
1684 const LLPermissions& perm = item->getPermissions();
1685 is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
1686 }
1687 }
1688 if (is_modifiable)
1689 {
1690 old_wearable->FileExportTextures(fp);
1691 }
1692 if (!is_modifiable)
1693 {
1694 fprintf( fp, "type %d\n",i);
1695 fprintf( fp, "textures 0\n");
1696 }
1697 }
1698
1699 fclose(fp);
1700}
1701
1497// static 1702// static
1498void LLFloaterCustomize::onBtnOk( void* userdata ) 1703void LLFloaterCustomize::onBtnOk( void* userdata )
1499{ 1704{
@@ -1957,6 +2162,21 @@ void LLFloaterCustomize::draw()
1957 // arrives. Figure out some way to avoid this if possible. 2162 // arrives. Figure out some way to avoid this if possible.
1958 updateInventoryUI(); 2163 updateInventoryUI();
1959 2164
2165 LLFloaterCustomize* floater_customize = gFloaterCustomize;
2166 if (!floater_customize) return;
2167
2168 //KOWs avatar height stuff
2169 LLVOAvatar* avatar = gAgent.getAvatarObject();
2170 F32 avatar_size = (avatar->mBodySize.mV[VZ]) + (F32)0.17; //mBodySize is actually quite a bit off.
2171
2172 floater_customize->getChild<LLTextBox>("HeightText")->setValue(llformat("%.2f", avatar_size) + "m");
2173 //inches = avatar_size * 39.37
2174 //round(inches) + inches % 12
2175 std::string temp = llformat("%.0f",(F32)llfloor(avatar_size / 0.3048));
2176 std::string temp2 = llformat("%.0f",(F32)(llround(avatar_size * 39.37) % 12));
2177 floater_customize->getChild<LLTextBox>("HeightText2")->setValue(temp + "'"
2178 + temp2 + "\"");
2179
1960 LLScrollingPanelParam::sUpdateDelayFrames = 0; 2180 LLScrollingPanelParam::sUpdateDelayFrames = 0;
1961 2181
1962 LLFloater::draw(); 2182 LLFloater::draw();
diff --git a/linden/indra/newview/llfloatercustomize.h b/linden/indra/newview/llfloatercustomize.h
index 28a525e..d0e558f 100644
--- a/linden/indra/newview/llfloatercustomize.h
+++ b/linden/indra/newview/llfloatercustomize.h
@@ -107,6 +107,10 @@ public:
107 107
108 // Callbacks 108 // Callbacks
109 static void onBtnOk( void* userdata ); 109 static void onBtnOk( void* userdata );
110 // reX: new function (thx dudes)
111 static void onBtnImport( void* userdata );
112 // reX: new function
113 static void onBtnExport( void* userdata );
110 static void onBtnMakeOutfit( void* userdata ); 114 static void onBtnMakeOutfit( void* userdata );
111 static void onMakeOutfitCommit( LLMakeOutfitDialog* dialog, void* userdata ); 115 static void onMakeOutfitCommit( LLMakeOutfitDialog* dialog, void* userdata );
112 116
diff --git a/linden/indra/newview/llfloatergroups.cpp b/linden/indra/newview/llfloatergroups.cpp
index 478d39e..874249b 100644
--- a/linden/indra/newview/llfloatergroups.cpp
+++ b/linden/indra/newview/llfloatergroups.cpp
@@ -62,7 +62,7 @@
62std::map<const LLUUID, LLFloaterGroupPicker*> LLFloaterGroupPicker::sInstances; 62std::map<const LLUUID, LLFloaterGroupPicker*> LLFloaterGroupPicker::sInstances;
63 63
64// helper functions 64// helper functions
65void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 powers_mask = GP_ALL_POWERS); 65void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const std::string& none_text, U64 powers_mask = GP_ALL_POWERS);
66 66
67///---------------------------------------------------------------------------- 67///----------------------------------------------------------------------------
68/// Class LLFloaterGroupPicker 68/// Class LLFloaterGroupPicker
@@ -117,7 +117,8 @@ void LLFloaterGroupPicker::setPowersMask(U64 powers_mask)
117 117
118BOOL LLFloaterGroupPicker::postBuild() 118BOOL LLFloaterGroupPicker::postBuild()
119{ 119{
120 init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID(), mPowersMask); 120 const std::string none_text = getString("none");
121 init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID(), none_text, mPowersMask);
121 122
122 childSetAction("OK", onBtnOK, this); 123 childSetAction("OK", onBtnOK, this);
123 124
@@ -201,7 +202,8 @@ void LLPanelGroups::reset()
201 childSetTextArg("groupcount", "[COUNT]", llformat("%d",gAgent.mGroups.count())); 202 childSetTextArg("groupcount", "[COUNT]", llformat("%d",gAgent.mGroups.count()));
202 childSetTextArg("groupcount", "[MAX]", llformat("%d",MAX_AGENT_GROUPS)); 203 childSetTextArg("groupcount", "[MAX]", llformat("%d",MAX_AGENT_GROUPS));
203 204
204 init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID()); 205 const std::string none_text = getString("none");
206 init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID(), none_text);
205 enableButtons(); 207 enableButtons();
206} 208}
207 209
@@ -212,7 +214,8 @@ BOOL LLPanelGroups::postBuild()
212 childSetTextArg("groupcount", "[COUNT]", llformat("%d",gAgent.mGroups.count())); 214 childSetTextArg("groupcount", "[COUNT]", llformat("%d",gAgent.mGroups.count()));
213 childSetTextArg("groupcount", "[MAX]", llformat("%d",MAX_AGENT_GROUPS)); 215 childSetTextArg("groupcount", "[MAX]", llformat("%d",MAX_AGENT_GROUPS));
214 216
215 init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID()); 217 const std::string none_text = getString("none");
218 init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID(), none_text);
216 219
217 childSetAction("Activate", onBtnActivate, this); 220 childSetAction("Activate", onBtnActivate, this);
218 221
@@ -460,7 +463,7 @@ void LLPanelGroups::onGroupList(LLUICtrl* ctrl, void* userdata)
460 if(self) self->enableButtons(); 463 if(self) self->enableButtons();
461} 464}
462 465
463void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 powers_mask) 466void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, const std::string& none_text, U64 powers_mask)
464{ 467{
465 S32 count = gAgent.mGroups.count(); 468 S32 count = gAgent.mGroups.count();
466 LLUUID id; 469 LLUUID id;
@@ -502,7 +505,7 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 pow
502 LLSD element; 505 LLSD element;
503 element["id"] = LLUUID::null; 506 element["id"] = LLUUID::null;
504 element["columns"][0]["column"] = "name"; 507 element["columns"][0]["column"] = "name";
505 element["columns"][0]["value"] = "none"; // *TODO: Translate 508 element["columns"][0]["value"] = none_text;
506 element["columns"][0]["font"] = "SANSSERIF"; 509 element["columns"][0]["font"] = "SANSSERIF";
507 element["columns"][0]["font-style"] = style; 510 element["columns"][0]["font-style"] = style;
508 511
diff --git a/linden/indra/newview/llfloaterinspect.cpp b/linden/indra/newview/llfloaterinspect.cpp
index 145ad80..4822bb0 100644
--- a/linden/indra/newview/llfloaterinspect.cpp
+++ b/linden/indra/newview/llfloaterinspect.cpp
@@ -43,6 +43,10 @@
43#include "llviewerobject.h" 43#include "llviewerobject.h"
44#include "lluictrlfactory.h" 44#include "lluictrlfactory.h"
45 45
46// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
47#include "rlvhandler.h"
48// [/RLVa:KB]
49
46LLFloaterInspect* LLFloaterInspect::sInstance = NULL; 50LLFloaterInspect* LLFloaterInspect::sInstance = NULL;
47 51
48LLFloaterInspect::LLFloaterInspect(void) : 52LLFloaterInspect::LLFloaterInspect(void) :
@@ -146,7 +150,13 @@ void LLFloaterInspect::onClickOwnerProfile(void* ctrl)
146 if(node) 150 if(node)
147 { 151 {
148 const LLUUID& owner_id = node->mPermissions->getOwner(); 152 const LLUUID& owner_id = node->mPermissions->getOwner();
149 LLFloaterAvatarInfo::showFromDirectory(owner_id); 153// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
154 if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
155 {
156 LLFloaterAvatarInfo::showFromDirectory(owner_id);
157 }
158// [/RLVa:KB]
159// LLFloaterAvatarInfo::showFromDirectory(owner_id);
150 } 160 }
151 } 161 }
152} 162}
@@ -164,7 +174,10 @@ void LLFloaterInspect::onSelectObject(LLUICtrl* ctrl, void* user_data)
164{ 174{
165 if(LLFloaterInspect::getSelectedUUID() != LLUUID::null) 175 if(LLFloaterInspect::getSelectedUUID() != LLUUID::null)
166 { 176 {
167 sInstance->childSetEnabled("button owner", true); 177 //sInstance->childSetEnabled("button owner", true);
178// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-1.0.0e
179 sInstance->childSetEnabled("button owner", !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
180// [/RLVa:KB]
168 sInstance->childSetEnabled("button creator", true); 181 sInstance->childSetEnabled("button creator", true);
169 } 182 }
170} 183}
@@ -224,6 +237,13 @@ void LLFloaterInspect::refresh()
224 LLStringUtil::copy(time, ctime(&timestamp), MAX_STRING); 237 LLStringUtil::copy(time, ctime(&timestamp), MAX_STRING);
225 time[24] = '\0'; 238 time[24] = '\0';
226 gCacheName->getFullName(obj->mPermissions->getOwner(), owner_name); 239 gCacheName->getFullName(obj->mPermissions->getOwner(), owner_name);
240// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
241 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
242 {
243 // TODO-RLVa: shouldn't filter if this is a group-owned prim (will show "(nobody)")
244 owner_name = gRlvHandler.getAnonym(owner_name);
245 }
246// [/RLVa:KB]
227 gCacheName->getFullName(obj->mPermissions->getCreator(), creator_name); 247 gCacheName->getFullName(obj->mPermissions->getCreator(), creator_name);
228 row["id"] = obj->getObject()->getID(); 248 row["id"] = obj->getObject()->getID();
229 row["columns"][0]["column"] = "object_name"; 249 row["columns"][0]["column"] = "object_name";
diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp
index 94a8345..08c04ab 100644
--- a/linden/indra/newview/llfloaterland.cpp
+++ b/linden/indra/newview/llfloaterland.cpp
@@ -820,6 +820,12 @@ void LLPanelLandGeneral::setGroup(const LLUUID& group_id)
820// static 820// static
821void LLPanelLandGeneral::onClickBuyLand(void* data) 821void LLPanelLandGeneral::onClickBuyLand(void* data)
822{ 822{
823// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
824 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) )
825 {
826 return;
827 }
828// [/RLVa:KB]
823 BOOL* for_group = (BOOL*)data; 829 BOOL* for_group = (BOOL*)data;
824 LLViewerParcelMgr::getInstance()->startBuyLand(*for_group); 830 LLViewerParcelMgr::getInstance()->startBuyLand(*for_group);
825} 831}
@@ -2878,3 +2884,41 @@ void LLPanelLandCovenant::updateEstateOwnerName(const std::string& name)
2878 if (editor) editor->setText(name); 2884 if (editor) editor->setText(name);
2879 } 2885 }
2880} 2886}
2887
2888// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
2889void LLFloaterLand::open()
2890{
2891 // We'll allow "About Land" as long as you have the ability to return prims (through ownership or through group powers)
2892 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
2893 {
2894 LLParcelSelection* pParcelSel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection();
2895 if ( (!pParcelSel) || (pParcelSel->hasOthersSelected()) )
2896 return;
2897 LLParcel* pParcel = pParcelSel->getParcel();
2898 if (!pParcel)
2899 return;
2900
2901 // Ideally we could just use LLViewerParcelMgr::isParcelOwnedByAgent(), but that has that sneaky exemption
2902 // for fake god like (aka View Admin Options)
2903 const LLUUID& idOwner = pParcel->getOwnerID();
2904 if ( (idOwner != gAgent.getID()) )
2905 {
2906 // *sighs* LLAgent::hasPowerInGroup() has it too so copy/paste from there
2907 S32 count = gAgent.mGroups.count(); bool fShow = false;
2908 for (S32 i = 0; i < count; ++i)
2909 {
2910 if (gAgent.mGroups.get(i).mID == idOwner)
2911 {
2912 fShow |= ((gAgent.mGroups.get(i).mPowers & GP_LAND_RETURN) > 0);
2913 break;
2914 }
2915 }
2916
2917 if (!fShow)
2918 return;
2919 }
2920 }
2921
2922 LLFloater::open();
2923}
2924// [/RLVa:KB]
diff --git a/linden/indra/newview/llfloaterland.h b/linden/indra/newview/llfloaterland.h
index 4c3de65..113b679 100644
--- a/linden/indra/newview/llfloaterland.h
+++ b/linden/indra/newview/llfloaterland.h
@@ -85,6 +85,10 @@ public:
85 virtual void onOpen(); 85 virtual void onOpen();
86 virtual BOOL postBuild(); 86 virtual BOOL postBuild();
87 87
88// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
89 virtual void open();
90// [/RLVa:KB]
91
88protected: 92protected:
89 93
90 // Does its own instance management, so clients not allowed 94 // Does its own instance management, so clients not allowed
diff --git a/linden/indra/newview/llfloatermap.cpp b/linden/indra/newview/llfloatermap.cpp
index 3b1e4c7..85057ee 100644
--- a/linden/indra/newview/llfloatermap.cpp
+++ b/linden/indra/newview/llfloatermap.cpp
@@ -43,14 +43,45 @@
43#include "llresizebar.h" 43#include "llresizebar.h"
44#include "lluictrlfactory.h" 44#include "lluictrlfactory.h"
45 45
46// radar
47#include "llchat.h"
48#include "llfirstuse.h"
49#include "llfloateravatarinfo.h"
50#include "llfloaterchat.h"
51#include "llfloaterfriends.h"
52#include "llfloatergroupinvite.h"
53#include "llfloatergroups.h"
54#include "llfloaterreporter.h"
55#include "llimview.h"
56#include "llmutelist.h"
57#include "llparcel.h"
58#include "llregionposition.h"
59#include "roles_constants.h"
60#include "llscrolllistctrl.h"
61#include "lltracker.h"
62#include "llviewerobjectlist.h"
63#include "llviewermenu.h"
64#include "llviewermessage.h"
65#include "llviewerparcelmgr.h"
66#include "llviewerregion.h"
67#include "llviewerwindow.h"
68#include "llvoavatar.h"
69#include "llworld.h"
70
46LLFloaterMap::LLFloaterMap(const LLSD& key) 71LLFloaterMap::LLFloaterMap(const LLSD& key)
47 : 72 :
48 LLFloater(std::string("minimap")), 73 LLFloater(std::string("minimap")),
49 mPanelMap(NULL) 74 mPanelMap(NULL),
75 mUpdate(TRUE),
76 mSelectedAvatar(LLUUID::null)
77
50{ 78{
51 LLCallbackMap::map_t factory_map; 79 LLCallbackMap::map_t factory_map;
52 factory_map["mini_mapview"] = LLCallbackMap(createPanelMiniMap, this); 80 factory_map["mini_mapview"] = LLCallbackMap(createPanelMiniMap, this);
53 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_mini_map.xml", &factory_map, FALSE); 81 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_mini_map.xml", &factory_map, FALSE);
82
83 mChatAvatars.clear();
84 mTypingAvatars.clear();
54} 85}
55 86
56 87
@@ -66,8 +97,33 @@ BOOL LLFloaterMap::postBuild()
66{ 97{
67 // Send the drag handle to the back, but make sure close stays on top 98 // Send the drag handle to the back, but make sure close stays on top
68 sendChildToBack(getDragHandle()); 99 sendChildToBack(getDragHandle());
100 sendChildToFront(getChild<LLButton>("llfloater_minimize_btn"));
69 sendChildToFront(getChild<LLButton>("llfloater_close_btn")); 101 sendChildToFront(getChild<LLButton>("llfloater_close_btn"));
70 setIsChrome(TRUE); 102 setIsChrome(TRUE);
103
104 mRadarList = getChild<LLScrollListCtrl>("RadarList");
105 childSetCommitCallback("RadarList", onList, this);
106 mRadarList->setDoubleClickCallback(onClickIM);
107
108 childSetFocusChangedCallback("near_me_range", onRangeChange, this);
109
110 childSetAction("im_btn", onClickIM, this);
111 childSetAction("profile_btn", onClickProfile, this);
112 childSetAction("offer_teleport_btn", onClickOfferTeleport, this);
113 childSetAction("track_btn", onClickTrack, this);
114 childSetAction("invite_btn", onClickInvite, this);
115 childSetAction("add_btn", onClickAddFriend, this);
116 childSetAction("freeze_btn", onClickFreeze, this);
117 childSetAction("eject_btn", onClickEject, this);
118 childSetAction("mute_btn", onClickMute, this);
119 childSetAction("unmute_btn", onClickUnmute, this);
120 childSetAction("ar_btn", onClickAR, this);
121 childSetAction("estate_eject_btn", onClickEjectFromEstate, this);
122
123 setDefaultBtn("im_btn");
124
125 populateRadar();
126
71 return TRUE; 127 return TRUE;
72} 128}
73 129
@@ -123,3 +179,839 @@ void LLFloaterMap::draw()
123 } 179 }
124} 180}
125 181
182// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-05 (RLVa-1.0.0c)
183void LLFloaterMap::open()
184{
185 if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWMINIMAP))
186 {
187 LLFloater::open();
188 LLFirstUse::useMiniMap();
189 }
190}
191// [/RLVa:KB]
192
193// TODO: make this detachable
194// TODO: make this expand/collapse
195
196/*
197* Imprudence Radar
198* @brief inworld radar integrated with the minimap
199* by McCabe Maxsted
200* Estate tab portion by Dale Glass
201*/
202
203//static
204bool LLFloaterMap::isImpDev(LLUUID agent_id)
205{
206 // We use strings here as avatar keys change across grids.
207 // Feel free to add/remove yourself.
208 std::string agent_name = getSelectedName(agent_id);
209 if (agent_name == "McCabe Maxsted" ||
210 agent_name == "Jacek Antonelli" ||
211 agent_name == "Armin Weatherwax")
212 {
213 return true;
214 }
215 return false;
216}
217
218//static
219void LLFloaterMap::updateRadar()
220{
221 LLFloaterMap::getInstance()->populateRadar();
222}
223
224void LLFloaterMap::populateRadar()
225{
226 if (!mUpdate || !LLFloaterMap::getInstance()->getVisible())
227 {
228 return;
229 }
230
231 if (visibleItemsSelected())
232 {
233 mSelectedAvatar = mRadarList->getFirstSelected()->getUUID();
234 }
235 else
236 {
237 mSelectedAvatar.setNull();
238 }
239
240 S32 scroll_pos = mRadarList->getScrollPos();
241
242 // clear count
243 std::stringstream avatar_count;
244 avatar_count.str("");
245
246 // find what avatars you can see
247 F32 range = gSavedSettings.getF32("NearMeRange");
248 LLVector3d current_pos = gAgent.getPositionGlobal();
249 std::vector<LLUUID> avatar_ids;
250 std::vector<LLVector3d> positions;
251 LLWorld::getInstance()->getAvatars(&avatar_ids, &positions);
252
253 LLSD element;
254
255 mRadarList->deleteAllItems();
256
257 if (!avatar_ids.empty())
258 {
259 for (U32 i=0; i<avatar_ids.size(); i++)
260 {
261 if (avatar_ids[i] == gAgent.getID() ||
262 avatar_ids[i].isNull())
263 {
264 continue;
265 }
266
267 // Add to list only if we get their name
268 std::string fullname = getSelectedName(avatar_ids[i]);
269 if (!fullname.empty())
270 {
271 bool notify_chat = gSavedSettings.getBOOL("MiniMapNotifyChatRange");
272 bool notify_sim = gSavedSettings.getBOOL("MiniMapNotifySimRange");
273 // [RLVa:KB] - Alternate: Imprudence-1.2.0
274 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
275 {
276 fullname = gRlvHandler.getAnonym(fullname);
277 notify_chat = false;
278 notify_sim = false;
279 }
280 // [/RLVa:KB]
281
282 // check if they're in certain ranges and notify user if we've enabled that
283 LLVector3d temp = positions[i] - current_pos;
284 F32 distance = llround((F32)temp.magVec(), 0.1f);
285 /*char dist[32];
286 sprintf(dist, "%.1f", distance);
287 std::string dist_string = dist;*/
288 std::string dist_string = llformat("%.1f", distance);
289
290 if (notify_chat)
291 {
292 if (distance < 20.0f)
293 {
294 if (!isInChatList(avatar_ids[i]))
295 {
296 addToChatList(avatar_ids[i], dist_string);
297 }
298 }
299 else
300 {
301 if (isInChatList(avatar_ids[i]))
302 {
303 removeFromChatList(avatar_ids[i]);
304 }
305 }
306 updateChatList(avatar_ids);
307 }
308 else if (!mChatAvatars.empty())
309 {
310 mChatAvatars.clear();
311 }
312
313 if (notify_sim)
314 {
315 if (!isInChatList(avatar_ids[i]) && !getInSimAvList(avatar_ids[i]))
316 {
317 LLViewerObject *av_obj = gObjectList.findObject(avatar_ids[i]);
318 if (av_obj != NULL && av_obj->isAvatar())
319 {
320 LLVOAvatar* avatarp = (LLVOAvatar*)av_obj;
321 if (avatarp != NULL)
322 {
323 if (avatarp->getRegion() == gAgent.getRegion())
324 {
325 addToSimAvList(avatar_ids[i], dist_string);
326 }
327 }
328 }
329 }
330 updateSimAvList(avatar_ids);
331 }
332 else if (!mSimAvatars.empty())
333 {
334 mSimAvatars.clear();
335 }
336
337 // only display avatars in range
338 if (distance <= range)
339 {
340 // append typing string
341 std::string typing = "";
342 if (isTyping(avatar_ids[i]))
343 {
344 typing = getString("is_typing")+ " ";
345 }
346
347 std::string mute_text = LLMuteList::getInstance()->isMuted(avatar_ids[i]) ? getString("is_muted") : "";
348 element["id"] = avatar_ids[i];
349 element["columns"][0]["column"] = "avatar_name";
350 element["columns"][0]["type"] = "text";
351 element["columns"][0]["value"] = typing + fullname + " " + mute_text;
352 element["columns"][1]["column"] = "avatar_distance";
353 element["columns"][1]["type"] = "text";
354 element["columns"][1]["value"] = dist_string+"m";
355
356 mRadarList->addElement(element, ADD_BOTTOM);
357 }
358 }
359 }
360
361 mRadarList->sortItems();
362 mRadarList->setScrollPos(scroll_pos);
363 if (mSelectedAvatar.notNull())
364 {
365 mRadarList->selectByID(mSelectedAvatar);
366 }
367 avatar_count << (int)avatar_ids.size();
368 }
369 else
370 {
371 mTypingAvatars.clear();
372 mRadarList->addCommentText(getString("no_one_near"), ADD_TOP);
373 avatar_count << "0";
374 }
375
376 childSetText("lblAvatarCount", avatar_count.str());
377
378 toggleButtons();
379
380 //llinfos << "mSelectedAvatar: " << mSelectedAvatar.asString() << llendl;
381}
382
383void LLFloaterMap::updateChatList(std::vector<LLUUID> agent_ids)
384{
385 std::set<LLUUID>::iterator it;
386 std::vector<LLUUID>::iterator result;
387 for (it = mChatAvatars.begin(); it != mChatAvatars.end(); )
388 {
389 result = find(agent_ids.begin(), agent_ids.end(), *it);
390 if (result == agent_ids.end())
391 {
392 mChatAvatars.erase(it++);
393 }
394 else
395 {
396 it++;
397 }
398 }
399}
400
401bool LLFloaterMap::isInChatList(LLUUID agent_id)
402{
403 if (mChatAvatars.count(agent_id) > 0)
404 {
405 return true;
406 }
407 return false;
408}
409
410void LLFloaterMap::addToChatList(LLUUID agent_id, std::string distance)
411{
412 mChatAvatars.insert(agent_id);
413 LLChat chat;
414
415 LLUIString notify = getString("entering_chat_range");
416 notify.setArg("[NAME]", getSelectedName(agent_id));
417 notify.setArg("[DISTANCE]", distance);
418
419 chat.mText = notify;
420 chat.mSourceType = CHAT_SOURCE_SYSTEM;
421 LLFloaterChat::addChat(chat, FALSE, FALSE);
422}
423
424void LLFloaterMap::removeFromChatList(LLUUID agent_id)
425{
426 // Do we want to add a notice?
427 mChatAvatars.erase(agent_id);
428}
429
430bool LLFloaterMap::isTyping(LLUUID agent_id)
431{
432 if (mTypingAvatars.count(agent_id) > 0)
433 {
434 return true;
435 }
436 return false;
437}
438
439void LLFloaterMap::updateTypingList(LLUUID agent_id, bool remove)
440{
441 if (remove)
442 {
443 if (isTyping(agent_id))
444 {
445 mTypingAvatars.erase(agent_id);
446 }
447 }
448 else
449 {
450 mTypingAvatars.insert(agent_id);
451 }
452}
453
454void LLFloaterMap::updateSimAvList(std::vector<LLUUID> agent_ids)
455{
456 std::set<LLUUID>::iterator it;
457 std::vector<LLUUID>::iterator result;
458 for (it = mSimAvatars.begin(); it != mSimAvatars.end(); )
459 {
460 result = find(agent_ids.begin(), agent_ids.end(), *it);
461 if (result == agent_ids.end())
462 {
463 mSimAvatars.erase(it++);
464 }
465 else
466 {
467 it++;
468 }
469 }
470}
471
472void LLFloaterMap::addToSimAvList(LLUUID agent_id, std::string distance)
473{
474 mSimAvatars.insert(agent_id);
475 LLChat chat;
476
477 LLUIString notify = getString("entering_sim_range");
478 notify.setArg("[NAME]", getSelectedName(agent_id));
479 notify.setArg("[DISTANCE]", distance);
480
481 chat.mText = notify;
482 chat.mSourceType = CHAT_SOURCE_SYSTEM;
483 LLFloaterChat::addChat(chat, FALSE, FALSE);
484}
485
486bool LLFloaterMap::getInSimAvList(LLUUID agent_id)
487{
488 if (mSimAvatars.count(agent_id) > 0)
489 {
490 return true;
491 }
492 return false;
493}
494
495void LLFloaterMap::toggleButtons()
496{
497 BOOL enable = FALSE;
498 BOOL enable_unmute = FALSE;
499 BOOL enable_track = FALSE;
500 BOOL enable_estate = FALSE;
501 BOOL enable_friend = FALSE;
502 if (childHasFocus("RadarPanel"))
503 {
504 enable = mSelectedAvatar.notNull() ? visibleItemsSelected() : FALSE;
505 enable_unmute = mSelectedAvatar.notNull() ? LLMuteList::getInstance()->isMuted(mSelectedAvatar) : FALSE;
506 enable_track = gAgent.isGodlike() || is_agent_mappable(mSelectedAvatar);
507 enable_estate = isKickable(mSelectedAvatar);
508 enable_friend = !is_agent_friend(mSelectedAvatar);
509 }
510 else
511 {
512 mRadarList->deselect();
513 }
514
515 childSetEnabled("im_btn", enable);
516 childSetEnabled("profile_btn", enable);
517 childSetEnabled("offer_teleport_btn", enable);
518 childSetEnabled("track_btn", enable_track);
519 childSetEnabled("invite_btn", enable);
520 childSetEnabled("add_btn", enable);
521 childSetEnabled("freeze_btn", enable_estate);
522 childSetEnabled("eject_btn", enable_estate);
523 childSetEnabled("mute_btn", enable);
524 childSetEnabled("ar_btn", enable);
525 childSetEnabled("estate_eject_btn", enable_estate);
526
527 if (enable_unmute)
528 {
529 childSetVisible("mute_btn", false);
530 childSetEnabled("unmute_btn", true);
531 childSetVisible("unmute_btn", true);
532 }
533 else
534 {
535 childSetVisible("mute_btn", true);
536 childSetVisible("unmute_btn", false);
537 }
538
539// [RLVa:KB] - Imprudence-1.2.0
540 // Bit clumsy, but this way the RLV stuff is in its own separate block and keeps the code above clean - Kitty
541 if ( (rlv_handler_t::isEnabled()) && (mSelectedAvatar.notNull()) )
542 {
543 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
544 {
545 childSetEnabled("im_btn", FALSE);
546 childSetEnabled("profile_btn", FALSE);
547 childSetEnabled("invite_btn", FALSE);
548 childSetEnabled("add_btn", FALSE);
549 childSetEnabled("mute_btn", FALSE);
550 childSetEnabled("unmute_btn", FALSE);
551 }
552
553 // Even though the avie is in the same sim (so they already know where we are) the tp would just get blocked by different code
554 // so it's actually less confusing to the user if we just disable the teleport button here so they'll at least have a visual cue
555 BOOL rlv_enable_tp = (!gRlvHandler.hasBehaviour(RLV_BHVR_TPLURE)) || (gRlvHandler.isException(RLV_BHVR_TPLURE, mSelectedAvatar));
556 if ( (rlv_enable_tp) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) )
557 {
558 const LLRelationship* pBuddyInfo = LLAvatarTracker::instance().getBuddyInfo(mSelectedAvatar);
559 if ( ((!pBuddyInfo) || (!pBuddyInfo->isOnline()) || (!pBuddyInfo->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION))) )
560 rlv_enable_tp = FALSE;
561 }
562 childSetEnabled("offer_teleport_btn", rlv_enable_tp);
563 }
564// [/RLVa:KB]
565}
566
567BOOL LLFloaterMap::isKickable(const LLUUID &agent_id)
568{
569 if (agent_id.notNull())
570 {
571 LLViewerObject* av_obj = gObjectList.findObject(agent_id);
572 if (av_obj != NULL && av_obj->isAvatar())
573 {
574 LLVOAvatar* avatar = (LLVOAvatar*)av_obj;
575 LLViewerRegion* region = avatar->getRegion();
576 if (region)
577 {
578 const LLVector3& pos = avatar->getPositionRegion();
579 const LLVector3d& pos_global = avatar->getPositionGlobal();
580 if (LLWorld::getInstance()->positionRegionValidGlobal(pos_global))
581 {
582 LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
583 LLViewerParcelMgr::getInstance()->deselectLand();
584
585 BOOL new_value = (region != NULL);
586
587 if (new_value)
588 {
589 new_value = region->isOwnedSelf(pos);
590 if (!new_value || region->isOwnedGroup(pos))
591 {
592 new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
593 }
594 }
595 return new_value;
596 }
597 }
598 }
599 }
600 return FALSE;
601}
602
603// static
604void LLFloaterMap::onList(LLUICtrl* ctrl, void* user_data)
605{
606 LLFloaterMap* self = (LLFloaterMap*)user_data;
607 if (self)
608 {
609 self->toggleButtons();
610 }
611}
612
613BOOL LLFloaterMap::visibleItemsSelected() const
614{
615 if (mRadarList->getFirstSelectedIndex() >= 0)
616 {
617 return TRUE;
618 }
619 return FALSE;
620}
621
622// static
623void LLFloaterMap::onRangeChange(LLFocusableElement* focus, void* user_data)
624{
625 LLFloaterMap* self = (LLFloaterMap*)user_data;
626 if (self)
627 {
628 self->mUpdate = !(self->childHasFocus("near_me_range"));
629 }
630}
631
632// static
633LLUUID LLFloaterMap::getSelected()
634{
635 return LLFloaterMap::getInstance()->mSelectedAvatar;
636}
637
638//
639// Avatar tab
640//
641
642// static
643void LLFloaterMap::onClickIM(void* user_data)
644{
645 LLFloaterMap* self = (LLFloaterMap*) user_data;
646 LLScrollListItem *item = self->mRadarList->getFirstSelected();
647 if (item != NULL)
648 {
649 LLUUID agent_id = item->getUUID();
650 gIMMgr->setFloaterOpen(TRUE);
651 gIMMgr->addSession(getSelectedName(agent_id), IM_NOTHING_SPECIAL, agent_id);
652 }
653}
654
655// static
656void LLFloaterMap::onClickProfile(void* user_data)
657{
658 LLFloaterMap* self = (LLFloaterMap*) user_data;
659 LLScrollListItem *item = self->mRadarList->getFirstSelected();
660 if (item != NULL)
661 {
662 LLUUID agent_id = item->getUUID();
663 LLFloaterAvatarInfo::show(agent_id);
664 }
665}
666
667// static
668void LLFloaterMap::onClickOfferTeleport(void* user_data)
669{
670 LLFloaterMap* self = (LLFloaterMap*) user_data;
671 LLScrollListItem *item = self->mRadarList->getFirstSelected();
672 if (item != NULL)
673 {
674 LLUUID agent_id = item->getUUID();
675 handle_lure(agent_id);
676 }
677}
678
679// static
680void LLFloaterMap::onClickTrack(void* user_data)
681{
682 LLFloaterMap* self = (LLFloaterMap*) user_data;
683 LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus();
684
685 if (LLTracker::TRACKING_AVATAR == tracking_status)
686 {
687 LLTracker::stopTracking(NULL);
688 }
689 else
690 {
691 LLScrollListItem *item = self->mRadarList->getFirstSelected();
692 if (item != NULL)
693 {
694 LLUUID agent_id = item->getUUID();
695 LLTracker::trackAvatar(agent_id, getSelectedName(agent_id));
696 }
697 }
698}
699
700// static
701void LLFloaterMap::onClickInvite(void* user_data)
702{
703 LLFloaterMap* self = (LLFloaterMap*) user_data;
704 LLScrollListItem *item = self->mRadarList->getFirstSelected();
705 if (item != NULL)
706 {
707 LLUUID agent_id = item->getUUID();
708 LLFloaterGroupPicker* widget;
709 widget = LLFloaterGroupPicker::showInstance(LLSD(gAgent.getID()));
710 if (widget)
711 {
712 widget->center();
713 widget->setPowersMask(GP_MEMBER_INVITE);
714 widget->setSelectCallback(callback_invite_to_group, (void *)&agent_id);
715 }
716 }
717}
718
719// static
720void LLFloaterMap::callback_invite_to_group(LLUUID group_id, void *user_data)
721{
722 std::vector<LLUUID> agent_ids;
723 agent_ids.push_back(*(LLUUID *)user_data);
724
725 LLFloaterGroupInvite::showForGroup(group_id, &agent_ids);
726}
727
728// static
729void LLFloaterMap::onClickAddFriend(void* user_data)
730{
731 LLFloaterMap* self = (LLFloaterMap*) user_data;
732 LLScrollListItem *item = self->mRadarList->getFirstSelected();
733 if (item != NULL)
734 {
735 LLUUID agent_id = item->getUUID();
736 LLPanelFriends::requestFriendshipDialog(agent_id, getSelectedName(agent_id));
737 }
738}
739
740//
741// Estate tab
742//
743
744//static
745std::string LLFloaterMap::getSelectedName(const LLUUID &agent_id)
746{
747 std::string agent_name;
748 if(gCacheName->getFullName(agent_id, agent_name) && agent_name != " ")
749 {
750 return agent_name;
751 }
752 return LLStringUtil::null;
753}
754
755//static
756void LLFloaterMap::callbackFreeze(S32 option, void *user_data)
757{
758 LLFloaterMap *self = (LLFloaterMap*)user_data;
759
760 if ( option == 0 )
761 {
762 sendFreeze(self->mSelectedAvatar, true);
763 }
764 else if ( option == 1 )
765 {
766 sendFreeze(self->mSelectedAvatar, false);
767 }
768}
769
770//static
771void LLFloaterMap::callbackEject(S32 option, void *user_data)
772{
773 LLFloaterMap *self = (LLFloaterMap*)user_data;
774
775 if ( option == 0 )
776 {
777 sendEject(self->mSelectedAvatar, false);
778 }
779 else if ( option == 1 )
780 {
781 sendEject(self->mSelectedAvatar, true);
782 }
783}
784
785//static
786void LLFloaterMap::callbackEjectFromEstate(S32 option, void *user_data)
787{
788 LLFloaterMap *self = (LLFloaterMap*)user_data;
789
790 if ( option == 0 )
791 {
792 cmdEstateEject(self->mSelectedAvatar);
793 }
794 else if ( option == 1 )
795 {
796 cmdEstateBan(self->mSelectedAvatar);
797 }
798}
799
800void LLFloaterMap::onClickFreeze(void *user_data)
801{
802 LLFloaterMap *self = (LLFloaterMap*)user_data;
803 LLStringUtil::format_map_t args;
804 LLSD payload;
805 args["[AVATAR_NAME]"] = getSelectedName(self->mSelectedAvatar);
806 gViewerWindow->alertXml("FreezeAvatarFullname", args, callbackFreeze, user_data);
807}
808
809//static
810void LLFloaterMap::onClickEject(void *user_data)
811{
812 LLFloaterMap *self = (LLFloaterMap*)user_data;
813 LLStringUtil::format_map_t args;
814 LLSD payload;
815 args["AVATAR_NAME"] = getSelectedName(self->mSelectedAvatar);
816 gViewerWindow->alertXml("EjectAvatarFullName", args, callbackEject, user_data);
817}
818
819//static
820void LLFloaterMap::onClickMute(void *user_data)
821{
822 LLFloaterMap *self = (LLFloaterMap*)user_data;
823 LLScrollListItem *item = self->mRadarList->getFirstSelected();
824 if (item != NULL)
825 {
826 LLUUID agent_id = item->getUUID();
827 std::string agent_name = getSelectedName(agent_id);
828 if (LLMuteList::getInstance()->isMuted(agent_id))
829 {
830 //LLMute mute(agent_id, agent_name, LLMute::AGENT);
831 //LLMuteList::getInstance()->remove(mute);
832 //LLFloaterMute::getInstance()->selectMute(agent_id);
833 }
834 else
835 {
836 LLMute mute(agent_id, agent_name, LLMute::AGENT);
837 LLMuteList::getInstance()->add(mute);
838 }
839 }
840}
841
842//static
843void LLFloaterMap::onClickUnmute(void *user_data)
844{
845 LLFloaterMap *self = (LLFloaterMap*)user_data;
846 LLScrollListItem *item = self->mRadarList->getFirstSelected();
847 if (item != NULL)
848 {
849 LLUUID agent_id = item->getUUID();
850 std::string agent_name = getSelectedName(agent_id);
851 if (LLMuteList::getInstance()->isMuted(agent_id))
852 {
853 LLMute mute(agent_id, agent_name, LLMute::AGENT);
854 LLMuteList::getInstance()->remove(mute);
855 //LLFloaterMute::getInstance()->selectMute(agent_id);
856 }
857 else
858 {
859 //LLMute mute(agent_id, agent_name, LLMute::AGENT);
860 //LLMuteList::getInstance()->add(mute);
861 }
862 }
863}
864
865//static
866void LLFloaterMap::onClickEjectFromEstate(void *user_data)
867{
868 LLFloaterMap *self = (LLFloaterMap*)user_data;
869 LLStringUtil::format_map_t args;
870 LLSD payload;
871 args["EVIL_USER"] = getSelectedName(self->mSelectedAvatar);
872 gViewerWindow->alertXml("EstateKickUser", args, callbackEjectFromEstate, user_data);
873}
874
875//static
876void LLFloaterMap::onClickAR(void *user_data)
877{
878 LLFloaterMap *self = (LLFloaterMap*)user_data;
879 LLUUID agent_id = self->mSelectedAvatar;
880
881 if (agent_id.notNull())
882 {
883 LLFloaterReporter::showFromObject(agent_id);
884 }
885}
886
887// static
888void LLFloaterMap::cmdEstateEject(const LLUUID &avatar)
889{
890 sendEstateMessage("teleporthomeuser", avatar);
891}
892
893// static
894void LLFloaterMap::cmdEstateBan(const LLUUID &avatar)
895{
896 sendEstateMessage("teleporthomeuser", avatar); // Kick first, just to be sure
897 sendEstateBan(avatar);
898}
899
900// static
901void LLFloaterMap::sendFreeze(const LLUUID& avatar_id, bool freeze)
902{
903 U32 flags = 0x0;
904 if (!freeze)
905 {
906 // unfreeze
907 flags |= 0x1;
908 }
909
910 LLMessageSystem* msg = gMessageSystem;
911 LLViewerObject* avatar = gObjectList.findObject(avatar_id);
912
913 if (avatar)
914 {
915 msg->newMessage("FreezeUser");
916 msg->nextBlock("AgentData");
917 msg->addUUID("AgentID", gAgent.getID());
918 msg->addUUID("SessionID", gAgent.getSessionID());
919 msg->nextBlock("Data");
920 msg->addUUID("TargetID", avatar_id );
921 msg->addU32("Flags", flags );
922 msg->sendReliable( avatar->getRegion()->getHost() );
923 }
924}
925
926// static
927void LLFloaterMap::sendEject(const LLUUID& avatar_id, bool ban)
928{
929 LLMessageSystem* msg = gMessageSystem;
930 LLViewerObject* avatar = gObjectList.findObject(avatar_id);
931
932 if (avatar)
933 {
934 U32 flags = 0x0;
935 if ( ban )
936 {
937 // eject and add to ban list
938 flags |= 0x1;
939 }
940
941 msg->newMessage("EjectUser");
942 msg->nextBlock("AgentData");
943 msg->addUUID("AgentID", gAgent.getID() );
944 msg->addUUID("SessionID", gAgent.getSessionID() );
945 msg->nextBlock("Data");
946 msg->addUUID("TargetID", avatar_id );
947 msg->addU32("Flags", flags );
948 msg->sendReliable( avatar->getRegion()->getHost() );
949 }
950}
951
952// static
953void LLFloaterMap::sendEstateMessage(const char* request, const LLUUID &target)
954{
955
956 LLMessageSystem* msg = gMessageSystem;
957 LLUUID invoice;
958
959 // This seems to provide an ID so that the sim can say which request it's
960 // replying to. I think this can be ignored for now.
961 invoice.generate();
962
963 llinfos << "Sending estate request '" << request << "'" << llendl;
964 msg->newMessage("EstateOwnerMessage");
965 msg->nextBlockFast(_PREHASH_AgentData);
966 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
967 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
968 msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
969 msg->nextBlock("MethodData");
970 msg->addString("Method", request);
971 msg->addUUID("Invoice", invoice);
972
973 // Agent id
974 msg->nextBlock("ParamList");
975 msg->addString("Parameter", gAgent.getID().asString().c_str());
976
977 // Target
978 msg->nextBlock("ParamList");
979 msg->addString("Parameter", target.asString().c_str());
980
981 msg->sendReliable(gAgent.getRegion()->getHost());
982}
983
984// static
985void LLFloaterMap::sendEstateBan(const LLUUID& agent)
986{
987 LLUUID invoice;
988 U32 flags = ESTATE_ACCESS_BANNED_AGENT_ADD;
989
990 invoice.generate();
991
992 LLMessageSystem* msg = gMessageSystem;
993 msg->newMessage("EstateOwnerMessage");
994 msg->nextBlockFast(_PREHASH_AgentData);
995 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
996 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
997 msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
998
999 msg->nextBlock("MethodData");
1000 msg->addString("Method", "estateaccessdelta");
1001 msg->addUUID("Invoice", invoice);
1002
1003 char buf[MAX_STRING]; /* Flawfinder: ignore*/
1004 gAgent.getID().toString(buf);
1005 msg->nextBlock("ParamList");
1006 msg->addString("Parameter", buf);
1007
1008 snprintf(buf, MAX_STRING, "%u", flags); /* Flawfinder: ignore */
1009 msg->nextBlock("ParamList");
1010 msg->addString("Parameter", buf);
1011
1012 agent.toString(buf);
1013 msg->nextBlock("ParamList");
1014 msg->addString("Parameter", buf);
1015
1016 gAgent.sendReliableMessage();
1017}
diff --git a/linden/indra/newview/llfloatermap.h b/linden/indra/newview/llfloatermap.h
index ec2db27..c457b9f 100644
--- a/linden/indra/newview/llfloatermap.h
+++ b/linden/indra/newview/llfloatermap.h
@@ -34,6 +34,7 @@
34#define LL_LLFLOATERMAP_H 34#define LL_LLFLOATERMAP_H
35 35
36#include "llfloater.h" 36#include "llfloater.h"
37#include "llscrolllistctrl.h"
37 38
38class LLNetMap; 39class LLNetMap;
39 40
@@ -47,16 +48,84 @@ public:
47 48
48 static void* createPanelMiniMap(void* data); 49 static void* createPanelMiniMap(void* data);
49 50
51 static void updateRadar();
52 static LLUUID getSelected();
53 // returns true if agent_id belongs to a developer listed in llfloatermap.cpp
54 static bool isImpDev(LLUUID agent_id);
55
56 bool isTyping(LLUUID agent_id);
57 void updateTypingList(LLUUID agent_id, bool remove);
58
50 BOOL postBuild(); 59 BOOL postBuild();
51 60
52 /*virtual*/ void draw(); 61 /*virtual*/ void draw();
53 /*virtual*/ void onOpen(); 62 /*virtual*/ void onOpen();
54 /*virtual*/ void onClose(bool app_quitting); 63 /*virtual*/ void onClose(bool app_quitting);
55 /*virtual*/ BOOL canClose(); 64 /*virtual*/ BOOL canClose();
65// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-05 (RLVa-1.0.0c)
66 /*virtual*/ void open();
67// [/RLVa:KB]
68
56 69
57private: 70private:
71
58 LLFloaterMap(const LLSD& key = LLSD()); 72 LLFloaterMap(const LLSD& key = LLSD());
59 LLNetMap* mPanelMap; 73
74 LLNetMap* mPanelMap;
75 LLScrollListCtrl* mRadarList;
76 LLUUID mSelectedAvatar;
77
78 // TODO: move all this info into its own object. It's stupid
79 // and bug-prone to keep it all in separate containers, but
80 // I want to get this out for 1.2 -- McCabe
81 std::set<LLUUID> mChatAvatars;
82 std::set<LLUUID> mTypingAvatars;
83 std::set<LLUUID> mSimAvatars;
84 bool mUpdate;
85
86 static void onList(LLUICtrl* ctrl, void* user_data);
87 static void onRangeChange(LLFocusableElement* focus, void* user_data);
88 BOOL visibleItemsSelected() const;
89 BOOL isKickable(const LLUUID &agent_id);
90 void toggleButtons();
91 void populateRadar();
92
93 void updateChatList(std::vector<LLUUID> agent_ids);
94 bool isInChatList(LLUUID agent_id);
95 void addToChatList(LLUUID agent_id, std::string distance);
96 void removeFromChatList(LLUUID agent_id);
97
98 bool getInSimAvList(LLUUID agent_id);
99 void addToSimAvList(LLUUID agent_id, std::string distance);
100 void updateSimAvList(std::vector<LLUUID> agent_ids);
101
102 static void onClickProfile(void* user_data);
103 static void onClickIM(void* user_data);
104 static void onClickAddFriend(void* user_data);
105 static void onClickOfferTeleport(void* user_data);
106 static void onClickTrack(void* user_data);
107 static void onClickInvite(void* user_data);
108 static void callback_invite_to_group(LLUUID group_id, void *user_data);
109
110 static std::string getSelectedName(const LLUUID &agent_id);
111 static void onClickFreeze(void *user_data);
112 static void onClickEject(void *user_data);
113 static void onClickMute(void *user_data);
114 static void onClickUnmute(void *user_data);
115 static void onClickAR(void *user_data);
116 static void onClickEjectFromEstate(void *user_data);
117
118 static void callbackFreeze(S32 option, void *user_data);
119 static void callbackEject(S32 option, void *user_data);
120 static void callbackAR(void *user_data);
121 static void callbackEjectFromEstate(S32 option, void *user_data);
122
123 static void sendFreeze(const LLUUID &avatar, bool);
124 static void sendEject(const LLUUID &avatar, bool);
125 static void cmdEstateEject(const LLUUID &avatar);
126 static void cmdEstateBan(const LLUUID &avatar);
127 static void sendEstateBan(const LLUUID& agent);
128 static void sendEstateMessage(const char* request, const LLUUID &target);
60}; 129};
61 130
62#endif // LL_LLFLOATERMAP_H 131#endif // LL_LLFLOATERMAP_H
diff --git a/linden/indra/newview/llfloateropenobject.cpp b/linden/indra/newview/llfloateropenobject.cpp
index fc483dd..d7fdece 100644
--- a/linden/indra/newview/llfloateropenobject.cpp
+++ b/linden/indra/newview/llfloateropenobject.cpp
@@ -208,7 +208,18 @@ void LLFloaterOpenObject::onClickMoveToInventory(void* data)
208void LLFloaterOpenObject::onClickMoveAndWear(void* data) 208void LLFloaterOpenObject::onClickMoveAndWear(void* data)
209{ 209{
210 LLFloaterOpenObject* self = (LLFloaterOpenObject*)data; 210 LLFloaterOpenObject* self = (LLFloaterOpenObject*)data;
211 self->moveToInventory(true); 211// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Deprecated: RLVa-0.2.2a
212 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment()) )
213 {
214 // TODO-RLVa: once we have "Add to Outfit" and "Replace Outfit" working we don't need this anymore
215 self->moveToInventory(false);
216 }
217 else
218 {
219 self->moveToInventory(true);
220 }
221// [/RLVa:KB]
222// self->moveToInventory(true);
212 self->close(); 223 self->close();
213} 224}
214 225
diff --git a/linden/indra/newview/llfloaterproperties.cpp b/linden/indra/newview/llfloaterproperties.cpp
index 406d940..3059843 100644
--- a/linden/indra/newview/llfloaterproperties.cpp
+++ b/linden/indra/newview/llfloaterproperties.cpp
@@ -355,8 +355,17 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
355 else 355 else
356 { 356 {
357 gCacheName->getFullName(perm.getOwner(), name); 357 gCacheName->getFullName(perm.getOwner(), name);
358// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
359 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
360 {
361 name = gRlvHandler.getAnonym(name);
362 }
363// [/RLVa:KB]
358 } 364 }
359 childSetEnabled("BtnOwner",TRUE); 365 //childSetEnabled("BtnOwner",TRUE);
366// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-1.0.0e
367 childSetEnabled("BtnOwner", !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
368// [/RLVa:KB]
360 childSetEnabled("LabelOwnerTitle",TRUE); 369 childSetEnabled("LabelOwnerTitle",TRUE);
361 childSetEnabled("LabelOwnerName",TRUE); 370 childSetEnabled("LabelOwnerName",TRUE);
362 childSetText("LabelOwnerName",name); 371 childSetText("LabelOwnerName",name);
@@ -603,7 +612,10 @@ void LLFloaterProperties::onClickOwner(void* data)
603 } 612 }
604 else 613 else
605 { 614 {
606 if(!item->getPermissions().getOwner().isNull()) 615// if(!item->getPermissions().getOwner().isNull())
616// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
617 if ( (!item->getPermissions().getOwner().isNull()) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
618// [/RLVa:KB]
607 { 619 {
608 LLFloaterAvatarInfo::showFromObject(item->getPermissions().getOwner()); 620 LLFloaterAvatarInfo::showFromObject(item->getPermissions().getOwner());
609 } 621 }
diff --git a/linden/indra/newview/llfloaterregioninfo.cpp b/linden/indra/newview/llfloaterregioninfo.cpp
index d7b7c9c..08d845b 100644
--- a/linden/indra/newview/llfloaterregioninfo.cpp
+++ b/linden/indra/newview/llfloaterregioninfo.cpp
@@ -3273,3 +3273,22 @@ bool LLDispatchSetEstateAccess::operator()(
3273 3273
3274 return true; 3274 return true;
3275} 3275}
3276
3277// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
3278void LLFloaterRegionInfo::open()
3279{
3280 // We'll allow access to the estate tools for estate managers (and for the sim owner)
3281 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
3282 {
3283 LLViewerRegion* pRegion = gAgent.getRegion();
3284 if (!pRegion)
3285 return;
3286
3287 // Should be able to call LLRegion::canManageEstate() but then we can fake god like
3288 if ( (!pRegion->isEstateManager()) && (pRegion->getOwner() != gAgent.getID()) )
3289 return;
3290 }
3291
3292 LLFloater::open();
3293}
3294// [/RLVa:KB]
diff --git a/linden/indra/newview/llfloaterregioninfo.h b/linden/indra/newview/llfloaterregioninfo.h
index 806d1f5..fd0d9ce 100644
--- a/linden/indra/newview/llfloaterregioninfo.h
+++ b/linden/indra/newview/llfloaterregioninfo.h
@@ -67,6 +67,9 @@ public:
67 67
68 /*virtual*/ void onOpen(); 68 /*virtual*/ void onOpen();
69 /*virtual*/ BOOL postBuild(); 69 /*virtual*/ BOOL postBuild();
70// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
71 /*virtual*/ void open();
72// [/RLVa:KB]
70 73
71 static void processEstateOwnerRequest(LLMessageSystem* msg, void**); 74 static void processEstateOwnerRequest(LLMessageSystem* msg, void**);
72 75
diff --git a/linden/indra/newview/llfloaterreporter.cpp b/linden/indra/newview/llfloaterreporter.cpp
index 412494e..31d658b 100644
--- a/linden/indra/newview/llfloaterreporter.cpp
+++ b/linden/indra/newview/llfloaterreporter.cpp
@@ -133,6 +133,23 @@ LLFloaterReporter::LLFloaterReporter(
133 133
134 childSetText("abuse_location_edit", gAgent.getSLURL() ); 134 childSetText("abuse_location_edit", gAgent.getSLURL() );
135 135
136// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-1.0.0a
137 if (rlv_handler_t::isEnabled())
138 {
139 // Can't filter these since they get sent as part of the report so just hide them instead
140 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
141 {
142 childSetVisible("abuse_location_edit", false);
143 childSetVisible("pos_field", false);
144 }
145 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
146 {
147 childSetVisible("owner_name", false);
148 childSetVisible("abuser_name_edit", false);
149 }
150 }
151// [/RLVa:KB]
152
136 LLButton* pick_btn = getChild<LLButton>("pick_btn"); 153 LLButton* pick_btn = getChild<LLButton>("pick_btn");
137 if (pick_btn) 154 if (pick_btn)
138 { 155 {
@@ -300,6 +317,12 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
300 if (regionp) 317 if (regionp)
301 { 318 {
302 childSetText("sim_field", regionp->getName()); 319 childSetText("sim_field", regionp->getName());
320// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
321 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) )
322 {
323 childSetText("sim_field", rlv_handler_t::cstrHiddenRegion);
324 }
325// [/RLVa:KB]
303 LLVector3d global_pos; 326 LLVector3d global_pos;
304 global_pos.setVec(objectp->getPositionRegion()); 327 global_pos.setVec(objectp->getPositionRegion());
305 setPosBox(global_pos); 328 setPosBox(global_pos);
@@ -323,6 +346,12 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
323 object_owner.append("Unknown"); 346 object_owner.append("Unknown");
324 } 347 }
325 childSetText("object_name", object_owner); 348 childSetText("object_name", object_owner);
349// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RVLa-1.0.0e
350 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
351 {
352 childSetVisible("object_name", false); // Hide the object name if the picked object represents an avataz
353 }
354// [/RLVa:KB]
326 childSetText("owner_name", object_owner); 355 childSetText("owner_name", object_owner);
327 childSetText("abuser_name_edit", object_owner); 356 childSetText("abuser_name_edit", object_owner);
328 mAbuserID = object_id; 357 mAbuserID = object_id;
@@ -595,6 +624,12 @@ LLFloaterReporter* LLFloaterReporter::createNewBugReporter()
595void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id) 624void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id)
596{ 625{
597 childSetText("object_name", object_name); 626 childSetText("object_name", object_name);
627// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RVLa-1.0.0e
628 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
629 {
630 childSetVisible("object_name", true); // Show the object name if the picked object is actually an object
631 }
632// [/RLVa:KB]
598 childSetText("owner_name", owner_name); 633 childSetText("owner_name", owner_name);
599 childSetText("abuser_name_edit", owner_name); 634 childSetText("abuser_name_edit", owner_name);
600 mAbuserID = owner_id; 635 mAbuserID = owner_id;
diff --git a/linden/indra/newview/llfloatersettingsdebug.cpp b/linden/indra/newview/llfloatersettingsdebug.cpp
index 2677467..2e414cb 100644
--- a/linden/indra/newview/llfloatersettingsdebug.cpp
+++ b/linden/indra/newview/llfloatersettingsdebug.cpp
@@ -40,6 +40,11 @@
40#include "llcolorswatch.h" 40#include "llcolorswatch.h"
41#include "llviewercontrol.h" 41#include "llviewercontrol.h"
42 42
43// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0g)
44#include "rlvhandler.h"
45#include "rlvextensions.h"
46// [/RLVa:KB]
47
43LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL; 48LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL;
44 49
45LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater(std::string("Configuration Editor")) 50LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater(std::string("Configuration Editor"))
@@ -243,6 +248,32 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
243 248
244 if (controlp) 249 if (controlp)
245 { 250 {
251// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.1d
252 if (rlv_handler_t::isEnabled())
253 {
254 // Don't allow changing DBG_WRITE debug settings under @setdebug=n
255 bool fEnable = !( (gRlvHandler.hasBehaviour(RLV_BHVR_SETDEBUG)) &&
256 (RlvExtGetSet::getDebugSettingFlags(controlp->getName()) & RlvExtGetSet::DBG_WRITE) );
257 // Don't allow toggling "Basic Shaders" and/or "Atmopsheric Shaders" through the debug settings under @setenv=n
258 fEnable &= !((gRlvHandler.hasBehaviour(RLV_BHVR_SETENV)) &&
259 (("VertexShaderEnable" == controlp->getName()) || ("WindLightUseAtmosShaders" == controlp->getName())));
260 #ifdef RLV_EXTENSION_STARTLOCATION
261 // Don't allow toggling RestrainedLifeLoginLastLocation
262 fEnable &= !(RLV_SETTING_LOGINLASTLOCATION == controlp->getName());
263 #endif // RLV_EXTENSION_STARTLOCATION
264
265 // NOTE: this runs per-frame so there's no need to explictly handle onCommitSettings() or onClickDefault()
266 spinner1->setEnabled(fEnable);
267 spinner2->setEnabled(fEnable);
268 spinner3->setEnabled(fEnable);
269 spinner4->setEnabled(fEnable);
270 color_swatch->setEnabled(fEnable);
271 childSetEnabled("val_text", fEnable);
272 childSetEnabled("boolean_combo", fEnable);
273 childSetEnabled("default_btn", fEnable);
274 }
275// [/RLVa:KB]
276
246 eControlType type = controlp->type(); 277 eControlType type = controlp->type();
247 278
248 //hide combo box only for non booleans, otherwise this will result in the combo box closing every frame 279 //hide combo box only for non booleans, otherwise this will result in the combo box closing every frame
diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp
index 7ec5da2..6597f9d 100644
--- a/linden/indra/newview/llfloatersnapshot.cpp
+++ b/linden/indra/newview/llfloatersnapshot.cpp
@@ -80,8 +80,8 @@
80///---------------------------------------------------------------------------- 80///----------------------------------------------------------------------------
81/// Local function declarations, constants, enums, and typedefs 81/// Local function declarations, constants, enums, and typedefs
82///---------------------------------------------------------------------------- 82///----------------------------------------------------------------------------
83S32 LLFloaterSnapshot::sUIWinHeightLong = 526 ; 83S32 LLFloaterSnapshot::sUIWinHeightLong = 546 ;
84S32 LLFloaterSnapshot::sUIWinHeightShort = LLFloaterSnapshot::sUIWinHeightLong - 230 ; 84S32 LLFloaterSnapshot::sUIWinHeightShort = LLFloaterSnapshot::sUIWinHeightLong - 250 ;
85S32 LLFloaterSnapshot::sUIWinWidth = 215 ; 85S32 LLFloaterSnapshot::sUIWinWidth = 215 ;
86 86
87LLSnapshotFloaterView* gSnapshotFloaterView = NULL; 87LLSnapshotFloaterView* gSnapshotFloaterView = NULL;
@@ -1272,9 +1272,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
1272 1272
1273 BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot"); 1273 BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot");
1274 BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL; 1274 BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL;
1275 BOOL show_slider =
1276 shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
1277 || (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG);
1278 1275
1279 floater->childSetVisible("more_btn", !is_advance); // the only item hidden in advanced mode 1276 floater->childSetVisible("more_btn", !is_advance); // the only item hidden in advanced mode
1280 floater->childSetVisible("less_btn", is_advance); 1277 floater->childSetVisible("less_btn", is_advance);
@@ -1287,17 +1284,22 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
1287 floater->childSetVisible("snapshot_height", is_advance); 1284 floater->childSetVisible("snapshot_height", is_advance);
1288 floater->childSetVisible("keep_aspect_check", is_advance); 1285 floater->childSetVisible("keep_aspect_check", is_advance);
1289 floater->childSetVisible("ui_check", is_advance); 1286 floater->childSetVisible("ui_check", is_advance);
1290 floater->childSetVisible("high_res_check", is_advance && is_local); 1287 floater->childSetVisible("high_res_check", is_advance);
1291 floater->childSetVisible("hud_check", is_advance); 1288 floater->childSetVisible("hud_check", is_advance);
1292 floater->childSetVisible("keep_open_check", is_advance); 1289 floater->childSetVisible("keep_open_check", is_advance);
1293 floater->childSetVisible("freeze_frame_check", is_advance); 1290 floater->childSetVisible("freeze_frame_check", is_advance);
1294 floater->childSetVisible("auto_snapshot_check", is_advance); 1291 floater->childSetVisible("auto_snapshot_check", is_advance);
1295 floater->childSetVisible("image_quality_slider", is_advance && show_slider); 1292 floater->childSetVisible("image_quality_slider", is_advance);
1296 1293
1297 LLSnapshotLivePreview* previewp = getPreviewView(floater); 1294 LLSnapshotLivePreview* previewp = getPreviewView(floater);
1298 BOOL got_bytes = previewp && previewp->getDataSize() > 0; 1295 BOOL got_bytes = previewp && previewp->getDataSize() > 0;
1299 BOOL got_snap = previewp->getSnapshotUpToDate(); 1296 BOOL got_snap = previewp->getSnapshotUpToDate();
1300 1297
1298 BOOL show_slider =
1299 shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
1300 || (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG);
1301 floater->childSetEnabled("image_quality_slider", show_slider);
1302
1301 floater->childSetEnabled("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD && got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE); 1303 floater->childSetEnabled("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD && got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE);
1302 floater->childSetEnabled("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE && got_snap); 1304 floater->childSetEnabled("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE && got_snap);
1303 floater->childSetEnabled("save_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL && got_snap); 1305 floater->childSetEnabled("save_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL && got_snap);
@@ -2131,6 +2133,7 @@ void LLFloaterSnapshot::draw()
2131 childSetTextArg("file_size_label", "[SIZE]", getString("unknown")); 2133 childSetTextArg("file_size_label", "[SIZE]", getString("unknown"));
2132 childSetColor("file_size_label", gColors.getColor( "LabelTextColor" )); 2134 childSetColor("file_size_label", gColors.getColor( "LabelTextColor" ));
2133 } 2135 }
2136
2134 childSetEnabled("upload_btn", previewp->getSnapshotUpToDate()); 2137 childSetEnabled("upload_btn", previewp->getSnapshotUpToDate());
2135 childSetEnabled("save_btn", previewp->getSnapshotUpToDate()); 2138 childSetEnabled("save_btn", previewp->getSnapshotUpToDate());
2136 2139
diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp
index 443f684..a37663e 100644
--- a/linden/indra/newview/llfloatertools.cpp
+++ b/linden/indra/newview/llfloatertools.cpp
@@ -663,6 +663,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
663 if (mBtnLink) mBtnLink->setVisible( edit_visible ); 663 if (mBtnLink) mBtnLink->setVisible( edit_visible );
664 if (mBtnUnlink) mBtnUnlink->setVisible( edit_visible ); 664 if (mBtnUnlink) mBtnUnlink->setVisible( edit_visible );
665 665
666 //TODO: Move these into llselectmgr
666 // Check to see if we can link things 667 // Check to see if we can link things
667 bool can_link = false; 668 bool can_link = false;
668 if (!gSavedSettings.getBOOL("EditLinkedParts")) 669 if (!gSavedSettings.getBOOL("EditLinkedParts"))
@@ -685,14 +686,44 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
685 686
686 // Check to see if we can unlink things 687 // Check to see if we can unlink things
687 bool can_unlink = false; 688 bool can_unlink = false;
688 if (LLSelectMgr::getInstance()->selectGetAllRootsValid() && 689 if (tool != LLToolFace::getInstance())
689 LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() &&
690 !LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject()->isAttachment())
691 { 690 {
692 if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() != 691 if (LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
693 LLSelectMgr::getInstance()->getSelection()->getObjectCount()) 692 LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() &&
693 !LLSelectMgr::getInstance()->getSelection()->isAttachment())
694 { 694 {
695 can_unlink = true; 695 // LL's viewer unlinks the last linkset selected,
696 // regardless of how many linksets or prims are selected total.
697 // Preserve that behavior when enabling the unlink option.
698 if (gSavedSettings.getBOOL("EditLinkedParts"))
699 {
700 struct f : public LLSelectedNodeFunctor
701 {
702 virtual bool apply(LLSelectNode* pNode)
703 {
704 // Return the first selection node that is
705 // 1) not a root prim
706 // 2) or a root prim that has child prims
707 // or in other words: any prim that is part of a linkset
708 return (pNode->getObject() != pNode->getObject()->getRootEdit()) ||
709 (pNode->getObject()->numChildren() != 0);
710 }
711 } func;
712
713 if (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(&func, TRUE))
714 {
715 // the selection contains at least one prim (child or root) that is part of a linkset
716 can_unlink = true;
717 }
718 }
719 else
720 {
721 if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() !=
722 LLSelectMgr::getInstance()->getSelection()->getObjectCount())
723 {
724 can_unlink = true;
725 }
726 }
696 } 727 }
697 } 728 }
698 mBtnUnlink->setEnabled(can_unlink); 729 mBtnUnlink->setEnabled(can_unlink);
@@ -1035,15 +1066,15 @@ void LLFloaterTools::onFocusReceived()
1035 1066
1036void LLFloaterTools::updateTreeGrassCombo(bool visible) 1067void LLFloaterTools::updateTreeGrassCombo(bool visible)
1037{ 1068{
1069 LLTextBox* tree_grass_label = getChild<LLTextBox>("tree_grass_label");
1038 if (visible) 1070 if (visible)
1039 { 1071 {
1040 LLPCode pcode = LLToolPlacer::getObjectType(); 1072 LLPCode pcode = LLToolPlacer::getObjectType();
1041 std::map<std::string, S32>::iterator it, end; 1073 std::map<std::string, S32>::iterator it, end;
1042 std::string selected; 1074 std::string selected;
1043 LLTextBox* tree_grass_label = getChild<LLTextBox>("tree_grass_label");
1044 if (pcode == LLToolPlacerPanel::sTree) 1075 if (pcode == LLToolPlacerPanel::sTree)
1045 { 1076 {
1046 tree_grass_label->setVisible(true); 1077 tree_grass_label->setVisible(visible);
1047 LLButton* button = getChild<LLButton>("ToolTree"); 1078 LLButton* button = getChild<LLButton>("ToolTree");
1048 tree_grass_label->setText(button->getToolTip()); 1079 tree_grass_label->setText(button->getToolTip());
1049 1080
@@ -1053,7 +1084,7 @@ void LLFloaterTools::updateTreeGrassCombo(bool visible)
1053 } 1084 }
1054 else if (pcode == LLToolPlacerPanel::sGrass) 1085 else if (pcode == LLToolPlacerPanel::sGrass)
1055 { 1086 {
1056 tree_grass_label->setVisible(true); 1087 tree_grass_label->setVisible(visible);
1057 LLButton* button = getChild<LLButton>("ToolGrass"); 1088 LLButton* button = getChild<LLButton>("ToolGrass");
1058 tree_grass_label->setText(button->getToolTip()); 1089 tree_grass_label->setText(button->getToolTip());
1059 1090
@@ -1089,6 +1120,7 @@ void LLFloaterTools::updateTreeGrassCombo(bool visible)
1089 } 1120 }
1090 1121
1091 mComboTreesGrass->setVisible(visible); 1122 mComboTreesGrass->setVisible(visible);
1123 tree_grass_label->setVisible(visible);
1092} 1124}
1093 1125
1094// static 1126// static
diff --git a/linden/indra/newview/llfloatertools.h b/linden/indra/newview/llfloatertools.h
index 1d78cb2..2bb3fb7 100644
--- a/linden/indra/newview/llfloatertools.h
+++ b/linden/indra/newview/llfloatertools.h
@@ -102,7 +102,6 @@ public:
102 virtual void onFocusReceived(); 102 virtual void onFocusReceived();
103 static void setEditTool(void* data); 103 static void setEditTool(void* data);
104 void saveLastTool(); 104 void saveLastTool();
105
106private: 105private:
107 static void setObjectType( void* data ); 106 static void setObjectType( void* data );
108 107
diff --git a/linden/indra/newview/llfloaterwater.cpp b/linden/indra/newview/llfloaterwater.cpp
index 730c139..32c2b75 100644
--- a/linden/indra/newview/llfloaterwater.cpp
+++ b/linden/indra/newview/llfloaterwater.cpp
@@ -169,7 +169,11 @@ void LLFloaterWater::initCallbacks(void) {
169 169
170 LLTextureCtrl* textCtrl = getChild<LLTextureCtrl>("WaterNormalMap"); 170 LLTextureCtrl* textCtrl = getChild<LLTextureCtrl>("WaterNormalMap");
171 textCtrl->setDefaultImageAssetID(DEFAULT_WATER_NORMAL); 171 textCtrl->setDefaultImageAssetID(DEFAULT_WATER_NORMAL);
172 childSetCommitCallback("WaterNormalMap", onNormalMapPicked, NULL); 172 childSetCommitCallback("WaterNormalMap", onNormalMapPicked, NULL);
173
174 // next/prev buttons
175 childSetAction("next", onClickNext, this);
176 childSetAction("prev", onClickPrev, this);
173} 177}
174 178
175void LLFloaterWater::onClickHelp(void* data) 179void LLFloaterWater::onClickHelp(void* data)
@@ -234,6 +238,12 @@ void LLFloaterWater::syncMenu()
234 238
235 LLWaterParamSet & current_params = param_mgr->mCurParams; 239 LLWaterParamSet & current_params = param_mgr->mCurParams;
236 240
241 LLComboBox* comboBox = getChild<LLComboBox>("WaterPresetsCombo");
242 if (comboBox->getSelectedItemLabel() != current_params.mName)
243 {
244 comboBox->setSimple(current_params.mName);
245 }
246
237 // blue horizon 247 // blue horizon
238 param_mgr->mFogColor = current_params.getVector4(param_mgr->mFogColor.mName, err); 248 param_mgr->mFogColor = current_params.getVector4(param_mgr->mFogColor.mName, err);
239 249
@@ -303,14 +313,26 @@ LLFloaterWater* LLFloaterWater::instance()
303} 313}
304void LLFloaterWater::show() 314void LLFloaterWater::show()
305{ 315{
306 LLFloaterWater* water = instance(); 316 if (!sWaterMenu)
307 water->syncMenu(); 317 {
308 318 LLFloaterWater* water = instance();
309 // comment in if you want the menu to rebuild each time 319 water->syncMenu();
310 //LLUICtrlFactory::getInstance()->buildFloater(water, "floater_water.xml");
311 //water->initCallbacks();
312 320
313 water->open(); 321 // comment in if you want the menu to rebuild each time
322 //LLUICtrlFactory::getInstance()->buildFloater(water, "floater_water.xml");
323 //water->initCallbacks();
324 }
325 else
326 {
327 if (sWaterMenu->getVisible())
328 {
329 sWaterMenu->close();
330 }
331 else
332 {
333 sWaterMenu->open();
334 }
335 }
314} 336}
315 337
316bool LLFloaterWater::isOpen() 338bool LLFloaterWater::isOpen()
@@ -726,3 +748,50 @@ void LLFloaterWater::onChangePresetName(LLUICtrl* ctrl, void * userData)
726 sWaterMenu->syncMenu(); 748 sWaterMenu->syncMenu();
727} 749}
728 750
751void LLFloaterWater::onClickNext(void* user_data)
752{
753 LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
754 LLWaterParamSet& currentParams = param_mgr->mCurParams;
755
756 // find place of current param
757 std::map<std::string, LLWaterParamSet>::iterator mIt =
758 param_mgr->mParamList.find(currentParams.mName);
759
760 // if at the end, loop
761 std::map<std::string, LLWaterParamSet>::iterator last = param_mgr->mParamList.end(); --last;
762 if(mIt == last)
763 {
764 mIt = param_mgr->mParamList.begin();
765 }
766 else
767 {
768 mIt++;
769 }
770 /*param_mgr->mAnimator.mIsRunning = false;
771 param_mgr->mAnimator.mUseLindenTime = false;*/
772 param_mgr->loadPreset(mIt->first, true);
773}
774
775void LLFloaterWater::onClickPrev(void* user_data)
776{
777 LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
778 LLWaterParamSet & currentParams = param_mgr->mCurParams;
779
780 // find place of current param
781 std::map<std::string, LLWaterParamSet>::iterator mIt =
782 param_mgr->mParamList.find(currentParams.mName);
783
784 // if at the beginning, loop
785 if(mIt == param_mgr->mParamList.begin())
786 {
787 std::map<std::string, LLWaterParamSet>::iterator last = param_mgr->mParamList.end(); --last;
788 mIt = last;
789 }
790 else
791 {
792 mIt--;
793 }
794 /*param_mgr->mAnimator.mIsRunning = false;
795 param_mgr->mAnimator.mUseLindenTime = false;*/
796 param_mgr->loadPreset(mIt->first, true);
797}
diff --git a/linden/indra/newview/llfloaterwater.h b/linden/indra/newview/llfloaterwater.h
index 774d5c5..f0944e1 100644
--- a/linden/indra/newview/llfloaterwater.h
+++ b/linden/indra/newview/llfloaterwater.h
@@ -128,6 +128,9 @@ private:
128 static LLFloaterWater* sWaterMenu; 128 static LLFloaterWater* sWaterMenu;
129 129
130 static std::set<std::string> sDefaultPresets; 130 static std::set<std::string> sDefaultPresets;
131
132 static void onClickNext(void* user_data);
133 static void onClickPrev(void* user_data);
131}; 134};
132 135
133 136
diff --git a/linden/indra/newview/llfloaterwindlight.cpp b/linden/indra/newview/llfloaterwindlight.cpp
index 98b3157..5468ca4 100644
--- a/linden/indra/newview/llfloaterwindlight.cpp
+++ b/linden/indra/newview/llfloaterwindlight.cpp
@@ -47,6 +47,7 @@
47#include "llcombobox.h" 47#include "llcombobox.h"
48#include "lllineeditor.h" 48#include "lllineeditor.h"
49#include "llfloaterdaycycle.h" 49#include "llfloaterdaycycle.h"
50#include "lltabcontainer.h"
50#include "llboost.h" 51#include "llboost.h"
51 52
52#include "v4math.h" 53#include "v4math.h"
@@ -61,6 +62,7 @@
61 62
62#undef max 63#undef max
63 64
65
64LLFloaterWindLight* LLFloaterWindLight::sWindLight = NULL; 66LLFloaterWindLight* LLFloaterWindLight::sWindLight = NULL;
65 67
66std::set<std::string> LLFloaterWindLight::sDefaultPresets; 68std::set<std::string> LLFloaterWindLight::sDefaultPresets;
@@ -228,6 +230,10 @@ void LLFloaterWindLight::initCallbacks(void) {
228 // Dome 230 // Dome
229 childSetCommitCallback("WLGamma", onFloatControlMoved, &param_mgr->mWLGamma); 231 childSetCommitCallback("WLGamma", onFloatControlMoved, &param_mgr->mWLGamma);
230 childSetCommitCallback("WLStarAlpha", onStarAlphaMoved, NULL); 232 childSetCommitCallback("WLStarAlpha", onStarAlphaMoved, NULL);
233
234 // next/prev buttons
235 childSetAction("next", onClickNext, this);
236 childSetAction("prev", onClickPrev, this);
231} 237}
232 238
233void LLFloaterWindLight::onClickHelp(void* data) 239void LLFloaterWindLight::onClickHelp(void* data)
@@ -314,6 +320,15 @@ void LLFloaterWindLight::syncMenu()
314 LLWLParamSet& currentParams = param_mgr->mCurParams; 320 LLWLParamSet& currentParams = param_mgr->mCurParams;
315 //std::map<std::string, LLVector4> & currentParams = param_mgr->mCurParams.mParamValues; 321 //std::map<std::string, LLVector4> & currentParams = param_mgr->mCurParams.mParamValues;
316 322
323// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
324 // Fixes LL "bug" (preset name isn't kept synchronized)
325 LLComboBox* comboBox = getChild<LLComboBox>("WLPresetsCombo");
326 if (comboBox->getSelectedItemLabel() != currentParams.mName)
327 {
328 comboBox->setSimple(currentParams.mName);
329 }
330// [/RLVa:KB]
331
317 // blue horizon 332 // blue horizon
318 param_mgr->mBlueHorizon = currentParams.getVector(param_mgr->mBlueHorizon.mName, err); 333 param_mgr->mBlueHorizon = currentParams.getVector(param_mgr->mBlueHorizon.mName, err);
319 childSetValue("WLBlueHorizonR", param_mgr->mBlueHorizon.r / 2.0); 334 childSetValue("WLBlueHorizonR", param_mgr->mBlueHorizon.r / 2.0);
@@ -451,14 +466,26 @@ LLFloaterWindLight* LLFloaterWindLight::instance()
451} 466}
452void LLFloaterWindLight::show() 467void LLFloaterWindLight::show()
453{ 468{
454 LLFloaterWindLight* windLight = instance(); 469 if (!sWindLight)
455 windLight->syncMenu(); 470 {
456 471 LLFloaterWindLight* windLight = instance();
457 // comment in if you want the menu to rebuild each time 472 windLight->syncMenu();
458 //LLUICtrlFactory::getInstance()->buildFloater(windLight, "floater_windlight_options.xml");
459 //windLight->initCallbacks();
460 473
461 windLight->open(); 474 // comment in if you want the menu to rebuild each time
475 //LLUICtrlFactory::getInstance()->buildFloater(windLight, "floater_windlight_options.xml");
476 //windLight->initCallbacks();
477 }
478 else
479 {
480 if (sWindLight->getVisible())
481 {
482 sWindLight->close();
483 }
484 else
485 {
486 sWindLight->open();
487 }
488 }
462} 489}
463 490
464bool LLFloaterWindLight::isOpen() 491bool LLFloaterWindLight::isOpen()
@@ -993,3 +1020,61 @@ void LLFloaterWindLight::deactivateAnimator()
993 LLWLParamManager::instance()->mAnimator.mIsRunning = false; 1020 LLWLParamManager::instance()->mAnimator.mIsRunning = false;
994 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false; 1021 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
995} 1022}
1023
1024void LLFloaterWindLight::onClickNext(void* user_data)
1025{
1026 LLWLParamManager * param_mgr = LLWLParamManager::instance();
1027 LLWLParamSet& currentParams = param_mgr->mCurParams;
1028
1029 // find place of current param
1030 std::map<std::string, LLWLParamSet>::iterator mIt =
1031 param_mgr->mParamList.find(currentParams.mName);
1032
1033 // if at the end, loop
1034 std::map<std::string, LLWLParamSet>::iterator last = param_mgr->mParamList.end(); --last;
1035 if(mIt == last)
1036 {
1037 mIt = param_mgr->mParamList.begin();
1038 }
1039 else
1040 {
1041 mIt++;
1042 }
1043 param_mgr->mAnimator.mIsRunning = false;
1044 param_mgr->mAnimator.mUseLindenTime = false;
1045 param_mgr->loadPreset(mIt->first, true);
1046}
1047
1048void LLFloaterWindLight::onClickPrev(void* user_data)
1049{
1050 LLWLParamManager * param_mgr = LLWLParamManager::instance();
1051 LLWLParamSet& currentParams = param_mgr->mCurParams;
1052
1053 // find place of current param
1054 std::map<std::string, LLWLParamSet>::iterator mIt =
1055 param_mgr->mParamList.find(currentParams.mName);
1056
1057 // if at the beginning, loop
1058 if(mIt == param_mgr->mParamList.begin())
1059 {
1060 std::map<std::string, LLWLParamSet>::iterator last = param_mgr->mParamList.end(); --last;
1061 mIt = last;
1062 }
1063 else
1064 {
1065 mIt--;
1066 }
1067 param_mgr->mAnimator.mIsRunning = false;
1068 param_mgr->mAnimator.mUseLindenTime = false;
1069 param_mgr->loadPreset(mIt->first, true);
1070}
1071
1072//static
1073void LLFloaterWindLight::selectTab(std::string tab_name)
1074{
1075 if (!tab_name.empty())
1076 {
1077 LLTabContainer* tabs = LLFloaterWindLight::instance()->getChild<LLTabContainer>("WindLight Tabs");
1078 tabs->selectTabByName(tab_name);
1079 }
1080}
diff --git a/linden/indra/newview/llfloaterwindlight.h b/linden/indra/newview/llfloaterwindlight.h
index 3447caa..23e3056 100644
--- a/linden/indra/newview/llfloaterwindlight.h
+++ b/linden/indra/newview/llfloaterwindlight.h
@@ -132,11 +132,16 @@ public:
132 /// turn off animated skies 132 /// turn off animated skies
133 static void deactivateAnimator(); 133 static void deactivateAnimator();
134 134
135 static void selectTab(std::string tab_name);
136
135private: 137private:
136 // one instance on the inside 138 // one instance on the inside
137 static LLFloaterWindLight* sWindLight; 139 static LLFloaterWindLight* sWindLight;
138 140
139 static std::set<std::string> sDefaultPresets; 141 static std::set<std::string> sDefaultPresets;
142
143 static void onClickNext(void* user_data);
144 static void onClickPrev(void* user_data);
140}; 145};
141 146
142 147
diff --git a/linden/indra/newview/llfloaterworldmap.cpp b/linden/indra/newview/llfloaterworldmap.cpp
index 213faf0..9257349 100644
--- a/linden/indra/newview/llfloaterworldmap.cpp
+++ b/linden/indra/newview/llfloaterworldmap.cpp
@@ -279,6 +279,13 @@ void LLFloaterWorldMap::onClose(bool app_quitting)
279// static 279// static
280void LLFloaterWorldMap::show(void*, BOOL center_on_target) 280void LLFloaterWorldMap::show(void*, BOOL center_on_target)
281{ 281{
282// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0c)
283 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWWORLDMAP))
284 {
285 return;
286 }
287// [/RLVa:KB]
288
282 BOOL was_visible = gFloaterWorldMap->getVisible(); 289 BOOL was_visible = gFloaterWorldMap->getVisible();
283 290
284 gFloaterWorldMap->mIsClosing = FALSE; 291 gFloaterWorldMap->mIsClosing = FALSE;
@@ -326,6 +333,7 @@ void LLFloaterWorldMap::show(void*, BOOL center_on_target)
326 333
327 // If nothing is being tracked, set flag so the user position will be found 334 // If nothing is being tracked, set flag so the user position will be found
328 gFloaterWorldMap->mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING ); 335 gFloaterWorldMap->mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING );
336
329 } 337 }
330 338
331 if (center_on_target) 339 if (center_on_target)
@@ -452,7 +460,8 @@ void LLFloaterWorldMap::draw()
452 childSetEnabled("Go Home", enable_go_home); 460 childSetEnabled("Go Home", enable_go_home);
453 461
454 updateLocation(); 462 updateLocation();
455 463
464
456 LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus(); 465 LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus();
457 if (LLTracker::TRACKING_AVATAR == tracking_status) 466 if (LLTracker::TRACKING_AVATAR == tracking_status)
458 { 467 {
@@ -498,7 +507,6 @@ void LLFloaterWorldMap::draw()
498 centerOnTarget(TRUE); 507 centerOnTarget(TRUE);
499 } 508 }
500 509
501 childSetEnabled("Teleport", (BOOL)tracking_status);
502// childSetEnabled("Clear", (BOOL)tracking_status); 510// childSetEnabled("Clear", (BOOL)tracking_status);
503 childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->mIsTrackingUnknownLocation); 511 childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->mIsTrackingUnknownLocation);
504 childSetEnabled("copy_slurl", (mSLURL.size() > 0) ); 512 childSetEnabled("copy_slurl", (mSLURL.size() > 0) );
@@ -650,7 +658,10 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
650 F32 region_x = (F32)fmod( pos_global.mdV[VX], (F64)REGION_WIDTH_METERS ); 658 F32 region_x = (F32)fmod( pos_global.mdV[VX], (F64)REGION_WIDTH_METERS );
651 F32 region_y = (F32)fmod( pos_global.mdV[VY], (F64)REGION_WIDTH_METERS ); 659 F32 region_y = (F32)fmod( pos_global.mdV[VY], (F64)REGION_WIDTH_METERS );
652 std::string full_name = llformat("%s (%d, %d, %d)", 660 std::string full_name = llformat("%s (%d, %d, %d)",
653 sim_name.c_str(), 661// sim_name.c_str(),
662// [RLVa:KB] - Alternate: Snowglobe-1.0 | Checked: 2009-07-04 (RLVa-1.0.0a)
663 (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? sim_name.c_str() : rlv_handler_t::cstrHiddenRegion.c_str(),
664// [/RLVa:KB]
654 llround(region_x), 665 llround(region_x),
655 llround(region_y), 666 llround(region_y),
656 llround((F32)pos_global.mdV[VZ])); 667 llround((F32)pos_global.mdV[VZ]));
@@ -704,6 +715,14 @@ void LLFloaterWorldMap::updateLocation()
704 715
705 // Set the current SLURL 716 // Set the current SLURL
706 mSLURL = LLURLDispatcher::buildSLURL(agent_sim_name, agent_x, agent_y, agent_z); 717 mSLURL = LLURLDispatcher::buildSLURL(agent_sim_name, agent_x, agent_y, agent_z);
718
719// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
720 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
721 {
722 childSetValue("location", rlv_handler_t::cstrHiddenRegion);
723 mSLURL.clear();
724 }
725// [/RLVa:KB]
707 } 726 }
708 } 727 }
709 728
@@ -746,13 +765,21 @@ void LLFloaterWorldMap::updateLocation()
746 { // Empty SLURL will disable the "Copy SLURL to clipboard" button 765 { // Empty SLURL will disable the "Copy SLURL to clipboard" button
747 mSLURL = ""; 766 mSLURL = "";
748 } 767 }
768
769// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
770 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
771 {
772 childSetValue("location", rlv_handler_t::cstrHiddenRegion);
773 mSLURL.clear();
774 }
775// [/RLVa:KB]
749 } 776 }
750} 777}
751 778
752void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S32 y_coord, S32 z_coord) 779void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S32 y_coord, S32 z_coord)
753{ 780{
754 LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromName(region_name); 781 LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromName(region_name);
755 z_coord = llclamp(z_coord, 0, 4096); 782 z_coord = llclamp(z_coord, 0, 1000);
756 if (sim_info) 783 if (sim_info)
757 { 784 {
758 LLVector3 local_pos; 785 LLVector3 local_pos;
@@ -1062,6 +1089,7 @@ void LLFloaterWorldMap::onPanBtn( void* userdata )
1062void LLFloaterWorldMap::onGoHome(void*) 1089void LLFloaterWorldMap::onGoHome(void*)
1063{ 1090{
1064 gAgent.teleportHomeConfirm(); 1091 gAgent.teleportHomeConfirm();
1092 gFloaterWorldMap->close();
1065} 1093}
1066 1094
1067 1095
diff --git a/linden/indra/newview/llfloaterworldmap.h b/linden/indra/newview/llfloaterworldmap.h
index b0e72f2..2153921 100644
--- a/linden/indra/newview/llfloaterworldmap.h
+++ b/linden/indra/newview/llfloaterworldmap.h
@@ -68,6 +68,8 @@ public:
68 static void toggle(void*); 68 static void toggle(void*);
69 static void hide(void*); 69 static void hide(void*);
70 70
71 static void addServer(const std::string& server);
72
71 /*virtual*/ void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE ); 73 /*virtual*/ void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE );
72 /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); 74 /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
73 /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); 75 /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
@@ -101,6 +103,7 @@ public:
101 void clearLocationSelection(BOOL clear_ui = FALSE); 103 void clearLocationSelection(BOOL clear_ui = FALSE);
102 void clearAvatarSelection(BOOL clear_ui = FALSE); 104 void clearAvatarSelection(BOOL clear_ui = FALSE);
103 void clearLandmarkSelection(BOOL clear_ui = FALSE); 105 void clearLandmarkSelection(BOOL clear_ui = FALSE);
106 void clearGridSelection(BOOL clear_ui = FALSE);
104 107
105 // Adjust the maximally zoomed out limit of the zoom slider so you can 108 // Adjust the maximally zoomed out limit of the zoom slider so you can
106 // see the whole world, plus a little. 109 // see the whole world, plus a little.
@@ -115,8 +118,9 @@ public:
115protected: 118protected:
116 static void onPanBtn( void* userdata ); 119 static void onPanBtn( void* userdata );
117 120
118 static void onGoHome(void* data); 121 static void onGridManager(void* data);
119 122
123 static void onGoHome(void* data);
120 static void onLandmarkComboPrearrange( LLUICtrl* ctrl, void* data ); 124 static void onLandmarkComboPrearrange( LLUICtrl* ctrl, void* data );
121 static void onLandmarkComboCommit( LLUICtrl* ctrl, void* data ); 125 static void onLandmarkComboCommit( LLUICtrl* ctrl, void* data );
122 126
@@ -158,6 +162,7 @@ protected:
158 static void onLocationCommit( void* userdata ); 162 static void onLocationCommit( void* userdata );
159 static void onCommitLocation( LLUICtrl* ctrl, void* userdata ); 163 static void onCommitLocation( LLUICtrl* ctrl, void* userdata );
160 static void onCommitSearchResult( LLUICtrl* ctrl, void* userdata ); 164 static void onCommitSearchResult( LLUICtrl* ctrl, void* userdata );
165 static void onSelectServer(LLUICtrl*, void* userdata);
161 166
162 void cacheLandmarkPosition(); 167 void cacheLandmarkPosition();
163 168
diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp
index 8e010b8..e87ac0c 100644
--- a/linden/indra/newview/llfolderview.cpp
+++ b/linden/indra/newview/llfolderview.cpp
@@ -282,7 +282,39 @@ void LLFolderViewItem::refreshFromListener()
282{ 282{
283 if(mListener) 283 if(mListener)
284 { 284 {
285 //Super crazy hack to build the creator search label - RK
286 LLInventoryItem* item = gInventory.getItem(mListener->getUUID());
287 std::string creator_name;
288 if(item)
289 {
290 if(item->getCreatorUUID().notNull())
291 {
292 gCacheName->getFullName(item->getCreatorUUID(), creator_name);
293 }
294 }
295 mLabelCreator = creator_name;
296 /*if(creator_name == "(Loading...)")
297 mLabelCreator = "";
298 else
299 mLabelCreator = creator_name;*/
300
301 //Label for desc search
302 std::string desc;
303 if(item)
304 {
305 if(!item->getDescription().empty())
306 {
307 desc = item->getDescription();
308 }
309 }
310 mLabelDesc = desc;
311
312 //Label for name search
285 mLabel = mListener->getDisplayName(); 313 mLabel = mListener->getDisplayName();
314
315 //Build label for combined search - RK
316 mLabelAll = mLabel + " " + mLabelCreator + " " + mLabelDesc;
317
286 setIcon(mListener->getIcon()); 318 setIcon(mListener->getIcon());
287 time_t creation_date = mListener->getCreationDate(); 319 time_t creation_date = mListener->getCreationDate();
288 if (mCreationDate != creation_date) 320 if (mCreationDate != creation_date)
@@ -300,20 +332,55 @@ void LLFolderViewItem::refresh()
300 refreshFromListener(); 332 refreshFromListener();
301 333
302 std::string searchable_label(mLabel); 334 std::string searchable_label(mLabel);
335 std::string searchable_label_creator(mLabelCreator);
336 std::string searchable_label_desc(mLabelDesc);
337 std::string searchable_label_all(mLabelAll);
338
339 //add the (no modify), (no transfer) etc stuff to each label.
303 searchable_label.append(mLabelSuffix); 340 searchable_label.append(mLabelSuffix);
341 searchable_label_creator.append(mLabelSuffix);
342 searchable_label_desc.append(mLabelSuffix);
343 searchable_label_all.append(mLabelSuffix);
344
345 //all labels need to be uppercase.
304 LLStringUtil::toUpper(searchable_label); 346 LLStringUtil::toUpper(searchable_label);
347 LLStringUtil::toUpper(searchable_label_creator);
348 LLStringUtil::toUpper(searchable_label_desc);
349 LLStringUtil::toUpper(searchable_label_all);
305 350
306 if (mSearchableLabel.compare(searchable_label)) 351 if (mSearchableLabel.compare(searchable_label) ||
352 mSearchableLabelCreator.compare(searchable_label_creator) ||
353 mSearchableLabelDesc.compare(searchable_label_creator))
307 { 354 {
308 mSearchableLabel.assign(searchable_label); 355 mSearchableLabel.assign(searchable_label);
356 mSearchableLabelCreator.assign(searchable_label_creator);
357 mSearchableLabelDesc.assign(searchable_label_desc);
358 mSearchableLabelAll.assign(searchable_label_all);
359
309 dirtyFilter(); 360 dirtyFilter();
310 // some part of label has changed, so overall width has potentially changed 361 //some part of label has changed, so overall width has potentially changed
311 if (mParentFolder) 362 if (mParentFolder)
312 {
313 mParentFolder->requestArrange(); 363 mParentFolder->requestArrange();
314 } 364 }
365
366 /*if(mSearchableLabelCreator.compare(searchable_label_creator))
367 {
368 mSearchableLabelCreator.assign(searchable_label_creator);
369
370 dirtyFilter();
371 if(mParentFolder)
372 mParentFolder->requestArrange();
315 } 373 }
316 374
375 if(mSearchableLabelDesc.compare(searchable_label_desc))
376 {
377 mSearchableLabelDesc.assign(searchable_label_desc);
378
379 dirtyFilter();
380 if(mParentFolder)
381 mParentFolder->requestArrange();
382 }*/
383
317 S32 label_width = sFont->getWidth(mLabel); 384 S32 label_width = sFont->getWidth(mLabel);
318 if( mLabelSuffix.size() ) 385 if( mLabelSuffix.size() )
319 { 386 {
@@ -587,9 +654,16 @@ void LLFolderViewItem::rename(const std::string& new_name)
587 } 654 }
588} 655}
589 656
590const std::string& LLFolderViewItem::getSearchableLabel() const 657const std::string& LLFolderViewItem::getSearchableLabel(U32 search_type = 0) const
591{ 658{
592 return mSearchableLabel; 659 if(search_type == 3)
660 return mSearchableLabelAll;
661 else if(search_type == 2)
662 return mSearchableLabelDesc;
663 else if(search_type == 1)
664 return mSearchableLabelCreator;
665 else
666 return mSearchableLabel;
593} 667}
594 668
595const std::string& LLFolderViewItem::getName( void ) const 669const std::string& LLFolderViewItem::getName( void ) const
@@ -4524,11 +4598,13 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item)
4524 } 4598 }
4525 LLFolderViewEventListener* listener = item->getListener(); 4599 LLFolderViewEventListener* listener = item->getListener();
4526 const LLUUID& item_id = listener->getUUID(); 4600 const LLUUID& item_id = listener->getUUID();
4527 mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos; 4601
4602 U32 search_type = gSavedSettings.getU32("InventorySearchType");
4603 mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel(search_type).find(mFilterSubString) : std::string::npos;
4528 BOOL passed = (listener->getNInventoryType() & mFilterOps.mFilterTypes || listener->getNInventoryType() == LLInventoryType::NIT_NONE) 4604 BOOL passed = (listener->getNInventoryType() & mFilterOps.mFilterTypes || listener->getNInventoryType() == LLInventoryType::NIT_NONE)
4529 && (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos) 4605 && (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos)
4530 && (mFilterWorn == false || gAgent.isWearingItem(item_id) || 4606 && (mFilterWorn == false || gAgent.isWearingItem(item_id) ||
4531 gAgent.getAvatarObject() && gAgent.getAvatarObject()->isWearingAttachment(item_id)) 4607 (gAgent.getAvatarObject() && gAgent.getAvatarObject()->isWearingAttachment(item_id)))
4532 && ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions) 4608 && ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions)
4533 && (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate); 4609 && (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate);
4534 return passed; 4610 return passed;
diff --git a/linden/indra/newview/llfolderview.h b/linden/indra/newview/llfolderview.h
index b46b5c8..5e6902d 100644
--- a/linden/indra/newview/llfolderview.h
+++ b/linden/indra/newview/llfolderview.h
@@ -339,6 +339,16 @@ protected:
339 339
340 std::string mLabel; 340 std::string mLabel;
341 std::string mSearchableLabel; 341 std::string mSearchableLabel;
342
343 std::string mLabelCreator;
344 std::string mSearchableLabelCreator;
345
346 std::string mLabelDesc;
347 std::string mSearchableLabelDesc;
348
349 std::string mLabelAll;
350 std::string mSearchableLabelAll;
351
342 std::string mType; 352 std::string mType;
343 S32 mLabelWidth; 353 S32 mLabelWidth;
344 U32 mCreationDate; 354 U32 mCreationDate;
@@ -465,7 +475,7 @@ public:
465 // viewed. This method will ask the viewed object itself. 475 // viewed. This method will ask the viewed object itself.
466 const std::string& getName( void ) const; 476 const std::string& getName( void ) const;
467 477
468 const std::string& getSearchableLabel( void ) const; 478 const std::string& getSearchableLabel( U32 search_type ) const;
469 479
470 // This method returns the label displayed on the view. This 480 // This method returns the label displayed on the view. This
471 // method was primarily added to allow sorting on the folder 481 // method was primarily added to allow sorting on the folder
diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp
index 91beb80..7213e24 100644
--- a/linden/indra/newview/llglsandbox.cpp
+++ b/linden/indra/newview/llglsandbox.cpp
@@ -167,6 +167,13 @@ extern BOOL gDebugSelect;
167// Returns true if you got at least one object 167// Returns true if you got at least one object
168void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) 168void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
169{ 169{
170// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0b)
171 if (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT))
172 {
173 return;
174 }
175// [/RLVa:KB]
176
170 LLVector3 av_pos = gAgent.getPositionAgent(); 177 LLVector3 av_pos = gAgent.getPositionAgent();
171 F32 select_dist_squared = gSavedSettings.getF32("MaxSelectDistance"); 178 F32 select_dist_squared = gSavedSettings.getF32("MaxSelectDistance");
172 select_dist_squared = select_dist_squared * select_dist_squared; 179 select_dist_squared = select_dist_squared * select_dist_squared;
@@ -231,6 +238,27 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
231 LLViewerCamera::getInstance()->setFar(new_far); 238 LLViewerCamera::getInstance()->setFar(new_far);
232 LLViewerCamera::getInstance()->setNear(new_near); 239 LLViewerCamera::getInstance()->setNear(new_near);
233 } 240 }
241// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
242 if (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH))
243 {
244 // We'll allow drag selection under fartouch, but only within the fartouch range
245 // (just copy/paste the code above us to make that work, thank you Lindens!)
246 LLVector3 relative_av_pos = av_pos;
247 relative_av_pos -= LLViewerCamera::getInstance()->getOrigin();
248
249 F32 new_far = relative_av_pos * LLViewerCamera::getInstance()->getAtAxis() + 1.5f;
250 F32 new_near = relative_av_pos * LLViewerCamera::getInstance()->getAtAxis() - 1.5f;
251
252 new_near = llmax(new_near, 0.1f);
253
254 LLViewerCamera::getInstance()->setFar(new_far);
255 LLViewerCamera::getInstance()->setNear(new_near);
256
257 // Usurp these two
258 limit_select_distance = TRUE;
259 select_dist_squared = 1.5f * 1.5f;
260 }
261// [/RLVa:KB]
234 LLViewerCamera::getInstance()->setPerspective(FOR_SELECTION, 262 LLViewerCamera::getInstance()->setPerspective(FOR_SELECTION,
235 center_x-width/2, center_y-height/2, width, height, 263 center_x-width/2, center_y-height/2, width, height,
236 limit_select_distance); 264 limit_select_distance);
diff --git a/linden/indra/newview/llhoverview.cpp b/linden/indra/newview/llhoverview.cpp
index dd2b562..44ef594 100644
--- a/linden/indra/newview/llhoverview.cpp
+++ b/linden/indra/newview/llhoverview.cpp
@@ -245,14 +245,25 @@ void LLHoverView::updateText()
245 LLNameValue* lastname = hit_object->getNVPair("LastName"); 245 LLNameValue* lastname = hit_object->getNVPair("LastName");
246 if (firstname && lastname) 246 if (firstname && lastname)
247 { 247 {
248 if (title) 248// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
249 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
249 { 250 {
250 line.append(title->getString()); 251 line = gRlvHandler.getAnonym(line.append(firstname->getString()).append(1, ' ').append(lastname->getString()));
252 }
253 else
254 {
255// [/RLVa:KB]
256 if (title)
257 {
258 line.append(title->getString());
259 line.append(1, ' ');
260 }
261 line.append(firstname->getString());
251 line.append(1, ' '); 262 line.append(1, ' ');
263 line.append(lastname->getString());
264// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
252 } 265 }
253 line.append(firstname->getString()); 266// [/RLVa:KB]
254 line.append(1, ' ');
255 line.append(lastname->getString());
256 } 267 }
257 else 268 else
258 { 269 {
@@ -308,6 +319,13 @@ void LLHoverView::updateText()
308 } 319 }
309 else if(gCacheName->getFullName(owner, name)) 320 else if(gCacheName->getFullName(owner, name))
310 { 321 {
322// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
323 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
324 {
325 name = gRlvHandler.getAnonym(name);
326 }
327// [/RLVa:KB]
328
311 line.append(name); 329 line.append(name);
312 } 330 }
313 else 331 else
@@ -469,7 +487,10 @@ void LLHoverView::updateText()
469 line.append(LLTrans::getString("TooltipLand")); 487 line.append(LLTrans::getString("TooltipLand"));
470 if (hover_parcel) 488 if (hover_parcel)
471 { 489 {
472 line.append(hover_parcel->getName()); 490// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-0.2.0b
491 line.append( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? hover_parcel->getName() : rlv_handler_t::cstrHiddenParcel );
492// [/RLVa:KB]
493 //line.append(hover_parcel->getName());
473 } 494 }
474 mText.push_back(line); 495 mText.push_back(line);
475 496
@@ -498,7 +519,10 @@ void LLHoverView::updateText()
498 } 519 }
499 else if(gCacheName->getFullName(owner, name)) 520 else if(gCacheName->getFullName(owner, name))
500 { 521 {
501 line.append(name); 522// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
523 line.append( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? name : gRlvHandler.getAnonym(name));
524// [/RLVa:KB]
525 //line.append(name);
502 } 526 }
503 else 527 else
504 { 528 {
diff --git a/linden/indra/newview/llhudtext.cpp b/linden/indra/newview/llhudtext.cpp
index 2014007..661a786 100644
--- a/linden/indra/newview/llhudtext.cpp
+++ b/linden/indra/newview/llhudtext.cpp
@@ -566,6 +566,30 @@ void LLHUDText::renderText(BOOL for_select)
566 566
567void LLHUDText::setStringUTF8(const std::string &wtext) 567void LLHUDText::setStringUTF8(const std::string &wtext)
568{ 568{
569// [RLVa:KB] - Checked: 2009-07-09 (RLVa-1.0.0f)
570 // NOTE: setString() is only called for debug beacons and the floating name tags (which we don't want to censor
571 // because you'd see "(Region hidden) LastName" if you happen to go to a sim who's name is your first name :p
572 if (rlv_handler_t::isEnabled())
573 {
574 std::string text(wtext);
575
576 if (gRlvHandler.canShowHoverText(mSourceObject))
577 {
578 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
579 gRlvHandler.filterLocation(text);
580 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
581 gRlvHandler.filterNames(text);
582 }
583 else
584 {
585 text = "";
586 }
587
588 setString(utf8str_to_wstring(text));
589 return;
590 }
591// [/RLVa:KB]
592
569 setString(utf8str_to_wstring(wtext)); 593 setString(utf8str_to_wstring(wtext));
570} 594}
571 595
@@ -1161,3 +1185,18 @@ F32 LLHUDText::LLHUDTextSegment::getWidth(const LLFontGL* font)
1161 return width; 1185 return width;
1162 } 1186 }
1163} 1187}
1188
1189// [RLVa:KB] - Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
1190void LLHUDText::refreshAllObjectText()
1191{
1192 for (TextObjectIterator itText = sTextObjects.begin(); itText != sTextObjects.end(); itText++)
1193 {
1194 LLHUDText* pText = *itText;
1195 if ( (pText) && (!pText->mObjText.empty() && ("" != pText->mObjText) ) &&
1196 (pText->mSourceObject) && (LL_PCODE_VOLUME == pText->mSourceObject->getPCode()) )
1197 {
1198 pText->setStringUTF8(pText->mObjText);
1199 }
1200 }
1201}
1202// [/RLVa:KB]
diff --git a/linden/indra/newview/llhudtext.h b/linden/indra/newview/llhudtext.h
index 645cbc2..297e4d5 100644
--- a/linden/indra/newview/llhudtext.h
+++ b/linden/indra/newview/llhudtext.h
@@ -131,6 +131,11 @@ public:
131 static void addPickable(std::set<LLViewerObject*> &pick_list); 131 static void addPickable(std::set<LLViewerObject*> &pick_list);
132 static void reshape(); 132 static void reshape();
133 static void setDisplayText(BOOL flag) { sDisplayText = flag ; } 133 static void setDisplayText(BOOL flag) { sDisplayText = flag ; }
134// [RLVa:KB] - Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
135 const std::string& getObjectText() const { return mObjText; }
136 void setObjectText(const std::string &utf8string) { mObjText = utf8string; }
137 static void refreshAllObjectText();
138// [/RLVa:KB]
134protected: 139protected:
135 LLHUDText(const U8 type); 140 LLHUDText(const U8 type);
136 141
@@ -176,6 +181,9 @@ private:
176 EVertAlignment mVertAlignment; 181 EVertAlignment mVertAlignment;
177 S32 mLOD; 182 S32 mLOD;
178 BOOL mHidden; 183 BOOL mHidden;
184// [RLVa:KB] - Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
185 std::string mObjText;
186// [/RLVa:KB]
179 187
180 static BOOL sDisplayText ; 188 static BOOL sDisplayText ;
181 static std::set<LLPointer<LLHUDText> > sTextObjects; 189 static std::set<LLPointer<LLHUDText> > sTextObjects;
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp
index 63d7907..9368e4e 100644
--- a/linden/indra/newview/llimpanel.cpp
+++ b/linden/indra/newview/llimpanel.cpp
@@ -74,6 +74,7 @@
74#include "llhttpclient.h" 74#include "llhttpclient.h"
75#include "llmutelist.h" 75#include "llmutelist.h"
76#include "llstylemap.h" 76#include "llstylemap.h"
77#include <sys/stat.h>
77 78
78// 79//
79// Constants 80// Constants
@@ -1279,6 +1280,10 @@ BOOL LLFloaterIMPanel::postBuild()
1279 requires<LLLineEditor>("chat_editor"); 1280 requires<LLLineEditor>("chat_editor");
1280 requires<LLTextEditor>("im_history"); 1281 requires<LLTextEditor>("im_history");
1281 1282
1283#if LL_LINUX || LL_DARWIN
1284 childSetVisible("history_btn", false);
1285#endif
1286
1282 if (checkRequirements()) 1287 if (checkRequirements())
1283 { 1288 {
1284 mInputEditor = getChild<LLLineEditor>("chat_editor"); 1289 mInputEditor = getChild<LLLineEditor>("chat_editor");
@@ -1293,6 +1298,7 @@ BOOL LLFloaterIMPanel::postBuild()
1293 1298
1294 childSetAction("profile_callee_btn", onClickProfile, this); 1299 childSetAction("profile_callee_btn", onClickProfile, this);
1295 childSetAction("group_info_btn", onClickGroupInfo, this); 1300 childSetAction("group_info_btn", onClickGroupInfo, this);
1301 childSetAction("history_btn", onClickHistory, this);
1296 1302
1297 childSetAction("start_call_btn", onClickStartCall, this); 1303 childSetAction("start_call_btn", onClickStartCall, this);
1298 childSetAction("end_call_btn", onClickEndCall, this); 1304 childSetAction("end_call_btn", onClickEndCall, this);
@@ -1806,6 +1812,41 @@ void LLFloaterIMPanel::onClickProfile( void* userdata )
1806} 1812}
1807 1813
1808// static 1814// static
1815void LLFloaterIMPanel::onClickHistory( void* userdata )
1816{
1817 LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata;
1818
1819 if (self->mOtherParticipantUUID.notNull())
1820 {
1821 struct stat fileInfo;
1822 int result;
1823
1824 std::string fullname = self->getTitle();;
1825 //gCacheName->getFullName(self->mOtherParticipantUUID, fullname);
1826 //if(fullname == "(Loading...)")
1827 std::string file_path = gDirUtilp->getPerAccountChatLogsDir() + "\\" + fullname + ".txt";
1828
1829 // check if file exists by trying to get its attributes
1830 result = stat(file_path.c_str(), &fileInfo);
1831 if(result == 0)
1832 {
1833 char command[256];
1834 sprintf(command, "\"%s\\%s.txt\"", gDirUtilp->getPerAccountChatLogsDir().c_str(),fullname.c_str());
1835 gViewerWindow->getWindow()->ShellEx(command);
1836
1837 llinfos << command << llendl;
1838 }
1839 else
1840 {
1841 LLStringUtil::format_map_t args;
1842 args["[NAME]"] = fullname;
1843 gViewerWindow->alertXml("IMLogNotFound", args);
1844 llinfos << file_path << llendl;
1845 }
1846 }
1847}
1848
1849// static
1809void LLFloaterIMPanel::onClickGroupInfo( void* userdata ) 1850void LLFloaterIMPanel::onClickGroupInfo( void* userdata )
1810{ 1851{
1811 // Bring up the Profile window 1852 // Bring up the Profile window
@@ -2015,6 +2056,42 @@ void LLFloaterIMPanel::sendMsg()
2015 std::string utf8_text = wstring_to_utf8str(text); 2056 std::string utf8_text = wstring_to_utf8str(text);
2016 utf8_text = utf8str_truncate(utf8_text, MAX_MSG_BUF_SIZE - 1); 2057 utf8_text = utf8str_truncate(utf8_text, MAX_MSG_BUF_SIZE - 1);
2017 2058
2059// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-1.0.0g
2060 if (gRlvHandler.hasBehaviour(RLV_BHVR_SENDIM))
2061 {
2062 if (IM_NOTHING_SPECIAL == mDialog) // One-on-one IM: allow if recipient is a sendim exception
2063 {
2064 if (!gRlvHandler.isException(RLV_BHVR_SENDIM, mOtherParticipantUUID))
2065 utf8_text = rlv_handler_t::cstrBlockedSendIM;
2066 }
2067 else if (gAgent.isInGroup(mSessionUUID)) // Group chat: allow if recipient is a sendim exception
2068 {
2069 if (!gRlvHandler.isException(RLV_BHVR_SENDIM, mSessionUUID))
2070 utf8_text = rlv_handler_t::cstrBlockedSendIM;
2071 }
2072 else if (mSpeakers) // Conference chat: allow if all participants are sendim exceptions
2073 {
2074 LLSpeakerMgr::speaker_list_t speakers;
2075 mSpeakers->getSpeakerList(&speakers, TRUE);
2076
2077 for (LLSpeakerMgr::speaker_list_t::const_iterator itSpeaker = speakers.begin();
2078 itSpeaker != speakers.end(); ++itSpeaker)
2079 {
2080 LLSpeaker* pSpeaker = *itSpeaker;
2081 if ( (gAgent.getID() != pSpeaker->mID) && (!gRlvHandler.isException(RLV_BHVR_SENDIM, pSpeaker->mID)) )
2082 {
2083 utf8_text = rlv_handler_t::cstrBlockedSendIM;
2084 break;
2085 }
2086 }
2087 }
2088 else // Catch all fall-through
2089 {
2090 utf8_text = rlv_handler_t::cstrBlockedSendIM;
2091 }
2092 }
2093// [/RLVa:KB]
2094
2018 if ( mSessionInitialized ) 2095 if ( mSessionInitialized )
2019 { 2096 {
2020 deliver_message(utf8_text, 2097 deliver_message(utf8_text,
diff --git a/linden/indra/newview/llimpanel.h b/linden/indra/newview/llimpanel.h
index 90cab61..f3477bb 100644
--- a/linden/indra/newview/llimpanel.h
+++ b/linden/indra/newview/llimpanel.h
@@ -231,6 +231,7 @@ public:
231 static void onTabClick( void* userdata ); 231 static void onTabClick( void* userdata );
232 232
233 static void onClickProfile( void* userdata ); 233 static void onClickProfile( void* userdata );
234 static void onClickHistory( void* userdata );
234 static void onClickGroupInfo( void* userdata ); 235 static void onClickGroupInfo( void* userdata );
235 static void onClickOfferTeleport( void* userdata ); 236 static void onClickOfferTeleport( void* userdata );
236 static void onClickClose( void* userdata ); 237 static void onClickClose( void* userdata );
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp
index 08e274b..790e20b 100644
--- a/linden/indra/newview/llimview.cpp
+++ b/linden/indra/newview/llimview.cpp
@@ -1515,6 +1515,19 @@ public:
1515 { 1515 {
1516 return; 1516 return;
1517 } 1517 }
1518// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
1519 // TODO-RLVa: duplicate from process_improved_im()?
1520 if (gRlvHandler.hasBehaviour(RLV_BHVR_RECVIM))
1521 {
1522 if (gAgent.isInGroup(session_id))
1523 {
1524 if (!gRlvHandler.isException(RLV_BHVR_RECVIM, session_id))
1525 return;
1526 }
1527 else if (!gRlvHandler.isException(RLV_BHVR_RECVIM, from_id))
1528 message = message.substr(0, message_offset) + rlv_handler_t::cstrBlockedRecvIM;
1529 }
1530// [/RLVa:KB]
1518 1531
1519 // standard message, not from system 1532 // standard message, not from system
1520 std::string saved; 1533 std::string saved;
diff --git a/linden/indra/newview/llinventoryactions.cpp b/linden/indra/newview/llinventoryactions.cpp
index 083ec7c..d7af8d1 100644
--- a/linden/indra/newview/llinventoryactions.cpp
+++ b/linden/indra/newview/llinventoryactions.cpp
@@ -86,6 +86,9 @@
86#include "lluictrlfactory.h" 86#include "lluictrlfactory.h"
87#include "llselectmgr.h" 87#include "llselectmgr.h"
88 88
89// Defined in llinventorybridge.cpp
90void wear_attachments_on_avatar(const std::set<LLUUID>& item_ids, BOOL remove);
91
89const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not) 92const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not)
90const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably not) 93const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably not)
91const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not) 94const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not)
@@ -116,6 +119,12 @@ bool doToSelected(LLFolderView* folder, std::string action)
116 std::set<LLUUID> selected_items; 119 std::set<LLUUID> selected_items;
117 folder->getSelectionList(selected_items); 120 folder->getSelectionList(selected_items);
118 121
122 if ( ("attach" == action) && (selected_items.size() > 1) )
123 {
124 wear_attachments_on_avatar(selected_items, FALSE);
125 return true;
126 }
127
119 LLMultiPreview* multi_previewp = NULL; 128 LLMultiPreview* multi_previewp = NULL;
120 LLMultiProperties* multi_propertiesp = NULL; 129 LLMultiProperties* multi_propertiesp = NULL;
121 130
@@ -467,6 +476,56 @@ class LLDoCreateFloater : public inventory_listener_t
467 } 476 }
468}; 477};
469 478
479//Handles the search type buttons
480class SetSearchType : public inventory_listener_t
481{
482 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
483 {
484 std::string search_type = userdata.asString();
485 if(search_type == "name")
486 {
487 gSavedSettings.setU32("InventorySearchType", 0);
488
489 mPtr->getControl("Inventory.SearchByName")->setValue(TRUE);
490 mPtr->getControl("Inventory.SearchByCreator")->setValue(FALSE);
491 mPtr->getControl("Inventory.SearchByDesc")->setValue(FALSE);
492 mPtr->getControl("Inventory.SearchByAll")->setValue(FALSE);
493 }
494 else if(search_type == "creator")
495 {
496 gSavedSettings.setU32("InventorySearchType", 1);
497
498 mPtr->getControl("Inventory.SearchByName")->setValue(FALSE);
499 mPtr->getControl("Inventory.SearchByCreator")->setValue(TRUE);
500 mPtr->getControl("Inventory.SearchByDesc")->setValue(FALSE);
501 mPtr->getControl("Inventory.SearchByAll")->setValue(FALSE);
502 }
503 else if(search_type == "desc")
504 {
505 gSavedSettings.setU32("InventorySearchType", 2);
506
507 mPtr->getControl("Inventory.SearchByName")->setValue(FALSE);
508 mPtr->getControl("Inventory.SearchByCreator")->setValue(FALSE);
509 mPtr->getControl("Inventory.SearchByDesc")->setValue(TRUE);
510 mPtr->getControl("Inventory.SearchByAll")->setValue(FALSE);
511 }
512 else if(search_type == "all")
513 {
514 gSavedSettings.setU32("InventorySearchType", 3);
515
516 mPtr->getControl("Inventory.SearchByName")->setValue(FALSE);
517 mPtr->getControl("Inventory.SearchByCreator")->setValue(FALSE);
518 mPtr->getControl("Inventory.SearchByDesc")->setValue(FALSE);
519 mPtr->getControl("Inventory.SearchByAll")->setValue(TRUE);
520 }
521
522 //Clear search when switching modes.
523 mPtr->getActivePanel()->setFilterSubString(LLStringUtil::null);
524 mPtr->getActivePanel()->setFilterTypes(LLInventoryType::NIT_ALL);
525 return true;
526 }
527};
528
470class LLSetSortBy : public inventory_listener_t 529class LLSetSortBy : public inventory_listener_t
471{ 530{
472 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 531 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -714,6 +773,8 @@ void init_inventory_actions(LLInventoryView *floater)
714 (new LLShowFilters())->registerListener(floater, "Inventory.ShowFilters"); 773 (new LLShowFilters())->registerListener(floater, "Inventory.ShowFilters");
715 (new LLResetFilter())->registerListener(floater, "Inventory.ResetFilter"); 774 (new LLResetFilter())->registerListener(floater, "Inventory.ResetFilter");
716 (new LLSetSortBy())->registerListener(floater, "Inventory.SetSortBy"); 775 (new LLSetSortBy())->registerListener(floater, "Inventory.SetSortBy");
776
777 (new SetSearchType())->registerListener(floater, "Inventory.SetSearchBy");
717} 778}
718 779
719void init_inventory_panel_actions(LLInventoryPanel *panel) 780void init_inventory_panel_actions(LLInventoryPanel *panel)
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index cd38185..5a4fad7 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -112,6 +112,8 @@ void remove_inventory_category_from_avatar(LLInventoryCategory* category);
112void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata); 112void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata);
113bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); 113bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*);
114bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response); 114bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response);
115void wear_attachments_on_avatar(const std::set<LLUUID>& item_ids, BOOL remove);
116void wear_attachments_on_avatar(const LLInventoryModel::item_array_t& items, BOOL remove);
115 117
116std::string ICON_NAME[ICON_NAME_COUNT] = 118std::string ICON_NAME[ICON_NAME_COUNT] =
117{ 119{
@@ -1944,6 +1946,12 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
1944 LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); 1946 LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
1945 LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); 1947 LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
1946 1948
1949// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
1950 // Fixes LL bug
1951 mItems.clear();
1952 mDisabledItems.clear();
1953// [/RLVa:KB]
1954
1947 if (lost_and_found_id == mUUID) 1955 if (lost_and_found_id == mUUID)
1948 { 1956 {
1949 // This is the lost+found folder. 1957 // This is the lost+found folder.
@@ -2965,6 +2973,13 @@ void open_notecard(LLViewerInventoryItem* inv_item,
2965 const LLUUID& source_id, 2973 const LLUUID& source_id,
2966 BOOL take_focus) 2974 BOOL take_focus)
2967{ 2975{
2976// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
2977 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWNOTE)) )
2978 {
2979 return;
2980 }
2981// [/RLVa:KB]
2982
2968 // See if we can bring an existing preview to the front 2983 // See if we can bring an existing preview to the front
2969 if(!LLPreview::show(inv_item->getUUID(), take_focus)) 2984 if(!LLPreview::show(inv_item->getUUID(), take_focus))
2970 { 2985 {
@@ -3290,7 +3305,14 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
3290 item = (LLViewerInventoryItem*)gInventory.getItem(object_id); 3305 item = (LLViewerInventoryItem*)gInventory.getItem(object_id);
3291 if(item && gInventory.isObjectDescendentOf(object_id, gAgent.getInventoryRootID())) 3306 if(item && gInventory.isObjectDescendentOf(object_id, gAgent.getInventoryRootID()))
3292 { 3307 {
3293 rez_attachment(item, NULL); 3308// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
3309 // User picked "Wear" so either nothing is locked, or we need to look up the specific attach point from its name
3310 // (NOTE: rez_attachment will take care of deciding whether or not we *can* attach)
3311 rez_attachment(item,
3312 ((!rlv_handler_t::isEnabled()) || (!gRlvHandler.hasLockedAttachment()) || (RlvSettings::getEnableWear()))
3313 ? NULL : gRlvHandler.getAttachPoint(item, true));
3314// [/RLVa:KB]
3315// rez_attachment(item, NULL);
3294 } 3316 }
3295 else if(item && item->isComplete()) 3317 else if(item && item->isComplete())
3296 { 3318 {
@@ -3309,6 +3331,15 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
3309 else if ("detach" == action) 3331 else if ("detach" == action)
3310 { 3332 {
3311 LLInventoryItem* item = gInventory.getItem(mUUID); 3333 LLInventoryItem* item = gInventory.getItem(mUUID);
3334
3335// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
3336 // Fall-through: if there's a "Detach from yourself" code path we missed then we'll still disallow the detach here
3337 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(item)) )
3338 {
3339 return;
3340 }
3341// [/RLVa:KB]
3342
3312 if( item ) 3343 if( item )
3313 { 3344 {
3314 gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); 3345 gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
@@ -3472,6 +3503,11 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
3472 if( avatarp->isWearingAttachment( mUUID ) ) 3503 if( avatarp->isWearingAttachment( mUUID ) )
3473 { 3504 {
3474 items.push_back(std::string("Detach From Yourself")); 3505 items.push_back(std::string("Detach From Yourself"));
3506
3507// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
3508 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(item)) )
3509 disabled_items.push_back(std::string("Detach From Yourself"));
3510// [/RLVa:KB]
3475 } 3511 }
3476 else 3512 else
3477 if( !isInTrash() ) 3513 if( !isInTrash() )
@@ -3483,6 +3519,16 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
3483 items.push_back(std::string("RestoreToWorld Separator")); 3519 items.push_back(std::string("RestoreToWorld Separator"));
3484 items.push_back(std::string("Restore to Last Position")); 3520 items.push_back(std::string("Restore to Last Position"));
3485 3521
3522// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-0.2.0c
3523 // Only enable "Wear" if there is an attach point name *and* there isn't a worn attachment there that's currently locked
3524 if ( (rlv_handler_t::isEnabled()) && (!RlvSettings::getEnableWear()) && (gRlvHandler.hasLockedAttachment()) )
3525 {
3526 LLViewerJointAttachment* pAttachPt = gRlvHandler.getAttachPoint(item, true);
3527 if ( (!pAttachPt) || (!gRlvHandler.isDetachable(pAttachPt)) )
3528 disabled_items.push_back(std::string("Object Wear"));
3529 }
3530// [/RLVa:KB]
3531
3486 LLMenuGL* attach_menu = menu.getChildMenuByName("Attach To", TRUE); 3532 LLMenuGL* attach_menu = menu.getChildMenuByName("Attach To", TRUE);
3487 LLMenuGL* attach_hud_menu = menu.getChildMenuByName("Attach To HUD", TRUE); 3533 LLMenuGL* attach_hud_menu = menu.getChildMenuByName("Attach To HUD", TRUE);
3488 LLVOAvatar *avatarp = gAgent.getAvatarObject(); 3534 LLVOAvatar *avatarp = gAgent.getAvatarObject();
@@ -3498,15 +3544,27 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
3498 LLMenuItemCallGL *new_item; 3544 LLMenuItemCallGL *new_item;
3499 if (attachment->getIsHUDAttachment()) 3545 if (attachment->getIsHUDAttachment())
3500 { 3546 {
3547// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
3501 attach_hud_menu->append(new_item = new LLMenuItemCallGL(attachment->getName(), 3548 attach_hud_menu->append(new_item = new LLMenuItemCallGL(attachment->getName(),
3502 NULL, //&LLObjectBridge::attachToAvatar, 3549 NULL, //&LLObjectBridge::attachToAvatar,
3503 NULL, &attach_label, (void*)attachment)); 3550 (rlv_handler_t::isEnabled()) ? &rlvAttachToEnabler : NULL,
3551 &attach_label, (void*)attachment));
3552// [/RLVa:KB]
3553 //attach_hud_menu->append(new_item = new LLMenuItemCallGL(attachment->getName(),
3554 // NULL, //&LLObjectBridge::attachToAvatar,
3555 // NULL, &attach_label, (void*)attachment));
3504 } 3556 }
3505 else 3557 else
3506 { 3558 {
3559// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
3507 attach_menu->append(new_item = new LLMenuItemCallGL(attachment->getName(), 3560 attach_menu->append(new_item = new LLMenuItemCallGL(attachment->getName(),
3508 NULL, //&LLObjectBridge::attachToAvatar, 3561 NULL, //&LLObjectBridge::attachToAvatar,
3509 NULL, &attach_label, (void*)attachment)); 3562 (rlv_handler_t::isEnabled()) ? &rlvAttachToEnabler : NULL,
3563 &attach_label, (void*)attachment));
3564// [/RLVa:KB]
3565 //attach_menu->append(new_item = new LLMenuItemCallGL(attachment->getName(),
3566 // NULL, //&LLObjectBridge::attachToAvatar,
3567 // NULL, &attach_label, (void*)attachment));
3510 } 3568 }
3511 3569
3512 LLSimpleListener* callback = mInventoryPanel->getListenerByName("Inventory.AttachObject"); 3570 LLSimpleListener* callback = mInventoryPanel->getListenerByName("Inventory.AttachObject");
@@ -3703,6 +3761,31 @@ private:
3703 bool mAppend; 3761 bool mAppend;
3704}; 3762};
3705 3763
3764class LLWearAttachmentsCallback : public LLInventoryCallback
3765{
3766public:
3767 LLWearAttachmentsCallback(bool append) : mAppend(append) {}
3768 void fire(const LLUUID& item_id)
3769 {
3770 mItemIDs.insert(item_id);
3771 }
3772protected:
3773 ~LLWearAttachmentsCallback()
3774 {
3775 if( LLInventoryCallbackManager::is_instantiated() )
3776 {
3777 wear_attachments_on_avatar(mItemIDs, mAppend);
3778 }
3779 else
3780 {
3781 llwarns << "Dropping unhandled LLWearAttachments" << llendl;
3782 }
3783 }
3784private:
3785 std::set<LLUUID> mItemIDs;
3786 bool mAppend;
3787};
3788
3706void LLOutfitObserver::done() 3789void LLOutfitObserver::done()
3707{ 3790{
3708 // We now have an outfit ready to be copied to agent inventory. Do 3791 // We now have an outfit ready to be copied to agent inventory. Do
@@ -3986,6 +4069,20 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, void* userdata )
3986 is_gesture); 4069 is_gesture);
3987 S32 gest_count = gest_item_array.count(); 4070 S32 gest_count = gest_item_array.count();
3988 4071
4072// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-1.0.0c
4073 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment()) && (!RlvSettings::getEnableWear()) )
4074 {
4075 // Filter anything that doesn't specify an attachment point (or that specifies one that's currently locked)
4076 for (S32 idxObj = obj_item_array.count() - 1; idxObj >= 0; idxObj--)
4077 {
4078 LLViewerJointAttachment* pAttachPt = gRlvHandler.getAttachPoint(obj_item_array.get(idxObj).get(), true);
4079 if ( ((!pAttachPt) || (!gRlvHandler.isDetachable(pAttachPt))) )
4080 obj_item_array.remove(idxObj);
4081 }
4082 obj_count = obj_item_array.count();
4083 }
4084// [/RLVa:KB]
4085
3989 if( !wearable_count && !obj_count && !gest_count) 4086 if( !wearable_count && !obj_count && !gest_count)
3990 { 4087 {
3991 LLNotifications::instance().add("CouldNotPutOnOutfit"); 4088 LLNotifications::instance().add("CouldNotPutOnOutfit");
@@ -4058,57 +4155,7 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, void* userdata )
4058 if( obj_count > 0 ) 4155 if( obj_count > 0 )
4059 { 4156 {
4060 // We've found some attachements. Add these. 4157 // We've found some attachements. Add these.
4061 4158 wear_attachments_on_avatar(obj_item_array, !wear_info->mAppend);
4062 LLVOAvatar* avatar = gAgent.getAvatarObject();
4063 if( avatar )
4064 {
4065 // Build a compound message to send all the objects that need to be rezzed.
4066
4067 // Limit number of packets to send
4068 const S32 MAX_PACKETS_TO_SEND = 10;
4069 const S32 OBJECTS_PER_PACKET = 4;
4070 const S32 MAX_OBJECTS_TO_SEND = MAX_PACKETS_TO_SEND * OBJECTS_PER_PACKET;
4071 if( obj_count > MAX_OBJECTS_TO_SEND )
4072 {
4073 obj_count = MAX_OBJECTS_TO_SEND;
4074 }
4075
4076 // Create an id to keep the parts of the compound message together
4077 LLUUID compound_msg_id;
4078 compound_msg_id.generate();
4079 LLMessageSystem* msg = gMessageSystem;
4080
4081 for(i = 0; i < obj_count; ++i)
4082 {
4083 if( 0 == (i % OBJECTS_PER_PACKET) )
4084 {
4085 // Start a new message chunk
4086 msg->newMessageFast(_PREHASH_RezMultipleAttachmentsFromInv);
4087 msg->nextBlockFast(_PREHASH_AgentData);
4088 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
4089 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
4090 msg->nextBlockFast(_PREHASH_HeaderData);
4091 msg->addUUIDFast(_PREHASH_CompoundMsgID, compound_msg_id );
4092 msg->addU8Fast(_PREHASH_TotalObjects, obj_count );
4093 msg->addBOOLFast(_PREHASH_FirstDetachAll, !wear_info->mAppend );
4094 }
4095
4096 LLInventoryItem* item = obj_item_array.get(i);
4097 msg->nextBlockFast(_PREHASH_ObjectData );
4098 msg->addUUIDFast(_PREHASH_ItemID, item->getUUID() );
4099 msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner());
4100 msg->addU8Fast(_PREHASH_AttachmentPt, 0 ); // Wear at the previous or default attachment point
4101 pack_permissions_slam(msg, item->getFlags(), item->getPermissions());
4102 msg->addStringFast(_PREHASH_Name, item->getName());
4103 msg->addStringFast(_PREHASH_Description, item->getDescription());
4104
4105 if( (i+1 == obj_count) || ((OBJECTS_PER_PACKET-1) == (i % OBJECTS_PER_PACKET)) )
4106 {
4107 // End of message chunk
4108 msg->sendReliable( gAgent.getRegion()->getHost() );
4109 }
4110 }
4111 }
4112 } 4159 }
4113 } 4160 }
4114 delete wear_info; 4161 delete wear_info;
@@ -4173,6 +4220,13 @@ void wear_inventory_category_on_avatar_step3(LLWearableHoldingPattern* holder, B
4173// item->setAssetUUID(wearable->getID()); 4220// item->setAssetUUID(wearable->getID());
4174// item->updateAssetOnServer(); 4221// item->updateAssetOnServer();
4175// } 4222// }
4223// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-1.0.0c
4224 if ( (!gRlvHandler.isWearable(wearable->getType())) ||
4225 ( (!gRlvHandler.isRemovable(wearable->getType())) && (gAgent.getWearable(wearable->getType())) ) )
4226 {
4227 continue;
4228 }
4229// [/RLVa:KB]
4176 items.put(item); 4230 items.put(item);
4177 wearables.put(wearable); 4231 wearables.put(wearable);
4178 } 4232 }
@@ -4192,6 +4246,117 @@ void wear_inventory_category_on_avatar_step3(LLWearableHoldingPattern* holder, B
4192 dec_busy_count(); 4246 dec_busy_count();
4193} 4247}
4194 4248
4249void wear_attachments_on_avatar(const std::set<LLUUID>& item_ids, BOOL remove)
4250{
4251 // NOTE: the inventory items can reside in the user's inventory, the library, or any combination of the two
4252
4253 LLInventoryModel::item_array_t items;
4254 LLPointer<LLInventoryCallback> cb;
4255
4256 for (std::set<LLUUID>::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it)
4257 {
4258 LLViewerInventoryItem* item = gInventory.getItem(*it);
4259 if ( (item) && (LLAssetType::AT_OBJECT == item->getType()) )
4260 {
4261 if ( (gInventory.isObjectDescendentOf(*it, gAgent.getInventoryRootID())) )
4262 {
4263// items.put(item);
4264// [RLVa:KB] - Checked: 2009-09-11 (RLVa-1.0.2c) | Modified: RLVa-1.0.2c
4265 LLViewerJointAttachment* pAttachPt = NULL;
4266 if ( (!rlv_handler_t::isEnabled()) || (RlvSettings::getEnableWear()) || (!gRlvHandler.hasLockedAttachment()) ||
4267 (((pAttachPt = gRlvHandler.getAttachPoint(item, true)) != NULL) && (gRlvHandler.isDetachable(pAttachPt))) )
4268 {
4269 items.put(item);
4270 }
4271// [/RLVa:KB]
4272 }
4273 else if ( (item->isComplete()) )
4274 {
4275 if (cb.isNull())
4276 cb = new LLWearAttachmentsCallback(remove);
4277 copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(), LLUUID::null, std::string(), cb);
4278 }
4279 }
4280 }
4281
4282 wear_attachments_on_avatar(items, remove);
4283}
4284
4285void wear_attachments_on_avatar(const LLInventoryModel::item_array_t& items, BOOL remove)
4286{
4287 // NOTE: all inventory items must reside in the user's inventory
4288
4289 LLVOAvatar* avatarp = gAgent.getAvatarObject();
4290 if(!avatarp)
4291 {
4292 llwarns << "No avatar found." << llendl;
4293 return;
4294 }
4295
4296 // Build a compound message to send all the objects that need to be rezzed.
4297
4298 // Limit number of packets to send
4299 const S32 MAX_PACKETS_TO_SEND = 10;
4300 const S32 OBJECTS_PER_PACKET = 4;
4301 const S32 MAX_OBJECTS_TO_SEND = MAX_PACKETS_TO_SEND * OBJECTS_PER_PACKET;
4302
4303 S32 count = items.count();
4304 if ( !count )
4305 {
4306 return;
4307 }
4308 else if ( count > MAX_OBJECTS_TO_SEND )
4309 {
4310 count = MAX_OBJECTS_TO_SEND;
4311 }
4312
4313 // Create an id to keep the parts of the compound message together
4314 LLUUID compound_msg_id;
4315 compound_msg_id.generate();
4316 LLMessageSystem* msg = gMessageSystem;
4317
4318 for(S32 i = 0; i < count; ++i)
4319 {
4320 if( 0 == (i % OBJECTS_PER_PACKET) )
4321 {
4322 // Start a new message chunk
4323 msg->newMessageFast(_PREHASH_RezMultipleAttachmentsFromInv);
4324 msg->nextBlockFast(_PREHASH_AgentData);
4325 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
4326 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
4327 msg->nextBlockFast(_PREHASH_HeaderData);
4328 msg->addUUIDFast(_PREHASH_CompoundMsgID, compound_msg_id );
4329 msg->addU8Fast(_PREHASH_TotalObjects, count );
4330// msg->addBOOLFast(_PREHASH_FirstDetachAll, remove );
4331// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Added: RLVa-0.2.2a
4332 // This really should just *always* be FALSE since TRUE can result in loss of the current asset state
4333 msg->addBOOLFast(_PREHASH_FirstDetachAll, remove && (!gRlvHandler.hasLockedAttachment()) );
4334// [/RLVa:KB]
4335 }
4336
4337 LLInventoryItem* item = items.get(i);
4338 msg->nextBlockFast(_PREHASH_ObjectData );
4339 msg->addUUIDFast(_PREHASH_ItemID, item->getUUID() );
4340 msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner());
4341// msg->addU8Fast(_PREHASH_AttachmentPt, 0 ); // Wear at the previous or default attachment point
4342// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Added: RLVa-0.2.2a
4343 msg->addU8Fast(_PREHASH_AttachmentPt,
4344 ( (!rlv_handler_t::isEnabled()) || (RlvSettings::getEnableWear()) || (!gRlvHandler.hasLockedAttachment()) )
4345 ? 0
4346 : gRlvHandler.getAttachPointIndex(gRlvHandler.getAttachPoint(item, true)));
4347// [/RLVa:KB]
4348 pack_permissions_slam(msg, item->getFlags(), item->getPermissions());
4349 msg->addStringFast(_PREHASH_Name, item->getName());
4350 msg->addStringFast(_PREHASH_Description, item->getDescription());
4351
4352 if( (i+1 == count) || ((OBJECTS_PER_PACKET-1) == (i % OBJECTS_PER_PACKET)) )
4353 {
4354 // End of message chunk
4355 msg->sendReliable( gAgent.getRegion()->getHost() );
4356 }
4357 }
4358}
4359
4195void remove_inventory_category_from_avatar( LLInventoryCategory* category ) 4360void remove_inventory_category_from_avatar( LLInventoryCategory* category )
4196{ 4361{
4197 if(!category) return; 4362 if(!category) return;
@@ -4261,7 +4426,11 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata)
4261 { 4426 {
4262 for(i = 0; i < wearable_count; ++i) 4427 for(i = 0; i < wearable_count; ++i)
4263 { 4428 {
4264 if( gAgent.isWearingItem (item_array.get(i)->getUUID()) ) 4429// if( gAgent.isWearingItem (item_array.get(i)->getUUID()) )
4430// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d) | Modified: RLVa-0.2.2a
4431 LLWearable* pWearable = gAgent.getWearableFromWearableItem(item_array.get(i)->getUUID());
4432 if ( (pWearable) && ( (!rlv_handler_t::isEnabled()) || (gRlvHandler.isRemovable(pWearable->getType()))) )
4433// [/RLVa:KB]
4265 { 4434 {
4266 gWearableList.getAsset(item_array.get(i)->getAssetUUID(), 4435 gWearableList.getAsset(item_array.get(i)->getAssetUUID(),
4267 item_array.get(i)->getName(), 4436 item_array.get(i)->getName(),
@@ -4278,6 +4447,18 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata)
4278 { 4447 {
4279 for(i = 0; i < obj_count; ++i) 4448 for(i = 0; i < obj_count; ++i)
4280 { 4449 {
4450// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-0.2.2a
4451 // TODO-RLVa: is there a reason why LL doesn't bother checking to see if you're actually wearing the object?
4452 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment()) )
4453 {
4454 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
4455 if ( (!pAvatar) || (!pAvatar->isWearingAttachment(obj_item_array.get(i)->getUUID())) ||
4456 (!gRlvHandler.isDetachable(obj_item_array.get(i).get())) ) // Why does LLPointer have a cast to BOOL aka S32???
4457 {
4458 continue;
4459 }
4460 }
4461// [/RVLa:KB]
4281 gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); 4462 gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
4282 gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); 4463 gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
4283 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); 4464 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
@@ -4670,8 +4851,11 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
4670 { 4851 {
4671 EWearableType type = wearable->getType(); 4852 EWearableType type = wearable->getType();
4672 4853
4673 if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR ) ) //&& 4854 //if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR ) ) //&&
4674 //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) 4855 //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) )
4856// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.2a | SL big fix
4857 if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES) )
4858// [/RLVa:KB]
4675 { 4859 {
4676 gAgent.removeWearable( type ); 4860 gAgent.removeWearable( type );
4677 } 4861 }
diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp
index f98a3f9..5a6a26b 100644
--- a/linden/indra/newview/llinventorymodel.cpp
+++ b/linden/indra/newview/llinventorymodel.cpp
@@ -1500,6 +1500,8 @@ void LLInventoryModel::stopBackgroundFetch()
1500//static 1500//static
1501void LLInventoryModel::backgroundFetch(void*) 1501void LLInventoryModel::backgroundFetch(void*)
1502{ 1502{
1503 if (gDisconnected)
1504 return;
1503 if (sBackgroundFetchActive && gAgent.getRegion()) 1505 if (sBackgroundFetchActive && gAgent.getRegion())
1504 { 1506 {
1505 //If we'll be using the capability, we'll be sending batches and the background thing isn't as important. 1507 //If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
@@ -2877,6 +2879,14 @@ void LLInventoryModel::processSaveAssetIntoInventory(LLMessageSystem* msg,
2877 llinfos << "LLInventoryModel::processSaveAssetIntoInventory item" 2879 llinfos << "LLInventoryModel::processSaveAssetIntoInventory item"
2878 " not found: " << item_id << llendl; 2880 " not found: " << item_id << llendl;
2879 } 2881 }
2882
2883// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0e
2884 if (rlv_handler_t::isEnabled())
2885 {
2886 gRlvHandler.onSavedAssetIntoInventory(item_id);
2887 }
2888// [/RLVa:KB]
2889
2880 if(gViewerWindow) 2890 if(gViewerWindow)
2881 { 2891 {
2882 gViewerWindow->getWindow()->decBusyCount(); 2892 gViewerWindow->getWindow()->decBusyCount();
@@ -2919,6 +2929,23 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
2919 // << llendl; 2929 // << llendl;
2920 if(tfolder->getUUID().notNull()) 2930 if(tfolder->getUUID().notNull())
2921 { 2931 {
2932// [RLVa:KB] - Checked: 2009-08-07 (RLVa-1.0.1f) | Added: RLVa-1.0.0f
2933 // TODO-RLVa: this really shouldn't go here, but if the inventory offer spans multiple BulkUpdateInventory messages
2934 // then the second message will cause the viewer to show the folder under its original name even though
2935 // it is renamed properly on the inventory server
2936 if ( (rlv_handler_t::isEnabled()) && (!RlvSettings::getForbidGiveToRLV()) )
2937 {
2938 LLViewerInventoryCategory* pRlvRoot = gRlvHandler.getSharedRoot();
2939 std::string strName = tfolder->getName();
2940 if ((pRlvRoot) && (pRlvRoot->getUUID() == tfolder->getParentUUID() ) && (strName.find(RLV_PUTINV_PREFIX) == 0))
2941 {
2942 strName.erase(0, strName.find(RLV_FOLDER_PREFIX_PUTINV)); // Strips the prefix while retaining while the '~'
2943 tfolder->rename(strName);
2944 tfolder->updateServer(FALSE);
2945 }
2946 }
2947// [/RLVa:KB]
2948
2922 folders.push_back(tfolder); 2949 folders.push_back(tfolder);
2923 LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID()); 2950 LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID());
2924 if(folderp) 2951 if(folderp)
diff --git a/linden/indra/newview/llinventorymodel.h b/linden/indra/newview/llinventorymodel.h
index d73fef7..74a2ec7 100644
--- a/linden/indra/newview/llinventorymodel.h
+++ b/linden/indra/newview/llinventorymodel.h
@@ -323,6 +323,8 @@ public:
323 // relations. 323 // relations.
324 void buildParentChildMap(); 324 void buildParentChildMap();
325 325
326 // Empty the entire contents
327 void empty();
326 // 328 //
327 // Category accounting. 329 // Category accounting.
328 // 330 //
@@ -374,6 +376,7 @@ public:
374 static bool isEverythingFetched(); 376 static bool isEverythingFetched();
375 static void backgroundFetch(void*); // background fetch idle function 377 static void backgroundFetch(void*); // background fetch idle function
376 static void incrBulkFetch(S16 fetching) { sBulkFetchCount+=fetching; if (sBulkFetchCount<0) sBulkFetchCount=0; } 378 static void incrBulkFetch(S16 fetching) { sBulkFetchCount+=fetching; if (sBulkFetchCount<0) sBulkFetchCount=0; }
379
377protected: 380protected:
378 381
379 // Internal methods which add inventory and make sure that all of 382 // Internal methods which add inventory and make sure that all of
@@ -387,8 +390,7 @@ protected:
387 // preferred type. Returns LLUUID::null if not found 390 // preferred type. Returns LLUUID::null if not found
388 LLUUID findCatUUID(LLAssetType::EType preferred_type); 391 LLUUID findCatUUID(LLAssetType::EType preferred_type);
389 392
390 // Empty the entire contents 393
391 void empty();
392 394
393 // Given the current state of the inventory items, figure out the 395 // Given the current state of the inventory items, figure out the
394 // clone information. *FIX: This is sub-optimal, since we can 396 // clone information. *FIX: This is sub-optimal, since we can
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp
index 34409ff..f0bfa00 100644
--- a/linden/indra/newview/llinventoryview.cpp
+++ b/linden/indra/newview/llinventoryview.cpp
@@ -522,6 +522,16 @@ void LLInventoryView::init(LLInventoryModel* inventory)
522 addBoolControl("Inventory.FoldersAlwaysByName", sort_folders_by_name ); 522 addBoolControl("Inventory.FoldersAlwaysByName", sort_folders_by_name );
523 addBoolControl("Inventory.SystemFoldersToTop", sort_system_folders_to_top ); 523 addBoolControl("Inventory.SystemFoldersToTop", sort_system_folders_to_top );
524 524
525 //Search Controls
526 U32 search_type = gSavedSettings.getU32("InventorySearchType");
527 BOOL search_by_name = (search_type == 0);
528
529 addBoolControl("Inventory.SearchByName", search_by_name);
530 addBoolControl("Inventory.SearchByCreator", !search_by_name);
531 addBoolControl("Inventory.SearchByDesc", !search_by_name);
532
533 addBoolControl("Inventory.SearchByAll", !search_by_name);
534
525 mSavedFolderState = new LLSaveFolderState(); 535 mSavedFolderState = new LLSaveFolderState();
526 mSavedFolderState->setApply(FALSE); 536 mSavedFolderState->setApply(FALSE);
527 537
@@ -766,7 +776,17 @@ void LLInventoryView::setVisible( BOOL visible )
766// Destroy all but the last floater, which is made invisible. 776// Destroy all but the last floater, which is made invisible.
767void LLInventoryView::onClose(bool app_quitting) 777void LLInventoryView::onClose(bool app_quitting)
768{ 778{
769 S32 count = sActiveViews.count(); 779// S32 count = sActiveViews.count();
780// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
781 // See LLInventoryView::closeAll() on why we're doing it this way
782 S32 count = 0;
783 for (S32 idx = 0, cnt = sActiveViews.count(); idx < cnt; idx++)
784 {
785 if (!sActiveViews.get(idx)->isDead())
786 count++;
787 }
788// [/RLVa:KB]
789
770 if (count > 1) 790 if (count > 1)
771 { 791 {
772 destroy(); 792 destroy();
@@ -844,6 +864,13 @@ LLInventoryView* LLInventoryView::showAgentInventory(BOOL take_keyboard_focus)
844 return NULL; 864 return NULL;
845 } 865 }
846 866
867// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
868 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWINV))
869 {
870 return NULL;
871 }
872// [/RLVa:KB]
873
847 LLInventoryView* iv = LLInventoryView::getActiveInventory(); 874 LLInventoryView* iv = LLInventoryView::getActiveInventory();
848#if 0 && !LL_RELEASE_FOR_DOWNLOAD 875#if 0 && !LL_RELEASE_FOR_DOWNLOAD
849 if (sActiveViews.count() == 1) 876 if (sActiveViews.count() == 1)
@@ -942,6 +969,7 @@ void LLInventoryView::cleanup()
942 { 969 {
943 sActiveViews.get(i)->destroy(); 970 sActiveViews.get(i)->destroy();
944 } 971 }
972 gInventory.empty();
945} 973}
946 974
947void LLInventoryView::toggleFindOptions() 975void LLInventoryView::toggleFindOptions()
diff --git a/linden/indra/newview/llinventoryview.h b/linden/indra/newview/llinventoryview.h
index 1f73d51..0c525c3 100644
--- a/linden/indra/newview/llinventoryview.h
+++ b/linden/indra/newview/llinventoryview.h
@@ -226,6 +226,34 @@ public:
226 static void toggleVisibility(); 226 static void toggleVisibility();
227 static void toggleVisibility(void*) { toggleVisibility(); } 227 static void toggleVisibility(void*) { toggleVisibility(); }
228 228
229// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
230 static void closeAll()
231 {
232 // If there are mulitple inventory floaters open then clicking the "Inventory" button will close
233 // them one by one (see LLToolBar::onClickInventory() => toggleVisibility() ) until we get to the
234 // last one which will just be hidden instead of closed/destroyed (see LLInventoryView::onClose)
235 //
236 // However the view isn't removed from sActiveViews until its destructor is called and since
237 // 'LLMortician::sDestroyImmediate == FALSE' while the viewer is running the destructor won't be
238 // called right away
239 //
240 // Result: we can't call close() on the last (sActiveViews.count() will still be > 1) because
241 // onClose() would take the wrong branch and destroy() it as well
242 //
243 // Workaround: "fix" onClose() to count only views that aren't marked as "dead"
244
245 LLInventoryView* pView; U8 flagsSound;
246 for (S32 idx = sActiveViews.count() - 1; idx >= 0; idx--)
247 {
248 pView = sActiveViews.get(idx);
249 flagsSound = pView->getSoundFlags();
250 pView->setSoundFlags(LLView::SILENT); // Suppress the window close sound
251 pView->close(); // onClose() protects against closing the last inventory floater
252 pView->setSoundFlags(flagsSound); // One view won't be destroy()'ed so it needs its sound flags restored
253 }
254 }
255// [/RLVa:KB]
256
229 // Final cleanup, destroy all open inventory views. 257 // Final cleanup, destroy all open inventory views.
230 static void cleanup(); 258 static void cleanup();
231 259
diff --git a/linden/indra/newview/llmanipscale.cpp b/linden/indra/newview/llmanipscale.cpp
index b1cdfe3..65f99ef 100644
--- a/linden/indra/newview/llmanipscale.cpp
+++ b/linden/indra/newview/llmanipscale.cpp
@@ -70,6 +70,8 @@ const F32 SNAP_GUIDE_SCREEN_LENGTH = 0.7f;
70const F32 SELECTED_MANIPULATOR_SCALE = 1.2f; 70const F32 SELECTED_MANIPULATOR_SCALE = 1.2f;
71const F32 MANIPULATOR_SCALE_HALF_LIFE = 0.07f; 71const F32 MANIPULATOR_SCALE_HALF_LIFE = 0.07f;
72const S32 NUM_MANIPULATORS = 14; 72const S32 NUM_MANIPULATORS = 14;
73const F32 DEFAULT_LL_MAX_PRIM_SCALE = 10.f;
74const F32 DEFAULT_OPENSIM_MAX_PRIM_SCALE = 128.f;
73 75
74const LLManip::EManipPart MANIPULATOR_IDS[NUM_MANIPULATORS] = 76const LLManip::EManipPart MANIPULATOR_IDS[NUM_MANIPULATORS] =
75{ 77{
@@ -174,6 +176,7 @@ LLManipScale::LLManipScale( LLToolComposite* composite )
174 mScaledBoxHandleSize( 1.f ), 176 mScaledBoxHandleSize( 1.f ),
175 mLastMouseX( -1 ), 177 mLastMouseX( -1 ),
176 mLastMouseY( -1 ), 178 mLastMouseY( -1 ),
179 mMaxPrimSize(0.f),
177 mSendUpdateOnMouseUp( FALSE ), 180 mSendUpdateOnMouseUp( FALSE ),
178 mLastUpdateFlags( 0 ), 181 mLastUpdateFlags( 0 ),
179 mScaleSnapUnit1(1.f), 182 mScaleSnapUnit1(1.f),
@@ -202,6 +205,7 @@ void LLManipScale::render()
202 LLGLDepthTest gls_depth(GL_TRUE); 205 LLGLDepthTest gls_depth(GL_TRUE);
203 LLGLEnable gl_blend(GL_BLEND); 206 LLGLEnable gl_blend(GL_BLEND);
204 LLGLEnable gls_alpha_test(GL_ALPHA_TEST); 207 LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
208 mMaxPrimSize = gSavedSettings.getBOOL("LoggedIntoOpenSim") ? DEFAULT_OPENSIM_MAX_PRIM_SCALE : DEFAULT_LL_MAX_PRIM_SCALE;
205 209
206 if( canAffectSelection() ) 210 if( canAffectSelection() )
207 { 211 {
@@ -953,8 +957,8 @@ void LLManipScale::dragCorner( S32 x, S32 y )
953 mInSnapRegime = FALSE; 957 mInSnapRegime = FALSE;
954 } 958 }
955 959
956 F32 max_scale_factor = DEFAULT_MAX_PRIM_SCALE / MIN_PRIM_SCALE; 960 F32 max_scale_factor = mMaxPrimSize / MIN_PRIM_SCALE;
957 F32 min_scale_factor = MIN_PRIM_SCALE / DEFAULT_MAX_PRIM_SCALE; 961 F32 min_scale_factor = MIN_PRIM_SCALE / mMaxPrimSize;
958 962
959 // find max and min scale factors that will make biggest object hit max absolute scale and smallest object hit min absolute scale 963 // find max and min scale factors that will make biggest object hit max absolute scale and smallest object hit min absolute scale
960 for (LLObjectSelection::iterator iter = mObjectSelection->begin(); 964 for (LLObjectSelection::iterator iter = mObjectSelection->begin();
@@ -966,7 +970,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )
966 { 970 {
967 const LLVector3& scale = selectNode->mSavedScale; 971 const LLVector3& scale = selectNode->mSavedScale;
968 972
969 F32 cur_max_scale_factor = llmin( DEFAULT_MAX_PRIM_SCALE / scale.mV[VX], DEFAULT_MAX_PRIM_SCALE / scale.mV[VY], DEFAULT_MAX_PRIM_SCALE / scale.mV[VZ] ); 973 F32 cur_max_scale_factor = llmin( mMaxPrimSize / scale.mV[VX], mMaxPrimSize / scale.mV[VY], mMaxPrimSize / scale.mV[VZ] );
970 max_scale_factor = llmin( max_scale_factor, cur_max_scale_factor ); 974 max_scale_factor = llmin( max_scale_factor, cur_max_scale_factor );
971 975
972 F32 cur_min_scale_factor = llmax( MIN_PRIM_SCALE / scale.mV[VX], MIN_PRIM_SCALE / scale.mV[VY], MIN_PRIM_SCALE / scale.mV[VZ] ); 976 F32 cur_min_scale_factor = llmax( MIN_PRIM_SCALE / scale.mV[VX], MIN_PRIM_SCALE / scale.mV[VY], MIN_PRIM_SCALE / scale.mV[VZ] );
@@ -1263,7 +1267,7 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto
1263 1267
1264 F32 denom = axis * dir_local; 1268 F32 denom = axis * dir_local;
1265 F32 desired_delta_size = is_approx_zero(denom) ? 0.f : (delta_local_mag / denom); // in meters 1269 F32 desired_delta_size = is_approx_zero(denom) ? 0.f : (delta_local_mag / denom); // in meters
1266 F32 desired_scale = llclamp(selectNode->mSavedScale.mV[axis_index] + desired_delta_size, MIN_PRIM_SCALE, DEFAULT_MAX_PRIM_SCALE); 1270 F32 desired_scale = llclamp(selectNode->mSavedScale.mV[axis_index] + desired_delta_size, MIN_PRIM_SCALE, mMaxPrimSize);
1267 // propagate scale constraint back to position offset 1271 // propagate scale constraint back to position offset
1268 desired_delta_size = desired_scale - selectNode->mSavedScale.mV[axis_index]; // propagate constraint back to position 1272 desired_delta_size = desired_scale - selectNode->mSavedScale.mV[axis_index]; // propagate constraint back to position
1269 1273
@@ -1963,7 +1967,7 @@ F32 LLManipScale::partToMaxScale( S32 part, const LLBBox &bbox ) const
1963 max_extent = bbox_extents.mV[i]; 1967 max_extent = bbox_extents.mV[i];
1964 } 1968 }
1965 } 1969 }
1966 max_scale_factor = bbox_extents.magVec() * DEFAULT_MAX_PRIM_SCALE / max_extent; 1970 max_scale_factor = bbox_extents.magVec() * mMaxPrimSize / max_extent;
1967 1971
1968 if (getUniform()) 1972 if (getUniform())
1969 { 1973 {
@@ -1978,7 +1982,7 @@ F32 LLManipScale::partToMinScale( S32 part, const LLBBox &bbox ) const
1978{ 1982{
1979 LLVector3 bbox_extents = unitVectorToLocalBBoxExtent( partToUnitVector( part ), bbox ); 1983 LLVector3 bbox_extents = unitVectorToLocalBBoxExtent( partToUnitVector( part ), bbox );
1980 bbox_extents.abs(); 1984 bbox_extents.abs();
1981 F32 min_extent = DEFAULT_MAX_PRIM_SCALE; 1985 F32 min_extent = mMaxPrimSize;
1982 for (U32 i = VX; i <= VZ; i++) 1986 for (U32 i = VX; i <= VZ; i++)
1983 { 1987 {
1984 if (bbox_extents.mV[i] > 0.f && bbox_extents.mV[i] < min_extent) 1988 if (bbox_extents.mV[i] > 0.f && bbox_extents.mV[i] < min_extent)
@@ -2053,3 +2057,13 @@ BOOL LLManipScale::canAffectSelection()
2053 } 2057 }
2054 return can_scale; 2058 return can_scale;
2055} 2059}
2060
2061//static
2062F32 LLManipScale::getMaxPrimSize()
2063{
2064 if (gSavedSettings.getBOOL("LoggedIntoOpenSim"))
2065 {
2066 return DEFAULT_OPENSIM_MAX_PRIM_SCALE;
2067 }
2068 return DEFAULT_LL_MAX_PRIM_SCALE;
2069}
diff --git a/linden/indra/newview/llmanipscale.h b/linden/indra/newview/llmanipscale.h
index 1de0459..c6545fd 100644
--- a/linden/indra/newview/llmanipscale.h
+++ b/linden/indra/newview/llmanipscale.h
@@ -89,6 +89,8 @@ public:
89 static void setShowAxes( BOOL b ); 89 static void setShowAxes( BOOL b );
90 static BOOL getShowAxes(); 90 static BOOL getShowAxes();
91 91
92 static F32 getMaxPrimSize();
93
92private: 94private:
93 void renderCorners( const LLBBox& local_bbox ); 95 void renderCorners( const LLBBox& local_bbox );
94 void renderFaces( const LLBBox& local_bbox ); 96 void renderFaces( const LLBBox& local_bbox );
@@ -166,6 +168,7 @@ private:
166 F32 mScaleSnapValue; 168 F32 mScaleSnapValue;
167 BOOL mInSnapRegime; 169 BOOL mInSnapRegime;
168 F32* mManipulatorScales; 170 F32* mManipulatorScales;
171 F32 mMaxPrimSize;
169}; 172};
170 173
171#endif // LL_MANIPSCALE_H 174#endif // LL_MANIPSCALE_H
diff --git a/linden/indra/newview/llmaniptranslate.cpp b/linden/indra/newview/llmaniptranslate.cpp
index f2585c8..8d23e40 100644
--- a/linden/indra/newview/llmaniptranslate.cpp
+++ b/linden/indra/newview/llmaniptranslate.cpp
@@ -463,8 +463,15 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
463 if (mask == MASK_COPY) 463 if (mask == MASK_COPY)
464 { 464 {
465 // ...we're trying to make a copy 465 // ...we're trying to make a copy
466 LLSelectMgr::getInstance()->selectDuplicate(LLVector3::zero, FALSE); 466// LLSelectMgr::getInstance()->selectDuplicate(LLVector3::zero, FALSE);
467 mCopyMadeThisDrag = TRUE; 467// mCopyMadeThisDrag = TRUE;
468// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
469 if (!gRlvHandler.hasBehaviour(RLV_BHVR_REZ))
470 {
471 LLSelectMgr::getInstance()->selectDuplicate(LLVector3::zero, FALSE);
472 mCopyMadeThisDrag = TRUE;
473 }
474// [/RLVa:KB]
468 475
469 // When we make the copy, we don't want to do any other processing. 476 // When we make the copy, we don't want to do any other processing.
470 // If so, the object will also be moved, and the copy will be offset. 477 // If so, the object will also be moved, and the copy will be offset.
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp
index b0cce23..73f19d5 100644
--- a/linden/indra/newview/llnetmap.cpp
+++ b/linden/indra/newview/llnetmap.cpp
@@ -46,6 +46,7 @@
46#include "llcolorscheme.h" 46#include "llcolorscheme.h"
47#include "llviewercontrol.h" 47#include "llviewercontrol.h"
48#include "llfloateravatarinfo.h" 48#include "llfloateravatarinfo.h"
49#include "llfloatermap.h"
49#include "llfloaterworldmap.h" 50#include "llfloaterworldmap.h"
50#include "llframetimer.h" 51#include "llframetimer.h"
51#include "llmutelist.h" 52#include "llmutelist.h"
@@ -70,13 +71,15 @@
70#include "llglheaders.h" 71#include "llglheaders.h"
71 72
72const F32 MAP_SCALE_MIN = 32; 73const F32 MAP_SCALE_MIN = 32;
73const F32 MAP_SCALE_MID = 172; 74const F32 MAP_SCALE_MID = 1024;
74const F32 MAP_SCALE_MAX = 512; 75const F32 MAP_SCALE_MAX = 4096;
75const F32 MAP_SCALE_INCREMENT = 16; 76const F32 MAP_SCALE_INCREMENT = 16;
76const F32 MAP_MIN_PICK_DIST = 4; 77const F32 MAP_SCALE_ZOOM_FACTOR = 1.25f; // Zoom in factor per click of the scroll wheel (25%)
77const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f; 78const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f;
79const F32 MIN_DOT_RADIUS = 3.5f;
80const F32 DOT_SCALE = 0.75f;
81const F32 MIN_PICK_SCALE = 2.f;
78const S32 SLOP = 2; 82const S32 SLOP = 2;
79
80const S32 TRACKING_RADIUS = 3; 83const S32 TRACKING_RADIUS = 3;
81 84
82LLNetMap::LLNetMap(const std::string& name) : 85LLNetMap::LLNetMap(const std::string& name) :
@@ -92,6 +95,7 @@ LLNetMap::LLNetMap(const std::string& name) :
92{ 95{
93 mScale = gSavedSettings.getF32("MiniMapScale"); 96 mScale = gSavedSettings.getF32("MiniMapScale");
94 mPixelsPerMeter = mScale / LLWorld::getInstance()->getRegionWidthInMeters(); 97 mPixelsPerMeter = mScale / LLWorld::getInstance()->getRegionWidthInMeters();
98 mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
95 99
96 mObjectImageCenterGlobal = gAgent.getCameraPositionGlobal(); 100 mObjectImageCenterGlobal = gAgent.getCameraPositionGlobal();
97 101
@@ -99,6 +103,8 @@ LLNetMap::LLNetMap(const std::string& name) :
99 (new LLScaleMap())->registerListener(this, "MiniMap.ZoomLevel"); 103 (new LLScaleMap())->registerListener(this, "MiniMap.ZoomLevel");
100 (new LLCenterMap())->registerListener(this, "MiniMap.Center"); 104 (new LLCenterMap())->registerListener(this, "MiniMap.Center");
101 (new LLCheckCenterMap())->registerListener(this, "MiniMap.CheckCenter"); 105 (new LLCheckCenterMap())->registerListener(this, "MiniMap.CheckCenter");
106 (new LLRotateMap())->registerListener(this, "MiniMap.Rotate");
107 (new LLCheckRotateMap())->registerListener(this, "MiniMap.CheckRotate");
102 (new LLShowWorldMap())->registerListener(this, "MiniMap.ShowWorldMap"); 108 (new LLShowWorldMap())->registerListener(this, "MiniMap.ShowWorldMap");
103 (new LLStopTracking())->registerListener(this, "MiniMap.StopTracking"); 109 (new LLStopTracking())->registerListener(this, "MiniMap.StopTracking");
104 (new LLEnableTracking())->registerListener(this, "MiniMap.EnableTracking"); 110 (new LLEnableTracking())->registerListener(this, "MiniMap.EnableTracking");
@@ -118,6 +124,11 @@ LLNetMap::LLNetMap(const std::string& name) :
118 mPopupMenuHandle = menu->getHandle(); 124 mPopupMenuHandle = menu->getHandle();
119} 125}
120 126
127BOOL LLNetMap::postBuild()
128{
129 return TRUE;
130}
131
121LLNetMap::~LLNetMap() 132LLNetMap::~LLNetMap()
122{ 133{
123} 134}
@@ -144,6 +155,7 @@ void LLNetMap::setScale( F32 scale )
144 } 155 }
145 156
146 mPixelsPerMeter = mScale / LLWorld::getInstance()->getRegionWidthInMeters(); 157 mPixelsPerMeter = mScale / LLWorld::getInstance()->getRegionWidthInMeters();
158 mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
147 159
148 mUpdateNow = TRUE; 160 mUpdateNow = TRUE;
149} 161}
@@ -326,12 +338,16 @@ void LLNetMap::draw()
326 LLUI::getCursorPositionLocal(this, &local_mouse_x, &local_mouse_y); 338 LLUI::getCursorPositionLocal(this, &local_mouse_x, &local_mouse_y);
327 mClosestAgentToCursor.setNull(); 339 mClosestAgentToCursor.setNull();
328 F32 closest_dist = F32_MAX; 340 F32 closest_dist = F32_MAX;
341 F32 min_pick_dist = mDotRadius * MIN_PICK_SCALE;
329 342
330 // Draw avatars 343 // Draw avatars
331 LLColor4 avatar_color = gColors.getColor( "MapAvatar" ); 344 LLColor4 avatar_color = gColors.getColor( "MapAvatar" );
332 LLColor4 friend_color = gColors.getColor( "MapFriend" ); 345 LLColor4 friend_color = gColors.getColor( "MapFriend" );
333 LLColor4 muted_color = gColors.getColor( "MapMuted" ); 346 LLColor4 muted_color = gColors.getColor( "MapMuted" );
347 LLColor4 selected_color = gColors.getColor( "MapSelected" );
348 LLColor4 imp_dev_color = gColors.getColor( "MapImpDev" );
334 LLColor4 glyph_color; 349 LLColor4 glyph_color;
350 int selected = -1;
335 351
336 std::vector<LLUUID> avatar_ids; 352 std::vector<LLUUID> avatar_ids;
337 std::vector<LLVector3d> positions; 353 std::vector<LLVector3d> positions;
@@ -341,34 +357,78 @@ void LLNetMap::draw()
341 // TODO: it'd be very cool to draw these in sorted order from lowest Z to highest. 357 // TODO: it'd be very cool to draw these in sorted order from lowest Z to highest.
342 // just be careful to sort the avatar IDs along with the positions. -MG 358 // just be careful to sort the avatar IDs along with the positions. -MG
343 pos_map = globalPosToView(positions[i], rotate_map); 359 pos_map = globalPosToView(positions[i], rotate_map);
344 360
345 // Show them muted even if they're friends 361 // Save this entry to draw last
346 if (LLMuteList::getInstance()->isMuted(avatar_ids[i])) 362 if (LLFloaterMap::getSelected() == avatar_ids[i])
347 { 363 {
348 glyph_color = muted_color; 364 selected = i;
365 continue;
349 } 366 }
350 else if (is_agent_friend(avatar_ids[i])) 367 else
351 { 368 {
352 glyph_color = friend_color; 369 // Show them muted even if they're friends
370 if (LLMuteList::getInstance()->isMuted(avatar_ids[i]))
371 {
372 glyph_color = muted_color;
373 }
374 else if (LLFloaterMap::isImpDev(avatar_ids[i]))
375 {
376 glyph_color = imp_dev_color;
377 }
378 else if (is_agent_friend(avatar_ids[i]))
379 {
380 glyph_color = friend_color;
381 }
382 else
383 {
384 glyph_color = avatar_color;
385 }
353 } 386 }
354 else 387
388// [RLVa:KB] - Alternate: Imprudence-1.2.0
389 if ( gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES) )
355 { 390 {
391 // User is not allowed to see who it is, or even if it's a friend,
392 // due to RLV settings.
356 glyph_color = avatar_color; 393 glyph_color = avatar_color;
357 } 394 }
395// [/RLVa:KB]
358 396
359 LLWorldMapView::drawAvatar( 397 LLWorldMapView::drawAvatar(
360 pos_map.mV[VX], pos_map.mV[VY], 398 pos_map.mV[VX], pos_map.mV[VY],
361 glyph_color, 399 glyph_color,
362 pos_map.mV[VZ]); 400 pos_map.mV[VZ],
401 mDotRadius);
363 402
364 F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y)); 403 F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y));
365 if(dist_to_cursor < MAP_MIN_PICK_DIST && dist_to_cursor < closest_dist) 404 if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
366 { 405 {
367 closest_dist = dist_to_cursor; 406 closest_dist = dist_to_cursor;
368 mClosestAgentToCursor = avatar_ids[i]; 407 mClosestAgentToCursor = avatar_ids[i];
369 } 408 }
370 } 409 }
371 410
411 // Draw dot for selected avatar last
412 if (selected >= 0 && avatar_ids[selected].notNull())
413 {
414 pos_map = globalPosToView(positions[selected], rotate_map);
415 F32 glyph_radius = mDotRadius * 1.7f;
416 glyph_color = selected_color;
417
418 LLWorldMapView::drawAvatar(
419 pos_map.mV[VX], pos_map.mV[VY],
420 glyph_color,
421 pos_map.mV[VZ],
422 glyph_radius);
423
424 F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y));
425 if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
426 {
427 closest_dist = dist_to_cursor;
428 mClosestAgentToCursor = avatar_ids[selected];
429 }
430 }
431
372 // Draw dot for autopilot target 432 // Draw dot for autopilot target
373 if (gAgent.getAutoPilot()) 433 if (gAgent.getAutoPilot())
374 { 434 {
@@ -391,10 +451,13 @@ void LLNetMap::draw()
391 // Draw dot for self avatar position 451 // Draw dot for self avatar position
392 pos_global = gAgent.getPositionGlobal(); 452 pos_global = gAgent.getPositionGlobal();
393 pos_map = globalPosToView(pos_global, rotate_map); 453 pos_map = globalPosToView(pos_global, rotate_map);
394 LLUIImagePtr you = LLWorldMapView::sAvatarYouSmallImage; 454 LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage;
455 S32 dot_width = llround(mDotRadius * 2.f);
395 you->draw( 456 you->draw(
396 llround(pos_map.mV[VX]) - you->getWidth()/2, 457 llround(pos_map.mV[VX] - mDotRadius),
397 llround(pos_map.mV[VY]) - you->getHeight()/2); 458 llround(pos_map.mV[VY] - mDotRadius),
459 dot_width,
460 dot_width);
398 461
399 // Draw frustum 462 // Draw frustum
400 F32 meters_to_pixels = mScale/ LLWorld::getInstance()->getRegionWidthInMeters(); 463 F32 meters_to_pixels = mScale/ LLWorld::getInstance()->getRegionWidthInMeters();
@@ -451,6 +514,8 @@ void LLNetMap::draw()
451 setDirectionPos( getChild<LLTextBox>("se_label"), rotation + F_PI + F_PI_BY_TWO + F_PI_BY_TWO / 2); 514 setDirectionPos( getChild<LLTextBox>("se_label"), rotation + F_PI + F_PI_BY_TWO + F_PI_BY_TWO / 2);
452 515
453 LLView::draw(); 516 LLView::draw();
517
518 LLFloaterMap::updateRadar();
454} 519}
455 520
456void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent) 521void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
@@ -533,8 +598,12 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y, BOOL rotated )
533 598
534BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks) 599BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
535{ 600{
536 // note that clicks are reversed from what you'd think 601 // note that clicks are reversed from what you'd think: i.e. > 0 means zoom out, < 0 means zoom in
537 setScale(llclamp(mScale - clicks*MAP_SCALE_INCREMENT, MAP_SCALE_MIN, MAP_SCALE_MAX)); 602 F32 scale = mScale;
603
604 scale *= pow(MAP_SCALE_ZOOM_FACTOR, -clicks);
605 setScale(llclamp(scale, MAP_SCALE_MIN, MAP_SCALE_MAX));
606
538 return TRUE; 607 return TRUE;
539} 608}
540 609
@@ -552,11 +621,26 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rec
552 std::string fullname; 621 std::string fullname;
553 if(mClosestAgentToCursor.notNull() && gCacheName->getFullName(mClosestAgentToCursor, fullname)) 622 if(mClosestAgentToCursor.notNull() && gCacheName->getFullName(mClosestAgentToCursor, fullname))
554 { 623 {
555 msg.append(fullname); 624// [RLVa:KB] - Alternate: Imprudence-1.2.0
625 // User is not allowed to see who it is, due to RLV settings.
626 msg.append( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : gRlvHandler.getAnonym(fullname) );
556 msg.append("\n"); 627 msg.append("\n");
628 // [/RLVa:KB]
557 } 629 }
558 msg.append( region->getName() );
559 630
631// [RLVa:KB] - Alternate: Imprudence-1.2.0
632 if ( gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) )
633 {
634 // User is not allowed to see where they are, due to RLV settings.
635 msg.append( rlv_handler_t::cstrHidden );
636 }
637 else
638 {
639 msg.append( region->getName() );
640 }
641// [/RLVa:KB]
642
643
560 msg.append("\n"); 644 msg.append("\n");
561 gSavedSettings.getBOOL( "MiniMapTeleport" ) ? 645 gSavedSettings.getBOOL( "MiniMapTeleport" ) ?
562 msg.append(getString("tooltip_tp")) : msg.append(getString("tooltip_map")); 646 msg.append(getString("tooltip_tp")) : msg.append(getString("tooltip_map"));
@@ -893,6 +977,22 @@ bool LLNetMap::LLScaleMap::handleEvent(LLPointer<LLEvent> event, const LLSD& use
893 return true; 977 return true;
894} 978}
895 979
980bool LLNetMap::LLRotateMap::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
981{
982 BOOL rotate = gSavedSettings.getBOOL("MiniMapRotate");
983 gSavedSettings.setBOOL("MiniMapRotate", !rotate);
984
985 return true;
986}
987
988bool LLNetMap::LLCheckRotateMap::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
989{
990 LLNetMap *self = mPtr;
991 BOOL enabled = gSavedSettings.getBOOL("MiniMapRotate");
992 self->findControl(userdata["control"].asString())->setValue(enabled);
993 return true;
994}
995
896bool LLNetMap::LLCenterMap::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 996bool LLNetMap::LLCenterMap::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
897{ 997{
898 S32 center = userdata.asInteger(); 998 S32 center = userdata.asInteger();
@@ -940,6 +1040,13 @@ bool LLNetMap::LLEnableTracking::handleEvent(LLPointer<LLEvent> event, const LLS
940 1040
941bool LLNetMap::LLShowAgentProfile::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 1041bool LLNetMap::LLShowAgentProfile::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
942{ 1042{
1043// [RLVa:KB] - Alternate: Imprudence-1.2.0
1044 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
1045 {
1046 return true;
1047 }
1048// [/RLVa:KB]
1049
943 LLNetMap *self = mPtr; 1050 LLNetMap *self = mPtr;
944 LLFloaterAvatarInfo::show(self->mClosestAgentAtLastRightClick); 1051 LLFloaterAvatarInfo::show(self->mClosestAgentAtLastRightClick);
945 return true; 1052 return true;
@@ -948,6 +1055,9 @@ bool LLNetMap::LLShowAgentProfile::handleEvent(LLPointer<LLEvent> event, const L
948bool LLNetMap::LLEnableProfile::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 1055bool LLNetMap::LLEnableProfile::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
949{ 1056{
950 LLNetMap *self = mPtr; 1057 LLNetMap *self = mPtr;
951 self->findControl(userdata["control"].asString())->setValue(self->isAgentUnderCursor()); 1058 //self->findControl(userdata["control"].asString())->setValue(self->isAgentUnderCursor());
1059// [RLVa:KB] - Alternate: Imprudence-1.2.0
1060 self->findControl(userdata["control"].asString())->setValue(self->isAgentUnderCursor() && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
1061// [/RLVa:KB]
952 return true; 1062 return true;
953} 1063}
diff --git a/linden/indra/newview/llnetmap.h b/linden/indra/newview/llnetmap.h
index 4202e24..c0c19d5 100644
--- a/linden/indra/newview/llnetmap.h
+++ b/linden/indra/newview/llnetmap.h
@@ -53,6 +53,8 @@ class LLNetMap : public LLPanel
53{ 53{
54public: 54public:
55 LLNetMap(const std::string& name); 55 LLNetMap(const std::string& name);
56
57 virtual BOOL postBuild();
56 virtual ~LLNetMap(); 58 virtual ~LLNetMap();
57 59
58 virtual void draw(); 60 virtual void draw();
@@ -94,7 +96,8 @@ private:
94 F32 mScale; // Size of a region in pixels 96 F32 mScale; // Size of a region in pixels
95 F32 mPixelsPerMeter; // world meters to map pixels 97 F32 mPixelsPerMeter; // world meters to map pixels
96 F32 mObjectMapTPM; // texels per meter on map 98 F32 mObjectMapTPM; // texels per meter on map
97 F32 mObjectMapPixels; // Width of object map in pixels; 99 F32 mObjectMapPixels; // Width of object map in pixels
100 F32 mDotRadius; // Size of avatar markers
98 F32 mTargetPanX; 101 F32 mTargetPanX;
99 F32 mTargetPanY; 102 F32 mTargetPanY;
100 F32 mCurPanX; 103 F32 mCurPanX;
@@ -112,8 +115,8 @@ private:
112 LLPointer<LLImageGL> mObjectImagep; 115 LLPointer<LLImageGL> mObjectImagep;
113 116
114private: 117private:
115 LLUUID mClosestAgentToCursor; 118 LLUUID mClosestAgentToCursor;
116 LLUUID mClosestAgentAtLastRightClick; 119 LLUUID mClosestAgentAtLastRightClick;
117 120
118 static BOOL sRotateMap; 121 static BOOL sRotateMap;
119 static LLNetMap* sInstance; 122 static LLNetMap* sInstance;
@@ -141,6 +144,18 @@ private:
141 /*virtual*/ bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata); 144 /*virtual*/ bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
142 }; 145 };
143 146
147 class LLRotateMap : public LLMemberListener<LLNetMap>
148 {
149 public:
150 /*virtual*/ bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
151 };
152
153 class LLCheckRotateMap : public LLMemberListener<LLNetMap>
154 {
155 public:
156 /*virtual*/ bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
157 };
158
144 class LLShowWorldMap : public LLMemberListener<LLNetMap> 159 class LLShowWorldMap : public LLMemberListener<LLNetMap>
145 { 160 {
146 public: 161 public:
diff --git a/linden/indra/newview/llnotify.cpp b/linden/indra/newview/llnotify.cpp
index a119dc4..6820622 100644
--- a/linden/indra/newview/llnotify.cpp
+++ b/linden/indra/newview/llnotify.cpp
@@ -55,7 +55,10 @@
55#include "lloverlaybar.h" // for gOverlayBar 55#include "lloverlaybar.h" // for gOverlayBar
56#include "lluictrlfactory.h" 56#include "lluictrlfactory.h"
57 57
58 58// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
59#include "rlvhandler.h"
60// [/RLVa:KB]
61
59// Globals 62// Globals
60LLNotifyBoxView* gNotifyBoxView = NULL; 63LLNotifyBoxView* gNotifyBoxView = NULL;
61 64
@@ -270,6 +273,13 @@ LLNotifyBox::LLNotifyBox(LLNotificationPtr notification,
270 // TODO: Make a separate archive for these. 273 // TODO: Make a separate archive for these.
271 LLChat chat(mMessage); 274 LLChat chat(mMessage);
272 chat.mSourceType = CHAT_SOURCE_SYSTEM; 275 chat.mSourceType = CHAT_SOURCE_SYSTEM;
276// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
277 if (rlv_handler_t::isEnabled())
278 {
279 // Notices should already have their contents filtered where necessary
280 chat.mRlvLocFiltered = chat.mRlvNamesFiltered = TRUE;
281 }
282// [/RLVa:KB]
273 LLFloaterChat::getInstance(LLSD())->addChatHistory(chat); 283 LLFloaterChat::getInstance(LLSD())->addChatHistory(chat);
274 } 284 }
275 else 285 else
diff --git a/linden/indra/newview/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp
index 24b1474..599d736 100644
--- a/linden/indra/newview/lloverlaybar.cpp
+++ b/linden/indra/newview/lloverlaybar.cpp
@@ -42,6 +42,7 @@
42#include "llagent.h" 42#include "llagent.h"
43#include "llbutton.h" 43#include "llbutton.h"
44#include "llchatbar.h" 44#include "llchatbar.h"
45#include "llfloaterchat.h"
45#include "llfocusmgr.h" 46#include "llfocusmgr.h"
46#include "llimview.h" 47#include "llimview.h"
47#include "llmediaremotectrl.h" 48#include "llmediaremotectrl.h"
@@ -63,6 +64,7 @@
63#include "llvoavatar.h" 64#include "llvoavatar.h"
64#include "llvoiceremotectrl.h" 65#include "llvoiceremotectrl.h"
65#include "llwebbrowserctrl.h" 66#include "llwebbrowserctrl.h"
67#include "llwindlightremotectrl.h"
66#include "llselectmgr.h" 68#include "llselectmgr.h"
67 69
68// 70//
@@ -73,6 +75,53 @@ LLOverlayBar *gOverlayBar = NULL;
73 75
74extern S32 MENU_BAR_HEIGHT; 76extern S32 MENU_BAR_HEIGHT;
75 77
78
79class LLTitleObserver
80 : public LLMediaObserver
81{
82public:
83 void init(std::string url);
84 /*virtual*/ void onMediaTitleChange(const EventType& event_in);
85private:
86 LLMediaBase* mMediaSource;
87};
88
89static LLTitleObserver sTitleObserver;
90
91static LLRegisterWidget<LLMediaRemoteCtrl> r("media_remote");
92
93void LLTitleObserver::init(std::string url)
94{
95
96 if (!gAudiop)
97 {
98 return;
99 }
100
101 mMediaSource = gAudiop->getStreamMedia(); // LLViewerMedia::getSource();
102
103 if ( mMediaSource )
104 {
105 mMediaSource->addObserver(this);
106 }
107}
108
109//virtual
110void LLTitleObserver::onMediaTitleChange(const EventType& event_in)
111{
112 if ( !gSavedSettings.getBOOL("ShowStreamTitle") )
113 {
114 return;
115 }
116
117 LLChat chat;
118 //TODO: set this in XUI
119 std::string playing_msg = "Playing: " + event_in.getStringValue();
120 chat.mText = playing_msg;
121 LLFloaterChat::addChat(chat, FALSE, FALSE);
122}
123
124
76// 125//
77// Functions 126// Functions
78// 127//
@@ -93,6 +142,13 @@ void* LLOverlayBar::createVoiceRemote(void* userdata)
93 return self->mVoiceRemote; 142 return self->mVoiceRemote;
94} 143}
95 144
145void* LLOverlayBar::createWindlightRemote(void* userdata)
146{
147 LLOverlayBar *self = (LLOverlayBar*)userdata;
148 self->mWindlightRemote = new LLWindlightRemoteCtrl();
149 return self->mWindlightRemote;
150}
151
96void* LLOverlayBar::createChatBar(void* userdata) 152void* LLOverlayBar::createChatBar(void* userdata)
97{ 153{
98 gChatBar = new LLChatBar(); 154 gChatBar = new LLChatBar();
@@ -103,6 +159,7 @@ LLOverlayBar::LLOverlayBar()
103 : LLPanel(), 159 : LLPanel(),
104 mMediaRemote(NULL), 160 mMediaRemote(NULL),
105 mVoiceRemote(NULL), 161 mVoiceRemote(NULL),
162 mWindlightRemote(NULL),
106 mMusicState(STOPPED), 163 mMusicState(STOPPED),
107 mOriginalIMLabel("") 164 mOriginalIMLabel("")
108{ 165{
@@ -114,6 +171,7 @@ LLOverlayBar::LLOverlayBar()
114 LLCallbackMap::map_t factory_map; 171 LLCallbackMap::map_t factory_map;
115 factory_map["media_remote"] = LLCallbackMap(LLOverlayBar::createMediaRemote, this); 172 factory_map["media_remote"] = LLCallbackMap(LLOverlayBar::createMediaRemote, this);
116 factory_map["voice_remote"] = LLCallbackMap(LLOverlayBar::createVoiceRemote, this); 173 factory_map["voice_remote"] = LLCallbackMap(LLOverlayBar::createVoiceRemote, this);
174 factory_map["windlight_remote"] = LLCallbackMap(LLOverlayBar::createWindlightRemote, this);
117 factory_map["chat_bar"] = LLCallbackMap(LLOverlayBar::createChatBar, this); 175 factory_map["chat_bar"] = LLCallbackMap(LLOverlayBar::createChatBar, this);
118 176
119 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_overlaybar.xml", &factory_map); 177 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_overlaybar.xml", &factory_map);
@@ -258,7 +316,10 @@ void LLOverlayBar::refresh()
258 BOOL sitting = FALSE; 316 BOOL sitting = FALSE;
259 if (gAgent.getAvatarObject()) 317 if (gAgent.getAvatarObject())
260 { 318 {
261 sitting = gAgent.getAvatarObject()->mIsSitting; 319// sitting = gAgent.getAvatarObject()->mIsSitting;
320// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
321 sitting = gAgent.getAvatarObject()->mIsSitting && !gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT);
322// [/RLVa:KB]
262 } 323 }
263 button = getChild<LLButton>("Stand Up"); 324 button = getChild<LLButton>("Stand Up");
264 325
@@ -271,6 +332,7 @@ void LLOverlayBar::refresh()
271 } 332 }
272 333
273 334
335 moveChildToBackOfTabGroup(mWindlightRemote);
274 moveChildToBackOfTabGroup(mMediaRemote); 336 moveChildToBackOfTabGroup(mMediaRemote);
275 moveChildToBackOfTabGroup(mVoiceRemote); 337 moveChildToBackOfTabGroup(mVoiceRemote);
276 338
@@ -279,6 +341,7 @@ void LLOverlayBar::refresh()
279 { 341 {
280 childSetVisible("media_remote_container", FALSE); 342 childSetVisible("media_remote_container", FALSE);
281 childSetVisible("voice_remote_container", FALSE); 343 childSetVisible("voice_remote_container", FALSE);
344 childSetVisible("windlight_remote_container", FALSE);
282 childSetVisible("state_buttons", FALSE); 345 childSetVisible("state_buttons", FALSE);
283 } 346 }
284 else 347 else
@@ -286,6 +349,7 @@ void LLOverlayBar::refresh()
286 // update "remotes" 349 // update "remotes"
287 childSetVisible("media_remote_container", TRUE); 350 childSetVisible("media_remote_container", TRUE);
288 childSetVisible("voice_remote_container", LLVoiceClient::voiceEnabled()); 351 childSetVisible("voice_remote_container", LLVoiceClient::voiceEnabled());
352 childSetVisible("windlight_remote_container", gSavedSettings.getBOOL("EnableWindlightRemote"));
289 childSetVisible("state_buttons", TRUE); 353 childSetVisible("state_buttons", TRUE);
290 } 354 }
291 355
@@ -338,6 +402,13 @@ void LLOverlayBar::onClickMouselook(void*)
338//static 402//static
339void LLOverlayBar::onClickStandUp(void*) 403void LLOverlayBar::onClickStandUp(void*)
340{ 404{
405// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
406 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (gAgent.getAvatarObject()) && (gAgent.getAvatarObject()->mIsSitting) )
407 {
408 return;
409 }
410// [/RLVa:KB]
411
341 LLSelectMgr::getInstance()->deselectAllForStandingUp(); 412 LLSelectMgr::getInstance()->deselectAllForStandingUp();
342 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); 413 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
343} 414}
@@ -408,6 +479,7 @@ void LLOverlayBar::toggleMusicPlay(void*)
408 // if ( gAudiop->isInternetStreamPlaying() == 0 ) 479 // if ( gAudiop->isInternetStreamPlaying() == 0 )
409 { 480 {
410 gAudiop->startInternetStream(parcel->getMusicURL()); 481 gAudiop->startInternetStream(parcel->getMusicURL());
482 sTitleObserver.init(parcel->getMusicURL());
411 } 483 }
412 } 484 }
413 } 485 }
diff --git a/linden/indra/newview/lloverlaybar.h b/linden/indra/newview/lloverlaybar.h
index 1d55cc4..50ad3d1 100644
--- a/linden/indra/newview/lloverlaybar.h
+++ b/linden/indra/newview/lloverlaybar.h
@@ -41,6 +41,7 @@ extern S32 STATUS_BAR_HEIGHT;
41class LLButton; 41class LLButton;
42class LLLineEditor; 42class LLLineEditor;
43class LLMediaRemoteCtrl; 43class LLMediaRemoteCtrl;
44
44class LLMessageSystem; 45class LLMessageSystem;
45class LLTextBox; 46class LLTextBox;
46class LLTextEditor; 47class LLTextEditor;
@@ -50,6 +51,7 @@ class LLFrameTimer;
50class LLStatGraph; 51class LLStatGraph;
51class LLSlider; 52class LLSlider;
52class LLVoiceRemoteCtrl; 53class LLVoiceRemoteCtrl;
54class LLWindlightRemoteCtrl;
53 55
54class LLOverlayBar 56class LLOverlayBar
55: public LLPanel 57: public LLPanel
@@ -89,13 +91,15 @@ public:
89protected: 91protected:
90 static void* createMediaRemote(void* userdata); 92 static void* createMediaRemote(void* userdata);
91 static void* createVoiceRemote(void* userdata); 93 static void* createVoiceRemote(void* userdata);
94 static void* createWindlightRemote(void* userdata);
92 static void* createChatBar(void* userdata); 95 static void* createChatBar(void* userdata);
93 96
94 void enableMediaButtons(); 97 void enableMediaButtons();
95 98
96protected: 99protected:
97 LLMediaRemoteCtrl* mMediaRemote; 100 LLMediaRemoteCtrl* mMediaRemote;
98 LLVoiceRemoteCtrl* mVoiceRemote; 101 LLVoiceRemoteCtrl* mVoiceRemote;
102 LLWindlightRemoteCtrl* mWindlightRemote;
99 bool mBuilt; // dialog constructed yet? 103 bool mBuilt; // dialog constructed yet?
100 S32 mMusicState; 104 S32 mMusicState;
101 std::string mOriginalIMLabel; 105 std::string mOriginalIMLabel;
diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp
index ed7a71b..489f0d3 100644
--- a/linden/indra/newview/llpanelavatar.cpp
+++ b/linden/indra/newview/llpanelavatar.cpp
@@ -52,6 +52,7 @@
52 52
53#include "llfloaterfriends.h" 53#include "llfloaterfriends.h"
54#include "llfloatergroupinfo.h" 54#include "llfloatergroupinfo.h"
55#include "llfloatergroups.h"
55#include "llfloaterworldmap.h" 56#include "llfloaterworldmap.h"
56#include "llfloatermute.h" 57#include "llfloatermute.h"
57#include "llfloateravatarinfo.h" 58#include "llfloateravatarinfo.h"
@@ -84,6 +85,7 @@
84std::list<LLPanelAvatar*> LLPanelAvatar::sAllPanels; 85std::list<LLPanelAvatar*> LLPanelAvatar::sAllPanels;
85BOOL LLPanelAvatar::sAllowFirstLife = FALSE; 86BOOL LLPanelAvatar::sAllowFirstLife = FALSE;
86 87
88extern void callback_invite_to_group(LLUUID group_id, void *user_data);
87extern void handle_lure(const LLUUID& invitee); 89extern void handle_lure(const LLUUID& invitee);
88extern void handle_pay_by_id(const LLUUID& payee); 90extern void handle_pay_by_id(const LLUUID& payee);
89 91
@@ -365,6 +367,7 @@ BOOL LLPanelAvatarSecondLife::postBuild(void)
365 367
366 childSetAction("Find on Map", LLPanelAvatar::onClickTrack, getPanelAvatar()); 368 childSetAction("Find on Map", LLPanelAvatar::onClickTrack, getPanelAvatar());
367 childSetAction("Instant Message...", LLPanelAvatar::onClickIM, getPanelAvatar()); 369 childSetAction("Instant Message...", LLPanelAvatar::onClickIM, getPanelAvatar());
370 childSetAction("Invite to Group...", LLPanelAvatar::onClickGroupInvite, getPanelAvatar());
368 371
369 childSetAction("Add Friend...", LLPanelAvatar::onClickAddFriend, getPanelAvatar()); 372 childSetAction("Add Friend...", LLPanelAvatar::onClickAddFriend, getPanelAvatar());
370 childSetAction("Pay...", LLPanelAvatar::onClickPay, getPanelAvatar()); 373 childSetAction("Pay...", LLPanelAvatar::onClickPay, getPanelAvatar());
@@ -731,6 +734,9 @@ void LLPanelAvatarClassified::refresh()
731 S32 tab_count = tabs ? tabs->getTabCount() : 0; 734 S32 tab_count = tabs ? tabs->getTabCount() : 0;
732 735
733 bool allow_new = tab_count < MAX_CLASSIFIEDS; 736 bool allow_new = tab_count < MAX_CLASSIFIEDS;
737// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
738 allow_new &= !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC);
739// [/RLVa:KB]
734 bool allow_delete = (tab_count > 0); 740 bool allow_delete = (tab_count > 0);
735 bool show_help = (tab_count == 0); 741 bool show_help = (tab_count == 0);
736 742
@@ -866,6 +872,12 @@ void LLPanelAvatarClassified::processAvatarClassifiedReply(LLMessageSystem* msg,
866// static 872// static
867void LLPanelAvatarClassified::onClickNew(void* data) 873void LLPanelAvatarClassified::onClickNew(void* data)
868{ 874{
875// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-04 (RLVa-1.0.0a)
876 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
877 {
878 return;
879 }
880// [/RLVa:KB]
869 LLPanelAvatarClassified* self = (LLPanelAvatarClassified*)data; 881 LLPanelAvatarClassified* self = (LLPanelAvatarClassified*)data;
870 882
871 LLNotifications::instance().add("AddClassified", LLSD(), LLSD(), boost::bind(&LLPanelAvatarClassified::callbackNew, self, _1, _2)); 883 LLNotifications::instance().add("AddClassified", LLSD(), LLSD(), boost::bind(&LLPanelAvatarClassified::callbackNew, self, _1, _2));
@@ -961,7 +973,10 @@ void LLPanelAvatarPicks::refresh()
961 BOOL self = (gAgent.getID() == getPanelAvatar()->getAvatarID()); 973 BOOL self = (gAgent.getID() == getPanelAvatar()->getAvatarID());
962 LLTabContainer* tabs = getChild<LLTabContainer>("picks tab"); 974 LLTabContainer* tabs = getChild<LLTabContainer>("picks tab");
963 S32 tab_count = tabs ? tabs->getTabCount() : 0; 975 S32 tab_count = tabs ? tabs->getTabCount() : 0;
964 childSetEnabled("New...", self && tab_count < MAX_AVATAR_PICKS); 976// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
977 childSetEnabled("New...", self && tab_count < MAX_AVATAR_PICKS && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) );
978// [/RLVa:KB]
979 //childSetEnabled("New...", self && tab_count < MAX_AVATAR_PICKS);
965 childSetEnabled("Delete...", self && tab_count > 0); 980 childSetEnabled("Delete...", self && tab_count > 0);
966 childSetVisible("New...", self && getPanelAvatar()->isEditable()); 981 childSetVisible("New...", self && getPanelAvatar()->isEditable());
967 childSetVisible("Delete...", self && getPanelAvatar()->isEditable()); 982 childSetVisible("Delete...", self && getPanelAvatar()->isEditable());
@@ -1039,6 +1054,12 @@ void LLPanelAvatarPicks::processAvatarPicksReply(LLMessageSystem* msg, void**)
1039// static 1054// static
1040void LLPanelAvatarPicks::onClickNew(void* data) 1055void LLPanelAvatarPicks::onClickNew(void* data)
1041{ 1056{
1057// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
1058 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
1059 {
1060 return;
1061 }
1062// [/RLVa:KB]
1042 LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data; 1063 LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data;
1043 LLPanelPick* panel_pick = new LLPanelPick(FALSE); 1064 LLPanelPick* panel_pick = new LLPanelPick(FALSE);
1044 LLTabContainer* tabs = self->getChild<LLTabContainer>("picks tab"); 1065 LLTabContainer* tabs = self->getChild<LLTabContainer>("picks tab");
@@ -1238,14 +1259,6 @@ void LLPanelAvatar::setOnlineStatus(EOnlineStatus online_status)
1238 1259
1239 mPanelSecondLife->childSetVisible("online_yes", (online_status == ONLINE_STATUS_YES)); 1260 mPanelSecondLife->childSetVisible("online_yes", (online_status == ONLINE_STATUS_YES));
1240 1261
1241 // Since setOnlineStatus gets called after setAvatarID
1242 // need to make sure that "Offer Teleport" doesn't get set
1243 // to TRUE again for yourself
1244 if (mAvatarID != gAgent.getID())
1245 {
1246 childSetVisible("Offer Teleport...",TRUE);
1247 }
1248
1249 BOOL in_prelude = gAgent.inPrelude(); 1262 BOOL in_prelude = gAgent.inPrelude();
1250 if(gAgent.isGodlike()) 1263 if(gAgent.isGodlike())
1251 { 1264 {
@@ -1262,6 +1275,18 @@ void LLPanelAvatar::setOnlineStatus(EOnlineStatus online_status)
1262 childSetEnabled("Offer Teleport...", TRUE); 1275 childSetEnabled("Offer Teleport...", TRUE);
1263 childSetToolTip("Offer Teleport...", childGetValue("TeleportNormal").asString()); 1276 childSetToolTip("Offer Teleport...", childGetValue("TeleportNormal").asString());
1264 } 1277 }
1278
1279 // Since setOnlineStatus gets called after setAvatarID
1280 // need to make sure that "Offer Teleport" doesn't get set
1281 // to TRUE again for yourself
1282 if (mAvatarID != gAgent.getID())
1283 {
1284 childSetVisible("Offer Teleport...",TRUE);
1285 }
1286 else
1287 {
1288 childSetEnabled("Offer Teleport...", FALSE);
1289 }
1265} 1290}
1266 1291
1267void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name, 1292void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name,
@@ -1354,20 +1379,30 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name
1354 childSetVisible("Cancel",FALSE); 1379 childSetVisible("Cancel",FALSE);
1355 childSetEnabled("Cancel",FALSE); 1380 childSetEnabled("Cancel",FALSE);
1356 } 1381 }
1357 childSetVisible("Instant Message...",FALSE); 1382 //childSetVisible("Instant Message...",FALSE);
1358 childSetEnabled("Instant Message...",FALSE); 1383 childSetEnabled("Instant Message...",FALSE);
1359 childSetVisible("Mute",FALSE); 1384 //childSetVisible("Invite to Group...",FALSE);
1385 childSetEnabled("Invite to Group...",FALSE);
1386 //childSetVisible("Mute",FALSE);
1360 childSetEnabled("Mute",FALSE); 1387 childSetEnabled("Mute",FALSE);
1361 childSetVisible("Offer Teleport...",FALSE); 1388 //childSetVisible("Offer Teleport...",FALSE);
1362 childSetEnabled("Offer Teleport...",FALSE); 1389 childSetEnabled("Offer Teleport...",FALSE);
1363 childSetVisible("drop target",FALSE); 1390 //childSetVisible("drop target",FALSE);
1364 childSetEnabled("drop target",FALSE); 1391 childSetEnabled("drop target",FALSE);
1365 childSetVisible("Find on Map",FALSE); 1392 //childSetVisible("Find on Map",FALSE);
1366 childSetEnabled("Find on Map",FALSE); 1393 childSetEnabled("Find on Map",FALSE);
1367 childSetVisible("Add Friend...",FALSE); 1394 //childSetVisible("Add Friend...",FALSE);
1368 childSetEnabled("Add Friend...",FALSE); 1395 childSetEnabled("Add Friend...",FALSE);
1369 childSetVisible("Pay...",FALSE); 1396 //childSetVisible("Pay...",FALSE);
1370 childSetEnabled("Pay...",FALSE); 1397 childSetEnabled("Pay...",FALSE);
1398 childSetVisible("Kick",FALSE);
1399 childSetEnabled("Kick",FALSE);
1400 childSetVisible("Freeze",FALSE);
1401 childSetEnabled("Freeze",FALSE);
1402 childSetVisible("Unfreeze",FALSE);
1403 childSetEnabled("Unfreeze",FALSE);
1404 childSetVisible("csr_btn", FALSE);
1405 childSetEnabled("csr_btn", FALSE);
1371 } 1406 }
1372 else 1407 else
1373 { 1408 {
@@ -1379,6 +1414,8 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name
1379 1414
1380 childSetVisible("Instant Message...",TRUE); 1415 childSetVisible("Instant Message...",TRUE);
1381 childSetEnabled("Instant Message...",FALSE); 1416 childSetEnabled("Instant Message...",FALSE);
1417 childSetVisible("Invite to Group...",TRUE);
1418 childSetEnabled("Invite to Group...",FALSE);
1382 childSetVisible("Mute",TRUE); 1419 childSetVisible("Mute",TRUE);
1383 childSetEnabled("Mute",FALSE); 1420 childSetEnabled("Mute",FALSE);
1384 1421
@@ -1405,20 +1442,20 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const std::string &name
1405 childSetEnabled("Add Friend...", !avatar_is_friend); 1442 childSetEnabled("Add Friend...", !avatar_is_friend);
1406 childSetVisible("Pay...",TRUE); 1443 childSetVisible("Pay...",TRUE);
1407 childSetEnabled("Pay...",FALSE); 1444 childSetEnabled("Pay...",FALSE);
1445
1446 BOOL is_god = FALSE;
1447 if (gAgent.isGodlike()) is_god = TRUE;
1448
1449 childSetVisible("Kick", is_god);
1450 childSetEnabled("Kick", is_god);
1451 childSetVisible("Freeze", is_god);
1452 childSetEnabled("Freeze", is_god);
1453 childSetVisible("Unfreeze", is_god);
1454 childSetEnabled("Unfreeze", is_god);
1455 childSetVisible("csr_btn", is_god);
1456 childSetEnabled("csr_btn", is_god);
1408 } 1457 }
1409 } 1458 }
1410
1411 BOOL is_god = FALSE;
1412 if (gAgent.isGodlike()) is_god = TRUE;
1413
1414 childSetVisible("Kick", is_god);
1415 childSetEnabled("Kick", is_god);
1416 childSetVisible("Freeze", is_god);
1417 childSetEnabled("Freeze", is_god);
1418 childSetVisible("Unfreeze", is_god);
1419 childSetEnabled("Unfreeze", is_god);
1420 childSetVisible("csr_btn", is_god);
1421 childSetEnabled("csr_btn", is_god);
1422} 1459}
1423 1460
1424 1461
@@ -1461,9 +1498,18 @@ void LLPanelAvatar::resetGroupList()
1461 LLSD row; 1498 LLSD row;
1462 1499
1463 row["id"] = id ; 1500 row["id"] = id ;
1464 row["columns"][0]["value"] = group_string;
1465 row["columns"][0]["font"] = "SANSSERIF_SMALL"; 1501 row["columns"][0]["font"] = "SANSSERIF_SMALL";
1466 row["columns"][0]["width"] = 0; 1502 row["columns"][0]["width"] = 0;
1503 if (group_data.mListInProfile)
1504 {
1505 row["columns"][0]["value"] = group_string;
1506 row["columns"][0]["color"] = gColors.getColor("ScrollUnselectedColor").getValue();
1507 }
1508 else
1509 {
1510 row["columns"][0]["value"] = group_string + " " + getString("HiddenLabel");
1511 row["columns"][0]["color"] = gColors.getColor("ScrollReadOnlyColor").getValue();
1512 }
1467 group_list->addElement(row); 1513 group_list->addElement(row);
1468 } 1514 }
1469 group_list->sortByColumnIndex(0, TRUE); 1515 group_list->sortByColumnIndex(0, TRUE);
@@ -1486,6 +1532,22 @@ void LLPanelAvatar::onClickIM(void* userdata)
1486 gIMMgr->addSession(name, IM_NOTHING_SPECIAL, self->mAvatarID); 1532 gIMMgr->addSession(name, IM_NOTHING_SPECIAL, self->mAvatarID);
1487} 1533}
1488 1534
1535void LLPanelAvatar::onClickGroupInvite(void* userdata)
1536{
1537 LLPanelAvatar* self = (LLPanelAvatar*) userdata;
1538 if (self->getAvatarID().notNull())
1539 {
1540 LLFloaterGroupPicker* widget;
1541 widget = LLFloaterGroupPicker::showInstance(LLSD(gAgent.getID()));
1542 if (widget)
1543 {
1544 widget->center();
1545 widget->setPowersMask(GP_MEMBER_INVITE);
1546 widget->setSelectCallback(callback_invite_to_group, (void *)&(self->getAvatarID()));
1547 }
1548 }
1549}
1550
1489 1551
1490// static 1552// static
1491//----------------------------------------------------------------------------- 1553//-----------------------------------------------------------------------------
@@ -1702,11 +1764,27 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)
1702 { 1764 {
1703 continue; 1765 continue;
1704 } 1766 }
1705 self->childSetEnabled("Instant Message...",TRUE);
1706 self->childSetEnabled("Pay...",TRUE);
1707 self->childSetEnabled("Mute",TRUE);
1708 1767
1709 self->childSetEnabled("drop target",TRUE); 1768 if (self->mAvatarID == agent_id)
1769 {
1770 self->childSetEnabled("Instant Message...",FALSE);
1771 self->childSetEnabled("Invite to Group...",FALSE);
1772 self->childSetEnabled("Pay...",FALSE);
1773 self->childSetEnabled("Mute",FALSE);
1774
1775 self->childSetVisible("drop target",FALSE);
1776 self->childSetEnabled("drop target",FALSE);
1777 }
1778 else
1779 {
1780 self->childSetEnabled("Instant Message...",TRUE);
1781 self->childSetEnabled("Invite to Group...",TRUE);
1782 self->childSetEnabled("Pay...",TRUE);
1783 self->childSetEnabled("Mute",TRUE);
1784
1785 self->childSetVisible("drop target",TRUE);
1786 self->childSetEnabled("drop target",TRUE);
1787 }
1710 1788
1711 self->mHaveProperties = TRUE; 1789 self->mHaveProperties = TRUE;
1712 self->enableOKIfReady(); 1790 self->enableOKIfReady();
@@ -1923,8 +2001,34 @@ void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**)
1923 2001
1924 LLSD row; 2002 LLSD row;
1925 row["id"] = group_id; 2003 row["id"] = group_id;
1926 row["columns"][0]["value"] = group_string;
1927 row["columns"][0]["font"] = "SANSSERIF_SMALL"; 2004 row["columns"][0]["font"] = "SANSSERIF_SMALL";
2005
2006 LLGroupData *group_data = NULL;
2007
2008 if (avatar_id == agent_id) // own avatar
2009 {
2010 // Search for this group in the agent's groups list
2011 LLDynamicArray<LLGroupData>::iterator i;
2012 for (i = gAgent.mGroups.begin(); i != gAgent.mGroups.end(); i++)
2013 {
2014 if (i->mID == group_id)
2015 {
2016 group_data = &*i;
2017 break;
2018 }
2019 }
2020 }
2021 // Set normal color if not found or if group is visible in profile
2022 if (!group_data || group_data->mListInProfile)
2023 {
2024 row["columns"][0]["value"] = group_string;
2025 row["columns"][0]["color"] = gColors.getColor("ScrollUnselectedColor").getValue();
2026 }
2027 else
2028 {
2029 row["columns"][0]["value"] = group_string + " " + self->getString("HiddenLabel");
2030 row["columns"][0]["color"] = gColors.getColor("ScrollReadOnlyColor").getValue();
2031 }
1928 if (group_list) 2032 if (group_list)
1929 { 2033 {
1930 group_list->addElement(row); 2034 group_list->addElement(row);
diff --git a/linden/indra/newview/llpanelavatar.h b/linden/indra/newview/llpanelavatar.h
index 041d503..01653d8 100644
--- a/linden/indra/newview/llpanelavatar.h
+++ b/linden/indra/newview/llpanelavatar.h
@@ -312,6 +312,7 @@ public:
312 312
313 static void onClickTrack( void *userdata); 313 static void onClickTrack( void *userdata);
314 static void onClickIM( void *userdata); 314 static void onClickIM( void *userdata);
315 static void onClickGroupInvite( void *userdata);
315 static void onClickOfferTeleport( void *userdata); 316 static void onClickOfferTeleport( void *userdata);
316 static void onClickPay( void *userdata); 317 static void onClickPay( void *userdata);
317 static void onClickAddFriend(void* userdata); 318 static void onClickAddFriend(void* userdata);
diff --git a/linden/indra/newview/llpanelclassified.cpp b/linden/indra/newview/llpanelclassified.cpp
index 9e4f970..4428133 100644
--- a/linden/indra/newview/llpanelclassified.cpp
+++ b/linden/indra/newview/llpanelclassified.cpp
@@ -777,7 +777,10 @@ void LLPanelClassified::refresh()
777 mClickThroughText->setVisible(is_self); 777 mClickThroughText->setVisible(is_self);
778 778
779 mSetBtn->setVisible(is_self); 779 mSetBtn->setVisible(is_self);
780 mSetBtn->setEnabled(is_self); 780 //mSetBtn->setEnabled(is_self);
781// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
782 mSetBtn->setEnabled(is_self && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) );
783// [/RLVa:KB]
781 784
782 mUpdateBtn->setEnabled(is_self && checkDirty()); 785 mUpdateBtn->setEnabled(is_self && checkDirty());
783 mUpdateBtn->setVisible(is_self); 786 mUpdateBtn->setVisible(is_self);
@@ -978,6 +981,12 @@ void LLPanelClassified::onClickLandmark(void* data)
978// static 981// static
979void LLPanelClassified::onClickSet(void* data) 982void LLPanelClassified::onClickSet(void* data)
980{ 983{
984// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
985 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
986 {
987 return;
988 }
989// [/RLVa:KB]
981 LLPanelClassified* self = (LLPanelClassified*)data; 990 LLPanelClassified* self = (LLPanelClassified*)data;
982 991
983 // Save location for later. 992 // Save location for later.
diff --git a/linden/indra/newview/llpanelcontents.cpp b/linden/indra/newview/llpanelcontents.cpp
index a2f3d9e..d576a20 100644
--- a/linden/indra/newview/llpanelcontents.cpp
+++ b/linden/indra/newview/llpanelcontents.cpp
@@ -68,6 +68,10 @@
68#include "lltoolcomp.h" 68#include "lltoolcomp.h"
69#include "llpanelinventory.h" 69#include "llpanelinventory.h"
70 70
71// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
72#include "llvoavatar.h"
73// [/RLVa:KB]
74
71// 75//
72// Imported globals 76// Imported globals
73// 77//
@@ -153,6 +157,22 @@ void LLPanelContents::onClickNewScript(void *userdata)
153 LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok); 157 LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok);
154 if(object) 158 if(object)
155 { 159 {
160// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
161 if (rlv_handler_t::isEnabled()) // Fallback code [see LLPanelContents::getState()]
162 {
163 if (!gRlvHandler.isDetachable(object))
164 {
165 return; // Disallow creating new scripts in a locked attachment
166 }
167 else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP)) )
168 {
169 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
170 if ( (pAvatar) && (pAvatar->mIsSitting) && (pAvatar->getRoot() == object->getRootEdit()) )
171 return; // .. or in a linkset the avie is sitting on under @unsit=n/@sittp=n
172 }
173 }
174// [/RLVa:KB]
175
156 LLPermissions perm; 176 LLPermissions perm;
157 perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null); 177 perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
158 perm.initMasks( 178 perm.initMasks(
diff --git a/linden/indra/newview/llpaneldisplay.cpp b/linden/indra/newview/llpaneldisplay.cpp
index 035b43f..7d88cf9 100644
--- a/linden/indra/newview/llpaneldisplay.cpp
+++ b/linden/indra/newview/llpaneldisplay.cpp
@@ -319,6 +319,9 @@ BOOL LLPanelDisplay::postBuild()
319 mLightingText = getChild<LLTextBox>("LightingDetailText"); 319 mLightingText = getChild<LLTextBox>("LightingDetailText");
320 mMeshDetailText = getChild<LLTextBox>("MeshDetailText"); 320 mMeshDetailText = getChild<LLTextBox>("MeshDetailText");
321 321
322 childSetValue("toggle_windlight_control", gSavedSettings.getBOOL("EnableWindlightRemote"));
323 mWLControl = gSavedSettings.getBOOL("EnableWindlightRemote");
324
322 refresh(); 325 refresh();
323 326
324 return TRUE; 327 return TRUE;
@@ -476,7 +479,12 @@ void LLPanelDisplay::refreshEnabledState()
476 } 479 }
477 480
478 // Vertex Shaders 481 // Vertex Shaders
479 mCtrlShaderEnable->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")); 482// mCtrlShaderEnable->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"));
483// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0a
484 // "Basic Shaders" can't be disabled - but can be enabled - under @setenv=n
485 bool fCtrlShaderEnable = LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable");
486 mCtrlShaderEnable->setEnabled(fCtrlShaderEnable && (!gRlvHandler.hasBehaviour(RLV_BHVR_SETENV) || !mShaderEnable));
487// [/RLVa:KB]
480 488
481 BOOL shaders = mCtrlShaderEnable->get(); 489 BOOL shaders = mCtrlShaderEnable->get();
482 if (shaders) 490 if (shaders)
@@ -491,7 +499,12 @@ void LLPanelDisplay::refreshEnabledState()
491 499
492 // *HACK just checks to see if we can use shaders... 500 // *HACK just checks to see if we can use shaders...
493 // maybe some cards that use shaders, but don't support windlight 501 // maybe some cards that use shaders, but don't support windlight
494 mCtrlWindLight->setEnabled(mCtrlShaderEnable->getEnabled() && shaders); 502// mCtrlWindLight->setEnabled(mCtrlShaderEnable->getEnabled() && shaders);
503// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0a
504 // "Atmospheric Shaders" can't be disabled - but can be enabled - under @setenv=n
505 bool fCtrlWindLightEnable = fCtrlShaderEnable && shaders;
506 mCtrlWindLight->setEnabled(fCtrlWindLightEnable && (!gRlvHandler.hasBehaviour(RLV_BHVR_SETENV) || !mWindLight));
507// [/RLVa:KB]
495 508
496 // turn off sky detail if atmostpherics isn't on 509 // turn off sky detail if atmostpherics isn't on
497 mCtrlSkyFactor->setEnabled(gSavedSettings.getBOOL("WindLightUseAtmosShaders")); 510 mCtrlSkyFactor->setEnabled(gSavedSettings.getBOOL("WindLightUseAtmosShaders"));
@@ -691,6 +704,8 @@ void LLPanelDisplay::cancel()
691 gSavedSettings.setU32("WLSkyDetail", mSkyLOD); 704 gSavedSettings.setU32("WLSkyDetail", mSkyLOD);
692 gSavedSettings.setS32("RenderMaxPartCount", mParticleCount); 705 gSavedSettings.setS32("RenderMaxPartCount", mParticleCount);
693 gSavedSettings.setS32("RenderGlowResolutionPow", mPostProcess); 706 gSavedSettings.setS32("RenderGlowResolutionPow", mPostProcess);
707
708 gSavedSettings.setBOOL("EnableWindlightRemote", mWLControl);
694} 709}
695 710
696void LLPanelDisplay::apply() 711void LLPanelDisplay::apply()
@@ -702,6 +717,8 @@ void LLPanelDisplay::apply()
702 { 717 {
703 applyWindowSize(); 718 applyWindowSize();
704 } 719 }
720
721 gSavedSettings.setBOOL("EnableWindlightRemote", childGetValue("toggle_windlight_control").asBoolean());
705} 722}
706 723
707void LLPanelDisplay::onChangeQuality(LLUICtrl *ctrl, void *data) 724void LLPanelDisplay::onChangeQuality(LLUICtrl *ctrl, void *data)
diff --git a/linden/indra/newview/llpaneldisplay.h b/linden/indra/newview/llpaneldisplay.h
index 1aedee4..1cbdbba 100644
--- a/linden/indra/newview/llpaneldisplay.h
+++ b/linden/indra/newview/llpaneldisplay.h
@@ -171,6 +171,8 @@ protected:
171 S32 mParticleCount; 171 S32 mParticleCount;
172 S32 mPostProcess; 172 S32 mPostProcess;
173 173
174 BOOL mWLControl;
175
174 static void setGraphicsSettings(LLControlGroup& group); 176 static void setGraphicsSettings(LLControlGroup& group);
175 static void createGroup(); 177 static void createGroup();
176 178
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp
index ddd3781..51cac4b 100644
--- a/linden/indra/newview/llpanelgeneral.cpp
+++ b/linden/indra/newview/llpanelgeneral.cpp
@@ -64,6 +64,8 @@ BOOL LLPanelGeneral::postBuild()
64 childSetValue("small_avatar_names_checkbox", gSavedSettings.getBOOL("SmallAvatarNames")); 64 childSetValue("small_avatar_names_checkbox", gSavedSettings.getBOOL("SmallAvatarNames"));
65 childSetValue("show_my_title_checkbox", gSavedSettings.getBOOL("RenderHideGroupTitle")); 65 childSetValue("show_my_title_checkbox", gSavedSettings.getBOOL("RenderHideGroupTitle"));
66 childSetValue("afk_timeout_spinner", gSavedSettings.getF32("AFKTimeout")); 66 childSetValue("afk_timeout_spinner", gSavedSettings.getF32("AFKTimeout"));
67 childSetValue("mini_map_notify_chat", gSavedSettings.getBOOL("MiniMapNotifyChatRange"));
68 childSetValue("mini_map_notify_sim", gSavedSettings.getBOOL("MiniMapNotifySimRange"));
67 childSetValue("notify_money_change_checkbox", gSavedSettings.getBOOL("NotifyMoneyChange")); 69 childSetValue("notify_money_change_checkbox", gSavedSettings.getBOOL("NotifyMoneyChange"));
68 70
69 getChild<LLColorSwatchCtrl>("effect_color_swatch")->set(gSavedSettings.getColor4("EffectColor")); 71 getChild<LLColorSwatchCtrl>("effect_color_swatch")->set(gSavedSettings.getColor4("EffectColor"));
@@ -76,6 +78,7 @@ BOOL LLPanelGeneral::postBuild()
76 78
77 childSetValue("language_combobox", gSavedSettings.getString("Language")); 79 childSetValue("language_combobox", gSavedSettings.getString("Language"));
78 80
81 childSetAction("reset_ui_size", onClickResetUISize, this);
79 82
80 // if we have no agent, we can't let them choose anything 83 // if we have no agent, we can't let them choose anything
81 // if we have an agent, then we only let them choose if they have a choice 84 // if we have an agent, then we only let them choose if they have a choice
@@ -84,7 +87,6 @@ BOOL LLPanelGeneral::postBuild()
84 87
85 if (can_choose) 88 if (can_choose)
86 { 89 {
87
88 // if they're not adult or a god, they shouldn't see the adult selection, so delete it 90 // if they're not adult or a god, they shouldn't see the adult selection, so delete it
89 if (!gAgent.isAdult() && !gAgent.isGodlike()) 91 if (!gAgent.isAdult() && !gAgent.isGodlike())
90 { 92 {
@@ -125,6 +127,8 @@ void LLPanelGeneral::apply()
125 gSavedSettings.setBOOL("SmallAvatarNames", childGetValue("small_avatar_names_checkbox")); 127 gSavedSettings.setBOOL("SmallAvatarNames", childGetValue("small_avatar_names_checkbox"));
126 gSavedSettings.setBOOL("RenderHideGroupTitle", childGetValue("show_my_title_checkbox")); 128 gSavedSettings.setBOOL("RenderHideGroupTitle", childGetValue("show_my_title_checkbox"));
127 gSavedSettings.setF32("AFKTimeout", childGetValue("afk_timeout_spinner").asReal()); 129 gSavedSettings.setF32("AFKTimeout", childGetValue("afk_timeout_spinner").asReal());
130 gSavedSettings.setBOOL("MiniMapNotifyChatRange", childGetValue("mini_map_notify_chat"));
131 gSavedSettings.setBOOL("MiniMapNotifySimRange", childGetValue("mini_map_notify_sim"));
128 gSavedSettings.setBOOL("NotifyMoneyChange", childGetValue("notify_money_change_checkbox")); 132 gSavedSettings.setBOOL("NotifyMoneyChange", childGetValue("notify_money_change_checkbox"));
129 gSavedSettings.setColor4("EffectColor", childGetValue("effect_color_swatch")); 133 gSavedSettings.setColor4("EffectColor", childGetValue("effect_color_swatch"));
130 gSavedSettings.setF32("UIScaleFactor", childGetValue("ui_scale_slider").asReal()); 134 gSavedSettings.setF32("UIScaleFactor", childGetValue("ui_scale_slider").asReal());
@@ -157,3 +161,9 @@ void LLPanelGeneral::cancel()
157{ 161{
158} 162}
159 163
164// static
165void LLPanelGeneral::onClickResetUISize(void* user_data)
166{
167 LLPanelGeneral* self = (LLPanelGeneral*)user_data;
168 self->childSetValue("ui_scale_slider", 1.0f);
169}
diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h
index 4afa5dd..c5a1f63 100644
--- a/linden/indra/newview/llpanelgeneral.h
+++ b/linden/indra/newview/llpanelgeneral.h
@@ -46,6 +46,9 @@ public:
46 46
47 void apply(); 47 void apply();
48 void cancel(); 48 void cancel();
49
50private:
51 static void onClickResetUISize(void*);
49}; 52};
50 53
51#endif 54#endif
diff --git a/linden/indra/newview/llpanelinventory.cpp b/linden/indra/newview/llpanelinventory.cpp
index 7ef7f45..bc7c60f 100644
--- a/linden/indra/newview/llpanelinventory.cpp
+++ b/linden/indra/newview/llpanelinventory.cpp
@@ -82,6 +82,10 @@
82#include "llviewerwindow.h" 82#include "llviewerwindow.h"
83#include "llwearable.h" 83#include "llwearable.h"
84 84
85// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
86#include "llvoavatar.h"
87// [/RLVa:KB]
88
85///---------------------------------------------------------------------------- 89///----------------------------------------------------------------------------
86/// Local function declarations, constants, enums, and typedefs 90/// Local function declarations, constants, enums, and typedefs
87///---------------------------------------------------------------------------- 91///----------------------------------------------------------------------------
@@ -368,8 +372,16 @@ void LLTaskInvFVBridge::previewItem()
368 372
369BOOL LLTaskInvFVBridge::isItemRenameable() const 373BOOL LLTaskInvFVBridge::isItemRenameable() const
370{ 374{
371 if(gAgent.isGodlike()) return TRUE; 375// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
372 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); 376 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
377 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(object)) )
378 {
379 return FALSE;
380 }
381// [/RLVa:KB]
382
383 if(gAgent.isGodlike()) return TRUE;
384// LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
373 if(object) 385 if(object)
374 { 386 {
375 LLInventoryItem* item; 387 LLInventoryItem* item;
@@ -386,6 +398,12 @@ BOOL LLTaskInvFVBridge::isItemRenameable() const
386BOOL LLTaskInvFVBridge::renameItem(const std::string& new_name) 398BOOL LLTaskInvFVBridge::renameItem(const std::string& new_name)
387{ 399{
388 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); 400 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
401// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
402 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(object)) )
403 {
404 return TRUE; // Fallback code [see LLTaskInvFVBridge::isItemRenameable()]
405 }
406// [/RLVa:KB]
389 if(object) 407 if(object)
390 { 408 {
391 LLViewerInventoryItem* item = NULL; 409 LLViewerInventoryItem* item = NULL;
@@ -412,12 +430,47 @@ BOOL LLTaskInvFVBridge::isItemMovable()
412 // return TRUE; 430 // return TRUE;
413 //} 431 //}
414 //return FALSE; 432 //return FALSE;
433// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-0.2.0g
434 if (rlv_handler_t::isEnabled())
435 {
436 LLViewerObject* pObj = gObjectList.findObject(mPanel->getTaskUUID());
437 if (pObj)
438 {
439 if (!gRlvHandler.isDetachable(pObj))
440 {
441 return FALSE;
442 }
443 else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP)) )
444 {
445 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
446 if ( (pAvatar) && (pAvatar->mIsSitting) && (pAvatar->getRoot() == pObj->getRootEdit()) )
447 return FALSE;
448 }
449 }
450 }
451// [/RLVa:KB]
415 return TRUE; 452 return TRUE;
416} 453}
417 454
418BOOL LLTaskInvFVBridge::isItemRemovable() 455BOOL LLTaskInvFVBridge::isItemRemovable()
419{ 456{
420 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); 457 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
458// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-0.2.0g
459 if ( (object) && (rlv_handler_t::isEnabled()) )
460 {
461 if (!gRlvHandler.isDetachable(object))
462 {
463 return FALSE;
464 }
465 else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP)) )
466 {
467 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
468 if ( (pAvatar) && (pAvatar->mIsSitting) && (pAvatar->getRoot() == object->getRootEdit()) )
469 return FALSE;
470 }
471 }
472// [/RLVa:KB]
473
421 if(object 474 if(object
422 && (object->permModify() || object->permYouOwner())) 475 && (object->permModify() || object->permYouOwner()))
423 { 476 {
@@ -565,6 +618,13 @@ BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
565 const LLPermissions& perm = inv->getPermissions(); 618 const LLPermissions& perm = inv->getPermissions();
566 bool can_copy = gAgent.allowOperation(PERM_COPY, perm, 619 bool can_copy = gAgent.allowOperation(PERM_COPY, perm,
567 GP_OBJECT_MANIPULATE); 620 GP_OBJECT_MANIPULATE);
621// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
622 // Kind of redundant due to the note below, but in case that ever gets fixed
623 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(object)) )
624 {
625 return FALSE;
626 }
627// [/RLVa:KB]
568 if (object->isAttachment() && !can_copy) 628 if (object->isAttachment() && !can_copy)
569 { 629 {
570 //RN: no copy contents of attachments cannot be dragged out 630 //RN: no copy contents of attachments cannot be dragged out
@@ -687,6 +747,14 @@ void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
687 { 747 {
688 disabled_items.push_back(std::string("Task Open")); 748 disabled_items.push_back(std::string("Task Open"));
689 } 749 }
750// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
751 else if ( (rlv_handler_t::isEnabled()) &&
752 ((LLAssetType::AT_LSL_TEXT == item->getType()) || (LLAssetType::AT_NOTECARD == item->getType())) &&
753 (!gRlvHandler.isDetachable(gObjectList.findObject(mPanel->getTaskUUID()))) )
754 {
755 disabled_items.push_back(std::string("Task Open"));
756 }
757// [/RLVa:KB]
690 } 758 }
691 items.push_back(std::string("Task Properties")); 759 items.push_back(std::string("Task Properties"));
692 if(isItemRenameable()) 760 if(isItemRenameable())
@@ -1192,12 +1260,20 @@ LLTaskLSLBridge::LLTaskLSLBridge(
1192 1260
1193void LLTaskLSLBridge::openItem() 1261void LLTaskLSLBridge::openItem()
1194{ 1262{
1263// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
1264 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
1265 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(object)) )
1266 {
1267 return;
1268 }
1269// [/RLVa:KB]
1270
1195 llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl; 1271 llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl;
1196 if(LLLiveLSLEditor::show(mUUID, mPanel->getTaskUUID())) 1272 if(LLLiveLSLEditor::show(mUUID, mPanel->getTaskUUID()))
1197 { 1273 {
1198 return; 1274 return;
1199 } 1275 }
1200 LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); 1276// LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
1201 if(!object || object->isInventoryPending()) 1277 if(!object || object->isInventoryPending())
1202 { 1278 {
1203 return; 1279 return;
@@ -1312,6 +1388,12 @@ void LLTaskNotecardBridge::openItem()
1312 { 1388 {
1313 return; 1389 return;
1314 } 1390 }
1391// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
1392 if ( (rlv_handler_t::isEnabled()) && ((gRlvHandler.hasBehaviour(RLV_BHVR_VIEWNOTE)) || (!gRlvHandler.isDetachable(object))) )
1393 {
1394 return;
1395 }
1396// [/RLVa:KB]
1315 if(object->permModify() || gAgent.isGodlike()) 1397 if(object->permModify() || gAgent.isGodlike())
1316 { 1398 {
1317 S32 left, top; 1399 S32 left, top;
diff --git a/linden/indra/newview/llpanelland.cpp b/linden/indra/newview/llpanelland.cpp
index 8bb100d..27bfaea 100644
--- a/linden/indra/newview/llpanelland.cpp
+++ b/linden/indra/newview/llpanelland.cpp
@@ -231,6 +231,12 @@ void LLPanelLandInfo::refresh()
231//static 231//static
232void LLPanelLandInfo::onClickClaim(void*) 232void LLPanelLandInfo::onClickClaim(void*)
233{ 233{
234// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
235 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
236 {
237 return;
238 }
239// [/RLVa:KB]
234 LLViewerParcelMgr::getInstance()->startBuyLand(); 240 LLViewerParcelMgr::getInstance()->startBuyLand();
235} 241}
236 242
diff --git a/linden/indra/newview/llpanellogin.cpp b/linden/indra/newview/llpanellogin.cpp
index 8bb7152..feb85a7 100644
--- a/linden/indra/newview/llpanellogin.cpp
+++ b/linden/indra/newview/llpanellogin.cpp
@@ -36,6 +36,9 @@
36 36
37#include "llpanelgeneral.h" 37#include "llpanelgeneral.h"
38 38
39#include "hippoGridManager.h"
40#include "floaterlogin.h"
41
39#include "indra_constants.h" // for key and mask constants 42#include "indra_constants.h" // for key and mask constants
40#include "llfontgl.h" 43#include "llfontgl.h"
41#include "llmd5.h" 44#include "llmd5.h"
@@ -65,17 +68,24 @@
65#include "llviewernetwork.h" 68#include "llviewernetwork.h"
66#include "llviewerwindow.h" // to link into child list 69#include "llviewerwindow.h" // to link into child list
67#include "llnotify.h" 70#include "llnotify.h"
71#include "llappviewer.h" // for gHideLinks
68#include "llurlsimstring.h" 72#include "llurlsimstring.h"
69#include "lluictrlfactory.h" 73#include "lluictrlfactory.h"
70#include "llhttpclient.h" 74#include "llhttpclient.h"
71#include "llweb.h" 75#include "llweb.h"
72#include "llwebbrowserctrl.h" 76#include "llwebbrowserctrl.h"
73 77
78#include "llfloaterhtml.h"
79
74#include "llfloaterhtmlhelp.h" 80#include "llfloaterhtmlhelp.h"
75#include "llfloatertos.h" 81#include "llfloatertos.h"
76 82
77#include "llglheaders.h" 83#include "llglheaders.h"
78 84
85// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
86#include "rlvhandler.h"
87// [/RLVa:KB]
88
79#define USE_VIEWER_AUTH 0 89#define USE_VIEWER_AUTH 0
80 90
81const S32 BLACK_BORDER_HEIGHT = 160; 91const S32 BLACK_BORDER_HEIGHT = 160;
@@ -152,11 +162,6 @@ namespace {
152 boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0; 162 boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
153}; 163};
154 164
155void set_start_location(LLUICtrl* ctrl, void* data)
156{
157 LLURLSimString::setString(ctrl->getValue().asString());
158}
159
160//--------------------------------------------------------------------------- 165//---------------------------------------------------------------------------
161// Public methods 166// Public methods
162//--------------------------------------------------------------------------- 167//---------------------------------------------------------------------------
@@ -243,13 +248,13 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
243 combo->setCurrentByIndex( 0 ); 248 combo->setCurrentByIndex( 0 );
244 } 249 }
245 250
246 combo->setCommitCallback( &set_start_location );
247 251
248 LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo"); 252 LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
249 server_choice_combo->setCommitCallback(onSelectServer); 253 server_choice_combo->setCommitCallback(onSelectServer);
250 server_choice_combo->setFocusLostCallback(onServerComboLostFocus); 254 //server_choice_combo->setFocusLostCallback(onServerComboLostFocus);
251 255
252 childSetAction("connect_btn", onClickConnect, this); 256 childSetAction("connect_btn", onClickConnect, this);
257 childSetAction("grid_btn", onClickGrid, this);
253 258
254 setDefaultBtn("connect_btn"); 259 setDefaultBtn("connect_btn");
255 260
@@ -551,6 +556,7 @@ void LLPanelLogin::show(const LLRect &rect,
551 556
552 // Make sure that focus always goes here (and use the latest sInstance that was just created) 557 // Make sure that focus always goes here (and use the latest sInstance that was just created)
553 gFocusMgr.setDefaultKeyboardFocus(sInstance); 558 gFocusMgr.setDefaultKeyboardFocus(sInstance);
559 LLPanelLogin::addServer(LLViewerLogin::getInstance()->getGridLabel());
554} 560}
555 561
556// static 562// static
@@ -594,7 +600,7 @@ void LLPanelLogin::setFields(const std::string& firstname,
594 600
595 601
596// static 602// static
597void LLPanelLogin::addServer(const std::string& server, S32 domain_name) 603void LLPanelLogin::addServer(const std::string& server)
598{ 604{
599 if (!sInstance) 605 if (!sInstance)
600 { 606 {
@@ -602,17 +608,29 @@ void LLPanelLogin::addServer(const std::string& server, S32 domain_name)
602 return; 608 return;
603 } 609 }
604 610
605 LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo"); 611 const std::string &defaultGrid = gHippoGridManager->getDefaultGridNick();
606 combo->add(server, LLSD(domain_name) );
607 combo->setCurrentByIndex(0);
608}
609 612
613 LLComboBox *grids = sInstance->getChild<LLComboBox>("server_combo");
614 S32 selectIndex = -1, i = 0;
615 grids->removeall();
616 if (defaultGrid != "") {
617 grids->add(defaultGrid);
618 selectIndex = i++;
619 }
620 HippoGridManager::GridIterator it, end = gHippoGridManager->endGrid();
621 for (it = gHippoGridManager->beginGrid(); it != end; ++it) {
622 const std::string &grid = it->second->getGridNick();
623 if (grid != defaultGrid) {
624 grids->add(grid);
625 //if (grid == mCurGrid) selectIndex = i;
626 i++;
627 }
628 }
629 grids->setCurrentByIndex(0);
610 630
611// static 631 //LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
612void LLPanelLogin::setServer(S32 domain_name) 632 //combo->add(server, LLSD(domain_name) );
613{ 633 //combo->setCurrentByIndex(0);
614 LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
615 combo->setCurrentByIndex(domain_name);
616} 634}
617 635
618// static 636// static
@@ -690,10 +708,27 @@ void LLPanelLogin::refreshLocation( bool force_visible )
690 if ( ! force_visible ) 708 if ( ! force_visible )
691 show_start = gSavedSettings.getBOOL("ShowStartLocation"); 709 show_start = gSavedSettings.getBOOL("ShowStartLocation");
692 710
711
712// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
713// TODO-RLVa: figure out some way to make this work with RLV_EXTENSION_STARTLOCATION
714#ifndef RLV_EXTENSION_STARTLOCATION
715 if (rlv_handler_t::isEnabled())
716 {
717 show_start = FALSE;
718 }
719#endif // RLV_EXTENSION_STARTLOCATION
720// [/RLVa:KB]
721
722
693 sInstance->childSetVisible("start_location_combo", show_start); 723 sInstance->childSetVisible("start_location_combo", show_start);
694 sInstance->childSetVisible("start_location_text", show_start); 724 sInstance->childSetVisible("start_location_text", show_start);
695 725
726/*#if LL_RELEASE_FOR_DOWNLOAD
727 BOOL show_server = gSavedSettings.getBOOL("ForceShowGrid");
728 sInstance->childSetVisible("server_combo", show_server);
729#else*/
696 sInstance->childSetVisible("server_combo", TRUE); 730 sInstance->childSetVisible("server_combo", TRUE);
731//#endif
697 732
698#endif 733#endif
699} 734}
@@ -726,18 +761,39 @@ void LLPanelLogin::setAlwaysRefresh(bool refresh)
726} 761}
727 762
728 763
764// static
765void LLPanelLogin::refreshLoginPage()
766{
767 if (!sInstance) return;
768
769 sInstance->childSetVisible("create_new_account_text",
770 !gHippoGridManager->getConnectedGrid()->getRegisterUrl().empty());
771 sInstance->childSetVisible("forgot_password_text",
772 !gHippoGridManager->getConnectedGrid()->getPasswordUrl().empty());
773
774 // kick off a request to grab the url manually
775 gResponsePtr = LLIamHereLogin::build(sInstance);
776 std::string login_page = gHippoGridManager->getConnectedGrid()->getLoginPage();
777 if (!login_page.empty()) {
778 LLHTTPClient::head(login_page, gResponsePtr);
779 } else {
780 sInstance->setSiteIsAlive(false);
781 }
782}
783
729 784
730void LLPanelLogin::loadLoginPage() 785void LLPanelLogin::loadLoginPage()
731{ 786{
732 if (!sInstance) return; 787 if (!sInstance) return;
733 788
734 std::ostringstream oStr;
735 789
736 std::string login_page = gSavedSettings.getString("LoginPage"); 790 std::string login_page = gHippoGridManager->getConnectedGrid()->getLoginPage();
737 if (login_page.empty()) 791 if (login_page.empty()) {
738 { 792 sInstance->setSiteIsAlive(false);
739 login_page = sInstance->getString( "real_url" ); 793 return;
740 } 794 }
795
796 std::ostringstream oStr;
741 oStr << login_page; 797 oStr << login_page;
742 798
743 // Use the right delimeter depending on how LLURI parses the URL 799 // Use the right delimeter depending on how LLURI parses the URL
@@ -772,11 +828,12 @@ void LLPanelLogin::loadLoginPage()
772 curl_free(curl_version); 828 curl_free(curl_version);
773 829
774 // Grid 830 // Grid
775 char* curl_grid = curl_escape(LLViewerLogin::getInstance()->getGridCodeName().c_str(), 0); 831 char* curl_grid = curl_escape(LLViewerLogin::getInstance()->getGridLabel().c_str(), 0);
776 oStr << "&grid=" << curl_grid; 832 oStr << "&grid=" << curl_grid;
777 curl_free(curl_grid); 833 curl_free(curl_grid);
778 834
779 gViewerWindow->setMenuBackgroundColor(false, !LLViewerLogin::getInstance()->isInProductionGrid()); 835 gViewerWindow->setMenuBackgroundColor(false, !LLViewerLogin::getInstance()->isInProductionGrid());
836 //LLViewerLogin::getInstance()->setMenuColor();
780 gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); 837 gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor());
781 838
782 839
@@ -915,7 +972,15 @@ void LLPanelLogin::onClickConnect(void *)
915 } 972 }
916 } 973 }
917} 974}
975}
918 976
977void LLPanelLogin::onClickGrid(void *)
978{
979 if (sInstance && sInstance->mCallback)
980 {
981 LoginFloater::newShow(std::string("Test"), false);
982 }
983}
919 984
920// static 985// static
921bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response) 986bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)
@@ -983,7 +1048,7 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
983} 1048}
984 1049
985// static 1050// static
986void LLPanelLogin::onSelectServer(LLUICtrl*, void*) 1051void LLPanelLogin::onSelectServer(LLUICtrl* ctrl, void*)
987{ 1052{
988 // *NOTE: The paramters for this method are ignored. 1053 // *NOTE: The paramters for this method are ignored.
989 // LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*) 1054 // LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
@@ -992,46 +1057,29 @@ void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
992 // The user twiddled with the grid choice ui. 1057 // The user twiddled with the grid choice ui.
993 // apply the selection to the grid setting. 1058 // apply the selection to the grid setting.
994 std::string grid_label; 1059 std::string grid_label;
995 S32 grid_index; 1060 //S32 grid_index;
996 1061
997 LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo"); 1062 LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
998 LLSD combo_val = combo->getValue(); 1063 LLSD combo_val = combo->getValue();
999 1064
1000 if (LLSD::TypeInteger == combo_val.type()) 1065 std::string mCurGrid = ctrl->getValue().asString();
1001 { 1066 //KOW
1002 grid_index = combo->getValue().asInteger(); 1067 gHippoGridManager->setCurrentGrid(mCurGrid);
1003 1068 // HippoGridInfo *gridInfo = gHippoGridManager->getGrid(mCurGrid);
1004 if ((S32)GRID_INFO_OTHER == grid_index) 1069 // if (gridInfo) {
1005 { 1070 // //childSetText("gridnick", gridInfo->getGridNick());
1006 // This happens if the user specifies a custom grid 1071 // //platform->setCurrentByIndex(gridInfo->getPlatform());
1007 // via command line. 1072 // //childSetText("gridname", gridInfo->getGridName());
1008 grid_label = combo->getSimple(); 1073 // LLPanelLogin::setFields( gridInfo->getFirstName(), gridInfo->getLastName(), gridInfo->getAvatarPassword(), 1 );
1009 } 1074 // }
1010 }
1011 else
1012 {
1013 // no valid selection, return other
1014 grid_index = (S32)GRID_INFO_OTHER;
1015 grid_label = combo_val.asString();
1016 }
1017 1075
1018 // This new seelction will override preset uris 1076
1019 // from the command line. 1077 llwarns << "current grid = " << mCurGrid << llendl;
1020 LLViewerLogin* vl = LLViewerLogin::getInstance();
1021 vl->resetURIs();
1022 if(grid_index != GRID_INFO_OTHER)
1023 {
1024 vl->setGridChoice((EGridInfo)grid_index);
1025 }
1026 else
1027 {
1028 vl->setGridChoice(grid_label);
1029 }
1030 1078
1031 // grid changed so show new splash screen (possibly) 1079 // grid changed so show new splash screen (possibly)
1032 loadLoginPage(); 1080 loadLoginPage();
1033} 1081}
1034 1082/*
1035void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*) 1083void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
1036{ 1084{
1037 LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo"); 1085 LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
@@ -1040,3 +1088,4 @@ void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
1040 onSelectServer(combo, NULL); 1088 onSelectServer(combo, NULL);
1041 } 1089 }
1042} 1090}
1091*/
diff --git a/linden/indra/newview/llpanellogin.h b/linden/indra/newview/llpanellogin.h
index 8d5bf3a..f2c589d 100644
--- a/linden/indra/newview/llpanellogin.h
+++ b/linden/indra/newview/llpanellogin.h
@@ -4,7 +4,7 @@
4 * 4 *
5 * $LicenseInfo:firstyear=2002&license=viewergpl$ 5 * $LicenseInfo:firstyear=2002&license=viewergpl$
6 * 6 *
7 * Copyright (c) 2002-2009, Linden Research, Inc. 7 * Copyright (c) 2002-2008, Linden Research, Inc.
8 * 8 *
9 * Second Life Viewer Source Code 9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 10 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -63,8 +63,7 @@ public:
63 static void setFields(const std::string& firstname, const std::string& lastname, 63 static void setFields(const std::string& firstname, const std::string& lastname,
64 const std::string& password); 64 const std::string& password);
65 65
66 static void addServer(const std::string& server, S32 domain_name); 66 static void addServer(const std::string& server);
67 static void setServer(S32 domain_name);
68 static void refreshLocation( bool force_visible ); 67 static void refreshLocation( bool force_visible );
69 68
70 static void getFields(std::string *firstname, std::string *lastname, 69 static void getFields(std::string *firstname, std::string *lastname,
@@ -78,12 +77,14 @@ public:
78 void setSiteIsAlive( bool alive ); 77 void setSiteIsAlive( bool alive );
79 78
80 static void loadLoginPage(); 79 static void loadLoginPage();
80 static void refreshLoginPage();
81 static void giveFocus(); 81 static void giveFocus();
82 static void setAlwaysRefresh(bool refresh); 82 static void setAlwaysRefresh(bool refresh);
83 static void mungePassword(LLUICtrl* caller, void* user_data); 83 static void mungePassword(LLUICtrl* caller, void* user_data);
84 84
85private: 85private:
86 static void onClickConnect(void*); 86 static void onClickConnect(void*);
87 static void onClickGrid(void*);
87 static void onClickNewAccount(void*); 88 static void onClickNewAccount(void*);
88 static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response); 89 static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response);
89 static void onClickQuit(void*); 90 static void onClickQuit(void*);
diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp
index b0274e6..270a8ed 100644
--- a/linden/indra/newview/llpanelobject.cpp
+++ b/linden/indra/newview/llpanelobject.cpp
@@ -76,6 +76,10 @@
76 76
77#include "lldrawpool.h" 77#include "lldrawpool.h"
78 78
79// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
80#include "llvoavatar.h"
81// [/RLVa:KB]
82
79// 83//
80// Constants 84// Constants
81// 85//
@@ -386,6 +390,15 @@ void LLPanelObject::getState( )
386 enable_rotate = FALSE; 390 enable_rotate = FALSE;
387 } 391 }
388 392
393// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
394 if ( (rlv_handler_t::isEnabled()) && ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP))) )
395 {
396 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
397 if ( (pAvatar) && (pAvatar->mIsSitting) && (pAvatar->getRoot() == objectp->getRootEdit()) )
398 enable_move = enable_scale = enable_rotate = FALSE;
399 }
400// [/RLVa:KB]
401
389 LLVector3 vec; 402 LLVector3 vec;
390 if (enable_move) 403 if (enable_move)
391 { 404 {
@@ -619,6 +632,10 @@ void LLPanelObject::getState( )
619 } 632 }
620 else 633 else
621 { 634 {
635 mCtrlScaleX->setMaxValue(LLManipScale::getMaxPrimSize());
636 mCtrlScaleY->setMaxValue(LLManipScale::getMaxPrimSize());
637 mCtrlScaleZ->setMaxValue(LLManipScale::getMaxPrimSize());
638
622 // Only allowed to change these parameters for objects 639 // Only allowed to change these parameters for objects
623 // that you have permissions on AND are not attachments. 640 // that you have permissions on AND are not attachments.
624 enabled = root_objectp->permModify(); 641 enabled = root_objectp->permModify();
diff --git a/linden/indra/newview/llpanelpermissions.cpp b/linden/indra/newview/llpanelpermissions.cpp
index da8c9a9..0cb5b9e 100644
--- a/linden/indra/newview/llpanelpermissions.cpp
+++ b/linden/indra/newview/llpanelpermissions.cpp
@@ -85,6 +85,7 @@ BOOL LLPanelPermissions::postBuild()
85 85
86 86
87 this->childSetAction("button owner profile",LLPanelPermissions::onClickOwner,this); 87 this->childSetAction("button owner profile",LLPanelPermissions::onClickOwner,this);
88 this->childSetAction("button last owner profile",LLPanelPermissions::onClickLastOwner,this);
88 this->childSetAction("button creator profile",LLPanelPermissions::onClickCreator,this); 89 this->childSetAction("button creator profile",LLPanelPermissions::onClickCreator,this);
89 90
90 this->childSetAction("button set group",LLPanelPermissions::onClickGroup,this); 91 this->childSetAction("button set group",LLPanelPermissions::onClickGroup,this);
@@ -178,6 +179,11 @@ void LLPanelPermissions::refresh()
178 childSetEnabled("Owner Name",false); 179 childSetEnabled("Owner Name",false);
179 childSetEnabled("button owner profile",false); 180 childSetEnabled("button owner profile",false);
180 181
182 childSetEnabled("Last Owner:",false);
183 childSetText("Last Owner Name",LLStringUtil::null);
184 childSetEnabled("Last Owner Name",false);
185 childSetEnabled("button last owner profile",false);
186
181 childSetEnabled("Group:",false); 187 childSetEnabled("Group:",false);
182 childSetText("Group Name",LLStringUtil::null); 188 childSetText("Group Name",LLStringUtil::null);
183 childSetEnabled("Group Name",false); 189 childSetEnabled("Group Name",false);
@@ -297,6 +303,8 @@ void LLPanelPermissions::refresh()
297 owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name); 303 owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name);
298 304
299// llinfos << "owners_identical " << (owners_identical ? "TRUE": "FALSE") << llendl; 305// llinfos << "owners_identical " << (owners_identical ? "TRUE": "FALSE") << llendl;
306 std::string last_owner_name;
307 LLSelectMgr::getInstance()->selectGetLastOwner(mLastOwnerID, last_owner_name);
300 308
301 if (mOwnerID.isNull()) 309 if (mOwnerID.isNull())
302 { 310 {
@@ -307,8 +315,8 @@ void LLPanelPermissions::refresh()
307 else 315 else
308 { 316 {
309 // Display last owner if public 317 // Display last owner if public
310 std::string last_owner_name; 318 //std::string last_owner_name;
311 LLSelectMgr::getInstance()->selectGetLastOwner(mLastOwnerID, last_owner_name); 319 //LLSelectMgr::getInstance()->selectGetLastOwner(mLastOwnerID, last_owner_name);
312 320
313 // It should never happen that the last owner is null and the owner 321 // It should never happen that the last owner is null and the owner
314 // is null, but it seems to be a bug in the simulator right now. JC 322 // is null, but it seems to be a bug in the simulator right now. JC
@@ -320,9 +328,44 @@ void LLPanelPermissions::refresh()
320 } 328 }
321 } 329 }
322 330
331// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
332 bool fRlvEnableOwner = true;
333 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
334 {
335 // Only filter the owner name if: the selection is all owned by the same avie and not group owned
336 if ( (owners_identical) && (!LLSelectMgr::getInstance()->selectIsGroupOwned()) )
337 {
338 owner_name = gRlvHandler.getAnonym(owner_name);
339 fRlvEnableOwner = false;
340 }
341 }
342// [/RLVa:KB]
343
323 childSetText("Owner Name",owner_name); 344 childSetText("Owner Name",owner_name);
324 childSetEnabled("Owner Name",TRUE); 345 childSetEnabled("Owner Name",TRUE);
325 childSetEnabled("button owner profile",owners_identical && (mOwnerID.notNull() || LLSelectMgr::getInstance()->selectIsGroupOwned())); 346// childSetEnabled("button owner profile",owners_identical && (mOwnerID.notNull() || LLSelectMgr::getInstance()->selectIsGroupOwned()));
347// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
348 childSetEnabled("button owner profile",
349 fRlvEnableOwner && owners_identical && (mOwnerID.notNull() || LLSelectMgr::getInstance()->selectIsGroupOwned()));
350// [/RLVa:KB]
351
352 //if (owner_name != last_owner_name)
353// [RLVa:KB]
354 if ( (owner_name != last_owner_name) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
355// [/RLVa:KB]
356 {
357 childSetEnabled("Last Owner:", TRUE);
358 childSetText("Last Owner Name", last_owner_name);
359 childSetEnabled("Last Owner Name", TRUE);
360 childSetEnabled("button last owner profile", TRUE);
361 }
362 else
363 {
364 childSetEnabled("Last Owner:", FALSE);
365 childSetText("Last Owner Name", LLStringUtil::null);
366 childSetEnabled("Last Owner Name", FALSE);
367 childSetEnabled("button last owner profile", FALSE);
368 }
326 369
327 // update group text field 370 // update group text field
328 childSetEnabled("Group:",true); 371 childSetEnabled("Group:",true);
@@ -839,7 +882,23 @@ void LLPanelPermissions::onClickOwner(void *data)
839 } 882 }
840 else 883 else
841 { 884 {
842 LLFloaterAvatarInfo::showFromObject(self->mOwnerID); 885// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
886 if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
887 {
888 LLFloaterAvatarInfo::showFromObject(self->mOwnerID);
889 }
890// [/RLVa:KB]
891// LLFloaterAvatarInfo::showFromObject(self->mOwnerID);
892 }
893}
894
895void LLPanelPermissions::onClickLastOwner(void *data)
896{
897 LLPanelPermissions *self = (LLPanelPermissions *)data;
898
899 if ( self->mLastOwnerID.notNull() )
900 {
901 LLFloaterAvatarInfo::showFromObject(self->mLastOwnerID);
843 } 902 }
844} 903}
845 904
diff --git a/linden/indra/newview/llpanelpermissions.h b/linden/indra/newview/llpanelpermissions.h
index bb816ac..9aa5573 100644
--- a/linden/indra/newview/llpanelpermissions.h
+++ b/linden/indra/newview/llpanelpermissions.h
@@ -69,6 +69,7 @@ protected:
69 static void onClickRelease(void*); 69 static void onClickRelease(void*);
70 static void onClickCreator(void*); 70 static void onClickCreator(void*);
71 static void onClickOwner(void*); 71 static void onClickOwner(void*);
72 static void onClickLastOwner(void*);
72 static void onClickGroup(void*); 73 static void onClickGroup(void*);
73 static void cbGroupID(LLUUID group_id, void* userdata); 74 static void cbGroupID(LLUUID group_id, void* userdata);
74 static void onClickDeedToGroup(void*); 75 static void onClickDeedToGroup(void*);
diff --git a/linden/indra/newview/llpanelpick.cpp b/linden/indra/newview/llpanelpick.cpp
index 43ecd27..b26b51a 100644
--- a/linden/indra/newview/llpanelpick.cpp
+++ b/linden/indra/newview/llpanelpick.cpp
@@ -401,7 +401,10 @@ void LLPanelPick::refresh()
401 mEnabledCheck->setEnabled(godlike); 401 mEnabledCheck->setEnabled(godlike);
402 402
403 mSetBtn->setVisible(godlike); 403 mSetBtn->setVisible(godlike);
404 mSetBtn->setEnabled(godlike); 404 //mSetBtn->setEnabled(godlike);
405// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
406 mSetBtn->setEnabled(godlike && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) );
407// [/RLVa:KB]
405 } 408 }
406 else 409 else
407 { 410 {
@@ -418,7 +421,10 @@ void LLPanelPick::refresh()
418 mEnabledCheck->setEnabled(FALSE); 421 mEnabledCheck->setEnabled(FALSE);
419 422
420 mSetBtn->setVisible(is_self); 423 mSetBtn->setVisible(is_self);
421 mSetBtn->setEnabled(is_self); 424 //mSetBtn->setEnabled(is_self);
425// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
426 mSetBtn->setEnabled(is_self && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) );
427// [/RLVa]
422 } 428 }
423} 429}
424 430
@@ -456,6 +462,12 @@ void LLPanelPick::onClickLandmark(void* data)
456// static 462// static
457void LLPanelPick::onClickSet(void* data) 463void LLPanelPick::onClickSet(void* data)
458{ 464{
465// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
466 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
467 {
468 return;
469 }
470// [/RLVa:KB]
459 LLPanelPick* self = (LLPanelPick*)data; 471 LLPanelPick* self = (LLPanelPick*)data;
460 472
461 // Save location for later. 473 // Save location for later.
diff --git a/linden/indra/newview/llprefschat.cpp b/linden/indra/newview/llprefschat.cpp
index 559ad2b..2e08cac 100644
--- a/linden/indra/newview/llprefschat.cpp
+++ b/linden/indra/newview/llprefschat.cpp
@@ -33,6 +33,8 @@
33 33
34#include "llviewerprecompiledheaders.h" 34#include "llviewerprecompiledheaders.h"
35 35
36#include "llchatbar.h"
37#include "llfloaterchat.h"
36#include "llprefschat.h" 38#include "llprefschat.h"
37#include "lltexteditor.h" 39#include "lltexteditor.h"
38#include "llviewercontrol.h" 40#include "llviewercontrol.h"
@@ -71,11 +73,11 @@ private:
71 BOOL mPlayTypingAnim; 73 BOOL mPlayTypingAnim;
72 BOOL mChatBubbles; 74 BOOL mChatBubbles;
73 BOOL mScriptErrorAsChat; 75 BOOL mScriptErrorAsChat;
76 BOOL mChatChannel;
74 F32 mConsoleOpacity; 77 F32 mConsoleOpacity;
75 F32 mBubbleOpacity; 78 F32 mBubbleOpacity;
76}; 79};
77 80
78
79LLPrefsChatImpl::LLPrefsChatImpl() 81LLPrefsChatImpl::LLPrefsChatImpl()
80 : LLPanel(std::string("Chat Panel")) 82 : LLPanel(std::string("Chat Panel"))
81{ 83{
@@ -105,6 +107,7 @@ LLPrefsChatImpl::LLPrefsChatImpl()
105 childSetValue("chat_full_width_check", gSavedSettings.getBOOL("ChatFullWidth")); 107 childSetValue("chat_full_width_check", gSavedSettings.getBOOL("ChatFullWidth"));
106 childSetValue("close_chat_on_return_check", gSavedSettings.getBOOL("CloseChatOnReturn")); 108 childSetValue("close_chat_on_return_check", gSavedSettings.getBOOL("CloseChatOnReturn"));
107 childSetValue("play_typing_animation", gSavedSettings.getBOOL("PlayTypingAnim")); 109 childSetValue("play_typing_animation", gSavedSettings.getBOOL("PlayTypingAnim"));
110 childSetValue("toggle_channel_control", gSavedSettings.getBOOL("ChatChannelSelect"));
108 childSetValue("console_opacity", gSavedSettings.getF32("ConsoleBackgroundOpacity")); 111 childSetValue("console_opacity", gSavedSettings.getF32("ConsoleBackgroundOpacity"));
109 childSetValue("bubble_chat_opacity", gSavedSettings.getF32("ChatBubbleOpacity")); 112 childSetValue("bubble_chat_opacity", gSavedSettings.getF32("ChatBubbleOpacity"));
110} 113}
@@ -131,6 +134,7 @@ void LLPrefsChatImpl::refreshValues()
131 mChatFullWidth = gSavedSettings.getBOOL("ChatFullWidth"); 134 mChatFullWidth = gSavedSettings.getBOOL("ChatFullWidth");
132 mCloseChatOnReturn = gSavedSettings.getBOOL("CloseChatOnReturn"); 135 mCloseChatOnReturn = gSavedSettings.getBOOL("CloseChatOnReturn");
133 mPlayTypingAnim = gSavedSettings.getBOOL("PlayTypingAnim"); 136 mPlayTypingAnim = gSavedSettings.getBOOL("PlayTypingAnim");
137 mChatChannel = gSavedSettings.getBOOL("ChatChannelSelect");
134 mConsoleOpacity = gSavedSettings.getF32("ConsoleBackgroundOpacity"); 138 mConsoleOpacity = gSavedSettings.getF32("ConsoleBackgroundOpacity");
135 mBubbleOpacity = gSavedSettings.getF32("ChatBubbleOpacity"); 139 mBubbleOpacity = gSavedSettings.getF32("ChatBubbleOpacity");
136} 140}
@@ -156,6 +160,7 @@ void LLPrefsChatImpl::cancel()
156 gSavedSettings.setBOOL("ChatFullWidth", mChatFullWidth); 160 gSavedSettings.setBOOL("ChatFullWidth", mChatFullWidth);
157 gSavedSettings.setBOOL("CloseChatOnReturn", mCloseChatOnReturn); 161 gSavedSettings.setBOOL("CloseChatOnReturn", mCloseChatOnReturn);
158 gSavedSettings.setBOOL("PlayTypingAnim", mPlayTypingAnim); 162 gSavedSettings.setBOOL("PlayTypingAnim", mPlayTypingAnim);
163 gSavedSettings.setBOOL("ChatChannelSelect", mChatChannel);
159 gSavedSettings.setF32("ConsoleBackgroundOpacity", mConsoleOpacity); 164 gSavedSettings.setF32("ConsoleBackgroundOpacity", mConsoleOpacity);
160 gSavedSettings.setF32("ChatBubbleOpacity", mBubbleOpacity); 165 gSavedSettings.setF32("ChatBubbleOpacity", mBubbleOpacity);
161} 166}
@@ -189,6 +194,18 @@ void LLPrefsChatImpl::apply()
189 gSavedSettings.setF32("ConsoleBackgroundOpacity", childGetValue("console_opacity").asReal()); 194 gSavedSettings.setF32("ConsoleBackgroundOpacity", childGetValue("console_opacity").asReal());
190 gSavedSettings.setF32("ChatBubbleOpacity", childGetValue("bubble_chat_opacity").asReal()); 195 gSavedSettings.setF32("ChatBubbleOpacity", childGetValue("bubble_chat_opacity").asReal());
191 196
197 BOOL chan_check = childGetValue("toggle_channel_control");
198 gSavedSettings.setBOOL("ChatChannelSelect", chan_check);
199 if (mChatChannel != chan_check)
200 {
201 if (gChatBar)
202 {
203 gChatBar->toggleChannelControl();
204 //LLFloaterChat::toggleHistoryChannelControl(); temporarily disable until working
205 }
206 mChatChannel = chan_check;
207 }
208
192 refreshValues(); // member values become the official values and cancel becomes a no-op. 209 refreshValues(); // member values become the official values and cancel becomes a no-op.
193} 210}
194 211
diff --git a/linden/indra/newview/llprefsim.cpp b/linden/indra/newview/llprefsim.cpp
index 4daead0..0c06122 100644
--- a/linden/indra/newview/llprefsim.cpp
+++ b/linden/indra/newview/llprefsim.cpp
@@ -47,6 +47,8 @@
47 47
48#include "lldirpicker.h" 48#include "lldirpicker.h"
49 49
50#include "hippoGridManager.h"
51
50class LLPrefsIMImpl : public LLPanel 52class LLPrefsIMImpl : public LLPanel
51{ 53{
52public: 54public:
@@ -59,7 +61,7 @@ public:
59 void cancel(); 61 void cancel();
60 void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email); 62 void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email);
61 void enableHistory(); 63 void enableHistory();
62 64
63 static void onClickLogPath(void* user_data); 65 static void onClickLogPath(void* user_data);
64 static void onCommitLogging(LLUICtrl* ctrl, void* user_data); 66 static void onCommitLogging(LLUICtrl* ctrl, void* user_data);
65 67
@@ -120,6 +122,7 @@ BOOL LLPrefsIMImpl::postBuild()
120 childSetValue("include_im_in_chat_history", gSavedSettings.getBOOL("IMInChatHistory")); 122 childSetValue("include_im_in_chat_history", gSavedSettings.getBOOL("IMInChatHistory"));
121 childSetValue("show_timestamps_check", gSavedSettings.getBOOL("IMShowTimestamps")); 123 childSetValue("show_timestamps_check", gSavedSettings.getBOOL("IMShowTimestamps"));
122 childSetValue("friends_online_notify_checkbox", gSavedSettings.getBOOL("ChatOnlineNotification")); 124 childSetValue("friends_online_notify_checkbox", gSavedSettings.getBOOL("ChatOnlineNotification"));
125 childSetValue("vertical-imtabs-toggle", gSavedSettings.getBOOL("VerticalIMTabs"));
123 126
124 childSetText("log_path_string", gSavedPerAccountSettings.getString("InstantMessageLogPath")); 127 childSetText("log_path_string", gSavedPerAccountSettings.getString("InstantMessageLogPath"));
125 childSetValue("log_instant_messages", gSavedPerAccountSettings.getBOOL("LogInstantMessages")); 128 childSetValue("log_instant_messages", gSavedPerAccountSettings.getBOOL("LogInstantMessages"));
@@ -182,7 +185,7 @@ void LLPrefsIMImpl::apply()
182 185
183 gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath")); 186 gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
184 187
185 gDirUtilp->setPerAccountChatLogsDir(gSavedSettings.getString("FirstName"), 188 gDirUtilp->setPerAccountChatLogsDir(gHippoGridManager->getCurrentGridNick(), gSavedSettings.getString("FirstName"),
186 gSavedSettings.getString("LastName") ); 189 gSavedSettings.getString("LastName") );
187 LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir()); 190 LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
188 191
@@ -215,6 +218,7 @@ void LLPrefsIMImpl::apply()
215 gAgent.sendReliableMessage(); 218 gAgent.sendReliableMessage();
216 } 219 }
217 } 220 }
221 gSavedSettings.setBOOL("VerticalIMTabs", childGetValue("vertical-imtabs-toggle").asBoolean());
218} 222}
219 223
220void LLPrefsIMImpl::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email) 224void LLPrefsIMImpl::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email)
@@ -260,6 +264,12 @@ void LLPrefsIMImpl::setPersonalInfo(const std::string& visibility, bool im_via_e
260 LLWStringUtil::replaceChar(busy_response, '^', '\n'); 264 LLWStringUtil::replaceChar(busy_response, '^', '\n');
261 LLWStringUtil::replaceChar(busy_response, '%', ' '); 265 LLWStringUtil::replaceChar(busy_response, '%', ' ');
262 childSetText("busy_response", wstring_to_utf8str(busy_response)); 266 childSetText("busy_response", wstring_to_utf8str(busy_response));
267// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
268 if (gRlvHandler.hasBehaviour(RLV_BHVR_SENDIM))
269 {
270 childDisable("busy_response");
271 }
272// [/RLVa:KB]
263 273
264 enableHistory(); 274 enableHistory();
265 275
diff --git a/linden/indra/newview/llpreview.cpp b/linden/indra/newview/llpreview.cpp
index 6d7082b..9961003 100644
--- a/linden/indra/newview/llpreview.cpp
+++ b/linden/indra/newview/llpreview.cpp
@@ -597,3 +597,32 @@ void LLMultiPreview::setAutoOpenInstance(LLMultiPreview* previewp, const LLUUID&
597 sAutoOpenPreviewHandles[id] = previewp->getHandle(); 597 sAutoOpenPreviewHandles[id] = previewp->getHandle();
598 } 598 }
599} 599}
600
601void LLPreview::setAssetId(const LLUUID& asset_id)
602{
603 const LLViewerInventoryItem* item = getItem();
604 if(NULL == item)
605 {
606 return;
607 }
608
609 if(mObjectUUID.isNull())
610 {
611 // Update avatar inventory asset_id.
612 LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
613 new_item->setAssetUUID(asset_id);
614 gInventory.updateItem(new_item);
615 gInventory.notifyObservers();
616 }
617 else
618 {
619 // Update object inventory asset_id.
620 LLViewerObject* object = gObjectList.findObject(mObjectUUID);
621 if(NULL == object)
622 {
623 llwarns << "LLPreview::setAssetId() called on unrecognized object, UUID : " << mObjectUUID << llendl;
624 return;
625 }
626 object->updateViewerInventoryAsset(item, asset_id);
627 }
628}
diff --git a/linden/indra/newview/llpreview.h b/linden/indra/newview/llpreview.h
index ff084be..fba4ef2 100644
--- a/linden/indra/newview/llpreview.h
+++ b/linden/indra/newview/llpreview.h
@@ -84,6 +84,7 @@ public:
84 void setItemID(const LLUUID& item_id); 84 void setItemID(const LLUUID& item_id);
85 void setObjectID(const LLUUID& object_id); 85 void setObjectID(const LLUUID& object_id);
86 void setSourceID(const LLUUID& source_id); 86 void setSourceID(const LLUUID& source_id);
87 void setAssetId(const LLUUID& asset_id);
87 const LLViewerInventoryItem *getItem() const; // searches if not constructed with it 88 const LLViewerInventoryItem *getItem() const; // searches if not constructed with it
88 89
89 static LLPreview* find(const LLUUID& item_uuid); 90 static LLPreview* find(const LLUUID& item_uuid);
diff --git a/linden/indra/newview/llpreviewscript.cpp b/linden/indra/newview/llpreviewscript.cpp
index c148f17..4b8a151 100644
--- a/linden/indra/newview/llpreviewscript.cpp
+++ b/linden/indra/newview/llpreviewscript.cpp
@@ -438,6 +438,14 @@ void LLScriptEdCore::initMenu()
438 menuItem->setMenuCallback(onBtnHelp, this); 438 menuItem->setMenuCallback(onBtnHelp, this);
439 menuItem->setEnabledCallback(NULL); 439 menuItem->setEnabledCallback(NULL);
440 440
441 menuItem = getChild<LLMenuItemCallGL>("Load from Disk");
442 menuItem->setMenuCallback(onBtnLoadFromDisc, this);
443 menuItem->setEnabledCallback(NULL);
444
445 menuItem = getChild<LLMenuItemCallGL>("Save to Disk");
446 menuItem->setMenuCallback(onBtnSaveToDisc, this);
447 menuItem->setEnabledCallback(NULL);
448
441 menuItem = getChild<LLMenuItemCallGL>("LSL Wiki Help..."); 449 menuItem = getChild<LLMenuItemCallGL>("LSL Wiki Help...");
442 menuItem->setMenuCallback(onBtnDynamicHelp, this); 450 menuItem->setMenuCallback(onBtnDynamicHelp, this);
443 menuItem->setEnabledCallback(NULL); 451 menuItem->setEnabledCallback(NULL);
@@ -558,6 +566,7 @@ void LLScriptEdCore::setHelpPage(const std::string& help_string)
558 if (!history_combo) return; 566 if (!history_combo) return;
559 567
560 LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); 568 LLUIString url_string = gSavedSettings.getString("LSLHelpURL");
569 url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir());
561 url_string.setArg("[LSL_STRING]", help_string); 570 url_string.setArg("[LSL_STRING]", help_string);
562 571
563 addHelpItemToHistory(help_string); 572 addHelpItemToHistory(help_string);
@@ -786,6 +795,7 @@ void LLScriptEdCore::onHelpComboCommit(LLUICtrl* ctrl, void* userdata)
786 795
787 LLWebBrowserCtrl* web_browser = live_help_floater->getChild<LLWebBrowserCtrl>("lsl_guide_html"); 796 LLWebBrowserCtrl* web_browser = live_help_floater->getChild<LLWebBrowserCtrl>("lsl_guide_html");
788 LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); 797 LLUIString url_string = gSavedSettings.getString("LSLHelpURL");
798 url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir());
789 url_string.setArg("[LSL_STRING]", help_string); 799 url_string.setArg("[LSL_STRING]", help_string);
790 web_browser->navigateTo(url_string); 800 web_browser->navigateTo(url_string);
791 } 801 }
@@ -835,6 +845,60 @@ void LLScriptEdCore::onBtnUndoChanges( void* userdata )
835 } 845 }
836} 846}
837 847
848void LLScriptEdCore::onBtnSaveToDisc( void* userdata )
849{
850
851 LLViewerStats::getInstance()->incStat( LLViewerStats::ST_LSL_SAVE_COUNT );
852
853 LLScriptEdCore* self = (LLScriptEdCore*) userdata;
854
855 if( self->mSaveCallback )
856 {
857 LLFilePicker& file_picker = LLFilePicker::instance();
858 if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TEXT ) )
859 {
860 return;
861 }
862
863 std::string filename = file_picker.getFirstFile();
864 std::string scriptText=self->mEditor->getText();
865 std::ofstream fout(filename.c_str());
866 fout<<(scriptText);
867 fout.close();
868 self->mSaveCallback( self->mUserdata, FALSE );
869
870 }
871
872}
873void LLScriptEdCore::onBtnLoadFromDisc( void* data )
874{
875
876 LLScriptEdCore* self = (LLScriptEdCore*) data;
877
878 LLFilePicker& file_picker = LLFilePicker::instance();
879 if( !file_picker.getOpenFile( LLFilePicker::FFLOAD_TEXT ) )
880 {
881 return;
882 }
883
884 std::string filename = file_picker.getFirstFile();
885
886 std::ifstream fin(filename.c_str());
887
888 std::string line;
889 std::string linetotal;
890 self->mEditor->clear();
891 while (!fin.eof())
892 {
893 getline(fin,line);
894 line=line+"\n";
895 self->mEditor->insertText(line);
896
897 }
898 fin.close();
899
900}
901
838void LLScriptEdCore::onSearchMenu(void* userdata) 902void LLScriptEdCore::onSearchMenu(void* userdata)
839{ 903{
840 LLScriptEdCore* sec = (LLScriptEdCore*)userdata; 904 LLScriptEdCore* sec = (LLScriptEdCore*)userdata;
@@ -1937,6 +2001,12 @@ void LLLiveLSLEditor::onRunningCheckboxClicked( LLUICtrl*, void* userdata )
1937 LLCheckBoxCtrl* runningCheckbox = self->getChild<LLCheckBoxCtrl>("running"); 2001 LLCheckBoxCtrl* runningCheckbox = self->getChild<LLCheckBoxCtrl>("running");
1938 BOOL running = runningCheckbox->get(); 2002 BOOL running = runningCheckbox->get();
1939 //self->mRunningCheckbox->get(); 2003 //self->mRunningCheckbox->get();
2004// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
2005 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(object)) )
2006 {
2007 return;
2008 }
2009// [/RLVa:KB]
1940 if( object ) 2010 if( object )
1941 { 2011 {
1942 LLMessageSystem* msg = gMessageSystem; 2012 LLMessageSystem* msg = gMessageSystem;
@@ -1962,6 +2032,12 @@ void LLLiveLSLEditor::onReset(void *userdata)
1962 LLLiveLSLEditor* self = (LLLiveLSLEditor*) userdata; 2032 LLLiveLSLEditor* self = (LLLiveLSLEditor*) userdata;
1963 2033
1964 LLViewerObject* object = gObjectList.findObject( self->mObjectID ); 2034 LLViewerObject* object = gObjectList.findObject( self->mObjectID );
2035// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
2036 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(object)) )
2037 {
2038 return;
2039 }
2040// [/RLV:KB]
1965 if(object) 2041 if(object)
1966 { 2042 {
1967 LLMessageSystem* msg = gMessageSystem; 2043 LLMessageSystem* msg = gMessageSystem;
@@ -2383,6 +2459,14 @@ void LLLiveLSLEditor::onLoad(void* userdata)
2383void LLLiveLSLEditor::onSave(void* userdata, BOOL close_after_save) 2459void LLLiveLSLEditor::onSave(void* userdata, BOOL close_after_save)
2384{ 2460{
2385 LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata; 2461 LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata;
2462
2463// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
2464 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(gObjectList.findObject(self->mObjectID))) )
2465 {
2466 return;
2467 }
2468// [/RLV:KB]
2469
2386 self->mCloseAfterSave = close_after_save; 2470 self->mCloseAfterSave = close_after_save;
2387 self->saveIfNeeded(); 2471 self->saveIfNeeded();
2388} 2472}
diff --git a/linden/indra/newview/llpreviewscript.h b/linden/indra/newview/llpreviewscript.h
index eb8b414..ee7d773 100644
--- a/linden/indra/newview/llpreviewscript.h
+++ b/linden/indra/newview/llpreviewscript.h
@@ -98,6 +98,8 @@ public:
98 static void doSave( void* userdata, BOOL close_after_save ); 98 static void doSave( void* userdata, BOOL close_after_save );
99 static void onBtnSave(void*); 99 static void onBtnSave(void*);
100 static void onBtnUndoChanges(void*); 100 static void onBtnUndoChanges(void*);
101 static void onBtnSaveToDisc(void*);
102 static void onBtnLoadFromDisc(void*);
101 static void onSearchMenu(void* userdata); 103 static void onSearchMenu(void* userdata);
102 104
103 static void onUndoMenu(void* userdata); 105 static void onUndoMenu(void* userdata);
diff --git a/linden/indra/newview/llprogressview.cpp b/linden/indra/newview/llprogressview.cpp
index bfd14f7..aa7a61f 100644
--- a/linden/indra/newview/llprogressview.cpp
+++ b/linden/indra/newview/llprogressview.cpp
@@ -228,7 +228,7 @@ void LLProgressView::onCancelButtonClicked(void*)
228{ 228{
229 if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE) 229 if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE)
230 { 230 {
231 LLAppViewer::instance()->requestQuit(); 231 LLAppViewer::instance()->requestLogout(true);
232 } 232 }
233 else 233 else
234 { 234 {
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp
index 480273f..e4f914f 100644
--- a/linden/indra/newview/llselectmgr.cpp
+++ b/linden/indra/newview/llselectmgr.cpp
@@ -3437,12 +3437,20 @@ void LLSelectMgr::deselectAllIfTooFar()
3437 } 3437 }
3438 3438
3439 LLVector3d selectionCenter = getSelectionCenterGlobal(); 3439 LLVector3d selectionCenter = getSelectionCenterGlobal();
3440 if (gSavedSettings.getBOOL("LimitSelectDistance") 3440
3441// if (gSavedSettings.getBOOL("LimitSelectDistance")
3442// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
3443 BOOL fRlvFartouch = gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH) && gFloaterTools->getVisible();
3444 if ( (gSavedSettings.getBOOL("LimitSelectDistance") || (fRlvFartouch) )
3445// [/RLVa:KB]
3441 && (!mSelectedObjects->getPrimaryObject() || !mSelectedObjects->getPrimaryObject()->isAvatar()) 3446 && (!mSelectedObjects->getPrimaryObject() || !mSelectedObjects->getPrimaryObject()->isAvatar())
3442 && !mSelectedObjects->isAttachment() 3447 && !mSelectedObjects->isAttachment()
3443 && !selectionCenter.isExactlyZero()) 3448 && !selectionCenter.isExactlyZero())
3444 { 3449 {
3445 F32 deselect_dist = gSavedSettings.getF32("MaxSelectDistance"); 3450// F32 deselect_dist = gSavedSettings.getF32("MaxSelectDistance");
3451// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
3452 F32 deselect_dist = (!fRlvFartouch) ? gSavedSettings.getF32("MaxSelectDistance") : 1.5f;
3453// [/RLVa:KB]
3446 F32 deselect_dist_sq = deselect_dist * deselect_dist; 3454 F32 deselect_dist_sq = deselect_dist * deselect_dist;
3447 3455
3448 LLVector3d select_delta = gAgent.getPositionGlobal() - selectionCenter; 3456 LLVector3d select_delta = gAgent.getPositionGlobal() - selectionCenter;
@@ -4538,6 +4546,11 @@ extern LLGLdouble gGLModelView[16];
4538 4546
4539void LLSelectMgr::updateSilhouettes() 4547void LLSelectMgr::updateSilhouettes()
4540{ 4548{
4549 if (!mRenderSilhouettes || !LLSelectMgr::sRenderSelectionHighlights)
4550 {
4551 return;
4552 }
4553
4541 S32 num_sils_genned = 0; 4554 S32 num_sils_genned = 0;
4542 4555
4543 LLVector3d cameraPos = gAgent.getCameraPositionGlobal(); 4556 LLVector3d cameraPos = gAgent.getCameraPositionGlobal();
diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp
index f8b8247..31b537c 100644
--- a/linden/indra/newview/llspatialpartition.cpp
+++ b/linden/indra/newview/llspatialpartition.cpp
@@ -577,7 +577,7 @@ void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)
577 return; 577 return;
578 } 578 }
579 579
580 if (group->changeLOD()) 580 if (!LLPipeline::sSkipUpdate && group->changeLOD())
581 { 581 {
582 group->mLastUpdateDistance = group->mDistance; 582 group->mLastUpdateDistance = group->mDistance;
583 group->mLastUpdateViewAngle = group->mViewAngle; 583 group->mLastUpdateViewAngle = group->mViewAngle;
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index dae40dc..b862d61 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -30,7 +30,14 @@
30 * $/LicenseInfo$ 30 * $/LicenseInfo$
31 */ 31 */
32 32
33#include "llviewerprecompiledheaders.h" 33// #include "llviewerprecompiledheaders.h"
34
35
36#if LL_WINDOWS
37 #define WIN32_LEAN_AND_MEAN
38 #include <winsock2.h>
39 #include <windows.h>
40#endif
34 41
35#include "llstartup.h" 42#include "llstartup.h"
36 43
@@ -194,6 +201,8 @@
194#include "lldxhardware.h" 201#include "lldxhardware.h"
195#endif 202#endif
196 203
204#include "hippoGridManager.h"
205#include "hippoLimits.h"
197// 206//
198// exported globals 207// exported globals
199// 208//
@@ -226,7 +235,8 @@ static std::string sInitialOutfitGender; // "male" or "female"
226static bool gUseCircuitCallbackCalled = false; 235static bool gUseCircuitCallbackCalled = false;
227 236
228EStartupState LLStartUp::gStartupState = STATE_FIRST; 237EStartupState LLStartUp::gStartupState = STATE_FIRST;
229 238bool LLStartUp::mStartedOnce = false;
239bool LLStartUp::mShouldAutoLogin = false;
230 240
231// 241//
232// local function declaration 242// local function declaration
@@ -249,7 +259,6 @@ void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S3
249bool callback_choose_gender(const LLSD& notification, const LLSD& response); 259bool callback_choose_gender(const LLSD& notification, const LLSD& response);
250void init_start_screen(S32 location_id); 260void init_start_screen(S32 location_id);
251void release_start_screen(); 261void release_start_screen();
252void reset_login();
253void apply_udp_blacklist(const std::string& csv); 262void apply_udp_blacklist(const std::string& csv);
254 263
255void callback_cache_name(const LLUUID& id, const std::string& firstname, const std::string& lastname, BOOL is_group, void* data) 264void callback_cache_name(const LLUUID& id, const std::string& firstname, const std::string& lastname, BOOL is_group, void* data)
@@ -323,6 +332,7 @@ bool idle_startup()
323 static S32 timeout_count = 0; 332 static S32 timeout_count = 0;
324 333
325 static LLTimer login_time; 334 static LLTimer login_time;
335 static LLFrameTimer wearables_timer;
326 336
327 // until this is encapsulated, this little hack for the 337 // until this is encapsulated, this little hack for the
328 // auth/transform loop will do. 338 // auth/transform loop will do.
@@ -384,6 +394,11 @@ bool idle_startup()
384 // Initialize stuff that doesn't need data from simulators 394 // Initialize stuff that doesn't need data from simulators
385 // 395 //
386 396
397// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.1d
398 if ( (gSavedSettings.controlExists(RLV_SETTING_MAIN)) && (gSavedSettings.getBOOL(RLV_SETTING_MAIN)) )
399 rlv_handler_t::setEnabled(TRUE);
400// [/RLVa:KB]
401
387 if (LLFeatureManager::getInstance()->isSafe()) 402 if (LLFeatureManager::getInstance()->isSafe())
388 { 403 {
389 LLNotifications::instance().add("DisplaySetToSafe"); 404 LLNotifications::instance().add("DisplaySetToSafe");
@@ -674,7 +689,7 @@ bool idle_startup()
674 show_connect_box = 689 show_connect_box =
675 firstname.empty() || lastname.empty() || web_login_key.isNull(); 690 firstname.empty() || lastname.empty() || web_login_key.isNull();
676 } 691 }
677 else if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3) 692 else if((gSavedSettings.getLLSD("UserLoginInfo").size() == 3) && !LLStartUp::shouldAutoLogin())
678 { 693 {
679 LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo"); 694 LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo");
680 firstname = cmd_line_login[0].asString(); 695 firstname = cmd_line_login[0].asString();
@@ -708,7 +723,6 @@ bool idle_startup()
708 else 723 else
709 { 724 {
710 // if not automatically logging in, display login dialog 725 // if not automatically logging in, display login dialog
711 // a valid grid is selected
712 firstname = gSavedSettings.getString("FirstName"); 726 firstname = gSavedSettings.getString("FirstName");
713 lastname = gSavedSettings.getString("LastName"); 727 lastname = gSavedSettings.getString("LastName");
714 password = LLStartUp::loadPasswordFromDisk(); 728 password = LLStartUp::loadPasswordFromDisk();
@@ -738,10 +752,17 @@ bool idle_startup()
738 if (STATE_LOGIN_SHOW == LLStartUp::getStartupState()) 752 if (STATE_LOGIN_SHOW == LLStartUp::getStartupState())
739 { 753 {
740 LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL; 754 LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL;
755 sAuthUris.clear();
756 sAuthUriNum = -1;
741 757
742 gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); 758 gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
743 759
744 timeout_count = 0; 760 timeout_count = 0;
761
762 if(LLStartUp::shouldAutoLogin())
763 {
764 show_connect_box = false;
765 }
745 766
746 if (show_connect_box) 767 if (show_connect_box)
747 { 768 {
@@ -828,6 +849,19 @@ bool idle_startup()
828 lastname = gLoginHandler.getLastName(); 849 lastname = gLoginHandler.getLastName();
829 web_login_key = gLoginHandler.getWebLoginKey(); 850 web_login_key = gLoginHandler.getWebLoginKey();
830 } 851 }
852
853 /* Jacek - Grid manager stuff that's changed with 1.23
854 if(!gLoginHandler.mPassword.empty())
855 {
856 firstname = gLoginHandler.mFirstName;
857 lastname = gLoginHandler.mLastName;
858 password = gLoginHandler.mPassword;
859
860 gLoginHandler.mFirstName = "";
861 gLoginHandler.mLastName = "";
862 gLoginHandler.mPassword = "";
863 LLStartUp::setShouldAutoLogin(false);
864 }*/
831 865
832 if (show_connect_box) 866 if (show_connect_box)
833 { 867 {
@@ -845,13 +879,14 @@ bool idle_startup()
845 gSavedSettings.setString("FirstName", firstname); 879 gSavedSettings.setString("FirstName", firstname);
846 gSavedSettings.setString("LastName", lastname); 880 gSavedSettings.setString("LastName", lastname);
847 881
848 LL_INFOS("AppInit") << "Attempting login as: " << firstname << " " << lastname << LL_ENDL; 882 //LL_INFOS("AppInit") << "Attempting login as: " << firstname << " " << lastname << " " << password << LL_ENDL;
849 gDebugInfo["LoginName"] = firstname + " " + lastname; 883 gDebugInfo["LoginName"] = firstname + " " + lastname;
850 } 884 }
851 885
886 gHippoGridManager->setCurrentGridAsConnected();
852 // create necessary directories 887 // create necessary directories
853 // *FIX: these mkdir's should error check 888 // *FIX: these mkdir's should error check
854 gDirUtilp->setLindenUserDir(firstname, lastname); 889 gDirUtilp->setLindenUserDir(gHippoGridManager->getCurrentGridNick(), firstname, lastname);
855 LLFile::mkdir(gDirUtilp->getLindenUserDir()); 890 LLFile::mkdir(gDirUtilp->getLindenUserDir());
856 891
857 // Set PerAccountSettingsFile to the default value. 892 // Set PerAccountSettingsFile to the default value.
@@ -882,7 +917,7 @@ bool idle_startup()
882 gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath")); 917 gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
883 } 918 }
884 919
885 gDirUtilp->setPerAccountChatLogsDir(firstname, lastname); 920 gDirUtilp->setPerAccountChatLogsDir(gHippoGridManager->getCurrentGridNick(), firstname, lastname);
886 921
887 LLFile::mkdir(gDirUtilp->getChatLogsDir()); 922 LLFile::mkdir(gDirUtilp->getChatLogsDir());
888 LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir()); 923 LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
@@ -933,6 +968,23 @@ bool idle_startup()
933 // their last location, or some URL "-url //sim/x/y[/z]" 968 // their last location, or some URL "-url //sim/x/y[/z]"
934 // All accounts have both a home and a last location, and we don't support 969 // All accounts have both a home and a last location, and we don't support
935 // more locations than that. Choose the appropriate one. JC 970 // more locations than that. Choose the appropriate one. JC
971// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.1d
972 #ifndef RLV_EXTENSION_STARTLOCATION
973 if (rlv_handler_t::isEnabled())
974 #else
975 if ( (rlv_handler_t::isEnabled()) && (RlvSettings::getLoginLastLocation()) )
976 #endif // RLV_EXTENSION_STARTLOCATION
977 {
978 // Force login at the last location
979 agent_location_id = START_LOCATION_ID_LAST;
980 location_which = START_LOCATION_ID_LAST;
981 gSavedSettings.setBOOL("LoginLastLocation", FALSE);
982
983 // Clear some things that would cause us to divert to a user-specified location
984 LLURLSimString::setString(LLURLSimString::sLocationStringLast);
985 LLStartUp::sSLURLCommand.clear();
986 } else
987// [/RLVa:KB]
936 if (LLURLSimString::parse()) 988 if (LLURLSimString::parse())
937 { 989 {
938 // a startup URL was specified 990 // a startup URL was specified
@@ -1012,6 +1064,7 @@ bool idle_startup()
1012 requested_options.push_back("event_categories"); 1064 requested_options.push_back("event_categories");
1013 requested_options.push_back("event_notifications"); 1065 requested_options.push_back("event_notifications");
1014 requested_options.push_back("classified_categories"); 1066 requested_options.push_back("classified_categories");
1067 requested_options.push_back("adult_compliant");
1015 //requested_options.push_back("inventory-targets"); 1068 //requested_options.push_back("inventory-targets");
1016 requested_options.push_back("buddy-list"); 1069 requested_options.push_back("buddy-list");
1017 requested_options.push_back("ui-config"); 1070 requested_options.push_back("ui-config");
@@ -1040,6 +1093,10 @@ bool idle_startup()
1040 LLStringUtil::format_map_t args; 1093 LLStringUtil::format_map_t args;
1041 args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle(); 1094 args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle();
1042 auth_desc = LLTrans::getString("LoginInProgress", args); 1095 auth_desc = LLTrans::getString("LoginInProgress", args);
1096
1097 //Since we are about to login, we don't want the client to attempt auto login
1098 //again until the user does a grid2grid teleport.
1099 LLStartUp::setShouldAutoLogin(false);
1043 LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE ); 1100 LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE );
1044 } 1101 }
1045 1102
@@ -1079,13 +1136,30 @@ bool idle_startup()
1079 hashed_mac.hex_digest(hashed_mac_string); 1136 hashed_mac.hex_digest(hashed_mac_string);
1080 1137
1081 // TODO if statement here to use web_login_key 1138 // TODO if statement here to use web_login_key
1139 if(web_login_key.isNull()){
1082 sAuthUriNum = llclamp(sAuthUriNum, 0, (S32)sAuthUris.size()-1); 1140 sAuthUriNum = llclamp(sAuthUriNum, 0, (S32)sAuthUris.size()-1);
1083 LLUserAuth::getInstance()->authenticate( 1141 LLUserAuth::getInstance()->authenticate(
1084 sAuthUris[sAuthUriNum], 1142 sAuthUris[sAuthUriNum],
1085 auth_method, 1143 auth_method,
1086 firstname, 1144 firstname,
1087 lastname, 1145 lastname,
1088 password, // web_login_key, 1146 password,
1147 //web_login_key,
1148 start.str(),
1149 gSkipOptionalUpdate,
1150 gAcceptTOS,
1151 gAcceptCriticalMessage,
1152 gLastExecEvent,
1153 requested_options,
1154 hashed_mac_string,
1155 LLAppViewer::instance()->getSerialNumber());
1156 } else {
1157 LLUserAuth::getInstance()->authenticate(
1158 sAuthUris[sAuthUriNum],
1159 auth_method,
1160 firstname,
1161 lastname,
1162 web_login_key,
1089 start.str(), 1163 start.str(),
1090 gSkipOptionalUpdate, 1164 gSkipOptionalUpdate,
1091 gAcceptTOS, 1165 gAcceptTOS,
@@ -1094,6 +1168,7 @@ bool idle_startup()
1094 requested_options, 1168 requested_options,
1095 hashed_mac_string, 1169 hashed_mac_string,
1096 LLAppViewer::instance()->getSerialNumber()); 1170 LLAppViewer::instance()->getSerialNumber());
1171 }
1097 1172
1098 // reset globals 1173 // reset globals
1099 gAcceptTOS = FALSE; 1174 gAcceptTOS = FALSE;
@@ -1153,7 +1228,6 @@ bool idle_startup()
1153 LL_DEBUGS("AppInit") << "STATE_LOGIN_PROCESS_RESPONSE" << LL_ENDL; 1228 LL_DEBUGS("AppInit") << "STATE_LOGIN_PROCESS_RESPONSE" << LL_ENDL;
1154 std::ostringstream emsg; 1229 std::ostringstream emsg;
1155 bool quit = false; 1230 bool quit = false;
1156 bool update = false;
1157 std::string login_response; 1231 std::string login_response;
1158 std::string reason_response; 1232 std::string reason_response;
1159 std::string message_response; 1233 std::string message_response;
@@ -1255,7 +1329,16 @@ bool idle_startup()
1255 if(reason_response == "update") 1329 if(reason_response == "update")
1256 { 1330 {
1257 auth_message = LLUserAuth::getInstance()->getResponse("message"); 1331 auth_message = LLUserAuth::getInstance()->getResponse("message");
1258 update = true; 1332 if (show_connect_box)
1333 {
1334 update_app(TRUE, auth_message);
1335 LLStartUp::setStartupState( STATE_UPDATE_CHECK );
1336 return false;
1337 }
1338 else
1339 {
1340 quit = true;
1341 }
1259 } 1342 }
1260 if(reason_response == "optional") 1343 if(reason_response == "optional")
1261 { 1344 {
@@ -1293,21 +1376,6 @@ bool idle_startup()
1293 break; 1376 break;
1294 } 1377 }
1295 1378
1296 if (update || gSavedSettings.getBOOL("ForceMandatoryUpdate"))
1297 {
1298 gSavedSettings.setBOOL("ForceMandatoryUpdate", FALSE);
1299 if (show_connect_box)
1300 {
1301 update_app(TRUE, auth_message);
1302 LLStartUp::setStartupState( STATE_UPDATE_CHECK );
1303 return false;
1304 }
1305 else
1306 {
1307 quit = true;
1308 }
1309 }
1310
1311 // Version update and we're not showing the dialog 1379 // Version update and we're not showing the dialog
1312 if(quit) 1380 if(quit)
1313 { 1381 {
@@ -1370,6 +1438,18 @@ bool idle_startup()
1370 // agent_access can be 'A', 'M', and 'PG'. 1438 // agent_access can be 'A', 'M', and 'PG'.
1371 gAgent.setMaturity(text[0]); 1439 gAgent.setMaturity(text[0]);
1372 } 1440 }
1441 else // we're on an older sim version (prolly an opensim)
1442 {
1443 text = LLUserAuth::getInstance()->getResponse("agent_access");
1444 if(!text.empty() && (text[0] == 'M'))
1445 {
1446 gAgent.setTeen(false);
1447 }
1448 else
1449 {
1450 gAgent.setTeen(true);
1451 }
1452 }
1373 1453
1374 // this is the value of their preference setting for that content 1454 // this is the value of their preference setting for that content
1375 // which will always be <= agent_access_max 1455 // which will always be <= agent_access_max
@@ -1540,6 +1620,42 @@ bool idle_startup()
1540 } 1620 }
1541 } 1621 }
1542 1622
1623 // Override grid info with anything sent in the login response
1624 std::string tmp = LLUserAuth::getInstance()->getResponse("gridname");
1625 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setGridName(tmp);
1626 tmp = LLUserAuth::getInstance()->getResponse("loginuri");
1627 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setLoginUri(tmp);
1628 tmp = LLUserAuth::getInstance()->getResponse("welcome");
1629 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setLoginPage(tmp);
1630 tmp = LLUserAuth::getInstance()->getResponse("loginpage");
1631 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setLoginPage(tmp);
1632 tmp = LLUserAuth::getInstance()->getResponse("economy");
1633 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setHelperUri(tmp);
1634 tmp = LLUserAuth::getInstance()->getResponse("helperuri");
1635 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setHelperUri(tmp);
1636 tmp = LLUserAuth::getInstance()->getResponse("about");
1637 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setWebSite(tmp);
1638 tmp = LLUserAuth::getInstance()->getResponse("website");
1639 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setWebSite(tmp);
1640 tmp = LLUserAuth::getInstance()->getResponse("help");
1641 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setSupportUrl(tmp);
1642 tmp = LLUserAuth::getInstance()->getResponse("support");
1643 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setSupportUrl(tmp);
1644 tmp = LLUserAuth::getInstance()->getResponse("register");
1645 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setRegisterUrl(tmp);
1646 tmp = LLUserAuth::getInstance()->getResponse("account");
1647 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setRegisterUrl(tmp);
1648 tmp = LLUserAuth::getInstance()->getResponse("password");
1649 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setPasswordUrl(tmp);
1650 tmp = LLUserAuth::getInstance()->getResponse("search");
1651 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setSearchUrl(tmp);
1652 tmp = LLUserAuth::getInstance()->getResponse("currency");
1653 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setCurrencySymbol(tmp);
1654 tmp = LLUserAuth::getInstance()->getResponse("real_currency");
1655 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setRealCurrencySymbol(tmp);
1656 tmp = LLUserAuth::getInstance()->getResponse("directory_fee");
1657 if (!tmp.empty()) gHippoGridManager->getConnectedGrid()->setDirectoryFee(atoi(tmp.c_str()));
1658 gHippoGridManager->saveFile();
1543 1659
1544 // JC: gesture loading done below, when we have an asset system 1660 // JC: gesture loading done below, when we have an asset system
1545 // in place. Don't delete/clear user_credentials until then. 1661 // in place. Don't delete/clear user_credentials until then.
@@ -1564,8 +1680,10 @@ bool idle_startup()
1564 LLSD args; 1680 LLSD args;
1565 args["ERROR_MESSAGE"] = emsg.str(); 1681 args["ERROR_MESSAGE"] = emsg.str();
1566 LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done); 1682 LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done);
1567 reset_login(); 1683 LLStartUp::resetLogin();
1568 gSavedSettings.setBOOL("AutoLogin", FALSE); 1684 gSavedSettings.setBOOL("AutoLogin", FALSE);
1685 //this might be redundant
1686 LLStartUp::setShouldAutoLogin(false);
1569 show_connect_box = true; 1687 show_connect_box = true;
1570 } 1688 }
1571 1689
@@ -1584,8 +1702,10 @@ bool idle_startup()
1584 LLSD args; 1702 LLSD args;
1585 args["ERROR_MESSAGE"] = emsg.str(); 1703 args["ERROR_MESSAGE"] = emsg.str();
1586 LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done); 1704 LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done);
1587 reset_login(); 1705 LLStartUp::resetLogin();
1588 gSavedSettings.setBOOL("AutoLogin", FALSE); 1706 gSavedSettings.setBOOL("AutoLogin", FALSE);
1707 //this might be redundant
1708 LLStartUp::setShouldAutoLogin(false);
1589 show_connect_box = true; 1709 show_connect_box = true;
1590 } 1710 }
1591 return FALSE; 1711 return FALSE;
@@ -1597,6 +1717,7 @@ bool idle_startup()
1597 if (STATE_WORLD_INIT == LLStartUp::getStartupState()) 1717 if (STATE_WORLD_INIT == LLStartUp::getStartupState())
1598 { 1718 {
1599 set_startup_status(0.40f, LLTrans::getString("LoginInitializingWorld"), gAgent.mMOTD); 1719 set_startup_status(0.40f, LLTrans::getString("LoginInitializingWorld"), gAgent.mMOTD);
1720 gDisconnected=FALSE;
1600 display_startup(); 1721 display_startup();
1601 // We should have an agent id by this point. 1722 // We should have an agent id by this point.
1602 llassert(!(gAgentID == LLUUID::null)); 1723 llassert(!(gAgentID == LLUUID::null));
@@ -1625,10 +1746,11 @@ bool idle_startup()
1625 LLWaterParamManager::initClass(); 1746 LLWaterParamManager::initClass();
1626 1747
1627 // RN: don't initialize VO classes in drone mode, they are too closely tied to rendering 1748 // RN: don't initialize VO classes in drone mode, they are too closely tied to rendering
1749
1750 if (!LLStartUp::getStartedOnce())
1628 LLViewerObject::initVOClasses(); 1751 LLViewerObject::initVOClasses();
1629 1752
1630 display_startup(); 1753 display_startup();
1631
1632 // This is where we used to initialize gWorldp. Original comment said: 1754 // This is where we used to initialize gWorldp. Original comment said:
1633 // World initialization must be done after above window init 1755 // World initialization must be done after above window init
1634 1756
@@ -1774,7 +1896,7 @@ bool idle_startup()
1774 //reset statistics 1896 //reset statistics
1775 LLViewerStats::getInstance()->resetStats(); 1897 LLViewerStats::getInstance()->resetStats();
1776 1898
1777 if (!gNoRender) 1899 if ((!gNoRender)&&(!LLStartUp::getStartedOnce()))
1778 { 1900 {
1779 // 1901 //
1780 // Set up all of our statistics UI stuff. 1902 // Set up all of our statistics UI stuff.
@@ -2073,6 +2195,7 @@ bool idle_startup()
2073 } 2195 }
2074 } 2196 }
2075 } 2197 }
2198
2076 options.clear(); 2199 options.clear();
2077 bool show_hud = false; 2200 bool show_hud = false;
2078 if(LLUserAuth::getInstance()->getOptions("tutorial_setting", options)) 2201 if(LLUserAuth::getInstance()->getOptions("tutorial_setting", options))
@@ -2154,6 +2277,7 @@ bool idle_startup()
2154 // Create the inventory views 2277 // Create the inventory views
2155 llinfos << "Creating Inventory Views" << llendl; 2278 llinfos << "Creating Inventory Views" << llendl;
2156 LLInventoryView::showAgentInventory(); 2279 LLInventoryView::showAgentInventory();
2280 llinfos << "Inventory Views Created" << llendl;
2157 2281
2158 // Hide the inventory if it wasn't shown at exit 2282 // Hide the inventory if it wasn't shown at exit
2159 if(!shown_at_exit) 2283 if(!shown_at_exit)
@@ -2217,7 +2341,7 @@ bool idle_startup()
2217 gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE ); 2341 gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE );
2218 }; 2342 };
2219 2343
2220 if (!gNoRender) 2344 if ((!gNoRender)&&(!LLStartUp::getStartedOnce()))
2221 { 2345 {
2222 // JC: Initializing audio requests many sounds for download. 2346 // JC: Initializing audio requests many sounds for download.
2223 init_audio(); 2347 init_audio();
@@ -2377,25 +2501,11 @@ bool idle_startup()
2377 LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender ); 2501 LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender );
2378 } 2502 }
2379 2503
2380
2381 // We now have an inventory skeleton, so if this is a user's first
2382 // login, we can start setting up their clothing and avatar
2383 // appearance. This helps to avoid the generic "Ruth" avatar in
2384 // the orientation island tutorial experience. JC
2385 if (gAgent.isFirstLogin()
2386 && !sInitialOutfit.empty() // registration set up an outfit
2387 && !sInitialOutfitGender.empty() // and a gender
2388 && gAgent.getAvatarObject() // can't wear clothes without object
2389 && !gAgent.isGenderChosen() ) // nothing already loading
2390 {
2391 // Start loading the wearables, textures, gestures
2392 LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender );
2393 }
2394
2395 // wait precache-delay and for agent's avatar or a lot longer. 2504 // wait precache-delay and for agent's avatar or a lot longer.
2396 if(((timeout_frac > 1.f) && gAgent.getAvatarObject()) 2505 if(((timeout_frac > 1.f) && gAgent.getAvatarObject())
2397 || (timeout_frac > 3.f)) 2506 || (timeout_frac > 3.f))
2398 { 2507 {
2508 wearables_timer.reset();
2399 LLStartUp::setStartupState( STATE_WEARABLES_WAIT ); 2509 LLStartUp::setStartupState( STATE_WEARABLES_WAIT );
2400 } 2510 }
2401 else 2511 else
@@ -2417,7 +2527,6 @@ bool idle_startup()
2417 2527
2418 if (STATE_WEARABLES_WAIT == LLStartUp::getStartupState()) 2528 if (STATE_WEARABLES_WAIT == LLStartUp::getStartupState())
2419 { 2529 {
2420 static LLFrameTimer wearables_timer;
2421 2530
2422 const F32 wearables_time = wearables_timer.getElapsedTimeF32(); 2531 const F32 wearables_time = wearables_timer.getElapsedTimeF32();
2423 const F32 MAX_WEARABLES_TIME = 10.f; 2532 const F32 MAX_WEARABLES_TIME = 10.f;
@@ -2500,6 +2609,10 @@ bool idle_startup()
2500 2609
2501 // Have the agent start watching the friends list so we can update proxies 2610 // Have the agent start watching the friends list so we can update proxies
2502 gAgent.observeFriends(); 2611 gAgent.observeFriends();
2612
2613 // Start loading inventory
2614 gInventory.startBackgroundFetch();
2615
2503 if (gSavedSettings.getBOOL("LoginAsGod")) 2616 if (gSavedSettings.getBOOL("LoginAsGod"))
2504 { 2617 {
2505 gAgent.requestEnterGodMode(); 2618 gAgent.requestEnterGodMode();
@@ -2525,6 +2638,7 @@ bool idle_startup()
2525 LLUserAuth::getInstance()->reset(); 2638 LLUserAuth::getInstance()->reset();
2526 2639
2527 LLStartUp::setStartupState( STATE_STARTED ); 2640 LLStartUp::setStartupState( STATE_STARTED );
2641 LLStartUp::setStartedOnce(true);
2528 2642
2529 // Unmute audio if desired and setup volumes. 2643 // Unmute audio if desired and setup volumes.
2530 // Unmute audio if desired and setup volumes. 2644 // Unmute audio if desired and setup volumes.
@@ -2541,7 +2655,6 @@ bool idle_startup()
2541 gDebugView->mFastTimerView->setVisible(TRUE); 2655 gDebugView->mFastTimerView->setVisible(TRUE);
2542#endif 2656#endif
2543 2657
2544 LLAppViewer::instance()->handleLoginComplete();
2545 2658
2546 return TRUE; 2659 return TRUE;
2547 } 2660 }
@@ -2571,14 +2684,15 @@ void login_show()
2571 // UI textures have been previously loaded in doPreloadImages() 2684 // UI textures have been previously loaded in doPreloadImages()
2572 2685
2573 LL_DEBUGS("AppInit") << "Setting Servers" << LL_ENDL; 2686 LL_DEBUGS("AppInit") << "Setting Servers" << LL_ENDL;
2574 LL_INFOS("AppInit") << "getGridChoice is " << LLViewerLogin::getInstance()->getGridChoice() << LL_ENDL;
2575 2687
2688 //KOW
2689/*
2576 LLViewerLogin* vl = LLViewerLogin::getInstance(); 2690 LLViewerLogin* vl = LLViewerLogin::getInstance();
2577 for(int grid_index = GRID_INFO_NONE + 1; grid_index < GRID_INFO_OTHER; ++grid_index) 2691 for(int grid_index = 1; grid_index < GRID_INFO_OTHER; ++grid_index)
2578 { 2692 {
2579 LLPanelLogin::addServer(vl->getKnownGridLabel((EGridInfo)grid_index), grid_index); 2693 LLPanelLogin::addServer(vl->getKnownGridLabel(grid_index), grid_index);
2580 } 2694 }
2581 LLPanelLogin::setServer(LLViewerLogin::getInstance()->getGridChoice()-1); 2695*/
2582} 2696}
2583 2697
2584// Callback for when login screen is closed. Option 0 = connect, option 1 = quit. 2698// Callback for when login screen is closed. Option 0 = connect, option 1 = quit.
@@ -2885,8 +2999,6 @@ bool update_dialog_callback(const LLSD& notification, const LLSD& response)
2885 if (mandatory) 2999 if (mandatory)
2886 { 3000 {
2887 LLAppViewer::instance()->forceQuit(); 3001 LLAppViewer::instance()->forceQuit();
2888 // Bump them back to the login screen.
2889 //reset_login();
2890 } 3002 }
2891 else 3003 else
2892 { 3004 {
@@ -2914,7 +3026,7 @@ bool update_dialog_callback(const LLSD& notification, const LLSD& response)
2914 // *NOTE: This URL is also used in win_setup/lldownloader.cpp 3026 // *NOTE: This URL is also used in win_setup/lldownloader.cpp
2915 LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); 3027 LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map);
2916 3028
2917 if(LLAppViewer::sUpdaterInfo) 3029/* if(LLAppViewer::sUpdaterInfo)
2918 { 3030 {
2919 delete LLAppViewer::sUpdaterInfo ; 3031 delete LLAppViewer::sUpdaterInfo ;
2920 } 3032 }
@@ -2987,14 +3099,16 @@ bool update_dialog_callback(const LLSD& notification, const LLSD& response)
2987 LL_DEBUGS("AppInit") << "Calling updater: " << LLAppViewer::sUpdaterInfo->mUpdateExePath << LL_ENDL; 3099 LL_DEBUGS("AppInit") << "Calling updater: " << LLAppViewer::sUpdaterInfo->mUpdateExePath << LL_ENDL;
2988 3100
2989 // Run the auto-updater. 3101 // Run the auto-updater.
2990 system(LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str()); /* Flawfinder: ignore */ 3102*/
2991 3103 //system(LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str()); /* Flawfinder: ignore */
3104/*
2992#elif LL_LINUX || LL_SOLARIS 3105#elif LL_LINUX || LL_SOLARIS
2993 OSMessageBox("Automatic updating is not yet implemented for Linux.\n" 3106 OSMessageBox("Automatic updating is not yet implemented for Linux.\n"
2994 "Please download the latest version from www.secondlife.com.", 3107 "Please download the latest version from www.secondlife.com.",
2995 LLStringUtil::null, OSMB_OK); 3108 LLStringUtil::null, OSMB_OK);
2996#endif 3109#endif
2997 LLAppViewer::instance()->forceQuit(); 3110 LLAppViewer::instance()->forceQuit();
3111 */
2998 return false; 3112 return false;
2999} 3113}
3000 3114
@@ -3010,7 +3124,7 @@ void use_circuit_callback(void**, S32 result)
3010 // Make sure user knows something bad happened. JC 3124 // Make sure user knows something bad happened. JC
3011 LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL; 3125 LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL;
3012 LLNotifications::instance().add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status); 3126 LLNotifications::instance().add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
3013 reset_login(); 3127 LLStartUp::resetLogin();
3014 } 3128 }
3015 else 3129 else
3016 { 3130 {
@@ -3398,7 +3512,16 @@ void LLStartUp::setStartupState( EStartupState state )
3398} 3512}
3399 3513
3400 3514
3401void reset_login() 3515//static
3516void LLStartUp::setStartedOnce(bool started)
3517{
3518 mStartedOnce=started;
3519}
3520
3521
3522//displays the screen and cleans up UI
3523// static
3524void LLStartUp::resetLogin()
3402{ 3525{
3403 LLStartUp::setStartupState( STATE_LOGIN_SHOW ); 3526 LLStartUp::setStartupState( STATE_LOGIN_SHOW );
3404 3527
diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h
index fe347e9..28469d6 100644
--- a/linden/indra/newview/llstartup.h
+++ b/linden/indra/newview/llstartup.h
@@ -87,7 +87,10 @@ public:
87 // Always use this to set gStartupState so changes are logged 87 // Always use this to set gStartupState so changes are logged
88 static void setStartupState( EStartupState state ); 88 static void setStartupState( EStartupState state );
89 static EStartupState getStartupState() { return gStartupState; }; 89 static EStartupState getStartupState() { return gStartupState; };
90 static std::string getStartupStateString() { return startupStateToString(gStartupState); }; 90 static void resetLogin();
91
92 static void setStartedOnce(bool started);
93 static bool getStartedOnce() { return mStartedOnce; };
91 94
92 static void multimediaInit(); 95 static void multimediaInit();
93 // Initialize LLViewerMedia multimedia engine. 96 // Initialize LLViewerMedia multimedia engine.
@@ -114,8 +117,12 @@ public:
114 static std::string sSLURLCommand; 117 static std::string sSLURLCommand;
115 // *HACK: On startup, if we were passed a secondlife://app/do/foo 118 // *HACK: On startup, if we were passed a secondlife://app/do/foo
116 // command URL, store it for later processing. 119 // command URL, store it for later processing.
120 static bool shouldAutoLogin() { return mShouldAutoLogin; };
121 static void setShouldAutoLogin(bool value) { mShouldAutoLogin = value; };
117 122
118private: 123private:
124 static bool mStartedOnce;
125 static bool mShouldAutoLogin;
119 static std::string startupStateToString(EStartupState state); 126 static std::string startupStateToString(EStartupState state);
120 static EStartupState gStartupState; // Do not set directly, use LLStartup::setStartupState 127 static EStartupState gStartupState; // Do not set directly, use LLStartup::setStartupState
121}; 128};
diff --git a/linden/indra/newview/llstatusbar.cpp b/linden/indra/newview/llstatusbar.cpp
index 971930d..b4076b9 100644
--- a/linden/indra/newview/llstatusbar.cpp
+++ b/linden/indra/newview/llstatusbar.cpp
@@ -572,6 +572,15 @@ void LLStatusBar::refresh()
572 mRegionDetails.mTraffic = 0.0f; 572 mRegionDetails.mTraffic = 0.0f;
573 } 573 }
574 574
575// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) | Modified: RLVa-1.0.0a
576 if ( (region) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ) // region == NULL if we loose our connection to the grid
577 {
578 // TODO-RLVa: find out whether the LCD code is still used because if so then we need to filter that as well
579 location_name = llformat("%s (%s) - %s",
580 rlv_handler_t::cstrHiddenRegion.c_str(), region->getSimAccessString().c_str(), rlv_handler_t::cstrHidden.c_str());
581 }
582// [/RLVa:KB]
583
575 mTextParcelName->setText(location_name); 584 mTextParcelName->setText(location_name);
576 585
577 586
@@ -833,6 +842,12 @@ static void onClickScripts(void*)
833 842
834static void onClickBuyLand(void*) 843static void onClickBuyLand(void*)
835{ 844{
845// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
846 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) )
847 {
848 return;
849 }
850// [/RLVa:KB]
836 LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); 851 LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal());
837 LLViewerParcelMgr::getInstance()->startBuyLand(); 852 LLViewerParcelMgr::getInstance()->startBuyLand();
838} 853}
diff --git a/linden/indra/newview/llstylemap.cpp b/linden/indra/newview/llstylemap.cpp
index a34b4b8..890bbf1 100644
--- a/linden/indra/newview/llstylemap.cpp
+++ b/linden/indra/newview/llstylemap.cpp
@@ -97,7 +97,7 @@ const LLStyleSP &LLStyleMap::lookup(const LLUUID& id, const std::string& link)
97 style->setColor(LLColor4::white); 97 style->setColor(LLColor4::white);
98 (*this)[id] = style; 98 (*this)[id] = style;
99 } 99 }
100 else 100 else
101 { 101 {
102 LLStyleSP style = (*iter).second; 102 LLStyleSP style = (*iter).second;
103 if ( style->getLinkHREF() != link ) 103 if ( style->getLinkHREF() != link )
diff --git a/linden/indra/newview/lltexturectrl.cpp b/linden/indra/newview/lltexturectrl.cpp
index 97967c0..c4ea71e 100644
--- a/linden/indra/newview/lltexturectrl.cpp
+++ b/linden/indra/newview/lltexturectrl.cpp
@@ -355,6 +355,13 @@ void LLFloaterTexturePicker::updateImageStats()
355 { 355 {
356 mResolutionLabel->setTextArg("[DIMENSIONS]", std::string("[? x ?]")); 356 mResolutionLabel->setTextArg("[DIMENSIONS]", std::string("[? x ?]"));
357 } 357 }
358 if (gAgent.isGodlike())
359 {
360 std::string tstring = "Pick: ";
361 std::string image_id_string = mTexturep->getID().asString();
362 tstring = tstring + image_id_string.replace(24, 35, 12, '*'); // hide last segment to discourage theft
363 setTitle(tstring);
364 }
358 } 365 }
359} 366}
360 367
diff --git a/linden/indra/newview/lltool.cpp b/linden/indra/newview/lltool.cpp
index da9f3c5..6a3ada0 100644
--- a/linden/indra/newview/lltool.cpp
+++ b/linden/indra/newview/lltool.cpp
@@ -65,7 +65,6 @@ LLTool::~LLTool()
65 } 65 }
66} 66}
67 67
68
69BOOL LLTool::handleMouseDown(S32 x, S32 y, MASK mask) 68BOOL LLTool::handleMouseDown(S32 x, S32 y, MASK mask)
70{ 69{
71 if (gDebugClicks) 70 if (gDebugClicks)
@@ -125,6 +124,20 @@ BOOL LLTool::handleRightMouseUp(S32 x, S32 y, MASK mask)
125 // llinfos << "LLTool::handleRightMouseDown" << llendl; 124 // llinfos << "LLTool::handleRightMouseDown" << llendl;
126 return FALSE; 125 return FALSE;
127} 126}
127
128BOOL LLTool::handleMiddleMouseDown(S32 x,S32 y,MASK mask)
129{
130 // by default, didn't handle it
131 // llinfos << "LLTool::handleMiddleMouseDown" << llendl;
132 return FALSE;
133}
134
135BOOL LLTool::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
136{
137 // by default, didn't handle it
138 // llinfos << "LLTool::handleMiddleMouseUp" << llendl;
139 return FALSE;
140}
128 141
129BOOL LLTool::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen) 142BOOL LLTool::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen)
130{ 143{
diff --git a/linden/indra/newview/lltool.h b/linden/indra/newview/lltool.h
index 249088f..f954a8c 100644
--- a/linden/indra/newview/lltool.h
+++ b/linden/indra/newview/lltool.h
@@ -57,6 +57,9 @@ public:
57 // Virtual functions inherited from LLMouseHandler 57 // Virtual functions inherited from LLMouseHandler
58 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); 58 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
59 virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); 59 virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
60 virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
61 virtual BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask);
62
60 virtual BOOL handleHover(S32 x, S32 y, MASK mask); 63 virtual BOOL handleHover(S32 x, S32 y, MASK mask);
61 virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); 64 virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
62 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); 65 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
diff --git a/linden/indra/newview/lltoolbar.cpp b/linden/indra/newview/lltoolbar.cpp
index 33edb3e..cc6d4b8 100644
--- a/linden/indra/newview/lltoolbar.cpp
+++ b/linden/indra/newview/lltoolbar.cpp
@@ -471,6 +471,14 @@ void LLToolBar::onClickSit(void*)
471 } 471 }
472 else 472 else
473 { 473 {
474// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
475 // NOTE-RLVa: dead code?
476 if (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT))
477 {
478 return;
479 }
480// [/RLVa:KB]
481
474 // stand up 482 // stand up
475 gAgent.setFlying(FALSE); 483 gAgent.setFlying(FALSE);
476 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); 484 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
diff --git a/linden/indra/newview/lltooldraganddrop.cpp b/linden/indra/newview/lltooldraganddrop.cpp
index 34831a2..c24dd78 100644
--- a/linden/indra/newview/lltooldraganddrop.cpp
+++ b/linden/indra/newview/lltooldraganddrop.cpp
@@ -1269,6 +1269,15 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
1269 return; 1269 return;
1270 } 1270 }
1271 1271
1272
1273// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
1274 // Fallback in case there's a new code path that leads here (see behaviour notes)
1275 if (gRlvHandler.hasBehaviour(RLV_BHVR_REZ))
1276 {
1277 return;
1278 }
1279// [/RLVa:KB]
1280
1272 //llinfos << "Rezzing object" << llendl; 1281 //llinfos << "Rezzing object" << llendl;
1273 make_ui_sound("UISndObjectRezIn"); 1282 make_ui_sound("UISndObjectRezIn");
1274 LLViewerInventoryItem* item; 1283 LLViewerInventoryItem* item;
@@ -1961,6 +1970,23 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
1961 BOOL volume = (LL_PCODE_VOLUME == obj->getPCode()); 1970 BOOL volume = (LL_PCODE_VOLUME == obj->getPCode());
1962 BOOL attached = obj->isAttachment(); 1971 BOOL attached = obj->isAttachment();
1963 BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE; 1972 BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
1973
1974// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
1975 if (rlv_handler_t::isEnabled())
1976 {
1977 if (!gRlvHandler.isDetachable(obj))
1978 {
1979 return ACCEPT_NO_LOCKED; // Disallow inventory drops on a locked attachment
1980 }
1981 else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP)) )
1982 {
1983 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
1984 if ( (pAvatar) && (pAvatar->mIsSitting) && (pAvatar->getRoot() == obj->getRootEdit()) )
1985 return ACCEPT_NO_LOCKED; // ... or on a linkset the avie is sitting on under @unsit=n/@sittp=n
1986 }
1987 }
1988// [/RLVa:KB]
1989
1964 if(attached && !unrestricted) 1990 if(attached && !unrestricted)
1965 { 1991 {
1966 return ACCEPT_NO_LOCKED; 1992 return ACCEPT_NO_LOCKED;
@@ -2092,6 +2118,15 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
2092 return ACCEPT_NO; 2118 return ACCEPT_NO;
2093 } 2119 }
2094 2120
2121// [RLVa:KB] - Checked: 2009-09-08 (RLVa-1.0.2c) | Modified: RLVa-1.0.2c
2122 LLViewerJointAttachment* pAttachPt = NULL;
2123 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment()) && (!RlvSettings::getEnableWear()) &&
2124 ( ((pAttachPt = gRlvHandler.getAttachPoint(item, true)) == NULL) || (!gRlvHandler.isDetachable(pAttachPt)) ) )
2125 {
2126 return ACCEPT_NO_LOCKED;
2127 }
2128// [/RLVa:KB]
2129
2095 if( drop ) 2130 if( drop )
2096 { 2131 {
2097 if(mSource == SOURCE_LIBRARY) 2132 if(mSource == SOURCE_LIBRARY)
@@ -2107,7 +2142,10 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
2107 } 2142 }
2108 else 2143 else
2109 { 2144 {
2110 rez_attachment(item, 0); 2145// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Added: RLVa-1.0.0c
2146 rez_attachment(item, pAttachPt);
2147// [/RLVa:KB]
2148 //rez_attachment(item, 0);
2111 } 2149 }
2112 } 2150 }
2113 return ACCEPT_YES_SINGLE; 2151 return ACCEPT_YES_SINGLE;
@@ -2117,6 +2155,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
2117EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand( 2155EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
2118 LLViewerObject* obj, S32 face, MASK mask, BOOL drop) 2156 LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
2119{ 2157{
2158// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
2159 if (gRlvHandler.hasBehaviour(RLV_BHVR_REZ))
2160 {
2161 return ACCEPT_NO_LOCKED;
2162 }
2163// [/RLVa:KB]
2164
2120 if (mSource == SOURCE_WORLD) 2165 if (mSource == SOURCE_WORLD)
2121 { 2166 {
2122 return dad3dRezFromObjectOnLand(obj, face, mask, drop); 2167 return dad3dRezFromObjectOnLand(obj, face, mask, drop);
@@ -2180,6 +2225,14 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
2180EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject( 2225EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
2181 LLViewerObject* obj, S32 face, MASK mask, BOOL drop) 2226 LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
2182{ 2227{
2228// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
2229 // NOTE: if (mask & MASK_CONTROL) then it's a drop rather than a rez, so we let that pass through
2230 if ( !(mask & MASK_CONTROL) && (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) )
2231 {
2232 return ACCEPT_NO_LOCKED;
2233 }
2234// [/RLVa:KB]
2235
2183 // handle objects coming from object inventory 2236 // handle objects coming from object inventory
2184 if (mSource == SOURCE_WORLD) 2237 if (mSource == SOURCE_WORLD)
2185 { 2238 {
@@ -2385,6 +2438,20 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
2385 return ACCEPT_NO; 2438 return ACCEPT_NO;
2386 } 2439 }
2387 2440
2441// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
2442 // (See behaviour notes for the "code path", this is just to give a visual indication on whether or not the drop is allowed)
2443 if (rlv_handler_t::isEnabled())
2444 {
2445 EWearableType type = (EWearableType)item->getFlags();
2446
2447 // Block if: 1) we can't wear on that layer; 2) or if we're already wearing something there we can't take off
2448 if ( (!gRlvHandler.isWearable(type)) || ((gAgent.getWearable(type)) && (!gRlvHandler.isRemovable(type))) )
2449 {
2450 return ACCEPT_NO_LOCKED;
2451 }
2452 }
2453// [/RLVa:KB]
2454
2388 if( drop ) 2455 if( drop )
2389 { 2456 {
2390 // Don't wear anything until initial wearables are loaded, can 2457 // Don't wear anything until initial wearables are loaded, can
@@ -2749,6 +2816,14 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryCategory(
2749EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnLand( 2816EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnLand(
2750 LLViewerObject* obj, S32 face, MASK mask, BOOL drop) 2817 LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
2751{ 2818{
2819// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
2820 // NOTE: it looks like this is only ever called from LLToolDragAndDrop::dad3dRezObjectOnLand() making this a bit redundant
2821 if (gRlvHandler.hasBehaviour(RLV_BHVR_REZ))
2822 {
2823 return ACCEPT_NO_LOCKED;
2824 }
2825// [/RLVa:KB]
2826
2752 lldebugs << "LLToolDragAndDrop::dad3dRezFromObjectOnLand()" << llendl; 2827 lldebugs << "LLToolDragAndDrop::dad3dRezFromObjectOnLand()" << llendl;
2753 LLViewerInventoryItem* item = NULL; 2828 LLViewerInventoryItem* item = NULL;
2754 LLViewerInventoryCategory* cat = NULL; 2829 LLViewerInventoryCategory* cat = NULL;
@@ -2770,6 +2845,14 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnLand(
2770EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject( 2845EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject(
2771 LLViewerObject* obj, S32 face, MASK mask, BOOL drop) 2846 LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
2772{ 2847{
2848// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
2849 // NOTE: it looks like this is only ever called from LLToolDragAndDrop::dad3dRezObjectOnObject) making this a bit redundant
2850 if (gRlvHandler.hasBehaviour(RLV_BHVR_REZ))
2851 {
2852 return ACCEPT_NO_LOCKED;
2853 }
2854// [/RLVa:KB]
2855
2773 lldebugs << "LLToolDragAndDrop::dad3dRezFromObjectOnObject()" << llendl; 2856 lldebugs << "LLToolDragAndDrop::dad3dRezFromObjectOnObject()" << llendl;
2774 LLViewerInventoryItem* item; 2857 LLViewerInventoryItem* item;
2775 LLViewerInventoryCategory* cat; 2858 LLViewerInventoryCategory* cat;
diff --git a/linden/indra/newview/lltoolface.cpp b/linden/indra/newview/lltoolface.cpp
index d06e41c..3cddba7 100644
--- a/linden/indra/newview/lltoolface.cpp
+++ b/linden/indra/newview/lltoolface.cpp
@@ -100,6 +100,16 @@ void LLToolFace::pickCallback(const LLPickInfo& pick_info)
100 return; 100 return;
101 } 101 }
102 102
103// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
104 if ( (rlv_handler_t::isEnabled()) &&
105 ( (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) ||
106 ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && ((!hit_obj->isAttachment()) || (!hit_obj->permYouOwner())) &&
107 (dist_vec_squared(gAgent.getPositionAgent(), hit_obj->getPositionRegion() + pick_info.mObjectOffset) > 1.5f * 1.5f) )))
108 {
109 return;
110 }
111// [/RLVa:KB]
112
103 // ...clicked on a world object, try to pick the appropriate face 113 // ...clicked on a world object, try to pick the appropriate face
104 114
105 if (pick_info.mKeyMask & MASK_SHIFT) 115 if (pick_info.mKeyMask & MASK_SHIFT)
diff --git a/linden/indra/newview/lltoolgrab.cpp b/linden/indra/newview/lltoolgrab.cpp
index ed9ca85..3437193 100644
--- a/linden/indra/newview/lltoolgrab.cpp
+++ b/linden/indra/newview/lltoolgrab.cpp
@@ -186,7 +186,12 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info)
186 return FALSE; 186 return FALSE;
187 } 187 }
188 188
189 if (objectp->isAvatar()) 189 //if (objectp->isAvatar())
190// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
191 if ( (objectp->isAvatar()) ||
192 ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && ((!objectp->isAttachment()) || (!objectp->permYouOwner())) &&
193 (dist_vec_squared(gAgent.getPositionAgent(), mGrabPick.mIntersection) > 1.5f * 1.5f) ) )
194// [/RLVa:KB]
190 { 195 {
191 if (gGrabTransientTool) 196 if (gGrabTransientTool)
192 { 197 {
@@ -421,6 +426,23 @@ BOOL LLToolGrab::handleHover(S32 x, S32 y, MASK mask)
421 return TRUE; 426 return TRUE;
422 } 427 }
423 428
429// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0f
430 // Don't allow dragging beyond 1.5m under @fartouch=n
431 LLViewerObject* pObj;
432 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && (GRAB_INACTIVE != mMode) && (hasMouseCapture()) &&
433 ((pObj = mGrabPick.getObject()) != NULL) && (!pObj->isDead()) && (!pObj->isHUDAttachment()) &&
434 (dist_vec_squared(gAgent.getPositionAgent(), pObj->getPositionRegion() + mGrabPick.mObjectOffset) > 1.5f * 1.5f) )
435 {
436 if (gGrabTransientTool)
437 {
438 // Prevent the grab tool from popping up as soon as we kill the drag operation
439 gBasicToolset->selectTool(gGrabTransientTool);
440 gGrabTransientTool = NULL;
441 }
442 setMouseCapture(FALSE);
443 }
444// [/RLVa:KB]
445
424 // Do the right hover based on mode 446 // Do the right hover based on mode
425 switch( mMode ) 447 switch( mMode )
426 { 448 {
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp
index 60e40dd..f6c2eef 100644
--- a/linden/indra/newview/lltoolpie.cpp
+++ b/linden/indra/newview/lltoolpie.cpp
@@ -166,6 +166,15 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show)
166 // If it's a left-click, and we have a special action, do it. 166 // If it's a left-click, and we have a special action, do it.
167 if (useClickAction(always_show, mask, object, parent)) 167 if (useClickAction(always_show, mask, object, parent))
168 { 168 {
169// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
170 // Block left-click special actions (fallback code really since LLToolSelect::handleObjectSelection() wouldn't select it anyway)
171 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) &&
172 (dist_vec_squared(gAgent.getPositionAgent(), mPick.mIntersection) > 1.5f * 1.5f) )
173 {
174 return TRUE;
175 }
176// [/RLVa:KB]
177
169 mClickAction = 0; 178 mClickAction = 0;
170 if (object && object->getClickAction()) 179 if (object && object->getClickAction())
171 { 180 {
@@ -182,7 +191,7 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show)
182 // touch behavior down below... 191 // touch behavior down below...
183 break; 192 break;
184 case CLICK_ACTION_SIT: 193 case CLICK_ACTION_SIT:
185 if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->mIsSitting)) // agent not already sitting 194 if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->mIsSitting) && !gSavedSettings.getBOOL("BlockClickSit")) // agent not already sitting
186 { 195 {
187 handle_sit_or_stand(); 196 handle_sit_or_stand();
188 return TRUE; 197 return TRUE;
@@ -362,7 +371,22 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show)
362 //gMutePieMenu->setLabel("Mute"); 371 //gMutePieMenu->setLabel("Mute");
363 } 372 }
364 373
365 gPieAvatar->show(x, y, mPieMouseButtonDown); 374// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0f
375#ifdef RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
376 // If we have an empty selection under @fartouch=n don't show the pie menu but play the "operation block" sound
377 if ( (!gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) || (!LLSelectMgr::getInstance()->getSelection()->isEmpty()) )
378 {
379#endif // RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
380 gPieAvatar->show(x, y, mPieMouseButtonDown);
381#ifdef RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
382 }
383 else
384 {
385 make_ui_sound("UISndInvalidOp");
386 }
387#endif // RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
388// [/RLVa:KB]
389
366 } 390 }
367 else if (object->isAttachment() && !object->isHUDAttachment()) 391 else if (object->isAttachment() && !object->isHUDAttachment())
368 { 392 {
@@ -392,15 +416,32 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show)
392 //gMuteObjectPieMenu->setLabel("Mute"); 416 //gMuteObjectPieMenu->setLabel("Mute");
393 } 417 }
394 418
395 gPieObject->show(x, y, mPieMouseButtonDown); 419// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0f
396 420 #ifdef RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
397 // VEFFECT: ShowPie object 421 // If we have an empty selection under @fartouch=n don't show the pie menu but play the "operation block" sound
398 // Don't show when you click on someone else, it freaks them 422 // (not entirely accurate in case of Tools / Select Only XXX [see LLToolSelect::handleObjectSelection()]
399 // out. 423 if ( (!gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) || (!LLSelectMgr::getInstance()->getSelection()->isEmpty()) )
400 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE); 424 {
401 effectp->setPositionGlobal(mPick.mPosGlobal); 425 #endif // RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
402 effectp->setColor(LLColor4U(gAgent.getEffectColor())); 426// [/RLVa:KB]
403 effectp->setDuration(0.25f); 427 gPieObject->show(x, y, mPieMouseButtonDown);
428
429 // VEFFECT: ShowPie object
430 // Don't show when you click on someone else, it freaks them
431 // out.
432 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
433 effectp->setPositionGlobal(mPick.mPosGlobal);
434 effectp->setColor(LLColor4U(gAgent.getEffectColor()));
435 effectp->setDuration(0.25f);
436// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0f
437 #ifdef RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
438 }
439 else
440 {
441 make_ui_sound("UISndInvalidOp");
442 }
443 #endif // RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK
444// [/RLVa:KB]
404 } 445 }
405 } 446 }
406 447
@@ -653,7 +694,7 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
653 llinfos << "LLToolPie handleDoubleClick (becoming mouseDown)" << llendl; 694 llinfos << "LLToolPie handleDoubleClick (becoming mouseDown)" << llendl;
654 } 695 }
655 696
656 if (gSavedSettings.getBOOL("DoubleClickAutoPilot")) 697 if (gSavedSettings.getBOOL("DoubleClickAutoPilot") || gSavedSettings.getBOOL("DoubleClickTeleport"))
657 { 698 {
658 if (mPick.mPickType == LLPickInfo::PICK_LAND 699 if (mPick.mPickType == LLPickInfo::PICK_LAND
659 && !mPick.mPosGlobal.isExactlyZero()) 700 && !mPick.mPosGlobal.isExactlyZero())
@@ -664,9 +705,10 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
664 else if (mPick.mObjectID.notNull() 705 else if (mPick.mObjectID.notNull()
665 && !mPick.mPosGlobal.isExactlyZero()) 706 && !mPick.mPosGlobal.isExactlyZero())
666 { 707 {
667 // Hit an object 708 //Zwagoth: No more teleport to HUD attachments. >:o
668 // HACK: Call the last hit position the point we hit on the object 709 if(mPick.getObject().notNull() && mPick.getObject()->isHUDAttachment())
669 //gLastHitPosGlobal += gLastHitObjectOffset; 710 return FALSE;
711
670 handle_go_to(); 712 handle_go_to();
671 return TRUE; 713 return TRUE;
672 } 714 }
diff --git a/linden/indra/newview/lltoolplacer.cpp b/linden/indra/newview/lltoolplacer.cpp
index a053849..84e0203 100644
--- a/linden/indra/newview/lltoolplacer.cpp
+++ b/linden/indra/newview/lltoolplacer.cpp
@@ -125,6 +125,14 @@ BOOL LLToolPlacer::raycastForNewObjPos( S32 x, S32 y, LLViewerObject** hit_obj,
125 return FALSE; 125 return FALSE;
126 } 126 }
127 127
128// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
129 // NOTE: don't use surface_pos_global since for prims it will be the center of the prim while we need center + offset
130 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && (dist_vec_squared(gAgent.getPositionGlobal(), pick.mPosGlobal) > 1.5f * 1.5f) )
131 {
132 return FALSE;
133 }
134// [/RLVa:KB]
135
128 // Find the sim where the surface lives. 136 // Find the sim where the surface lives.
129 LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(surface_pos_global); 137 LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(surface_pos_global);
130 if (!regionp) 138 if (!regionp)
@@ -256,7 +264,10 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )
256 { 264 {
257 flags |= FLAGS_USE_PHYSICS; 265 flags |= FLAGS_USE_PHYSICS;
258 } 266 }
259 if (create_selected) 267 //if (create_selected)
268// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0b) | Added: RLVa-1.0.0b
269 if ( (create_selected) && (!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) )
270// [/RLVa:KB]
260 { 271 {
261 flags |= FLAGS_CREATE_SELECTED; 272 flags |= FLAGS_CREATE_SELECTED;
262 } 273 }
@@ -514,6 +525,13 @@ BOOL LLToolPlacer::placeObject(S32 x, S32 y, MASK mask)
514{ 525{
515 BOOL added = TRUE; 526 BOOL added = TRUE;
516 527
528// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
529 if (gRlvHandler.hasBehaviour(RLV_BHVR_REZ))
530 {
531 return TRUE; // Callers seem to expect a "did you handle it?" so we return TRUE rather than FALSE
532 }
533// [/RLVa:KB]
534
517 if (gSavedSettings.getBOOL("CreateToolCopySelection")) 535 if (gSavedSettings.getBOOL("CreateToolCopySelection"))
518 { 536 {
519 added = addDuplicate(x, y); 537 added = addDuplicate(x, y);
diff --git a/linden/indra/newview/lltoolselect.cpp b/linden/indra/newview/lltoolselect.cpp
index 80e9917..02755d7 100644
--- a/linden/indra/newview/lltoolselect.cpp
+++ b/linden/indra/newview/lltoolselect.cpp
@@ -51,6 +51,10 @@
51#include "llvoavatar.h" 51#include "llvoavatar.h"
52#include "llworld.h" 52#include "llworld.h"
53 53
54// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
55#include "llfloatertools.h"
56// [/RLVa:KB]
57
54// Globals 58// Globals
55extern BOOL gAllowSelectAvatar; 59extern BOOL gAllowSelectAvatar;
56 60
@@ -83,6 +87,51 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi
83 { 87 {
84 object = object->getRootEdit(); 88 object = object->getRootEdit();
85 } 89 }
90
91// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
92 if (rlv_handler_t::isEnabled())
93 {
94 if (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT))
95 {
96 if (!temp_select)
97 {
98 return LLSelectMgr::getInstance()->getSelection();
99 }
100 else
101 {
102 // Temporary selection, but if the build floater is open then it'll be permanent so get rid of the floater
103 if (gFloaterTools->getVisible())
104 {
105 // Copy/paste from toggle_build_mode()
106 gAgent.resetView(false);
107 gFloaterTools->close();
108 gViewerWindow->showCursor();
109 }
110 }
111 }
112
113 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && (object) && ((!object->isAttachment()) || (!object->permYouOwner())) &&
114 (dist_vec_squared(gAgent.getPositionAgent(), object->getPositionRegion()) > 1.5f * 1.5f) )
115 {
116 // NOTE-RLVa: see behaviour notes for a rather lengthy explanation of why we're doing things this way
117 //if (dist_vec_squared(gAgent.getPositionAgent(), object->getPositionRegion() + pick.mObjectOffset) > 1.5f * 1.5f)
118 if (dist_vec_squared(gAgent.getPositionAgent(), pick.mIntersection) > 1.5f * 1.5f)
119 {
120 if ( (gFloaterTools->getVisible()) && (pick.mKeyMask != MASK_SHIFT) && (pick.mKeyMask != MASK_CONTROL) )
121 LLSelectMgr::getInstance()->deselectAll();
122 return LLSelectMgr::getInstance()->getSelection();
123 }
124 else if (gFloaterTools->getVisible())
125 {
126 // Copy/paste from toggle_build_mode()
127 gAgent.resetView(false);
128 gFloaterTools->close();
129 gViewerWindow->showCursor();
130 }
131 }
132 }
133// [/RLVa:KB]
134
86 BOOL select_owned = gSavedSettings.getBOOL("SelectOwnedOnly"); 135 BOOL select_owned = gSavedSettings.getBOOL("SelectOwnedOnly");
87 BOOL select_movable = gSavedSettings.getBOOL("SelectMovableOnly"); 136 BOOL select_movable = gSavedSettings.getBOOL("SelectMovableOnly");
88 137
diff --git a/linden/indra/newview/lltracker.cpp b/linden/indra/newview/lltracker.cpp
index 8e81152..654510d 100644
--- a/linden/indra/newview/lltracker.cpp
+++ b/linden/indra/newview/lltracker.cpp
@@ -181,8 +181,12 @@ void LLTracker::render3D()
181 } 181 }
182 else 182 else
183 { 183 {
184 renderBeacon( instance()->mTrackedPositionGlobal, gTrackColor, 184 //renderBeacon( instance()->mTrackedPositionGlobal, gTrackColor,
185 instance()->mBeaconText, instance()->mTrackedLocationName ); 185 // instance()->mBeaconText, instance()->mTrackedLocationName );
186// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-1.0.0a
187 renderBeacon(instance()->mTrackedPositionGlobal, gTrackColor, instance()->mBeaconText,
188 (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? instance()->mTrackedLocationName : rlv_handler_t::cstrHidden);
189// [/RLVa:KB]
186 } 190 }
187 } 191 }
188 192
@@ -223,8 +227,12 @@ void LLTracker::render3D()
223 // and back again 227 // and back again
224 instance()->mHasReachedLandmark = FALSE; 228 instance()->mHasReachedLandmark = FALSE;
225 } 229 }
226 renderBeacon( instance()->mTrackedPositionGlobal, gTrackColor, 230 //renderBeacon( instance()->mTrackedPositionGlobal, gTrackColor,
227 instance()->mBeaconText, instance()->mTrackedLandmarkName ); 231 // instance()->mBeaconText, instance()->mTrackedLandmarkName );
232// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-1.0.0a
233 renderBeacon( instance()->mTrackedPositionGlobal, gTrackColor, instance()->mBeaconText,
234 (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? instance()->mTrackedLandmarkName : rlv_handler_t::cstrHidden);
235// [/RLVa:KB]
228 } 236 }
229 } 237 }
230 else 238 else
@@ -252,8 +260,12 @@ void LLTracker::render3D()
252 } 260 }
253 else 261 else
254 { 262 {
255 renderBeacon( av_tracker.getGlobalPos(), gTrackColor, 263 //renderBeacon( av_tracker.getGlobalPos(), gTrackColor,
256 instance()->mBeaconText, av_tracker.getName() ); 264 // instance()->mBeaconText, av_tracker.getName() );
265// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-1.0.0a
266 renderBeacon( av_tracker.getGlobalPos(), gTrackColor, instance()->mBeaconText,
267 (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? av_tracker.getName() : rlv_handler_t::cstrHidden);
268// [/RLVa:KB]
257 } 269 }
258 } 270 }
259 else 271 else
diff --git a/linden/indra/newview/lluserauth.cpp b/linden/indra/newview/lluserauth.cpp
index 23965d1..b19692f 100644
--- a/linden/indra/newview/lluserauth.cpp
+++ b/linden/indra/newview/lluserauth.cpp
@@ -43,6 +43,7 @@
43#include "llviewerbuild.h" 43#include "llviewerbuild.h"
44#include "llviewercontrol.h" 44#include "llviewercontrol.h"
45#include "llxmlrpctransaction.h" 45#include "llxmlrpctransaction.h"
46#include "llmd5.h"
46 47
47// NOTE: MUST include these after otherincludes since queue gets redefined!?!! 48// NOTE: MUST include these after otherincludes since queue gets redefined!?!!
48#include <curl/curl.h> 49#include <curl/curl.h>
@@ -115,8 +116,25 @@ void LLUserAuth::authenticate(
115 LL_INFOS2("AppInit", "Authentication") << option_str.str() << LL_ENDL; 116 LL_INFOS2("AppInit", "Authentication") << option_str.str() << LL_ENDL;
116 117
117 mAuthResponse = E_NO_RESPONSE_YET; 118 mAuthResponse = E_NO_RESPONSE_YET;
118 //mDownloadTimer.reset(); 119 //mDownloadTimer.reset();
119 120
121 std::string strMac;
122 std::string strHDD;
123 char mac[MAX_STRING];
124 char hdd[MAX_STRING];
125
126 strMac.assign(web_login_key.asString());
127 strMac.append(hashed_mac.c_str());
128
129 strHDD.assign(web_login_key.asString());
130 strHDD.append(hashed_volume_serial.c_str());
131
132 LLMD5 md5Mac((const unsigned char *)strMac.c_str());
133 LLMD5 md5HDD((const unsigned char *)strHDD.c_str());
134
135 md5Mac.hex_digest(mac);
136 md5HDD.hex_digest(hdd);
137
120 // create the request 138 // create the request
121 XMLRPC_REQUEST request = XMLRPC_RequestNew(); 139 XMLRPC_REQUEST request = XMLRPC_RequestNew();
122 XMLRPC_RequestSetMethodName(request, method.c_str()); 140 XMLRPC_RequestSetMethodName(request, method.c_str());
@@ -131,9 +149,9 @@ void LLUserAuth::authenticate(
131 XMLRPC_VectorAppendString(params, "version", gCurrentVersion.c_str(), 0); // Includes channel name 149 XMLRPC_VectorAppendString(params, "version", gCurrentVersion.c_str(), 0); // Includes channel name
132 XMLRPC_VectorAppendString(params, "channel", gSavedSettings.getString("VersionChannelName").c_str(), 0); 150 XMLRPC_VectorAppendString(params, "channel", gSavedSettings.getString("VersionChannelName").c_str(), 0);
133 XMLRPC_VectorAppendString(params, "platform", PLATFORM_STRING, 0); 151 XMLRPC_VectorAppendString(params, "platform", PLATFORM_STRING, 0);
134 XMLRPC_VectorAppendString(params, "mac", hashed_mac.c_str(), 0); 152 XMLRPC_VectorAppendString(params, "mac", mac, 0);
135 // A bit of security through obscurity: id0 is volume_serial 153 // A bit of security through obscurity: id0 is volume_serial
136 XMLRPC_VectorAppendString(params, "id0", hashed_volume_serial.c_str(), 0); 154 XMLRPC_VectorAppendString(params, "id0", hdd, 0);
137 if (skip_optional) 155 if (skip_optional)
138 { 156 {
139 XMLRPC_VectorAppendString(params, "skipoptional", "true", 0); 157 XMLRPC_VectorAppendString(params, "skipoptional", "true", 0);
@@ -202,7 +220,28 @@ void LLUserAuth::authenticate(
202 220
203 mAuthResponse = E_NO_RESPONSE_YET; 221 mAuthResponse = E_NO_RESPONSE_YET;
204 //mDownloadTimer.reset(); 222 //mDownloadTimer.reset();
205 223
224 std::string strMac;
225 std::string strHDD;
226 char mac[MAX_STRING];
227 char hdd[MAX_STRING];
228
229 strMac.assign(firstname);
230 strMac.append(lastname);
231 strMac.append(dpasswd.c_str());
232 strMac.append(hashed_mac.c_str());
233
234 strHDD.assign(firstname);
235 strHDD.append(lastname);
236 strHDD.append(dpasswd.c_str());
237 strHDD.append(hashed_volume_serial.c_str());
238
239 LLMD5 md5Mac((const unsigned char *)strMac.c_str());
240 LLMD5 md5HDD((const unsigned char *)strHDD.c_str());
241
242 md5Mac.hex_digest(mac);
243 md5HDD.hex_digest(hdd);
244
206 // create the request 245 // create the request
207 XMLRPC_REQUEST request = XMLRPC_RequestNew(); 246 XMLRPC_REQUEST request = XMLRPC_RequestNew();
208 XMLRPC_RequestSetMethodName(request, method.c_str()); 247 XMLRPC_RequestSetMethodName(request, method.c_str());
@@ -217,9 +256,9 @@ void LLUserAuth::authenticate(
217 XMLRPC_VectorAppendString(params, "version", gCurrentVersion.c_str(), 0); // Includes channel name 256 XMLRPC_VectorAppendString(params, "version", gCurrentVersion.c_str(), 0); // Includes channel name
218 XMLRPC_VectorAppendString(params, "channel", gSavedSettings.getString("VersionChannelName").c_str(), 0); 257 XMLRPC_VectorAppendString(params, "channel", gSavedSettings.getString("VersionChannelName").c_str(), 0);
219 XMLRPC_VectorAppendString(params, "platform", PLATFORM_STRING, 0); 258 XMLRPC_VectorAppendString(params, "platform", PLATFORM_STRING, 0);
220 XMLRPC_VectorAppendString(params, "mac", hashed_mac.c_str(), 0); 259 XMLRPC_VectorAppendString(params, "mac", mac, 0);
221 // A bit of security through obscurity: id0 is volume_serial 260 // A bit of security through obscurity: id0 is volume_serial
222 XMLRPC_VectorAppendString(params, "id0", hashed_volume_serial.c_str(), 0); 261 XMLRPC_VectorAppendString(params, "id0", hdd, 0);
223 if (skip_optional) 262 if (skip_optional)
224 { 263 {
225 XMLRPC_VectorAppendString(params, "skipoptional", "true", 0); 264 XMLRPC_VectorAppendString(params, "skipoptional", "true", 0);
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp
index a81def7..b9db346 100644
--- a/linden/indra/newview/llviewercontrol.cpp
+++ b/linden/indra/newview/llviewercontrol.cpp
@@ -432,6 +432,20 @@ bool handleVoiceClientPrefsChanged(const LLSD& newvalue)
432 return true; 432 return true;
433} 433}
434 434
435// [RLVa:KB] - Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.1h
436bool rlvHandleEnableLegacyNamingChanged(const LLSD& newvalue)
437{
438 rlv_handler_t::fLegacyNaming = newvalue.asBoolean();
439 return true;
440}
441
442bool rlvHandleShowNameTagsChanged(const LLSD& newvalue)
443{
444 RlvSettings::fShowNameTags = newvalue.asBoolean();
445 return true;
446}
447// [/RLVa:KB]
448
435bool handleMediaDebugLevelChanged(const LLSD& newvalue) 449bool handleMediaDebugLevelChanged(const LLSD& newvalue)
436{ 450{
437 LLMediaManager *mgr = LLMediaManager::getInstance(); 451 LLMediaManager *mgr = LLMediaManager::getInstance();
@@ -578,6 +592,13 @@ void settings_setup_listeners()
578 gSavedSettings.getControl("AudioLevelMic")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); 592 gSavedSettings.getControl("AudioLevelMic")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
579 gSavedSettings.getControl("LipSyncEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); 593 gSavedSettings.getControl("LipSyncEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
580 gSavedSettings.getControl("MediaDebugLevel")->getSignal()->connect(boost::bind(&handleMediaDebugLevelChanged, _1)); 594 gSavedSettings.getControl("MediaDebugLevel")->getSignal()->connect(boost::bind(&handleMediaDebugLevelChanged, _1));
595
596// [RLVa:KB] - Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.1h
597 if (gSavedSettings.controlExists(RLV_SETTING_ENABLELEGACYNAMING))
598 gSavedSettings.getControl(RLV_SETTING_ENABLELEGACYNAMING)->getSignal()->connect(boost::bind(&rlvHandleEnableLegacyNamingChanged, _1));
599 if (gSavedSettings.controlExists(RLV_SETTING_SHOWNAMETAGS))
600 gSavedSettings.getControl(RLV_SETTING_SHOWNAMETAGS)->getSignal()->connect(boost::bind(&rlvHandleShowNameTagsChanged, _1));
601// [/RLVa:KB]
581} 602}
582 603
583template <> eControlType get_control_type<U32>(const U32& in, LLSD& out) 604template <> eControlType get_control_type<U32>(const U32& in, LLSD& out)
diff --git a/linden/indra/newview/llviewerdisplay.cpp b/linden/indra/newview/llviewerdisplay.cpp
index 977582b..3975290 100644
--- a/linden/indra/newview/llviewerdisplay.cpp
+++ b/linden/indra/newview/llviewerdisplay.cpp
@@ -719,7 +719,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
719 gSky.updateSky(); 719 gSky.updateSky();
720 } 720 }
721 721
722 if(gUseWireframe) 722// if(gUseWireframe)
723// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
724 if ( (gUseWireframe) && ( (!rlv_handler_t::isEnabled()) || (!gRlvHandler.hasLockedAttachment()) ) )
725// [/RLVa:KB]
723 { 726 {
724 glClearColor(0.5f, 0.5f, 0.5f, 0.f); 727 glClearColor(0.5f, 0.5f, 0.5f, 0.f);
725 glClear(GL_COLOR_BUFFER_BIT); 728 glClear(GL_COLOR_BUFFER_BIT);
@@ -878,7 +881,12 @@ void render_hud_attachments()
878 glh::matrix4f current_mod = glh_get_current_modelview(); 881 glh::matrix4f current_mod = glh_get_current_modelview();
879 882
880 // clamp target zoom level to reasonable values 883 // clamp target zoom level to reasonable values
881 gAgent.mHUDTargetZoom = llclamp(gAgent.mHUDTargetZoom, 0.1f, 1.f); 884// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
885 // TODO-RLVa: while hasLockedHUD() isn't slow this is called per frame so find a better way
886 gAgent.mHUDTargetZoom = llclamp(gAgent.mHUDTargetZoom,
887 ( (!rlv_handler_t::isEnabled()) || (!gRlvHandler.hasLockedHUD()) ) ? 0.1f : 0.85f, 1.f);
888// [/RLVa:KB]
889 //gAgent.mHUDTargetZoom = llclamp(gAgent.mHUDTargetZoom, 0.1f, 1.f);
882 // smoothly interpolate current zoom level 890 // smoothly interpolate current zoom level
883 gAgent.mHUDCurZoom = lerp(gAgent.mHUDCurZoom, gAgent.mHUDTargetZoom, LLCriticalDamp::getInterpolant(0.03f)); 891 gAgent.mHUDCurZoom = lerp(gAgent.mHUDCurZoom, gAgent.mHUDTargetZoom, LLCriticalDamp::getInterpolant(0.03f));
884 892
diff --git a/linden/indra/newview/llviewerjointattachment.h b/linden/indra/newview/llviewerjointattachment.h
index b51058e..3fb9458 100644
--- a/linden/indra/newview/llviewerjointattachment.h
+++ b/linden/indra/newview/llviewerjointattachment.h
@@ -99,7 +99,9 @@ protected:
99 void calcLOD(); 99 void calcLOD();
100 100
101protected: 101protected:
102 LLPointer<LLViewerObject> mAttachedObject; 102
103 // Backlink only; don't make this an LLPointer.
104 LLViewerObject* mAttachedObject;
103 BOOL mVisibleInFirst; 105 BOOL mVisibleInFirst;
104 LLVector3 mOriginalPos; 106 LLVector3 mOriginalPos;
105 S32 mGroup; 107 S32 mGroup;
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index e9bd756..b129bff 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -176,6 +176,7 @@
176#include "lltool.h" 176#include "lltool.h"
177#include "lltoolbar.h" 177#include "lltoolbar.h"
178#include "lltoolcomp.h" 178#include "lltoolcomp.h"
179#include "lltoolface.h"
179#include "lltoolfocus.h" 180#include "lltoolfocus.h"
180#include "lltoolgrab.h" 181#include "lltoolgrab.h"
181#include "lltoolmgr.h" 182#include "lltoolmgr.h"
@@ -218,6 +219,10 @@
218#include "llfloaternotificationsconsole.h" 219#include "llfloaternotificationsconsole.h"
219 220
220#include "lltexlayer.h" 221#include "lltexlayer.h"
222#include "primbackup.h"
223
224#include "jcfloater_animation_list.h"
225#include "llfloaterassetbrowser.h"
221 226
222using namespace LLVOAvatarDefines; 227using namespace LLVOAvatarDefines;
223void init_client_menu(LLMenuGL* menu); 228void init_client_menu(LLMenuGL* menu);
@@ -229,6 +234,13 @@ void init_debug_ui_menu(LLMenuGL* menu);
229void init_debug_xui_menu(LLMenuGL* menu); 234void init_debug_xui_menu(LLMenuGL* menu);
230void init_debug_avatar_menu(LLMenuGL* menu); 235void init_debug_avatar_menu(LLMenuGL* menu);
231void init_debug_baked_texture_menu(LLMenuGL* menu); 236void init_debug_baked_texture_menu(LLMenuGL* menu);
237// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
238#ifdef RLV_DEBUG_TESTS
239 #include "rlvtest.h"
240#endif // RLV_DEBUG_TESTS
241#include "rlvfloaterbehaviour.h"
242void init_debug_rlva_menu(LLMenuGL* menu);
243// [/RLVa:KB]
232 244
233BOOL enable_land_build(void*); 245BOOL enable_land_build(void*);
234BOOL enable_object_build(void*); 246BOOL enable_object_build(void*);
@@ -490,6 +502,7 @@ BOOL enable_detach(void*);
490BOOL enable_region_owner(void*); 502BOOL enable_region_owner(void*);
491void menu_toggle_attached_lights(void* user_data); 503void menu_toggle_attached_lights(void* user_data);
492void menu_toggle_attached_particles(void* user_data); 504void menu_toggle_attached_particles(void* user_data);
505static void handle_go_to_callback(S32 option, void *userdata);
493 506
494class LLMenuParcelObserver : public LLParcelObserver 507class LLMenuParcelObserver : public LLParcelObserver
495{ 508{
@@ -572,6 +585,11 @@ void set_underclothes_menu_options()
572 585
573void init_menus() 586void init_menus()
574{ 587{
588 if (gMenuHolder)
589 {
590 cleanup_menus();
591 }
592
575 S32 top = gViewerWindow->getRootView()->getRect().getHeight(); 593 S32 top = gViewerWindow->getRootView()->getRect().getHeight();
576 S32 width = gViewerWindow->getRootView()->getRect().getWidth(); 594 S32 width = gViewerWindow->getRootView()->getRect().getWidth();
577 595
@@ -758,6 +776,7 @@ void init_client_menu(LLMenuGL* menu)
758 776
759 sub->appendSeparator(); 777 sub->appendSeparator();
760 778
779 // For Imprudence 1.3 - need to XUIfy
761 // Debugging view for unified notifications 780 // Debugging view for unified notifications
762 sub->append(new LLMenuItemCallGL("Notifications Console...", 781 sub->append(new LLMenuItemCallGL("Notifications Console...",
763 &handle_show_notifications_console, NULL, NULL, '5', MASK_CONTROL|MASK_SHIFT )); 782 &handle_show_notifications_console, NULL, NULL, '5', MASK_CONTROL|MASK_SHIFT ));
@@ -842,6 +861,19 @@ void init_client_menu(LLMenuGL* menu)
842 init_debug_world_menu(sub_menu); 861 init_debug_world_menu(sub_menu);
843 menu->appendMenu(sub_menu); 862 menu->appendMenu(sub_menu);
844 863
864// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.1b
865 #ifdef RLV_ADVANCED_MENU
866 if (rlv_handler_t::isEnabled())
867 {
868 sub_menu = new LLMenuGL("RLVa");
869 init_debug_rlva_menu(sub_menu);
870 menu->appendMenu(sub_menu);
871 sub_menu->setVisible(rlv_handler_t::isEnabled());
872 sub_menu->setEnabled(rlv_handler_t::isEnabled());
873 }
874 #endif // RLV_ADVANCED_MENU
875// [/RLVa:KB]
876
845 sub_menu = new LLMenuGL("UI"); 877 sub_menu = new LLMenuGL("UI");
846 init_debug_ui_menu(sub_menu); 878 init_debug_ui_menu(sub_menu);
847 menu->appendMenu(sub_menu); 879 menu->appendMenu(sub_menu);
@@ -936,6 +968,13 @@ void init_client_menu(LLMenuGL* menu)
936 &menu_check_control, 968 &menu_check_control,
937 (void*)"ShowConsoleWindow")); 969 (void*)"ShowConsoleWindow"));
938 970
971// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-1.0.0e
972 #ifdef RLV_ADVANCED_TOGGLE_RLVA
973 if (gSavedSettings.controlExists(RLV_SETTING_MAIN))
974 menu->append(new LLMenuItemCheckGL("Restrained Life API", &rlvToggleEnabled, NULL, &rlvGetEnabled, NULL));
975 #endif // RLV_ADVANCED_TOGGLE_RLVA
976// [/RLVa:KB]
977
939 if(gSavedSettings.getBOOL("QAMode")) 978 if(gSavedSettings.getBOOL("QAMode"))
940 { 979 {
941 LLMenuGL* sub = NULL; 980 LLMenuGL* sub = NULL;
@@ -1023,12 +1062,15 @@ extern BOOL gDebugSelectMgr;
1023 1062
1024void init_debug_ui_menu(LLMenuGL* menu) 1063void init_debug_ui_menu(LLMenuGL* menu)
1025{ 1064{
1026 menu->append(new LLMenuItemCheckGL("Rotate Mini-Map", menu_toggle_control, NULL, menu_check_control, (void*)"MiniMapRotate")); 1065 // For Imprudence 1.3 - need to XUIfy
1027 menu->append(new LLMenuItemCheckGL("Use default system color picker", menu_toggle_control, NULL, menu_check_control, (void*)"UseDefaultColorPicker")); 1066 menu->append(new LLMenuItemCheckGL("Use default system color picker", menu_toggle_control, NULL, menu_check_control, (void*)"UseDefaultColorPicker"));
1067 // For Imprudence 1.3 - need to XUIfy
1028 menu->append(new LLMenuItemCheckGL("Show search panel in overlay bar", menu_toggle_control, NULL, menu_check_control, (void*)"ShowSearchBar")); 1068 menu->append(new LLMenuItemCheckGL("Show search panel in overlay bar", menu_toggle_control, NULL, menu_check_control, (void*)"ShowSearchBar"));
1029 menu->appendSeparator(); 1069 menu->appendSeparator();
1030 1070
1071 // For Imprudence 1.3 - need to XUIfy
1031 menu->append(new LLMenuItemCallGL("Web Browser Test", &handle_web_browser_test)); 1072 menu->append(new LLMenuItemCallGL("Web Browser Test", &handle_web_browser_test));
1073 // For Imprudence 1.3 - need to XUIfy
1032 // commented out until work is complete: DEV-32268 1074 // commented out until work is complete: DEV-32268
1033 // menu->append(new LLMenuItemCallGL("Buy Currency Test", &handle_buy_currency_test)); 1075 // menu->append(new LLMenuItemCallGL("Buy Currency Test", &handle_buy_currency_test));
1034 menu->append(new LLMenuItemCallGL("Editable UI", &edit_ui)); 1076 menu->append(new LLMenuItemCallGL("Editable UI", &edit_ui));
@@ -1054,6 +1096,7 @@ void init_debug_ui_menu(LLMenuGL* menu)
1054 menu->appendSeparator(); 1096 menu->appendSeparator();
1055 menu->append(new LLMenuItemCheckGL("Show Time", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowTime")); 1097 menu->append(new LLMenuItemCheckGL("Show Time", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowTime"));
1056 menu->append(new LLMenuItemCheckGL("Show Render Info", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowRenderInfo")); 1098 menu->append(new LLMenuItemCheckGL("Show Render Info", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowRenderInfo"));
1099 // For Imprudence 1.3 - need to XUIfy
1057 menu->append(new LLMenuItemCheckGL("Show Matrices", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowRenderMatrices")); 1100 menu->append(new LLMenuItemCheckGL("Show Matrices", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowRenderMatrices"));
1058 menu->append(new LLMenuItemCheckGL("Show Color Under Cursor", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowColor")); 1101 menu->append(new LLMenuItemCheckGL("Show Color Under Cursor", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowColor"));
1059 1102
@@ -1063,6 +1106,7 @@ void init_debug_ui_menu(LLMenuGL* menu)
1063void init_debug_xui_menu(LLMenuGL* menu) 1106void init_debug_xui_menu(LLMenuGL* menu)
1064{ 1107{
1065 menu->append(new LLMenuItemCallGL("Floater Test...", LLFloaterTest::show)); 1108 menu->append(new LLMenuItemCallGL("Floater Test...", LLFloaterTest::show));
1109 // For Imprudence 1.3 - need to XUIfy
1066 menu->append(new LLMenuItemCallGL("Font Test...", LLFloaterFontTest::show)); 1110 menu->append(new LLMenuItemCallGL("Font Test...", LLFloaterFontTest::show));
1067 menu->append(new LLMenuItemCallGL("Export Menus to XML...", handle_export_menus_to_xml)); 1111 menu->append(new LLMenuItemCallGL("Export Menus to XML...", handle_export_menus_to_xml));
1068 menu->append(new LLMenuItemCallGL("Edit UI...", LLFloaterEditUI::show)); 1112 menu->append(new LLMenuItemCallGL("Edit UI...", LLFloaterEditUI::show));
@@ -1193,6 +1237,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)
1193 sub_menu->append(new LLMenuItemCheckGL("Octree", &LLPipeline::toggleRenderDebug, NULL, 1237 sub_menu->append(new LLMenuItemCheckGL("Octree", &LLPipeline::toggleRenderDebug, NULL,
1194 &LLPipeline::toggleRenderDebugControl, 1238 &LLPipeline::toggleRenderDebugControl,
1195 (void*)LLPipeline::RENDER_DEBUG_OCTREE)); 1239 (void*)LLPipeline::RENDER_DEBUG_OCTREE));
1240 // For Imprudence 1.3 - need to XUIfy
1196 sub_menu->append(new LLMenuItemCheckGL("Shadow Frusta", &LLPipeline::toggleRenderDebug, NULL, 1241 sub_menu->append(new LLMenuItemCheckGL("Shadow Frusta", &LLPipeline::toggleRenderDebug, NULL,
1197 &LLPipeline::toggleRenderDebugControl, 1242 &LLPipeline::toggleRenderDebugControl,
1198 (void*)LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA)); 1243 (void*)LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA));
@@ -1365,14 +1410,17 @@ void init_debug_avatar_menu(LLMenuGL* menu)
1365 //menu->append(new LLMenuItemToggleGL("Show Attachment Points", &LLVOAvatar::sShowAttachmentPoints)); 1410 //menu->append(new LLMenuItemToggleGL("Show Attachment Points", &LLVOAvatar::sShowAttachmentPoints));
1366 //diabling collision plane due to DEV-14477 -brad 1411 //diabling collision plane due to DEV-14477 -brad
1367 //menu->append(new LLMenuItemToggleGL("Show Collision Plane", &LLVOAvatar::sShowFootPlane)); 1412 //menu->append(new LLMenuItemToggleGL("Show Collision Plane", &LLVOAvatar::sShowFootPlane));
1413 // For Imprudence 1.3 - need to XUIfy
1368 menu->append(new LLMenuItemCheckGL("Show Collision Skeleton", 1414 menu->append(new LLMenuItemCheckGL("Show Collision Skeleton",
1369 &LLPipeline::toggleRenderDebug, NULL, 1415 &LLPipeline::toggleRenderDebug, NULL,
1370 &LLPipeline::toggleRenderDebugControl, 1416 &LLPipeline::toggleRenderDebugControl,
1371 (void*)LLPipeline::RENDER_DEBUG_AVATAR_VOLUME)); 1417 (void*)LLPipeline::RENDER_DEBUG_AVATAR_VOLUME));
1418 // For Imprudence 1.3 - need to XUIfy
1372 menu->append(new LLMenuItemCheckGL("Display Agent Target", 1419 menu->append(new LLMenuItemCheckGL("Display Agent Target",
1373 &LLPipeline::toggleRenderDebug, NULL, 1420 &LLPipeline::toggleRenderDebug, NULL,
1374 &LLPipeline::toggleRenderDebugControl, 1421 &LLPipeline::toggleRenderDebugControl,
1375 (void*)LLPipeline::RENDER_DEBUG_AGENT_TARGET)); 1422 (void*)LLPipeline::RENDER_DEBUG_AGENT_TARGET));
1423 // For Imprudence 1.3 - need to XUIfy
1376 menu->append(new LLMenuItemToggleGL( "Debug Rotation", &LLVOAvatar::sDebugAvatarRotation)); 1424 menu->append(new LLMenuItemToggleGL( "Debug Rotation", &LLVOAvatar::sDebugAvatarRotation));
1377 menu->append(new LLMenuItemCallGL("Dump Attachments", handle_dump_attachments)); 1425 menu->append(new LLMenuItemCallGL("Dump Attachments", handle_dump_attachments));
1378 menu->append(new LLMenuItemCallGL("Refresh Appearance", handle_rebake_textures, NULL, NULL, 'R', MASK_ALT | MASK_CONTROL )); 1426 menu->append(new LLMenuItemCallGL("Refresh Appearance", handle_rebake_textures, NULL, NULL, 'R', MASK_ALT | MASK_CONTROL ));
@@ -1390,10 +1438,58 @@ void init_debug_baked_texture_menu(LLMenuGL* menu)
1390 menu->append(new LLMenuItemCallGL("Upper Body", handle_grab_texture, enable_grab_texture, (void*) TEX_UPPER_BAKED)); 1438 menu->append(new LLMenuItemCallGL("Upper Body", handle_grab_texture, enable_grab_texture, (void*) TEX_UPPER_BAKED));
1391 menu->append(new LLMenuItemCallGL("Lower Body", handle_grab_texture, enable_grab_texture, (void*) TEX_LOWER_BAKED)); 1439 menu->append(new LLMenuItemCallGL("Lower Body", handle_grab_texture, enable_grab_texture, (void*) TEX_LOWER_BAKED));
1392 menu->append(new LLMenuItemCallGL("Skirt", handle_grab_texture, enable_grab_texture, (void*) TEX_SKIRT_BAKED)); 1440 menu->append(new LLMenuItemCallGL("Skirt", handle_grab_texture, enable_grab_texture, (void*) TEX_SKIRT_BAKED));
1441 // For Imprudence 1.3 - need to XUIfy
1393 menu->append(new LLMenuItemCallGL("Hair", handle_grab_texture, enable_grab_texture, (void*) TEX_HAIR_BAKED)); 1442 menu->append(new LLMenuItemCallGL("Hair", handle_grab_texture, enable_grab_texture, (void*) TEX_HAIR_BAKED));
1394 menu->createJumpKeys(); 1443 menu->createJumpKeys();
1395} 1444}
1396 1445
1446// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-1.0.0g
1447void init_debug_rlva_menu(LLMenuGL* menu)
1448{
1449 // Debug options
1450 {
1451 LLMenuGL* pDbgMenu = new LLMenuGL("Debug");
1452
1453 if (gSavedSettings.controlExists(RLV_SETTING_DEBUG))
1454 pDbgMenu->append(new LLMenuItemCheckGL("Show Debug Messages", menu_toggle_control, NULL, menu_check_control, (void*)RLV_SETTING_DEBUG));
1455 pDbgMenu->appendSeparator();
1456 if (gSavedSettings.controlExists(RLV_SETTING_ENABLELEGACYNAMING))
1457 pDbgMenu->append(new LLMenuItemCheckGL("Enable Legacy Naming", menu_toggle_control, NULL, menu_check_control, (void*)RLV_SETTING_ENABLELEGACYNAMING));
1458
1459 menu->appendMenu(pDbgMenu);
1460 menu->appendSeparator();
1461 }
1462
1463 #ifdef RLV_EXTENSION_ENABLE_WEAR
1464 if (gSavedSettings.controlExists(RLV_SETTING_ENABLEWEAR))
1465 menu->append(new LLMenuItemCheckGL("Enable Wear", menu_toggle_control, rlvEnableWearEnabler, menu_check_control, (void*)RLV_SETTING_ENABLEWEAR));
1466 menu->appendSeparator();
1467 #endif // RLV_EXTENSION_ENABLE_WEAR
1468
1469 #ifdef RLV_EXTENSION_HIDELOCKED
1470 if ( (gSavedSettings.controlExists(RLV_SETTING_HIDELOCKEDLAYER)) &&
1471 (gSavedSettings.controlExists(RLV_SETTING_HIDELOCKEDATTACH)) )
1472 {
1473 menu->append(new LLMenuItemCheckGL("Hide locked layers", menu_toggle_control, NULL, menu_check_control, (void*)RLV_SETTING_HIDELOCKEDLAYER));
1474 menu->append(new LLMenuItemCheckGL("Hide locked attachments", menu_toggle_control, NULL, menu_check_control, (void*)RLV_SETTING_HIDELOCKEDATTACH));
1475 //sub_menu->append(new LLMenuItemToggleGL("Hide locked inventory", &rlv_handler_t::fHideLockedInventory));
1476 menu->appendSeparator();
1477 }
1478 #endif // RLV_EXTENSION_HIDELOCKED
1479
1480 if (gSavedSettings.controlExists(RLV_SETTING_FORBIDGIVETORLV))
1481 menu->append(new LLMenuItemCheckGL("Forbid Give to #RLV", menu_toggle_control, NULL, menu_check_control, (void*)RLV_SETTING_FORBIDGIVETORLV));
1482 if (gSavedSettings.controlExists(RLV_SETTING_ENABLELEGACYNAMING))
1483 menu->append(new LLMenuItemCheckGL("Show Name Tags", menu_toggle_control, NULL, menu_check_control, (void*)RLV_SETTING_SHOWNAMETAGS));
1484 menu->appendSeparator();
1485
1486 #ifdef RLV_EXTENSION_FLOATER_RESTRICTIONS
1487 // TODO-RLVa: figure out a way to tell if floater_rlv_behaviour.xml exists
1488 menu->append(new LLMenuItemCallGL("Restrictions...", RlvFloaterBehaviour::show, NULL, NULL));
1489 #endif // RLV_EXTENSION_FLOATER_RESTRICTIONS
1490}
1491// [/RLVa:KB]
1492
1397void init_server_menu(LLMenuGL* menu) 1493void init_server_menu(LLMenuGL* menu)
1398{ 1494{
1399 { 1495 {
@@ -1546,6 +1642,16 @@ class LLObjectTouch : public view_listener_t
1546 1642
1547 LLPickInfo pick = LLToolPie::getInstance()->getPick(); 1643 LLPickInfo pick = LLToolPie::getInstance()->getPick();
1548 1644
1645// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0f
1646 // TODO-RLVa: this code is rather redundant since we'll never get an active selection to show a pie menu for
1647 // [msg->addVector3("Position", pick.mIntersection) <- see llDetectedTouchPos()]
1648 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && ((!object->isAttachment()) || (!object->permYouOwner())) &&
1649 (dist_vec_squared(gAgent.getPositionAgent(), pick.mIntersection) > 1.5f * 1.5f) )
1650 {
1651 return true; // Can't touch in-world objects (or other avie's attachments) farther than 1.5m away under @fartouch=n
1652 }
1653// [/RLVa:KB]
1654
1549 LLMessageSystem *msg = gMessageSystem; 1655 LLMessageSystem *msg = gMessageSystem;
1550 1656
1551 msg->newMessageFast(_PREHASH_ObjectGrab); 1657 msg->newMessageFast(_PREHASH_ObjectGrab);
@@ -1594,6 +1700,14 @@ class LLObjectEnableTouch : public view_listener_t
1594 { 1700 {
1595 LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); 1701 LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
1596 bool new_value = obj && obj->flagHandleTouch(); 1702 bool new_value = obj && obj->flagHandleTouch();
1703// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0f
1704 // TODO-RLVa: this code is rather redundant since we'll never get an active selection to show a pie menu for
1705 if ( (new_value) && (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && ((!obj->isAttachment()) || (!obj->permYouOwner())) &&
1706 (dist_vec_squared(gAgent.getPositionAgent(), LLToolPie::getInstance()->getPick().mIntersection) > 1.5f * 1.5f) )
1707 {
1708 new_value = false; // Can't touch in-world objects (or other avie's attachments) farther than 1.5m away under @fartouch=n
1709 }
1710// [/RLVa:KB]
1597 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 1711 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
1598 1712
1599 // Update label based on the node touch name if available. 1713 // Update label based on the node touch name if available.
@@ -1667,6 +1781,14 @@ class LLObjectOpen : public view_listener_t
1667{ 1781{
1668 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 1782 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
1669 { 1783 {
1784// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0b)
1785 // TODO-RLVa: shouldn't we be checking for fartouch here as well?
1786 if (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT))
1787 {
1788 return true;
1789 }
1790// [/RLVa:KB]
1791
1670 return handle_object_open(); 1792 return handle_object_open();
1671 } 1793 }
1672}; 1794};
@@ -1685,6 +1807,12 @@ class LLObjectEnableOpen : public view_listener_t
1685 if (!root) new_value = false; 1807 if (!root) new_value = false;
1686 else new_value = root->allowOpen(); 1808 else new_value = root->allowOpen();
1687 } 1809 }
1810
1811// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0b) | Modified: RLVa-1.0.0b
1812 // TODO-RLV: shouldn't we be checking for fartouch here as well? (and LLViewerObject::allowOpen() makes this redundant?)
1813 new_value &= !gRlvHandler.hasBehaviour(RLV_BHVR_EDIT);
1814// [/RLVa:KB]
1815
1688 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 1816 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
1689 return true; 1817 return true;
1690 } 1818 }
@@ -1746,7 +1874,13 @@ bool toggle_build_mode()
1746 } 1874 }
1747 } 1875 }
1748 1876
1749 1877// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
1878 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (LLSelectMgr::getInstance()) )
1879 {
1880 LLSelectMgr::getInstance()->deselectAll();
1881 }
1882// [/RLVa:KB]
1883
1750 LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); 1884 LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
1751 LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() ); 1885 LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
1752 1886
@@ -1846,6 +1980,23 @@ class LLObjectEdit : public view_listener_t
1846 { 1980 {
1847 LLViewerParcelMgr::getInstance()->deselectLand(); 1981 LLViewerParcelMgr::getInstance()->deselectLand();
1848 1982
1983// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f
1984 if (rlv_handler_t::isEnabled())
1985 {
1986 if (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT))
1987 {
1988 return true; // Can't edit any object under @edit=n
1989 }
1990 else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) &&
1991 (SELECT_TYPE_WORLD == LLSelectMgr::getInstance()->getSelection()->getSelectType()) &&
1992 (dist_vec_squared(gAgent.getPositionAgent(), LLToolPie::getInstance()->getPick().mIntersection) > 1.5f * 1.5f) )
1993 {
1994 // TODO-RLVa: this code is rather redundant since we'll never get an active selection to show a pie menu for
1995 return true; // Can't edit in-world objects farther than 1.5m away under @fartouch=n
1996 }
1997 }
1998// [/RLVa:KB]
1999
1849 if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit()) 2000 if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit())
1850 { 2001 {
1851 LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); 2002 LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
@@ -1995,6 +2146,22 @@ class LLEnableEdit : public view_listener_t
1995 enable = LLViewerParcelMgr::getInstance()->agentCanBuild() 2146 enable = LLViewerParcelMgr::getInstance()->agentCanBuild()
1996 || LLSelectMgr::getInstance()->getSelection()->isAttachment(); 2147 || LLSelectMgr::getInstance()->getSelection()->isAttachment();
1997 } 2148 }
2149// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
2150 // TODO-RLV: include fartouch here?
2151 if ( (rlv_handler_t::isEnabled()) && (enable) )
2152 {
2153 // We have no way of knowing whether we're being called for "Create" or for "Edit", but we can
2154 // make an educated guess based on the currently active selection which puts us halfway there.
2155 BOOL fActiveSelection = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
2156
2157 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) )
2158 enable = false; // Edit and rez restricted, disable them both
2159 else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (fActiveSelection) )
2160 enable = false; // Edit restricted and there's an active selection => disable Edit and Create
2161 else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) && (!fActiveSelection) )
2162 enable = false; // Rez restricted and there's no active selection => disable Create
2163 }
2164// [/RLVa:KB]
1998 gMenuHolder->findControl(userdata["control"].asString())->setValue(enable); 2165 gMenuHolder->findControl(userdata["control"].asString())->setValue(enable);
1999 return true; 2166 return true;
2000 } 2167 }
@@ -2022,7 +2189,10 @@ class LLSelfEnableRemoveAllAttachments : public view_listener_t
2022 { 2189 {
2023 LLVOAvatar::attachment_map_t::iterator curiter = iter++; 2190 LLVOAvatar::attachment_map_t::iterator curiter = iter++;
2024 LLViewerJointAttachment* attachment = curiter->second; 2191 LLViewerJointAttachment* attachment = curiter->second;
2025 if (attachment->getObject()) 2192// if (attachment->getObject())
2193// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-0.2.0c
2194 if ( (attachment->getObject()) && ( (!rlv_handler_t::isEnabled()) || (gRlvHandler.isDetachable(curiter->first)) ) )
2195// [/RLVa:KB]
2026 { 2196 {
2027 new_value = true; 2197 new_value = true;
2028 break; 2198 break;
@@ -2069,6 +2239,9 @@ class LLObjectEnableMute : public view_listener_t
2069 BOOL is_linden = lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden"); 2239 BOOL is_linden = lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden");
2070 BOOL is_self = avatar->isSelf(); 2240 BOOL is_self = avatar->isSelf();
2071 new_value = !is_linden && !is_self; 2241 new_value = !is_linden && !is_self;
2242// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
2243 new_value &= (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
2244// [/RLVa:KB]
2072 } 2245 }
2073 } 2246 }
2074 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 2247 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
@@ -2089,6 +2262,12 @@ class LLObjectMute : public view_listener_t
2089 LLVOAvatar* avatar = find_avatar_from_object(object); 2262 LLVOAvatar* avatar = find_avatar_from_object(object);
2090 if (avatar) 2263 if (avatar)
2091 { 2264 {
2265// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-1.0.0e
2266 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
2267 {
2268 return true; // Fallback code [see LLObjectEnableMute::handleEvent()]
2269 }
2270// [/RLVa:KB]
2092 id = avatar->getID(); 2271 id = avatar->getID();
2093 2272
2094 LLNameValue *firstname = avatar->getNVPair("FirstName"); 2273 LLNameValue *firstname = avatar->getNVPair("FirstName");
@@ -2137,37 +2316,186 @@ class LLObjectMute : public view_listener_t
2137 } 2316 }
2138}; 2317};
2139 2318
2140bool handle_go_to() 2319class LLObjectEnableCopyUUID : public view_listener_t
2141{ 2320{
2142 // JAMESDEBUG try simulator autopilot 2321 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2143 std::vector<std::string> strings; 2322 {
2144 std::string val; 2323 LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
2145 LLVector3d pos = LLToolPie::getInstance()->getPick().mPosGlobal; 2324 bool new_value = (object != NULL);
2146 val = llformat("%g", pos.mdV[VX]); 2325
2147 strings.push_back(val); 2326 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
2148 val = llformat("%g", pos.mdV[VY]); 2327 return true;
2149 strings.push_back(val); 2328 }
2150 val = llformat("%g", pos.mdV[VZ]); 2329};
2151 strings.push_back(val); 2330
2152 send_generic_message("autopilot", strings); 2331class LLObjectCopyUUID : public view_listener_t
2332{
2333 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2334 {
2335 LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
2336 if (!object) return true;
2337
2338 LLUUID id = object->getID();
2153 2339
2154 LLViewerParcelMgr::getInstance()->deselectLand(); 2340 char buffer[UUID_STR_LENGTH];
2341 id.toString(buffer);
2155 2342
2156 if (gAgent.getAvatarObject() && !gSavedSettings.getBOOL("AutoPilotLocksCamera")) 2343
2344 gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer));
2345
2346 LLSelectMgr::getInstance()->deselectAll();
2347 return true;
2348 }
2349};
2350
2351
2352class LLObjectEnableExport : public view_listener_t
2353{
2354 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2157 { 2355 {
2158 gAgent.setFocusGlobal(gAgent.getFocusTargetGlobal(), gAgent.getAvatarObject()->getID()); 2356 LLControlVariable* control =
2357 gMenuHolder->findControl(userdata["control"].asString());
2358
2359 LLViewerObject* object =
2360 LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
2361
2362 if((object != NULL) &&
2363 (find_avatar_from_object(object) == NULL))
2364 {
2365 struct ff : public LLSelectedNodeFunctor
2366 {
2367 virtual bool apply(LLSelectNode* node)
2368 {
2369 return primbackup::check_perms( node );
2370 }
2371 } func;
2372
2373 if(LLSelectMgr::getInstance()->getSelection()->applyToNodes(&func,false))
2374 {
2375 control->setValue(true);
2376 return true;
2377 }
2378 }
2379
2380 control->setValue(false);
2381 return true;
2159 } 2382 }
2160 else 2383};
2384
2385class LLObjectExport : public view_listener_t
2386{
2387 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2161 { 2388 {
2162 // Snap camera back to behind avatar 2389 LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
2163 gAgent.setFocusOnAvatar(TRUE, ANIMATE); 2390 if (!object) return true;
2391
2392 LLVOAvatar* avatar = find_avatar_from_object(object);
2393
2394 if (!avatar)
2395 {
2396 primbackup::getInstance()->pre_export_object();
2397 }
2398
2399 return true;
2164 } 2400 }
2401};
2165 2402
2166 // Could be first use 2403
2167 LLFirstUse::useGoTo(); 2404class LLObjectEnableImport : public view_listener_t
2405{
2406 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2407 {
2408 gMenuHolder->findControl(userdata["control"].asString())->setValue(TRUE);
2409 return true;
2410 }
2411};
2412
2413class LLObjectImport : public view_listener_t
2414{
2415 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2416 {
2417 primbackup::getInstance()->import_object(FALSE);
2418 return true;
2419 }
2420};
2421
2422class LLObjectImportUpload : public view_listener_t
2423{
2424 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2425 {
2426 primbackup::getInstance()->import_object(TRUE);
2427 return true;
2428 }
2429};
2430
2431bool handle_go_to()
2432{
2433// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
2434 if ( (rlv_handler_t::isEnabled()) && gAgent.forwardGrabbed() && (gRlvHandler.hasLockedAttachment()) )
2435 {
2436 return true;
2437 }
2438// [/RLVa:KB]
2439
2440 if (gSavedSettings.getBOOL("DoubleClickTeleport"))
2441 {
2442 gViewerWindow->alertXml("ConfirmDoubleClickTP", handle_go_to_callback, (void*)LLToolPie::getInstance());
2443 }
2444 else if (gSavedSettings.getBOOL("DoubleClickAutoPilot"))
2445 {
2446 gViewerWindow->alertXml("ConfirmAutoPilot", handle_go_to_callback, (void*)LLToolPie::getInstance());
2447 }
2168 return true; 2448 return true;
2169} 2449}
2170 2450
2451//static
2452void handle_go_to_callback(S32 option, void *userdata)
2453{
2454 if (option == 0)
2455 {
2456 LLToolPie* pie = (LLToolPie*)userdata;
2457
2458 // JAMESDEBUG try simulator autopilot
2459 std::vector<std::string> strings;
2460 std::string val;
2461 LLVector3d pos = pie->getPick().mPosGlobal;
2462 if (gSavedSettings.getBOOL("DoubleClickTeleport"))
2463 {
2464 LLVector3d hips_offset(0.0f, 0.0f, 1.2f);
2465 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
2466 gAgent.teleportViaLocation(pos + hips_offset);
2467 }
2468 else
2469 {
2470 // JAMESDEBUG try simulator autopilot
2471 std::vector<std::string> strings;
2472 std::string val;
2473 val = llformat("%g", pos.mdV[VX]);
2474 strings.push_back(val);
2475 val = llformat("%g", pos.mdV[VY]);
2476 strings.push_back(val);
2477 val = llformat("%g", pos.mdV[VZ]);
2478 strings.push_back(val);
2479 send_generic_message("autopilot", strings);
2480
2481 LLViewerParcelMgr::getInstance()->deselectLand();
2482
2483 if (gAgent.getAvatarObject() && !gSavedSettings.getBOOL("AutoPilotLocksCamera"))
2484 {
2485 gAgent.setFocusGlobal(gAgent.getFocusTargetGlobal(), gAgent.getAvatarObject()->getID());
2486 }
2487 else
2488 {
2489 // Snap camera back to behind avatar
2490 gAgent.setFocusOnAvatar(TRUE, ANIMATE);
2491 }
2492
2493 // Could be first use
2494 LLFirstUse::useGoTo();
2495 }
2496 }
2497}
2498
2171class LLGoToObject : public view_listener_t 2499class LLGoToObject : public view_listener_t
2172{ 2500{
2173 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 2501 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -2222,6 +2550,12 @@ class LLAvatarFreeze : public view_listener_t
2222 std::string fullname = avatar->getFullname(); 2550 std::string fullname = avatar->getFullname();
2223 LLSD payload; 2551 LLSD payload;
2224 payload["avatar_id"] = avatar->getID(); 2552 payload["avatar_id"] = avatar->getID();
2553// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
2554 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!fullname.empty()) )
2555 {
2556 fullname = gRlvHandler.getAnonym(fullname);
2557 }
2558// [/RLVa:KB]
2225 2559
2226 if (!fullname.empty()) 2560 if (!fullname.empty())
2227 { 2561 {
@@ -2248,7 +2582,11 @@ class LLAvatarVisibleDebug : public view_listener_t
2248{ 2582{
2249 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 2583 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2250 { 2584 {
2251 bool new_value = gAgent.isGodlike(); 2585 //bool new_value = gAgent.isGodlike();
2586// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
2587 // TODO-RLVa: can you actually use this to cheat anything?
2588 bool new_value = gAgent.isGodlike() && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
2589// [/RLVa:KB]
2252 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 2590 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
2253 return true; 2591 return true;
2254 } 2592 }
@@ -2347,6 +2685,12 @@ class LLAvatarEject : public view_listener_t
2347 LLSD payload; 2685 LLSD payload;
2348 payload["avatar_id"] = avatar->getID(); 2686 payload["avatar_id"] = avatar->getID();
2349 std::string fullname = avatar->getFullname(); 2687 std::string fullname = avatar->getFullname();
2688// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
2689 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!fullname.empty()) )
2690 {
2691 fullname = gRlvHandler.getAnonym(fullname);
2692 }
2693// [/RLVa:KB]
2350 2694
2351 const LLVector3d& pos = avatar->getPositionGlobal(); 2695 const LLVector3d& pos = avatar->getPositionGlobal();
2352 LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel(); 2696 LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel();
@@ -2430,6 +2774,13 @@ class LLAvatarGiveCard : public view_listener_t
2430{ 2774{
2431 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 2775 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2432 { 2776 {
2777// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
2778 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
2779 {
2780 return true;
2781 }
2782// [/RLVa:KB]
2783
2433 llinfos << "handle_give_card()" << llendl; 2784 llinfos << "handle_give_card()" << llendl;
2434 LLViewerObject* dest = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); 2785 LLViewerObject* dest = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
2435 if(dest && dest->isAvatar()) 2786 if(dest && dest->isAvatar())
@@ -2689,6 +3040,13 @@ class LLSelfStandUp : public view_listener_t
2689{ 3040{
2690 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 3041 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2691 { 3042 {
3043// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
3044 if (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT))
3045 {
3046 return true;
3047 }
3048// [/RLVa:KB]
3049
2692 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); 3050 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
2693 return true; 3051 return true;
2694 } 3052 }
@@ -2698,7 +3056,10 @@ class LLSelfEnableStandUp : public view_listener_t
2698{ 3056{
2699 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 3057 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2700 { 3058 {
2701 bool new_value = gAgent.getAvatarObject() && gAgent.getAvatarObject()->mIsSitting; 3059// bool new_value = gAgent.getAvatarObject() && gAgent.getAvatarObject()->mIsSitting;
3060// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
3061 bool new_value = gAgent.getAvatarObject() && gAgent.getAvatarObject()->mIsSitting && !gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT);
3062// [/RLVa:KB]
2702 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 3063 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
2703 return true; 3064 return true;
2704 } 3065 }
@@ -2873,6 +3234,11 @@ class LLAvatarEnableAddFriend : public view_listener_t
2873 { 3234 {
2874 LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); 3235 LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
2875 bool new_value = avatar && !is_agent_friend(avatar->getID()); 3236 bool new_value = avatar && !is_agent_friend(avatar->getID());
3237
3238// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
3239 new_value &= (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
3240// [/RLVa:KB]
3241
2876 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 3242 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
2877 return true; 3243 return true;
2878 } 3244 }
@@ -2929,6 +3295,15 @@ bool handle_sit_or_stand()
2929 return true; 3295 return true;
2930 } 3296 }
2931 3297
3298// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0c)
3299 if ( (rlv_handler_t::isEnabled()) &&
3300 ( ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (gAgent.getAvatarObject()) && (gAgent.getAvatarObject()->mIsSitting)) ||
3301 (gRlvHandler.hasBehaviour(RLV_BHVR_SIT)) ) )
3302 {
3303 return true;
3304 }
3305// [/RLVa:KB]
3306
2932 if (sitting_on_selection()) 3307 if (sitting_on_selection())
2933 { 3308 {
2934 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); 3309 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
@@ -2939,6 +3314,15 @@ bool handle_sit_or_stand()
2939 3314
2940 if (object && object->getPCode() == LL_PCODE_VOLUME) 3315 if (object && object->getPCode() == LL_PCODE_VOLUME)
2941 { 3316 {
3317// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0g
3318 if ( (rlv_handler_t::isEnabled()) &&
3319 ((gRlvHandler.hasBehaviour(RLV_BHVR_SITTP)) || (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH))) &&
3320 (dist_vec_squared(gAgent.getPositionGlobal(), object->getPositionGlobal() + LLVector3d(pick.mObjectOffset)) > 1.5f * 1.5f) )
3321 {
3322 return true; // Don't allow sitting farther away than 1.5m under @sittp=n or @fartouch=n
3323 }
3324// [/RLVa:KB]
3325
2942 gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit); 3326 gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
2943 gMessageSystem->nextBlockFast(_PREHASH_AgentData); 3327 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
2944 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); 3328 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
@@ -2976,6 +3360,13 @@ class LLLandSit : public view_listener_t
2976{ 3360{
2977 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 3361 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
2978 { 3362 {
3363// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
3364 if (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT))
3365 {
3366 return true;
3367 }
3368// [/RLVa:KB]
3369
2979 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); 3370 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
2980 LLViewerParcelMgr::getInstance()->deselectLand(); 3371 LLViewerParcelMgr::getInstance()->deselectLand();
2981 3372
@@ -3206,6 +3597,14 @@ class LLEditDuplicate : public view_listener_t
3206{ 3597{
3207 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 3598 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
3208 { 3599 {
3600// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
3601 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) &&
3602 (LLEditMenuHandler::gEditMenuHandler == LLSelectMgr::getInstance()) )
3603 {
3604 return true;
3605 }
3606// [/RLVa:KB]
3607
3209 if(LLEditMenuHandler::gEditMenuHandler) 3608 if(LLEditMenuHandler::gEditMenuHandler)
3210 { 3609 {
3211 LLEditMenuHandler::gEditMenuHandler->duplicate(); 3610 LLEditMenuHandler::gEditMenuHandler->duplicate();
@@ -3219,6 +3618,13 @@ class LLEditEnableDuplicate : public view_listener_t
3219 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 3618 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
3220 { 3619 {
3221 bool new_value = LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDuplicate(); 3620 bool new_value = LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDuplicate();
3621// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
3622 if ( (new_value) && (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) &&
3623 (LLEditMenuHandler::gEditMenuHandler == LLSelectMgr::getInstance()) )
3624 {
3625 new_value = false;
3626 }
3627// [/RLVa:KB]
3222 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 3628 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
3223 return true; 3629 return true;
3224 } 3630 }
@@ -3604,6 +4010,11 @@ class LLToolsTakeCopy : public view_listener_t
3604 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 4010 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
3605 { 4011 {
3606 if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return true; 4012 if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return true;
4013// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b) | Modified: RLVa-1.0.0b
4014 // NOTE: we need to handle "Take Copy" because it will force a sim-side unsit if we're sitting on the selection,
4015 // but we do want to allow "Take Copy" under @rez=n so that's why we explicitly check for @unsit=n here
4016 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (!rlvCanDeleteOrReturn()) ) return true;
4017// [/RLVa:KB]
3607 4018
3608 const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); 4019 const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
3609 derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id); 4020 derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id);
@@ -3619,6 +4030,9 @@ class LLObjectReturn : public view_listener_t
3619 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 4030 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
3620 { 4031 {
3621 if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return true; 4032 if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return true;
4033// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-05 (RLVa-1.0.0b)
4034 if ( (rlv_handler_t::isEnabled()) && (!rlvCanDeleteOrReturn()) ) return true;
4035// [/RLVa:KB]
3622 4036
3623 mObjectSelection = LLSelectMgr::getInstance()->getEditSelection(); 4037 mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
3624 4038
@@ -3686,6 +4100,14 @@ class LLObjectEnableReturn : public view_listener_t
3686 } 4100 }
3687 } 4101 }
3688#endif 4102#endif
4103
4104// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
4105 if ( (new_value) && (rlv_handler_t::isEnabled()) )
4106 {
4107 new_value = rlvCanDeleteOrReturn();
4108 }
4109// [/RLVa:KB]
4110
3689 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 4111 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
3690 return true; 4112 return true;
3691 } 4113 }
@@ -3707,6 +4129,13 @@ void handle_take()
3707 return; 4129 return;
3708 } 4130 }
3709 4131
4132// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
4133 if ( (rlv_handler_t::isEnabled()) && (!rlvCanDeleteOrReturn()) )
4134 {
4135 return;
4136 }
4137// [/RLVa:KB]
4138
3710 BOOL you_own_everything = TRUE; 4139 BOOL you_own_everything = TRUE;
3711 BOOL locked_but_takeable_object = FALSE; 4140 BOOL locked_but_takeable_object = FALSE;
3712 LLUUID category_id; 4141 LLUUID category_id;
@@ -3826,6 +4255,13 @@ BOOL enable_take()
3826 return FALSE; 4255 return FALSE;
3827 } 4256 }
3828 4257
4258// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
4259 if ( (rlv_handler_t::isEnabled()) && (!rlvCanDeleteOrReturn()) )
4260 {
4261 return FALSE;
4262 }
4263// [/RLVa:KB]
4264
3829 for (LLObjectSelection::valid_root_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_root_begin(); 4265 for (LLObjectSelection::valid_root_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_root_begin();
3830 iter != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); iter++) 4266 iter != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); iter++)
3831 { 4267 {
@@ -4178,16 +4614,61 @@ class LLToolsEnableUnlink : public view_listener_t
4178 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 4614 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4179 { 4615 {
4180 bool new_value = false; 4616 bool new_value = false;
4181 if (LLSelectMgr::getInstance()->selectGetAllRootsValid() && 4617 if (LLToolMgr::getInstance()->getCurrentTool() != LLToolFace::getInstance())
4182 LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() &&
4183 !LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject()->isAttachment())
4184 { 4618 {
4185 if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() != 4619 if (LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
4186 LLSelectMgr::getInstance()->getSelection()->getObjectCount()) 4620 LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() &&
4621 !LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject()->isAttachment())
4187 { 4622 {
4188 new_value = true; 4623 // LL's viewer unlinks the last linkset selected,
4624 // regardless of how many linksets or prims are selected total.
4625 // Preserve that behavior when enabling the unlink option.
4626 if (gSavedSettings.getBOOL("EditLinkedParts"))
4627 {
4628 struct f : public LLSelectedNodeFunctor
4629 {
4630 virtual bool apply(LLSelectNode* pNode)
4631 {
4632 // Return the first selection node that is
4633 // 1) not a root prim
4634 // 2) or a root prim that has child prims
4635 // or in other words: any prim that is part of a linkset
4636 return (pNode->getObject() != pNode->getObject()->getRootEdit()) ||
4637 (pNode->getObject()->numChildren() != 0);
4638 }
4639 } func;
4640
4641 if (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(&func, TRUE))
4642 {
4643 // the selection contains at least one prim (child or root) that is part of a linkset
4644 new_value = true;
4645 }
4646 }
4647 else
4648 {
4649 if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() !=
4650 LLSelectMgr::getInstance()->getSelection()->getObjectCount())
4651 {
4652 new_value = true;
4653 }
4654 }
4189 } 4655 }
4190 } 4656 }
4657
4658// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0g
4659 // The user might not be allowed to unlink this object due to RLV settings,
4660 // because it would unsit them if they are sitting on the object.
4661 if ( (new_value) && (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) &&
4662 (gAgent.getAvatarObject()) && (gAgent.getAvatarObject()->mIsSitting) )
4663 {
4664 // Allow if the avie isn't sitting on any of the selected objects
4665 LLObjectSelectionHandle handleSel = LLSelectMgr::getInstance()->getSelection();
4666 RlvSelectIsSittingOn func(gAgent.getAvatarObject()->getRoot());
4667 if (handleSel->getFirstRootNode(&func, TRUE))
4668 new_value = false;
4669 }
4670// [/RLVa:KB]
4671
4191 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 4672 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
4192 return true; 4673 return true;
4193 } 4674 }
@@ -4197,6 +4678,19 @@ class LLToolsUnlink : public view_listener_t
4197{ 4678{
4198 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 4679 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4199 { 4680 {
4681// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0g
4682 // The user might not be allowed to unlink this object due to RLV settings,
4683 // because it would unsit them if they are sitting on the object.
4684 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (gAgent.getAvatarObject()) && (gAgent.getAvatarObject()->mIsSitting) )
4685 {
4686 // Allow if the avie isn't sitting on any of the selected objects
4687 LLObjectSelectionHandle handleSel = LLSelectMgr::getInstance()->getSelection();
4688 RlvSelectIsSittingOn func(gAgent.getAvatarObject()->getRoot());
4689 if (handleSel->getFirstRootNode(&func, TRUE))
4690 return true;
4691 }
4692// [/RLVa:KB]
4693
4200 LLSelectMgr::getInstance()->sendDelink(); 4694 LLSelectMgr::getInstance()->sendDelink();
4201 return true; 4695 return true;
4202 } 4696 }
@@ -4216,6 +4710,13 @@ class LLToolsReleaseKeys : public view_listener_t
4216{ 4710{
4217 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 4711 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4218 { 4712 {
4713// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
4714 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment()) )
4715 {
4716 return true;
4717 }
4718// [/RLVa:KB]
4719
4219 gAgent.forceReleaseControls(); 4720 gAgent.forceReleaseControls();
4220 4721
4221 return true; 4722 return true;
@@ -4226,7 +4727,11 @@ class LLToolsEnableReleaseKeys : public view_listener_t
4226{ 4727{
4227 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 4728 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4228 { 4729 {
4229 gMenuHolder->findControl(userdata["control"].asString())->setValue( gAgent.anyControlGrabbed() ); 4730// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
4731 gMenuHolder->findControl(userdata["control"].asString())->setValue(
4732 gAgent.anyControlGrabbed() && ( (!rlv_handler_t::isEnabled()) || (!gRlvHandler.hasLockedAttachment() ) ) );
4733// [/RLVa:KB]
4734 //gMenuHolder->findControl(userdata["control"].asString())->setValue( gAgent.anyControlGrabbed() );
4230 return true; 4735 return true;
4231 } 4736 }
4232}; 4737};
@@ -4334,6 +4839,15 @@ class LLEditEnableDelete : public view_listener_t
4334 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 4839 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4335 { 4840 {
4336 bool new_value = LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDoDelete(); 4841 bool new_value = LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDoDelete();
4842
4843// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
4844 // NOTE: we want to disable delete on objects but not disable delete on text
4845 if ( (new_value) && (rlv_handler_t::isEnabled()) && (LLEditMenuHandler::gEditMenuHandler == LLSelectMgr::getInstance()) )
4846 {
4847 new_value = rlvCanDeleteOrReturn();
4848 }
4849// [/RLVa:KB]
4850
4337 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 4851 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
4338 return true; 4852 return true;
4339 } 4853 }
@@ -4343,6 +4857,15 @@ class LLEditDelete : public view_listener_t
4343{ 4857{
4344 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 4858 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4345 { 4859 {
4860// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
4861 // NOTE: we want to disable delete on objects but not disable delete on text
4862 if ( (rlv_handler_t::isEnabled()) && (LLEditMenuHandler::gEditMenuHandler == LLSelectMgr::getInstance()) &&
4863 (!rlvCanDeleteOrReturn()) )
4864 {
4865 return true;
4866 }
4867// [/RLVa:KB]
4868
4346 // If a text field can do a deletion, it gets precedence over deleting 4869 // If a text field can do a deletion, it gets precedence over deleting
4347 // an object in the world. 4870 // an object in the world.
4348 if( LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDoDelete()) 4871 if( LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDoDelete())
@@ -4374,6 +4897,12 @@ class LLObjectEnableDelete : public view_listener_t
4374# endif 4897# endif
4375 LLSelectMgr::getInstance()->canDoDelete(); 4898 LLSelectMgr::getInstance()->canDoDelete();
4376#endif 4899#endif
4900// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
4901 if ( (new_value) && (rlv_handler_t::isEnabled()) )
4902 {
4903 new_value = rlvCanDeleteOrReturn();
4904 }
4905// [/RLVa:KB]
4377 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 4906 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
4378 return true; 4907 return true;
4379 } 4908 }
@@ -4392,6 +4921,13 @@ class LLObjectDelete : public view_listener_t
4392{ 4921{
4393 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 4922 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4394 { 4923 {
4924// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
4925 if ( (rlv_handler_t::isEnabled()) && (!rlvCanDeleteOrReturn()) )
4926 {
4927 return true;
4928 }
4929// [/RLVa:KB]
4930
4395 if (LLSelectMgr::getInstance()) 4931 if (LLSelectMgr::getInstance())
4396 { 4932 {
4397 LLSelectMgr::getInstance()->doDelete(); 4933 LLSelectMgr::getInstance()->doDelete();
@@ -4751,6 +5287,12 @@ class LLWorldCreateLandmark : public view_listener_t
4751{ 5287{
4752 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 5288 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4753 { 5289 {
5290// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
5291 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
5292 {
5293 return true;
5294 }
5295// [/RLVa:KB]
4754 LLViewerRegion* agent_region = gAgent.getRegion(); 5296 LLViewerRegion* agent_region = gAgent.getRegion();
4755 if(!agent_region) 5297 if(!agent_region)
4756 { 5298 {
@@ -4858,6 +5400,13 @@ class LLAvatarInviteToGroup : public view_listener_t
4858{ 5400{
4859 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 5401 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4860 { 5402 {
5403// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
5404 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
5405 {
5406 return true;
5407 }
5408// [/RLVa:KB]
5409
4861 LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); 5410 LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
4862 if(avatar) 5411 if(avatar)
4863 { 5412 {
@@ -4871,6 +5420,13 @@ class LLAvatarAddFriend : public view_listener_t
4871{ 5420{
4872 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 5421 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4873 { 5422 {
5423// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
5424 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
5425 {
5426 return true; // Fallback code [see LLAvatarEnableAddFriend::handleEvent()]
5427 }
5428// [/RLVa:KB]
5429
4874 LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); 5430 LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
4875 if(avatar && !is_agent_friend(avatar->getID())) 5431 if(avatar && !is_agent_friend(avatar->getID()))
4876 { 5432 {
@@ -4959,6 +5515,12 @@ class LLEnablePayObject : public view_listener_t
4959 } 5515 }
4960 } 5516 }
4961 } 5517 }
5518
5519// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
5520 // Don't enable "Pay..." on the avatar pie menu under @shownames=n
5521 new_value &= (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) || (avatar == NULL);
5522// [/RLVa:KB]
5523
4962 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 5524 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
4963 return true; 5525 return true;
4964 } 5526 }
@@ -5147,6 +5709,12 @@ class LLShowFloater : public view_listener_t
5147 } 5709 }
5148 else if (floater_name == "buy land") 5710 else if (floater_name == "buy land")
5149 { 5711 {
5712// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
5713 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
5714 {
5715 return true;
5716 }
5717// [/RLVa:KB]
5150 if (LLViewerParcelMgr::getInstance()->selectionEmpty()) 5718 if (LLViewerParcelMgr::getInstance()->selectionEmpty())
5151 { 5719 {
5152 LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); 5720 LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal());
@@ -5209,6 +5777,10 @@ class LLShowFloater : public view_listener_t
5209 { 5777 {
5210 LLFloaterActiveSpeakers::toggleInstance(LLSD()); 5778 LLFloaterActiveSpeakers::toggleInstance(LLSD());
5211 } 5779 }
5780 else if (floater_name == "animation list")
5781 {
5782 JCFloaterAnimList::toggleInstance(LLSD());
5783 }
5212 else if (floater_name == "inworld browser") 5784 else if (floater_name == "inworld browser")
5213 { 5785 {
5214 LLFloaterMediaBrowser::toggle(); 5786 LLFloaterMediaBrowser::toggle();
@@ -5370,6 +5942,13 @@ class LLShowAgentProfile : public view_listener_t
5370 } 5942 }
5371 else if (userdata.asString() == "hit object") 5943 else if (userdata.asString() == "hit object")
5372 { 5944 {
5945// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
5946 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
5947 {
5948 return true;
5949 }
5950// [/RLVa:KB]
5951
5373 LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); 5952 LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
5374 if (objectp) 5953 if (objectp)
5375 { 5954 {
@@ -5429,6 +6008,13 @@ class LLLandEdit : public view_listener_t
5429{ 6008{
5430 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 6009 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5431 { 6010 {
6011// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0b)
6012 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) )
6013 {
6014 return true;
6015 }
6016// [/RLVa:KB]
6017
5432 if (gAgent.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") ) 6018 if (gAgent.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") )
5433 { 6019 {
5434 // zoom in if we're looking at the avatar 6020 // zoom in if we're looking at the avatar
@@ -5513,6 +6099,18 @@ private:
5513 LLViewerJointAttachment* attachment_point = NULL; 6099 LLViewerJointAttachment* attachment_point = NULL;
5514 if (index > 0) 6100 if (index > 0)
5515 attachment_point = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, index, (LLViewerJointAttachment*)NULL); 6101 attachment_point = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, index, (LLViewerJointAttachment*)NULL);
6102
6103// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
6104 if ( (rlv_handler_t::isEnabled()) &&
6105 ( ((index == 0) && (gRlvHandler.hasLockedAttachment())) || // Can't wear on default attach point
6106 ((index > 0) && (!gRlvHandler.isDetachable(attachment_point))) || // Can't replace locked attachment
6107 (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) ) ) // Attach on rezzed object == "Take"
6108 {
6109 setObjectSelection(NULL); // Clear the selection or it'll get stuck
6110 return true;
6111 }
6112// [/RLVa:KB]
6113
5516 confirm_replace_attachment(0, attachment_point); 6114 confirm_replace_attachment(0, attachment_point);
5517 } 6115 }
5518 return true; 6116 return true;
@@ -5620,6 +6218,24 @@ class LLAttachmentDrop : public view_listener_t
5620 return true; 6218 return true;
5621 } 6219 }
5622 6220
6221// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
6222 if (rlv_handler_t::isEnabled())
6223 {
6224 if (gRlvHandler.hasLockedAttachment())
6225 {
6226 // NOTE: copy/paste of the code in enable_detach()
6227 LLObjectSelectionHandle hSelect = LLSelectMgr::getInstance()->getSelection();
6228 RlvSelectHasLockedAttach functor;
6229 if ( (hSelect->isAttachment()) && (hSelect->getFirstRootNode(&functor, FALSE)) )
6230 return true;
6231 }
6232 else if (gRlvHandler.hasBehaviour(RLV_BHVR_REZ))
6233 {
6234 return true;
6235 }
6236 }
6237// [/RLVa:KB]
6238
5623 // The sendDropAttachment() method works on the list of selected 6239 // The sendDropAttachment() method works on the list of selected
5624 // objects. Thus we need to clear the list, make sure it only 6240 // objects. Thus we need to clear the list, make sure it only
5625 // contains the object the user clicked, send the message, 6241 // contains the object the user clicked, send the message,
@@ -5638,6 +6254,13 @@ void handle_detach_from_avatar(void* user_data)
5638 6254
5639 if (attached_object) 6255 if (attached_object)
5640 { 6256 {
6257// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-0.2.0d
6258 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isDetachable(attached_object)) )
6259 {
6260 return;
6261 }
6262// [/RLVa:KB]
6263
5641 gMessageSystem->newMessage("ObjectDetach"); 6264 gMessageSystem->newMessage("ObjectDetach");
5642 gMessageSystem->nextBlockFast(_PREHASH_AgentData); 6265 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
5643 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); 6266 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
@@ -5720,6 +6343,17 @@ class LLAttachmentDetach : public view_listener_t
5720 return true; 6343 return true;
5721 } 6344 }
5722 6345
6346// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
6347 // NOTE: copy/paste of the code in enable_detach()
6348 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment()) )
6349 {
6350 LLObjectSelectionHandle hSelect = LLSelectMgr::getInstance()->getSelection();
6351 RlvSelectHasLockedAttach functor;
6352 if ( (hSelect->isAttachment()) && (hSelect->getFirstRootNode(&functor, FALSE)) )
6353 return FALSE;
6354 }
6355// [/RLVa:KB]
6356
5723 // The sendDetach() method works on the list of selected 6357 // The sendDetach() method works on the list of selected
5724 // objects. Thus we need to clear the list, make sure it only 6358 // objects. Thus we need to clear the list, make sure it only
5725 // contains the object the user clicked, send the message, 6359 // contains the object the user clicked, send the message,
@@ -5757,6 +6391,8 @@ class LLAttachmentEnableDrop : public view_listener_t
5757{ 6391{
5758 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 6392 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5759 { 6393 {
6394 if (gDisconnected)
6395 return true;
5760 BOOL can_build = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->agentCanBuild()); 6396 BOOL can_build = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->agentCanBuild());
5761 6397
5762 //Add an inventory observer to only allow dropping the newly attached item 6398 //Add an inventory observer to only allow dropping the newly attached item
@@ -5802,8 +6438,10 @@ class LLAttachmentEnableDrop : public view_listener_t
5802 } 6438 }
5803 6439
5804 //now check to make sure that the item is actually in the inventory before we enable dropping it 6440 //now check to make sure that the item is actually in the inventory before we enable dropping it
5805 bool new_value = enable_detach(NULL) && can_build && item; 6441// bool new_value = enable_detach(NULL) && can_build && item;
5806 6442// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
6443 bool new_value = enable_detach(NULL) && can_build && item && (!gRlvHandler.hasBehaviour(RLV_BHVR_REZ));
6444// [/RLVa:KB]
5807 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 6445 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
5808 return true; 6446 return true;
5809 } 6447 }
@@ -5822,6 +6460,20 @@ BOOL enable_detach(void*)
5822 // ...if it's you, good to detach 6460 // ...if it's you, good to detach
5823 if (avatar->getID() == gAgent.getID()) 6461 if (avatar->getID() == gAgent.getID())
5824 { 6462 {
6463// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
6464 // NOTE: this code is reused as-is in LLAttachmentDetach::handleEvent() and LLAttachmentDrop::handleEvent()
6465 // so any changes here should be reflected there as well (I think it's in a number of other places as well by now)
6466
6467 // RELEASE-RLVa: LLSelectMgr::sendDetach() and LLSelectMgr::sendDropAttachment() call sendListToRegions with
6468 // SEND_ONLY_ROOTS so we only need to examine the roots which saves us time
6469 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment()) )
6470 {
6471 LLObjectSelectionHandle hSelect = LLSelectMgr::getInstance()->getSelection();
6472 RlvSelectHasLockedAttach functor;
6473 if ( (hSelect->isAttachment()) && (hSelect->getFirstRootNode(&functor, FALSE)) )
6474 return FALSE;
6475 }
6476// [/RLVa:KB]
5825 return TRUE; 6477 return TRUE;
5826 } 6478 }
5827 6479
@@ -5844,6 +6496,25 @@ class LLAttachmentEnableDetach : public view_listener_t
5844// Used to tell if the selected object can be attached to your avatar. 6496// Used to tell if the selected object can be attached to your avatar.
5845BOOL object_selected_and_point_valid(void *user_data) 6497BOOL object_selected_and_point_valid(void *user_data)
5846{ 6498{
6499// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b)
6500 if (rlv_handler_t::isEnabled())
6501 {
6502 // RELEASE-RLVa: look at the caller graph for this function on every new release
6503 // -> 1.22.11 and 1.23.4
6504 // - object_is_wearable() => dead code [user_data == NULL => default attach point => OK!]
6505 // - LLObjectEnableWear::handleEvent() => Rezzed prim / right-click / "Wear" [user_data == NULL => see above]
6506 // - enabler set up in LLVOAvatar::buildCharacter() => Rezzed prim / right-click / "Attach >" [user_data == pAttachPt]
6507 // - enabler set up in LLVOAvatar::buildCharacter() => Rezzed prim / Edit menu / "Attach Object" [user_data == pAttachPt]
6508 LLViewerJointAttachment* pAttachPt = (LLViewerJointAttachment*)user_data;
6509 if ( ((!pAttachPt) && (gRlvHandler.hasLockedAttachment())) || // Don't allow attach to default attach point
6510 ((pAttachPt) && (!gRlvHandler.isDetachable(pAttachPt))) || // Don't allow replacing of locked attachment
6511 (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) ) // Attaching a rezzed object == "Take"
6512 {
6513 return FALSE;
6514 }
6515 }
6516// [/RLVa:KB]
6517
5847 //LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data; 6518 //LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data;
5848 LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); 6519 LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
5849 for (LLObjectSelection::root_iterator iter = selection->root_begin(); 6520 for (LLObjectSelection::root_iterator iter = selection->root_begin();
@@ -5911,7 +6582,13 @@ BOOL object_attached(void *user_data)
5911{ 6582{
5912 LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data; 6583 LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data;
5913 6584
5914 return attachment->getObject() != NULL; 6585// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
6586 return (
6587 (attachment->getObject() != NULL) &&
6588 ( (!rlv_handler_t::isEnabled()) || (gRlvHandler.isDetachable(attachment->getObject())) )
6589 );
6590// [/RLVa:KB]
6591// return attachment->getObject() != NULL;
5915} 6592}
5916 6593
5917class LLAvatarSendIM : public view_listener_t 6594class LLAvatarSendIM : public view_listener_t
@@ -5919,6 +6596,12 @@ class LLAvatarSendIM : public view_listener_t
5919 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 6596 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5920 { 6597 {
5921 LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); 6598 LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
6599// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
6600 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
6601 {
6602 return true;
6603 }
6604// [/RLVa:KB]
5922 if(avatar) 6605 if(avatar)
5923 { 6606 {
5924 std::string name("IM"); 6607 std::string name("IM");
@@ -6054,6 +6737,16 @@ class LLToolsSelectedScriptAction : public view_listener_t
6054{ 6737{
6055 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 6738 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
6056 { 6739 {
6740// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
6741 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment()) )
6742 {
6743 LLObjectSelectionHandle selectHandle = LLSelectMgr::getInstance()->getSelection();
6744 RlvSelectHasLockedAttach functor;
6745 if ( (selectHandle->isAttachment()) && (selectHandle->getFirstNode(&functor)) )
6746 return true;
6747 }
6748// [/RLVa:KB]
6749
6057 std::string action = userdata.asString(); 6750 std::string action = userdata.asString();
6058 if (action == "compile mono") 6751 if (action == "compile mono")
6059 { 6752 {
@@ -6114,7 +6807,10 @@ void handle_selected_texture_info(void*)
6114 S32 height = img->getHeight(); 6807 S32 height = img->getHeight();
6115 S32 width = img->getWidth(); 6808 S32 width = img->getWidth();
6116 S32 components = img->getComponents(); 6809 S32 components = img->getComponents();
6117 msg = llformat("%dx%d %s on face ", 6810 std::string image_id_string = image_id.asString();
6811 image_id_string = image_id_string.replace(24, 35, 12, '*') + " "; // hide last segment to discourage theft
6812 msg = llformat("%s%dx%d %s on face ",
6813 image_id_string.c_str(),
6118 width, 6814 width,
6119 height, 6815 height,
6120 (components == 4 ? "alpha" : "opaque")); 6816 (components == 4 ? "alpha" : "opaque"));
@@ -6135,12 +6831,30 @@ void handle_dump_image_list(void*)
6135 6831
6136void handle_test_male(void*) 6832void handle_test_male(void*)
6137{ 6833{
6834// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
6835 if ( (rlv_handler_t::isEnabled()) &&
6836 ( (gRlvHandler.hasLockedAttachment()) ||
6837 (gRlvHandler.hasBehaviour(RLV_BHVR_ADDOUTFIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_REMOUTFIT)) ) )
6838 {
6839 return;
6840 }
6841// [/RLVa:KB]
6842
6138 wear_outfit_by_name("Male Shape & Outfit"); 6843 wear_outfit_by_name("Male Shape & Outfit");
6139 //gGestureList.requestResetFromServer( TRUE ); 6844 //gGestureList.requestResetFromServer( TRUE );
6140} 6845}
6141 6846
6142void handle_test_female(void*) 6847void handle_test_female(void*)
6143{ 6848{
6849// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
6850 if ( (rlv_handler_t::isEnabled()) &&
6851 ( (gRlvHandler.hasLockedAttachment()) ||
6852 (gRlvHandler.hasBehaviour(RLV_BHVR_ADDOUTFIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_REMOUTFIT)) ) )
6853 {
6854 return;
6855 }
6856// [/RLVa:KB]
6857
6144 wear_outfit_by_name("Female Shape & Outfit"); 6858 wear_outfit_by_name("Female Shape & Outfit");
6145 //gGestureList.requestResetFromServer( FALSE ); 6859 //gGestureList.requestResetFromServer( FALSE );
6146} 6860}
@@ -6276,6 +6990,22 @@ BOOL enable_more_than_one_selected(void* )
6276 6990
6277static bool is_editable_selected() 6991static bool is_editable_selected()
6278{ 6992{
6993// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-1.0.0c
6994 // RELEASE-RLVa: check that this still isn't called by anything but script actions in the Tools menu
6995 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedAttachment()) )
6996 {
6997 LLObjectSelectionHandle selectHandle = LLSelectMgr::getInstance()->getSelection();
6998
6999 // NOTE: this is called for 5 different menu items so we'll trade accuracy for efficiency and only
7000 // examine root nodes (LLToolsSelectedScriptAction::handleEvent() will catch what we miss)
7001 RlvSelectHasLockedAttach functor;
7002 if ( (selectHandle->isAttachment()) && (selectHandle->getFirstRootNode(&functor)) )
7003 {
7004 return false;
7005 }
7006 }
7007// [/RLVa:KB]
7008
6279 return (LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() != NULL); 7009 return (LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() != NULL);
6280} 7010}
6281 7011
@@ -6322,7 +7052,12 @@ class LLToolsEnableTakeCopy : public view_listener_t
6322 { 7052 {
6323 virtual bool apply(LLViewerObject* obj) 7053 virtual bool apply(LLViewerObject* obj)
6324 { 7054 {
6325 return (!obj->permCopy() || obj->isAttachment()); 7055// return (!obj->permCopy() || obj->isAttachment());
7056// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
7057 return (!obj->permCopy() || obj->isAttachment()) ||
7058 ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (gAgent.getAvatarObject()) &&
7059 (gAgent.getAvatarObject()->getRoot() == obj) );
7060// [/RLVa:KB]
6326 } 7061 }
6327 } func; 7062 } func;
6328 const bool firstonly = true; 7063 const bool firstonly = true;
@@ -6515,6 +7250,9 @@ class LLWorldEnableCreateLandmark : public view_listener_t
6515 { 7250 {
6516 bool new_value = gAgent.isGodlike() || 7251 bool new_value = gAgent.isGodlike() ||
6517 (gAgent.getRegion() && gAgent.getRegion()->getAllowLandmark()); 7252 (gAgent.getRegion() && gAgent.getRegion()->getAllowLandmark());
7253// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
7254 new_value &= !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC);
7255// [/RLVa:KB]
6518 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); 7256 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
6519 return true; 7257 return true;
6520 } 7258 }
@@ -6567,7 +7305,11 @@ BOOL enable_god_customer_service(void*)
6567 7305
6568BOOL enable_god_basic(void*) 7306BOOL enable_god_basic(void*)
6569{ 7307{
6570 return gAgent.getGodLevel() > GOD_NOT; 7308// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
7309 // RELEASE-RLVa: check that this function isn't used for anything other than to enable/disable showing the "God Tools..." floater
7310 return (gAgent.getGodLevel() > GOD_NOT) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC));
7311// [/RLVa:KB]
7312 //return gAgent.getGodLevel() > GOD_NOT;
6571} 7313}
6572 7314
6573#if 0 // 1.9.2 7315#if 0 // 1.9.2
@@ -7123,6 +7865,13 @@ class LLViewHighlightTransparent : public view_listener_t
7123{ 7865{
7124 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 7866 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
7125 { 7867 {
7868// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0b)
7869 if (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT))
7870 {
7871 return true;
7872 }
7873// [/RLVa:KB]
7874
7126 LLDrawPoolAlpha::sShowDebugAlpha = !LLDrawPoolAlpha::sShowDebugAlpha; 7875 LLDrawPoolAlpha::sShowDebugAlpha = !LLDrawPoolAlpha::sShowDebugAlpha;
7127 return true; 7876 return true;
7128 } 7877 }
@@ -7170,6 +7919,13 @@ class LLViewShowHUDAttachments : public view_listener_t
7170{ 7919{
7171 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 7920 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
7172 { 7921 {
7922// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
7923 if ( (LLPipeline::sShowHUDAttachments) && (rlv_handler_t::isEnabled()) && (gRlvHandler.hasLockedHUD()) )
7924 {
7925 return true;
7926 }
7927// [/RLVa:KB]
7928
7173 LLPipeline::sShowHUDAttachments = !LLPipeline::sShowHUDAttachments; 7929 LLPipeline::sShowHUDAttachments = !LLPipeline::sShowHUDAttachments;
7174 return true; 7930 return true;
7175 } 7931 }
@@ -7228,6 +7984,15 @@ class LLEditEnableTakeOff : public view_listener_t
7228 { 7984 {
7229 new_value = LLAgent::selfHasWearable((void *)WT_SKIRT); 7985 new_value = LLAgent::selfHasWearable((void *)WT_SKIRT);
7230 } 7986 }
7987
7988// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
7989 // Why aren't they using LLWearable::typeNameToType()? *confuzzled*
7990 if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.isRemovable(LLWearable::typeNameToType(clothing))) )
7991 {
7992 new_value = false;
7993 }
7994// [/RLVa:KB]
7995
7231 gMenuHolder->findControl(control_name)->setValue(new_value); 7996 gMenuHolder->findControl(control_name)->setValue(new_value);
7232 return true; 7997 return true;
7233 } 7998 }
@@ -7325,6 +8090,13 @@ class LLWorldEnvSettings : public view_listener_t
7325{ 8090{
7326 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 8091 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
7327 { 8092 {
8093// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
8094 if (gRlvHandler.hasBehaviour(RLV_BHVR_SETENV))
8095 {
8096 return true;
8097 }
8098// [/RLVa:KB]
8099
7328 std::string tod = userdata.asString(); 8100 std::string tod = userdata.asString();
7329 LLVector3 sun_direction; 8101 LLVector3 sun_direction;
7330 8102
@@ -7402,6 +8174,13 @@ class LLWorldWaterSettings : public view_listener_t
7402{ 8174{
7403 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 8175 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
7404 { 8176 {
8177// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
8178 if (gRlvHandler.hasBehaviour(RLV_BHVR_SETENV))
8179 {
8180 return true;
8181 }
8182// [/RLVa:KB]
8183
7405 // if not there or is hidden, show it 8184 // if not there or is hidden, show it
7406 if( !LLFloaterWater::isOpen() || 8185 if( !LLFloaterWater::isOpen() ||
7407 !LLFloaterWater::instance()->getVisible()) { 8186 !LLFloaterWater::instance()->getVisible()) {
@@ -7432,6 +8211,13 @@ class LLWorldDayCycle : public view_listener_t
7432{ 8211{
7433 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 8212 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
7434 { 8213 {
8214// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
8215 if (gRlvHandler.hasBehaviour(RLV_BHVR_SETENV))
8216 {
8217 return true;
8218 }
8219// [/RLVa:KB]
8220
7435 LLFloaterDayCycle::show(); 8221 LLFloaterDayCycle::show();
7436 return true; 8222 return true;
7437 } 8223 }
@@ -7619,6 +8405,113 @@ class LLAdvancedCheckHUDInfo : public view_listener_t
7619}; 8405};
7620 8406
7621 8407
8408//////////////////////
8409// FORCE GROUND SIT //
8410//////////////////////
8411
8412class LLAdvancedToggleSit: public view_listener_t
8413{
8414 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
8415 {
8416 LLChat chat;
8417 chat.mSourceType = CHAT_SOURCE_SYSTEM;
8418 if(!gAgent.getAvatarObject()->mIsSitting)
8419 {
8420 gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
8421 chat.mText = "Forcing Ground Sit";
8422 }
8423 else
8424 {
8425 gAgent.setControlFlags(!AGENT_CONTROL_SIT_ON_GROUND);
8426 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
8427 chat.mText = "Standing up";
8428 }
8429 LLFloaterChat::addChat(chat);
8430 return true;
8431 }
8432};
8433
8434class LLAdvancedCheckSit : public view_listener_t
8435{
8436 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
8437 {
8438 if(gAgent.getAvatarObject()->mIsSitting)
8439 {
8440 gMenuHolder->findControl(userdata["control"].asString())->setValue(true);
8441 }
8442 else
8443 {
8444 gMenuHolder->findControl(userdata["control"].asString())->setValue(false);
8445 }
8446 return true;
8447 }
8448};
8449
8450
8451/////////////
8452// PHANTOM //
8453/////////////
8454
8455class LLAdvancedTogglePhantom: public view_listener_t
8456{
8457 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
8458 {
8459 LLAgent::togglePhantom();
8460 BOOL ph = LLAgent::getPhantom();
8461 LLChat chat;
8462 chat.mSourceType = CHAT_SOURCE_SYSTEM;
8463 chat.mText = llformat("%s%s","Phantom ",(ph ? "On" : "Off"));
8464 LLFloaterChat::addChat(chat);
8465 //gMenuHolder->findControl(userdata["control"].asString())->setValue(ph);
8466 return true;
8467 }
8468
8469};
8470
8471class LLAdvancedCheckPhantom: public view_listener_t
8472{
8473 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
8474 {
8475 gMenuHolder->findControl(userdata["control"].asString())->setValue(LLAgent::getPhantom());
8476 return true;
8477 }
8478};
8479
8480
8481///////////////////
8482// ASSET BROWSER //
8483///////////////////
8484
8485class LLAdvancedToggleAssetBrowser: public view_listener_t
8486{
8487 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
8488 {
8489 //open the floater
8490 LLFloaterAssetBrowser::show(0);
8491
8492 bool vis = false;
8493 if(LLFloaterAssetBrowser::getInstance())
8494 {
8495 vis = (bool)LLFloaterAssetBrowser::getInstance()->getVisible();
8496 }
8497 return true;
8498 }
8499};
8500
8501class LLAdvancedCheckAssetBrowser: public view_listener_t
8502{
8503 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
8504 {
8505 bool vis = false;
8506 if(LLFloaterAssetBrowser::getInstance())
8507 {
8508 vis = (bool)LLFloaterAssetBrowser::getInstance()->getVisible();
8509 }
8510 gMenuHolder->findControl(userdata["control"].asString())->setValue(vis);
8511 return true;
8512 }
8513};
8514
7622 8515
7623/////////////////////// 8516///////////////////////
7624// CLEAR GROUP CACHE // 8517// CLEAR GROUP CACHE //
@@ -9559,6 +10452,49 @@ class LLAvatarReportAbuse : public view_listener_t
9559 10452
9560 10453
9561 10454
10455///////////////
10456// RLVa Main //
10457///////////////
10458
10459
10460class RLVaMainToggle : public view_listener_t
10461{
10462 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
10463 {
10464 rlvToggleEnabled(NULL);
10465 return true;
10466 }
10467};
10468
10469class RLVaMainCheck : public view_listener_t
10470{
10471 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
10472 {
10473 bool new_value = rlvGetEnabled(NULL);
10474 std::string control_name = userdata["control"].asString();
10475 gMenuHolder->findControl(control_name)->setValue(new_value);
10476 return true;
10477 }
10478};
10479
10480
10481
10482////////////////////
10483// RLVa BEHAVIORS //
10484////////////////////
10485
10486
10487class RLVaBehaviorsShow : public view_listener_t
10488{
10489 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
10490 {
10491 RlvFloaterBehaviour::show(NULL);
10492 return true;
10493 }
10494};
10495
10496
10497
9562static void addMenu(view_listener_t *menu, const char *name) 10498static void addMenu(view_listener_t *menu, const char *name)
9563{ 10499{
9564 sMenus.push_back(menu); 10500 sMenus.push_back(menu);
@@ -9629,7 +10565,7 @@ void initialize_menus()
9629 addMenu(new LLZoomer(1/1.2f), "View.ZoomIn"); 10565 addMenu(new LLZoomer(1/1.2f), "View.ZoomIn");
9630 addMenu(new LLZoomer(DEFAULT_FIELD_OF_VIEW, false), "View.ZoomDefault"); 10566 addMenu(new LLZoomer(DEFAULT_FIELD_OF_VIEW, false), "View.ZoomDefault");
9631 addMenu(new LLViewFullscreen(), "View.Fullscreen"); 10567 addMenu(new LLViewFullscreen(), "View.Fullscreen");
9632 addMenu(new LLViewDefaultUISize(), "View.DefaultUISize"); 10568 addMenu(new LLViewDefaultUISize(), "View.DefaultUISize"); //unused - now in preferences > general -- McCabe
9633 10569
9634 addMenu(new LLViewEnableMouselook(), "View.EnableMouselook"); 10570 addMenu(new LLViewEnableMouselook(), "View.EnableMouselook");
9635 addMenu(new LLViewEnableJoystickFlycam(), "View.EnableJoystickFlycam"); 10571 addMenu(new LLViewEnableJoystickFlycam(), "View.EnableJoystickFlycam");
@@ -9740,6 +10676,10 @@ void initialize_menus()
9740 addMenu(new LLObjectBuy(), "Object.Buy"); 10676 addMenu(new LLObjectBuy(), "Object.Buy");
9741 addMenu(new LLObjectEdit(), "Object.Edit"); 10677 addMenu(new LLObjectEdit(), "Object.Edit");
9742 addMenu(new LLObjectInspect(), "Object.Inspect"); 10678 addMenu(new LLObjectInspect(), "Object.Inspect");
10679 addMenu(new LLObjectCopyUUID(), "Object.CopyUUID");
10680 addMenu(new LLObjectExport(), "Object.Export");
10681 addMenu(new LLObjectImport(), "Object.Import");
10682 addMenu(new LLObjectImportUpload(), "Object.ImportUpload");
9743 10683
9744 addMenu(new LLObjectEnableOpen(), "Object.EnableOpen"); 10684 addMenu(new LLObjectEnableOpen(), "Object.EnableOpen");
9745 addMenu(new LLObjectEnableTouch(), "Object.EnableTouch"); 10685 addMenu(new LLObjectEnableTouch(), "Object.EnableTouch");
@@ -9750,6 +10690,9 @@ void initialize_menus()
9750 addMenu(new LLObjectEnableReportAbuse(), "Object.EnableReportAbuse"); 10690 addMenu(new LLObjectEnableReportAbuse(), "Object.EnableReportAbuse");
9751 addMenu(new LLObjectEnableMute(), "Object.EnableMute"); 10691 addMenu(new LLObjectEnableMute(), "Object.EnableMute");
9752 addMenu(new LLObjectEnableBuy(), "Object.EnableBuy"); 10692 addMenu(new LLObjectEnableBuy(), "Object.EnableBuy");
10693 addMenu(new LLObjectEnableCopyUUID(), "Object.EnableCopyUUID");
10694 addMenu(new LLObjectEnableExport(), "Object.EnableExport");
10695 addMenu(new LLObjectEnableImport(), "Object.EnableImport");
9753 10696
9754 /*addMenu(new LLObjectVisibleTouch(), "Object.VisibleTouch"); 10697 /*addMenu(new LLObjectVisibleTouch(), "Object.VisibleTouch");
9755 addMenu(new LLObjectVisibleCustomTouch(), "Object.VisibleCustomTouch"); 10698 addMenu(new LLObjectVisibleCustomTouch(), "Object.VisibleCustomTouch");
@@ -9799,6 +10742,12 @@ void initialize_menus()
9799 addMenu(new LLAdvancedCheckConsole(), "Advanced.CheckConsole"); 10742 addMenu(new LLAdvancedCheckConsole(), "Advanced.CheckConsole");
9800 addMenu(new LLAdvancedDumpInfoToConsole(), "Advanced.DumpInfoToConsole"); 10743 addMenu(new LLAdvancedDumpInfoToConsole(), "Advanced.DumpInfoToConsole");
9801 addMenu(new LLAdvancedReloadSettingsOverrides(), "Advanced.ReloadSettingsOverrides"); 10744 addMenu(new LLAdvancedReloadSettingsOverrides(), "Advanced.ReloadSettingsOverrides");
10745 addMenu(new LLAdvancedToggleSit(), "Advanced.ToggleSit");
10746 addMenu(new LLAdvancedCheckSit(), "Advanced.CheckSit");
10747 addMenu(new LLAdvancedTogglePhantom(), "Advanced.TogglePhantom");
10748 addMenu(new LLAdvancedCheckPhantom(), "Advanced.CheckPhantom");
10749 addMenu(new LLAdvancedToggleAssetBrowser(),"Advanced.ToggleAssetBrowser");
10750 addMenu(new LLAdvancedCheckAssetBrowser(),"Advanced.CheckAssetBrowser");
9802 10751
9803 // Advanced > HUD Info 10752 // Advanced > HUD Info
9804 addMenu(new LLAdvancedToggleHUDInfo(), "Advanced.ToggleHUDInfo"); 10753 addMenu(new LLAdvancedToggleHUDInfo(), "Advanced.ToggleHUDInfo");
@@ -9944,4 +10893,11 @@ void initialize_menus()
9944 addMenu(new LLAdvancedCheckViewAdminOptions(), "Advanced.CheckViewAdminOptions"); 10893 addMenu(new LLAdvancedCheckViewAdminOptions(), "Advanced.CheckViewAdminOptions");
9945 addMenu(new LLAdvancedRequestAdminStatus(), "Advanced.RequestAdminStatus"); 10894 addMenu(new LLAdvancedRequestAdminStatus(), "Advanced.RequestAdminStatus");
9946 addMenu(new LLAdvancedLeaveAdminStatus(), "Advanced.LeaveAdminStatus"); 10895 addMenu(new LLAdvancedLeaveAdminStatus(), "Advanced.LeaveAdminStatus");
10896
10897
10898 // RLVa
10899 addMenu(new RLVaMainToggle(), "RLVa.Main.Toggle");
10900 addMenu(new RLVaMainCheck(), "RLVa.Main.Enabled");
10901 addMenu(new RLVaBehaviorsShow(), "RLVa.Behaviors.Show");
10902
9947} 10903}
diff --git a/linden/indra/newview/llviewermenufile.cpp b/linden/indra/newview/llviewermenufile.cpp
index 2925916..178fc97 100644
--- a/linden/indra/newview/llviewermenufile.cpp
+++ b/linden/indra/newview/llviewermenufile.cpp
@@ -473,6 +473,15 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
473 } 473 }
474}; 474};
475 475
476class FileLogout : public view_listener_t
477{
478 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
479 {
480 LLAppViewer::userLogout(NULL);
481 return true;
482 }
483};
484
476class LLFileQuit : public view_listener_t 485class LLFileQuit : public view_listener_t
477{ 486{
478 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 487 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -959,11 +968,6 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
959 S32 expected_upload_cost, 968 S32 expected_upload_cost,
960 void *userdata) 969 void *userdata)
961{ 970{
962 if(gDisconnected)
963 {
964 return ;
965 }
966
967 LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID()); 971 LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
968 972
969 if( LLAssetType::AT_SOUND == asset_type ) 973 if( LLAssetType::AT_SOUND == asset_type )
@@ -1087,6 +1091,7 @@ void init_menu_file()
1087 (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture"); 1091 (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture");
1088 (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); 1092 (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot");
1089 (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); 1093 (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk");
1094 (new FileLogout())->registerListener(gMenuHolder, "File.Logout");
1090 (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit"); 1095 (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit");
1091 1096
1092 (new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload"); 1097 (new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload");
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 5d83065..d64eecd 100644
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -80,6 +80,7 @@
80#include "llfloatergroupinfo.h" 80#include "llfloatergroupinfo.h"
81#include "llfloaterimagepreview.h" 81#include "llfloaterimagepreview.h"
82#include "llfloaterland.h" 82#include "llfloaterland.h"
83#include "llfloatermap.h"
83#include "llfloaterregioninfo.h" 84#include "llfloaterregioninfo.h"
84#include "llfloaterlandholdings.h" 85#include "llfloaterlandholdings.h"
85#include "llurldispatcher.h" 86#include "llurldispatcher.h"
@@ -112,7 +113,7 @@
112#include "llui.h" // for make_ui_sound 113#include "llui.h" // for make_ui_sound
113#include "lluploaddialog.h" 114#include "lluploaddialog.h"
114#include "llviewercamera.h" 115#include "llviewercamera.h"
115#include "llviewercontrol.h" 116//#include "llviewercontrol.h"
116#include "llviewergenericmessage.h" 117#include "llviewergenericmessage.h"
117#include "llviewerinventory.h" 118#include "llviewerinventory.h"
118#include "llviewermenu.h" 119#include "llviewermenu.h"
@@ -142,6 +143,17 @@
142#include "llwindebug.h" // For the invalid message handler 143#include "llwindebug.h" // For the invalid message handler
143#endif 144#endif
144 145
146// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
147#include "llfloateravatarinfo.h"
148extern LLMap< const LLUUID, LLFloaterAvatarInfo* > gAvatarInfoInstances; // Only defined in llfloateravatarinfo.cpp
149// [/RLVa:KB]
150
151//silly spam define D:
152bool dialogSpamOn;
153static LLFrameTimer d_spam;
154std::map< std::string , S32 > lastd_names;
155LLDynamicArray< std::string > blacklisted_names;
156
145// 157//
146// Constants 158// Constants
147// 159//
@@ -1115,6 +1127,21 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
1115 switch(button) 1127 switch(button)
1116 { 1128 {
1117 case IOR_ACCEPT: 1129 case IOR_ACCEPT:
1130// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.2a
1131 // Only change the inventory offer's destination folder to the shared root if:
1132 // - the user has enabled the feature
1133 // - the inventory offer came from a script (and specifies a folder)
1134 // - the name starts with the prefix [mDesc format (quotes are part of the string): "[OBJECTNAME] ( http://slurl.com/... )"]
1135 if ( (rlv_handler_t::isEnabled()) && (!RlvSettings::getForbidGiveToRLV()) &&
1136 (IM_TASK_INVENTORY_OFFERED == info->mIM) && (LLAssetType::AT_CATEGORY == info->mType) && (info->mDesc.find(RLV_PUTINV_PREFIX) == 1) )
1137 {
1138 LLViewerInventoryCategory* pRlvRoot = gRlvHandler.getSharedRoot();
1139 if (pRlvRoot)
1140 {
1141 info->mFolderID = pRlvRoot->getUUID();
1142 }
1143 }
1144// [/RLVa:KB]
1118 // ACCEPT. The math for the dialog works, because the accept 1145 // ACCEPT. The math for the dialog works, because the accept
1119 // for inventory_offered, task_inventory_offer or 1146 // for inventory_offered, task_inventory_offer or
1120 // group_notice_inventory is 1 greater than the offer integer value. 1147 // group_notice_inventory is 1 greater than the offer integer value.
@@ -1277,6 +1304,13 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
1277 if(indx >= 0) 1304 if(indx >= 0)
1278 { 1305 {
1279 LLStringUtil::truncate(msg, indx); 1306 LLStringUtil::truncate(msg, indx);
1307// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-1.0.0a
1308 // TODO-RLVa: needs revisiting when LL saves open notifications to disk to accept them on the next relog
1309 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
1310 {
1311 gRlvHandler.filterLocation(info->mDesc);
1312 }
1313// [/RLVa:KB]
1280 } 1314 }
1281 1315
1282 LLSD args; 1316 LLSD args;
@@ -1505,7 +1539,20 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1505 // do nothing -- don't distract newbies in 1539 // do nothing -- don't distract newbies in
1506 // Prelude with global IMs 1540 // Prelude with global IMs
1507 } 1541 }
1508 else if (offline == IM_ONLINE && !is_linden && is_busy && name != SYSTEM_FROM) 1542// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
1543 else if ( (rlv_handler_t::isEnabled()) && (offline == IM_ONLINE) && ("@version" == message) )
1544 {
1545 rlvSendBusyMessage(from_id, gRlvHandler.getVersionString(), session_id);
1546 // We won't receive a typing stop message, so do that manually (see comment at the end of LLFloaterIMPanel::sendMsg)
1547 LLPointer<LLIMInfo> im_info = new LLIMInfo(gMessageSystem);
1548 gIMMgr->processIMTypingStop(im_info);
1549 }
1550// [/RLVa:KB]
1551// else if (offline == IM_ONLINE && !is_linden && is_busy && name != SYSTEM_FROM)
1552// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
1553 else if ( (offline == IM_ONLINE && !is_linden && is_busy && name != SYSTEM_FROM) &&
1554 ( (!gRlvHandler.hasBehaviour(RLV_BHVR_RECVIM)) || (gRlvHandler.isException(RLV_BHVR_RECVIM, from_id))) )
1555// [/RLVa:KB]
1509 { 1556 {
1510 // return a standard "busy" message, but only do it to online IM 1557 // return a standard "busy" message, but only do it to online IM
1511 // (i.e. not other auto responses and not store-and-forward IM) 1558 // (i.e. not other auto responses and not store-and-forward IM)
@@ -1562,6 +1609,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1562 } 1609 }
1563 else if (to_id.isNull()) 1610 else if (to_id.isNull())
1564 { 1611 {
1612// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
1613 // Filter region messages that weren't sent by a Linden
1614 if ( (rlv_handler_t::isEnabled()) && (LLMuteList::getInstance()) &&
1615 (!LLMuteList::getInstance()->isLinden(name)) && (from_id != gAgent.getID()) )
1616 {
1617 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
1618 gRlvHandler.filterLocation(message);
1619 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
1620 {
1621 name = gRlvHandler.getAnonym(name);
1622 gRlvHandler.filterNames(message);
1623 }
1624 }
1625// [/RLVa:KB]
1626
1565 // Message to everyone from GOD 1627 // Message to everyone from GOD
1566 args["NAME"] = name; 1628 args["NAME"] = name;
1567 args["MESSAGE"] = message; 1629 args["MESSAGE"] = message;
@@ -1577,6 +1639,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1577 else 1639 else
1578 { 1640 {
1579 // standard message, not from system 1641 // standard message, not from system
1642// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
1643 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_RECVIM)) && (!gRlvHandler.isException(RLV_BHVR_RECVIM, from_id)) )
1644 {
1645 rlvSendBusyMessage(from_id, rlv_handler_t::cstrMsgRecvIM, session_id);
1646
1647 message = message.substr(0, message_offset) + rlv_handler_t::cstrBlockedRecvIM;
1648 }
1649// [/RLVa:KB]
1650
1580 std::string saved; 1651 std::string saved;
1581 if(offline == IM_OFFLINE) 1652 if(offline == IM_OFFLINE)
1582 { 1653 {
@@ -1794,6 +1865,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1794 bucketp = (struct offer_agent_bucket_t*) &binary_bucket[0]; 1865 bucketp = (struct offer_agent_bucket_t*) &binary_bucket[0];
1795 info->mType = (LLAssetType::EType) bucketp->asset_type; 1866 info->mType = (LLAssetType::EType) bucketp->asset_type;
1796 info->mObjectID = bucketp->object_id; 1867 info->mObjectID = bucketp->object_id;
1868
1869// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e)
1870 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (gRlvHandler.isAgentNearby(from_id)) )
1871 {
1872 name = gRlvHandler.getAnonym(name);
1873 }
1874// [/RLVa:KB]
1797 } 1875 }
1798 else 1876 else
1799 { 1877 {
@@ -1831,6 +1909,14 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1831 } 1909 }
1832 else 1910 else
1833 { 1911 {
1912// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-09-10 (RLVa-1.0.3a)
1913 if ( (rlv_handler_t::isEnabled()) && (dialog == IM_TASK_INVENTORY_OFFERED) &&
1914 (info->mDesc.find(RLV_PUTINV_PREFIX) == 1) && (gRlvHandler.getSharedRoot()) )
1915 {
1916 LLFirstUse::warnRlvGiveToRLV();
1917 }
1918// [/RLVa:KB]
1919
1834 inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED); 1920 inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED);
1835 } 1921 }
1836 } 1922 }
@@ -1880,6 +1966,22 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1880 return; 1966 return;
1881 } 1967 }
1882 1968
1969// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
1970 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_RECVIM)) )
1971 {
1972 if (gAgent.isInGroup(session_id))
1973 {
1974 if (!gRlvHandler.isException(RLV_BHVR_RECVIM, session_id))
1975 return;
1976 }
1977 else
1978 {
1979 if ( (from_id != gAgent.getID()) && (!gRlvHandler.isException(RLV_BHVR_RECVIM, from_id)) )
1980 message = message.substr(0, message_offset) + rlv_handler_t::cstrBlockedRecvIM;
1981 }
1982 }
1983// [/RLVa:KB]
1984
1883 // standard message, not from system 1985 // standard message, not from system
1884 std::string saved; 1986 std::string saved;
1885 if(offline == IM_OFFLINE) 1987 if(offline == IM_OFFLINE)
@@ -1915,12 +2017,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1915 { 2017 {
1916 return; 2018 return;
1917 } 2019 }
1918 chat.mText = name + separator_string + message.substr(message_offset); 2020 chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset);
1919 chat.mFromName = name; 2021 chat.mFromName = name;
1920 2022
1921 // Build a link to open the object IM info window. 2023 // Build a link to open the object IM info window.
1922 std::string location = ll_safe_string((char*)binary_bucket,binary_bucket_size); 2024 std::string location = ll_safe_string((char*)binary_bucket,binary_bucket_size);
1923 2025
1924 LLSD query_string; 2026 LLSD query_string;
1925 query_string["owner"] = from_id; 2027 query_string["owner"] = from_id;
1926 query_string["slurl"] = location.c_str(); 2028 query_string["slurl"] = location.c_str();
@@ -1928,7 +2030,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1928 if (from_group) 2030 if (from_group)
1929 { 2031 {
1930 query_string["groupowned"] = "true"; 2032 query_string["groupowned"] = "true";
1931 } 2033 }
1932 2034
1933 if (session_id.notNull()) 2035 if (session_id.notNull())
1934 { 2036 {
@@ -1949,11 +2051,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1949 << LLURI::mapToQueryString(query_string); 2051 << LLURI::mapToQueryString(query_string);
1950 2052
1951 chat.mURL = link.str(); 2053 chat.mURL = link.str();
1952 chat.mText = name + separator_string + message.substr(message_offset); 2054 chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset);
1953 2055
1954 // Note: lie to LLFloaterChat::addChat(), pretending that this is NOT an IM, because 2056 // Note: lie to LLFloaterChat::addChat(), pretending that this is NOT an IM, because
1955 // IMs from objcts don't open IM sessions. 2057 // IMs from objcts don't open IM sessions.
1956 chat.mSourceType = CHAT_SOURCE_OBJECT; 2058 chat.mSourceType = CHAT_SOURCE_OBJECT_IM;
1957 LLFloaterChat::addChat(chat, FALSE, FALSE); 2059 LLFloaterChat::addChat(chat, FALSE, FALSE);
1958 } 2060 }
1959 break; 2061 break;
@@ -1963,6 +2065,17 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
1963 return; 2065 return;
1964 } 2066 }
1965 { 2067 {
2068// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-08 (RLVa-1.0.0e)
2069 // TODO-RLVa: what actually generates this?
2070 if (rlv_handler_t::isEnabled())
2071 {
2072 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
2073 gRlvHandler.filterLocation(message);
2074 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
2075 gRlvHandler.filterNames(message);
2076 }
2077// [/RLVa:KB]
2078
1966 // Construct a viewer alert for this message. 2079 // Construct a viewer alert for this message.
1967 args["NAME"] = name; 2080 args["NAME"] = name;
1968 args["MESSAGE"] = message; 2081 args["MESSAGE"] = message;
@@ -2283,8 +2396,13 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
2283 chat.mPosAgent = chatter->getPositionAgent(); 2396 chat.mPosAgent = chatter->getPositionAgent();
2284 2397
2285 // Make swirly things only for talking objects. (not script debug messages, though) 2398 // Make swirly things only for talking objects. (not script debug messages, though)
2286 if (chat.mSourceType == CHAT_SOURCE_OBJECT 2399// if (chat.mSourceType == CHAT_SOURCE_OBJECT
2287 && chat.mChatType != CHAT_TYPE_DEBUG_MSG) 2400// && chat.mChatType != CHAT_TYPE_DEBUG_MSG)
2401// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
2402 // Don't show swirly things for llOwnerSay() chat here because we handle those further down
2403 if ( (chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mChatType != CHAT_TYPE_DEBUG_MSG) &&
2404 ((!rlv_handler_t::isEnabled()) || (CHAT_TYPE_OWNER != chat.mChatType)) )
2405// [/RLVa:KB]
2288 { 2406 {
2289 LLPointer<LLViewerPartSourceChat> psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); 2407 LLPointer<LLViewerPartSourceChat> psc = new LLViewerPartSourceChat(chatter->getPositionAgent());
2290 psc->setSourceObject(chatter); 2408 psc->setSourceObject(chatter);
@@ -2309,6 +2427,32 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
2309 is_owned_by_me = chatter->permYouOwner(); 2427 is_owned_by_me = chatter->permYouOwner();
2310 } 2428 }
2311 2429
2430 if(chat.mSourceType == CHAT_SOURCE_OBJECT
2431 && chat.mChatType != CHAT_TYPE_DEBUG_MSG
2432 && !owner_id.isNull()
2433 && owner_id != gAgent.getID())
2434 {
2435 std::string tempname = from_name;
2436
2437 size_t found = tempname.find(" ");
2438 while(found != std::string::npos)
2439 {
2440 tempname.replace(found, 1, "");
2441 found = tempname.find(" ");
2442 }
2443
2444 if (tempname.length() < 1)
2445 {
2446 from_name = "no name";
2447 chat.mFromName = from_name;
2448 }
2449
2450 // std::string ownername;
2451 // if(gCacheName->getFullName(owner_id,ownername))
2452 // from_name += (" (" + ownername + ")");
2453 chat.mURL = llformat("secondlife:///app/agent/%s/about",owner_id.asString().c_str());
2454 }
2455
2312 if (is_audible) 2456 if (is_audible)
2313 { 2457 {
2314 BOOL visible_in_chat_bubble = FALSE; 2458 BOOL visible_in_chat_bubble = FALSE;
@@ -2317,6 +2461,51 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
2317 color.setVec(1.f,1.f,1.f,1.f); 2461 color.setVec(1.f,1.f,1.f,1.f);
2318 msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg); 2462 msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg);
2319 2463
2464// [RLVa:KB] - Checked: 2009-10-06 (RLVa-1.0.4d) | Modified: RLVa-1.0.4d
2465 if ( (rlv_handler_t::isEnabled()) &&
2466 (CHAT_TYPE_START != chat.mChatType) && (CHAT_TYPE_STOP != chat.mChatType) && (CHAT_TYPE_OWNER != chat.mChatType) )
2467 {
2468 // NOTE: chatter can be NULL (may not have rezzed yet, or could be another avie's HUD attachment)
2469 BOOL is_attachment = (chatter) ? chatter->isAttachment() : FALSE;
2470
2471 // Filtering "rules":
2472 // avatar => filter all avie text (unless it's this avie or they're an exemption)
2473 // objects => filter everything except attachments this avie owns
2474 if ( ( (CHAT_SOURCE_AGENT == chat.mSourceType) && (from_id != gAgent.getID()) ) ||
2475 ( (CHAT_SOURCE_OBJECT == chat.mSourceType) && ((!is_owned_by_me) || (!is_attachment)) ) )
2476 {
2477 if (!rlvIsEmote(mesg))
2478 {
2479 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_RECVCHAT)) && (!gRlvHandler.isException(RLV_BHVR_RECVCHAT, from_id)) )
2480 gRlvHandler.filterChat(mesg, false);
2481 }
2482 else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_RECVEMOTE)) && (!gRlvHandler.isException(RLV_BHVR_RECVEMOTE, from_id)) )
2483 {
2484 mesg = "/me ...";
2485 }
2486 }
2487
2488 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
2489 {
2490 // Filtering "rules":
2491 // avatar => filter only their name (unless it's this avie)
2492 // other => filter everything except attachments this avie owns but then we still do filter their text
2493 if (CHAT_SOURCE_AGENT == chat.mSourceType)
2494 {
2495 if (chat.mFromID != gAgent.getID())
2496 from_name = gRlvHandler.getAnonym(from_name);
2497 }
2498 else
2499 {
2500 if ( (!is_owned_by_me) || (!is_attachment) )
2501 gRlvHandler.filterNames(from_name);
2502 gRlvHandler.filterNames(mesg);
2503 }
2504 chat.mRlvNamesFiltered = true;
2505 }
2506 }
2507// [/RLVa:KB]
2508
2320 BOOL ircstyle = FALSE; 2509 BOOL ircstyle = FALSE;
2321 2510
2322 // Look for IRC-style emotes here so chatbubbles work 2511 // Look for IRC-style emotes here so chatbubbles work
@@ -2342,6 +2531,12 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
2342 { 2531 {
2343 ((LLVOAvatar*)chatter)->startTyping(); 2532 ((LLVOAvatar*)chatter)->startTyping();
2344 } 2533 }
2534
2535 if (LLFloaterMap::getInstance())
2536 {
2537 LLFloaterMap::getInstance()->updateTypingList(from_id, false);
2538 }
2539
2345 return; 2540 return;
2346 } 2541 }
2347 else if (CHAT_TYPE_STOP == chat.mChatType) 2542 else if (CHAT_TYPE_STOP == chat.mChatType)
@@ -2353,6 +2548,15 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
2353 { 2548 {
2354 ((LLVOAvatar*)chatter)->stopTyping(); 2549 ((LLVOAvatar*)chatter)->stopTyping();
2355 } 2550 }
2551
2552 if (LLFloaterMap::getInstance())
2553 {
2554 if (LLFloaterMap::getInstance()->isTyping(from_id))
2555 {
2556 LLFloaterMap::getInstance()->updateTypingList(from_id, true);
2557 }
2558 }
2559
2356 return; 2560 return;
2357 } 2561 }
2358 2562
@@ -2381,8 +2585,74 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
2381 case CHAT_TYPE_WHISPER: 2585 case CHAT_TYPE_WHISPER:
2382 verb = " " + LLTrans::getString("whisper") + " "; 2586 verb = " " + LLTrans::getString("whisper") + " ";
2383 break; 2587 break;
2384 case CHAT_TYPE_DEBUG_MSG:
2385 case CHAT_TYPE_OWNER: 2588 case CHAT_TYPE_OWNER:
2589// [RLVa:KB] - Checked: 2009-08-28 (RLVa-1.0.2a) | Modified: RLVa-1.0.2a
2590 if ( (rlv_handler_t::isEnabled()) && (mesg.length() > 3) && (RLV_CMD_PREFIX == mesg[0]) && (CHAT_TYPE_OWNER == chat.mChatType) )
2591 {
2592 mesg.erase(0, 1);
2593 LLStringUtil::toLower(mesg);
2594
2595 std::string strExecuted, strFailed, strRetained, *pstr;
2596
2597 boost_tokenizer tokens(mesg, boost::char_separator<char>(",", "", boost::drop_empty_tokens));
2598 for (boost_tokenizer::const_iterator itToken = tokens.begin(); itToken != tokens.end(); ++itToken)
2599 {
2600 if (LLStartUp::getStartupState() == STATE_STARTED)
2601 {
2602 if (gRlvHandler.processCommand(from_id, *itToken, true))
2603 pstr = &strExecuted;
2604 else
2605 pstr = &strFailed;
2606 }
2607 else
2608 {
2609 gRlvHandler.retainCommand(from_name, from_id, *itToken);
2610 pstr = &strRetained;
2611 }
2612
2613 if (!pstr->empty())
2614 pstr->push_back(',');
2615 pstr->append(*itToken);
2616 }
2617
2618 if (!RlvSettings::getDebug())
2619 return;
2620
2621 // Silly people want comprehensive debug messages, blah :p
2622 if ( (!strExecuted.empty()) && (strFailed.empty()) && (strRetained.empty()) )
2623 verb = " executes: @";
2624 else if ( (strExecuted.empty()) && (!strFailed.empty()) && (strRetained.empty()) )
2625 verb = " failed: @";
2626 else if ( (strExecuted.empty()) && (strFailed.empty()) && (!strRetained.empty()) )
2627 verb = " retained: @";
2628 else
2629 {
2630 verb = ": @";
2631 if (!strExecuted.empty())
2632 mesg += "\n - executed: @" + strExecuted;
2633 if (!strFailed.empty())
2634 mesg += "\n - failed: @" + strFailed;
2635 if (!strRetained.empty())
2636 mesg += "\n - retained: @" + strRetained;
2637 }
2638
2639 break;
2640 }
2641// [/RLVa:KB]
2642// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
2643 // Copy/paste from above
2644 if ( (chatter) && (chat.mChatType != CHAT_TYPE_DEBUG_MSG) )
2645 {
2646 LLPointer<LLViewerPartSourceChat> psc = new LLViewerPartSourceChat(chatter->getPositionAgent());
2647 psc->setSourceObject(chatter);
2648 psc->setColor(color);
2649 //We set the particles to be owned by the object's owner,
2650 //just in case they should be muted by the mute list
2651 psc->setOwnerUUID(owner_id);
2652 LLViewerPartSim::getInstance()->addPartSource(psc);
2653 }
2654// [/RLVa:KB]
2655 case CHAT_TYPE_DEBUG_MSG:
2386 case CHAT_TYPE_NORMAL: 2656 case CHAT_TYPE_NORMAL:
2387 verb = ": "; 2657 verb = ": ";
2388 break; 2658 break;
@@ -2451,7 +2721,10 @@ void process_teleport_start(LLMessageSystem *msg, void**)
2451 U32 teleport_flags = 0x0; 2721 U32 teleport_flags = 0x0;
2452 msg->getU32("Info", "TeleportFlags", teleport_flags); 2722 msg->getU32("Info", "TeleportFlags", teleport_flags);
2453 2723
2454 if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) 2724 //if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL)
2725// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d) | Added: RLVa-0.2.0b
2726 if ( (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) || (!gRlvHandler.getCanCancelTp()) )
2727// [/RLVa:KB]
2455 { 2728 {
2456 gViewerWindow->setProgressCancelButtonVisible(FALSE); 2729 gViewerWindow->setProgressCancelButtonVisible(FALSE);
2457 } 2730 }
@@ -2486,7 +2759,10 @@ void process_teleport_progress(LLMessageSystem* msg, void**)
2486 } 2759 }
2487 U32 teleport_flags = 0x0; 2760 U32 teleport_flags = 0x0;
2488 msg->getU32("Info", "TeleportFlags", teleport_flags); 2761 msg->getU32("Info", "TeleportFlags", teleport_flags);
2489 if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) 2762 //if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL)
2763// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d) | Added: RLVa-0.2.0b
2764 if ( (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) || (!gRlvHandler.getCanCancelTp()) )
2765// [/RLVa:KB]
2490 { 2766 {
2491 gViewerWindow->setProgressCancelButtonVisible(FALSE); 2767 gViewerWindow->setProgressCancelButtonVisible(FALSE);
2492 } 2768 }
@@ -2796,6 +3072,10 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
2796 // appropriate. 3072 // appropriate.
2797 LLVector3 shift_vector = regionp->getPosRegionFromGlobal( 3073 LLVector3 shift_vector = regionp->getPosRegionFromGlobal(
2798 gAgent.getRegion()->getOriginGlobal()); 3074 gAgent.getRegion()->getOriginGlobal());
3075 // don't shift objects, if teleporting more than about 1000 sims, as
3076 // for long teleports shifting objects garbles the view at the target region
3077 if (shift_vector.lengthSquared() > 6.5e10f)
3078 shift_vector = LLVector3::zero;
2799 gAgent.setRegion(regionp); 3079 gAgent.setRegion(regionp);
2800 gObjectList.shiftObjects(shift_vector); 3080 gObjectList.shiftObjects(shift_vector);
2801 gAssetStorage->setUpstream(msg->getSender()); 3081 gAssetStorage->setUpstream(msg->getSender());
@@ -2818,7 +3098,10 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
2818 // know what you look like. 3098 // know what you look like.
2819 gAgent.sendAgentSetAppearance(); 3099 gAgent.sendAgentSetAppearance();
2820 3100
2821 if (avatarp) 3101// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
3102 if ( (avatarp) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) )
3103// [/RLVa:KB]
3104// if (avatarp)
2822 { 3105 {
2823 // Chat the "back" SLURL. (DEV-4907) 3106 // Chat the "back" SLURL. (DEV-4907)
2824 LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL()); 3107 LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL());
@@ -2898,6 +3181,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
2898 3181
2899 // If the server version has changed, display an info box and offer 3182 // If the server version has changed, display an info box and offer
2900 // to display the release notes, unless this is the initial log in. 3183 // to display the release notes, unless this is the initial log in.
3184 // Also verify we're on an OpenSimulator here.
2901 if (gLastVersionChannel == version_channel) 3185 if (gLastVersionChannel == version_channel)
2902 { 3186 {
2903 return; 3187 return;
@@ -2910,6 +3194,15 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
2910 LLNotifications::instance().add("ServerVersionChanged", LLSD(), payload); 3194 LLNotifications::instance().add("ServerVersionChanged", LLSD(), payload);
2911 } 3195 }
2912 3196
3197 if (version_channel.find("OpenSim") != std::string::npos)
3198 {
3199 gSavedSettings.setBOOL("LoggedIntoOpenSim", TRUE);
3200 }
3201 else
3202 {
3203 gSavedSettings.setBOOL("LoggedIntoOpenSim", FALSE);
3204 }
3205
2913 gLastVersionChannel = version_channel; 3206 gLastVersionChannel = version_channel;
2914} 3207}
2915 3208
@@ -4126,7 +4419,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
4126 LLUUID tid; 4419 LLUUID tid;
4127 msg->getUUID("MoneyData", "TransactionID", tid); 4420 msg->getUUID("MoneyData", "TransactionID", tid);
4128 static std::deque<LLUUID> recent; 4421 static std::deque<LLUUID> recent;
4129 if(!desc.empty() && gSavedSettings.getBOOL("NotifyMoneyChange") 4422 if(!desc.empty() && gSavedSettings.getBOOL("NotifyMoneyChange") && !gDisconnected
4130 && (std::find(recent.rbegin(), recent.rend(), tid) == recent.rend())) 4423 && (std::find(recent.rbegin(), recent.rend(), tid) == recent.rend()))
4131 { 4424 {
4132 // Make the user confirm the transaction, since they might 4425 // Make the user confirm the transaction, since they might
@@ -4537,7 +4830,13 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp
4537 if (viewregion) 4830 if (viewregion)
4538 { 4831 {
4539 // got the region, so include the region and 3d coordinates of the object 4832 // got the region, so include the region and 3d coordinates of the object
4540 notice.setArg("[REGIONNAME]", viewregion->getName()); 4833 notice.setArg("[REGIONNAME]", viewregion->getName());
4834// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
4835 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) )
4836 {
4837 notice.setArg("[REGIONNAME]", rlv_handler_t::cstrHiddenRegion);
4838 }
4839// [/RLVa:KB]
4541 std::string formatpos = llformat("%.1f, %.1f,%.1f", objpos[VX], objpos[VY], objpos[VZ]); 4840 std::string formatpos = llformat("%.1f, %.1f,%.1f", objpos[VX], objpos[VY], objpos[VZ]);
4542 notice.setArg("[REGIONPOS]", formatpos); 4841 notice.setArg("[REGIONPOS]", formatpos);
4543 4842
@@ -4749,8 +5048,31 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
4749 payload["object_name"] = object_name; 5048 payload["object_name"] = object_name;
4750 payload["owner_name"] = owner_name; 5049 payload["owner_name"] = owner_name;
4751 5050
5051// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0e
5052 S32 rlvQuestionsOther = questions;
5053
5054 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_ACCEPTPERMISSION)) )
5055 {
5056 LLViewerObject* pObj = gObjectList.findObject(taskid);
5057 if (pObj)
5058 {
5059 if (pObj->permYouOwner())
5060 {
5061 // PERMISSION_TAKE_CONTROLS and PERMISSION_ATTACH are only auto-granted to objects this avie owns
5062 rlvQuestionsOther &= ~(LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_TAKE_CONTROLS] |
5063 LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_ATTACH]);
5064 }
5065 }
5066 }
5067
5068 if ( (!caution) && (!rlvQuestionsOther) )
5069 {
5070 script_question_cb(0, cbdata);
5071 }
5072 else if (gSavedSettings.getBOOL("PermissionsCautionEnabled"))
5073// [/RLVa:KB]
4752 // check whether cautions are even enabled or not 5074 // check whether cautions are even enabled or not
4753 if (gSavedSettings.getBOOL("PermissionsCautionEnabled")) 5075 //if (gSavedSettings.getBOOL("PermissionsCautionEnabled"))
4754 { 5076 {
4755 // display the caution permissions prompt 5077 // display the caution permissions prompt
4756 LLNotifications::instance().add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload); 5078 LLNotifications::instance().add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload);
@@ -5081,6 +5403,21 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)
5081 5403
5082 if(0 == option) 5404 if(0 == option)
5083 { 5405 {
5406// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0b
5407 bool fRlvCensorMessage = false;
5408 if (gRlvHandler.hasBehaviour(RLV_BHVR_SENDIM))
5409 {
5410 for (LLDynamicArray<LLUUID>::iterator it = invitees->begin(); it != invitees->end(); ++it)
5411 {
5412 if (!gRlvHandler.isException(RLV_BHVR_SENDIM, *it))
5413 {
5414 fRlvCensorMessage = true;
5415 break;
5416 }
5417 }
5418 }
5419// [/RLVa:KB]
5420
5084 LLMessageSystem* msg = gMessageSystem; 5421 LLMessageSystem* msg = gMessageSystem;
5085 msg->newMessageFast(_PREHASH_StartLure); 5422 msg->newMessageFast(_PREHASH_StartLure);
5086 msg->nextBlockFast(_PREHASH_AgentData); 5423 msg->nextBlockFast(_PREHASH_AgentData);
@@ -5088,7 +5425,10 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)
5088 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); 5425 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
5089 msg->nextBlockFast(_PREHASH_Info); 5426 msg->nextBlockFast(_PREHASH_Info);
5090 msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in. 5427 msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in.
5091 msg->addStringFast(_PREHASH_Message, text); 5428// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0b
5429 msg->addStringFast(_PREHASH_Message, (!fRlvCensorMessage) ? text : rlv_handler_t::cstrHidden);
5430// [/RLVa:KB]
5431 //msg->addStringFast(_PREHASH_Message, text);
5092 for(LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray(); 5432 for(LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray();
5093 it != notification["payload"]["ids"].endArray(); 5433 it != notification["payload"]["ids"].endArray();
5094 ++it) 5434 ++it)
@@ -5266,6 +5606,35 @@ void process_script_dialog(LLMessageSystem* msg, void**)
5266 msg->getString("Data", "Message", message); 5606 msg->getString("Data", "Message", message);
5267 msg->getS32("Data", "ChatChannel", chat_channel); 5607 msg->getS32("Data", "ChatChannel", chat_channel);
5268 5608
5609 // Don't show lldialog boxes from muted avs -- McCabe
5610 std::string agent_name = first_name + " " + last_name;
5611 if (!last_name.empty())
5612 {
5613 std::vector<LLMute> mutes = LLMuteList::getInstance()->getMutes();
5614 for (U32 i = 0; i < mutes.size(); i++)
5615 {
5616 //this is almost like saying (mutes[i].mType != LLMute::Object), but more verbose ... -Kaku
5617 if (
5618 ((mutes[i].mType == LLMute::AGENT)
5619 && (mutes[i].mName == agent_name))
5620 || ((mutes[i].mType == LLMute::GROUP)
5621 && (mutes[i].mName == last_name))
5622 || ((mutes[i].mType == LLMute::BY_NAME)
5623 //don't mute groups by name in case a group has a last name as a group name.
5624 && ((mutes[i].mName == agent_name)))
5625 )
5626 {
5627 delete info;
5628 return;
5629 }
5630 }
5631 }
5632 // or Scriptdialog boxes from muted objects -- Kakurady
5633 if (LLMuteList::getInstance()->isMuted(info->mObjectID, title)){
5634 delete info;
5635 return;
5636 }
5637
5269 // unused for now 5638 // unused for now
5270 LLUUID image_id; 5639 LLUUID image_id;
5271 msg->getUUID("Data", "ImageID", image_id); 5640 msg->getUUID("Data", "ImageID", image_id);
@@ -5296,6 +5665,45 @@ void process_script_dialog(LLMessageSystem* msg, void**)
5296 LLNotificationPtr notification; 5665 LLNotificationPtr notification;
5297 if (!first_name.empty()) 5666 if (!first_name.empty())
5298 { 5667 {
5668 // Dialog Spam Prevention by Cryogenic
5669 if(dialogSpamOn)
5670 {
5671 if(!d_spam.getStarted())
5672 {
5673 d_spam.start();
5674 }
5675 if(blacklisted_names.find(agent_name) != -1)
5676 {
5677 return;
5678 }
5679 std::map< std::string , S32 >::iterator itr = lastd_names.find(agent_name);
5680 if(itr != lastd_names.end())
5681 {
5682 if(d_spam.getElapsedTimeF32() <= gSavedSettings.getF32("SpamTime"))
5683 {
5684 if((*itr).second > gSavedSettings.getF32("SpamCount"))
5685 {
5686 blacklisted_names.put(agent_name);
5687 LL_INFOS("process_script_dialog") << "blocked " << info->mObjectID.asString() << " owned by " << agent_name << LL_ENDL;//" (" << key.asString() << ")" <<LL_ENDL;
5688 return;
5689 }
5690 else
5691 {
5692 (*itr).second++;
5693 }
5694 }
5695 else
5696 {
5697 lastd_names.erase(lastd_names.begin(),lastd_names.end());
5698 d_spam.reset();
5699 }
5700 }
5701 else
5702 {
5703 //llinfos << "Added " << fullname << " to list" << llendl;
5704 lastd_names[agent_name] = 0;
5705 }
5706 }
5299 args["FIRST"] = first_name; 5707 args["FIRST"] = first_name;
5300 args["LAST"] = last_name; 5708 args["LAST"] = last_name;
5301 notification = LLNotifications::instance().add( 5709 notification = LLNotifications::instance().add(
diff --git a/linden/indra/newview/llviewermessage.h b/linden/indra/newview/llviewermessage.h
index e7a4303..c920f85 100644
--- a/linden/indra/newview/llviewermessage.h
+++ b/linden/indra/newview/llviewermessage.h
@@ -37,7 +37,7 @@
37#include "lltransactiontypes.h" 37#include "lltransactiontypes.h"
38#include "lluuid.h" 38#include "lluuid.h"
39#include "stdenums.h" 39#include "stdenums.h"
40 40#include "llfloaterbump.h"
41// 41//
42// Forward declarations 42// Forward declarations
43// 43//
diff --git a/linden/indra/newview/llviewernetwork.cpp b/linden/indra/newview/llviewernetwork.cpp
index 8608b34..c1d5013 100644
--- a/linden/indra/newview/llviewernetwork.cpp
+++ b/linden/indra/newview/llviewernetwork.cpp
@@ -5,7 +5,7 @@
5 * 5 *
6 * $LicenseInfo:firstyear=2006&license=viewergpl$ 6 * $LicenseInfo:firstyear=2006&license=viewergpl$
7 * 7 *
8 * Copyright (c) 2006-2009, Linden Research, Inc. 8 * Copyright (c) 2006-2008, Linden Research, Inc.
9 * 9 *
10 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
11 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -35,158 +35,19 @@
35 35
36#include "llviewernetwork.h" 36#include "llviewernetwork.h"
37#include "llviewercontrol.h" 37#include "llviewercontrol.h"
38#include "llstartup.h"
38 39
39struct LLGridData 40 #include "hippoGridManager.h"
40{
41 const char* mLabel;
42 const char* mCodeName;
43 const char* mName;
44 const char* mLoginURI;
45 const char* mHelperURI;
46};
47
48static LLGridData gGridInfo[GRID_INFO_COUNT] =
49{
50 { "None", "", "", "", "" },
51 { "SL Main Grid",
52 "Agni",
53 "util.agni.lindenlab.com",
54 "https://login.agni.lindenlab.com/cgi-bin/login.cgi",
55 "https://secondlife.com/helpers/" },
56 { "SL Beta Grid",
57 "Aditi",
58 "util.aditi.lindenlab.com",
59 "https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
60 "http://aditi-secondlife.webdev.lindenlab.com/helpers/" },
61 { "Local OpenSim",
62 "",
63 "localhost",
64 "http://127.0.0.1:9000",
65 "" },
66 { "Other", "", "", "", "" }
67};
68
69const EGridInfo DEFAULT_GRID_CHOICE = GRID_INFO_AGNI;
70 41
71 42
72unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */ 43unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */
73 44
74LLViewerLogin::LLViewerLogin() :
75 mGridChoice(DEFAULT_GRID_CHOICE)
76{
77}
78
79void LLViewerLogin::setGridChoice(EGridInfo grid)
80{
81 if(grid < 0 || grid >= GRID_INFO_COUNT)
82 {
83 llerrs << "Invalid grid index specified." << llendl;
84 }
85
86 if(mGridChoice != grid || gSavedSettings.getS32("ServerChoice") != grid)
87 {
88 mGridChoice = grid;
89 if(GRID_INFO_LOCAL == mGridChoice)
90 {
91 mGridName = LOOPBACK_ADDRESS_STRING;
92 }
93 else if(GRID_INFO_OTHER == mGridChoice)
94 {
95 // *FIX:Mani - could this possibly be valid?
96 mGridName = "other";
97 }
98 else
99 {
100 mGridName = gGridInfo[mGridChoice].mLabel;
101 }
102
103 gSavedSettings.setS32("ServerChoice", mGridChoice);
104 gSavedSettings.setString("CustomServer", "");
105 }
106}
107
108void LLViewerLogin::setGridChoice(const std::string& grid_name)
109{
110 // Set the grid choice based on a string.
111 // The string can be:
112 // - a grid label from the gGridInfo table
113 // - an ip address
114 if(!grid_name.empty())
115 {
116 // find the grid choice from the user setting.
117 int grid_index = GRID_INFO_NONE;
118 for(;grid_index < GRID_INFO_OTHER; ++grid_index)
119 {
120 if(0 == LLStringUtil::compareInsensitive(gGridInfo[grid_index].mLabel, grid_name))
121 {
122 // Founding a matching label in the list...
123 setGridChoice((EGridInfo)grid_index);
124 break;
125 }
126 }
127
128 if(GRID_INFO_OTHER == grid_index)
129 {
130 // *FIX:MEP Can and should we validate that this is an IP address?
131 mGridChoice = GRID_INFO_OTHER;
132 mGridName = grid_name;
133 gSavedSettings.setS32("ServerChoice", mGridChoice);
134 gSavedSettings.setString("CustomServer", mGridName);
135 }
136 }
137}
138
139void LLViewerLogin::resetURIs()
140{
141 // Clear URIs when picking a new server
142 gSavedSettings.setValue("CmdLineLoginURI", LLSD::emptyArray());
143 gSavedSettings.setString("CmdLineHelperURI", "");
144}
145
146EGridInfo LLViewerLogin::getGridChoice() const
147{
148 return mGridChoice;
149}
150
151std::string LLViewerLogin::getGridLabel() const
152{
153 if(mGridChoice == GRID_INFO_NONE)
154 {
155 return "None";
156 }
157 else if(mGridChoice < GRID_INFO_OTHER)
158 {
159 return gGridInfo[mGridChoice].mLabel;
160 }
161
162 return mGridName;
163}
164
165std::string LLViewerLogin::getGridCodeName() const
166{
167 // Fall back to grid label if code name is empty.
168 if( strcmp(gGridInfo[mGridChoice].mCodeName, "") == 0 )
169 {
170 return getGridLabel();
171 }
172
173 return gGridInfo[mGridChoice].mCodeName;
174}
175
176std::string LLViewerLogin::getKnownGridLabel(EGridInfo grid_index) const
177{
178 if(grid_index > GRID_INFO_NONE && grid_index < GRID_INFO_OTHER)
179 {
180 return gGridInfo[grid_index].mLabel;
181 }
182 return gGridInfo[GRID_INFO_NONE].mLabel;
183}
184 45
185void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const 46void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
186{ 47{
187 // return the login uri set on the command line. 48 // return the login uri set on the command line.
188 LLControlVariable* c = gSavedSettings.getControl("CmdLineLoginURI"); 49 LLControlVariable* c = gSavedSettings.getControl("CmdLineLoginURI");
189 if(c) 50 if(c && !LLStartUp::shouldAutoLogin())
190 { 51 {
191 LLSD v = c->getValue(); 52 LLSD v = c->getValue();
192 if(v.isArray()) 53 if(v.isArray())
@@ -210,10 +71,12 @@ void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
210 } 71 }
211 } 72 }
212 } 73 }
213 74
214 // If there was no command line uri... 75 // If there was no command line uri...
215 if(uris.empty()) 76 if(uris.empty())
216 { 77 {
78 uris.push_back(gHippoGridManager->getConnectedGrid()->getLoginUri());
79 /*
217 // If its a known grid choice, get the uri from the table, 80 // If its a known grid choice, get the uri from the table,
218 // else try the grid name. 81 // else try the grid name.
219 if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER) 82 if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER)
@@ -223,44 +86,36 @@ void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
223 else 86 else
224 { 87 {
225 uris.push_back(mGridName); 88 uris.push_back(mGridName);
226 } 89 } */
227 } 90 }
228} 91}
229 92
230std::string LLViewerLogin::getHelperURI() const 93const std::string &LLViewerLogin::getGridLabel() const
231{ 94{
232 std::string helper_uri = gSavedSettings.getString("CmdLineHelperURI"); 95 return gHippoGridManager->getConnectedGrid()->getGridNick();
233 if (helper_uri.empty()) 96}
234 {
235 // grab URI from selected grid
236 if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER)
237 {
238 helper_uri = gGridInfo[mGridChoice].mHelperURI;
239 }
240 97
241 if (helper_uri.empty()) 98const std::string &LLViewerLogin::getLoginPage() const
242 { 99{
243 // what do we do with unnamed/miscellaneous grids? 100 return gHippoGridManager->getConnectedGrid()->getLoginPage();
244 // for now, operations that rely on the helper URI (currency/land purchasing) will fail
245 }
246 }
247 return helper_uri;
248} 101}
249 102
250bool LLViewerLogin::isInProductionGrid() 103const std::string &LLViewerLogin::getHelperURI() const
251{ 104{
252 // *NOTE:Mani This used to compare GRID_INFO_AGNI to gGridChoice, 105 return gHippoGridManager->getConnectedGrid()->getHelperUri();
253 // but it seems that loginURI trumps that. 106}
254 std::vector<std::string> uris; 107
255 getLoginURIs(uris); 108bool LLViewerLogin::isOpenSimulator()
256 LLStringUtil::toLower(uris[0]); 109{
110 return gHippoGridManager->getConnectedGrid()->isOpenSimulator();
111}
257 112
258 // Returns true for every grid but Aditi now, 113bool LLViewerLogin::isSecondLife()
259 // because opensim grids have feelings too! -- McCabe 114{
260 if((uris[0].find("aditi") != std::string::npos)) 115 return gHippoGridManager->getConnectedGrid()->isSecondLife();
261 { 116}
262 return false;
263 }
264 117
118bool LLViewerLogin::isInProductionGrid()
119{
265 return true; 120 return true;
266} 121}
diff --git a/linden/indra/newview/llviewernetwork.h b/linden/indra/newview/llviewernetwork.h
index 45d19d6..fd1a34b 100644
--- a/linden/indra/newview/llviewernetwork.h
+++ b/linden/indra/newview/llviewernetwork.h
@@ -5,7 +5,7 @@
5 * 5 *
6 * $LicenseInfo:firstyear=2006&license=viewergpl$ 6 * $LicenseInfo:firstyear=2006&license=viewergpl$
7 * 7 *
8 * Copyright (c) 2006-2009, Linden Research, Inc. 8 * Copyright (c) 2006-2008, Linden Research, Inc.
9 * 9 *
10 * Second Life Viewer Source Code 10 * Second Life Viewer Source Code
11 * The source code in this file ("Source Code") is provided by Linden Lab 11 * The source code in this file ("Source Code") is provided by Linden Lab
@@ -30,21 +30,9 @@
30 * COMPLETENESS OR PERFORMANCE. 30 * COMPLETENESS OR PERFORMANCE.
31 * $/LicenseInfo$ 31 * $/LicenseInfo$
32 */ 32 */
33
34#ifndef LL_LLVIEWERNETWORK_H 33#ifndef LL_LLVIEWERNETWORK_H
35#define LL_LLVIEWERNETWORK_H 34#define LL_LLVIEWERNETWORK_H
36 35
37class LLHost;
38
39enum EGridInfo
40{
41 GRID_INFO_NONE,
42 GRID_INFO_AGNI,
43 GRID_INFO_ADITI,
44 GRID_INFO_LOCAL,
45 GRID_INFO_OTHER, // IP address set via command line option
46 GRID_INFO_COUNT
47};
48 36
49/** 37/**
50 * @brief A class to manage the viewer's login state. 38 * @brief A class to manage the viewer's login state.
@@ -53,53 +41,20 @@ enum EGridInfo
53class LLViewerLogin : public LLSingleton<LLViewerLogin> 41class LLViewerLogin : public LLSingleton<LLViewerLogin>
54{ 42{
55public: 43public:
56 LLViewerLogin();
57
58 void setGridChoice(EGridInfo grid);
59 void setGridChoice(const std::string& grid_name);
60 void resetURIs();
61
62 /**
63 * @brief Get the enumeration of the grid choice.
64 * Should only return values > 0 && < GRID_INFO_COUNT
65 **/
66 EGridInfo getGridChoice() const;
67
68 /**
69 * @brief Get a readable label for the grid choice.
70 * Returns the readable name for the grid choice.
71 * If the grid is 'other', returns something
72 * the string used to specifiy the grid.
73 **/
74 std::string getGridLabel() const;
75
76 /**
77 * @brief Get the code name for the grid choice.
78 *
79 * Returns the code name for the grid choice, as designated
80 * by Linden Lab. The SL main grid is Agni, and the beta
81 * grid is Aditi. There are other LL testing grids with code
82 * names, but we don't care about those.
83 *
84 * This string is used primarily for fetching the proper
85 * login splash page, since the web server expects "Agni"
86 * and "Aditi", not "SL Main Grid" and "SL Beta Grid".
87 */
88 std::string getGridCodeName() const;
89
90 std::string getKnownGridLabel(EGridInfo grid_index) const;
91
92 void getLoginURIs(std::vector<std::string>& uris) const; 44 void getLoginURIs(std::vector<std::string>& uris) const;
93 std::string getHelperURI() const; 45 const std::string &getGridLabel() const;
46 const std::string &getLoginPage() const;
47 const std::string &getHelperURI() const;
94 48
95 bool isInProductionGrid(); 49 bool isOpenSimulator();
50 bool isSecondLife();
96 51
97private: 52 bool isInProductionGrid();
98 EGridInfo mGridChoice;
99 std::string mGridName;
100}; 53};
101 54
55
102const S32 MAC_ADDRESS_BYTES = 6; 56const S32 MAC_ADDRESS_BYTES = 6;
103extern unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */ 57extern unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */
104 58
59
105#endif 60#endif
diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp
index 6591cd3..51908a5 100644
--- a/linden/indra/newview/llviewerobject.cpp
+++ b/linden/indra/newview/llviewerobject.cpp
@@ -1007,6 +1007,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
1007 coloru.mV[3] = 255 - coloru.mV[3]; 1007 coloru.mV[3] = 255 - coloru.mV[3];
1008 mText->setColor(LLColor4(coloru)); 1008 mText->setColor(LLColor4(coloru));
1009 mText->setStringUTF8(temp_string); 1009 mText->setStringUTF8(temp_string);
1010// [RLVa:KB] - Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
1011 if (rlv_handler_t::isEnabled())
1012 {
1013 mText->setObjectText(temp_string);
1014 }
1015// [/RLVa:KB]
1010 1016
1011 if (mDrawable.notNull()) 1017 if (mDrawable.notNull())
1012 { 1018 {
@@ -1424,6 +1430,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
1424 coloru.mV[3] = 255 - coloru.mV[3]; 1430 coloru.mV[3] = 255 - coloru.mV[3];
1425 mText->setColor(LLColor4(coloru)); 1431 mText->setColor(LLColor4(coloru));
1426 mText->setStringUTF8(temp_string); 1432 mText->setStringUTF8(temp_string);
1433// [RLVa:KB] - Version: 1.22.11 | Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
1434 if (rlv_handler_t::isEnabled())
1435 {
1436 mText->setObjectText(temp_string);
1437 }
1438// [/RLVa:KB]
1427 1439
1428 setChanged(TEXTURE); 1440 setChanged(TEXTURE);
1429 } 1441 }
@@ -4820,7 +4832,10 @@ BOOL LLViewerObject::permTransfer() const
4820// given you modify rights to. JC 4832// given you modify rights to. JC
4821BOOL LLViewerObject::allowOpen() const 4833BOOL LLViewerObject::allowOpen() const
4822{ 4834{
4823 return !flagInventoryEmpty() && (permYouOwner() || permModify()); 4835// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0b)
4836 return !flagInventoryEmpty() && (permYouOwner() || permModify()) && (!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT));
4837// [/RLVa:KB]
4838// return !flagInventoryEmpty() && (permYouOwner() || permModify());
4824} 4839}
4825 4840
4826LLViewerObject::LLInventoryCallbackInfo::~LLInventoryCallbackInfo() 4841LLViewerObject::LLInventoryCallbackInfo::~LLInventoryCallbackInfo()
diff --git a/linden/indra/newview/llviewerobject.h b/linden/indra/newview/llviewerobject.h
index db69399..633e0eb 100644
--- a/linden/indra/newview/llviewerobject.h
+++ b/linden/indra/newview/llviewerobject.h
@@ -50,6 +50,7 @@
50#include "v3dmath.h" 50#include "v3dmath.h"
51#include "v3math.h" 51#include "v3math.h"
52#include "llvertexbuffer.h" 52#include "llvertexbuffer.h"
53#include "llpartdata.h"
53 54
54class LLAgent; // TODO: Get rid of this. 55class LLAgent; // TODO: Get rid of this.
55class LLAudioSource; 56class LLAudioSource;
diff --git a/linden/indra/newview/llviewerobjectlist.cpp b/linden/indra/newview/llviewerobjectlist.cpp
index 4961f48..059925e 100644
--- a/linden/indra/newview/llviewerobjectlist.cpp
+++ b/linden/indra/newview/llviewerobjectlist.cpp
@@ -75,6 +75,8 @@
75 75
76#include "llappviewer.h" 76#include "llappviewer.h"
77 77
78#include "primbackup.h"
79
78extern F32 gMinObjectDistance; 80extern F32 gMinObjectDistance;
79extern BOOL gAnimateTextures; 81extern BOOL gAnimateTextures;
80 82
@@ -164,7 +166,7 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,
164 166
165BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object) 167BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object)
166{ 168{
167 if(object.getRegion()) 169 if (object.mRegionp)
168 { 170 {
169 U32 local_id = object.mLocalID; 171 U32 local_id = object.mLocalID;
170 LLHost region_host = object.getRegion()->getHost(); 172 LLHost region_host = object.getRegion()->getHost();
@@ -176,8 +178,7 @@ BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object)
176 U64 indexid = (((U64)index) << 32) | (U64)local_id; 178 U64 indexid = (((U64)index) << 32) | (U64)local_id;
177 return sIndexAndLocalIDToUUID.erase(indexid) > 0 ? TRUE : FALSE; 179 return sIndexAndLocalIDToUUID.erase(indexid) > 0 ? TRUE : FALSE;
178 } 180 }
179 181 return FALSE;
180 return FALSE ;
181} 182}
182 183
183void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id, 184void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,
@@ -223,6 +224,11 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp,
223 224
224 updateActive(objectp); 225 updateActive(objectp);
225 226
227 if(!just_created)
228 primbackup::getInstance()->prim_update(objectp);
229
230
231
226 if (just_created) 232 if (just_created)
227 { 233 {
228 gPipeline.addObject(objectp); 234 gPipeline.addObject(objectp);
@@ -252,6 +258,9 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp,
252 objectp->mCreateSelected = false; 258 objectp->mCreateSelected = false;
253 gViewerWindow->getWindow()->decBusyCount(); 259 gViewerWindow->getWindow()->decBusyCount();
254 gViewerWindow->getWindow()->setCursor( UI_CURSOR_ARROW ); 260 gViewerWindow->getWindow()->setCursor( UI_CURSOR_ARROW );
261
262 primbackup::getInstance()->newprim(objectp);
263
255 } 264 }
256} 265}
257 266
@@ -828,17 +837,10 @@ void LLViewerObjectList::removeDrawable(LLDrawable* drawablep)
828 837
829 for (S32 i = 0; i < drawablep->getNumFaces(); i++) 838 for (S32 i = 0; i < drawablep->getNumFaces(); i++)
830 { 839 {
831 LLFace* facep = drawablep->getFace(i) ; 840 LLViewerObject* objectp = drawablep->getFace(i)->getViewerObject();
832 if(facep)
833 {
834 LLViewerObject* objectp = facep->getViewerObject();
835 if(objectp)
836 {
837 mSelectPickList.erase(objectp); 841 mSelectPickList.erase(objectp);
838 } 842 }
839 } 843 }
840 }
841}
842 844
843BOOL LLViewerObjectList::killObject(LLViewerObject *objectp) 845BOOL LLViewerObjectList::killObject(LLViewerObject *objectp)
844{ 846{
@@ -915,7 +917,7 @@ void LLViewerObjectList::killAllObjects()
915 if (!mMapObjects.empty()) 917 if (!mMapObjects.empty())
916 { 918 {
917 llwarns << "Some objects still on map object list!" << llendl; 919 llwarns << "Some objects still on map object list!" << llendl;
918 mMapObjects.clear(); 920 mActiveObjects.clear();
919 } 921 }
920} 922}
921 923
diff --git a/linden/indra/newview/llviewerobjectlist.h b/linden/indra/newview/llviewerobjectlist.h
index ba31f70..721bab1 100644
--- a/linden/indra/newview/llviewerobjectlist.h
+++ b/linden/indra/newview/llviewerobjectlist.h
@@ -44,6 +44,7 @@
44// project includes 44// project includes
45#include "llviewerobject.h" 45#include "llviewerobject.h"
46 46
47class LLCamera;
47class LLNetMap; 48class LLNetMap;
48class LLDebugBeacon; 49class LLDebugBeacon;
49 50
diff --git a/linden/indra/newview/llviewerregion.cpp b/linden/indra/newview/llviewerregion.cpp
index 0a01e23..19b646c 100644
--- a/linden/indra/newview/llviewerregion.cpp
+++ b/linden/indra/newview/llviewerregion.cpp
@@ -887,10 +887,12 @@ bool LLViewerRegion::isAlive()
887 887
888BOOL LLViewerRegion::isOwnedSelf(const LLVector3& pos) 888BOOL LLViewerRegion::isOwnedSelf(const LLVector3& pos)
889{ 889{
890 if (mParcelOverlay) 890 if (mParcelOverlay && !gDisconnected)
891 { 891 {
892 return mParcelOverlay->isOwnedSelf(pos); 892 return mParcelOverlay->isOwnedSelf(pos);
893 } else { 893 }
894 else
895 {
894 return FALSE; 896 return FALSE;
895 } 897 }
896} 898}
diff --git a/linden/indra/newview/llviewertexteditor.cpp b/linden/indra/newview/llviewertexteditor.cpp
index 46908f5..5e131b9 100644
--- a/linden/indra/newview/llviewertexteditor.cpp
+++ b/linden/indra/newview/llviewertexteditor.cpp
@@ -96,6 +96,13 @@ public:
96 } 96 }
97 else 97 else
98 { 98 {
99// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
100 if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWNOTE)) )
101 {
102 return;
103 }
104// [/RLVa:KB]
105
99 // See if we can bring an existing preview to the front 106 // See if we can bring an existing preview to the front
100 if(!LLPreview::show(item->getUUID(), true)) 107 if(!LLPreview::show(item->getUUID(), true))
101 { 108 {
@@ -896,51 +903,9 @@ BOOL LLViewerTextEditor::handleHover(S32 x, S32 y, MASK mask)
896 903
897BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) 904BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
898{ 905{
899 BOOL handled = FALSE; 906 BOOL handled = FALSE;
900
901 // let scrollbar have first dibs
902 handled = LLView::childrenHandleMouseUp(x, y, mask) != NULL;
903
904 // Used to enable I Agree checkbox if the user scrolled through entire text
905 BOOL was_scrolled_to_bottom = (mScrollbar->getDocPos() == mScrollbar->getDocPosMax());
906 if (mOnScrollEndCallback && was_scrolled_to_bottom)
907 {
908 mOnScrollEndCallback(mOnScrollEndData);
909 }
910
911 if( !handled && mTakesNonScrollClicks)
912 {
913 if( mIsSelecting )
914 {
915 // Finish selection
916 if( y > getTextRect().mTop )
917 {
918 mScrollbar->setDocPos( mScrollbar->getDocPos() - 1 );
919 }
920 else
921 if( y < getTextRect().mBottom )
922 {
923 mScrollbar->setDocPos( mScrollbar->getDocPos() + 1 );
924 }
925
926 setCursorAtLocalPos( x, y, TRUE );
927 endSelection();
928
929 updateScrollFromCursor();
930 }
931
932 if( !hasSelection() )
933 {
934 handleMouseUpOverSegment( x, y, mask );
935 }
936
937 handled = TRUE;
938 }
939
940 // Delay cursor flashing
941 resetKeystrokeTimer();
942 907
943 if( hasMouseCapture() ) 908 if( hasMouseCapture() )
944 { 909 {
945 if (mDragItem) 910 if (mDragItem)
946 { 911 {
@@ -960,8 +925,15 @@ BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
960 } 925 }
961 } 926 }
962 mDragItem = NULL; 927 mDragItem = NULL;
963 gFocusMgr.setMouseCapture( NULL ); 928 }
964 handled = TRUE; 929
930 handled = LLTextEditor::handleMouseUp(x,y,mask);
931
932 // Used to enable I Agree checkbox if the user scrolled through entire text
933 BOOL was_scrolled_to_bottom = (mScrollbar->getDocPos() == mScrollbar->getDocPosMax());
934 if (mOnScrollEndCallback && was_scrolled_to_bottom)
935 {
936 mOnScrollEndCallback(mOnScrollEndData);
965 } 937 }
966 938
967 return handled; 939 return handled;
@@ -1003,6 +975,24 @@ BOOL LLViewerTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
1003 return handled; 975 return handled;
1004} 976}
1005 977
978BOOL LLViewerTextEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
979{
980 BOOL handled = FALSE;
981 handled = childrenHandleMiddleMouseDown(x, y, mask) != NULL;
982 if (!handled)
983 {
984 handled = LLTextEditor::handleMiddleMouseDown(x, y, mask);
985 }
986 return handled;
987}
988
989BOOL LLViewerTextEditor::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
990{
991 BOOL handled = childrenHandleMiddleMouseUp(x, y, mask) != NULL;
992
993 return handled;
994}
995
1006BOOL LLViewerTextEditor::handleDoubleClick(S32 x, S32 y, MASK mask) 996BOOL LLViewerTextEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
1007{ 997{
1008 BOOL handled = FALSE; 998 BOOL handled = FALSE;
@@ -1025,7 +1015,6 @@ BOOL LLViewerTextEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
1025 } 1015 }
1026 } 1016 }
1027 } 1017 }
1028
1029 1018
1030 setCursorAtLocalPos( x, y, FALSE ); 1019 setCursorAtLocalPos( x, y, FALSE );
1031 deselect(); 1020 deselect();
@@ -1063,6 +1052,9 @@ BOOL LLViewerTextEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
1063 // delay cursor flashing 1052 // delay cursor flashing
1064 resetKeystrokeTimer(); 1053 resetKeystrokeTimer();
1065 1054
1055 // take selection to 'primary' clipboard
1056 updatePrimary();
1057
1066 handled = TRUE; 1058 handled = TRUE;
1067 } 1059 }
1068 return handled; 1060 return handled;
diff --git a/linden/indra/newview/llviewertexteditor.h b/linden/indra/newview/llviewertexteditor.h
index ae672d8..f29caee 100644
--- a/linden/indra/newview/llviewertexteditor.h
+++ b/linden/indra/newview/llviewertexteditor.h
@@ -59,6 +59,8 @@ public:
59 // mousehandler overrides 59 // mousehandler overrides
60 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); 60 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
61 virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); 61 virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
62 virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
63 virtual BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask);
62 virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); 64 virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
63 virtual BOOL handleHover(S32 x, S32 y, MASK mask); 65 virtual BOOL handleHover(S32 x, S32 y, MASK mask);
64 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask ); 66 virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask );
diff --git a/linden/indra/newview/llviewerthrottle.cpp b/linden/indra/newview/llviewerthrottle.cpp
index bf779c4..246e5e4 100644
--- a/linden/indra/newview/llviewerthrottle.cpp
+++ b/linden/indra/newview/llviewerthrottle.cpp
@@ -50,7 +50,7 @@ const F32 MAX_FRACTIONAL = 1.5f;
50const F32 MIN_FRACTIONAL = 0.2f; 50const F32 MIN_FRACTIONAL = 0.2f;
51 51
52const F32 MIN_BANDWIDTH = 50.f; 52const F32 MIN_BANDWIDTH = 50.f;
53const F32 MAX_BANDWIDTH = 1500.f; 53const F32 MAX_BANDWIDTH = 5000.f;
54const F32 STEP_FRACTIONAL = 0.1f; 54const F32 STEP_FRACTIONAL = 0.1f;
55const F32 TIGHTEN_THROTTLE_THRESHOLD = 3.0f; // packet loss % per s 55const F32 TIGHTEN_THROTTLE_THRESHOLD = 3.0f; // packet loss % per s
56const F32 EASE_THROTTLE_THRESHOLD = 0.5f; // packet loss % per s 56const F32 EASE_THROTTLE_THRESHOLD = 0.5f; // packet loss % per s
diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp
index c0e4fed..022515a 100644
--- a/linden/indra/newview/llviewerwindow.cpp
+++ b/linden/indra/newview/llviewerwindow.cpp
@@ -589,19 +589,42 @@ bool LLViewerWindow::shouldShowToolTipFor(LLMouseHandler *mh)
589 return false; 589 return false;
590} 590}
591 591
592BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask) 592BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
593{ 593{
594 std::string buttonname;
595 std::string buttonstatestr;
596 BOOL handled = FALSE;
594 S32 x = pos.mX; 597 S32 x = pos.mX;
595 S32 y = pos.mY; 598 S32 y = pos.mY;
596 x = llround((F32)x / mDisplayScale.mV[VX]); 599 x = llround((F32)x / mDisplayScale.mV[VX]);
597 y = llround((F32)y / mDisplayScale.mV[VY]); 600 y = llround((F32)y / mDisplayScale.mV[VY]);
598 601
599 LLView::sMouseHandlerMessage.clear(); 602 if (down)
600 603 buttonstatestr = "down" ;
601 if (gDebugClicks) 604 else
605 buttonstatestr = "up" ;
606
607 switch (clicktype)
602 { 608 {
603 llinfos << "ViewerWindow left mouse down at " << x << "," << y << llendl; 609 case LLMouseHandler::CLICK_LEFT:
610 mLeftMouseDown = down;
611 buttonname = "Left";
612 break;
613 case LLMouseHandler::CLICK_RIGHT:
614 mRightMouseDown = down;
615 buttonname = "Right";
616 break;
617 case LLMouseHandler::CLICK_MIDDLE:
618 mMiddleMouseDown = down;
619 buttonname = "Middle";
620 break;
621 case LLMouseHandler::CLICK_DOUBLELEFT:
622 mLeftMouseDown = down;
623 buttonname = "Left Double Click";
624 break;
604 } 625 }
626
627 LLView::sMouseHandlerMessage.clear();
605 628
606 if (gMenuBarView) 629 if (gMenuBarView)
607 { 630 {
@@ -609,18 +632,28 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
609 gMenuBarView->resetMenuTrigger(); 632 gMenuBarView->resetMenuTrigger();
610 } 633 }
611 634
612 mLeftMouseDown = TRUE; 635 if (gDebugClicks)
636 {
637 llinfos << "ViewerWindow " << buttonname << " mouse " << buttonstatestr << " at " << x << "," << y << llendl;
638 }
613 639
614 // Make sure we get a coresponding mouseup event, even if the mouse leaves the window 640 // Make sure we get a coresponding mouseup event, even if the mouse leaves the window
615 mWindow->captureMouse(); 641 if (down)
642 {
643 mWindow->captureMouse();
644 }
645 else
646 {
647 mWindow->releaseMouse();
648 }
616 649
617 // Indicate mouse was active 650 // Indicate mouse was active
618 gMouseIdleTimer.reset(); 651 gMouseIdleTimer.reset();
619 652
620 // Hide tooltips on mousedown 653 // Hide tooltips on mousedown
621 mToolTipBlocked = TRUE; 654 mToolTipBlocked = down;
622 655
623 // Also hide hover info on mousedown 656 // Also hide hover info on mousedown/mouseup
624 if (gHoverView) 657 if (gHoverView)
625 { 658 {
626 gHoverView->cancelHover(); 659 gHoverView->cancelHover();
@@ -629,7 +662,7 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
629 // Don't let the user move the mouse out of the window until mouse up. 662 // Don't let the user move the mouse out of the window until mouse up.
630 if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() ) 663 if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() )
631 { 664 {
632 mWindow->setMouseClipping(TRUE); 665 mWindow->setMouseClipping(down);
633 } 666 }
634 667
635 LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture(); 668 LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
@@ -640,10 +673,9 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
640 mouse_captor->screenPointToLocal( x, y, &local_x, &local_y ); 673 mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
641 if (LLView::sDebugMouseHandling) 674 if (LLView::sDebugMouseHandling)
642 { 675 {
643 llinfos << "Left Mouse Down handled by captor " << mouse_captor->getName() << llendl; 676 llinfos << buttonname << " Mouse " << buttonstatestr << " handled by captor " << mouse_captor->getName() << llendl;
644 } 677 }
645 678 return mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down);
646 return mouse_captor->handleMouseDown(local_x, local_y, mask);
647 } 679 }
648 680
649 // Topmost view gets a chance before the hierarchy 681 // Topmost view gets a chance before the hierarchy
@@ -652,215 +684,95 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
652 { 684 {
653 S32 local_x, local_y; 685 S32 local_x, local_y;
654 top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); 686 top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
655 if (top_ctrl->pointInView(local_x, local_y)) 687 if (down)
656 { 688 {
657 return top_ctrl->handleMouseDown(local_x, local_y, mask); 689 if (top_ctrl->pointInView(local_x, local_y))
658 } 690 {
659 else 691 return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down) ;
660 { 692 }
661 gFocusMgr.setTopCtrl(NULL); 693 else
694 {
695 gFocusMgr.setTopCtrl(NULL);
696 }
662 } 697 }
663 } 698 else
699 handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask);
700
664 701
702 }
665 // Give the UI views a chance to process the click 703 // Give the UI views a chance to process the click
666 if( mRootView->handleMouseDown(x, y, mask) ) 704 if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) )
667 { 705 {
668 if (LLView::sDebugMouseHandling) 706 if (LLView::sDebugMouseHandling)
669 { 707 {
670 llinfos << "Left Mouse Down" << LLView::sMouseHandlerMessage << llendl; 708 llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl;
671 } 709 }
672 return TRUE; 710 return TRUE;
673 } 711 }
674 else if (LLView::sDebugMouseHandling) 712 else if (LLView::sDebugMouseHandling)
675 { 713 {
676 llinfos << "Left Mouse Down not handled by view" << llendl; 714 llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl;
677 } 715 }
678 716 if (down)
679 if (gDisconnected)
680 { 717 {
681 return FALSE; 718 if (gDisconnected)
682 }
683
684 if(LLToolMgr::getInstance()->getCurrentTool()->handleMouseDown( x, y, mask ) )
685 {
686 // This is necessary to force clicks in the world to cause edit
687 // boxes that might have keyboard focus to relinquish it, and hence
688 // cause a commit to update their value. JC
689 gFocusMgr.setKeyboardFocus(NULL);
690 return TRUE;
691 }
692
693 return FALSE;
694}
695
696BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK mask)
697{
698 S32 x = pos.mX;
699 S32 y = pos.mY;
700 x = llround((F32)x / mDisplayScale.mV[VX]);
701 y = llround((F32)y / mDisplayScale.mV[VY]);
702
703 LLView::sMouseHandlerMessage.clear();
704
705 if (gDebugClicks)
706 {
707 llinfos << "ViewerWindow left mouse double-click at " << x << "," << y << llendl;
708 }
709
710 mLeftMouseDown = TRUE;
711
712 // Hide tooltips
713 if( mToolTip )
714 {
715 mToolTip->setVisible( FALSE );
716 }
717
718 LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
719 if( mouse_captor )
720 {
721 S32 local_x;
722 S32 local_y;
723 mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
724 if (LLView::sDebugMouseHandling)
725 { 719 {
726 llinfos << "Left Mouse Down handled by captor " << mouse_captor->getName() << llendl; 720 return FALSE;
727 }
728
729 return mouse_captor->handleDoubleClick(local_x, local_y, mask);
730 }
731
732 // Check for hit on UI.
733 LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
734 if (top_ctrl)
735 {
736 S32 local_x, local_y;
737 top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
738 if (top_ctrl->pointInView(local_x, local_y))
739 {
740 return top_ctrl->handleDoubleClick(local_x, local_y, mask);
741 } 721 }
742 else 722
723 if(LLToolMgr::getInstance()->getCurrentTool()->handleAnyMouseClick( x, y, mask, clicktype, down ) )
743 { 724 {
744 gFocusMgr.setTopCtrl(NULL); 725 // This is necessary to force clicks in the world to cause edit
726 // boxes that might have keyboard focus to relinquish it, and hence
727 // cause a commit to update their value. JC
728 gFocusMgr.setKeyboardFocus(NULL);
729 return TRUE;
745 } 730 }
746 } 731 }
747 732 else
748 if (mRootView->handleDoubleClick(x, y, mask))
749 { 733 {
750 if (LLView::sDebugMouseHandling) 734
735 mWindow->releaseMouse();
736
737 LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
738 if( !handled )
751 { 739 {
752 llinfos << "Left Mouse Down" << LLView::sMouseHandlerMessage << llendl; 740 handled = mRootView->handleAnyMouseClick(x, y, mask, clicktype, down);
741 }
742
743
744
745 if( !handled )
746 {
747 if (tool)
748 {
749 handled = tool->handleAnyMouseClick(x, y, mask, clicktype, down);
750 }
753 } 751 }
754 return TRUE;
755 }
756 else if (LLView::sDebugMouseHandling)
757 {
758 llinfos << "Left Mouse Down not handled by view" << llendl;
759 } 752 }
760 753
761 // Why is this here? JC 9/3/2002 754 return (!down);
762 if (gNoRender) 755}
763 {
764 return TRUE;
765 }
766 756
767 if(LLToolMgr::getInstance()->getCurrentTool()->handleDoubleClick( x, y, mask ) ) 757BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
768 { 758{
769 return TRUE; 759 BOOL down = TRUE;
770 } 760 return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_LEFT,down);
761}
771 762
772 // if we got this far and nothing handled a double click, pass a normal mouse down 763BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK mask)
773 return handleMouseDown(window, pos, mask); 764{
765 // try handling as a double-click first, then a single-click if that
766 // wasn't handled.
767 BOOL down = TRUE;
768 return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_DOUBLELEFT,down) ||
769 handleMouseDown(window, pos, mask);
774} 770}
775 771
776BOOL LLViewerWindow::handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask) 772BOOL LLViewerWindow::handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
777{ 773{
778 S32 x = pos.mX; 774 BOOL down = FALSE;
779 S32 y = pos.mY; 775 return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_LEFT,down);
780 x = llround((F32)x / mDisplayScale.mV[VX]);
781 y = llround((F32)y / mDisplayScale.mV[VY]);
782
783 LLView::sMouseHandlerMessage.clear();
784
785 if (gDebugClicks)
786 {
787 llinfos << "ViewerWindow left mouse up" << llendl;
788 }
789
790 mLeftMouseDown = FALSE;
791
792 // Indicate mouse was active
793 gMouseIdleTimer.reset();
794
795 // Hide tooltips on mouseup
796 if( mToolTip )
797 {
798 mToolTip->setVisible( FALSE );
799 }
800
801 // Also hide hover info on mouseup
802 if (gHoverView) gHoverView->cancelHover();
803
804 BOOL handled = FALSE;
805
806 mWindow->releaseMouse();
807
808 LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
809
810 if( tool->clipMouseWhenDown() )
811 {
812 mWindow->setMouseClipping(FALSE);
813 }
814
815 LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
816 if( mouse_captor )
817 {
818 S32 local_x;
819 S32 local_y;
820 mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
821 if (LLView::sDebugMouseHandling)
822 {
823 llinfos << "Left Mouse Up handled by captor " << mouse_captor->getName() << llendl;
824 }
825
826 return mouse_captor->handleMouseUp(local_x, local_y, mask);
827 }
828
829 LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
830 if (top_ctrl)
831 {
832 S32 local_x, local_y;
833 top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
834 handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask);
835 }
836
837 if( !handled )
838 {
839 handled = mRootView->handleMouseUp(x, y, mask);
840 }
841
842 if (LLView::sDebugMouseHandling)
843 {
844 if (handled)
845 {
846 llinfos << "Left Mouse Up" << LLView::sMouseHandlerMessage << llendl;
847 }
848 else
849 {
850 llinfos << "Left Mouse Up not handled by view" << llendl;
851 }
852 }
853
854 if( !handled )
855 {
856 if (tool)
857 {
858 handled = tool->handleMouseUp(x, y, mask);
859 }
860 }
861
862 // Always handled as far as the OS is concerned.
863 return TRUE;
864} 776}
865 777
866 778
@@ -871,91 +783,10 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK
871 x = llround((F32)x / mDisplayScale.mV[VX]); 783 x = llround((F32)x / mDisplayScale.mV[VX]);
872 y = llround((F32)y / mDisplayScale.mV[VY]); 784 y = llround((F32)y / mDisplayScale.mV[VY]);
873 785
874 LLView::sMouseHandlerMessage.clear(); 786 BOOL down = TRUE;
875 787 BOOL handle = handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_RIGHT,down);
876 if (gDebugClicks) 788 if (handle)
877 { 789 return handle;
878 llinfos << "ViewerWindow right mouse down at " << x << "," << y << llendl;
879 }
880
881 if (gMenuBarView)
882 {
883 // stop ALT-key access to menu
884 gMenuBarView->resetMenuTrigger();
885 }
886
887 mRightMouseDown = TRUE;
888
889 // Make sure we get a coresponding mouseup event, even if the mouse leaves the window
890 mWindow->captureMouse();
891
892 // Hide tooltips
893 if( mToolTip )
894 {
895 mToolTip->setVisible( FALSE );
896 }
897
898 // Also hide hover info on mousedown
899 if (gHoverView)
900 {
901 gHoverView->cancelHover();
902 }
903
904 // Don't let the user move the mouse out of the window until mouse up.
905 if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() )
906 {
907 mWindow->setMouseClipping(TRUE);
908 }
909
910 LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
911 if( mouse_captor )
912 {
913 S32 local_x;
914 S32 local_y;
915 mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
916 if (LLView::sDebugMouseHandling)
917 {
918 llinfos << "Right Mouse Down handled by captor " << mouse_captor->getName() << llendl;
919 }
920 return mouse_captor->handleRightMouseDown(local_x, local_y, mask);
921 }
922
923 LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
924 if (top_ctrl)
925 {
926 S32 local_x, local_y;
927 top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
928 if (top_ctrl->pointInView(local_x, local_y))
929 {
930 return top_ctrl->handleRightMouseDown(local_x, local_y, mask);
931 }
932 else
933 {
934 gFocusMgr.setTopCtrl(NULL);
935 }
936 }
937
938 if( mRootView->handleRightMouseDown(x, y, mask) )
939 {
940 if (LLView::sDebugMouseHandling)
941 {
942 llinfos << "Right Mouse Down" << LLView::sMouseHandlerMessage << llendl;
943 }
944 return TRUE;
945 }
946 else if (LLView::sDebugMouseHandling)
947 {
948 llinfos << "Right Mouse Down not handled by view" << llendl;
949 }
950
951 if(LLToolMgr::getInstance()->getCurrentTool()->handleRightMouseDown( x, y, mask ) )
952 {
953 // This is necessary to force clicks in the world to cause edit
954 // boxes that might have keyboard focus to relinquish it, and hence
955 // cause a commit to update their value. JC
956 gFocusMgr.setKeyboardFocus(NULL);
957 return TRUE;
958 }
959 790
960 // *HACK: this should be rolled into the composite tool logic, not 791 // *HACK: this should be rolled into the composite tool logic, not
961 // hardcoded at the top level. 792 // hardcoded at the top level.
@@ -973,107 +804,27 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK
973 804
974BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask) 805BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
975{ 806{
976 S32 x = pos.mX; 807 BOOL down = FALSE;
977 S32 y = pos.mY; 808 return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_RIGHT,down);
978 x = llround((F32)x / mDisplayScale.mV[VX]);
979 y = llround((F32)y / mDisplayScale.mV[VY]);
980
981 LLView::sMouseHandlerMessage.clear();
982
983 // Don't care about caps lock for mouse events.
984 if (gDebugClicks)
985 {
986 llinfos << "ViewerWindow right mouse up" << llendl;
987 }
988
989 mRightMouseDown = FALSE;
990
991 // Indicate mouse was active
992 gMouseIdleTimer.reset();
993
994 // Hide tooltips on mouseup
995 if( mToolTip )
996 {
997 mToolTip->setVisible( FALSE );
998 }
999
1000 // Also hide hover info on mouseup
1001 if (gHoverView) gHoverView->cancelHover();
1002
1003 BOOL handled = FALSE;
1004
1005 mWindow->releaseMouse();
1006
1007 LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
1008
1009 if( tool->clipMouseWhenDown() )
1010 {
1011 mWindow->setMouseClipping(FALSE);
1012 }
1013
1014 LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
1015 if( mouse_captor )
1016 {
1017 S32 local_x;
1018 S32 local_y;
1019 mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
1020 if (LLView::sDebugMouseHandling)
1021 {
1022 llinfos << "Right Mouse Up handled by captor " << mouse_captor->getName() << llendl;
1023 }
1024 return mouse_captor->handleRightMouseUp(local_x, local_y, mask);
1025 }
1026
1027 LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
1028 if (top_ctrl)
1029 {
1030 S32 local_x, local_y;
1031 top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
1032 handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleRightMouseUp(local_x, local_y, mask);
1033 }
1034
1035 if( !handled )
1036 {
1037 handled = mRootView->handleRightMouseUp(x, y, mask);
1038 }
1039
1040 if (LLView::sDebugMouseHandling)
1041 {
1042 if (handled)
1043 {
1044 llinfos << "Right Mouse Up" << LLView::sMouseHandlerMessage << llendl;
1045 }
1046 else
1047 {
1048 llinfos << "Right Mouse Up not handled by view" << llendl;
1049 }
1050 }
1051
1052 if( !handled )
1053 {
1054 if (tool)
1055 {
1056 handled = tool->handleRightMouseUp(x, y, mask);
1057 }
1058 }
1059
1060 // Always handled as far as the OS is concerned.
1061 return TRUE;
1062} 809}
1063 810
1064BOOL LLViewerWindow::handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask) 811BOOL LLViewerWindow::handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
1065{ 812{
813 BOOL down = TRUE;
1066 gVoiceClient->middleMouseState(true); 814 gVoiceClient->middleMouseState(true);
1067 815 handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down);
1068 // Always handled as far as the OS is concerned. 816
817 // Always handled as far as the OS is concerned.
1069 return TRUE; 818 return TRUE;
1070} 819}
1071 820
1072BOOL LLViewerWindow::handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask) 821BOOL LLViewerWindow::handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
1073{ 822{
823 BOOL down = FALSE;
1074 gVoiceClient->middleMouseState(false); 824 gVoiceClient->middleMouseState(false);
1075 825 handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down);
1076 // Always handled as far as the OS is concerned. 826
827 // Always handled as far as the OS is concerned.
1077 return TRUE; 828 return TRUE;
1078} 829}
1079 830
@@ -1447,6 +1198,7 @@ LLViewerWindow::LLViewerWindow(
1447 mWindowRect(0, height, width, 0), 1198 mWindowRect(0, height, width, 0),
1448 mVirtualWindowRect(0, height, width, 0), 1199 mVirtualWindowRect(0, height, width, 0),
1449 mLeftMouseDown(FALSE), 1200 mLeftMouseDown(FALSE),
1201 mMiddleMouseDown(FALSE),
1450 mRightMouseDown(FALSE), 1202 mRightMouseDown(FALSE),
1451 mToolTip(NULL), 1203 mToolTip(NULL),
1452 mToolTipBlocked(FALSE), 1204 mToolTipBlocked(FALSE),
@@ -1887,69 +1639,82 @@ void LLViewerWindow::initWorldUI()
1887 S32 width = mRootView->getRect().getWidth(); 1639 S32 width = mRootView->getRect().getWidth();
1888 LLRect full_window(0, height, width, 0); 1640 LLRect full_window(0, height, width, 0);
1889 1641
1890 if ( gBottomPanel == NULL ) // Don't re-enter if objects are alreay created 1642 if (gBottomPanel)
1891 { 1643 mRootView->removeChild(gBottomPanel, TRUE);
1892 // panel containing chatbar, toolbar, and overlay, over floaters 1644 // panel containing chatbar, toolbar, and overlay, over floaters
1893 gBottomPanel = new LLBottomPanel(mRootView->getRect()); 1645 gBottomPanel = new LLBottomPanel(mRootView->getRect());
1894 mRootView->addChild(gBottomPanel); 1646 mRootView->addChild(gBottomPanel);
1895 1647
1896 // View for hover information 1648 if (gHoverView)
1897 gHoverView = new LLHoverView(std::string("gHoverView"), full_window); 1649 mRootView->removeChild(gHoverView, TRUE);
1898 gHoverView->setVisible(TRUE); 1650 // View for hover information
1899 mRootView->addChild(gHoverView); 1651 gHoverView = new LLHoverView(std::string("gHoverView"), full_window);
1652 gHoverView->setVisible(TRUE);
1653 mRootView->addChild(gHoverView);
1900 1654
1901 gIMMgr = LLIMMgr::getInstance(); 1655 gIMMgr = LLIMMgr::getInstance();
1902 1656
1903 if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") ) 1657 if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
1904 { 1658 {
1905 LLFloaterChat::getInstance(LLSD())->loadHistory(); 1659 LLFloaterChat::getInstance(LLSD())->loadHistory();
1906 } 1660 }
1907 1661
1908 LLRect morph_view_rect = full_window; 1662 LLRect morph_view_rect = full_window;
1909 morph_view_rect.stretch( -STATUS_BAR_HEIGHT ); 1663 morph_view_rect.stretch( -STATUS_BAR_HEIGHT );
1910 morph_view_rect.mTop = full_window.mTop - 32; 1664 morph_view_rect.mTop = full_window.mTop - 32;
1911 gMorphView = new LLMorphView(std::string("gMorphView"), morph_view_rect ); 1665 if (gMorphView)
1912 mRootView->addChild(gMorphView); 1666 mRootView->removeChild(gMorphView, TRUE);
1913 gMorphView->setVisible(FALSE);
1914 1667
1915 // *Note: this is where gFloaterMute used to be initialized. 1668 gMorphView = new LLMorphView(std::string("gMorphView"), morph_view_rect );
1669 mRootView->addChild(gMorphView);
1670 gMorphView->setVisible(FALSE);
1916 1671
1917 LLWorldMapView::initClass(); 1672 // *Note: this is where gFloaterMute used to be initialized.
1918 1673
1919 adjust_rect_centered_partial_zoom("FloaterWorldMapRect2", full_window); 1674 LLWorldMapView::initClass();
1920 1675
1676 adjust_rect_centered_partial_zoom("FloaterWorldMapRect2", full_window);
1677
1678 if (!gFloaterWorldMap)
1679 {
1921 gFloaterWorldMap = new LLFloaterWorldMap(); 1680 gFloaterWorldMap = new LLFloaterWorldMap();
1922 gFloaterWorldMap->setVisible(FALSE); 1681 gFloaterWorldMap->setVisible(FALSE);
1682 }
1923 1683
1924 // 1684 //
1925 // Tools for building 1685 // Tools for building
1926 // 1686 //
1927
1928 // Toolbox floater
1929 init_menus();
1930 1687
1688 // Toolbox floater
1689 init_menus();
1690 if (!gFloaterTools)
1691 {
1931 gFloaterTools = new LLFloaterTools(); 1692 gFloaterTools = new LLFloaterTools();
1932 gFloaterTools->setVisible(FALSE); 1693 gFloaterTools->setVisible(FALSE);
1694 }
1933 1695
1696 if (!gStatusBar)
1697 {
1934 // Status bar 1698 // Status bar
1935 S32 menu_bar_height = gMenuBarView->getRect().getHeight(); 1699 S32 menu_bar_height = gMenuBarView->getRect().getHeight();
1936 LLRect root_rect = getRootView()->getRect(); 1700 LLRect root_rect = mRootView->getRect();
1937 LLRect status_rect(0, root_rect.getHeight(), root_rect.getWidth(), root_rect.getHeight() - menu_bar_height); 1701 LLRect status_rect(0, root_rect.getHeight(), root_rect.getWidth(), root_rect.getHeight() - menu_bar_height);
1938 gStatusBar = new LLStatusBar(std::string("status"), status_rect); 1702 gStatusBar = new LLStatusBar(std::string("status"), status_rect);
1939 gStatusBar->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP); 1703 gStatusBar->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP);
1940 1704
1941 gStatusBar->reshape(root_rect.getWidth(), gStatusBar->getRect().getHeight(), TRUE); 1705 gStatusBar->reshape(root_rect.getWidth(), gStatusBar->getRect().getHeight(), TRUE);
1942 gStatusBar->translate(0, root_rect.getHeight() - gStatusBar->getRect().getHeight()); 1706 gStatusBar->translate(0, root_rect.getHeight() - gStatusBar->getRect().getHeight());
1943 // sync bg color with menu bar 1707 // sync bg color with menu bar
1944 gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor() ); 1708 gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor() );
1709 mRootView->addChild(gStatusBar);
1710 }
1945 1711
1946 LLFloaterChatterBox::createInstance(LLSD()); 1712 LLFloaterChatterBox::createInstance(LLSD());
1947 1713
1948 getRootView()->addChild(gStatusBar);
1949 1714
1950 // menu holder appears on top to get first pass at all mouse events 1715 // menu holder appears on top to get first pass at all mouse events
1951 getRootView()->sendChildToFront(gMenuHolder); 1716
1952 } 1717 mRootView->sendChildToFront(gMenuHolder);
1953} 1718}
1954 1719
1955// Destroy the UI 1720// Destroy the UI
@@ -3311,6 +3076,16 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
3311 { 3076 {
3312 moveable_object_selected = TRUE; 3077 moveable_object_selected = TRUE;
3313 this_object_movable = TRUE; 3078 this_object_movable = TRUE;
3079
3080// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0g
3081 if ( (rlv_handler_t::isEnabled()) &&
3082 ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP))) )
3083 {
3084 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
3085 if ( (pAvatar) && (pAvatar->mIsSitting) && (pAvatar->getRoot() == object->getRootEdit()) )
3086 moveable_object_selected = this_object_movable = FALSE;
3087 }
3088// [/RLVa:KB]
3314 } 3089 }
3315 all_selected_objects_move = all_selected_objects_move && this_object_movable; 3090 all_selected_objects_move = all_selected_objects_move && this_object_movable;
3316 all_selected_objects_modify = all_selected_objects_modify && object->permModify(); 3091 all_selected_objects_modify = all_selected_objects_modify && object->permModify();
@@ -5151,7 +4926,6 @@ void LLBottomPanel::draw()
5151 4926
5152void* LLBottomPanel::createHUD(void* data) 4927void* LLBottomPanel::createHUD(void* data)
5153{ 4928{
5154 delete gHUDView;
5155 gHUDView = new LLHUDView(); 4929 gHUDView = new LLHUDView();
5156 return gHUDView; 4930 return gHUDView;
5157} 4931}
@@ -5159,14 +4933,12 @@ void* LLBottomPanel::createHUD(void* data)
5159 4933
5160void* LLBottomPanel::createOverlayBar(void* data) 4934void* LLBottomPanel::createOverlayBar(void* data)
5161{ 4935{
5162 delete gOverlayBar;
5163 gOverlayBar = new LLOverlayBar(); 4936 gOverlayBar = new LLOverlayBar();
5164 return gOverlayBar; 4937 return gOverlayBar;
5165} 4938}
5166 4939
5167void* LLBottomPanel::createToolBar(void* data) 4940void* LLBottomPanel::createToolBar(void* data)
5168{ 4941{
5169 delete gToolBar;
5170 gToolBar = new LLToolBar(); 4942 gToolBar = new LLToolBar();
5171 return gToolBar; 4943 return gToolBar;
5172} 4944}
diff --git a/linden/indra/newview/llviewerwindow.h b/linden/indra/newview/llviewerwindow.h
index 79828f1..74edd2e 100644
--- a/linden/indra/newview/llviewerwindow.h
+++ b/linden/indra/newview/llviewerwindow.h
@@ -49,6 +49,7 @@
49#include "llstat.h" 49#include "llstat.h"
50#include "llalertdialog.h" 50#include "llalertdialog.h"
51#include "llnotifications.h" 51#include "llnotifications.h"
52#include "llmousehandler.h"
52 53
53class LLView; 54class LLView;
54class LLViewerObject; 55class LLViewerObject;
@@ -59,7 +60,6 @@ class LLVelocityBar;
59class LLTextBox; 60class LLTextBox;
60class LLImageRaw; 61class LLImageRaw;
61class LLHUDIcon; 62class LLHUDIcon;
62class LLMouseHandler;
63 63
64#define PICK_HALF_WIDTH 5 64#define PICK_HALF_WIDTH 5
65#define PICK_DIAMETER (2 * PICK_HALF_WIDTH + 1) 65#define PICK_DIAMETER (2 * PICK_HALF_WIDTH + 1)
@@ -83,7 +83,7 @@ public:
83 83
84 static bool isFlora(LLViewerObject* object); 84 static bool isFlora(LLViewerObject* object);
85 85
86 typedef enum e_pick_type 86 typedef enum
87 { 87 {
88 PICK_OBJECT, 88 PICK_OBJECT,
89 PICK_FLORA, 89 PICK_FLORA,
@@ -152,6 +152,7 @@ public:
152 /*virtual*/ BOOL handleTranslatedKeyUp(KEY key, MASK mask); 152 /*virtual*/ BOOL handleTranslatedKeyUp(KEY key, MASK mask);
153 /*virtual*/ void handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level); 153 /*virtual*/ void handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level);
154 /*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, MASK mask); // NOT going to handle extended 154 /*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, MASK mask); // NOT going to handle extended
155 /*virtual*/ BOOL handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
155 /*virtual*/ BOOL handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask); 156 /*virtual*/ BOOL handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
156 /*virtual*/ BOOL handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask); 157 /*virtual*/ BOOL handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
157 /*virtual*/ BOOL handleCloseRequest(LLWindow *window); 158 /*virtual*/ BOOL handleCloseRequest(LLWindow *window);
@@ -214,6 +215,7 @@ public:
214 LLCoordGL getCurrentMouseDelta() const { return mCurrentMouseDelta; } 215 LLCoordGL getCurrentMouseDelta() const { return mCurrentMouseDelta; }
215 LLStat * getMouseVelocityStat() { return &mMouseVelocityStat; } 216 LLStat * getMouseVelocityStat() { return &mMouseVelocityStat; }
216 BOOL getLeftMouseDown() const { return mLeftMouseDown; } 217 BOOL getLeftMouseDown() const { return mLeftMouseDown; }
218 BOOL getMiddleMouseDown() const { return mMiddleMouseDown; }
217 BOOL getRightMouseDown() const { return mRightMouseDown; } 219 BOOL getRightMouseDown() const { return mRightMouseDown; }
218 220
219 const LLPickInfo& getLastPick() const { return mLastPick; } 221 const LLPickInfo& getLastPick() const { return mLastPick; }
@@ -281,7 +283,7 @@ public:
281 283
282 // snapshot functionality. 284 // snapshot functionality.
283 // perhaps some of this should move to llfloatershapshot? -MG 285 // perhaps some of this should move to llfloatershapshot? -MG
284 typedef enum e_snapshot_type 286 typedef enum
285 { 287 {
286 SNAPSHOT_TYPE_COLOR, 288 SNAPSHOT_TYPE_COLOR,
287 SNAPSHOT_TYPE_DEPTH, 289 SNAPSHOT_TYPE_DEPTH,
@@ -390,6 +392,7 @@ protected:
390 LLCoordGL mCurrentMouseDelta; //amount mouse moved this frame 392 LLCoordGL mCurrentMouseDelta; //amount mouse moved this frame
391 LLStat mMouseVelocityStat; 393 LLStat mMouseVelocityStat;
392 BOOL mLeftMouseDown; 394 BOOL mLeftMouseDown;
395 BOOL mMiddleMouseDown;
393 BOOL mRightMouseDown; 396 BOOL mRightMouseDown;
394 397
395 LLProgressView *mProgressView; 398 LLProgressView *mProgressView;
diff --git a/linden/indra/newview/llvlcomposition.cpp b/linden/indra/newview/llvlcomposition.cpp
index b79d7d1..a269225 100644
--- a/linden/indra/newview/llvlcomposition.cpp
+++ b/linden/indra/newview/llvlcomposition.cpp
@@ -80,8 +80,13 @@ LLVLComposition::LLVLComposition(LLSurface *surfacep, const U32 width, const F32
80 // Initialize the texture matrix to defaults. 80 // Initialize the texture matrix to defaults.
81 for (S32 i = 0; i < CORNER_COUNT; ++i) 81 for (S32 i = 0; i < CORNER_COUNT; ++i)
82 { 82 {
83 mStartHeight[i] = gSavedSettings.getF32("TerrainColorStartHeight"); 83 //Zwag: I'm making these static values because they are a LARGE performance problem
84 mHeightRange[i] = gSavedSettings.getF32("TerrainColorHeightRange"); 84 // right now, and I've never heard of anyone changing them, they are not referenced
85 // elsewhere, and have not changed in defaults since the original source code release.
86 // We can move these back to signal connected statics if they really become important
87 // variables in the future.
88 mStartHeight[i] = 20.f;//gSavedSettings.getF32("TerrainColorStartHeight");
89 mHeightRange[i] = 60.f;//gSavedSettings.getF32("TerrainColorHeightRange");
85 } 90 }
86 mTexScaleX = 16.f; 91 mTexScaleX = 16.f;
87 mTexScaleY = 16.f; 92 mTexScaleY = 16.f;
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp
index 1203c56..d35ad40 100644
--- a/linden/indra/newview/llvoavatar.cpp
+++ b/linden/indra/newview/llvoavatar.cpp
@@ -83,6 +83,9 @@
83#include "llvoicevisualizer.h" // Ventrella 83#include "llvoicevisualizer.h" // Ventrella
84 84
85#include "boost/lexical_cast.hpp" 85#include "boost/lexical_cast.hpp"
86// [RLVa:KB]
87#include "llstartup.h"
88// [/RLVa:KB]
86 89
87using namespace LLVOAvatarDefines; 90using namespace LLVOAvatarDefines;
88 91
@@ -175,6 +178,10 @@ enum ERenderName
175//----------------------------------------------------------------------------- 178//-----------------------------------------------------------------------------
176// Callback data 179// Callback data
177//----------------------------------------------------------------------------- 180//-----------------------------------------------------------------------------
181LLVector3d LLVOAvatar::sBeamLastAt;
182int LLVOAvatar::sPartsNow;
183
184
178struct LLAvatarTexData 185struct LLAvatarTexData
179{ 186{
180 LLAvatarTexData( const LLUUID& id, ETextureIndex index ) 187 LLAvatarTexData( const LLUUID& id, ETextureIndex index )
@@ -741,7 +748,11 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
741 mTexEyeColor( NULL ), 748 mTexEyeColor( NULL ),
742 mNeedsSkin(FALSE), 749 mNeedsSkin(FALSE),
743 mUpdatePeriod(1), 750 mUpdatePeriod(1),
751// mFullyLoadedInitialized(FALSE)
752 mPreviousFullyLoaded(FALSE),
753 mVisibleChat( FALSE ),
744 mFullyLoadedInitialized(FALSE), 754 mFullyLoadedInitialized(FALSE),
755 mFullyLoaded(FALSE),
745 mHasBakedHair( FALSE ) 756 mHasBakedHair( FALSE )
746{ 757{
747 LLMemType mt(LLMemType::MTYPE_AVATAR); 758 LLMemType mt(LLMemType::MTYPE_AVATAR);
@@ -1717,6 +1728,10 @@ BOOL LLVOAvatar::buildSkeleton(const LLVOAvatarSkeletonInfo *info)
1717{ 1728{
1718 LLMemType mt(LLMemType::MTYPE_AVATAR); 1729 LLMemType mt(LLMemType::MTYPE_AVATAR);
1719 1730
1731 //this can get called with null info on startup sometimes
1732 if (!info)
1733 return FALSE;
1734
1720 //------------------------------------------------------------------------- 1735 //-------------------------------------------------------------------------
1721 // allocate joints 1736 // allocate joints
1722 //------------------------------------------------------------------------- 1737 //-------------------------------------------------------------------------
@@ -1981,9 +1996,15 @@ void LLVOAvatar::buildCharacter()
1981 if (attachment->getGroup() == i) 1996 if (attachment->getGroup() == i)
1982 { 1997 {
1983 LLMenuItemCallGL* item; 1998 LLMenuItemCallGL* item;
1999// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
2000 // We need the userdata param to disable options in this pie menu later on (Left Hand / Right Hand option)
1984 item = new LLMenuItemCallGL(attachment->getName(), 2001 item = new LLMenuItemCallGL(attachment->getName(),
1985 NULL, 2002 NULL,
1986 object_selected_and_point_valid); 2003 object_selected_and_point_valid, attachment);
2004// [/RLVa:KB]
2005// item = new LLMenuItemCallGL(attachment->getName(),
2006// NULL,
2007// object_selected_and_point_valid);
1987 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", curiter->first); 2008 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", curiter->first);
1988 2009
1989 gAttachPieMenu->append(item); 2010 gAttachPieMenu->append(item);
@@ -2038,9 +2059,15 @@ void LLVOAvatar::buildCharacter()
2038 if (attachment->getGroup() == 8) 2059 if (attachment->getGroup() == 8)
2039 { 2060 {
2040 LLMenuItemCallGL* item; 2061 LLMenuItemCallGL* item;
2062// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
2063 // We need the userdata param to disable options in this pie menu later on
2041 item = new LLMenuItemCallGL(attachment->getName(), 2064 item = new LLMenuItemCallGL(attachment->getName(),
2042 NULL, 2065 NULL,
2043 object_selected_and_point_valid); 2066 object_selected_and_point_valid, attachment);
2067// [/RLVa:KB]
2068// item = new LLMenuItemCallGL(attachment->getName(),
2069// NULL,
2070// object_selected_and_point_valid);
2044 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", curiter->first); 2071 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", curiter->first);
2045 gAttachScreenPieMenu->append(item); 2072 gAttachScreenPieMenu->append(item);
2046 gDetachScreenPieMenu->append(new LLMenuItemCallGL(attachment->getName(), 2073 gDetachScreenPieMenu->append(new LLMenuItemCallGL(attachment->getName(),
@@ -2059,12 +2086,14 @@ void LLVOAvatar::buildCharacter()
2059 { 2086 {
2060 continue; 2087 continue;
2061 } 2088 }
2089 // RELEASE-RLVa: random comment because we want know if LL ever changes this to not include "attachment" as userdata
2062 LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(), 2090 LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(),
2063 NULL, &object_selected_and_point_valid, 2091 NULL, &object_selected_and_point_valid,
2064 &attach_label, attachment); 2092 &attach_label, attachment);
2093if (item){
2065 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", curiter->first); 2094 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", curiter->first);
2066 gAttachSubMenu->append(item); 2095 gAttachSubMenu->append(item);
2067 2096}
2068 gDetachSubMenu->append(new LLMenuItemCallGL(attachment->getName(), 2097 gDetachSubMenu->append(new LLMenuItemCallGL(attachment->getName(),
2069 &handle_detach_from_avatar, object_attached, &detach_label, attachment)); 2098 &handle_detach_from_avatar, object_attached, &detach_label, attachment));
2070 2099
@@ -2118,8 +2147,13 @@ void LLVOAvatar::buildCharacter()
2118 LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL); 2147 LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL);
2119 if (attachment) 2148 if (attachment)
2120 { 2149 {
2150// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
2151 // We need the userdata param to disable options in this pie menu later on
2121 LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(), 2152 LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(),
2122 NULL, object_selected_and_point_valid); 2153 NULL, object_selected_and_point_valid, attachment);
2154// [/RLVa:KB]
2155// LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(),
2156// NULL, object_selected_and_point_valid);
2123 gAttachBodyPartPieMenus[group]->append(item); 2157 gAttachBodyPartPieMenus[group]->append(item);
2124 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", attach_index); 2158 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", attach_index);
2125 gDetachBodyPartPieMenus[group]->append(new LLMenuItemCallGL(attachment->getName(), 2159 gDetachBodyPartPieMenus[group]->append(new LLMenuItemCallGL(attachment->getName(),
@@ -2944,10 +2978,16 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
2944 const F32 time_visible = mTimeVisible.getElapsedTimeF32(); 2978 const F32 time_visible = mTimeVisible.getElapsedTimeF32();
2945 const F32 NAME_SHOW_TIME = gSavedSettings.getF32("RenderNameShowTime"); // seconds 2979 const F32 NAME_SHOW_TIME = gSavedSettings.getF32("RenderNameShowTime"); // seconds
2946 const F32 FADE_DURATION = gSavedSettings.getF32("RenderNameFadeDuration"); // seconds 2980 const F32 FADE_DURATION = gSavedSettings.getF32("RenderNameFadeDuration"); // seconds
2981// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
2982 bool fRlvShowNames = gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES);
2983// [/RLVa:KB]
2947 BOOL visible_avatar = isVisible() || mNeedsAnimUpdate; 2984 BOOL visible_avatar = isVisible() || mNeedsAnimUpdate;
2948 BOOL visible_chat = gSavedSettings.getBOOL("UseChatBubbles") && (mChats.size() || mTyping); 2985 BOOL visible_chat = gSavedSettings.getBOOL("UseChatBubbles") && (mChats.size() || mTyping);
2949 BOOL render_name = visible_chat || 2986 BOOL render_name = visible_chat ||
2950 (visible_avatar && 2987 (visible_avatar &&
2988// [RLVa:KB] - Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.0h
2989 ( (!fRlvShowNames) || (RlvSettings::fShowNameTags) ) &&
2990// [/RLVa:KB]
2951 ((sRenderName == RENDER_NAME_ALWAYS) || 2991 ((sRenderName == RENDER_NAME_ALWAYS) ||
2952 (sRenderName == RENDER_NAME_FADE && time_visible < NAME_SHOW_TIME))); 2992 (sRenderName == RENDER_NAME_FADE && time_visible < NAME_SHOW_TIME)));
2953 // If it's your own avatar, don't draw in mouselook, and don't 2993 // If it's your own avatar, don't draw in mouselook, and don't
@@ -2968,7 +3008,18 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
2968 new_name = TRUE; 3008 new_name = TRUE;
2969 } 3009 }
2970 3010
2971 if (sRenderGroupTitles != mRenderGroupTitles) 3011// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.0b
3012 if (fRlvShowNames)
3013 {
3014 if (mRenderGroupTitles)
3015 {
3016 mRenderGroupTitles = FALSE;
3017 new_name = TRUE;
3018 }
3019 }
3020 else if (sRenderGroupTitles != mRenderGroupTitles)
3021// [/RLVa]
3022 //if (sRenderGroupTitles != mRenderGroupTitles)
2972 { 3023 {
2973 mRenderGroupTitles = sRenderGroupTitles; 3024 mRenderGroupTitles = sRenderGroupTitles;
2974 new_name = TRUE; 3025 new_name = TRUE;
@@ -3073,17 +3124,11 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3073 || is_appearance != mNameAppearance) 3124 || is_appearance != mNameAppearance)
3074 { 3125 {
3075 std::string line; 3126 std::string line;
3076 if (!sRenderGroupTitles) 3127
3077 { 3128 if (title && title->getString() && title->getString()[0] != '\0')
3078 // If all group titles are turned off, stack first name
3079 // on a line above last name
3080 line += firstname->getString();
3081 line += "\n";
3082 }
3083 else if (title && title->getString() && title->getString()[0] != '\0')
3084 { 3129 {
3085 line += title->getString(); 3130 line += title->getString();
3086 LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); 3131 //LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); IMP-136 -- McCabe
3087 line += "\n"; 3132 line += "\n";
3088 line += firstname->getString(); 3133 line += firstname->getString();
3089 } 3134 }
@@ -3094,6 +3139,15 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3094 3139
3095 line += " "; 3140 line += " ";
3096 line += lastname->getString(); 3141 line += lastname->getString();
3142
3143// [RLVa:KB]
3144 if (fRlvShowNames)
3145 {
3146 // User is not allowed to see who it is, due to RLV settings.
3147 line = gRlvHandler.getAnonym(line);
3148 }
3149// [/RLVa:KB]
3150
3097 BOOL need_comma = FALSE; 3151 BOOL need_comma = FALSE;
3098 3152
3099 if (is_away || is_muted || is_busy) 3153 if (is_away || is_muted || is_busy)
@@ -3134,7 +3188,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3134 mNameMute = is_muted; 3188 mNameMute = is_muted;
3135 mNameAppearance = is_appearance; 3189 mNameAppearance = is_appearance;
3136 mTitle = title ? title->getString() : ""; 3190 mTitle = title ? title->getString() : "";
3137 LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); 3191 //LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); IMP-136 -- McCabe
3138 mNameString = utf8str_to_wstring(line); 3192 mNameString = utf8str_to_wstring(line);
3139 new_name = TRUE; 3193 new_name = TRUE;
3140 } 3194 }
@@ -3258,6 +3312,26 @@ void LLVOAvatar::idleUpdateTractorBeam()
3258 if (!needsRenderBeam() || !mIsBuilt) 3312 if (!needsRenderBeam() || !mIsBuilt)
3259 { 3313 {
3260 mBeam = NULL; 3314 mBeam = NULL;
3315 if(gSavedSettings.getBOOL("ParticleChat"))
3316 {
3317 if(sPartsNow != FALSE)
3318 {
3319 sPartsNow = FALSE;
3320 LLMessageSystem* msg = gMessageSystem;
3321 msg->newMessageFast(_PREHASH_ChatFromViewer);
3322 msg->nextBlockFast(_PREHASH_AgentData);
3323 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
3324 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
3325 msg->nextBlockFast(_PREHASH_ChatData);
3326 msg->addStringFast(_PREHASH_Message, "stop");
3327 msg->addU8Fast(_PREHASH_Type, CHAT_TYPE_WHISPER);
3328 msg->addS32("Channel", 9000);
3329
3330 gAgent.sendReliableMessage();
3331 sBeamLastAt = LLVector3d::zero;
3332 LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
3333 }
3334 }
3261 } 3335 }
3262 else if (!mBeam || mBeam->isDead()) 3336 else if (!mBeam || mBeam->isDead())
3263 { 3337 {
@@ -3276,6 +3350,48 @@ void LLVOAvatar::idleUpdateTractorBeam()
3276 { 3350 {
3277 // get point from pointat effect 3351 // get point from pointat effect
3278 mBeam->setPositionGlobal(gAgent.mPointAt->getPointAtPosGlobal()); 3352 mBeam->setPositionGlobal(gAgent.mPointAt->getPointAtPosGlobal());
3353
3354 if(gSavedSettings.getBOOL("ParticleChat"))
3355 {
3356 if(sPartsNow != TRUE)
3357 {
3358 sPartsNow = TRUE;
3359 LLMessageSystem* msg = gMessageSystem;
3360 msg->newMessageFast(_PREHASH_ChatFromViewer);
3361 msg->nextBlockFast(_PREHASH_AgentData);
3362 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
3363 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
3364 msg->nextBlockFast(_PREHASH_ChatData);
3365 msg->addStringFast(_PREHASH_Message, "start");
3366 msg->addU8Fast(_PREHASH_Type, CHAT_TYPE_WHISPER);
3367 msg->addS32("Channel", 9000);
3368
3369 gAgent.sendReliableMessage();
3370
3371 LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
3372 }
3373 //LLVector3d a = sBeamLastAt-gAgent.mPointAt->getPointAtPosGlobal();
3374 //if(a.length > 2)
3375 if( (sBeamLastAt-gAgent.mPointAt->getPointAtPosGlobal()).length() > .2)
3376 //if(sBeamLastAt!=gAgent.mPointAt->getPointAtPosGlobal())
3377 {
3378 sBeamLastAt = gAgent.mPointAt->getPointAtPosGlobal();
3379
3380 LLMessageSystem* msg = gMessageSystem;
3381 msg->newMessageFast(_PREHASH_ChatFromViewer);
3382 msg->nextBlockFast(_PREHASH_AgentData);
3383 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
3384 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
3385 msg->nextBlockFast(_PREHASH_ChatData);
3386 msg->addStringFast(_PREHASH_Message, llformat("<%.6f, %.6f, %.6f>",(F32)(sBeamLastAt.mdV[VX]),(F32)(sBeamLastAt.mdV[VY]),(F32)(sBeamLastAt.mdV[VZ])));
3387 msg->addU8Fast(_PREHASH_Type, CHAT_TYPE_WHISPER);
3388 msg->addS32("Channel", 9000); // *TODO: make configurable
3389
3390 gAgent.sendReliableMessage();
3391 }
3392
3393 }
3394
3279 mBeam->triggerLocal(); 3395 mBeam->triggerLocal();
3280 } 3396 }
3281 else if (selection->getFirstRootObject() && 3397 else if (selection->getFirstRootObject() &&
@@ -5932,6 +6048,40 @@ BOOL LLVOAvatar::attachObject(LLViewerObject *viewer_object)
5932 { 6048 {
5933 updateAttachmentVisibility(gAgent.getCameraMode()); 6049 updateAttachmentVisibility(gAgent.getCameraMode());
5934 6050
6051// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
6052 if (rlv_handler_t::isEnabled())
6053 {
6054 static bool fRlvFullyLoaded = false;
6055 static LLFrameTimer* pRlvFullyLoadedTimer = NULL;
6056
6057 // There's no way to know when we're done reattaching what was attached at log-off but this ugly evil bad hack tries anyway
6058 if (!fRlvFullyLoaded)
6059 {
6060 if (pRlvFullyLoadedTimer)
6061 {
6062 if (pRlvFullyLoadedTimer->getElapsedTimeF32() > 30.0f)
6063 {
6064 fRlvFullyLoaded = true;
6065 delete pRlvFullyLoadedTimer;
6066 pRlvFullyLoadedTimer = NULL;
6067 }
6068 else
6069 {
6070 pRlvFullyLoadedTimer->reset();
6071 }
6072 }
6073 else if ( (!pRlvFullyLoadedTimer) &&
6074 ( (0 == mPendingAttachment.size()) ||
6075 ((1 == mPendingAttachment.size()) && (mPendingAttachment[0] == viewer_object)) ) )
6076 {
6077 pRlvFullyLoadedTimer = new LLFrameTimer();
6078 }
6079 }
6080
6081 gRlvHandler.onAttach(attachment, fRlvFullyLoaded);
6082 }
6083// [/RLVa:KB]
6084
5935 // Then make sure the inventory is in sync with the avatar. 6085 // Then make sure the inventory is in sync with the avatar.
5936 gInventory.addChangedMask( LLInventoryObserver::LABEL, attachment->getItemID() ); 6086 gInventory.addChangedMask( LLInventoryObserver::LABEL, attachment->getItemID() );
5937 gInventory.notifyObservers(); 6087 gInventory.notifyObservers();
@@ -5993,6 +6143,14 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
5993 // only one object per attachment point for now 6143 // only one object per attachment point for now
5994 if (attachment->getObject() == viewer_object) 6144 if (attachment->getObject() == viewer_object)
5995 { 6145 {
6146// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g)
6147 // URGENT-RLV: it looks like LLApp::isExiting() isn't always accurate so find something better (if it exists)
6148 if ( (rlv_handler_t::isEnabled()) && (!LLApp::isExiting()) && (mIsSelf) )
6149 {
6150 gRlvHandler.onDetach(attachment);
6151 }
6152// [/RLVa:KB]
6153
5996 LLUUID item_id = attachment->getItemID(); 6154 LLUUID item_id = attachment->getItemID();
5997 attachment->removeObject(viewer_object); 6155 attachment->removeObject(viewer_object);
5998 if (mIsSelf) 6156 if (mIsSelf)
@@ -6051,6 +6209,14 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)
6051 6209
6052 gPipeline.markMoved(mDrawable, TRUE); 6210 gPipeline.markMoved(mDrawable, TRUE);
6053 mIsSitting = TRUE; 6211 mIsSitting = TRUE;
6212// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.1d
6213 #ifdef RLV_EXTENSION_STARTLOCATION
6214 if (rlv_handler_t::isEnabled())
6215 {
6216 RlvSettings::updateLoginLastLocation();
6217 }
6218 #endif // RLV_EXTENSION_STARTLOCATION
6219// [/RLVa:KB]
6054 mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject 6220 mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject
6055 mRoot.setPosition(getPosition()); 6221 mRoot.setPosition(getPosition());
6056 mRoot.updateWorldMatrixChildren(); 6222 mRoot.updateWorldMatrixChildren();
@@ -6112,6 +6278,14 @@ void LLVOAvatar::getOffObject()
6112 gPipeline.markMoved(mDrawable, TRUE); 6278 gPipeline.markMoved(mDrawable, TRUE);
6113 6279
6114 mIsSitting = FALSE; 6280 mIsSitting = FALSE;
6281// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.1d
6282 #ifdef RLV_EXTENSION_STARTLOCATION
6283 if (rlv_handler_t::isEnabled())
6284 {
6285 RlvSettings::updateLoginLastLocation();
6286 }
6287 #endif // RLV_EXTENSION_STARTLOCATION
6288// [/RLVa:KB]
6115 mRoot.getXform()->setParent(NULL); // LLVOAvatar::getOffObject 6289 mRoot.getXform()->setParent(NULL); // LLVOAvatar::getOffObject
6116 mRoot.setPosition(cur_position_world); 6290 mRoot.setPosition(cur_position_world);
6117 mRoot.setRotation(cur_rotation_world); 6291 mRoot.setRotation(cur_rotation_world);
diff --git a/linden/indra/newview/llvoavatar.h b/linden/indra/newview/llvoavatar.h
index f8b2c06..f6d5e27 100644
--- a/linden/indra/newview/llvoavatar.h
+++ b/linden/indra/newview/llvoavatar.h
@@ -592,6 +592,10 @@ private:
592 LLTimer mAnimTimer; 592 LLTimer mAnimTimer;
593 F32 mTimeLast; 593 F32 mTimeLast;
594 594
595 // Send selection beam info to scripts
596 static int sPartsNow;
597 static LLVector3d sBeamLastAt;
598
595 LLPointer<LLHUDEffectSpiral> mBeam; 599 LLPointer<LLHUDEffectSpiral> mBeam;
596 LLFrameTimer mBeamTimer; 600 LLFrameTimer mBeamTimer;
597 601
diff --git a/linden/indra/newview/llvovolume.cpp b/linden/indra/newview/llvovolume.cpp
index dd68733..d543a65 100644
--- a/linden/indra/newview/llvovolume.cpp
+++ b/linden/indra/newview/llvovolume.cpp
@@ -1978,7 +1978,11 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
1978 1978
1979{ 1979{
1980 if (!mbCanSelect || 1980 if (!mbCanSelect ||
1981 (gHideSelectedObjects && isSelected()) || 1981// (gHideSelectedObjects && isSelected()) ||
1982// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
1983 ( (gHideSelectedObjects && isSelected()) &&
1984 ((!rlv_handler_t::isEnabled()) || (!isHUDAttachment()) || (gRlvHandler.isDetachable(this))) ) ||
1985// [/RLVa:KB]
1982 mDrawable->isDead() || 1986 mDrawable->isDead() ||
1983 !gPipeline.hasRenderType(mDrawable->getRenderType())) 1987 !gPipeline.hasRenderType(mDrawable->getRenderType()))
1984 { 1988 {
@@ -2120,10 +2124,18 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
2120{ 2124{
2121 LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); 2125 LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
2122 2126
2123 if (facep->getViewerObject()->isSelected() && gHideSelectedObjects) 2127// if (facep->getViewerObject()->isSelected() && gHideSelectedObjects)
2128// {
2129// return;
2130// }
2131// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
2132 LLViewerObject* pObj = facep->getViewerObject();
2133 if ( (pObj->isSelected() && gHideSelectedObjects) &&
2134 ((!rlv_handler_t::isEnabled()) || (!pObj->isHUDAttachment()) || (gRlvHandler.isDetachable(pObj))) )
2124 { 2135 {
2125 return; 2136 return;
2126 } 2137 }
2138// [/RVLa:KB]
2127 2139
2128 //add face to drawmap 2140 //add face to drawmap
2129 LLSpatialGroup::drawmap_elem_t& draw_vec = group->mDrawMap[type]; 2141 LLSpatialGroup::drawmap_elem_t& draw_vec = group->mDrawMap[type];
diff --git a/linden/indra/newview/llwearable.cpp b/linden/indra/newview/llwearable.cpp
index a5f4dc9..bf5fd4a 100644
--- a/linden/indra/newview/llwearable.cpp
+++ b/linden/indra/newview/llwearable.cpp
@@ -153,41 +153,87 @@ EWearableType LLWearable::typeNameToType( const std::string& type_name )
153 return WT_INVALID; 153 return WT_INVALID;
154} 154}
155 155
156 156const char* terse_F32_to_string( F32 f, char s[MAX_STRING] ) /* Flawfinder: ignore */
157std::string terse_F32_to_string( F32 f )
158{ 157{
159 std::string r = llformat( "%.2f", f ); 158 char* r = s;
159 S32 len = snprintf( s, MAX_STRING, "%.2f", f ); /* Flawfinder: ignore */
160 160
161 // "1.20" -> "1.2" 161 // "1.20" -> "1.2"
162 // "24.00" -> "24." 162 // "24.00" -> "24."
163 S32 len = r.length(); 163 while( '0' == r[len - 1] )
164 while( len > 0 && '0' == r[len - 1] )
165 { 164 {
166 r.erase(len-1, 1); 165 len--;
167 len--; 166 r[len] = '\0';
168 } 167 }
169 168
170 if( '.' == r[len - 1] ) 169 if( '.' == r[len - 1] )
171 { 170 {
172 // "24." -> "24" 171 // "24." -> "24"
173 r.erase(len-1, 1); 172 len--;
173 r[len] = '\0';
174 } 174 }
175 else 175 else
176 if( ('-' == r[0]) && ('0' == r[1]) ) 176 if( ('-' == r[0]) && ('0' == r[1]) )
177 { 177 {
178 // "-0.59" -> "-.59" 178 // "-0.59" -> "-.59"
179 r.erase(1, 1); 179 r++;
180 r[0] = '-';
180 } 181 }
181 else 182 else
182 if( '0' == r[0] ) 183 if( '0' == r[0] )
183 { 184 {
184 // "0.59" -> ".59" 185 // "0.59" -> ".59"
185 r.erase(0, 1); 186 r++;
186 } 187 }
187 188
188 return r; 189 return r;
189} 190}
190 191
192// reX: new function
193BOOL LLWearable::FileExportParams( FILE* file )
194{
195 // wearable type
196 S32 type = (S32)mType;
197 fprintf( file, "type %d\n", type );
198
199 // parameters
200 S32 num_parameters = mVisualParamMap.size();
201 fprintf( file, "parameters %d\n", num_parameters );
202
203 char s[ MAX_STRING ]; /* Flawfinder: ignore */
204 for (param_map_t::iterator iter = mVisualParamMap.begin();
205 iter != mVisualParamMap.end(); ++iter)
206 {
207 S32 param_id = iter->first;
208 F32 param_weight = iter->second;
209 fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight, s ) );
210 }
211
212 return TRUE;
213}
214
215// reX: new function
216BOOL LLWearable::FileExportTextures( FILE* file )
217{
218 // wearable type
219 S32 type = (S32)mType;
220 fprintf( file, "type %d\n", type );
221
222 // texture entries
223 S32 num_textures = mTEMap.size();
224 fprintf( file, "textures %d\n", num_textures );
225
226 for (te_map_t::iterator iter = mTEMap.begin();
227 iter != mTEMap.end(); ++iter)
228 {
229 S32 te = iter->first;
230 LLUUID& image_id = iter->second;
231 fprintf( file, "%d %s\n", te, image_id.asString().c_str() );
232 }
233
234 return TRUE;
235}
236
191BOOL LLWearable::exportFile( LLFILE* file ) 237BOOL LLWearable::exportFile( LLFILE* file )
192{ 238{
193 // header and version 239 // header and version
@@ -234,12 +280,13 @@ BOOL LLWearable::exportFile( LLFILE* file )
234 return FALSE; 280 return FALSE;
235 } 281 }
236 282
283 char s[ MAX_STRING ]; /* Flawfinder: ignore */
237 for (param_map_t::iterator iter = mVisualParamMap.begin(); 284 for (param_map_t::iterator iter = mVisualParamMap.begin();
238 iter != mVisualParamMap.end(); ++iter) 285 iter != mVisualParamMap.end(); ++iter)
239 { 286 {
240 S32 param_id = iter->first; 287 S32 param_id = iter->first;
241 F32 param_weight = iter->second; 288 F32 param_weight = iter->second;
242 if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight ).c_str() ) < 0 ) 289 if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight, s ) ) < 0 )
243 { 290 {
244 return FALSE; 291 return FALSE;
245 } 292 }
diff --git a/linden/indra/newview/llwearable.h b/linden/indra/newview/llwearable.h
index 252f80c..6e473c1 100644
--- a/linden/indra/newview/llwearable.h
+++ b/linden/indra/newview/llwearable.h
@@ -61,6 +61,10 @@ public:
61 61
62 BOOL exportFile(LLFILE* file); 62 BOOL exportFile(LLFILE* file);
63 BOOL importFile(LLFILE* file); 63 BOOL importFile(LLFILE* file);
64 // reX: new function
65 BOOL FileExportParams(FILE* file);
66 // reX: new function
67 BOOL FileExportTextures(FILE* file);
64 68
65 EWearableType getType() const { return mType; } 69 EWearableType getType() const { return mType; }
66 void setType( EWearableType type ) { mType = type; } 70 void setType( EWearableType type ) { mType = type; }
diff --git a/linden/indra/newview/llwearablelist.cpp b/linden/indra/newview/llwearablelist.cpp
index 512c03f..954321f 100644
--- a/linden/indra/newview/llwearablelist.cpp
+++ b/linden/indra/newview/llwearablelist.cpp
@@ -43,6 +43,9 @@
43#include "llviewerstats.h" 43#include "llviewerstats.h"
44#include "llnotify.h" 44#include "llnotify.h"
45 45
46#include "llstartup.h"
47#include "llpanellogin.h"
48
46// Globals 49// Globals
47LLWearableList gWearableList; // Globally constructed; be careful that there's no dependency with gAgent. 50LLWearableList gWearableList; // Globally constructed; be careful that there's no dependency with gAgent.
48 51
@@ -195,12 +198,15 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID
195 } 198 }
196 else if (data->mName.empty()) 199 else if (data->mName.empty())
197 { 200 {
198 LLNotifications::instance().add("FailedToFindWearableUnnamed", args); 201 // work around missing avatar part spam on grid to grid teleport login
202 //if(LLStartUp::shouldAutoLogin() && !gLoginHandler.mPassword.empty()) Jacek - Grid manager stuff that's changed with 1.23
203 LLNotifications::instance().add("FailedToFindWearableUnnamed", args);
199 } 204 }
200 else 205 else
201 { 206 {
202 args["DESC"] = data->mName; 207 args["DESC"] = data->mName;
203 LLNotifications::instance().add("FailedToFindWearable", args); 208 //if(LLStartUp::shouldAutoLogin() && !gLoginHandler.mPassword.empty()) Jacek - Grid manager stuff that's changed with 1.23
209 LLNotifications::instance().add("FailedToFindWearable", args);
204 } 210 }
205 } 211 }
206 // Always call callback; wearable will be NULL if we failed 212 // Always call callback; wearable will be NULL if we failed
diff --git a/linden/indra/newview/llwindlightremotectrl.cpp b/linden/indra/newview/llwindlightremotectrl.cpp
new file mode 100644
index 0000000..f805763
--- /dev/null
+++ b/linden/indra/newview/llwindlightremotectrl.cpp
@@ -0,0 +1,312 @@
1/**
2* @file llwindlightremotectrl.cpp
3* @brief toolbar remote for windlight options and presets
4*
5* $LicenseInfo:firstyear=2009&license=viewergpl$
6*
7* Copyright (c) 2009, McCabe Maxsted
8*
9* Imprudence Viewer Source Code
10* The source code in this file ("Source Code") is provided to you
11* under the terms of the GNU General Public License, version 2.0
12* ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
13* this distribution, or online at
14* http://secondlifegrid.net/programs/open_source/licensing/gplv2
15*
16* There are special exceptions to the terms and conditions of the GPL as
17* it is applied to this Source Code. View the full text of the exception
18* in the file doc/FLOSS-exception.txt in this software distribution, or
19* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
20*
21* By copying, modifying or distributing this software, you acknowledge
22* that you have read and understood your obligations described above,
23* and agree to abide by those obligations.
24*
25* ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
26* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
27* COMPLETENESS OR PERFORMANCE.
28* $/LicenseInfo$
29*/
30
31#include "llviewerprecompiledheaders.h"
32
33#include "llwindlightremotectrl.h"
34
35#include "llbutton.h"
36#include "llcombobox.h"
37#include "llfloaterenvsettings.h"
38#include "llfloaterwater.h"
39#include "llfloaterwindlight.h"
40#include "lloverlaybar.h"
41#include "lluictrlfactory.h"
42#include "llwlparammanager.h"
43#include "llviewercontrol.h"
44
45// [RLVa:KB] - Alternate: Imprudence-1.2.0
46#include "rlvhandler.h"
47// [/RLVa:KB]
48
49class LLWindlightRemoteObserver : public LLWLPresetsObserver
50{
51public:
52 LLWindlightRemoteObserver(LLWindlightRemoteCtrl* wind_rem) : mWindlightRemote(wind_rem){}
53 virtual ~LLWindlightRemoteObserver() {}
54 virtual void changed() { mWindlightRemote->refreshPresets(); }
55private:
56 LLWindlightRemoteCtrl* mWindlightRemote;
57};
58
59
60LLWindlightRemoteCtrl::LLWindlightRemoteCtrl()
61{
62 mPresetsCombo = NULL;
63 mObserver = NULL;
64 setIsChrome(TRUE);
65
66 build();
67
68 setFocusRoot(TRUE);
69}
70
71LLWindlightRemoteCtrl::~LLWindlightRemoteCtrl()
72{
73 delete mObserver;
74 mObserver = NULL;
75}
76
77void LLWindlightRemoteCtrl::draw()
78{
79 LLButton* expand_button = getChild<LLButton>("Popup");
80 if (expand_button)
81 {
82 if (expand_button->getToggleState())
83 {
84 expand_button->setImageOverlay("arrow_down.tga");
85 }
86 else
87 {
88 expand_button->setImageOverlay("arrow_up.tga");
89 }
90 }
91
92// [RLVa:KB] - Alternate: Imprudence-1.2.0
93 if (rlv_handler_t::isEnabled())
94 {
95 childSetEnabled("Environment", !gRlvHandler.hasBehaviour(RLV_BHVR_SETENV));
96 mPresetsCombo->setEnabled(!gRlvHandler.hasBehaviour(RLV_BHVR_SETENV));
97 }
98// [/RLVA:KB]
99
100 LLPanel::draw();
101}
102
103void LLWindlightRemoteCtrl::build()
104{
105 if (gSavedSettings.getBOOL("ShowWindlightSettingsPopup"))
106 {
107 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_windlight_remote_expanded.xml");
108 }
109 else
110 {
111 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_windlight_remote.xml");
112 }
113}
114
115BOOL LLWindlightRemoteCtrl::postBuild()
116{
117
118 childSetAction("Environment", onClickToggleEnvironment, this);
119 childSetAction("Popup", onClickPopupBtn, this);
120
121 mPresetsCombo = getChild<LLComboBox>("Presets");
122 if (mPresetsCombo)
123 {
124 mPresetsCombo->setCommitCallback(onCommitPreset);
125 mPresetsCombo->setCallbackUserData(this);
126
127 // set up observer to follow changes
128 mObserver = new LLWindlightRemoteObserver(this);
129 LLWLParamManager::addObserver(mObserver);
130
131 // refresh list from current presets
132 refreshPresets();
133 }
134
135 return TRUE;
136}
137
138void LLWindlightRemoteCtrl::refreshPresets()
139{
140 if (mPresetsCombo)
141 {
142 // snag current preset
143 LLWLParamManager * param_mgr = LLWLParamManager::instance();
144 LLWLParamSet& currentParams = param_mgr->mCurParams;
145
146 // clear in case presets names have changed
147 mPresetsCombo->clearRows();
148
149 std::map<std::string, LLWLParamSet>::iterator mIt =
150 param_mgr->mParamList.begin();
151 for(; mIt != param_mgr->mParamList.end(); mIt++)
152 {
153 mPresetsCombo->add(mIt->first);
154 }
155
156 // insert separator and add World menu options
157 mPresetsCombo->addSeparator(ADD_BOTTOM);
158 mPresetsCombo->addSimpleElement(getString("atmosphere"), ADD_BOTTOM);
159 mPresetsCombo->addSimpleElement(getString("lighting"), ADD_BOTTOM);
160 mPresetsCombo->addSimpleElement(getString("clouds"), ADD_BOTTOM);
161 mPresetsCombo->addSimpleElement(getString("advanced_water"), ADD_BOTTOM);
162 mPresetsCombo->addSeparator(ADD_BOTTOM);
163 mPresetsCombo->addSimpleElement(getString("sunrise"), ADD_BOTTOM);
164 mPresetsCombo->addSimpleElement(getString("noon"), ADD_BOTTOM);
165 mPresetsCombo->addSimpleElement(getString("sunset"), ADD_BOTTOM);
166 mPresetsCombo->addSimpleElement(getString("midnight"), ADD_BOTTOM);
167 mPresetsCombo->addSimpleElement(getString("revert_region"), ADD_BOTTOM);
168
169 if (mPresetsCombo->getSelectedItemLabel() != currentParams.mName &&
170 !currentParams.mName.empty())
171 {
172 mPresetsCombo->selectByValue(LLSD(currentParams.mName));
173 }
174 else
175 {
176 mPresetsCombo->selectByValue(LLSD("Default"));
177 }
178 }
179}
180
181// static
182void LLWindlightRemoteCtrl::onCommitPreset(LLUICtrl* ctrl, void* data)
183{
184 LLWindlightRemoteCtrl* self = (LLWindlightRemoteCtrl*)data;
185
186 LLCtrlListInterface* presets = self->mPresetsCombo ? self->mPresetsCombo->getListInterface() : NULL;
187 if (presets)
188 {
189 S32 index = presets->getFirstSelectedIndex();
190 if (index < 0)
191 {
192 // Open Advanced Sky
193 LLFloaterWindLight::show();
194 return;
195 }
196
197 // check for World menu options; if none, apply preset
198 std::string selected = self->mPresetsCombo->getSelectedValue().asString();
199
200 if (selected == self->getString("atmosphere"))
201 {
202 if (!LLFloaterWindLight::instance()->getVisible())
203 {
204 LLFloaterWindLight::show();
205 }
206 LLFloaterWindLight::instance()->selectTab("Atmosphere");
207 }
208 else if (selected == self->getString("lighting"))
209 {
210 if (!LLFloaterWindLight::instance()->getVisible())
211 {
212 LLFloaterWindLight::show();
213 }
214 LLFloaterWindLight::instance()->selectTab("Lighting");
215 }
216 else if (selected == self->getString("clouds"))
217 {
218 if (!LLFloaterWindLight::instance()->getVisible())
219 {
220 LLFloaterWindLight::show();
221 }
222 LLFloaterWindLight::instance()->selectTab("Clouds");
223 }
224 else if (selected == self->getString("advanced_water"))
225 {
226 LLFloaterWater::show();
227 }
228 else if (selected == self->getString("sunrise"))
229 {
230 // set the value, turn off animation
231 LLWLParamManager::instance()->mAnimator.setDayTime(0.25);
232 LLWLParamManager::instance()->mAnimator.mIsRunning = false;
233 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
234
235 // then call update once
236 LLWLParamManager::instance()->mAnimator.update(
237 LLWLParamManager::instance()->mCurParams);
238 }
239 else if (selected == self->getString("noon"))
240 {
241 // set the value, turn off animation
242 LLWLParamManager::instance()->mAnimator.setDayTime(0.567);
243 LLWLParamManager::instance()->mAnimator.mIsRunning = false;
244 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
245
246 // then call update once
247 LLWLParamManager::instance()->mAnimator.update(
248 LLWLParamManager::instance()->mCurParams);
249 }
250 else if (selected == self->getString("sunset"))
251 {
252 // set the value, turn off animation
253 LLWLParamManager::instance()->mAnimator.setDayTime(0.75);
254 LLWLParamManager::instance()->mAnimator.mIsRunning = false;
255 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
256
257 // then call update once
258 LLWLParamManager::instance()->mAnimator.update(
259 LLWLParamManager::instance()->mCurParams);
260 }
261 else if (selected == self->getString("midnight"))
262 {
263 // set the value, turn off animation
264 LLWLParamManager::instance()->mAnimator.setDayTime(0.0);
265 LLWLParamManager::instance()->mAnimator.mIsRunning = false;
266 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
267
268 // then call update once
269 LLWLParamManager::instance()->mAnimator.update(
270 LLWLParamManager::instance()->mCurParams);
271 }
272 else if (selected == self->getString("revert_region"))
273 {
274 LLWLParamManager::instance()->mAnimator.mIsRunning = true;
275 LLWLParamManager::instance()->mAnimator.mUseLindenTime = true;
276 }
277 else
278 {
279 // Apply preset
280 LLWLParamManager::instance()->mAnimator.mIsRunning = false;
281 LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
282 LLWLParamManager::instance()->loadPreset(selected, true);
283 }
284 }
285}
286
287// static
288void LLWindlightRemoteCtrl::onClickToggleEnvironment(void* data)
289{
290 // if evn settings not there or is hidden, show it
291 if( !LLFloaterEnvSettings::isOpen() ||
292 !LLFloaterEnvSettings::instance()->getVisible())
293 {
294 LLFloaterEnvSettings::show();
295
296 // otherwise, close it button acts like a toggle
297 }
298 else
299 {
300 LLFloaterEnvSettings::instance()->close();
301 }
302}
303
304//static
305void LLWindlightRemoteCtrl::onClickPopupBtn(void* data)
306{
307 LLWindlightRemoteCtrl* remotep = (LLWindlightRemoteCtrl*)data;
308
309 remotep->deleteAllChildren();
310 remotep->build();
311 gOverlayBar->layoutButtons();
312}
diff --git a/linden/indra/newview/llwindlightremotectrl.h b/linden/indra/newview/llwindlightremotectrl.h
new file mode 100644
index 0000000..e4ad2d5
--- /dev/null
+++ b/linden/indra/newview/llwindlightremotectrl.h
@@ -0,0 +1,60 @@
1/**
2* @file llwindlightremotectrl.h
3* @brief toolbar remote for windlight options and presets
4*
5* $LicenseInfo:firstyear=2009&license=viewergpl$
6*
7* Copyright (c) 2009, McCabe Maxsted
8*
9* Imprudence Viewer Source Code
10* The source code in this file ("Source Code") is provided to you
11* under the terms of the GNU General Public License, version 2.0
12* ("GPL"). Terms of the GPL can be found in doc/GPL-license.txt in
13* this distribution, or online at
14* http://secondlifegrid.net/programs/open_source/licensing/gplv2
15*
16* There are special exceptions to the terms and conditions of the GPL as
17* it is applied to this Source Code. View the full text of the exception
18* in the file doc/FLOSS-exception.txt in this software distribution, or
19* online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
20*
21* By copying, modifying or distributing this software, you acknowledge
22* that you have read and understood your obligations described above,
23* and agree to abide by those obligations.
24*
25* ALL SOURCE CODE IS PROVIDED "AS IS." THE AUTHOR MAKES NO
26* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
27* COMPLETENESS OR PERFORMANCE.
28* $/LicenseInfo$
29*/
30
31#ifndef LL_LLWINDLIGHTREMOTECTRL_H
32#define LL_LLWINDLIGHTREMOTECTRL_H
33
34#include "llpanel.h"
35
36class LLComboBox;
37class LLWLPresetsObserver;
38
39class LLWindlightRemoteCtrl : public LLPanel
40{
41public:
42 LLWindlightRemoteCtrl();
43 virtual ~LLWindlightRemoteCtrl();
44 /*virtual*/ BOOL postBuild();
45 /*virtual*/ void draw();
46
47 void refreshPresets();
48
49private:
50 LLComboBox* mPresetsCombo;
51 LLWLPresetsObserver* mObserver;
52
53 void build();
54
55 static void onCommitPreset(LLUICtrl* ctrl, void* data);
56 static void onClickToggleEnvironment(void* data);
57 static void onClickPopupBtn(void* data);
58};
59
60#endif
diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp
index b8a2bf0..081313c 100644
--- a/linden/indra/newview/llwlparammanager.cpp
+++ b/linden/indra/newview/llwlparammanager.cpp
@@ -63,6 +63,7 @@
63#include "curl/curl.h" 63#include "curl/curl.h"
64 64
65LLWLParamManager * LLWLParamManager::sInstance = NULL; 65LLWLParamManager * LLWLParamManager::sInstance = NULL;
66std::vector<LLWLPresetsObserver*> LLWLParamManager::sObservers;
66 67
67LLWLParamManager::LLWLParamManager() : 68LLWLParamManager::LLWLParamManager() :
68 69
@@ -239,6 +240,8 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
239 getParamSet(name, mCurParams); 240 getParamSet(name, mCurParams);
240 propagateParameters(); 241 propagateParameters();
241 } 242 }
243
244 notifyObservers();
242} 245}
243 246
244void LLWLParamManager::savePreset(const std::string & name) 247void LLWLParamManager::savePreset(const std::string & name)
@@ -265,6 +268,7 @@ void LLWLParamManager::savePreset(const std::string & name)
265 presetsXML.close(); 268 presetsXML.close();
266 269
267 propagateParameters(); 270 propagateParameters();
271 notifyObservers();
268} 272}
269 273
270void LLWLParamManager::updateShaderUniforms(LLGLSLShader * shader) 274void LLWLParamManager::updateShaderUniforms(LLGLSLShader * shader)
@@ -539,6 +543,8 @@ bool LLWLParamManager::removeParamSet(const std::string& name, bool delete_from_
539 gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml"); 543 gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml");
540 } 544 }
541 545
546 notifyObservers();
547
542 return true; 548 return true;
543} 549}
544 550
@@ -567,3 +573,37 @@ LLWLParamManager * LLWLParamManager::instance()
567 573
568 return sInstance; 574 return sInstance;
569} 575}
576
577// static
578void LLWLParamManager::addObserver(LLWLPresetsObserver* observer)
579{
580 sObservers.push_back(observer);
581}
582
583// static
584void LLWLParamManager::removeObserver(LLWLPresetsObserver* observer)
585{
586 std::vector<LLWLPresetsObserver*>::iterator it;
587 it = std::find(sObservers.begin(), sObservers.end(), observer);
588 if (it != sObservers.end())
589 {
590 sObservers.erase(it);
591 }
592}
593
594// Call this method when it's time to update everyone on a new state.
595// Copy the list because an observer could respond by removing itself
596// from the list. Static
597void LLWLParamManager::notifyObservers()
598{
599 lldebugs << "LLWLPresetsObserver::notifyObservers" << llendl;
600
601 std::vector<LLWLPresetsObserver*> observers = sObservers;
602
603 std::vector<LLWLPresetsObserver*>::iterator it;
604 for (it = observers.begin(); it != observers.end(); ++it)
605 {
606 LLWLPresetsObserver* observer = *it;
607 observer->changed();
608 }
609}
diff --git a/linden/indra/newview/llwlparammanager.h b/linden/indra/newview/llwlparammanager.h
index a117dc1..6b6300c 100644
--- a/linden/indra/newview/llwlparammanager.h
+++ b/linden/indra/newview/llwlparammanager.h
@@ -41,6 +41,13 @@
41#include "llviewercamera.h" 41#include "llviewercamera.h"
42 42
43class LLGLSLShader; 43class LLGLSLShader;
44
45class LLWLPresetsObserver
46{
47public:
48 virtual ~LLWLPresetsObserver() { };
49 virtual void changed() = 0;
50};
44 51
45// color control 52// color control
46struct WLColorControl { 53struct WLColorControl {
@@ -196,6 +203,11 @@ public:
196 // singleton pattern implementation 203 // singleton pattern implementation
197 static LLWLParamManager * instance(); 204 static LLWLParamManager * instance();
198 205
206 // manage observers
207 static void addObserver(LLWLPresetsObserver* observer);
208 static void removeObserver(LLWLPresetsObserver* observer);
209 static void notifyObservers();
210
199public: 211public:
200 212
201 // helper variables 213 // helper variables
@@ -250,12 +262,13 @@ public:
250 F32 mDomeRadius; 262 F32 mDomeRadius;
251 263
252 // list of all the parameters, listed by name 264 // list of all the parameters, listed by name
253 std::map<std::string, LLWLParamSet> mParamList; 265 std::map<std::string, LLWLParamSet> mParamList;
254
255 266
256private: 267private:
257 // our parameter manager singleton instance 268 // our parameter manager singleton instance
258 static LLWLParamManager * sInstance; 269 static LLWLParamManager * sInstance;
270
271 static std::vector<LLWLPresetsObserver*> sObservers;
259 272
260}; 273};
261 274
diff --git a/linden/indra/newview/llworld.cpp b/linden/indra/newview/llworld.cpp
index 5944bce..02c7be3 100644
--- a/linden/indra/newview/llworld.cpp
+++ b/linden/indra/newview/llworld.cpp
@@ -118,6 +118,7 @@ LLWorld::LLWorld() :
118 118
119void LLWorld::destroyClass() 119void LLWorld::destroyClass()
120{ 120{
121 mHoleWaterObjects.clear();
121 gObjectList.destroy(); 122 gObjectList.destroy();
122 for(region_list_t::iterator region_it = mRegionList.begin(); region_it != mRegionList.end(); ) 123 for(region_list_t::iterator region_it = mRegionList.begin(); region_it != mRegionList.end(); )
123 { 124 {
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp
index cc94529..64e84c5 100644
--- a/linden/indra/newview/llworldmapview.cpp
+++ b/linden/indra/newview/llworldmapview.cpp
@@ -73,9 +73,10 @@ const S32 SCROLL_HINT_WIDTH = 65;
73const F32 BIG_DOT_RADIUS = 5.f; 73const F32 BIG_DOT_RADIUS = 5.f;
74BOOL LLWorldMapView::sHandledLastClick = FALSE; 74BOOL LLWorldMapView::sHandledLastClick = FALSE;
75 75
76LLUIImagePtr LLWorldMapView::sAvatarYouSmallImage = NULL;
77LLUIImagePtr LLWorldMapView::sAvatarSmallImage = NULL; 76LLUIImagePtr LLWorldMapView::sAvatarSmallImage = NULL;
78LLUIImagePtr LLWorldMapView::sAvatarLargeImage = NULL; 77LLUIImagePtr LLWorldMapView::sAvatarYouImage = NULL;
78LLUIImagePtr LLWorldMapView::sAvatarYouLargeImage = NULL;
79LLUIImagePtr LLWorldMapView::sAvatarLevelImage = NULL;
79LLUIImagePtr LLWorldMapView::sAvatarAboveImage = NULL; 80LLUIImagePtr LLWorldMapView::sAvatarAboveImage = NULL;
80LLUIImagePtr LLWorldMapView::sAvatarBelowImage = NULL; 81LLUIImagePtr LLWorldMapView::sAvatarBelowImage = NULL;
81 82
@@ -117,11 +118,12 @@ std::map<std::string,std::string> LLWorldMapView::sStringsMap;
117 118
118void LLWorldMapView::initClass() 119void LLWorldMapView::initClass()
119{ 120{
120 sAvatarYouSmallImage = LLUI::getUIImage("map_avatar_you_8.tga");
121 sAvatarSmallImage = LLUI::getUIImage("map_avatar_8.tga"); 121 sAvatarSmallImage = LLUI::getUIImage("map_avatar_8.tga");
122 sAvatarLargeImage = LLUI::getUIImage("map_avatar_16.tga"); 122 sAvatarYouImage = LLUI::getUIImage("map_avatar_16.tga");
123 sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_8.tga"); 123 sAvatarYouLargeImage = LLUI::getUIImage("map_avatar_you_32.tga");
124 sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_8.tga"); 124 sAvatarLevelImage = LLUI::getUIImage("map_avatar_32.tga");
125 sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_32.tga");
126 sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_32.tga");
125 127
126 sHomeImage = LLUI::getUIImage("map_home.tga"); 128 sHomeImage = LLUI::getUIImage("map_home.tga");
127 sTelehubImage = LLUI::getUIImage("map_telehub.tga"); 129 sTelehubImage = LLUI::getUIImage("map_telehub.tga");
@@ -145,9 +147,10 @@ void LLWorldMapView::initClass()
145// static 147// static
146void LLWorldMapView::cleanupClass() 148void LLWorldMapView::cleanupClass()
147{ 149{
148 sAvatarYouSmallImage = NULL;
149 sAvatarSmallImage = NULL; 150 sAvatarSmallImage = NULL;
150 sAvatarLargeImage = NULL; 151 sAvatarYouImage = NULL;
152 sAvatarYouLargeImage = NULL;
153 sAvatarLevelImage = NULL;
151 sAvatarAboveImage = NULL; 154 sAvatarAboveImage = NULL;
152 sAvatarBelowImage = NULL; 155 sAvatarBelowImage = NULL;
153 156
@@ -680,10 +683,43 @@ void LLWorldMapView::draw()
680 // info->mAgents, 683 // info->mAgents,
681 // info->mName.c_str(), 684 // info->mName.c_str(),
682 // LLViewerRegion::accessToShortString(info->mAccess).c_str() ); 685 // LLViewerRegion::accessToShortString(info->mAccess).c_str() );
683 if (info->mAccess == SIM_ACCESS_DOWN) 686// [RLVa:KB] - Alternate: Snowglobe-1.0 | Checked: 2009-07-04 (RLVa-1.0.0a)
687 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
688 {
689 mesg = rlv_handler_t::cstrHidden;
690 }
691 else if (info->mAccess == SIM_ACCESS_DOWN)
692// [/RLVa:KB]
693// if (info->mAccess == SIM_ACCESS_DOWN)
684 { 694 {
685 mesg = llformat( "%s (%s)", info->mName.c_str(), sStringsMap["offline"].c_str()); 695 mesg = llformat( "%s (%s)", info->mName.c_str(), sStringsMap["offline"].c_str());
686 } 696 }
697 else if (gSavedSettings.getBOOL("MapShowAgentCount") && gSavedSettings.getBOOL("MapShowPeople"))
698 {
699 // Display the agent count after the region name
700 S32 agent_count = LLWorldMap::getInstance()->mNumAgents[handle];
701 LLViewerRegion *region = gAgent.getRegion();
702
703 if (region && region->getHandle() == info->mHandle)
704 {
705 ++agent_count; // Bump by 1 if we're in this region
706 }
707
708 if (agent_count > 0)
709 {
710 //TODO: move this and the tooltip strings into XML
711 std::string count = llformat("%d %s", agent_count, agent_count > 1 ? "avatars" : "avatar");
712 font->renderUTF8(
713 count, 0,
714 llfloor(left + 3),
715 llfloor(bottom + 20),
716 LLColor4::white,
717 LLFontGL::LEFT,
718 LLFontGL::BASELINE,
719 LLFontGL::DROP_SHADOW);
720 }
721 mesg = info->mName;
722 }
687 else 723 else
688 { 724 {
689 mesg = info->mName; 725 mesg = info->mName;
@@ -775,7 +811,7 @@ void LLWorldMapView::draw()
775 811
776 // Now draw your avatar after all that other stuff. 812 // Now draw your avatar after all that other stuff.
777 LLVector3d pos_global = gAgent.getPositionGlobal(); 813 LLVector3d pos_global = gAgent.getPositionGlobal();
778 drawImage(pos_global, sAvatarLargeImage); 814 drawImage(pos_global, sAvatarYouImage);
779 815
780 LLVector3 pos_map = globalPosToView(pos_global); 816 LLVector3 pos_map = globalPosToView(pos_global);
781 if (!pointInView(llround(pos_map.mV[VX]), llround(pos_map.mV[VY]))) 817 if (!pointInView(llround(pos_map.mV[VX]), llround(pos_map.mV[VY])))
@@ -1149,7 +1185,10 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&
1149 text_x = llclamp(text_x, half_text_width + TEXT_PADDING, getRect().getWidth() - half_text_width - TEXT_PADDING); 1185 text_x = llclamp(text_x, half_text_width + TEXT_PADDING, getRect().getWidth() - half_text_width - TEXT_PADDING);
1150 text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - llround(font->getLineHeight()) - TEXT_PADDING - vert_offset); 1186 text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - llround(font->getLineHeight()) - TEXT_PADDING - vert_offset);
1151 1187
1152 if (label != "") 1188 //if (label != "")
1189// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) | Added: RLVa-1.0.0a
1190 if ( (label != "") && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) )
1191// [/RLVa:KB]
1153 { 1192 {
1154 font->renderUTF8( 1193 font->renderUTF8(
1155 label, 0, 1194 label, 0,
@@ -1209,7 +1248,10 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* stic
1209 1248
1210 std::string message = 1249 std::string message =
1211 llformat("%s (%s)", 1250 llformat("%s (%s)",
1212 info->mName.c_str(), 1251 //info->mName.c_str(),
1252// [RLVa:KB] - Alternate: Snowglobe-1.0 | Checked: 2009-07-04 (RLVa-1.0.0a)
1253 (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? info->mName.c_str() : rlv_handler_t::cstrHidden.c_str(),
1254// [/RLVa:KB]
1213 LLViewerRegion::accessToString(info->mAccess).c_str()); 1255 LLViewerRegion::accessToString(info->mAccess).c_str());
1214 1256
1215 if (info->mAccess != SIM_ACCESS_DOWN) 1257 if (info->mAccess != SIM_ACCESS_DOWN)
@@ -1228,11 +1270,11 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* stic
1228 1270
1229 if (agent_count == 1) 1271 if (agent_count == 1)
1230 { 1272 {
1231 message += "person"; 1273 message += "avatar";
1232 } 1274 }
1233 else 1275 else
1234 { 1276 {
1235 message += "people"; 1277 message += "avatars";
1236 } 1278 }
1237 } 1279 }
1238 } 1280 }
@@ -1308,7 +1350,7 @@ void LLWorldMapView::drawAvatar(F32 x_pixels,
1308 F32 dot_radius) 1350 F32 dot_radius)
1309{ 1351{
1310 const F32 HEIGHT_THRESHOLD = 7.f; 1352 const F32 HEIGHT_THRESHOLD = 7.f;
1311 LLUIImagePtr dot_image = sAvatarSmallImage; 1353 LLUIImagePtr dot_image = sAvatarLevelImage;
1312 if(relative_z < -HEIGHT_THRESHOLD) 1354 if(relative_z < -HEIGHT_THRESHOLD)
1313 { 1355 {
1314 dot_image = sAvatarBelowImage; 1356 dot_image = sAvatarBelowImage;
@@ -1317,9 +1359,13 @@ void LLWorldMapView::drawAvatar(F32 x_pixels,
1317 { 1359 {
1318 dot_image = sAvatarAboveImage; 1360 dot_image = sAvatarAboveImage;
1319 } 1361 }
1362
1363 S32 dot_width = llround(dot_radius * 2.f);
1320 dot_image->draw( 1364 dot_image->draw(
1321 llround(x_pixels) - dot_image->getWidth()/2, 1365 llround(x_pixels - dot_radius),
1322 llround(y_pixels) - dot_image->getHeight()/2, 1366 llround(y_pixels - dot_radius),
1367 dot_width,
1368 dot_width,
1323 color); 1369 color);
1324} 1370}
1325 1371
diff --git a/linden/indra/newview/llworldmapview.h b/linden/indra/newview/llworldmapview.h
index ac3bb3f..3245838 100644
--- a/linden/indra/newview/llworldmapview.h
+++ b/linden/indra/newview/llworldmapview.h
@@ -138,11 +138,13 @@ protected:
138public: 138public:
139 LLColor4 mBackgroundColor; 139 LLColor4 mBackgroundColor;
140 140
141 static LLUIImagePtr sAvatarYouSmallImage;
142 static LLUIImagePtr sAvatarSmallImage; 141 static LLUIImagePtr sAvatarSmallImage;
143 static LLUIImagePtr sAvatarLargeImage; 142 static LLUIImagePtr sAvatarYouImage;
143 static LLUIImagePtr sAvatarYouLargeImage;
144 static LLUIImagePtr sAvatarLevelImage;
144 static LLUIImagePtr sAvatarAboveImage; 145 static LLUIImagePtr sAvatarAboveImage;
145 static LLUIImagePtr sAvatarBelowImage; 146 static LLUIImagePtr sAvatarBelowImage;
147
146 static LLUIImagePtr sTelehubImage; 148 static LLUIImagePtr sTelehubImage;
147 static LLUIImagePtr sInfohubImage; 149 static LLUIImagePtr sInfohubImage;
148 static LLUIImagePtr sHomeImage; 150 static LLUIImagePtr sHomeImage;
diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp
index d6bc6da..6fb2cec 100644
--- a/linden/indra/newview/pipeline.cpp
+++ b/linden/indra/newview/pipeline.cpp
@@ -1963,8 +1963,13 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
1963 1963
1964 if (gHideSelectedObjects) 1964 if (gHideSelectedObjects)
1965 { 1965 {
1966 if (drawablep->getVObj().notNull() && 1966// if (drawablep->getVObj().notNull() &&
1967 drawablep->getVObj()->isSelected()) 1967// drawablep->getVObj()->isSelected())
1968// [RLVa:KB] - Checked: 2009-07-06 (RLVa-1.0.0c)
1969 LLViewerObject* pObj = drawablep->getVObj();
1970 if ( (pObj) && (pObj->isSelected()) &&
1971 ((!rlv_handler_t::isEnabled()) || (!pObj->isHUDAttachment()) || (gRlvHandler.isDetachable(pObj))) )
1972// [/RVLa:KB]
1968 { 1973 {
1969 return; 1974 return;
1970 } 1975 }
@@ -4184,6 +4189,11 @@ void LLPipeline::enableLightsAvatar()
4184 4189
4185void LLPipeline::enableLightsAvatarEdit(const LLColor4& color) 4190void LLPipeline::enableLightsAvatarEdit(const LLColor4& color)
4186{ 4191{
4192 if (mLightingDetail < 1)
4193 {
4194 return;
4195 }
4196
4187 U32 mask = 0x2002; // Avatar backlight only, set ambient 4197 U32 mask = 0x2002; // Avatar backlight only, set ambient
4188 setupAvatarLights(TRUE); 4198 setupAvatarLights(TRUE);
4189 enableLights(mask); 4199 enableLights(mask);
diff --git a/linden/indra/newview/primbackup.cpp b/linden/indra/newview/primbackup.cpp
new file mode 100644
index 0000000..8dbf1df
--- /dev/null
+++ b/linden/indra/newview/primbackup.cpp
@@ -0,0 +1,1106 @@
1
2#include "llviewerprecompiledheaders.h"
3#include "llviewermenu.h"
4
5
6// system library includes
7#include <iostream>
8#include <fstream>
9#include <sstream>
10
11// linden library includes
12#include "llfilepicker.h"
13#include "indra_constants.h"
14#include "llsdserialize.h"
15#include "llsdutil.h"
16
17#include "llcallbacklist.h"
18
19// newview includes
20#include "llagent.h"
21#include "llselectmgr.h"
22#include "lltoolplacer.h"
23
24#include "lltexturecache.h"
25
26#include "llnotify.h"
27
28#include "llapr.h"
29#include "lldir.h"
30#include "llimage.h"
31#include "lllfsthread.h"
32#include "llviewercontrol.h"
33#include "llassetuploadresponders.h"
34#include "lleconomy.h"
35#include "llhttpclient.h"
36#include "lluploaddialog.h"
37#include "lldir.h"
38#include "llinventorymodel.h" // gInventory
39#include "llviewercontrol.h" // gSavedSettings
40#include "llviewermenu.h" // gMenuHolder
41#include "llagent.h"
42#include "llfilepicker.h"
43#include "llfloateranimpreview.h"
44#include "llfloaterbuycurrency.h"
45#include "llfloaterimagepreview.h"
46#include "llfloaternamedesc.h"
47#include "llfloatersnapshot.h"
48#include "llinventorymodel.h" // gInventory
49#include "llresourcedata.h"
50#include "llstatusbar.h"
51#include "llviewercontrol.h" // gSavedSettings
52#include "llviewerimagelist.h"
53#include "lluictrlfactory.h"
54#include "llviewermenu.h" // gMenuHolder
55#include "llviewerregion.h"
56#include "llviewerstats.h"
57#include "llviewerwindow.h"
58#include "llappviewer.h"
59#include "lluploaddialog.h"
60// Included to allow LLTextureCache::purgeTextures() to pause watchdog timeout
61#include "llappviewer.h"
62#include "lltransactiontypes.h"
63
64#include "primbackup.h"
65
66#include "llviewerobjectlist.h"
67
68primbackup* primbackup::sInstance = 0;
69
70class importResponder: public LLNewAgentInventoryResponder
71{
72 public:
73
74 importResponder(const LLSD& post_data,
75 const LLUUID& vfile_id,
76 LLAssetType::EType asset_type)
77 : LLNewAgentInventoryResponder(post_data, vfile_id, asset_type)
78 {
79 }
80
81
82 //virtual
83 virtual void uploadComplete(const LLSD& content)
84 {
85 lldebugs << "LLNewAgentInventoryResponder::result from capabilities" << llendl;
86
87 LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString());
88 LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString());
89
90 // Update L$ and ownership credit information
91 // since it probably changed on the server
92 if (asset_type == LLAssetType::AT_TEXTURE ||
93 asset_type == LLAssetType::AT_SOUND ||
94 asset_type == LLAssetType::AT_ANIMATION)
95 {
96 gMessageSystem->newMessageFast(_PREHASH_MoneyBalanceRequest);
97 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
98 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
99 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
100 gMessageSystem->nextBlockFast(_PREHASH_MoneyData);
101 gMessageSystem->addUUIDFast(_PREHASH_TransactionID, LLUUID::null );
102 gAgent.sendReliableMessage();
103
104// LLStringUtil::format_map_t args;
105// args["[AMOUNT]"] = llformat("%d",LLGlobalEconomy::Singleton::getInstance()->getPriceUpload());
106// LLNotifyBox::showXml("UploadPayment", args);
107 }
108
109 // Actually add the upload to viewer inventory
110 llinfos << "Adding " << content["new_inventory_item"].asUUID() << " "
111 << content["new_asset"].asUUID() << " to inventory." << llendl;
112 if(mPostData["folder_id"].asUUID().notNull())
113 {
114 LLPermissions perm;
115 U32 next_owner_perm;
116 perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
117 if (mPostData["inventory_type"].asString() == "snapshot")
118 {
119 next_owner_perm = PERM_ALL;
120 }
121 else
122 {
123 next_owner_perm = PERM_MOVE | PERM_TRANSFER;
124 }
125 perm.initMasks(PERM_ALL, PERM_ALL, PERM_NONE, PERM_NONE, next_owner_perm);
126 S32 creation_date_now = time_corrected();
127 LLPointer<LLViewerInventoryItem> item
128 = new LLViewerInventoryItem(content["new_inventory_item"].asUUID(),
129 mPostData["folder_id"].asUUID(),
130 perm,
131 content["new_asset"].asUUID(),
132 asset_type,
133 inventory_type,
134 mPostData["name"].asString(),
135 mPostData["description"].asString(),
136 LLSaleInfo::DEFAULT,
137 LLInventoryItem::II_FLAGS_NONE,
138 creation_date_now);
139 gInventory.updateItem(item);
140 gInventory.notifyObservers();
141 }
142 else
143 {
144 llwarns << "Can't find a folder to put it in" << llendl;
145 }
146
147 // remove the "Uploading..." message
148 LLUploadDialog::modalUploadFinished();
149
150 primbackup::getInstance()->update_map(content["new_asset"].asUUID());
151 primbackup::getInstance()->upload_next_asset();
152
153 }
154
155};
156
157
158
159class CacheReadResponder : public LLTextureCache::ReadResponder
160 {
161 public:
162 CacheReadResponder(const LLUUID& id, LLImageFormatted* image)
163 : mFormattedImage(image), mID(id)
164 {
165 setImage(image);
166 }
167 void setData(U8* data, S32 datasize, S32 imagesize, S32 imageformat, BOOL imagelocal)
168 {
169 if(imageformat==IMG_CODEC_TGA && mFormattedImage->getCodec()==IMG_CODEC_J2C)
170 {
171 llwarns<<"Bleh its a tga not saving"<<llendl;
172 mFormattedImage=NULL;
173 mImageSize=0;
174 return;
175 }
176
177 if (mFormattedImage.notNull())
178 {
179 llassert_always(mFormattedImage->getCodec() == imageformat);
180 mFormattedImage->appendData(data, datasize);
181 }
182 else
183 {
184 mFormattedImage = LLImageFormatted::createFromType(imageformat);
185 mFormattedImage->setData(data,datasize);
186 }
187 mImageSize = imagesize;
188 mImageLocal = imagelocal;
189 }
190
191 virtual void completed(bool success)
192 {
193 if(success && (mFormattedImage.notNull()) && mImageSize>0)
194 {
195
196 llinfos << "SUCCESS getting texture "<<mID<< llendl;
197
198 std::string name;
199 mID.toString(name);
200 llinfos << "Saving to "<<(primbackup::getInstance()->getfolder()+"//"+name)<<llendl;
201 if(!mFormattedImage->save(primbackup::getInstance()->getfolder()+"//"+name))
202 {
203 llinfos << "FAIL saving texture "<<mID<< llendl;
204 }
205
206 }
207 else
208 {
209 if(!success)
210 llwarns << "FAIL NOT SUCCESSFUL getting texture "<<mID<< llendl;
211 if(mFormattedImage.isNull())
212 llwarns << "FAIL image is NULL "<<mID<< llendl;
213 }
214
215 primbackup::getInstance()->m_nexttextureready=true;
216 //JUST SAY NO TO APR DEADLOCKING
217 //primbackup::getInstance()->export_next_texture();
218 }
219 private:
220 LLPointer<LLImageFormatted> mFormattedImage;
221 LLUUID mID;
222 };
223
224
225
226primbackup::primbackup()
227: LLFloater( std::string("Prim Import Floater") )
228{
229 LLUICtrlFactory::getInstance()->buildFloater( this, "floater_prim_import.xml" );
230
231 // reposition floater from saved settings
232 //LLRect rect = gSavedSettings.getRect( "FloaterPrimImport" );
233 //reshape( rect.getWidth(), rect.getHeight(), FALSE );
234 //setRect( rect );
235
236 running=false;
237 textures.clear();
238 assetmap.clear();
239 current_asset=LLUUID::null;
240 m_retexture=false;
241 close();
242}
243
244
245////////////////////////////////////////////////////////////////////////////////
246//
247primbackup* primbackup::getInstance()
248{
249 if ( ! sInstance )
250 sInstance = new primbackup();
251
252 return sInstance;
253}
254
255primbackup::~primbackup()
256{
257 // save position of floater
258 gSavedSettings.setRect( "FloaterPrimImport", getRect() );
259 sInstance = 0;
260}
261
262void primbackup::draw()
263{
264 LLFloater::draw();
265}
266
267void primbackup::show()
268{
269 // set the title
270 setTitle( "stuff" );
271 m_curobject=1;
272 m_curprim=0;
273 m_objects=0;
274 m_prims=0;
275 m_textures=0;
276 m_curtexture=0;
277 rezcount=0;
278
279 // make floater appear
280 setVisibleAndFrontmost();
281}
282
283
284void primbackup::onClose( bool app_quitting )
285{
286 setVisible( false );
287 // HACK for fast XML iteration replace with:
288 // destroy();
289}
290
291void primbackup::updateexportnumbers()
292{
293
294 std::stringstream sstr;
295 LLUICtrl * ctrl=this->getChild<LLUICtrl>("name_label");
296
297 sstr<<"Export Progress \n";
298
299 sstr << "Remaining Textures "<<textures.size()<<"\n";
300 ctrl->setValue(LLSD("Text")=sstr.str());
301
302}
303
304
305void primbackup::updateimportnumbers()
306{
307 std::stringstream sstr;
308 LLUICtrl * ctrl=this->getChild<LLUICtrl>("name_label");
309
310 if(m_retexture)
311 {
312 sstr << " Textures uploads remaining : "<<textures.size()<<"\n";
313 ctrl->setValue(LLSD("Text")=sstr.str());
314 }
315 else
316 {
317 sstr << " Textures uploads N/A \n";
318 ctrl->setValue(LLSD("Text")=sstr.str());
319 }
320 sstr << " Objects "<<this->m_curobject<<"/"<<this->m_objects<<"\n";
321 ctrl->setValue(LLSD("Text")=sstr.str());
322
323 sstr << " Rez "<<this->rezcount<<"/"<<this->m_prims;
324 ctrl->setValue(LLSD("Text")=sstr.str());
325
326 sstr << " Build "<<this->m_curprim<<"/"<<this->m_prims;
327 ctrl->setValue(LLSD("Text")=sstr.str());
328
329
330}
331
332void primbackup::pre_export_object()
333{
334 textures.clear();
335 llsd.clear();
336 this_group.clear();
337
338 // Open the file save dialog
339 LLFilePicker& file_picker = LLFilePicker::instance();
340 if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_XML ) )
341 {
342 // User canceled save.
343 return;
344 }
345
346 file_name = file_picker.getCurFile();
347 folder = gDirUtilp->getDirName(file_name);
348
349 export_state=EXPORT_INIT;
350 gIdleCallbacks.addFunction(exportworker, NULL);
351}
352
353
354// static
355bool primbackup::check_perms( LLSelectNode* node )
356{
357 LLPermissions *perms = node->mPermissions;
358 return (gAgent.getID() == perms->getOwner() &&
359 gAgent.getID() == perms->getCreator() &&
360 (PERM_ITEM_UNRESTRICTED &
361 perms->getMaskOwner()) == PERM_ITEM_UNRESTRICTED);
362}
363
364
365void primbackup::exportworker(void *userdata)
366{
367 primbackup::getInstance()->updateexportnumbers();
368
369 switch(primbackup::getInstance()->export_state)
370 {
371 case EXPORT_INIT: {
372 primbackup::getInstance()->show();
373 LLSelectMgr::getInstance()->getSelection()->ref();
374
375 struct ff : public LLSelectedNodeFunctor
376 {
377 virtual bool apply(LLSelectNode* node)
378 {
379 return primbackup::check_perms( node );
380 }
381 } func;
382
383 if(LLSelectMgr::getInstance()->getSelection()->applyToNodes(&func,false))
384 {
385 primbackup::getInstance()->export_state=EXPORT_STRUCTURE;
386 }
387 else
388 {
389 llwarns << "Incorrect permission to export" << llendl;
390 primbackup::getInstance()->export_state=EXPORT_DONE;
391 primbackup::getInstance()->close();
392 gIdleCallbacks.deleteFunction(exportworker);
393 LLSelectMgr::getInstance()->getSelection()->unref();
394 }
395 break;
396 }
397
398 case EXPORT_STRUCTURE: {
399 struct ff : public LLSelectedObjectFunctor
400 {
401 virtual bool apply(LLViewerObject* object)
402 {
403 object->boostTexturePriority(TRUE);
404 LLViewerObject::child_list_t children = object->getChildren();
405 children.push_front(object); //push root onto list
406 LLSD prim_llsd=primbackup::getInstance()->prims_to_llsd(children);
407 LLSD stuff;
408 stuff["root_position"] = object->getPosition().getValue();
409 stuff["root_rotation"] = ll_sd_from_quaternion(object->getRotation());
410 stuff["group_body"] = prim_llsd;
411 primbackup::getInstance()->llsd["data"].append(stuff);
412 return true;
413 }
414 } func;
415
416 primbackup::getInstance()->export_state=EXPORT_LLSD;
417 LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func,false);
418 LLSelectMgr::getInstance()->getSelection()->unref();
419
420 break;
421 }
422
423 case EXPORT_TEXTURES: {
424 if(primbackup::getInstance()->m_nexttextureready==false)
425 return;
426
427 //Ok we got work to do
428 primbackup::getInstance()->m_nexttextureready=false;
429
430 if(primbackup::getInstance()->textures.empty())
431 {
432 primbackup::getInstance()->export_state=EXPORT_DONE;
433 return;
434 }
435
436 primbackup::getInstance()->export_next_texture();
437 break;
438 }
439
440 case EXPORT_LLSD: {
441 // Create a file stream and write to it
442 llofstream export_file(primbackup::getInstance()->file_name);
443 LLSDSerialize::toPrettyXML(primbackup::getInstance()->llsd, export_file);
444 export_file.close();
445 primbackup::getInstance()->m_nexttextureready=true;
446 primbackup::getInstance()->export_state=EXPORT_TEXTURES;
447 break;
448 }
449
450 case EXPORT_DONE: {
451 llinfos << "Backup complete" << llendl;
452 gIdleCallbacks.deleteFunction(exportworker);
453 primbackup::getInstance()->close();
454 break;
455 }
456 }
457}
458
459LLSD primbackup::prims_to_llsd(LLViewerObject::child_list_t child_list)
460{
461
462 LLViewerObject* object;
463 LLSD llsd;
464
465 char localid[16];
466
467 for (LLViewerObject::child_list_t::iterator i = child_list.begin(); i != child_list.end(); ++i)
468 {
469 object=(*i);
470 LLUUID id = object->getID();
471
472 llinfos << "Exporting prim " << object->getID().asString() << llendl;
473
474 // Create an LLSD object that represents this prim. It will be injected in to the overall LLSD
475 // tree structure
476 LLSD prim_llsd;
477
478 if (!object->isRoot())
479 {
480
481 // Parent id
482 snprintf(localid, sizeof(localid), "%u", object->getSubParent()->getLocalID());
483 prim_llsd["parent"] = localid;
484 }
485
486 // Transforms
487 prim_llsd["position"] = object->getPosition().getValue();
488 prim_llsd["scale"] = object->getScale().getValue();
489 prim_llsd["rotation"] = ll_sd_from_quaternion(object->getRotation());
490
491 // Flags
492 prim_llsd["shadows"] = object->flagCastShadows();
493 prim_llsd["phantom"] = object->flagPhantom();
494 prim_llsd["physical"] = (BOOL)(object->mFlags & FLAGS_USE_PHYSICS);
495
496 // Volume params
497 LLVolumeParams params = object->getVolume()->getParams();
498 prim_llsd["volume"] = params.asLLSD();
499
500 // Extra paramsb6fab961-af18-77f8-cf08-f021377a7244
501 if (object->isFlexible())
502 {
503 // Flexible
504 LLFlexibleObjectData* flex = (LLFlexibleObjectData*)object->getParameterEntry(LLNetworkData::PARAMS_FLEXIBLE);
505 prim_llsd["flexible"] = flex->asLLSD();
506 }
507 if (object->getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT))
508 {
509 // Light
510 LLLightParams* light = (LLLightParams*)object->getParameterEntry(LLNetworkData::PARAMS_LIGHT);
511 prim_llsd["light"] = light->asLLSD();
512 }
513 if (object->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT))
514 {
515 // Sculpt
516 LLSculptParams* sculpt = (LLSculptParams*)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
517 prim_llsd["sculpt"] = sculpt->asLLSD();
518
519 LLUUID sculpt_texture=sculpt->getSculptTexture();
520 bool alreadyseen=false;
521 std::list<LLUUID>::iterator iter;
522 for(iter = textures.begin(); iter != textures.end() ; iter++)
523 {
524 if( (*iter)==sculpt_texture)
525 alreadyseen=true;
526 }
527 if(alreadyseen==false)
528 {
529 llinfos << "Found a sculpt texture, adding to list "<<sculpt_texture<<llendl;
530 textures.push_back(sculpt_texture);
531 }
532 }
533
534 // Textures
535 LLSD te_llsd;
536 U8 te_count = object->getNumTEs();
537 for (U8 i = 0; i < te_count; i++)
538 {
539 bool alreadyseen=false;
540 te_llsd.append(object->getTE(i)->asLLSD());
541 std::list<LLUUID>::iterator iter;
542 for(iter = textures.begin(); iter != textures.end() ; iter++)
543 {
544 if( (*iter)==object->getTE(i)->getID())
545 alreadyseen=true;
546 }
547 if(alreadyseen==false)
548 textures.push_back(object->getTE(i)->getID());
549 }
550 prim_llsd["textures"] = te_llsd;
551
552 // The keys in the primitive maps do not have to be localids, they can be any
553 // string. We simply use localids because they are a unique identifier
554 snprintf(localid, sizeof(localid), "%u", object->getLocalID());
555 llsd[(const char*)localid] = prim_llsd;
556 }
557
558 updateexportnumbers();
559
560 return llsd;
561}
562
563
564void primbackup::export_next_texture()
565{
566 if(textures.empty())
567 {
568 llinfos << "Finished exporting textures "<<llendl;
569 return;
570 }
571
572 std::list<LLUUID>::iterator iter;
573 iter = textures.begin();
574
575 LLUUID id;
576
577 while(1)
578 {
579 if(iter==textures.end())
580 {
581 m_nexttextureready=true;
582 return;
583 }
584
585 id=(*iter);
586
587 LLViewerImage * imagep = gImageList.hasImage(id);
588 if(imagep!=NULL)
589 {
590 S32 cur_discard = imagep->getDiscardLevel();
591 if(cur_discard>0)
592 {
593 if(imagep->getBoostLevel()!=LLViewerImage::BOOST_PREVIEW)
594 imagep->setBoostLevel(LLViewerImage::BOOST_PREVIEW); //we want to force discard 0 this one does this.
595 }
596 else
597 {
598 break;
599 }
600 }
601 else
602 {
603 llwarns<<" We *DONT* have the texture "<<llendl;
604 }
605 iter++;
606 }
607
608 textures.remove(id);
609
610 llinfos<<"Requesting texture "<<id<<llendl;
611 LLImageJ2C * mFormattedImage = new LLImageJ2C;
612 CacheReadResponder* responder = new CacheReadResponder(id, mFormattedImage);
613 LLAppViewer::getTextureCache()->readFromCache(id,LLWorkerThread::PRIORITY_HIGH,0,999999,responder);
614}
615
616
617
618void primbackup::import_object(bool upload)
619{
620 textures.clear();
621 assetmap.clear();
622 current_asset=LLUUID::null;
623
624 this->m_retexture=upload;
625
626 // Open the file open dialog
627 LLFilePicker& file_picker = LLFilePicker::instance();
628 if( !file_picker.getOpenFile( LLFilePicker::FFLOAD_XML ) )
629 {
630 // User canceled save.
631 return;
632 }
633 std::string file_name = file_picker.getFirstFile().c_str();
634 folder = gDirUtilp->getDirName(file_name);
635
636 llifstream import_file(file_name);
637 LLSDSerialize::fromXML(llsd, import_file);
638 import_file.close();
639
640 show();
641
642 //Get the texture map
643
644 LLSD::map_const_iterator prim_it;
645 LLSD::array_const_iterator prim_arr_it;
646
647 this->m_curobject=1;
648 this->m_curprim=1;
649 this->m_objects=llsd["data"].size();
650 this->m_prims=0;
651 rezcount=0;
652
653 updateimportnumbers();
654
655 for( prim_arr_it = llsd["data"].beginArray(); prim_arr_it != llsd["data"].endArray(); prim_arr_it++)
656 {
657
658 LLSD llsd2;
659 llsd2=(*prim_arr_it)["group_body"];
660
661 for( prim_it = llsd2.beginMap(); prim_it != llsd2.endMap(); prim_it++)
662 {
663 LLSD prim_llsd;
664 prim_llsd=llsd2[prim_it->first];
665 LLSD::array_iterator text_it;
666 std::list<LLUUID>::iterator iter;
667
668 if(prim_llsd.has("sculpt"))
669 {
670 LLSculptParams* sculpt=new LLSculptParams();
671 sculpt->fromLLSD(prim_llsd["sculpt"]);
672 LLUUID orig=sculpt->getSculptTexture();
673 bool alreadyseen=false;
674 for(iter = textures.begin(); iter != textures.end() ; iter++)
675 {
676 if( (*iter)==orig)
677 alreadyseen=true;
678 }
679 if(alreadyseen==false)
680 {
681 llinfos << "Found a new SCULPT texture to upload "<<orig<<llendl;
682 textures.push_back(orig);
683 }
684 }
685
686
687 LLSD te_llsd;
688 te_llsd=prim_llsd["textures"];
689
690
691 for(text_it=te_llsd.beginArray(); text_it !=te_llsd.endArray(); text_it++)
692 {
693 LLSD the_te;
694 the_te=(*text_it);
695 LLTextureEntry te;
696 te.fromLLSD(the_te);
697
698 te.getID();
699 bool alreadyseen=false;
700
701 for(iter = textures.begin(); iter != textures.end() ; iter++)
702 {
703 if( (*iter)==te.getID())
704 alreadyseen=true;
705 }
706 if(alreadyseen==false)
707 {
708 llinfos << "Found a new texture to upload "<<te.getID()<<llendl;
709 textures.push_back(te.getID());
710 }
711 }
712
713 }
714 }
715
716 if(m_retexture==TRUE)
717 upload_next_asset();
718 else
719 import_object1a();
720}
721
722LLVector3 primbackup::offset_agent(LLVector3 offset)
723{
724 LLVector3 pos= gAgent.getPositionAgent();
725 LLQuaternion agent_rot=LLQuaternion(gAgent.getAtAxis(),gAgent.getLeftAxis(),gAgent.getUpAxis());
726 pos=(offset*agent_rot+pos);
727 return pos;
728}
729
730void primbackup::rez_agent_offset(LLVector3 offset)
731{
732 // This will break for a sitting agent
733 LLToolPlacer* mPlacer = new LLToolPlacer();
734 mPlacer->setObjectType(LL_PCODE_CUBE);
735 //LLVector3 pos=offset_agent(offset);
736 mPlacer->placeObject((S32)(offset.mV[0]), (S32)(offset.mV[1]), 0);
737}
738
739void primbackup::import_object1a()
740{
741 running=true;
742
743 show();
744
745 group_prim_import_iter=llsd["data"].beginArray();
746 root_root_pos=(*group_prim_import_iter)["root_position"];
747
748 this->m_objects=llsd["data"].size();
749 this->m_curobject=1;
750 import_next_object();
751}
752
753void primbackup::import_next_object()
754{
755 toselect.clear();
756 rezcount=0;
757
758 this_group=(*group_prim_import_iter)["group_body"];
759 prim_import_iter=this_group.beginMap();
760
761 m_curprim=0;
762 m_prims=this_group.size();
763 updateimportnumbers();
764 LLVector3 lgpos=(*group_prim_import_iter)["root_position"];
765
766 group_offset=lgpos-root_root_pos;
767 root_pos=offset_agent(LLVector3(2.0,0,0));
768 root_rot=ll_quaternion_from_sd((*group_prim_import_iter)["root_rotation"]);
769
770 rez_agent_offset(LLVector3(0.0,2.0,0.0));
771 // Now we must wait for the callback when ViewerObjectList gets the new objects and we have the correct number selected
772}
773
774// This function takes a pointer to a viewerobject and applys the prim definition that prim_llsd has
775void primbackup::xmltoprim(LLSD prim_llsd,LLViewerObject * object)
776{
777 LLUUID id = object->getID();
778 expecting_update = object->getID();
779 LLSelectMgr::getInstance()->selectObjectAndFamily(object);
780
781 if(prim_llsd.has("parent"))
782 {
783 //we are not the root node.
784 LLVector3 pos=prim_llsd["position"];
785 LLQuaternion rot=ll_quaternion_from_sd(prim_llsd["rotation"]);
786 object->setPositionRegion((pos*root_rot)+(root_pos+group_offset));
787 object->setRotation(rot*root_rot);
788 }
789 else
790 {
791 object->setPositionRegion(root_pos+group_offset);
792 LLQuaternion rot=ll_quaternion_from_sd(prim_llsd["rotation"]);
793 object->setRotation(rot);
794 }
795
796 object->setScale(prim_llsd["scale"]);
797
798 if(prim_llsd.has("shadows"))
799 if(prim_llsd["shadows"].asInteger()==1)
800 object->setFlags(FLAGS_CAST_SHADOWS,true);
801
802 if(prim_llsd.has("phantom"))
803 if(prim_llsd["phantom"].asInteger()==1)
804 object->setFlags(FLAGS_PHANTOM,true);
805
806 if(prim_llsd.has("physical"))
807 if(prim_llsd["physical"].asInteger()==1)
808 object->setFlags(FLAGS_USE_PHYSICS,true);
809
810 // Volume params
811 LLVolumeParams volume_params = object->getVolume()->getParams();
812 volume_params.fromLLSD(prim_llsd["volume"]) ;
813 object->updateVolume(volume_params);
814
815 if(prim_llsd.has("sculpt"))
816 {
817 LLSculptParams* sculpt=new LLSculptParams();
818 sculpt->fromLLSD(prim_llsd["sculpt"]);
819
820 //TODO check if map is valid and only set texture is map is valid and changes
821
822 if(assetmap[sculpt->getSculptTexture()].notNull())
823 {
824 LLUUID replacment=assetmap[sculpt->getSculptTexture()];
825 sculpt->setSculptTexture(replacment);
826 }
827
828 object->setParameterEntry(LLNetworkData::PARAMS_SCULPT,(LLNetworkData&)(*sculpt),true);
829 }
830
831 if(prim_llsd.has("light"))
832 {
833 LLLightParams * light=new LLLightParams();
834 light->fromLLSD(prim_llsd["light"]);
835 object->setParameterEntry(LLNetworkData::PARAMS_LIGHT,(LLNetworkData&)(*light),true);
836 }
837
838 if(prim_llsd.has("flexible"))
839 {
840 LLFlexibleObjectData* flex=new LLFlexibleObjectData();
841 flex->fromLLSD(prim_llsd["flexible"]);
842 object->setParameterEntry(LLNetworkData::PARAMS_FLEXIBLE,(LLNetworkData&)(*flex),true);
843 }
844
845
846 // Textures
847 LLSD te_llsd;
848 llinfos << "Processing textures for prim" << llendl;
849
850 te_llsd=prim_llsd["textures"];
851
852 LLSD::array_iterator text_it;
853 U8 i=0;
854 i=0;
855
856 for(text_it=te_llsd.beginArray(); text_it !=te_llsd.endArray(); text_it++)
857 {
858 LLSD the_te;
859 the_te=(*text_it);
860 LLTextureEntry te;
861 te.fromLLSD(the_te);
862
863 if(assetmap[te.getID()].notNull())
864 {
865 LLUUID replacment=assetmap[te.getID()];
866 te.setID(replacment);
867 }
868
869 object->setTE(i,te); //
870 i++;
871 }
872
873 llinfos << "Textures done!" << llendl;
874
875 //bump the iterator now so the callbacks hook together nicely
876 //if(prim_import_iter!=this_group.endMap())
877 // prim_import_iter++;
878
879 object->sendRotationUpdate();
880 object->sendTEUpdate();
881 object->sendShapeUpdate();
882 LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE |UPD_POSITION);
883
884 LLSelectMgr::getInstance()->deselectAll();
885}
886
887//This is fired when the update packet is processed so we know the prim settings have stuck
888void primbackup::prim_update(LLViewerObject* object)
889{
890 if(!running)
891 return;
892
893 if(object!=NULL)
894 if(object->mID!=expecting_update)
895 return;
896
897 m_curprim++;
898 updateimportnumbers();
899
900 prim_import_iter++;
901
902 LLUUID x;
903 expecting_update=x.null;
904
905 if(prim_import_iter==this_group.endMap())
906 {
907 llinfos<<"Trying to link"<<llendl;
908
909 if(toselect.size()>1)
910 {
911 std::reverse(toselect.begin(),toselect.end());
912 //Now link
913 LLSelectMgr::getInstance()->deselectAll();
914 LLSelectMgr::getInstance()->selectObjectAndFamily(toselect,true);
915 LLSelectMgr::getInstance()->sendLink();
916 LLViewerObject * root=toselect.back();
917 root->setRotation(root_rot);
918 }
919
920 this->m_curobject++;
921 group_prim_import_iter++;
922 if(group_prim_import_iter!=llsd["data"].endArray())
923 {
924 import_next_object();
925 return;
926 }
927
928 running=false;
929 this->close();
930 return;
931 }
932
933 LLSD prim_llsd;
934 prim_llsd=this_group[prim_import_iter->first];
935
936 if(toselect.empty())
937 {
938 llwarns << "error: ran out of objects to mod" << llendl;
939 return;
940 }
941
942 if(prim_import_iter!=this_group.endMap())
943 {
944 //rez_agent_offset(LLVector3(1.0,0,0));
945 LLSD prim_llsd=this_group[prim_import_iter->first];
946 process_iter++;
947 xmltoprim(prim_llsd,(*process_iter));
948 }
949}
950
951// Callback when we rez a new object when the importer is running.
952bool primbackup::newprim(LLViewerObject * pobject)
953{
954 if(running)
955 {
956 rezcount++;
957 toselect.push_back(pobject);
958 updateimportnumbers();
959 prim_import_iter++;
960
961 if(prim_import_iter!=this_group.endMap())
962 {
963
964 pobject->setPosition(this->offset_agent(LLVector3(0,1.0,0)));
965 LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION);
966
967 rez_agent_offset(LLVector3(1.0,0,0));
968 }
969 else
970 {
971 llinfos << "All prims rezed, moving to build stage" <<llendl;
972 prim_import_iter=this_group.beginMap();
973 LLSD prim_llsd=this_group[prim_import_iter->first];
974 process_iter=toselect.begin();
975 xmltoprim(prim_llsd,(*process_iter));
976 }
977 }
978
979 return true;
980}
981
982void primbackup::update_map(LLUUID uploaded_asset)
983{
984 if(current_asset.isNull())
985 return;
986
987 assetmap.insert(std::pair<LLUUID,LLUUID>(current_asset,uploaded_asset));
988 llinfos << "Mapping "<<current_asset<<" to "<<uploaded_asset<<llendl;
989
990}
991
992
993void myupload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,
994 std::string name,
995 std::string desc, S32 compression_info,
996 LLAssetType::EType destination_folder_type,
997 LLInventoryType::EType inv_type,
998 U32 next_owner_perm,
999 const std::string& display_name,
1000 LLAssetStorage::LLStoreAssetCallback callback,
1001 void *userdata)
1002{
1003 if(gDisconnected)
1004 {
1005 return ;
1006 }
1007
1008 LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
1009
1010 // At this point, we're ready for the upload.
1011 std::string upload_message = "Uploading...\n\n";
1012 upload_message.append(display_name);
1013 LLUploadDialog::modalUploadDialog(upload_message);
1014
1015 std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
1016 if (!url.empty())
1017 {
1018 LLSD body;
1019 body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type);
1020 body["asset_type"] = LLAssetType::lookup(asset_type);
1021 body["inventory_type"] = LLInventoryType::lookup(inv_type);
1022 body["name"] = name;
1023 body["description"] = desc;
1024
1025 std::ostringstream llsdxml;
1026 LLSDSerialize::toXML(body, llsdxml);
1027 lldebugs << "posting body to capability: " << llsdxml.str() << llendl;
1028 //LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type));
1029 LLHTTPClient::post(url, body, new importResponder(body, uuid, asset_type));
1030
1031 }
1032 else
1033 {
1034 llinfos << "NewAgentInventory capability not found, FUCK!" << llendl;
1035 }
1036}
1037
1038
1039
1040void primbackup::upload_next_asset()
1041{
1042 if(textures.empty())
1043 {
1044 llinfos<<" Texture list is empty, moving to rez statge"<< llendl;
1045 current_asset=LLUUID::null;
1046 import_object1a();
1047 return;
1048 }
1049
1050 this->updateimportnumbers();
1051
1052 std::list<LLUUID>::iterator iter;
1053 iter=textures.begin();
1054 LLUUID id=(*iter);
1055 textures.pop_front();
1056
1057 llinfos<<"Got texture ID "<<id<< "trying to upload"<<llendl;
1058
1059 current_asset=id;
1060 std::string struid;
1061 id.toString(struid);
1062 std::string filename=folder+"//"+struid;
1063
1064
1065 LLAssetID uuid;
1066 LLTransactionID tid;
1067
1068 // gen a new transaction ID for this asset
1069 tid.generate();
1070 uuid = tid.makeAssetID(gAgent.getSecureSessionID());
1071
1072 S32 file_size;
1073 apr_file_t* fp = ll_apr_file_open(filename, LL_APR_RB, &file_size);
1074 if (fp)
1075 {
1076 const S32 buf_size = 65536;
1077 U8 copy_buf[buf_size];
1078 LLVFile file(gVFS, uuid, LLAssetType::AT_TEXTURE, LLVFile::WRITE);
1079 file.setMaxSize(file_size);
1080
1081 while ((file_size = ll_apr_file_read(fp, copy_buf, buf_size)))
1082 {
1083 file.write(copy_buf, file_size);
1084 }
1085 apr_file_close(fp);
1086 }
1087 else
1088 {
1089 llwarns<<"Unable to access output file "<<filename<<llendl;
1090 upload_next_asset();
1091 return;
1092 }
1093
1094 myupload_new_resource(
1095 tid, LLAssetType::AT_TEXTURE, struid,
1096 struid, 0,
1097 LLAssetType::AT_TEXTURE,
1098 LLInventoryType::defaultForAssetType(LLAssetType::AT_TEXTURE),
1099 0x0,
1100 "Uploaded texture",
1101 NULL,
1102 NULL);
1103
1104
1105}
1106
diff --git a/linden/indra/newview/primbackup.h b/linden/indra/newview/primbackup.h
new file mode 100644
index 0000000..cbd757a
--- /dev/null
+++ b/linden/indra/newview/primbackup.h
@@ -0,0 +1,134 @@
1
2#include "llviewerinventory.h"
3
4#define LL_GRID_PERMISSIONS 1
5
6enum export_states {EXPORT_INIT,EXPORT_STRUCTURE,EXPORT_TEXTURES,EXPORT_LLSD,EXPORT_DONE};
7
8class primbackup : public LLFloater
9
10{
11 public:
12 //Export state machine
13 enum export_states export_state;
14
15 //Export idle callback
16 static void exportworker(void *userdata);
17
18 //Static accessor
19 static primbackup* getInstance();
20
21 static bool check_perms( LLSelectNode* node );
22
23 virtual ~primbackup();
24
25 //Floater stuff
26 virtual void show();
27 virtual void draw();
28 virtual void onClose( bool app_quitting );
29
30 //Import entry point
31 void import_object(bool upload=FALSE);
32
33 //Export entry point
34 void pre_export_object();
35
36 //Update map from texture worker
37 void update_map(LLUUID uploaded_asset);
38
39 //Move to next texture upload
40 void upload_next_asset();
41
42 // is ready for next texture?
43 bool m_nexttextureready;
44
45 //Folder public geter
46 std::string getfolder() {return folder;};
47
48 //Prim updated callback
49 void prim_update(LLViewerObject* object);
50
51 //New prim call back
52 bool newprim(LLViewerObject * pobject);
53
54private:
55
56 //Static singleton stuff
57 primbackup();
58 static primbackup* sInstance;
59
60 // are we active flag
61 bool running;
62
63 //file and folder name control
64 std::string file_name;
65 std::string folder;
66
67 // True if we need to rebase the assets
68 bool m_retexture;
69
70 //Counts of import and export objects and textures and prims
71 int m_objects,m_curobject;
72 int m_prims,m_curprim;
73 int m_textures,m_curtexture;
74
75 // No prims rezed
76 int rezcount;
77
78 // Update the floater with status numbers
79 void updateimportnumbers();
80 void updateexportnumbers();
81
82 //Convert a selection list of objects to LLSD
83 LLSD prims_to_llsd(LLViewerObject::child_list_t child_list);
84
85 // Start the import process
86 void import_object1a();
87
88 //Export the next texture in list
89 void export_next_texture();
90
91 //apply LLSD to object
92 void xmltoprim(LLSD prim_llsd,LLViewerObject * pobject);
93
94
95 //rez a prim at a given position (note not agent offset X/Y screen for raycast)
96 void rez_agent_offset(LLVector3 offset);
97
98 //Move to the next import group
99 void import_next_object();
100
101 //Get an offset from the agent based on rotation and current pos
102 LLVector3 offset_agent(LLVector3 offset);
103
104 // Rebase map
105 std::map<LLUUID,LLUUID> assetmap;
106
107 //Export texture list
108 std::list<LLUUID> textures;
109
110 //Import object tracking
111 std::vector<LLViewerObject *> toselect;
112 std::vector<LLViewerObject *>::iterator process_iter;
113
114 //Working LLSD holders
115 LLUUID current_asset;
116 LLSD llsd;
117 LLSD this_group;
118 LLUUID expecting_update;
119
120 //working llsd itterators for objects and linksets
121 LLSD::map_const_iterator prim_import_iter;
122 LLSD::array_const_iterator group_prim_import_iter;
123
124 // Root pos and central root pos for link set
125 LLVector3 root_pos;
126 LLVector3 root_root_pos;
127 LLVector3 group_offset;
128
129 //Agent inital pos and rot when starting import
130 LLQuaternion root_rot;
131 LLQuaternion agent_rot;
132
133};
134
diff --git a/linden/indra/newview/res/viewerRes.rc b/linden/indra/newview/res/viewerRes.rc
index d5392c9..5e57841 100644
--- a/linden/indra/newview/res/viewerRes.rc
+++ b/linden/indra/newview/res/viewerRes.rc
@@ -138,8 +138,8 @@ TOOLMEDIAOPEN CURSOR "toolmediaopen.cur"
138// 138//
139 139
140VS_VERSION_INFO VERSIONINFO 140VS_VERSION_INFO VERSIONINFO
141 FILEVERSION 1,23,4,123523 141 FILEVERSION 1,3,0
142 PRODUCTVERSION 1,23,4,123523 142 PRODUCTVERSION 1,3,0
143 FILEFLAGSMASK 0x3fL 143 FILEFLAGSMASK 0x3fL
144#ifdef _DEBUG 144#ifdef _DEBUG
145 FILEFLAGS 0x1L 145 FILEFLAGS 0x1L
@@ -156,12 +156,11 @@ BEGIN
156 BEGIN 156 BEGIN
157 VALUE "CompanyName", "Imprudence Viewer Project" 157 VALUE "CompanyName", "Imprudence Viewer Project"
158 VALUE "FileDescription", "Imprudence" 158 VALUE "FileDescription", "Imprudence"
159 VALUE "FileVersion", "1.0.0" 159 VALUE "FileVersion", "1.3.0"
160 VALUE "InternalName", "Imprudence" 160 VALUE "InternalName", "Imprudence"
161 VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc."
162 VALUE "OriginalFilename", "Imprudence.exe" 161 VALUE "OriginalFilename", "Imprudence.exe"
163 VALUE "ProductName", "Imprudence" 162 VALUE "ProductName", "Imprudence"
164 VALUE "ProductVersion", "1.0.0" 163 VALUE "ProductVersion", "1.3.0"
165 END 164 END
166 END 165 END
167 BLOCK "VarFileInfo" 166 BLOCK "VarFileInfo"
diff --git a/linden/indra/newview/rlvdefines.h b/linden/indra/newview/rlvdefines.h
new file mode 100644
index 0000000..118ba31
--- /dev/null
+++ b/linden/indra/newview/rlvdefines.h
@@ -0,0 +1,212 @@
1#ifndef RLV_DEFINES_H
2#define RLV_DEFINES_H
3
4// ============================================================================
5// Extensions
6//
7
8// Comment out if you don't want the Advanced / RLVa menu (may prevent enabling some extensions or experimental features - see below)
9#define RLV_ADVANCED_MENU
10// Comment out if you provide your own way to enable/disable RLVa
11#define RLV_ADVANCED_TOGGLE_RLVA
12
13// Provides access to "advanced" feature through the RLVa debug menu
14#define RLV_EXTENSION_ENABLE_WEAR // "Enable Wear"
15#define RLV_EXTENSION_FLOATER_RESTRICTIONS // Enables the Advanced / RLVa / Restrictions... floater
16#define RLV_EXTENSION_HIDELOCKED // "Hide locked layers", "Hide locked attachments" and "Hide locked inventory"
17
18// Extensions
19#define RLV_EXTENSION_CMD_GETSETDEBUG_EX // Extends the debug variables accessible through @getdebug_xxx/@setdebug_xxx
20#define RLV_EXTENSION_CMD_FINDFOLDERS // @findfolders:<option>=<channel> - @findfolder with multiple results
21#define RLV_EXTENSION_FLAG_NOSTRIP // Layers and attachments marked as "nostrip" are exempt from @detach/@remoutfit
22#define RLV_EXTENSION_STARTLOCATION // Reenables "Start Location" at login if not @tploc=n or @unsit=n restricted at last logoff
23#define RLV_EXPERIMENTAL // Enables/disables experimental features en masse
24
25// Experimental features
26#ifdef RLV_EXPERIMENTAL
27 // Stable (will mature to RLV_EXTENSION_XXX in next release if no bugs are found)
28 #define RLV_EXPERIMENTAL_FARTOUCH_FEEDBACK // Enables "cleaner" UI responses when fartouch blocks something
29
30 // Under testing (stable, but requires further testing - safe for public release but may be quirky)
31 #define RLV_EXPERIMENTAL_FIRSTUSE // Enables a number of "first use" popups
32
33 // Under development (don't include in public release)
34 #if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
35 #endif // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
36#endif // RLV_EXPERIMENTAL
37
38// ============================================================================
39// Defines
40//
41
42// Version of the specifcation we support
43const S32 RLV_VERSION_MAJOR = 1;
44const S32 RLV_VERSION_MINOR = 21;
45const S32 RLV_VERSION_PATCH = 0;
46const S32 RLV_VERSION_BUILD = 0;
47
48// Implementation version
49const S32 RLVa_VERSION_MAJOR = 1;
50const S32 RLVa_VERSION_MINOR = 0;
51const S32 RLVa_VERSION_PATCH = 4;
52const S32 RLVa_VERSION_BUILD = 4;
53
54// The official viewer version we're patching against
55#define RLV_MAKE_TARGET(x, y, z) ((x << 16) | (y << 8) | z)
56#define RLV_TARGET RLV_MAKE_TARGET(1, 22, 11)
57
58// Defining these makes it easier if we ever need to change our tag
59#define RLV_WARNS LL_WARNS("RLV")
60#define RLV_INFOS LL_INFOS("RLV")
61#define RLV_DEBUGS LL_DEBUGS("RLV")
62
63#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
64 // Turn on extended debugging information
65 #define RLV_DEBUG
66 // Make sure we halt execution on errors
67 #define RLV_ERRS LL_ERRS("RLV")
68 // Uncomment to enable the Advanced / RLVa / Unit Tests menu (non-public)
69 //#define RLV_DEBUG_TESTS
70#else
71 // Uncomment if you want extended debugging information on release builds
72 //#define RLV_DEBUG
73 // Don't halt execution on errors in release
74 #define RLV_ERRS LL_WARNS("RLV")
75#endif // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
76
77#define RLV_ROOT_FOLDER "#RLV"
78#define RLV_CMD_PREFIX '@'
79#define RLV_PUTINV_PREFIX "#RLV/~"
80#define RLV_SETROT_OFFSET F_PI_BY_TWO // @setrot is off by 90° with the rest of SL
81
82#define RLV_FOLDER_FLAG_NOSTRIP "nostrip"
83#define RLV_FOLDER_PREFIX_HIDDEN '.'
84#define RLV_FOLDER_PREFIX_PUTINV '~'
85
86// ============================================================================
87// Enumeration declarations
88//
89
90// NOTE: any changes to this enumeration should be reflected in initLookupTable()
91enum ERlvBehaviour {
92 RLV_BHVR_VERSION = 0, // "version"
93 RLV_BHVR_DETACH, // "detach"
94 RLV_BHVR_SENDCHAT, // "sendchat"
95 RLV_BHVR_EMOTE, // "emote"
96 RLV_BHVR_CHATSHOUT, // "chatshout"
97 RLV_BHVR_CHATNORMAL, // "chatnormal"
98 RLV_BHVR_CHATWHISPER, // "chatwhisper"
99 RLV_BHVR_REDIRCHAT, // "redirchat"
100 RLV_BHVR_REDIREMOTE, // "rediremote"
101 RLV_BHVR_SENDIM, // "sendim"
102 RLV_BHVR_RECVCHAT, // "recvchat"
103 RLV_BHVR_RECVEMOTE, // "recvemote"
104 RLV_BHVR_RECVIM, // "recvim"
105 RLV_BHVR_TPLM, // "tplm"
106 RLV_BHVR_TPLOC, // "tploc"
107 RLV_BHVR_TPLURE, // "tplure"
108 RLV_BHVR_SITTP, // "sittp"
109 RLV_BHVR_EDIT, // "edit"
110 RLV_BHVR_REZ, // "rez"
111 RLV_BHVR_ADDOUTFIT, // "addoutfit"
112 RLV_BHVR_REMOUTFIT, // "remoutfit"
113 RLV_BHVR_GETOUTFIT, // "getoutfit"
114 RLV_BHVR_GETATTACH, // "getattach"
115 RLV_BHVR_SHOWINV, // "showinv"
116 RLV_BHVR_VIEWNOTE, // "viewnote"
117 RLV_BHVR_UNSIT, // "unsit"
118 RLV_BHVR_SIT, // "sit"
119 RLV_BHVR_SENDCHANNEL, // "sendchannel"
120 RLV_BHVR_GETSTATUS, // "getstatus"
121 RLV_BHVR_GETSTATUSALL, // "getstatusall"
122 RLV_BHVR_GETINV, // "getinv"
123 RLV_BHVR_GETINVWORN, // "getinvworn"
124 RLV_BHVR_FINDFOLDER, // "findfolder"
125 RLV_BHVR_FINDFOLDERS, // "findfolders"
126 RLV_BHVR_ATTACH, // "attach"
127 RLV_BHVR_ATTACHALL, // "attachall"
128 RLV_BHVR_DETACHALL, // "detachall"
129 RLV_BHVR_GETPATH, // "getpath"
130 RLV_BHVR_ATTACHTHIS, // "attachthis"
131 RLV_BHVR_ATTACHALLTHIS, // "attachallthis"
132 RLV_BHVR_DETACHTHIS, // "detachthis"
133 RLV_BHVR_DETACHALLTHIS, // "detachallthis"
134 RLV_BHVR_FARTOUCH, // "fartouch"
135 RLV_BHVR_SHOWWORLDMAP, // "showworldmap"
136 RLV_BHVR_SHOWMINIMAP, // "showminimap"
137 RLV_BHVR_SHOWLOC, // "showloc"
138 RLV_BHVR_TPTO, // "tpto"
139 RLV_BHVR_ACCEPTTP, // "accepttp"
140 RLV_BHVR_ACCEPTPERMISSION, // "acceptpermission"
141 RLV_BHVR_SHOWNAMES, // "shownames"
142 RLV_BHVR_FLY, // "fly"
143 RLV_BHVR_GETSITID, // "getsitid"
144 RLV_BHVR_SETDEBUG, // "setdebug"
145 RLV_BHVR_SETENV, // "setenv"
146 RLV_BHVR_DETACHME, // "detachme"
147 RLV_BHVR_SHOWHOVERTEXTALL, // "showhovertextall"
148 RLV_BHVR_SHOWHOVERTEXTWORLD, // "showhovertextworld"
149 RLV_BHVR_SHOWHOVERTEXTHUD, // "showhovertexthud"
150 RLV_BHVR_SHOWHOVERTEXT, // "showhovertext"
151 RLV_BHVR_NOTIFY, // "notify"
152 RLV_BHVR_DEFAULTWEAR, // "defaultwear"
153 RLV_BHVR_VERSIONNUM, // "versionnum"
154 RLV_BHVR_PERMISSIVE, // "permissive"
155
156 RLV_BHVR_COUNT,
157 RLV_BHVR_UNKNOWN
158};
159
160enum ERlvParamType {
161 RLV_TYPE_UNKNOWN,
162 RLV_TYPE_ADD, // <param> == "n"|"add"
163 RLV_TYPE_REMOVE, // <param> == "y"|"rem"
164 RLV_TYPE_FORCE, // <param> == "force"
165 RLV_TYPE_REPLY, // <param> == <number>
166 RLV_TYPE_CLEAR
167};
168
169enum ERlvCmdRet {
170 RLV_RET_NOERROR, // Command executed succesfully
171 RLV_RET_RETAINED, // Command was retained
172 RLV_RET_DISABLED, // Command is disabled (by user)
173 RLV_RET_FAILED, // Command failed (general failure)
174 RLV_RET_FAILED_SYNTAX, // Command failed (syntax error)
175 RLV_RET_FAILED_UNSET, // Command failed (unset restriction)
176 RLV_RET_FAILED_DUPLICATE, // Command failed (duplicate)
177 RLV_RET_FAILED_OPTION, // Command failed (invalid option)
178 RLV_RET_FAILED_PARAM, // Command failed (invalid param)
179 RLV_RET_UNKNOWN // Command unkown
180};
181
182enum ERlvExceptionCheck {
183 RLV_CHECK_PERMISSIVE, // Exception can be set by any object
184 RLV_CHECK_STRICT, // Exception must be set by all objects holding the restriction
185 RLV_CHECK_DEFAULT // Permissive or strict will be determined by currently enforced restrictions
186};
187
188// ============================================================================
189// Settings
190
191#define RLV_SETTING_MAIN "RestrainedLife"
192#define RLV_SETTING_DEBUG "RestrainedLifeDebug"
193#define RLV_SETTING_NOSETENV "RestrainedLifeNoSetEnv"
194#define RLV_SETTING_FORBIDGIVETORLV "RestrainedLifeForbidGiveToRLV"
195
196#define RLV_SETTING_ENABLEWEAR "RLVaEnableWear"
197#define RLV_SETTING_ENABLELEGACYNAMING "RLVaEnableLegacyNaming"
198#define RLV_SETTING_HIDELOCKEDLAYER "RLVaHideLockedLayers"
199#define RLV_SETTING_HIDELOCKEDATTACH "RLVaHideLockedAttachments"
200#define RLV_SETTING_HIDELOCKEDINVENTORY "RLVaHideLockedInventory"
201#define RLV_SETTING_LOGINLASTLOCATION "RLVaLoginLastLocation"
202#define RLV_SETTING_SHOWNAMETAGS "RLVaShowNameTags"
203
204#define RLV_SETTING_FIRSTUSE_PREFIX "FirstRLV"
205#define RLV_SETTING_FIRSTUSE_DETACH RLV_SETTING_FIRSTUSE_PREFIX"Detach"
206#define RLV_SETTING_FIRSTUSE_ENABLEWEAR RLV_SETTING_FIRSTUSE_PREFIX"EnableWear"
207#define RLV_SETTING_FIRSTUSE_FARTOUCH RLV_SETTING_FIRSTUSE_PREFIX"Fartouch"
208#define RLV_SETTING_FIRSTUSE_GIVETORLV RLV_SETTING_FIRSTUSE_PREFIX"GiveToRLV"
209
210// ============================================================================
211
212#endif // RLV_DEFINES_H
diff --git a/linden/indra/newview/rlvevent.h b/linden/indra/newview/rlvevent.h
new file mode 100644
index 0000000..a98996f
--- /dev/null
+++ b/linden/indra/newview/rlvevent.h
@@ -0,0 +1,227 @@
1#ifndef RLV_EVENTEMITTER_H
2#define RLV_EVENTEMITTER_H
3
4#include <algorithm>
5#include <typeinfo>
6#include <list>
7
8#include "lluuid.h"
9
10#include "rlvhelper.h"
11
12// ============================================================================
13// RlvEvent - Passed to observer event handlers (contains the same paramaters as RlvHandler::processXXXCommand)
14//
15
16class RlvEvent
17{
18public:
19 RlvEvent(const LLUUID& uuid, const RlvCommand& rlvCmd) : m_UUID(uuid), m_rlvCmd(rlvCmd) {}
20 virtual ~RlvEvent() {}
21
22 const LLUUID& getSenderID() const { return m_UUID; };
23 const RlvCommand& getCommand() const { return m_rlvCmd; };
24
25protected:
26 LLUUID m_UUID;
27 RlvCommand m_rlvCmd;
28};
29
30// ============================================================================
31/*
32 * RlvObserver
33 * ===========
34 * Provides a way to extend the existing command set without changing the main RlvHandler class
35 *
36 * Steps:
37 * - derive your class from RlvObserver
38 * - override any of the event functions you need
39 * - add it as an observer: gRlvHandler.addObserver(new RlbObserverDerivedClass());
40 * - done
41 *
42 * Notes:
43 * - as long as you don't call gRlvHandler.remObserver() your class will be cleaned up from
44 * RlvEventEmitter destructor (see below)
45 * - event handlers are called only if RlvHandler didn't handle it so while you can
46 * add a new command @foobar=n, you won't get called for @detach=n
47 * - event handlers are called *after* the command is added so a call to
48 * RlvHandler::hasBehaviour("foobar") would return TRUE
49 * - return TRUE if you handled the command (won't get passed on to the next observer)
50 * return FALSE if you didn't handle the command (gets passed on to the next observer)
51 *
52 */
53
54class RlvObserver
55{
56public:
57 virtual ~RlvObserver() {}
58
59 typedef RlvEvent EventType;
60
61 virtual BOOL onAddCommand(const EventType& rlvEvent) { return FALSE; }
62 virtual BOOL onRemoveCommand(const EventType& rlvEvent) { return FALSE; }
63 virtual BOOL onClearCommand(const EventType& rlvEvent) { return FALSE; }
64 virtual BOOL onReplyCommand(const EventType& rlvEvent) { return FALSE; }
65 virtual BOOL onForceCommand(const EventType& rlvEvent) { return FALSE; }
66};
67
68// ============================================================================
69/*
70 * RlvEventEmitter
71 * ===============
72 * Essentially a slightly modified eventEmitter (see lleventemitter.h)
73 *
74 * Changes:
75 * - if an event handler returns TRUE then no further observers are notified
76 * - cleans up the (remaining) observers in the destructor
77 */
78
79template < class T >
80class RlvEventEmitter
81{
82 public:
83 typedef typename T::EventType EventType;
84 typedef std::list< T* > ObserverContainer;
85 typedef BOOL ( T::*observerMethod )( const EventType& );
86
87 protected:
88 ObserverContainer observers;
89
90 public:
91 RlvEventEmitter() { };
92
93 ~RlvEventEmitter()
94 {
95 clearObservers();
96 }
97
98 BOOL addObserver ( T* observerIn )
99 {
100 if ( ! observerIn )
101 return FALSE;
102
103 // check if observer already exists
104 if ( std::find ( observers.begin (), observers.end (), observerIn ) != observers.end () )
105 return FALSE;
106
107 // save it
108 observers.push_back ( observerIn );
109
110 return true;
111 }
112
113 BOOL remObserver ( T* observerIn )
114 {
115 if ( ! observerIn )
116 return FALSE;
117
118 observers.remove ( observerIn );
119
120 return TRUE;
121 }
122
123 void clearObservers()
124 {
125 typename std::list< T* >::iterator iter = observers.begin ();
126
127 while (iter != observers.end ())
128 {
129 delete *iter;
130 ++iter;
131 };
132
133 observers.clear();
134 }
135
136 BOOL update ( observerMethod method, const EventType& msgIn )
137 {
138 typename std::list< T* >::iterator iter = observers.begin ();
139
140 BOOL fContinue = TRUE;
141 while ( (iter != observers.end ()) && (fContinue) )
142 {
143 fContinue = !( ( ( *iter )->*method ) ( msgIn ) );
144 ++iter;
145 };
146
147 return !fContinue;
148 }
149};
150
151// ============================================================================
152
153class RlvBehaviourObserver
154{
155public:
156 virtual ~RlvBehaviourObserver() {}
157 virtual void changed(const RlvCommand& rlvCmd, bool fInternal) = 0;
158};
159
160// ============================================================================
161
162class RlvBehaviourNotifyObserver : public RlvBehaviourObserver
163{
164public:
165 virtual ~RlvBehaviourNotifyObserver() { }
166
167 void changed(const RlvCommand& rlvCmd, bool fInternal)
168 {
169 if (fInternal)
170 return;
171
172 std::string strCmd = rlvCmd.asString(), strNotify; ERlvParamType eCmdType = rlvCmd.getParamType();
173 if ( (RLV_TYPE_ADD == eCmdType) || (RLV_TYPE_REMOVE == eCmdType) )
174 strNotify = llformat("/%s=%s", strCmd.c_str(), rlvCmd.getParam().c_str());
175 else if (RLV_TYPE_CLEAR == eCmdType)
176 strNotify = llformat("/%s", strCmd.c_str());
177 else
178 return;
179
180 for (std::multimap<LLUUID, notifyData>::const_iterator itNotify = m_Notifications.begin();
181 itNotify != m_Notifications.end(); ++itNotify)
182 {
183 if ( (itNotify->second.strFilter.empty()) || (std::string::npos != strCmd.find(itNotify->second.strFilter)) )
184 rlvSendChatReply(itNotify->second.nChannel, strNotify);
185 }
186 }
187
188 void addNotify(const LLUUID& idObj, S32 nChannel, const std::string& strFilter)
189 {
190 m_Notifications.insert(std::pair<LLUUID, notifyData>(idObj, notifyData(nChannel, strFilter)));
191 }
192
193 void clearNotify(const LLUUID& idObj)
194 {
195 m_Notifications.erase(idObj);
196 }
197
198 bool hasNotify()
199 {
200 return (m_Notifications.size() != 0);
201 }
202
203 void removeNotify(const LLUUID& idObj, S32 nChannel, const std::string& strFilter)
204 {
205 for (std::multimap<LLUUID, notifyData>::iterator itNotify = m_Notifications.lower_bound(idObj),
206 endNotify = m_Notifications.upper_bound(idObj); itNotify != endNotify; ++itNotify)
207 {
208 if ( (itNotify->second.nChannel == nChannel) && (itNotify->second.strFilter == strFilter) )
209 {
210 m_Notifications.erase(itNotify);
211 break;
212 }
213 }
214 }
215protected:
216 struct notifyData
217 {
218 S32 nChannel;
219 std::string strFilter;
220 notifyData(S32 channel, const std::string& filter) : nChannel(channel), strFilter(filter) {}
221 };
222 std::multimap<LLUUID, notifyData> m_Notifications;
223};
224
225// ============================================================================
226
227#endif // RLV_EVENTEMITTER_H
diff --git a/linden/indra/newview/rlvextensions.cpp b/linden/indra/newview/rlvextensions.cpp
new file mode 100644
index 0000000..f31c62e
--- /dev/null
+++ b/linden/indra/newview/rlvextensions.cpp
@@ -0,0 +1,497 @@
1#include "llviewerprecompiledheaders.h"
2#include "llagent.h"
3#include "llfloaterwindlight.h"
4#include "llviewercontrol.h"
5#include "llviewerwindow.h"
6#include "llvoavatar.h"
7#include "llwlparammanager.h"
8
9#include "rlvextensions.h"
10#include "rlvhandler.h"
11
12// ============================================================================
13
14std::map<std::string, S16> RlvExtGetSet::m_DbgAllowed;
15std::map<std::string, std::string> RlvExtGetSet::m_PseudoDebug;
16
17// Checked: 2009-06-03 (RLVa-0.2.0h) | Modified: RLVa-0.2.0h
18RlvExtGetSet::RlvExtGetSet()
19{
20 if (!m_DbgAllowed.size()) // m_DbgAllowed is static and should only be initialized once
21 {
22 m_DbgAllowed.insert(std::pair<std::string, S16>("AvatarSex", DBG_READ | DBG_WRITE | DBG_PSEUDO));
23 m_DbgAllowed.insert(std::pair<std::string, S16>("RenderResolutionDivisor", DBG_READ | DBG_WRITE));
24 #ifdef RLV_EXTENSION_CMD_GETSETDEBUG_EX
25 m_DbgAllowed.insert(std::pair<std::string, S16>(RLV_SETTING_FORBIDGIVETORLV, DBG_READ));
26 m_DbgAllowed.insert(std::pair<std::string, S16>(RLV_SETTING_NOSETENV, DBG_READ));
27 m_DbgAllowed.insert(std::pair<std::string, S16>("WindLightUseAtmosShaders", DBG_READ));
28 #endif // RLV_EXTENSION_CMD_GETSETDEBUG_EX
29
30 // Cache persistance of every setting
31 LLControlVariable* pSetting;
32 for (std::map<std::string, S16>::iterator itDbg = m_DbgAllowed.begin(); itDbg != m_DbgAllowed.end(); ++itDbg)
33 {
34 if ( ((pSetting = gSavedSettings.getControl(itDbg->first)) != NULL) && (pSetting->isPersisted()) )
35 itDbg->second |= DBG_PERSIST;
36 }
37 }
38}
39
40// Checked: 2009-05-17 (RLVa-0.2.0a)
41BOOL RlvExtGetSet::onForceCommand(const RlvEvent& rlvEvent)
42{
43 return processCommand(rlvEvent.getSenderID(), rlvEvent.getCommand());
44}
45
46// Checked: 2009-05-17 (RLVa-0.2.0a)
47BOOL RlvExtGetSet::onReplyCommand(const EventType& rlvEvent)
48{
49 return processCommand(rlvEvent.getSenderID(), rlvEvent.getCommand());
50}
51
52// Checked: 2009-06-18 (RLVa-0.2.1d) | Modified: RLVa-0.2.1d
53BOOL RlvExtGetSet::processCommand(const LLUUID& idObj, const RlvCommand& rlvCmd)
54{
55 std::string strBehaviour = rlvCmd.getBehaviour(), strGetSet, strSetting;
56 int idxSetting = strBehaviour.find('_');
57 if ( (strBehaviour.length() >= 6) && (-1 != idxSetting) && ((int)strBehaviour.length() > idxSetting + 1) )
58 {
59 strSetting = strBehaviour.substr(idxSetting + 1);
60 strBehaviour.erase(idxSetting); // Get rid of "_<setting>"
61
62 strGetSet = strBehaviour.substr(0, 3);
63 strBehaviour.erase(0, 3); // Get rid of get/set
64
65 if ("debug" == strBehaviour)
66 {
67 if ( ("get" == strGetSet) && (RLV_TYPE_REPLY == rlvCmd.getParamType()) )
68 {
69 rlvSendChatReply(rlvCmd.getParam(), onGetDebug(strSetting));
70 return TRUE;
71 }
72 else if ( ("set" == strGetSet) && (RLV_TYPE_FORCE == rlvCmd.getParamType()) )
73 {
74 if (!gRlvHandler.hasBehaviourExcept(RLV_BHVR_SETDEBUG, idObj))
75 onSetDebug(strSetting, rlvCmd.getOption());
76 return TRUE;
77 }
78 }
79 else if ("env" == strBehaviour)
80 {
81 if ( ("get" == strGetSet) && (RLV_TYPE_REPLY == rlvCmd.getParamType()) )
82 {
83 rlvSendChatReply(rlvCmd.getParam(), onGetEnv(strSetting));
84 return TRUE;
85 }
86 else if ( ("set" == strGetSet) && (RLV_TYPE_FORCE == rlvCmd.getParamType()) )
87 {
88 if (!gRlvHandler.hasBehaviourExcept(RLV_BHVR_SETENV, idObj))
89 onSetEnv(strSetting, rlvCmd.getOption());
90 return TRUE;
91 }
92 }
93 }
94 else if ("setrot" == rlvCmd.getBehaviour())
95 {
96 // NOTE: if <option> is invalid (or missing) altogether then RLV-1.17 will rotate to 0.0 (which is actually PI / 4)
97 F32 nAngle = 0.0f;
98 if (LLStringUtil::convertToF32(rlvCmd.getOption(), nAngle))
99 {
100 nAngle += RLV_SETROT_OFFSET;
101
102 gAgent.startCameraAnimation();
103
104 LLVector3 at(LLVector3::x_axis);
105 at.rotVec(nAngle, LLVector3::z_axis);
106 at.normalize();
107 gAgent.resetAxes(at);
108
109 return TRUE;
110 }
111 }
112 return FALSE;
113}
114
115// Checked: 2009-06-03 (RLVa-0.2.0h) | Modified: RLVa-0.2.0h
116bool RlvExtGetSet::findDebugSetting(std::string& strSetting, S16& flags)
117{
118 LLStringUtil::toLower(strSetting); // Convenience for non-RLV calls
119
120 std::string strTemp;
121 for (std::map<std::string, S16>::const_iterator itSetting = m_DbgAllowed.begin(); itSetting != m_DbgAllowed.end(); ++itSetting)
122 {
123 strTemp = itSetting->first;
124 LLStringUtil::toLower(strTemp);
125
126 if (strSetting == strTemp)
127 {
128 strSetting = itSetting->first;
129 flags = itSetting->second;
130 return true;
131 }
132 }
133 return false;
134}
135
136// Checked: 2009-06-03 (RLVa-0.2.0h) | Added: RLVa-0.2.0h
137S16 RlvExtGetSet::getDebugSettingFlags(const std::string& strSetting)
138{
139 std::map<std::string, S16>::const_iterator itSetting = m_DbgAllowed.find(strSetting);
140 return (itSetting != m_DbgAllowed.end()) ? itSetting->second : 0;
141}
142
143// Checked: 2009-06-03 (RLVa-0.2.0h) | Modified: RLVa-0.2.0h
144std::string RlvExtGetSet::onGetDebug(std::string strSetting)
145{
146 S16 dbgFlags;
147 if ( (findDebugSetting(strSetting, dbgFlags)) && ((dbgFlags & DBG_READ) == DBG_READ) )
148 {
149 if ((dbgFlags & DBG_PSEUDO) == 0)
150 {
151 LLControlVariable* pSetting = gSavedSettings.getControl(strSetting);
152 if (pSetting)
153 {
154 switch (pSetting->type())
155 {
156 case TYPE_U32:
157 return llformat("%u", gSavedSettings.getU32(strSetting));
158 case TYPE_S32:
159 return llformat("%d", gSavedSettings.getS32(strSetting));
160 case TYPE_BOOLEAN:
161 return llformat("%d", gSavedSettings.getBOOL(strSetting));
162 default:
163 RLV_ERRS << "Unexpected debug setting type" << LL_ENDL;
164 break;
165 }
166 }
167 }
168 else
169 {
170 return onGetPseudoDebug(strSetting);
171 }
172 }
173 return std::string();
174}
175
176// Checked: 2009-10-03 (RLVa-1.0.4e) | Added: RLVa-1.0.4e
177std::string RlvExtGetSet::onGetPseudoDebug(const std::string& strSetting)
178{
179 // Skip sanity checking because it's all done in RlvExtGetSet::onGetDebug() already
180 if ("AvatarSex" == strSetting)
181 {
182 std::map<std::string, std::string>::const_iterator itPseudo = m_PseudoDebug.find(strSetting);
183 if (itPseudo != m_PseudoDebug.end())
184 {
185 return itPseudo->second;
186 }
187 else
188 {
189 if (gAgent.getAvatarObject())
190 return llformat("%d", (gAgent.getAvatarObject()->getSex() == SEX_MALE)); // [See LLFloaterCustomize::LLFloaterCustomize()]
191 }
192 }
193 return std::string();
194}
195
196// Checked: 2009-10-10 (RLVa-1.0.4e) | Modified: RLVa-1.0.4e
197void RlvExtGetSet::onSetDebug(std::string strSetting, const std::string& strValue)
198{
199 S16 dbgFlags;
200 if ( (findDebugSetting(strSetting, dbgFlags)) && ((dbgFlags & DBG_WRITE) == DBG_WRITE) )
201 {
202 if ((dbgFlags & DBG_PSEUDO) == 0)
203 {
204 LLControlVariable* pSetting = gSavedSettings.getControl(strSetting);
205 if (pSetting)
206 {
207 U32 u32Value; S32 s32Value; BOOL fValue;
208 switch (pSetting->type())
209 {
210 case TYPE_U32:
211 if (LLStringUtil::convertToU32(strValue, u32Value))
212 gSavedSettings.setU32(strSetting, u32Value);
213 break;
214 case TYPE_S32:
215 if (LLStringUtil::convertToS32(strValue, s32Value))
216 gSavedSettings.setS32(strSetting, s32Value);
217 break;
218 case TYPE_BOOLEAN:
219 if (LLStringUtil::convertToBOOL(strValue, fValue))
220 gSavedSettings.setBOOL(strSetting, fValue);
221 break;
222 default:
223 RLV_ERRS << "Unexpected debug setting type" << LL_ENDL;
224 break;
225 }
226
227 // Default settings should persist if they were marked that way, but non-default settings should never persist
228 pSetting->setPersist( (pSetting->isDefault()) ? ((dbgFlags & DBG_PERSIST) == DBG_PERSIST) : false );
229 }
230 }
231 else
232 {
233 onSetPseudoDebug(strSetting, strValue);
234 }
235 }
236}
237
238// Checked: 2009-10-10 (RLVa-1.0.4e) | Modified: RLVa-1.0.4e
239void RlvExtGetSet::onSetPseudoDebug(const std::string& strSetting, const std::string& strValue)
240{
241 if ("AvatarSex" == strSetting)
242 {
243 BOOL fValue;
244 if (LLStringUtil::convertToBOOL(strValue, fValue))
245 m_PseudoDebug[strSetting] = strValue;
246 }
247}
248
249// Checked: 2009-09-16 (RLVa-1.0.3c) | Modified: RLVa-1.0.3c
250std::string RlvExtGetSet::onGetEnv(std::string strSetting)
251{
252 // HACK: - create a LLFloaterWindLight instance if there isn't one already
253 // - isOpen() is actually instanceExists()
254 // - creating an instance results in showing the floater which is why we need to ->close() it
255 if (!LLFloaterWindLight::isOpen())
256 {
257 LLFloaterWindLight::instance()->close();
258 LLFloaterWindLight::instance()->syncMenu();
259 }
260
261 LLWLParamManager* pWLParams = LLWLParamManager::instance();
262
263 F32 nValue = 0.0f;
264 if ("daytime" == strSetting)
265 {
266 nValue = (pWLParams->mAnimator.mIsRunning && pWLParams->mAnimator.mUseLindenTime) ? -1.0f : pWLParams->mAnimator.getDayTime();
267 }
268 else if ("preset" == strSetting)
269 {
270 return (pWLParams->mAnimator.mIsRunning && pWLParams->mAnimator.mUseLindenTime) ? std::string() : pWLParams->mCurParams.mName;
271 }
272 else if ("cloudcoverage" == strSetting) nValue = pWLParams->mCloudCoverage;
273 else if ("cloudscale" == strSetting) nValue = pWLParams->mCloudScale;
274 else if ("cloudscrollx" == strSetting) nValue = pWLParams->mCurParams.getCloudScrollX() - 10.0f;
275 else if ("cloudscrolly" == strSetting) nValue = pWLParams->mCurParams.getCloudScrollY() - 10.0f;
276 else if ("densitymultiplier" == strSetting) nValue = pWLParams->mDensityMult.x * pWLParams->mDensityMult.mult;
277 else if ("distancemultiplier" == strSetting) nValue = pWLParams->mDistanceMult;
278 else if ("eastangle" == strSetting) nValue = pWLParams->mCurParams.getEastAngle() / F_TWO_PI;
279 else if ("hazedensity" == strSetting) nValue = pWLParams->mHazeDensity.r;
280 else if ("hazehorizon" == strSetting) nValue = pWLParams->mHazeHorizon.r;
281 else if ("maxaltitude" == strSetting) nValue = pWLParams->mMaxAlt;
282 else if ("scenegamma" == strSetting) nValue = pWLParams->mWLGamma;
283 else if ("starbrightness" == strSetting) nValue = pWLParams->mCurParams.getStarBrightness();
284 else if ("sunglowfocus" == strSetting) nValue = -pWLParams->mGlow.b / 5.0f;
285 else if ("sunglowsize" == strSetting) nValue = 2 - pWLParams->mGlow.r / 20.0f;
286 else if ("sunmoonposition" == strSetting) nValue = pWLParams->mCurParams.getSunAngle() / F_TWO_PI;
287 else
288 {
289 char ch = strSetting[strSetting.length() - 1];
290 // HACK-RLVa: not entirely proper (creates new synonyms)
291 if ('x' == ch) ch = 'r';
292 else if ('y' == ch) ch = 'g';
293 else if ('d' == ch) ch = 'b';
294
295 if ( ('r' == ch) || ('g' == ch) || ('b' == ch) || ('i' == ch) )
296 {
297 WLColorControl* pColour = NULL;
298 strSetting.erase(strSetting.length() - 1, 1);
299
300 if ("ambient" == strSetting) pColour = &pWLParams->mAmbient;
301 else if ("bluedensity" == strSetting) pColour = &pWLParams->mBlueDensity;
302 else if ("bluehorizon" == strSetting) pColour = &pWLParams->mBlueHorizon;
303 else if ("sunmooncolor" == strSetting) pColour = &pWLParams->mSunlight;
304 else if ("cloudcolor" == strSetting) pColour = &pWLParams->mCloudColor;
305 else if ("cloud" == strSetting) pColour = &pWLParams->mCloudMain;
306 else if ("clouddetail" == strSetting) pColour = &pWLParams->mCloudDetail;
307
308 if (pColour)
309 {
310 if ('r' == ch) nValue = pColour->r;
311 else if ('g' == ch) nValue = pColour->g;
312 else if ('b' == ch) nValue = pColour->b;
313 else if (('i' == ch) && (pColour->hasSliderName)) nValue = llmax(pColour->r, pColour->g, pColour->b);
314
315 if (pColour->isBlueHorizonOrDensity) nValue /= 2.0f;
316 else if (pColour->isSunOrAmbientColor) nValue /= 3.0f;
317 }
318 }
319 }
320
321 return llformat("%f", nValue);
322}
323
324// Checked: 2009-09-16 (RLVa-1.0.3c) | Modified: RLVa-1.0.3c
325void RlvExtGetSet::onSetEnv(std::string strSetting, const std::string& strValue)
326{
327 // HACK: see RlvExtGetSet::onGetEnv
328 if (!LLFloaterWindLight::isOpen())
329 {
330 LLFloaterWindLight::instance()->close();
331 LLFloaterWindLight::instance()->syncMenu();
332 }
333
334 LLWLParamManager* pWLParams = LLWLParamManager::instance();
335 WLFloatControl* pFloat = NULL;
336 WLColorControl* pColour = NULL;
337
338 F32 nValue = 0.0f;
339 // Sanity check - make sure strValue specifies a number for all settings except "preset"
340 if ( (rlv_handler_t::fNoSetEnv) || ( (!LLStringUtil::convertToF32(strValue, nValue)) && ("preset" != strSetting) ))
341 return;
342
343 // Not quite correct, but RLV-1.16.0 will halt the default daytime cycle on invalid commands so we need to as well
344 pWLParams->mAnimator.mIsRunning = false;
345 pWLParams->mAnimator.mUseLindenTime = false;
346
347 // See LLWorldEnvSettings::handleEvent()
348 if ("daytime" == strSetting)
349 {
350 if (0.0f <= nValue)
351 {
352 pWLParams->mAnimator.setDayTime(llmin(nValue, 1.0f));
353 pWLParams->mAnimator.update(pWLParams->mCurParams);
354 }
355 else
356 {
357 pWLParams->mAnimator.mIsRunning = true;
358 pWLParams->mAnimator.mUseLindenTime = true;
359 }
360 return;
361 }
362 // See LLFloaterWindLight::onChangePresetName()
363 else if ("preset" == strSetting)
364 {
365 pWLParams->loadPreset(strValue, true);
366 return;
367 }
368 // See LLFloaterWindLight::onStarAlphaMoved
369 else if ("starbrightness" == strSetting)
370 {
371 pWLParams->mCurParams.setStarBrightness(nValue);
372 return;
373 }
374 // See LLFloaterWindLight::onGlowRMoved() / LLFloaterWindLight::onGlowBMoved()
375 else if ( ("sunglowfocus" == strSetting) || ("sunglowsize" == strSetting) )
376 {
377 WLColorControl *pColour = &pWLParams->mGlow;
378 if ("sunglowfocus" == strSetting)
379 pColour->b = -nValue * 5;
380 else
381 pColour->r = (2 - nValue) * 20;
382
383 pColour->update(pWLParams->mCurParams);
384 pWLParams->propagateParameters();
385 return;
386 }
387 // See LLFloaterWindLight::onSunMoved()
388 else if ( ("eastangle" == strSetting) || ("sunmoonposition" == strSetting) )
389 {
390 if ("eastangle" == strSetting)
391 pWLParams->mCurParams.setEastAngle(F_TWO_PI * nValue);
392 else
393 pWLParams->mCurParams.setSunAngle(F_TWO_PI * nValue);
394
395 // TODO-RLVa: it looks like propagateParameters() will actually take care of this for us, making this redundant?
396 WLColorControl* pColour = &pWLParams->mLightnorm;
397 pColour->r = -sin(pWLParams->mCurParams.getEastAngle()) * cos(pWLParams->mCurParams.getSunAngle());
398 pColour->g = sin(pWLParams->mCurParams.getSunAngle());
399 pColour->b = cos(pWLParams->mCurParams.getEastAngle()) * cos(pWLParams->mCurParams.getSunAngle());
400 pColour->i = 1.f;
401
402 pColour->update(pWLParams->mCurParams);
403 pWLParams->propagateParameters();
404 return;
405 }
406 // See LLFloaterWindLight::onCloudScrollXMoved() / LLFloaterWindLight::onCloudScrollYMoved()
407 else if ("cloudscrollx" == strSetting)
408 {
409 pWLParams->mCurParams.setCloudScrollX(nValue + 10.0f);
410 return;
411 }
412 else if ("cloudscrolly" == strSetting)
413 {
414 pWLParams->mCurParams.setCloudScrollY(nValue + 10.0f);
415 return;
416 }
417 // See LLFloaterWindLight::onFloatControlMoved()
418 else if ("cloudcoverage" == strSetting) pFloat = &pWLParams->mCloudCoverage;
419 else if ("cloudscale" == strSetting) pFloat = &pWLParams->mCloudScale;
420 else if ("densitymultiplier" == strSetting) pFloat = &pWLParams->mDensityMult;
421 else if ("distancemultiplier" == strSetting) pFloat = &pWLParams->mDistanceMult;
422 else if ("maxaltitude" == strSetting) pFloat = &pWLParams->mMaxAlt;
423 else if ("scenegamma" == strSetting) pFloat = &pWLParams->mWLGamma;
424 // See LLFloaterWindLight::onColorControlRMoved()
425 else if ("hazedensity" == strSetting) pColour = &pWLParams->mHazeDensity;
426 else if ("hazehorizon" == strSetting) pColour = &pWLParams->mHazeHorizon;
427
428 if (pFloat)
429 {
430 pFloat->x = nValue / pFloat->mult;
431 pFloat->update(pWLParams->mCurParams);
432 pWLParams->propagateParameters();
433 return;
434 }
435 else if (pColour)
436 {
437 pColour->r = nValue;
438 pColour->update(pWLParams->mCurParams);
439 pWLParams->propagateParameters();
440 return;
441 }
442
443 // RGBI settings
444 char ch = strSetting[strSetting.length() - 1];
445 if ('x' == ch) ch = 'r';
446 else if ('y' == ch) ch = 'g';
447 else if ('d' == ch) ch = 'b';
448
449 if ( ('r' == ch) || ('g' == ch) || ('b' == ch) || ('i' == ch) )
450 {
451 strSetting.erase(strSetting.length() - 1, 1);
452
453 if ("ambient" == strSetting) pColour = &pWLParams->mAmbient;
454 else if ("bluedensity" == strSetting) pColour = &pWLParams->mBlueDensity;
455 else if ("bluehorizon" == strSetting) pColour = &pWLParams->mBlueHorizon;
456 else if ("sunmooncolor" == strSetting) pColour = &pWLParams->mSunlight;
457 else if ("cloudcolor" == strSetting) pColour = &pWLParams->mCloudColor;
458 else if ("cloud" == strSetting) pColour = &pWLParams->mCloudMain;
459 else if ("clouddetail" == strSetting) pColour = &pWLParams->mCloudDetail;
460
461 if (pColour)
462 {
463 if (pColour->isBlueHorizonOrDensity) nValue *= 2.0f;
464 else if (pColour->isSunOrAmbientColor) nValue *= 3.0f;
465
466 if ('i' == ch) // (See: LLFloaterWindLight::onColorControlIMoved)
467 {
468 if (!pColour->hasSliderName)
469 return;
470
471 F32 curMax = llmax(pColour->r, pColour->g, pColour->b);
472 if ( (0.0f == nValue) || (0.0f == curMax) )
473 pColour->r = pColour->g = pColour->b = pColour->i = nValue;
474 else
475 {
476 F32 nDelta = (nValue - curMax) / curMax;
477 pColour->r *= (1.0f + nDelta);
478 pColour->g *= (1.0f + nDelta);
479 pColour->b *= (1.0f + nDelta);
480 pColour->i = nValue;
481 }
482 }
483 else // (See: LLFloaterWindLight::onColorControlRMoved)
484 {
485 F32* pnValue = ('r' == ch) ? &pColour->r : ('g' == ch) ? &pColour->g : ('b' == ch) ? &pColour->b : NULL;
486 if (pnValue)
487 *pnValue = nValue;
488 pColour->i = llmax(pColour->r, pColour->g, pColour->b);
489 }
490
491 pColour->update(pWLParams->mCurParams);
492 pWLParams->propagateParameters();
493 }
494 }
495}
496
497// ============================================================================
diff --git a/linden/indra/newview/rlvextensions.h b/linden/indra/newview/rlvextensions.h
new file mode 100644
index 0000000..5720ba0
--- /dev/null
+++ b/linden/indra/newview/rlvextensions.h
@@ -0,0 +1,45 @@
1#ifndef RLV_EXTENSIONS_H
2#define RLV_EXTENSIONS_H
3
4#include "rlvhelper.h"
5#include "rlvevent.h"
6
7// ============================================================================
8/*
9 * RlvExtGetSet
10 * ============
11 * Implements @get_XXX:<option>=<channel> and @set_XXX:<option>=force
12 *
13 */
14
15class RlvExtGetSet : public RlvObserver
16{
17public:
18 RlvExtGetSet();
19 virtual ~RlvExtGetSet() {}
20
21 virtual BOOL onForceCommand(const RlvEvent& rlvEvent);
22 virtual BOOL onReplyCommand(const RlvEvent& rlvEvent);
23protected:
24 std::string onGetDebug(std::string strSetting);
25 std::string onGetPseudoDebug(const std::string& strSetting);
26 void onSetDebug(std::string strSetting, const std::string& strValue);
27 void onSetPseudoDebug(const std::string& strSetting, const std::string& strValue);
28
29 std::string onGetEnv(std::string strSetting);
30 void onSetEnv(std::string strSetting, const std::string& strValue);
31
32 BOOL processCommand(const LLUUID& idObj, const RlvCommand& rlvCmd);
33
34public:
35 enum { DBG_READ = 0x01, DBG_WRITE = 0x02, DBG_PERSIST = 0x04, DBG_PSEUDO = 0x08 };
36 static std::map<std::string, S16> m_DbgAllowed;
37 static std::map<std::string, std::string> m_PseudoDebug;
38
39 static bool findDebugSetting(/*[in,out]*/ std::string& strSetting, /*[out]*/ S16& flags);
40 static S16 getDebugSettingFlags(const std::string& strSetting);
41};
42
43// ============================================================================
44
45#endif // RLV_EXTENSIONS_H
diff --git a/linden/indra/newview/rlvfloaterbehaviour.cpp b/linden/indra/newview/rlvfloaterbehaviour.cpp
new file mode 100644
index 0000000..39fcf12
--- /dev/null
+++ b/linden/indra/newview/rlvfloaterbehaviour.cpp
@@ -0,0 +1,152 @@
1#include "llviewerprecompiledheaders.h"
2
3#include "llagent.h"
4#include "llcachename.h"
5#include "llscrolllistctrl.h"
6#include "lluictrlfactory.h"
7#include "llviewerinventory.h"
8#include "llviewerobjectlist.h"
9#include "llvoavatar.h"
10
11#include "rlvfloaterbehaviour.h"
12
13// ============================================================================
14
15RlvFloaterBehaviour::RlvFloaterBehaviour(const LLSD& key)
16 : LLFloater(std::string("rlvBehaviours"))
17{
18 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_rlv_behaviour.xml");
19}
20
21
22void RlvFloaterBehaviour::show(void*)
23{
24 RlvFloaterBehaviour::showInstance();
25}
26
27void RlvFloaterBehaviour::refreshAll()
28{
29 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
30 LLCtrlListInterface* pList = childGetListInterface("behaviour_list");
31 const rlv_object_map_t* pRlvObjects = gRlvHandler.getObjectMap();
32 if ( (!pAvatar) || (!pList) || (!pRlvObjects) )
33 return;
34
35 pList->operateOnAll(LLCtrlListInterface::OP_DELETE);
36
37 for (rlv_object_map_t::const_iterator itObj = pRlvObjects->begin(), endObj = pRlvObjects->end(); itObj != endObj; ++itObj)
38 {
39 std::string strName = itObj->first.asString();
40
41 LLViewerInventoryItem* pItem = NULL;
42 LLViewerObject* pObj = gObjectList.findObject(itObj->first);
43 if (pObj)
44 {
45 LLViewerJointAttachment* pAttachPt =
46 get_if_there(pAvatar->mAttachmentPoints, gRlvHandler.getAttachPointIndex(pObj), (LLViewerJointAttachment*)NULL);
47 if (pAttachPt)
48 {
49 pItem = gInventory.getItem(pAttachPt->getItemID());
50 }
51 }
52
53 if (pItem)
54 strName = pItem->getName();
55
56 const rlv_command_list_t* pCommands = itObj->second.getCommandList();
57 for (rlv_command_list_t::const_iterator itCmd = pCommands->begin(), endCmd = pCommands->end(); itCmd != endCmd; ++itCmd)
58 {
59 std::string strBhvr = itCmd->asString(); LLUUID uuid(itCmd->getOption());
60 if (uuid.notNull())
61 {
62 std::string strLookup;
63 if ( (gCacheName->getFullName(uuid, strLookup)) || (gCacheName->getGroupName(uuid, strLookup)) )
64 {
65 if (strLookup.find("???") == std::string::npos)
66 strBhvr.assign(itCmd->getBehaviour()).append(":").append(strLookup);
67 }
68 else if (m_PendingLookup.end() == std::find(m_PendingLookup.begin(), m_PendingLookup.end(), uuid))
69 {
70 gCacheName->get(uuid, FALSE, onAvatarNameLookup, this);
71 m_PendingLookup.push_back(uuid);
72 }
73 }
74
75 LLSD element;
76
77 // Restriction column
78 element["columns"][0]["column"] = "behaviour";
79 element["columns"][0]["value"] = strBhvr;
80 element["columns"][0]["font"] = "SANSSERIF";
81 element["columns"][0]["font-style"] = "NORMAL";
82
83 // Object Name column
84 element["columns"][1]["column"] = "name";
85 element["columns"][1]["value"] = strName;
86 element["columns"][1]["font"] = "SANSSERIF";
87 element["columns"][1]["font-style"] = "NORMAL";
88
89 pList->addElement(element, ADD_BOTTOM);
90 }
91 }
92}
93
94// ============================================================================
95/*
96 * LLFloater overrides
97 */
98
99BOOL RlvFloaterBehaviour::canClose()
100{
101 return !LLApp::isExiting();
102}
103
104void RlvFloaterBehaviour::onOpen()
105{
106 gRlvHandler.addBehaviourObserver(this);
107
108 refreshAll();
109}
110
111void RlvFloaterBehaviour::onClose(bool fQuitting)
112{
113 LLFloater::setVisible(FALSE);
114
115 gRlvHandler.removeBehaviourObserver(this);
116
117 for (std::list<LLUUID>::const_iterator itLookup = m_PendingLookup.begin(); itLookup != m_PendingLookup.end(); ++itLookup)
118 {
119 gCacheName->cancelCallback(*itLookup, onAvatarNameLookup, this);
120 }
121 m_PendingLookup.clear();
122}
123
124BOOL RlvFloaterBehaviour::postBuild()
125{
126 return TRUE;
127}
128
129// ============================================================================
130/*
131 * RlvBehaviourObserver overrides
132 */
133
134void RlvFloaterBehaviour::changed(const RlvCommand& /*rlvCmd*/, bool /*fInternal*/)
135{
136 refreshAll();
137}
138
139// ============================================================================
140
141void RlvFloaterBehaviour::onAvatarNameLookup(const LLUUID& uuid, const std::string& strFirst, const std::string& strLast, BOOL fGroup, void* pParam)
142{
143 RlvFloaterBehaviour* pSelf = (RlvFloaterBehaviour*)pParam;
144
145 std::list<LLUUID>::iterator itLookup = std::find(pSelf->m_PendingLookup.begin(), pSelf->m_PendingLookup.end(), uuid);
146 if (itLookup != pSelf->m_PendingLookup.end())
147 pSelf->m_PendingLookup.erase(itLookup);
148
149 pSelf->refreshAll();
150}
151
152// ============================================================================
diff --git a/linden/indra/newview/rlvfloaterbehaviour.h b/linden/indra/newview/rlvfloaterbehaviour.h
new file mode 100644
index 0000000..1410dd5
--- /dev/null
+++ b/linden/indra/newview/rlvfloaterbehaviour.h
@@ -0,0 +1,49 @@
1#ifndef RLV_FLOATER_BEHAVIOUR
2#define RLV_FLOATER_BEHAVIOUR
3
4#include "llfloater.h"
5#include "rlvevent.h"
6
7// ============================================================================
8
9class RlvFloaterBehaviour :
10 public LLFloater,
11 public LLFloaterSingleton<RlvFloaterBehaviour>,
12 public RlvBehaviourObserver
13{
14 friend class LLUISingleton<RlvFloaterBehaviour, VisibilityPolicy<LLFloater> >;
15public:
16 virtual ~RlvFloaterBehaviour() {}
17
18 /*
19 * LLFloater overrides
20 */
21public:
22 /*virtual*/ BOOL canClose();
23 /*virtual*/ void onOpen();
24 /*virtual*/ void onClose(bool app_quitting);
25 /*virtual*/ BOOL postBuild();
26
27 /*
28 * RlvBehaviourObserver overrides
29 */
30public:
31 /*virtual*/ void changed(const RlvCommand& rlvCmd, bool fInternal);
32
33 /*
34 * Member functions
35 */
36public:
37 static void show(void*);
38 static void onAvatarNameLookup(const LLUUID& uuid, const std::string& strFirst, const std::string& strLast, BOOL fGroup, void* pParam);
39protected:
40 void refreshAll();
41private:
42 RlvFloaterBehaviour(const LLSD& key = LLSD());
43
44 std::list<LLUUID> m_PendingLookup;
45};
46
47// ============================================================================
48
49#endif // RLV_FLOATER_BEHAVIOUR
diff --git a/linden/indra/newview/rlvhandler.cpp b/linden/indra/newview/rlvhandler.cpp
new file mode 100644
index 0000000..69e2e2f
--- /dev/null
+++ b/linden/indra/newview/rlvhandler.cpp
@@ -0,0 +1,2592 @@
1#include "llviewerprecompiledheaders.h"
2#include "llagent.h"
3#include "lldrawpoolalpha.h"
4#include "llfirstuse.h"
5#include "llfloaterbeacons.h"
6#include "llfloaterchat.h"
7#include "llfloaterdaycycle.h"
8#include "llfloaterenvsettings.h"
9#include "llfloatergodtools.h"
10#include "llfloaterland.h"
11#include "llfloatermap.h"
12#include "llfloaterregioninfo.h"
13#include "llfloatertools.h"
14#include "llfloaterwater.h"
15#include "llfloaterwindlight.h"
16#include "llfloaterworldmap.h"
17#include "llgesturemgr.h"
18#include "llinventoryview.h"
19#include "llstartup.h"
20#include "llviewermenu.h"
21#include "llviewermessage.h"
22#include "llviewerparcelmgr.h"
23#include "llviewerregion.h"
24#include "llviewerwindow.h"
25#include "llvoavatar.h"
26#include "llworld.h"
27#include "pipeline.h"
28
29#include "rlvhelper.h"
30#include "rlvevent.h"
31#include "rlvextensions.h"
32#include "rlvhandler.h"
33
34// Only defined in llinventorybridge.cpp
35#if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
36 #include "llinventorybridge.h"
37 void confirm_replace_attachment_rez(S32 option, void* user_data);
38#endif
39// Only defined in llinventorymodel.cpp
40extern const char* NEW_CATEGORY_NAME;
41
42// ============================================================================
43// Static variable initialization
44//
45
46BOOL RlvHandler::m_fEnabled = FALSE;
47BOOL RlvHandler::fNoSetEnv = FALSE;
48BOOL RlvHandler::fLegacyNaming = FALSE;
49BOOL RlvHandler::m_fFetchStarted = FALSE;
50BOOL RlvHandler::m_fFetchComplete = FALSE;
51RlvMultiStringSearch RlvHandler::m_AttachLookup;
52
53const std::string RlvHandler::cstrSharedRoot = RLV_ROOT_FOLDER;
54
55// Keep these consistent with regular RLV
56const std::string RlvHandler::cstrBlockedRecvIM = "*** IM blocked by your viewer";
57const std::string RlvHandler::cstrBlockedSendIM = "*** IM blocked by sender's viewer";
58const std::string RlvHandler::cstrHidden = "(Hidden)";
59const std::string RlvHandler::cstrHiddenParcel = "(Hidden parcel)";
60const std::string RlvHandler::cstrHiddenRegion = "(Hidden region)";
61const std::string RlvHandler::cstrMsgRecvIM =
62 "The Resident you messaged is prevented from reading your instant messages at the moment, please try again later.";
63const std::string RlvHandler::cstrMsgTpLure =
64 "The Resident you invited is prevented from accepting teleport offers. Please try again later.";
65
66const std::string RlvHandler::cstrAnonyms[] =
67{
68 "A resident", "This resident", "That resident", "An individual", "This individual", "That individual", "A person",
69 "This person", "That person", "A stranger", "This stranger", "That stranger", "A human being", "This human being",
70 "That human being", "An agent", "This agent", "That agent", "A soul", "This soul", "That soul", "Somebody",
71 "Some people", "Someone", "Mysterious one", "An unknown being", "Unidentified one", "An unknown person"
72};
73
74rlv_handler_t gRlvHandler;
75
76// ============================================================================
77// Helper functions
78//
79
80// Checked: 2009-07-12 (RLVa-1.0.0h) | Added: RLVa-0.2.0e
81inline bool rlvIsWearingItem(const LLInventoryItem* pItem)
82{
83 return
84 ((LLAssetType::AT_OBJECT == pItem->getType()) && (gAgent.getAvatarObject()->isWearingAttachment(pItem->getUUID()))) ||
85 ((LLAssetType::AT_GESTURE == pItem->getType()) && (gGestureManager.isGestureActive(pItem->getUUID()))) ||
86 (gAgent.isWearingItem(pItem->getUUID()));
87}
88
89// ============================================================================
90// Command specific helper functions
91//
92
93// Checked: 2009-08-04 (RLVa-1.0.1d) | Added: RLVa-1.0.1d
94static bool rlvParseNotifyOption(const std::string& strOption, S32& nChannel, std::string& strFilter)
95{
96 boost_tokenizer tokens(strOption, boost::char_separator<char>(";", "", boost::keep_empty_tokens));
97 boost_tokenizer::const_iterator itTok = tokens.begin();
98
99 // Extract and sanity check the first token (required) which is the channel
100 if ( (itTok == tokens.end()) || (!LLStringUtil::convertToS32(*itTok, nChannel)) || (!rlvIsValidReplyChannel(nChannel)) )
101 return false;
102
103 // Second token (optional) is the filter
104 strFilter.clear();
105 if (++itTok != tokens.end())
106 {
107 strFilter = *itTok;
108 ++itTok;
109 }
110
111 return (itTok == tokens.end());
112}
113
114// ============================================================================
115// Constructor/destructor
116//
117
118// Checked: 2009-08-04 (RLVa-1.0.1d) | Modified: RLVa-1.0.1d
119RlvHandler::RlvHandler()
120 : m_fCanCancelTp(false), m_idCurObject(LLUUID::null), m_pCurCommand(NULL), m_pGCTimer(NULL), m_pWLSnapshot(NULL), m_pBhvrNotify(NULL)
121{
122 // Array auto-initialization to 0 is non-standard? (Compiler warning in VC-8.0)
123 memset(m_LayersAdd, 0, sizeof(S16) * WT_COUNT);
124 memset(m_LayersRem, 0, sizeof(S16) * WT_COUNT);
125 memset(m_Behaviours, 0, sizeof(S16) * RLV_BHVR_COUNT);
126}
127
128// Checked: 2009-08-04 (RLVa-1.0.1d) | Modified: RLVa-1.0.1d
129RlvHandler::~RlvHandler()
130{
131 //delete m_pGCTimer; // <- deletes itself
132 delete m_pWLSnapshot; // <- delete on NULL is harmless
133 delete m_pBhvrNotify;
134}
135
136// ============================================================================
137// Attachment related functions
138//
139
140// Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0d
141inline LLViewerJointAttachment* RlvHandler::getAttachPoint(const std::string& strText, bool fExact) const
142{
143 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
144 return (pAvatar) ? get_if_there(pAvatar->mAttachmentPoints, getAttachPointIndex(strText, fExact), (LLViewerJointAttachment*)NULL)
145 : NULL;
146}
147
148// Checked: 2009-07-29 (RLVa-1.0.1b) | Modified: RLVa-1.0.1b
149LLViewerJointAttachment* RlvHandler::getAttachPoint(const LLInventoryCategory* pFolder, bool /*fStrict*/) const
150{
151 if (!pFolder)
152 return NULL;
153
154 // RLVa-1.0.1 added support for legacy matching (See http://rlva.catznip.com/blog/2009/07/attachment-point-naming-convention/)
155 if (fLegacyNaming)
156 return getAttachPointLegacy(pFolder);
157
158 // Otherwise the only valid way to specify an attachment point in a folder name is: ^\.\(\s+attachpt\s+\)
159 std::string::size_type idxMatch;
160 std::string strAttachPt = rlvGetFirstParenthesisedText(pFolder->getName(), &idxMatch);
161 LLStringUtil::trim(strAttachPt);
162
163 return ( (1 == idxMatch) && (RLV_FOLDER_PREFIX_HIDDEN == pFolder->getName().at(0)) ) ? getAttachPoint(strAttachPt, true) : NULL;
164}
165
166// Checked: 2009-07-29 (RLVa-1.0.1b) | Modified: RLVa-1.0.1b
167LLViewerJointAttachment* RlvHandler::getAttachPoint(const LLInventoryItem* pItem, bool fStrict) const
168{
169 // Sanity check - if it's not an object then it can't have an attachment point
170 if ( (!pItem) || (LLAssetType::AT_OBJECT != pItem->getType()) )
171 return NULL;
172
173 // The attachment point should be placed at the end of the item's name, surrounded by parenthesis
174 // (if there is no such text then strAttachPt will be an empty string which is fine since it means we'll look at the item's parent)
175 std::string strAttachPt = rlvGetLastParenthesisedText(pItem->getName());
176 LLStringUtil::trim(strAttachPt);
177
178 // If the item is modify : we look at the item's name first and only then at the containing folder
179 // If the item is no modify: we look at the containing folder's name first and only then at the item itself
180 LLViewerJointAttachment* pAttachPt;
181 if (pItem->getPermissions().allowModifyBy(gAgent.getID()))
182 {
183 pAttachPt = (!strAttachPt.empty()) ? getAttachPoint(strAttachPt, true) : NULL;
184 if (!pAttachPt)
185 pAttachPt = getAttachPoint(gInventory.getCategory(pItem->getParentUUID()), fStrict);
186 }
187 else
188 {
189 pAttachPt = getAttachPoint(gInventory.getCategory(pItem->getParentUUID()), fStrict);
190 if ( (!pAttachPt) && (!strAttachPt.empty()) )
191 pAttachPt = getAttachPoint(strAttachPt, true);
192 }
193 return pAttachPt;
194}
195
196// Checked: 2009-07-12 (RLVa-1.0.0h) | Added: RLVa-0.2.2a
197S32 RlvHandler::getAttachPointIndex(const LLViewerJointAttachment* pAttachPt) const
198{
199 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
200 if (pAvatar)
201 {
202 for (LLVOAvatar::attachment_map_t::const_iterator itAttach = pAvatar->mAttachmentPoints.begin();
203 itAttach != pAvatar->mAttachmentPoints.end(); ++itAttach)
204 {
205 if (itAttach->second == pAttachPt)
206 return itAttach->first;
207 }
208 }
209 return 0;
210}
211
212// Checked: 2009-07-29 (RLVa-1.0.1b) | Added: RLVa-1.0.1b
213LLViewerJointAttachment* RlvHandler::getAttachPointLegacy(const LLInventoryCategory* pFolder) const
214{
215 // Hopefully some day this can just be deprecated (see http://rlva.catznip.com/blog/2009/07/attachment-point-naming-convention/)
216 if ( (!pFolder) || (pFolder->getName().empty()) )
217 return NULL;
218
219 // Check for a (...) block *somewhere* in the name
220 std::string::size_type idxMatch;
221 std::string strAttachPt = rlvGetFirstParenthesisedText(pFolder->getName(), &idxMatch);
222 if (!strAttachPt.empty())
223 {
224 // Could be "(attachpt)", ".(attachpt)" or "Folder name (attachpt)"
225 if ( (0 != idxMatch) && ((1 != idxMatch) || (RLV_FOLDER_PREFIX_HIDDEN == pFolder->getName().at(0)) ) && // No '(' or '.(' start
226 (idxMatch + strAttachPt.length() + 1 != pFolder->getName().length()) ) // or there's extra text
227 {
228 // It's definitely not one of the first two so assume it's the last form (in which case we need the last paranthesised block)
229 strAttachPt = rlvGetLastParenthesisedText(pFolder->getName());
230 }
231 }
232 else
233 {
234 // There's no paranthesised block, but it could still be "attachpt" or ".attachpt" (just strip away the '.' from the last one)
235 strAttachPt = pFolder->getName();
236 if (RLV_FOLDER_PREFIX_HIDDEN == strAttachPt[0])
237 strAttachPt.erase(0, 1);
238 }
239 return getAttachPoint(strAttachPt, true);
240}
241
242bool RlvHandler::hasLockedHUD() const
243{
244 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
245 if (!pAvatar)
246 return false;
247
248 LLViewerJointAttachment* pAttachPt;
249 for (rlv_detach_map_t::const_iterator itAttachPt = m_Attachments.begin(); itAttachPt != m_Attachments.end(); ++itAttachPt)
250 {
251 pAttachPt = get_if_there(pAvatar->mAttachmentPoints, (S32)itAttachPt->first, (LLViewerJointAttachment*)NULL);
252 if ( (pAttachPt) && (pAttachPt->getIsHUDAttachment()) )
253 return true; // At least one of our locked attachments is a HUD
254 }
255 return false; // None of our locked attachments is a HUD
256}
257
258bool RlvHandler::isDetachable(const LLInventoryItem* pItem) const
259{
260 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
261 return ( (pItem) && (pAvatar) ) ? isDetachable(pAvatar->getWornAttachment(pItem->getUUID())) : true;
262}
263
264// Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.1h
265bool RlvHandler::isDetachableExcept(S32 idxAttachPt, LLViewerObject *pObj) const
266{
267 // Loop over every object that marked the specific attachment point undetachable (but ignore pObj and any of its children)
268 for (rlv_detach_map_t::const_iterator itAttach = m_Attachments.lower_bound(idxAttachPt),
269 endAttach = m_Attachments.upper_bound(idxAttachPt); itAttach != endAttach; ++itAttach)
270 {
271 LLViewerObject* pTempObj = gObjectList.findObject(itAttach->second);
272 if ( (!pTempObj) || (pTempObj->getRootEdit()->getID() != pObj->getID()) )
273 return false;
274 }
275 return true;
276}
277
278// Checked: 2009-09-06 (RLVa-1.0.2b) | Modified: RLVa-1.0.2b
279bool RlvHandler::setDetachable(S32 idxAttachPt, const LLUUID& idRlvObj, bool fDetachable)
280{
281 // Sanity check - make sure it's an object we know about
282 rlv_object_map_t::const_iterator itObj = m_Objects.find(idRlvObj);
283 if ( (itObj == m_Objects.end()) || (!idxAttachPt) )
284 return false; // If (idxAttachPt) == 0 then: (pObj == NULL) || (pObj->isAttachment() == FALSE)
285
286 if (!fDetachable)
287 {
288 #ifdef RLV_EXPERIMENTAL_FIRSTUSE
289 //LLFirstUse::useRlvDetach();
290 #endif // RLV_EXPERIMENTAL_FIRSTUSE
291
292 // NOTE: m_Attachments can contain duplicate <idxAttachPt, idRlvObj> pairs (ie @detach:spine=n,detach=n from an attachment on spine)
293 m_Attachments.insert(std::pair<S32, LLUUID>(idxAttachPt, itObj->second.m_UUID));
294 return true;
295 }
296 else
297 {
298 for (rlv_detach_map_t::iterator itAttach = m_Attachments.lower_bound(idxAttachPt),
299 endAttach = m_Attachments.upper_bound(idxAttachPt); itAttach != endAttach; ++itAttach)
300 {
301 if (itObj->second.m_UUID == itAttach->second)
302 {
303 m_Attachments.erase(itAttach);
304 return true;
305 }
306 }
307 }
308 return false; // Fall-through for (fDetachable == TRUE) - if the object wasn't undetachable then we consider it a failure
309}
310
311
312
313#ifdef RLV_EXTENSION_FLAG_NOSTRIP
314 // Checked: 2009-05-26 (RLVa-0.2.0d) | Modified: RLVa-0.2.0d
315 bool RlvHandler::isStrippable(const LLUUID& idItem) const
316 {
317 // An item is exempt from @detach or @remoutfit if:
318 // - its name contains "nostrip" (anywhere in the name)
319 // - its parent folder contains "nostrip" (anywhere in the name)
320 if (idItem.notNull())
321 {
322 LLViewerInventoryItem* pItem = gInventory.getItem(idItem);
323 if (pItem)
324 {
325 if (std::string::npos != pItem->getName().find(RLV_FOLDER_FLAG_NOSTRIP))
326 return false;
327
328 LLViewerInventoryCategory* pFolder = gInventory.getCategory(pItem->getParentUUID());
329 if ( (pFolder) && (std::string::npos != pFolder->getName().find(RLV_FOLDER_FLAG_NOSTRIP)) )
330 return false;
331 }
332 }
333 return true;
334 }
335#endif // RLV_EXTENSION_FLAG_NOSTRIP
336
337// ============================================================================
338// Behaviour related functions
339//
340
341bool RlvHandler::hasBehaviourExcept(ERlvBehaviour eBehaviour, const std::string& strOption, const LLUUID& idObj) const
342{
343 for (rlv_object_map_t::const_iterator itObj = m_Objects.begin(); itObj != m_Objects.end(); ++itObj)
344 if ( (idObj != itObj->second.m_UUID) && (itObj->second.hasBehaviour(eBehaviour, strOption, false)) )
345 return true;
346 return false;
347}
348
349// Checked: 2009-10-04 (RLVa-1.0.4c) | Modified: RLVa-1.0.4c
350bool RlvHandler::isException(ERlvBehaviour eBhvr, const RlvExceptionOption& varOption, ERlvExceptionCheck typeCheck) const
351{
352 // We need to "strict check" exceptions only if: the restriction is actually in place *and* (isPermissive(eBhvr) == FALSE)
353 if (RLV_CHECK_DEFAULT == typeCheck)
354 typeCheck = ( (hasBehaviour(eBhvr)) && (!isPermissive(eBhvr)) ) ? RLV_CHECK_STRICT : RLV_CHECK_PERMISSIVE;
355
356 std::list<LLUUID> objList;
357 if (RLV_CHECK_STRICT == typeCheck)
358 {
359 // If we're "strict checking" then we need the UUID of every object that currently has 'eBhvr' restricted
360 for (rlv_object_map_t::const_iterator itObj = m_Objects.begin(); itObj != m_Objects.end(); ++itObj)
361 if (itObj->second.hasBehaviour(eBhvr, !hasBehaviour(RLV_BHVR_PERMISSIVE)))
362 objList.push_back(itObj->first);
363 }
364
365 for (rlv_exception_map_t::const_iterator itException = m_Exceptions.lower_bound(eBhvr),
366 endException = m_Exceptions.upper_bound(eBhvr); itException != endException; ++itException)
367 {
368 if (itException->second.varOption == varOption)
369 {
370 // For permissive checks we just return on the very first match
371 if (RLV_CHECK_PERMISSIVE == typeCheck)
372 return true;
373
374 // For strict checks we don't return until the list is empty (every object with 'eBhvr' restricted also contains the exception)
375 std::list<LLUUID>::iterator itList = std::find(objList.begin(), objList.end(), itException->second.idObject);
376 if (itList != objList.end())
377 objList.erase(itList);
378 if (objList.empty())
379 return true;
380 }
381 }
382 return false;
383}
384
385// ============================================================================
386// Command processing functions
387//
388
389// Checked: 2009-06-03 (RLVa-0.2.0h)
390void RlvHandler::addBehaviourObserver(RlvBehaviourObserver* pBhvrObserver)
391{
392 std::list<RlvBehaviourObserver*>::iterator itBhvrObserver = std::find(m_BhvrObservers.begin(), m_BhvrObservers.end(), pBhvrObserver);
393 if (itBhvrObserver == m_BhvrObservers.end())
394 m_BhvrObservers.push_back(pBhvrObserver);
395}
396
397// Checked: 2009-06-03 (RLVa-0.2.0h)
398void RlvHandler::removeBehaviourObserver(RlvBehaviourObserver* pBhvrObserver)
399{
400 std::list<RlvBehaviourObserver*>::iterator itBhvrObserver = std::find(m_BhvrObservers.begin(), m_BhvrObservers.end(), pBhvrObserver);
401 if (itBhvrObserver != m_BhvrObservers.end())
402 m_BhvrObservers.erase(itBhvrObserver);
403}
404
405// Checked: 2009-06-03 (RLVa-0.2.0h)
406void RlvHandler::notifyBehaviourObservers(const RlvCommand& rlvCmd, bool fInternal)
407{
408 for (std::list<RlvBehaviourObserver*>::const_iterator itBhvrObserver = m_BhvrObservers.begin();
409 itBhvrObserver != m_BhvrObservers.end(); ++itBhvrObserver)
410 {
411 (*itBhvrObserver)->changed(rlvCmd, fInternal);
412 }
413}
414
415// Checked:
416BOOL RlvHandler::processCommand(const LLUUID& uuid, const std::string& strCmd, bool fFromObj)
417{
418 #ifdef RLV_DEBUG
419 RLV_INFOS << "[" << uuid << "]: " << strCmd << LL_ENDL;
420 #endif // RLV_DEBUG
421
422 RlvCommand rlvCmd(strCmd);
423 if (!rlvCmd.isValid())
424 {
425 #ifdef RLV_DEBUG
426 RLV_INFOS << "\t-> invalid command: " << strCmd << LL_ENDL;
427 #endif // RLV_DEBUG
428 return FALSE;
429 }
430 m_pCurCommand = &rlvCmd; m_idCurObject = uuid;
431
432 BOOL fRet = FALSE;
433 switch (rlvCmd.getParamType())
434 {
435 case RLV_TYPE_ADD: // Checked: 2009-06-03 (RLVa-0.2.0h) | Modified: RLVa-0.2.0h
436 {
437 if ( (m_Behaviours[rlvCmd.getBehaviourType()]) &&
438 ( (RLV_BHVR_SETDEBUG == rlvCmd.getBehaviourType()) || (RLV_BHVR_SETENV == rlvCmd.getBehaviourType()) ) )
439 {
440 // Some restrictions can only be held by one single object to avoid deadlocks
441 #ifdef RLV_DEBUG
442 RLV_INFOS << "\t- " << rlvCmd.getBehaviour() << " is already set by another object => discarding" << LL_ENDL;
443 #endif // RLV_DEBUG
444 break;
445 }
446
447 rlv_object_map_t::iterator itObj = m_Objects.find(uuid);
448 if (itObj != m_Objects.end())
449 {
450 RlvObject& rlvObj = itObj->second;
451 fRet = rlvObj.addCommand(rlvCmd);
452 }
453 else
454 {
455 RlvObject rlvObj(uuid);
456 fRet = rlvObj.addCommand(rlvCmd);
457 m_Objects.insert(std::pair<LLUUID, RlvObject>(uuid, rlvObj));
458 }
459
460 #ifdef RLV_DEBUG
461 RLV_INFOS << "\t- " << ( (fRet) ? "adding behaviour" : "skipping duplicate") << LL_ENDL;
462 #endif // RLV_DEBUG
463
464 if (fRet) { // If FALSE then this was a duplicate, there's no need to handle those
465 if (!m_pGCTimer)
466 m_pGCTimer = new RlvGCTimer();
467 processAddCommand(uuid, rlvCmd);
468 notifyBehaviourObservers(rlvCmd, !fFromObj);
469 }
470 }
471 break;
472 case RLV_TYPE_REMOVE: // Checked:
473 {
474 rlv_object_map_t::iterator itObj = m_Objects.find(uuid);
475 if (itObj != m_Objects.end())
476 fRet = itObj->second.removeCommand(rlvCmd);
477
478 #ifdef RLV_DEBUG
479 RLV_INFOS << "\t- " << ( (fRet) ? "removing behaviour"
480 : "skipping remove (unset behaviour or unknown object)") << LL_ENDL;
481 #endif // RLV_DEBUG
482
483 if (fRet) { // Don't handle non-sensical removes
484 processRemoveCommand(uuid, rlvCmd);
485 notifyBehaviourObservers(rlvCmd, !fFromObj);
486
487 if (0 == itObj->second.m_Commands.size())
488 {
489 #ifdef RLV_DEBUG
490 RLV_INFOS << "\t- command list empty => removing " << uuid << LL_ENDL;
491 #endif // RLV_DEBUG
492 m_Objects.erase(itObj);
493 }
494 }
495 }
496 break;
497 case RLV_TYPE_CLEAR:
498 fRet = processClearCommand(uuid, rlvCmd);
499 notifyBehaviourObservers(rlvCmd, !fFromObj);
500 break;
501 case RLV_TYPE_FORCE: // Checked:
502 fRet = processForceCommand(uuid, rlvCmd);
503 break;
504 case RLV_TYPE_REPLY: // Checked:
505 fRet = processReplyCommand(uuid, rlvCmd);
506 break;
507 case RLV_TYPE_UNKNOWN: // Checked:
508 break;
509 #ifdef LL_GNUC
510 default:
511 break;
512 #endif // LL_GNUC
513 }
514
515 #ifdef RLV_DEBUG
516 RLV_INFOS << "\t--> command " << ((fRet) ? "succeeded" : "failed") << LL_ENDL;
517 #endif // RLV_DEBUG
518
519 m_pCurCommand = NULL; m_idCurObject.setNull();
520 return fRet;
521}
522
523BOOL RlvHandler::processAddCommand(const LLUUID& uuid, const RlvCommand& rlvCmd)
524{
525 // NOTE: - at this point the command has already been added to the corresponding RlvObject instance
526 // - the object's UUID may or may not exist in gObjectList (see handling of @detach=n)
527
528 ERlvBehaviour eBehaviour = rlvCmd.getBehaviourType();
529 const std::string& strOption = rlvCmd.getOption();
530
531 if ( (RLV_BHVR_UNKNOWN != eBehaviour) && (strOption.empty()) )
532 {
533 if (rlvCmd.isStrict())
534 addException(uuid, RLV_BHVR_PERMISSIVE, eBehaviour);
535 m_Behaviours[eBehaviour]++;
536 }
537
538 switch (eBehaviour)
539 {
540 case RLV_BHVR_DETACH: // @detach[:<option>]=n - Checked: 2009-08-04 (RLVa-1.0.1d) | Modified: RLVa-1.0.1d
541 {
542 LLViewerObject* pObj = NULL; S32 idxAttachPt = 0;
543 if (strOption.empty()) // @detach=n
544 {
545 // If the object rezzed before we received @detach=n from it then we can just do our thing here
546 // If the object hasn't rezzed yet then we need to wait until RlvHandler::onAttach()
547 // If @detach=n were possible for non-attachments another copy/paste would be needed in RlvHandler::onGC()
548 if ((pObj = gObjectList.findObject(uuid)) != NULL)
549 setDetachable(pObj, uuid, false);
550 }
551 else if ((idxAttachPt = getAttachPointIndex(strOption, true)) != 0) // @detach:<attachpt>=n
552 {
553 setDetachable(idxAttachPt, uuid, false);
554
555 // (See below)
556 LLViewerJointAttachment* pAttachPt = getAttachPoint(strOption, true);
557 if (pAttachPt)
558 pObj = pAttachPt->getObject();
559 }
560
561 // When at least one HUD attachment is locked we want to make sure they're all visible (ie prevent hiding a blindfold HUD)
562 // However, since @detach:<attachpt>=n might lock a HUD attachment point that doesn't currently have an object we
563 // have to do this here *and* in RlvHandler::onAttach()
564 if ( (pObj) && (pObj->isHUDAttachment()) )
565 LLPipeline::sShowHUDAttachments = TRUE;
566 }
567 break;
568 case RLV_BHVR_REDIRCHAT: // @redirchat:<option>=n - Checked: 2009-07-07 (RLVa-1.0.0d)
569 case RLV_BHVR_REDIREMOTE: // @rediremote:<option>=n - Checked: 2009-07-07 (RLVa-1.0.0d) | Added: RLVa-0.2.2a
570 {
571 if (!strOption.empty())
572 m_Behaviours[eBehaviour]++; // @redirchat and @rediremote don't have an optionless version so keep track of it here
573 else
574 m_Behaviours[eBehaviour]--; // @redirchat=n and @rediremote=n are undefined, don't keep track of them
575 }
576 break;
577 case RLV_BHVR_SHOWWORLDMAP: // @showworldmap=n - Checked: 2009-07-05 (RLVa-1.0.0c)
578 {
579 // Simulate clicking the Map button [see LLToolBar::onClickMap()]
580 if (gFloaterWorldMap->getVisible())
581 LLFloaterWorldMap::toggle(NULL);
582 }
583 break;
584 case RLV_BHVR_SHOWMINIMAP: // @showminimap=n - Checked: 2009-07-05 (RLVa-1.0.0c)
585 {
586 // Simulate clicking the Minimap button [see LLToolBar::onClickRadar()]
587 if (LLFloaterMap::instanceVisible())
588 LLFloaterMap::hideInstance();
589 }
590 break;
591 #ifdef RLV_EXTENSION_STARTLOCATION
592 case RLV_BHVR_TPLOC: // @tploc=n - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.1d
593 case RLV_BHVR_UNSIT: // @unsit=n - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.1d
594 {
595 if (strOption.empty())
596 RlvSettings::updateLoginLastLocation();
597 }
598 break;
599 #endif // RLV_EXTENSION_STARTLOCATION
600 case RLV_BHVR_EDIT: // @edit=n - Checked: 2009-07-04 (RLVa-1.0.0b)
601 {
602 // Turn off "View / Highlight Transparent"
603 LLDrawPoolAlpha::sShowDebugAlpha = FALSE;
604
605 // Close the Beacons floater if it's open
606 if (LLFloaterBeacons::instanceVisible())
607 LLFloaterBeacons::toggleInstance();
608
609 // Get rid of the build floater if it's open [copy/paste from toggle_build_mode()]
610 if (gFloaterTools->getVisible())
611 {
612 gAgent.resetView(FALSE);
613 gFloaterTools->close();
614 gViewerWindow->showCursor();
615 }
616 }
617 break;
618 case RLV_BHVR_ADDOUTFIT: // @addoutfit[:<layer>]=n - Checked: 2009-07-07 (RLVa-1.0.0d)
619 case RLV_BHVR_REMOUTFIT: // @remoutfit[:<layer>]=n - Checked: 2009-07-07 (RLVa-1.0.0d)
620 {
621 S16* pLayers = (eBehaviour == RLV_BHVR_ADDOUTFIT) ? m_LayersAdd : m_LayersRem;
622
623 if (strOption.empty())
624 {
625 for (int idx = 0; idx < WT_COUNT; idx++)
626 pLayers[idx]++;
627 }
628 else
629 {
630 EWearableType type = LLWearable::typeNameToType(strOption);
631 if (WT_INVALID != type)
632 {
633 pLayers[type]++;
634 m_Behaviours[eBehaviour]++;
635 }
636 }
637 }
638 break;
639 case RLV_BHVR_SHOWINV: // @showinv=n - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-1.0.0g
640 {
641 // Close all open inventory windows
642 LLInventoryView::closeAll();
643 }
644 break;
645 case RLV_BHVR_SHOWLOC: // @showloc=n - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
646 {
647 // If we're the first @showloc=n restriction refresh all object text so we can filter it if necessary
648 if (1 == m_Behaviours[RLV_BHVR_SHOWLOC])
649 LLHUDText::refreshAllObjectText();
650
651 // Close the "About Land" floater if it's currently visible
652 if (LLFloaterLand::instanceVisible())
653 LLFloaterLand::hideInstance();
654
655 // Close the "Estate Tools" floater is it's currently visible
656 if (LLFloaterRegionInfo::instanceVisible())
657 LLFloaterRegionInfo::hideInstance();
658
659 // NOTE: we should close the "God Tools" floater as well, but since calling LLFloaterGodTools::instance() always
660 // creates a new instance of the floater and since it's very unlikely to be open it's just better not to
661 }
662 break;
663 case RLV_BHVR_SHOWNAMES: // @shownames=n - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
664 {
665 // If we're the first @shownames=n restriction refresh all object text so we can filter it if necessary
666 if (1 == m_Behaviours[RLV_BHVR_SHOWNAMES])
667 LLHUDText::refreshAllObjectText();
668
669 // Close the "Active Speakers" panel if it's currently visible
670 LLFloaterChat::getInstance()->childSetVisible("active_speakers_panel", false);
671 }
672 break;
673 case RLV_BHVR_FARTOUCH:
674 {
675 #ifdef RLV_EXPERIMENTAL_FIRSTUSE
676 //LLFirstUse::useRlvFartouch();
677 #endif // RLV_EXPERIMENTAL_FIRSTUSE
678 }
679 break;
680 case RLV_BHVR_FLY: // @fly=n - Checked: 2009-07-05 (RLVa-1.0.0c)
681 {
682 // If currently flying, simulate clicking the Fly button [see LLToolBar::onClickFly()]
683 if (gAgent.getFlying())
684 gAgent.toggleFlying();
685 }
686 break;
687 case RLV_BHVR_SETENV: // @setenv=n - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0a
688 {
689 if (!fNoSetEnv)
690 {
691 // Only close the floaters if their instance exists and they're actually visible
692 if ( (LLFloaterEnvSettings::isOpen()) && (LLFloaterEnvSettings::instance()->getVisible()) )
693 LLFloaterEnvSettings::instance()->close();
694 if ( (LLFloaterWindLight::isOpen()) && (LLFloaterWindLight::instance()->getVisible()) )
695 LLFloaterWindLight::instance()->close();
696 if ( (LLFloaterWater::isOpen()) && (LLFloaterWater::instance()->getVisible()) )
697 LLFloaterWater::instance()->close();
698 if ( (LLFloaterDayCycle::isOpen()) && (LLFloaterDayCycle::instance()->getVisible()) )
699 LLFloaterDayCycle::instance()->close();
700
701 // Save the current WindLight params so we can restore them on @setenv=y
702 if (m_pWLSnapshot)
703 {
704 RLV_ERRS << "m_pWLSnapshot != NULL" << LL_ENDL; // Safety net in case we set @setenv=n for more than 1 object
705 delete m_pWLSnapshot;
706 }
707 m_pWLSnapshot = RlvWLSnapshot::takeSnapshot();
708 }
709 }
710 break;
711 case RLV_BHVR_SHOWHOVERTEXTALL: // @showhovertextal=n - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
712 case RLV_BHVR_SHOWHOVERTEXTWORLD: // @showhovertextworld=n - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
713 case RLV_BHVR_SHOWHOVERTEXTHUD: // @showhovertexthud=n - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
714 {
715 // Refresh all hover text (LLHUDText::setStringUTF8() will decide what needs clearing and what doesn't)
716 LLHUDText::refreshAllObjectText();
717 }
718 break;
719 case RLV_BHVR_SHOWHOVERTEXT: // @showhovertext:<uuid>=n - Checked: 2009-07-09 (RLVa-0.2.2a) | Modified: RLVa-1.0.0f
720 {
721 LLUUID idException(strOption);
722 if (idException.notNull()) // If there's an option it should be a valid UUID
723 {
724 addException(uuid, eBehaviour, idException);
725
726 // Clear the object's hover text
727 LLViewerObject* pObj = gObjectList.findObject(idException);
728 if ( (pObj) && (pObj->mText.notNull()) && (!pObj->mText->getObjectText().empty()) )
729 pObj->mText->setStringUTF8("");
730 }
731 }
732 break;
733 case RLV_BHVR_NOTIFY: // @notify:<option>=add - Checked: 2009-08-04 (RLVa-1.0.1d) | Modified: RLVa-1.0.1d
734 {
735 S32 nChannel; std::string strFilter;
736 if ( (!strOption.empty()) && (rlvParseNotifyOption(strOption, nChannel, strFilter)) )
737 {
738 if (!m_pBhvrNotify)
739 addBehaviourObserver(m_pBhvrNotify = new RlvBehaviourNotifyObserver());
740 m_pBhvrNotify->addNotify(uuid, nChannel, strFilter);
741 }
742 }
743 break;
744 case RLV_BHVR_SENDCHANNEL: // @sendchannel:<uuid>=add - Checked: 2009-10-05 (RLVa-1.0.4a) | Modified: RLVa-1.0.4a
745 {
746 S32 nChannel; // If there's an option it should be a valid (=positive and non-zero) chat channel
747 if ( (!strOption.empty()) && (LLStringUtil::convertToS32(strOption, nChannel)) && (nChannel > 0) )
748 addException(uuid, eBehaviour, nChannel);
749 }
750 break;
751 case RLV_BHVR_RECVCHAT: // @recvchat:<uuid>=add - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
752 case RLV_BHVR_RECVEMOTE: // @recvemote:<uuid>=add - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
753 case RLV_BHVR_RECVIM: // @recvim:<uuid>=add - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
754 case RLV_BHVR_SENDIM: // @sendim:<uuid>=add - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
755 case RLV_BHVR_TPLURE: // @tplure:<uuid>=add - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
756 case RLV_BHVR_ACCEPTTP: // @accepttp:<uuid>=add - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
757 {
758 LLUUID idException(strOption);
759 if (idException.notNull()) // If there's an option it should be a valid UUID
760 addException(uuid, eBehaviour, LLUUID(strOption));
761 }
762 break;
763 case RLV_BHVR_UNKNOWN:
764 {
765 // Give our observers a chance to handle any command we don't
766 RlvEvent rlvEvent(uuid, rlvCmd);
767 m_Emitter.update(&RlvObserver::onAddCommand, rlvEvent);
768 }
769 break;
770 default:
771 break;
772 }
773 return TRUE; // Add command success/failure is decided by RlvObject::addCommand()
774}
775
776// Checked: 2009-08-05 (RLVa-1.0.1e) | Added: RLVa-1.0.1e
777void RlvHandler::processRetainedCommands()
778{
779 for (rlv_retained_list_t::const_iterator itCmd = m_Retained.begin(); itCmd != m_Retained.end(); ++itCmd)
780 {
781 const RlvRetainedCommand& cmd = *itCmd;
782 processCommand(cmd.idObject, cmd.strCmd, true);
783 }
784 m_Retained.clear();
785}
786
787BOOL RlvHandler::processRemoveCommand(const LLUUID& uuid, const RlvCommand& rlvCmd)
788{
789 // NOTE: - the RlvObject instance still exists at this point, but the viewer might already have removed it from its object list
790 ERlvBehaviour eBehaviour = rlvCmd.getBehaviourType();
791 const std::string& strOption = rlvCmd.getOption();
792
793 if ( (RLV_BHVR_UNKNOWN != eBehaviour) && (strOption.empty()) )
794 {
795 if (rlvCmd.isStrict())
796 removeException(uuid, RLV_BHVR_PERMISSIVE, eBehaviour);
797 m_Behaviours[eBehaviour]--;
798 }
799
800 switch (eBehaviour)
801 {
802 case RLV_BHVR_DETACH: // @detach[:<option>]=y - Checked: 2009-08-04 (RLVa-1.0.1d) | Modified: RLVa-1.0.1d
803 {
804 S32 idxAttachPt = 0;
805 if (strOption.empty()) // @detach=y
806 {
807 // The object may or may not (if it got detached) still exist
808 rlv_object_map_t::const_iterator itObj = m_Objects.find(uuid);
809 if (itObj != m_Objects.end())
810 idxAttachPt = itObj->second.m_idxAttachPt;
811 if (idxAttachPt)
812 setDetachable(idxAttachPt, uuid, true);
813 }
814 else if ((idxAttachPt = getAttachPointIndex(strOption, true))) // @detach:<attachpt>=y
815 {
816 setDetachable(idxAttachPt, uuid, true);
817 }
818 }
819 break;
820 case RLV_BHVR_REDIRCHAT: // @redirchat:<option>=y - Checked: 2009-07-07 (RLVa-1.0.0d)
821 case RLV_BHVR_REDIREMOTE: // @rediremote:<option>=y - Checked: 2009-07-07 (RLVa-1.0.0d) | Added: RLVa-0.2.2a
822 {
823 if (!strOption.empty())
824 m_Behaviours[eBehaviour]--; // @redirchat and @rediremote don't have an optionless version so keep track of it here
825 else
826 m_Behaviours[eBehaviour]++; // @redirchat=n and @rediremote=n are undefined, don't keep track of them
827 }
828 break;
829 #ifdef RLV_EXTENSION_STARTLOCATION
830 case RLV_BHVR_TPLOC: // @tploc=y - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.1d
831 case RLV_BHVR_UNSIT: // @unsit=y - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RLVa-0.2.1d
832 {
833 if (strOption.empty())
834 RlvSettings::updateLoginLastLocation();
835 }
836 break;
837 #endif // RLV_EXTENSION_STARTLOCATION
838 case RLV_BHVR_ADDOUTFIT: // @addoutfit[:<layer>]=y - Checked: 2009-07-07 (RLVa-1.0.0d)
839 case RLV_BHVR_REMOUTFIT: // @remoutfit[:<layer>]=y - Checked: 2009-07-07 (RLVa-1.0.0d)
840 {
841 S16* pLayers = (eBehaviour == RLV_BHVR_ADDOUTFIT) ? m_LayersAdd : m_LayersRem;
842
843 if (strOption.empty())
844 {
845 for (int idx = 0; idx < WT_COUNT; idx++)
846 pLayers[idx]--;
847 }
848 else
849 {
850 EWearableType type = LLWearable::typeNameToType(strOption);
851 if (WT_INVALID != type)
852 {
853 pLayers[type]--;
854 m_Behaviours[eBehaviour]--;
855 }
856 }
857 }
858 break;
859 case RLV_BHVR_SETENV: // @setenv=y - Checked: 2009-07-10 (RLVa-1.0.0g) | Added: RLVa-0.2.0h
860 {
861 if (!fNoSetEnv)
862 {
863 // Restore WindLight parameters to what they were before @setenv=n was issued
864 RlvWLSnapshot::restoreSnapshot(m_pWLSnapshot);
865 delete m_pWLSnapshot;
866 m_pWLSnapshot = NULL;
867 }
868 }
869 break;
870 case RLV_BHVR_SHOWLOC: // @showloc=y - Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
871 case RLV_BHVR_SHOWNAMES: // @shownames=y - Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
872 case RLV_BHVR_SHOWHOVERTEXTALL: // @showhovertextal=y - Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
873 case RLV_BHVR_SHOWHOVERTEXTWORLD: // @showhovertextworld=y - Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
874 case RLV_BHVR_SHOWHOVERTEXTHUD: // @showhovertexthud=y - Checked: 2009-07-09 (RLVa-1.0.0f) | Added: RLVa-1.0.0f
875 {
876 // If this was the last of any of the five restrictions we should refresh all hover text in case anything needs restoring
877 if (!m_Behaviours[eBehaviour])
878 LLHUDText::refreshAllObjectText();
879 }
880 break;
881 case RLV_BHVR_SHOWHOVERTEXT: // @showhovertext:<uuid>=y - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
882 {
883 LLUUID idException(strOption);
884 if (idException.notNull()) // If there's an option it should be a valid UUID
885 {
886 removeException(uuid, eBehaviour, idException);
887
888 // Restore the object's hover text
889 LLViewerObject* pObj = gObjectList.findObject(idException);
890 if ( (pObj) && (pObj->mText.notNull()) && (!pObj->mText->getObjectText().empty()) )
891 pObj->mText->setStringUTF8(pObj->mText->getObjectText());
892 }
893 }
894 break;
895 case RLV_BHVR_NOTIFY: // @notify:<option>=rem - Checked: 2009-08-04 (RLVa-1.0.1d) | Modified: RLVa-1.0.1d
896 {
897 S32 nChannel; std::string strFilter;
898 if ( (m_pBhvrNotify) && (!strOption.empty()) && (rlvParseNotifyOption(strOption, nChannel, strFilter)) )
899 {
900 m_pBhvrNotify->removeNotify(uuid, nChannel, strFilter);
901
902 if (!m_pBhvrNotify->hasNotify())
903 {
904 removeBehaviourObserver(m_pBhvrNotify);
905 delete m_pBhvrNotify;
906 m_pBhvrNotify = NULL;
907 }
908 }
909 }
910 break;
911 case RLV_BHVR_SENDCHANNEL: // @sendchannel:<uuid>=rem - Checked: 2009-10-05 (RLVa-1.0.4a) | Modified: RLVa-1.0.4a
912 {
913 S32 nChannel; // If there's an option it should be a valid (=positive and non-zero) chat channel
914 if ( (!strOption.empty()) && (LLStringUtil::convertToS32(strOption, nChannel)) && (nChannel > 0) )
915 removeException(uuid, eBehaviour, nChannel);
916 }
917 break;
918 case RLV_BHVR_RECVCHAT: // @recvchat:<uuid>=rem - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
919 case RLV_BHVR_RECVEMOTE: // @recvemote:<uui>=red - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
920 case RLV_BHVR_RECVIM: // @recvim:<uuid>=rem - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
921 case RLV_BHVR_SENDIM: // @sendim:<uuid>=rem - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
922 case RLV_BHVR_TPLURE: // @recvim:<uuid>=rem - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
923 case RLV_BHVR_ACCEPTTP: // @accepttp:<uuid>=rem - Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
924 {
925 LLUUID idException(strOption);
926 if (idException.notNull()) // If there's an option it should be a valid UUID
927 removeException(uuid, eBehaviour, LLUUID(strOption));
928 }
929 break;
930 case RLV_BHVR_UNKNOWN:
931 {
932 // Give our observers a chance to handle any command we don't
933 RlvEvent rlvEvent(uuid, rlvCmd);
934 m_Emitter.update(&RlvObserver::onRemoveCommand, rlvEvent);
935 }
936 break;
937 default:
938 break;
939 }
940 return TRUE; // Remove commands don't fail, doesn't matter what we return here
941}
942
943BOOL RlvHandler::processClearCommand(const LLUUID& idObj, const RlvCommand& rlvCmd)
944{
945 const std::string& strFilter = rlvCmd.getParam(); std::string strCmdRem;
946
947 rlv_object_map_t::const_iterator itObj = m_Objects.find(idObj);
948 if (itObj != m_Objects.end()) // No sense in clearing if we don't have any commands for this object
949 {
950 const RlvObject& rlvObj = itObj->second; bool fContinue = true;
951 for (rlv_command_list_t::const_iterator itCmd = rlvObj.m_Commands.begin(), itCurCmd;
952 ((fContinue) && (itCmd != rlvObj.m_Commands.end())); )
953 {
954 itCurCmd = itCmd++; // Point itCmd ahead so it won't get invalidated if/when we erase a command
955
956 const RlvCommand& rlvCmdRem = *itCurCmd; strCmdRem = rlvCmdRem.asString();
957 if ( (strFilter.empty()) || (std::string::npos != strCmdRem.find(strFilter)) )
958 {
959 fContinue = (rlvObj.m_Commands.size() > 1); // rlvObj will become invalid once we remove the last command
960 processCommand(idObj, strCmdRem.append("=y"), false);
961 }
962 }
963 }
964
965 // Let our observers know about clear commands
966 RlvEvent rlvEvent(idObj, rlvCmd);
967 m_Emitter.update(&RlvObserver::onClearCommand, rlvEvent);
968
969 return TRUE; // Don't fail clear commands even if the object didn't exist since it confuses people
970}
971
972BOOL RlvHandler::processForceCommand(const LLUUID& idObj, const RlvCommand& rlvCmd) const
973{
974 const std::string& strOption = rlvCmd.getOption();
975 BOOL fHandled = TRUE;
976
977 switch (rlvCmd.getBehaviourType())
978 {
979 case RLV_BHVR_DETACH: // @detach[:<option>]=force - Checked:
980 onForceDetach(idObj, strOption);
981 break;
982 case RLV_BHVR_REMOUTFIT: // @remoutfit:<option>=force - Checked:
983 onForceRemOutfit(idObj, strOption);
984 break;
985 case RLV_BHVR_UNSIT: // @unsit=force - Checked: 2009-06-02 (RLVa-0.2.0g)
986 {
987 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
988 if ( (pAvatar) && (pAvatar->mIsSitting) && (!hasBehaviourExcept(RLV_BHVR_UNSIT, idObj)) )
989 {
990 // See behaviour notes on why we have to force an agent update here
991 gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
992 send_agent_update(TRUE, TRUE);
993 }
994 }
995 break;
996 case RLV_BHVR_TPTO: // @tpto:<option>=force - Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-1.0.0h
997 {
998 fHandled = FALSE;
999 if ( (!strOption.empty()) && (-1 == strOption.find_first_not_of("0123456789/.")) )
1000 {
1001 LLVector3d posGlobal;
1002
1003 boost_tokenizer tokens(strOption, boost::char_separator<char>("/", "", boost::keep_empty_tokens)); int idx = 0;
1004 for (boost_tokenizer::const_iterator itToken = tokens.begin(); itToken != tokens.end(); ++itToken)
1005 {
1006 if (idx < 3)
1007 LLStringUtil::convertToF64(*itToken, posGlobal[idx++]);
1008 }
1009
1010 if (idx == 3)
1011 {
1012 gAgent.teleportViaLocation(posGlobal);
1013 fHandled = TRUE;
1014 }
1015 }
1016 }
1017 break;
1018 case RLV_BHVR_SIT: // @sit:<option>=force - Checked: 2009-06-02 (RLVa-0.2.0g)
1019 fHandled = onForceSit(idObj, rlvCmd.getOption());
1020 break;
1021 case RLV_BHVR_ADDOUTFIT: // @addoutfit:<option>=force <- synonym of @attach:<option>=force
1022 case RLV_BHVR_ATTACH: // @attach:<option>=force - Checked:
1023 onForceWear(rlvCmd.getOption(), true, false); // Force attach single folder
1024 break;
1025 case RLV_BHVR_ATTACHALL: // @attachall:<option>=force - Checked:
1026 onForceWear(rlvCmd.getOption(), true, true); // Force attach nested folders
1027 break;
1028 case RLV_BHVR_DETACHALL: // @detachall:<option>=force - Checked:
1029 onForceWear(rlvCmd.getOption(), false, true); // Force detach nested folders
1030 break;
1031 case RLV_BHVR_ATTACHTHIS:
1032 case RLV_BHVR_ATTACHALLTHIS:
1033 case RLV_BHVR_DETACHTHIS:
1034 case RLV_BHVR_DETACHALLTHIS:
1035 {
1036 ERlvBehaviour eBehaviour = rlvCmd.getBehaviourType();
1037 std::string strReply;
1038 if (onGetPath(idObj, strOption, strReply))
1039 {
1040 LLStringUtil::toLower(strReply);
1041 onForceWear(strReply,
1042 (RLV_BHVR_ATTACHTHIS == eBehaviour) || (RLV_BHVR_ATTACHALLTHIS == eBehaviour),
1043 (RLV_BHVR_ATTACHALLTHIS == eBehaviour) || (RLV_BHVR_DETACHALLTHIS == eBehaviour));
1044 }
1045 }
1046 break;
1047 case RLV_BHVR_DETACHME: // @detachme=force - Checked: 2009-06-07 (RLVa-0.2.1c)
1048 {
1049 // NOTE: @detachme=force could be seen as a @detach:<attachpt>=force but RLV implements it as a "detach by UUID"
1050 LLViewerObject* pObj; LLVOAvatar* pAvatar; LLViewerJointAttachment* pAttachPt;
1051 if ( ((pObj = gObjectList.findObject(idObj)) != NULL) && (pObj->isAttachment()) &&
1052 ((pAvatar = gAgent.getAvatarObject()) != NULL) &&
1053 ((pAttachPt = pAvatar->getTargetAttachmentPoint(pObj->getRootEdit())) != NULL) )
1054 {
1055 handle_detach_from_avatar(pAttachPt);
1056 }
1057 }
1058 break;
1059 case RLV_BHVR_UNKNOWN:
1060 {
1061 // Give our observers a chance to handle any command we don't
1062 RlvEvent rlvEvent(idObj, rlvCmd);
1063 fHandled = m_Emitter.update(&RlvObserver::onForceCommand, rlvEvent);
1064 }
1065 break;
1066 default:
1067 break;
1068 }
1069 return fHandled; // If we handled it then it'll still be TRUE; if an observer doesn't handle it'll be FALSE
1070}
1071
1072// Checked: 2009-07-12 (RLVa-1.0.0h)
1073BOOL RlvHandler::processReplyCommand(const LLUUID& uuid, const RlvCommand& rlvCmd) const
1074{
1075 const std::string& strOption = rlvCmd.getOption();
1076 const std::string& strChannel = rlvCmd.getParam();
1077 std::string strReply;
1078
1079 BOOL fHandled = TRUE;
1080 switch (rlvCmd.getBehaviourType())
1081 {
1082 case RLV_BHVR_VERSION: // @version=<channel> - Checked: 2009-07-12 (RLVa-1.0.0h)
1083 strReply = getVersionString();
1084 break;
1085 case RLV_BHVR_VERSIONNUM: // @versionnum=<channel> - Checked: 2009-10-04 (RLVa-1.0.4b) | Added: RLVa-1.0.4b
1086 strReply = getVersionNumString();
1087 break;
1088 case RLV_BHVR_GETOUTFIT: // @getoufit[:<layer>]=<channel> - Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0d
1089 {
1090 // (Quirk: RLV 1.16.1 will execute @getoutfit=<channel> if <layer> is invalid, so we need to as well)
1091 EWearableType layerType = LLWearable::typeNameToType(strOption);
1092
1093 const EWearableType layerTypes[] =
1094 {
1095 WT_GLOVES, WT_JACKET, WT_PANTS, WT_SHIRT, WT_SHOES, WT_SKIRT, WT_SOCKS,
1096 WT_UNDERPANTS, WT_UNDERSHIRT, WT_SKIN, WT_EYES, WT_HAIR, WT_SHAPE
1097 };
1098
1099 #ifdef RLV_EXPERIMENTAL_COMPOSITE_FOLDING
1100 for (int idx = 0, cnt = sizeof(layerTypes) / sizeof(EWearableType); idx < cnt; idx++)
1101 {
1102 if ( (WT_INVALID == layerType) || (layerTypes[idx] == layerType) )
1103 {
1104 // TODO-RLVa: add support for 'fHideLockedLayers'
1105 bool fWorn = (gAgent.getWearable(layerTypes[idx])) &&
1106 (!isHiddenCompositeItem(gAgent.getWearableItem(layerTypes[idx]),
1107 LLWearable::typeToTypeName(layerTypes[idx])));
1108 strReply.push_back( (fWorn) ? '1' : '0' );
1109 }
1110 }
1111 #else
1112 for (int idx = 0, cnt = sizeof(layerTypes) / sizeof(EWearableType); idx < cnt; idx++)
1113 if ( (WT_INVALID == layerType) || (layerTypes[idx] == layerType) )
1114 {
1115 // We never hide body parts, even if they're "locked" and we're hiding locked layers
1116 // (nor do we hide a layer if the issuing object is the only one that has this layer locked)
1117 bool fWorn = (gAgent.getWearable(layerTypes[idx])) &&
1118 ( (!RlvSettings::getHideLockedLayers()) ||
1119 (LLAssetType::AT_BODYPART == LLWearable::typeToAssetType(layerTypes[idx])) ||
1120 ( (isRemovableExcept(layerTypes[idx], uuid)) &&
1121 (isStrippable(gAgent.getWearableItem(layerTypes[idx]))) ) );
1122 strReply.push_back( (fWorn) ? '1' : '0' );
1123 //strReply.push_back( (gAgent.getWearable(layerTypes[idx])) ? '1' : '0' );
1124 }
1125 #endif // RLV_EXPERIMENTAL_COMPOSITE_FOLDING
1126 }
1127 break;
1128 case RLV_BHVR_GETATTACH: // @getattach[:<layer>]=<channel> - Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0d
1129 {
1130 // If we're fetching all worn attachments then the reply should start with 0
1131 if (strOption.empty())
1132 strReply.push_back('0');
1133
1134 LLVOAvatar* pAvatar = gAgent.getAvatarObject(); std::string strAttachName;
1135 for (LLVOAvatar::attachment_map_t::const_iterator itAttach = pAvatar->mAttachmentPoints.begin();
1136 itAttach != pAvatar->mAttachmentPoints.end(); ++itAttach)
1137 {
1138 LLViewerJointAttachment* pAttachment = itAttach->second;
1139 if (!pAttachment)
1140 continue;
1141
1142 strAttachName = pAttachment->getName(); // Capitalized (see avatar_lad.xml)
1143 LLStringUtil::toLower(strAttachName);
1144
1145 #ifdef RLV_EXPERIMENTAL_COMPOSITE_FOLDING
1146 if ( (strOption.empty()) || (strOption == strAttachName) )
1147 {
1148 // TODO-RLVa: add support for 'fHideLockedAttach'
1149 bool fWorn = (pAttachment->getItemID().notNull()) &&
1150 (!isHiddenCompositeItem(pAttachment->getItemID(), strAttachName));
1151 strReply.push_back( (fWorn) ? '1' : '0' );
1152 }
1153 #else
1154 if ( (strOption.empty()) || (strOption == strAttachName) )
1155 {
1156 bool fWorn = (pAttachment->getItemID().notNull()) &&
1157 ( (!RlvSettings::getHideLockedAttach()) ||
1158 ( (isDetachable(itAttach->first)) && (isStrippable(pAttachment->getItemID())) ) );
1159 strReply.push_back( (fWorn) ? '1' : '0' );
1160 //strReply.push_back( (pAttachment->getItemID().notNull()) ? '1' : '0' );
1161 }
1162 #endif // RLV_EXPERIMENTAL_COMPOSITE_FOLDING
1163 }
1164 }
1165 break;
1166 case RLV_BHVR_GETSTATUS: // @getstatus[:<option>]=<channel> - Checked: 2009-07-12 (RLVa-1.0.0h)
1167 {
1168 // NOTE: specification says response should start with '/' but RLV-1.16.1 returns an empty string when no rules are set
1169 rlv_object_map_t::const_iterator itObj = m_Objects.find(uuid);
1170 if (itObj != m_Objects.end())
1171 {
1172 std::string strObjStatus = itObj->second.getStatusString(strOption);
1173 if (!strObjStatus.empty())
1174 {
1175 strReply.push_back('/');
1176 strReply += strObjStatus;
1177 }
1178 }
1179 }
1180 break;
1181 case RLV_BHVR_GETSTATUSALL: // @getstatusall[:<option>]=<channel> - Checked: 2009-07-12 (RLVa-1.0.0h)
1182 {
1183 // NOTE: specification says response should start with '/' but RLV-1.16.1 returns an empty string when no rules are set
1184 std::string strObjStatus;
1185 for (rlv_object_map_t::const_iterator itObj = m_Objects.begin(); itObj != m_Objects.end(); ++itObj)
1186 {
1187 strObjStatus = itObj->second.getStatusString(strOption);
1188 if (!strObjStatus.empty())
1189 {
1190 strReply.push_back('/');
1191 strReply += strObjStatus;
1192 }
1193 }
1194 }
1195 break;
1196 case RLV_BHVR_GETINV: // @getinv[:<path>]=<channel> - Checked: 2009-07-28 (RLVa-1.0.1b) | Modified: RLVa-1.0.1b
1197 {
1198 LLViewerInventoryCategory* pFolder = getSharedFolder(strOption);
1199 if (pFolder)
1200 {
1201 LLInventoryModel::cat_array_t* pFolders;
1202 LLInventoryModel::item_array_t* pItems;
1203 gInventory.getDirectDescendentsOf(pFolder->getUUID(), pFolders, pItems);
1204
1205 if (pFolders)
1206 {
1207 for (S32 idxFolder = 0, cntFolder = pFolders->count(); idxFolder < cntFolder; idxFolder++)
1208 {
1209 const std::string& strFolder = pFolders->get(idxFolder)->getName();
1210 if ( (!strFolder.empty()) && (RLV_FOLDER_PREFIX_HIDDEN != strFolder[0]) &&
1211 (!isFoldedFolder(pFolders->get(idxFolder).get(), true)) )
1212 {
1213 if (!strReply.empty())
1214 strReply.push_back(',');
1215 strReply += strFolder;
1216 }
1217 }
1218 }
1219 }
1220 }
1221 break;
1222 case RLV_BHVR_GETINVWORN: // @getinvworn[:path]=<channel> - Checked:
1223 onGetInvWorn(rlvCmd.getOption(), strReply);
1224 break;
1225 case RLV_BHVR_FINDFOLDER: // @findfolder:<criteria>=<channel> - Checked: 2009-08-26 (RLVa-1.0.2a) | Modified: RLVa-1.0.2a
1226 {
1227 // COMPAT-RLV: RLV 1.16.1 returns the first random folder it finds (probably tries to match "" to a folder name?)
1228 // (just going to stick with what's there for now... no option => no folder)
1229 LLInventoryModel::cat_array_t folders;
1230 if ( (!strOption.empty()) && (findSharedFolders(strOption, folders)) )
1231 {
1232 // We need to return an "in depth" result so whoever has the most '/' is our lucky winner
1233 // (maxSlashes needs to be initialized to -1 since children of the #RLV folder won't have '/' in their shared path)
1234 int maxSlashes = -1, curSlashes; std::string strFolderName;
1235 for (S32 idxFolder = 0, cntFolder = folders.count(); idxFolder < cntFolder; idxFolder++)
1236 {
1237 strFolderName = getSharedPath(folders.get(idxFolder));
1238
1239 curSlashes = std::count(strFolderName.begin(), strFolderName.end(), '/');
1240 if (curSlashes > maxSlashes)
1241 {
1242 maxSlashes = curSlashes;
1243 strReply = strFolderName;
1244 }
1245 }
1246 }
1247 }
1248 break;
1249 #ifdef RLV_EXTENSION_CMD_FINDFOLDERS
1250 case RLV_BHVR_FINDFOLDERS: // @findfolders:<criteria>=<channel> - Checked: 2009-07-12 (RLVa-1.0.0h) | Added: RLVa-0.2.0b
1251 {
1252 LLInventoryModel::cat_array_t folders;
1253 if ( (!strOption.empty()) && (findSharedFolders(strOption, folders)) )
1254 {
1255 for (S32 idxFolder = 0, cntFolder = folders.count(); idxFolder < cntFolder; idxFolder++)
1256 {
1257 if (!strReply.empty())
1258 strReply.push_back(',');
1259 strReply += getSharedPath(folders.get(idxFolder));
1260 }
1261 }
1262 }
1263 break;
1264 #endif // RLV_EXTENSION_CMD_FINDFOLDERS
1265 case RLV_BHVR_GETPATH: // @getpath[:<option>]=<channel> - Checked: 2009-07-12 (RLVa-1.0.0h)
1266 onGetPath(uuid, rlvCmd.getOption(), strReply);
1267 break;
1268 case RLV_BHVR_GETSITID: // @getsitid=<channel> - Checked: 2009-07-12 (RLVa-1.0.0h)
1269 {
1270 // (Quirk: RLV 1.16.1 returns a NULL uuid if we're not sitting)
1271 LLVOAvatar* pAvatarObj = gAgent.getAvatarObject(); LLUUID uuid;
1272 if ( (pAvatarObj) && (pAvatarObj->mIsSitting) )
1273 {
1274 // LLVOAvatar inherits from 2 classes so make sure we get the right vfptr
1275 LLViewerObject* pAvatar = dynamic_cast<LLViewerObject*>(pAvatarObj), *pParent;
1276 // (If there is a parent, we need to upcast it from LLXform to LLViewerObject to get its UUID)
1277 if ( (pAvatar) && ((pParent = static_cast<LLViewerObject*>(pAvatar->getRoot())) != pAvatar) )
1278 uuid = pParent->getID();
1279 }
1280 strReply = uuid.asString();
1281 }
1282 break;
1283 case RLV_BHVR_UNKNOWN:
1284 {
1285 // Give our observers a chance to handle any command we don't
1286 RlvEvent rlvEvent(uuid, rlvCmd);
1287 return m_Emitter.update(&RlvObserver::onReplyCommand, rlvEvent);
1288 }
1289 break;
1290 default:
1291 break;
1292 }
1293
1294 if (fHandled)
1295 rlvSendChatReply(strChannel, strReply);
1296 return fHandled;
1297}
1298
1299// ============================================================================
1300// House keeping (see debug notes for test methodology, test script and last run)
1301//
1302
1303void RlvHandler::initLookupTables()
1304{
1305 static bool fInitialized = false;
1306 if (!fInitialized)
1307 {
1308 // Initialize the attachment name lookup table
1309 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
1310 if (pAvatar)
1311 {
1312 std::string strAttachPtName;
1313 for (LLVOAvatar::attachment_map_t::const_iterator itAttach = pAvatar->mAttachmentPoints.begin();
1314 itAttach != pAvatar->mAttachmentPoints.end(); ++itAttach)
1315 {
1316 LLViewerJointAttachment* pAttachPt = itAttach->second;
1317 if (pAttachPt)
1318 {
1319 strAttachPtName = pAttachPt->getName();
1320 LLStringUtil::toLower(strAttachPtName);
1321 m_AttachLookup.addKeyword(strAttachPtName, itAttach->first);
1322 }
1323 }
1324 fInitialized = true;
1325 }
1326 }
1327}
1328
1329// Checked: 2009-08-11 (RLVa-1.0.1h) | Modified: RLVa-1.0.1h
1330void RlvHandler::onAttach(LLViewerJointAttachment* pAttachPt, bool fFullyLoaded)
1331{
1332 // Sanity check - LLVOAvatar::attachObject() should call us *after* calling LLViewerJointAttachment::addObject()
1333 LLViewerObject* pObj = pAttachPt->getObject();
1334 S32 idxAttachPt = getAttachPointIndex(pObj); // getAttachPointIndex() has a NULL pointer check so this is safe
1335 if ( (!pObj) || (!idxAttachPt) )
1336 {
1337 RLV_ERRS << "pAttachPt->getObject() == NULL" << LL_ENDL;
1338 return;
1339 }
1340
1341 // Check if this attachment point has a pending "reattach-on-detach"
1342 rlv_reattach_map_t::iterator itReattach = m_AttachPending.find(idxAttachPt);
1343 if (itReattach != m_AttachPending.end())
1344 {
1345 if (itReattach->second == pAttachPt->getItemID())
1346 {
1347 RLV_INFOS << "Reattached " << pAttachPt->getItemID().asString() << " to " << idxAttachPt << LL_ENDL;
1348 m_AttachPending.erase(itReattach);
1349 }
1350 }
1351 else if ( (fFullyLoaded) && (!isDetachableExcept(idxAttachPt, pObj)) )
1352 {
1353 // We're fully loaded with no pending reattach on this attach point but it's "undetachable" -> force detach the new attachment
1354
1355 // Assertion: the only way the attachment point could be locked at this point is if some object locked it with @detach:attachpt=n
1356 // - previous attachments on this attachment point might have issued @detach=n but those were all cleaned up at detach
1357 // - the new attachment might have issued @detach=n but that won't actually lock down the attachment point until further down
1358 // NOTE 1: "some object" may no longer exist if it was not an attachment and the GC hasn't cleaned it up yet (informative)
1359 // NOTE 2: "some object" may refer to the new attachment - ie @detach:spine=n from object on spine (problematic, causes reattach)
1360 // -> solved by using isDetachableExcept(idxAttachPt, pObj) instead of isDetachable(idxAttachPt)
1361
1362 m_DetachPending.insert(std::pair<S32, LLUUID>(idxAttachPt, pObj->getID()));
1363 rlvForceDetach(pAttachPt);
1364 }
1365
1366 // Check if we already have an RlvObject instance for this object (rezzed prim attached from in-world, or an attachment that rezzed in)
1367 rlv_object_map_t::iterator itObj = m_Objects.find(pObj->getID());
1368 if (itObj != m_Objects.end())
1369 {
1370 // Save the attachment point index
1371 itObj->second.m_idxAttachPt = idxAttachPt;
1372
1373 // If it's an attachment we processed commands for but that only just rezzed in we need to mark it as existing in gObjectList
1374 if (!itObj->second.m_fLookup)
1375 itObj->second.m_fLookup = true;
1376
1377 // In both cases we should check for "@detach=n" and actually lock down the attachment point it got attached to
1378 if (itObj->second.hasBehaviour(RLV_BHVR_DETACH, false))
1379 {
1380 // (Copy/paste from processAddCommand)
1381 setDetachable(idxAttachPt, pObj->getID(), false);
1382
1383 if (pObj->isHUDAttachment())
1384 LLPipeline::sShowHUDAttachments = TRUE; // Prevents hiding of locked HUD attachments
1385 }
1386 }
1387
1388 // Fetch the inventory item if we don't currently have it since we might need it for reattach-on-detach
1389 const LLUUID& idItem = pAttachPt->getItemID();
1390 LLViewerInventoryItem* pItem = ( (idItem.notNull()) && (gInventory.isInventoryUsable()) ) ? gInventory.getItem(idItem) : NULL;
1391 if ( (STATE_STARTED == LLStartUp::getStartupState()) && (pItem != NULL) )
1392 {
1393 RlvCurrentlyWorn f;
1394 f.fetchItem(idItem);
1395 }
1396
1397 // If what we're wearing is located under the shared root then append the attachment point name (if needed)
1398 LLViewerInventoryCategory* pRlvRoot = getSharedRoot();
1399 if ( (STATE_STARTED == LLStartUp::getStartupState()) && (pRlvRoot) && (pItem) && (pItem->isComplete()) &&
1400 (gInventory.isObjectDescendentOf(idItem, pRlvRoot->getUUID())) )
1401 {
1402 std::string strAttachPt = pAttachPt->getName();
1403 LLStringUtil::toLower(strAttachPt);
1404
1405 // If we can modify the item then it should contain the attach point name itself, otherwise its parent should
1406 if (pItem->getPermissions().allowModifyBy(gAgent.getID()))
1407 {
1408 if (!getAttachPoint(pItem, true))
1409 {
1410 // It doesn't specify an attach point and we can rename it [see LLItemBridge::renameItem()]
1411 std::string strName = pItem->getName();
1412 LLStringUtil::truncate(strName, DB_INV_ITEM_NAME_STR_LEN - strAttachPt.length() - 3);
1413
1414 strName += " (" + strAttachPt + ")";
1415
1416 pItem->rename(strName);
1417 pItem->updateServer(FALSE);
1418 gInventory.updateItem(pItem);
1419 //gInventory.notifyObservers(); <- done further down in LLVOAvatar::attachObject()
1420 }
1421 }
1422 else
1423 {
1424 // Folder can't be the shared root, or be its direct descendant (= nested at least 2 levels deep)
1425 LLViewerInventoryCategory* pFolder = gInventory.getCategory(pItem->getParentUUID());
1426 if ( (pFolder) &&
1427 (pFolder->getUUID() != pRlvRoot->getUUID()) && (pFolder->getParentUUID() != pRlvRoot->getUUID()) &&
1428 (!getAttachPoint(pFolder, true)) )
1429 {
1430 // It's no mod and its parent folder doesn't contain an attach point
1431 if ( (1 == rlvGetDirectDescendentsCount(pFolder, LLAssetType::AT_OBJECT)) && (NEW_CATEGORY_NAME == pFolder->getName()) )
1432 {
1433 // Only rename if there's exactly 1 object/attachment inside of it [see LLFolderBridge::renameItem()]
1434 std::string strName = ".(" + strAttachPt + ")";
1435
1436 pFolder->rename(strName);
1437 pFolder->updateServer(FALSE);
1438 gInventory.updateCategory(pFolder);
1439 //gInventory.notifyObservers(); <- done further down in LLVOAvatar::attachObject()
1440 }
1441 }
1442 }
1443 }
1444}
1445
1446// Checked: 2009-05-31 (RLVa-0.2.0e) | Modified: RLVa-0.2.0e
1447void RlvHandler::onDetach(LLViewerJointAttachment* pAttachPt)
1448{
1449 LLViewerObject* pObj = pAttachPt->getObject();
1450 if (!pObj)
1451 {
1452 // LLVOAvatar::detachObject() should call us *before* calling LLViewerJointAttachment::removeObject()
1453 RLV_ERRS << "pAttachPt->getObject() == NULL" << LL_ENDL;
1454 return;
1455 }
1456 S32 idxAttachPt = getAttachPointIndex(pObj);
1457 if (0 == idxAttachPt)
1458 {
1459 // If we ended up here then the user "Drop"'ed this attachment (which we can't recover from)
1460 return;
1461 }
1462
1463 #ifdef RLV_DEBUG
1464 // TODO-RLV: when we're exiting (for whatever reason) app state won't always reflect it but
1465 // gAgent.getAvatarObject()->mAttachmentPoints will be NULL so anywhere we use
1466 // "get_if_there" will call through a NULL pointer. One case is "idling out" -> test the rest
1467 //LLViewerJointAttachment* pDbgAttachmentPt =
1468 // get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, (S32)idxAttachPt, (LLViewerJointAttachment*)NULL);
1469 //RLV_INFOS << "Clean up for '" << pDbgAttachmentPt->getName() << "'" << LL_ENDL;
1470 #endif // RLV_DEBUG
1471
1472 // If the attachment was locked then we should reattach it (unless we're already trying to reattach to this attachment point)
1473 // (unless we forcefully detached it else in which case we do not want to reattach it)
1474 rlv_reattach_map_t::iterator itDetach = m_DetachPending.find(idxAttachPt);
1475 if (itDetach != m_DetachPending.end())
1476 {
1477 // RLVa-TODO: we should really be comparing item UUIDs but is it even possible to end up here and not have them match?
1478 m_DetachPending.erase(itDetach);
1479 }
1480 else if ( (!isDetachable(idxAttachPt)) && (m_AttachPending.find(idxAttachPt) == m_AttachPending.end()) )
1481 {
1482 // In an ideal world we would simply set up an LLInventoryObserver but there's no specific "asset updated" changed flag *sighs*
1483 // NOTE: attachments *always* know their "inventory item UUID" so we don't have to worry about fetched vs unfetched inventory
1484 m_AttachPending.insert(std::pair<S32, LLUUID>(idxAttachPt, pAttachPt->getItemID()));
1485 }
1486
1487 // We can't - easily - clean up child prims that never issued @detach=n but the GC will get those eventually
1488 rlv_detach_map_t::iterator itAttach = m_Attachments.find(idxAttachPt);
1489 while ( (itAttach != m_Attachments.upper_bound(idxAttachPt)) && (itAttach != m_Attachments.end()) )
1490 {
1491 LLViewerObject* pTempObj = gObjectList.findObject(itAttach->second);
1492 if ( (pTempObj) && (pTempObj->getRootEdit()->getID() == pObj->getID()) )
1493 {
1494 // Iterator points to the object (or to a child prim) so issue a clear on behalf of the object (there's the
1495 // possibility of going into an eternal loop, but that's ok since it indicates a bug in @clear that needs fixing)
1496 processCommand(itAttach->second, "clear", true);
1497
1498 itAttach = m_Attachments.find(idxAttachPt); // @clear will invalidate all iterators so we have to start anew
1499 }
1500 else
1501 {
1502 itAttach++;
1503 }
1504 }
1505
1506 // Clean up in case there was never a @detach=n (only works for the root prim - see above)
1507 rlv_object_map_t::iterator itObj = m_Objects.find(pObj->getID());
1508 if (itObj != m_Objects.end())
1509 processCommand(itObj->second.m_UUID, "clear", true);
1510}
1511
1512// Checked: 2009-07-30 (RLVa-1.0.1c) | Modified: RLVa-1.0.1c
1513bool RlvHandler::onGC()
1514{
1515 // We can't issue @clear on an object while we're in the loop below since that would invalidate our iterator
1516 // (and starting over would mean that some objects might get their "lookup misses" counter updated more than once per GC run)
1517 std::list<LLUUID> ExpiredObjects;
1518
1519 for (rlv_object_map_t::iterator itObj = m_Objects.begin(); itObj != m_Objects.end(); ++itObj)
1520 {
1521 LLViewerObject* pObj = gObjectList.findObject(itObj->second.m_UUID);
1522 if (!pObj)
1523 {
1524 // If the RlvObject once existed in the gObjectList and now doesn't then expire it right now
1525 // If the RlvObject never existed in the gObjectList and still doesn't then increase its "lookup misses" counter
1526 // but if that reaches 20 (we run every 30 seconds so that's about 10 minutes) then we'll expire it too
1527 if ( (itObj->second.m_fLookup) || (++itObj->second.m_nLookupMisses > 20) )
1528 ExpiredObjects.push_back(itObj->first);
1529 }
1530 else
1531 {
1532 // Check if this is an RlvObject instance who's object never existed in gObjectList before (rezzed prim in-world)
1533 // (it could also be an attachment that only just rezzed in but RlvHandler::onAttach() should be handling those)
1534 if ( (!itObj->second.m_fLookup) && (!pObj->isAttachment()) )
1535 itObj->second.m_fLookup = true;
1536 }
1537 }
1538
1539 for (std::list<LLUUID>::const_iterator itExpired = ExpiredObjects.begin(); itExpired != ExpiredObjects.end(); ++itExpired)
1540 {
1541 #ifdef RLV_DEBUG
1542 RLV_INFOS << "Garbage collecting " << *itExpired << LL_ENDL;
1543 #endif // RLV_DEBUG
1544
1545 processCommand(*itExpired, "clear", true);
1546 }
1547
1548 return (0 != m_Objects.size()); // GC will kill itself if it has nothing to do
1549}
1550
1551// Checked: 2009-08-08 (RLVa-1.0.1g) | Modified: RLVa-1.0.1g
1552void RlvHandler::onSavedAssetIntoInventory(const LLUUID& idItem)
1553{
1554 for (rlv_reattach_map_t::iterator itAttach = m_AttachPending.begin(); itAttach != m_AttachPending.end(); ++itAttach)
1555 {
1556 if (idItem == itAttach->second)
1557 {
1558 RLV_INFOS << "Reattaching " << idItem.asString() << " to " << itAttach->first << LL_ENDL;
1559
1560 #if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
1561 LLAttachmentRezAction* rez_action = new LLAttachmentRezAction;
1562 rez_action->mItemID = itAttach->second;
1563 rez_action->mAttachPt = itAttach->first;
1564
1565 confirm_replace_attachment_rez(0/*YES*/, (void*)rez_action); // (Will call delete on rez_action)
1566 #else // Version: 1.23.4
1567 LLSD payload;
1568 payload["item_id"] = itAttach->second;
1569 payload["attachment_point"] = itAttach->first;
1570
1571 LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/);
1572 #endif
1573 }
1574 }
1575}
1576
1577// ============================================================================
1578// String/chat censoring functions
1579//
1580
1581// LL must have included an strlen for UTF8 *somewhere* but I can't seem to find it so this one is home grown
1582size_t utf8str_strlen(const std::string& utf8)
1583{
1584 const char* pUTF8 = utf8.c_str(); size_t length = 0;
1585 for (int idx = 0, cnt = utf8.length(); idx < cnt ;idx++)
1586 {
1587 // We're looking for characters that don't start with 10 as their high bits
1588 if ((pUTF8[idx] & 0xC0) != 0x80)
1589 length++;
1590 }
1591 return length;
1592}
1593
1594// TODO-RLV: works, but more testing won't hurt
1595std::string utf8str_chtruncate(const std::string& utf8, size_t length)
1596{
1597 if (0 == length)
1598 return std::string();
1599 if (utf8.length() <= length)
1600 return utf8;
1601
1602 const char* pUTF8 = utf8.c_str(); int idx = 0;
1603 while ( (pUTF8[idx]) && (length > 0) )
1604 {
1605 // We're looking for characters that don't start with 10 as their high bits
1606 if ((pUTF8[idx] & 0xC0) != 0x80)
1607 length--;
1608 idx++;
1609 }
1610
1611 return utf8.substr(0, idx);
1612}
1613
1614// Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
1615void RlvHandler::filterChat(std::string& strUTF8Text, bool fFilterEmote) const
1616{
1617 if (strUTF8Text.empty())
1618 return;
1619
1620 if (rlvIsEmote(strUTF8Text)) // Check if it's an emote
1621 {
1622 if (fFilterEmote) // Emote filtering depends on fFilterEmote
1623 {
1624 if ( (strUTF8Text.find_first_of("\"()*=^_?~") != -1) ||
1625 (strUTF8Text.find(" -") != -1) || (strUTF8Text.find("- ") != -1) || (strUTF8Text.find("''") != -1) )
1626 {
1627 strUTF8Text = "..."; // Emote contains illegal character (or character sequence)
1628 }
1629 else if (!hasBehaviour(RLV_BHVR_EMOTE))
1630 {
1631 int idx = strUTF8Text.find('.'); // Truncate at 20 characters or at the dot (whichever is shorter)
1632 strUTF8Text = utf8str_chtruncate(strUTF8Text, ( (idx > 0) && (idx < 20) ) ? idx + 1 : 20);
1633 }
1634 }
1635 }
1636 else if (strUTF8Text[0] == '/') // Not an emote, but starts with a '/'
1637 {
1638 if (utf8str_strlen(strUTF8Text) > 7) // Allow as long if it's 6 characters or less
1639 strUTF8Text = "...";
1640 }
1641 else if ((strUTF8Text.length() < 4) || (strUTF8Text.compare(0, 2, "((")) || (strUTF8Text.compare(strUTF8Text.length() - 2, 2, "))")))
1642 {
1643 strUTF8Text = "..."; // Regular chat (not OOC)
1644 }
1645}
1646
1647// Checked: 2009-07-04 (RLVa-1.0.0a) | Modified: RLVa-1.0.0a
1648void RlvHandler::filterLocation(std::string& strUTF8Text) const
1649{
1650 // TODO-RLVa: if either the region or parcel name is a simple word such as "a" or "the" then confusion will ensue?
1651 // -> not sure how you would go about preventing this though :|...
1652
1653 // Filter any mention of the surrounding region names
1654 LLWorld::region_list_t regions = LLWorld::getInstance()->getRegionList();
1655 for (LLWorld::region_list_t::const_iterator itRegion = regions.begin(); itRegion != regions.end(); ++itRegion)
1656 rlvStringReplace(strUTF8Text, (*itRegion)->getName(), rlv_handler_t::cstrHiddenRegion);
1657
1658 // Filter any mention of the parcel name
1659 LLViewerParcelMgr* pParcelMgr = LLViewerParcelMgr::getInstance();
1660 if (pParcelMgr)
1661 rlvStringReplace(strUTF8Text, pParcelMgr->getAgentParcelName(), rlv_handler_t::cstrHiddenParcel);
1662}
1663
1664void RlvHandler::filterNames(std::string& strUTF8Text) const
1665{
1666 std::string strFirstName, strLastName, strName;
1667
1668 // TODO-RLV: make this a bit more efficient (ie people with a large draw distance will have a load of active regions)
1669 // -> the cost of multi string matching them all at once seems to be about the same as calling rlvStringReplace
1670 // twice so that would be a tremendous gain (and we'd get first name and word matching for free)
1671 #if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
1672 for (LLWorld::region_list_t::const_iterator itRegion = LLWorld::getInstance()->getRegionList().begin();
1673 itRegion != LLWorld::getInstance()->getRegionList().end(); ++itRegion)
1674 {
1675 LLViewerRegion* pRegion = *itRegion;
1676
1677 for (S32 idxAgent = 0, cntAgent = pRegion->mMapAvatars.count(); idxAgent < cntAgent; idxAgent++)
1678 {
1679 // LLCacheName::getName() will add the UUID to the lookup queue if we don't know it yet
1680 if (gCacheName->getName(pRegion->mMapAvatarIDs.get(idxAgent), strFirstName, strLastName))
1681 {
1682 strName = strFirstName + " " + strLastName;
1683
1684 rlvStringReplace(strUTF8Text, strName, getAnonym(strName));
1685 }
1686 }
1687 }
1688 #else // Version: trunk
1689 // TODO-RLV: should restrict this to a certain radius (probably 1-2 sim range?)
1690 std::vector<LLUUID> idAgents;
1691 LLWorld::getInstance()->getAvatars(&idAgents, NULL);
1692
1693 for (int idxAgent = 0, cntAgent = idAgents.size(); idxAgent < cntAgent; idxAgent++)
1694 {
1695 // LLCacheName::getName() will add the UUID to the lookup queue if we don't know it yet
1696 if (gCacheName->getName(idAgents[idxAgent], strFirstName, strLastName))
1697 {
1698 strName = strFirstName + " " + strLastName;
1699
1700 rlvStringReplace(strUTF8Text, strName, getAnonym(strName));
1701 }
1702 }
1703 #endif
1704}
1705
1706const std::string& RlvHandler::getAnonym(const std::string& strName) const
1707{
1708 const char* pszName = strName.c_str();
1709 U32 nHash = 0;
1710
1711 // Test with 11,264 SL names showed a 3.33% - 3.82% occurance for each so we *should* get a very even spread
1712 for (int idx = 0, cnt = strName.length(); idx < cnt; idx++)
1713 nHash += pszName[idx];
1714
1715 return cstrAnonyms[nHash % 28];
1716}
1717
1718// Checked: 2009-07-07 (RLVa-1.0.0d) | Modified: RLVa-0.2.2a
1719bool RlvHandler::redirectChatOrEmote(const std::string& strUTF8Text) const
1720{
1721 // Sanity check - @redirchat only for chat and @rediremote only for emotes
1722 bool fIsEmote = rlvIsEmote(strUTF8Text);
1723 if ( ((!fIsEmote) && (!hasBehaviour(RLV_BHVR_REDIRCHAT))) || ((fIsEmote) && (!hasBehaviour(RLV_BHVR_REDIREMOTE))) )
1724 return false;
1725
1726 if (!fIsEmote)
1727 {
1728 std::string strText = strUTF8Text;
1729 filterChat(strText, true);
1730 if (strText != "...")
1731 return false; // @sendchat wouldn't filter it so @redirchat won't redirect it either
1732 }
1733
1734 bool fSendChannel = hasBehaviour(RLV_BHVR_SENDCHANNEL); S32 nChannel = 0;
1735 for (rlv_object_map_t::const_iterator itObj = m_Objects.begin(); itObj != m_Objects.end(); ++itObj)
1736 {
1737 for (rlv_command_list_t::const_iterator itCmd = itObj->second.m_Commands.begin(),
1738 endCmd = itObj->second.m_Commands.end(); itCmd != endCmd; ++itCmd)
1739 {
1740 if ( ( ((!fIsEmote) && (RLV_BHVR_REDIRCHAT == itCmd->getBehaviourType())) || // Redirect if: (not an emote and @redirchat
1741 ((fIsEmote) && (RLV_BHVR_REDIREMOTE == itCmd->getBehaviourType())) ) && // OR an emote and @rediremote)
1742 (LLStringUtil::convertToS32(itCmd->getOption(), nChannel)) && // AND the channel is a number
1743 ( (!fSendChannel) || (isException(RLV_BHVR_SENDCHANNEL, nChannel)) ) ) // AND we're allowed to send to that channel
1744 {
1745 rlvSendChatReply(nChannel, strUTF8Text);
1746 }
1747 }
1748 }
1749 return true;
1750}
1751
1752// ============================================================================
1753// Public service functions (called by the outside world or by extension handlers)
1754//
1755
1756BOOL RlvHandler::isAgentNearby(const LLUUID& uuid) const
1757{
1758 #if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
1759 for (LLWorld::region_list_t::const_iterator itRegion = LLWorld::getInstance()->getRegionList().begin();
1760 itRegion != LLWorld::getInstance()->getRegionList().end(); ++itRegion)
1761 {
1762 LLViewerRegion* pRegion = *itRegion;
1763
1764 for (S32 idxAgent = 0, cntAgent = pRegion->mMapAvatars.count(); idxAgent < cntAgent; idxAgent++)
1765 if (pRegion->mMapAvatarIDs.get(idxAgent) == uuid)
1766 return TRUE;
1767 }
1768 #else // Version: trunk
1769 // TODO-RLV: rewrite this to fit trunk, but still need the radius limited to a sane range
1770 std::vector<LLUUID> idAgents;
1771 LLWorld::getInstance()->getAvatars(&idAgents, NULL);
1772
1773 for (int idxAgent = 0, cntAgent = idAgents.size(); idxAgent < cntAgent; idxAgent++)
1774 {
1775 if (idAgents[idxAgent] == uuid)
1776 return TRUE;
1777 }
1778 #endif
1779 return FALSE;
1780}
1781
1782// ============================================================================
1783// General purpose inventory functions
1784//
1785
1786// Checked: 2009-07-12 (RLVa-1.0.0h)
1787class RlvSharedRootFetcher : public LLInventoryFetchDescendentsObserver
1788{
1789public:
1790 RlvSharedRootFetcher() {}
1791
1792 virtual void done()
1793 {
1794 RLV_INFOS << "Shared folders fetch completed" << LL_ENDL;
1795 RlvHandler::m_fFetchComplete = TRUE;
1796
1797 gInventory.removeObserver(this);
1798 delete this;
1799 }
1800};
1801
1802// Checked: 2009-07-12 (RLVa-1.0.0h)
1803void RlvHandler::fetchSharedInventory()
1804{
1805 // Sanity check - don't fetch if we're already fetching, or if we don't have a shared root
1806 LLViewerInventoryCategory* pRlvRoot = getSharedRoot();
1807 if ( (m_fFetchStarted) || (!pRlvRoot) )
1808 return;
1809
1810 // Grab all the folders under the shared root
1811 LLInventoryModel::cat_array_t folders;
1812 LLInventoryModel::item_array_t items;
1813 gInventory.collectDescendents(pRlvRoot->getUUID(), folders, items, FALSE);
1814
1815 /*
1816 * Add them to the "to fetch" list
1817 */
1818 LLInventoryFetchDescendentsObserver::folder_ref_t fetchFolders;
1819
1820 fetchFolders.push_back(pRlvRoot->getUUID());
1821 for (S32 idxFolder = 0, cntFolder = folders.count(); idxFolder < cntFolder; idxFolder++)
1822 fetchFolders.push_back(folders.get(idxFolder)->getUUID());
1823
1824 /*
1825 * Now fetch them all in one go
1826 */
1827 RlvSharedRootFetcher* fetcher = new RlvSharedRootFetcher;
1828
1829 RLV_INFOS << "Starting fetch of " << fetchFolders.size() << " shared folders" << LL_ENDL;
1830 fetcher->fetchDescendents(fetchFolders);
1831
1832 if (fetcher->isEverythingComplete())
1833 fetcher->done();
1834 else
1835 gInventory.addObserver(fetcher);
1836}
1837
1838bool RlvHandler::findSharedFolders(const std::string& strCriteria, LLInventoryModel::cat_array_t& folders) const
1839{
1840 // Sanity check - can't do anything without a shared root
1841 LLViewerInventoryCategory* pRlvRoot = getSharedRoot();
1842 if (!pRlvRoot)
1843 return false;
1844
1845 folders.clear();
1846 LLInventoryModel::item_array_t items;
1847 RlvCriteriaCategoryCollector functor(strCriteria);
1848 gInventory.collectDescendentsIf(pRlvRoot->getUUID(), folders, items, FALSE, functor);
1849
1850 return (folders.count() != 0);
1851}
1852
1853// Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0e
1854LLViewerInventoryCategory* RlvHandler::getSharedRoot()
1855{
1856 if (gInventory.isInventoryUsable())
1857 {
1858 LLInventoryModel::cat_array_t* pFolders;
1859 LLInventoryModel::item_array_t* pItems;
1860 gInventory.getDirectDescendentsOf(gAgent.getInventoryRootID(), pFolders, pItems);
1861 if (pFolders)
1862 {
1863 // NOTE: we might have multiple #RLV folders so we'll just go with the first one we come across
1864 LLViewerInventoryCategory* pFolder;
1865 for (S32 idxFolder = 0, cntFolder = pFolders->count(); idxFolder < cntFolder; idxFolder++)
1866 {
1867 if ( ((pFolder = pFolders->get(idxFolder)) != NULL) && (RlvHandler::cstrSharedRoot == pFolder->getName()) )
1868 return pFolder;
1869 }
1870 }
1871 }
1872 return NULL;
1873}
1874
1875// Checked: 2009-07-28 (RLVa-1.0.1a) | Modified: RLVa-1.0.1a
1876LLViewerInventoryCategory* RlvHandler::getSharedFolder(const LLUUID& idParent, const std::string& strFolderName) const
1877{
1878 LLInventoryModel::cat_array_t* pFolders;
1879 LLInventoryModel::item_array_t* pItems;
1880 gInventory.getDirectDescendentsOf(idParent, pFolders, pItems);
1881 if ( (!pFolders) || (strFolderName.empty()) )
1882 return NULL;
1883
1884 // If we can't find an exact match then we'll settle for a "contains" match
1885 LLViewerInventoryCategory* pPartial = NULL;
1886
1887 //LLStringUtil::toLower(strFolderName); <- everything was already converted to lower case before
1888
1889 std::string strName;
1890 for (S32 idxFolder = 0, cntFolder = pFolders->count(); idxFolder < cntFolder; idxFolder++)
1891 {
1892 LLViewerInventoryCategory* pFolder = pFolders->get(idxFolder);
1893
1894 strName = pFolder->getName();
1895 if (strName.empty())
1896 continue;
1897 LLStringUtil::toLower(strName);
1898
1899 if (strFolderName == strName)
1900 return pFolder; // Found an exact match, no need to keep on going
1901 else if ( (!pPartial) && (RLV_FOLDER_PREFIX_HIDDEN != strName[0]) && (strName.find(strFolderName) != std::string::npos) )
1902 pPartial = pFolder; // Found a partial (non-hidden) match, but we might still find an exact one (first partial match wins)
1903 }
1904
1905 return pPartial;
1906}
1907
1908// Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0e
1909LLViewerInventoryCategory* RlvHandler::getSharedFolder(const std::string& strPath) const
1910{
1911 // Sanity check - no shared root => no shared folder
1912 LLViewerInventoryCategory* pRlvRoot = getSharedRoot(), *pFolder = pRlvRoot;
1913 if (!pRlvRoot)
1914 return NULL;
1915
1916 // Walk the path (starting at the root)
1917 boost_tokenizer tokens(strPath, boost::char_separator<char>("/", "", boost::drop_empty_tokens));
1918 for (boost_tokenizer::const_iterator itToken = tokens.begin(); itToken != tokens.end(); ++itToken)
1919 {
1920 pFolder = getSharedFolder(pFolder->getUUID(), *itToken);
1921 if (!pFolder)
1922 return NULL; // No such folder
1923 }
1924
1925 return pFolder; // If strPath was empty or just a bunch of //// then: pFolder == pRlvRoot
1926}
1927
1928// Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0g
1929std::string RlvHandler::getSharedPath(const LLViewerInventoryCategory* pFolder) const
1930{
1931 LLViewerInventoryCategory* pRlvRoot = getSharedRoot();
1932 // Sanity check - no shared root or no folder => no path
1933 if ( (!pRlvRoot) || (!pFolder) || (pRlvRoot->getUUID() == pFolder->getUUID()) )
1934 return std::string();
1935
1936 const LLUUID& idRLV = pRlvRoot->getUUID();
1937 const LLUUID& idRoot = gAgent.getInventoryRootID();
1938 std::string strPath;
1939
1940 // Walk up the tree until we reach the top
1941 while (pFolder)
1942 {
1943 strPath = "/" + pFolder->getName() + strPath;
1944
1945 const LLUUID& idParent = pFolder->getParentUUID();
1946 if (idRLV == idParent) // Reached the shared root, we're done
1947 break;
1948 else if (idRoot == idParent) // We reached the agent's inventory root (indicative of a logic error elsewhere)
1949 {
1950 RLV_ERRS << "Reached agent's inventory root while building path for shared folder" << LL_ENDL;
1951 return std::string();
1952 }
1953 else
1954 pFolder = gInventory.getCategory(idParent);
1955 }
1956
1957 return strPath.erase(0, 1);
1958}
1959
1960// ============================================================================
1961// Composite folders
1962//
1963
1964#ifdef RLV_EXPERIMENTAL_COMPOSITES
1965 // Checked:
1966 bool RlvHandler::getCompositeInfo(const LLInventoryCategory* pFolder, std::string* pstrName) const
1967 {
1968 if (pFolder)
1969 {
1970 // Composite folder naming: ^\.?[Folder]
1971 const std::string& cstrFolder = pFolder->getName();
1972 int idxStart = cstrFolder.find('['), idxEnd = cstrFolder.find(']', idxStart);
1973 if ( ((0 == idxStart) || (1 == idxStart)) && (idxEnd - idxStart > 1) )
1974 {
1975 if (pstrName)
1976 pstrName->assign(cstrFolder.substr(idxStart + 1, idxEnd - idxStart - 1));
1977 return true;
1978 }
1979 }
1980 return false;
1981 }
1982
1983 // Checked:
1984 bool RlvHandler::getCompositeInfo(const LLUUID& idItem, std::string* pstrName, LLViewerInventoryCategory** ppFolder) const
1985 {
1986 LLViewerInventoryCategory* pRlvRoot; LLViewerInventoryItem* pItem;
1987
1988 if ( (idItem.notNull()) && ((pRlvRoot = getSharedRoot()) != NULL) &&
1989 (gInventory.isObjectDescendentOf(idItem, pRlvRoot->getUUID())) && ((pItem = gInventory.getItem(idItem)) != NULL) )
1990 {
1991 // We know it's an item in a folder under the shared root...
1992 LLViewerInventoryCategory* pFolder = gInventory.getCategory(pItem->getParentUUID());
1993 if (getAttachPoint(pFolder, true))
1994 {
1995 // ... but it could be named ".(attachpt)" in which case we need its parent
1996 pFolder = gInventory.getCategory(pFolder->getParentUUID());
1997 }
1998
1999 if ( (pFolder) && (getCompositeInfo(pFolder, pstrName)) )
2000 {
2001 if (ppFolder)
2002 *ppFolder = pFolder;
2003 return true;
2004 }
2005 }
2006 return false;
2007 }
2008#endif // RLV_EXPERIMENTAL_COMPOSITES
2009
2010#ifdef RLV_EXPERIMENTAL_COMPOSITE_FOLDING
2011 // Checked:
2012 inline bool RlvHandler::isHiddenCompositeItem(const LLUUID& idItem, const std::string& cstrItemType) const
2013 {
2014 // An item that's part of a composite folder will be hidden from @getoutfit and @getattach if:
2015 // (1) the composite name specifies either a wearable layer or an attachment point
2016 // (2) the specified wearable layer or attachment point is worn and resides in the folder
2017 // (3) cstrItemType isn't the specified wearable layer or attach point
2018 //
2019 // Example: #RLV/Separates/Shoes/ChiChi Pumps/.[shoes] with items: "Shoe Base", "Shoe (left foot)" and "Shoe (right foot)"
2020 // -> as long as "Shoe Base" is worn, @getattach should not reflect "left foot", nor "right foot"
2021 std::string strComposite; LLViewerInventoryCategory* pFolder;
2022 EWearableType type; S32 idxAttachPt;
2023 if ( (getCompositeInfo(idItem, &strComposite, &pFolder)) && (cstrItemType != strComposite) )
2024 {
2025 LLUUID idCompositeItem;
2026 if ((type = LLWearable::typeNameToType(strComposite)) != WT_INVALID)
2027 {
2028 idCompositeItem = gAgent.getWearableItem(type);
2029 }
2030 else if ((idxAttachPt = getAttachPointIndex(strComposite, true)) != 0)
2031 {
2032 LLVOAvatar* pAvatar; LLViewerJointAttachment* pAttachmentPt;
2033 if ( ((pAvatar = gAgent.getAvatarObject()) != NULL) &&
2034 ((pAttachmentPt = get_if_there(pAvatar->mAttachmentPoints, idxAttachPt, (LLViewerJointAttachment*)NULL)) != NULL) )
2035 {
2036 idCompositeItem = pAttachmentPt->getItemID();
2037 }
2038 }
2039
2040 if ( (idCompositeItem.notNull()) && (gInventory.isObjectDescendentOf(idCompositeItem, pFolder->getUUID())) )
2041 return true;
2042 }
2043 return false;
2044 }
2045#endif // RLV_EXPERIMENTAL_COMPOSITEFOLDING
2046
2047#ifdef RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2048 // Checked:
2049 bool RlvHandler::canTakeOffComposite(const LLInventoryCategory* pFolder) const
2050 {
2051 if (!pFolder) // If there's no folder then there is nothing to take off
2052 return false;
2053
2054 LLInventoryModel::cat_array_t folders;
2055 LLInventoryModel::item_array_t items;
2056 RlvWearableItemCollector functor(pFolder->getUUID(), true, false);
2057
2058 // Grab a list of all the items @detachthis would be detaching/unwearing
2059 gInventory.collectDescendentsIf(pFolder->getUUID(), folders, items, FALSE, functor);
2060 if (!items.count())
2061 return false; // There are no wearable items in the folder so there is nothing to take off
2062
2063 LLViewerInventoryItem* pItem;
2064 for (S32 idxItem = 0, cntItem = items.count(); idxItem < cntItem; idxItem++)
2065 {
2066 pItem = items.get(idxItem);
2067
2068 switch (pItem->getType())
2069 {
2070 case LLAssetType::AT_CLOTHING:
2071 {
2072 LLWearable* pWearable = gAgent.getWearableFromWearableItem(pItem->getUUID());
2073 if ( (pWearable) && (!isRemovable(pWearable->getType())) )
2074 return false; // If one clothing layer in the composite folder is unremoveable then the entire folder is
2075 }
2076 break;
2077 case LLAssetType::AT_OBJECT:
2078 {
2079 LLVOAvatar* pAvatar; LLViewerObject* pObj;
2080 if ( ((pAvatar = gAgent.getAvatarObject()) != NULL) &&
2081 ((pObj = pAvatar->getWornAttachment(pItem->getUUID())) != NULL) && (!isDetachable(pObj)) )
2082 {
2083 return false; // If one attachment in the composite folder is undetachable then the entire folder is
2084 }
2085 }
2086 break;
2087 #ifdef LL_GNUC
2088 default:
2089 break;
2090 #endif // LL_GNUC
2091 }
2092 }
2093 return true;
2094 }
2095#endif // RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2096
2097// ============================================================================
2098// Event handlers
2099//
2100
2101// Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0d
2102void RlvHandler::onForceDetach(const LLUUID& idObj, const std::string& strOption) const
2103{
2104 U16 nParam;
2105 if (strOption.empty())
2106 {
2107 // Simulate right-click / Take Off > Detach All
2108 LLAgent::userRemoveAllAttachments(NULL);
2109 }
2110 else if (m_AttachLookup.getExactMatchParam(strOption, nParam))
2111 {
2112 // Simulate right-click / Take Off > Detach > ...
2113 LLVOAvatar* pAvatar; LLViewerJointAttachment* pAttachmentPt;
2114 if ( ((pAvatar = gAgent.getAvatarObject()) != NULL) && // Make sure we're actually wearing something on the attachment point
2115 ((pAttachmentPt = get_if_there(pAvatar->mAttachmentPoints, (S32)nParam, (LLViewerJointAttachment*)NULL)) != NULL) &&
2116 (isStrippable(pAttachmentPt->getItemID())) ) // ... and that it's not marked as "nostrip"
2117 {
2118 #ifdef RLV_EXPERIMENTAL_COMPOSITES
2119 // If we're stripping something that's part of a composite folder then we should @detachthis instead
2120 if (isCompositeDescendent(pAttachmentPt->getItemID()))
2121 {
2122 std::string strCmd = "detachthis:" + strOption + "=force";
2123 #ifdef RLV_DEBUG
2124 RLV_INFOS << "\t- '" << strOption << "' belongs to composite folder: @" << strCmd << LL_ENDL;
2125 #endif // RLV_DEBUG
2126 processForceCommand(idObj, RlvCommand(strCmd));
2127 }
2128 else
2129 #endif // RLV_EXPERIMENTAL_COMPOSITES
2130 {
2131 handle_detach_from_avatar(pAttachmentPt);
2132 }
2133 }
2134 }
2135 else
2136 {
2137 // Force detach single folder
2138 onForceWear(strOption, false, false);
2139 }
2140}
2141
2142// Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0d
2143void RlvHandler::onForceRemOutfit(const LLUUID& idObj, const std::string& strOption) const
2144{
2145 EWearableType typeOption = LLWearable::typeNameToType(strOption), type;
2146 if ( (WT_INVALID == typeOption) && (!strOption.empty()) )
2147 return;
2148
2149 // Before we had an option and optionless branch, but with the addition of composites and nostrip there's less duplication this way
2150 for (int idxType = 0; idxType < WT_COUNT; idxType++)
2151 {
2152 type = (EWearableType)idxType;
2153 if (LLAssetType::AT_CLOTHING != LLWearable::typeToAssetType(type))
2154 continue; // Only strip clothing, not bodyparts
2155
2156 if ( ((typeOption == type) || (strOption.empty())) && (gAgent.getWearable(type)) && (isStrippable(gAgent.getWearableItem(type))) )
2157 {
2158 #ifdef RLV_EXPERIMENTAL_COMPOSITES
2159 // If we're stripping something that's part of a composite folder then we should @detachthis instead
2160 if (isCompositeDescendent(gAgent.getWearableItem(type)))
2161 {
2162 std::string strCmd = "detachthis:" + LLWearable::typeToTypeName(type) + "=force";
2163 #ifdef RLV_DEBUG
2164 RLV_INFOS << "\t- '" << LLWearable::typeToTypeName(type) << "' is composite descendent: @" << strCmd << LL_ENDL;
2165 #endif // RLV_DEBUG
2166 processForceCommand(idObj, RlvCommand(strCmd));
2167 }
2168 else
2169 #endif // RLV_EXPERIMENTAL_COMPOSITES
2170 {
2171 gAgent.removeWearable(type);
2172 }
2173 }
2174 }
2175}
2176
2177// Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0g
2178bool RlvHandler::onForceSit(const LLUUID& idObj, const std::string& strOption) const
2179{
2180 LLViewerObject* pObject = NULL; LLUUID idTarget(strOption);
2181 // Sanity checking - we need to know about the object and it should identify a prim/linkset
2182 if ( (idTarget.isNull()) || ((pObject = gObjectList.findObject(idTarget)) == NULL) || (LL_PCODE_VOLUME != pObject->getPCode()) )
2183 return false;
2184
2185 // Don't force sit if:
2186 // 1) currently sitting and prevented from standing up
2187 // 2) prevented from sitting
2188 // 3) @sittp=n restricted (except if @sittp=n was issued by the same prim that's currently force sitting the avie)
2189 if ( ( (hasBehaviour(RLV_BHVR_UNSIT)) && (gAgent.getAvatarObject()) && (gAgent.getAvatarObject()->mIsSitting) ) ||
2190 ( (hasBehaviour(RLV_BHVR_SIT)) ) ||
2191 ( (hasBehaviourExcept(RLV_BHVR_SITTP, idObj)) &&
2192 (dist_vec_squared(gAgent.getPositionGlobal(), pObject->getPositionGlobal()) > 1.5f * 1.5f) ))
2193 {
2194 return false;
2195 }
2196
2197 // Copy/paste from handle_sit_or_stand() [see http://wiki.secondlife.com/wiki/AgentRequestSit]
2198 gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
2199 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
2200 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
2201 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
2202 gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
2203 gMessageSystem->addUUIDFast(_PREHASH_TargetID, pObject->mID);
2204 // Offset: "a rough position in local coordinates for the edge to sit on"
2205 // (we might not even be looking at the object so I don't think we can supply the offset to an edge)
2206 gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3::zero);
2207 pObject->getRegion()->sendReliableMessage();
2208
2209 return true;
2210}
2211
2212void RlvHandler::onForceWear(const std::string& strPath, bool fAttach, bool fMatchAll) const
2213{
2214 // See LLWearableBridge::wearOnAvatar(): don't wear anything until initial wearables are loaded, can destroy clothing items
2215 if (!gAgent.areWearablesLoaded())
2216 return;
2217
2218 LLViewerInventoryCategory* pFolder = getSharedFolder(strPath);
2219 if (!pFolder) // Folder not found = nothing to attach
2220 return;
2221
2222 LLInventoryModel::cat_array_t folders;
2223 LLInventoryModel::item_array_t items;
2224 RlvWearableItemCollector functor(pFolder->getUUID(), fAttach, fMatchAll);
2225
2226 // Grab a list of all the items we'll be wearing/attaching
2227 gInventory.collectDescendentsIf(pFolder->getUUID(), folders, items, FALSE, functor);
2228
2229 LLViewerInventoryItem* pItem;
2230 for (S32 idxItem = 0, cntItem = items.count(); idxItem < cntItem; idxItem++)
2231 {
2232 pItem = items.get(idxItem);
2233
2234 switch (pItem->getType())
2235 {
2236 case LLAssetType::AT_CLOTHING:
2237 case LLAssetType::AT_BODYPART:
2238 {
2239 LLWearable* pWearable = gAgent.getWearableFromWearableItem(pItem->getUUID());
2240
2241 #ifdef RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2242 // If we're already wearing something on this layer then we have to check if it isn't part of a composite
2243 // folder that has at least one unremovable item (in which case we can't wear or remove this item)
2244 LLViewerInventoryCategory* pCompositeFolder;
2245 if ( (!pWearable) || (!getCompositeInfo(pItem->getUUID(), NULL, &pCompositeFolder)) ||
2246 (canTakeOffComposite(pFolder)))
2247 {
2248 #endif // RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2249 if (fAttach)
2250 {
2251 // Simulate wearing a clothing item from inventory (right click / "Wear")
2252 // LLWearableBridge::performAction() => LLWearableBridge::wearOnAvatar() => wear_inventory_item_on_avatar()
2253 wear_inventory_item_on_avatar(pItem);
2254 }
2255 else
2256 {
2257 if ( (pWearable) && (LLAssetType::AT_CLOTHING == pItem->getType()) )
2258 gAgent.removeWearable(pWearable->getType());
2259 }
2260 #ifdef RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2261 }
2262 #endif // RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2263 }
2264 break;
2265 case LLAssetType::AT_OBJECT:
2266 {
2267 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
2268 LLViewerObject* pObj;
2269
2270 #ifdef RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2271 // If we're already wearing something on this attach point then we have to check if it isn't part of a composite
2272 // folder that has at least one unremovable item (in which case we can't attach or detach this item)
2273 LLViewerInventoryCategory* pCompositeFolder;
2274 if ( (pAvatar) &&
2275 ( ((pObj = pAvatar->getWornAttachment(pItem->getUUID())) == NULL) ||
2276 (!getCompositeInfo(pItem->getUUID(), NULL, &pCompositeFolder)) || (canTakeOffComposite(pFolder)) ) )
2277 {
2278 #endif // RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2279 if (fAttach)
2280 {
2281 // Simulate wearing an object to a specific attachment point (copy/paste to suppress replacement dialog)
2282 // LLAttachObject::handleEvent() => rez_attachment()
2283 LLViewerJointAttachment* pAttachPt = getAttachPoint(pItem, true);
2284 if ( (pAttachPt) && (isDetachable(pAttachPt)) )
2285 {
2286 #if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
2287 LLAttachmentRezAction* rez_action = new LLAttachmentRezAction;
2288 rez_action->mItemID = pItem->getUUID();
2289 rez_action->mAttachPt = getAttachPointIndex(pAttachPt->getName(), true);
2290
2291 confirm_replace_attachment_rez(0/*YES*/, (void*)rez_action); // (Will call delete on rez_action)
2292 #else // Version: 1.23.4
2293 LLSD payload;
2294 payload["item_id"] = pItem->getUUID();
2295 payload["attachment_point"] = getAttachPointIndex(pAttachPt->getName(), true);
2296
2297 LLNotifications::instance().forceResponse(
2298 LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/);
2299 #endif
2300 }
2301 }
2302 else
2303 {
2304 if ( (pAvatar) && ((pObj = pAvatar->getWornAttachment(pItem->getUUID())) != NULL) )
2305 {
2306 LLViewerJointAttachment* pAttachment = pAvatar->getTargetAttachmentPoint(pObj);
2307 if (pAttachment)
2308 handle_detach_from_avatar(pAttachment);
2309 }
2310 }
2311 #ifdef RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2312 }
2313 #endif // RLV_EXPERIMENTAL_COMPOSITE_LOCKING
2314 }
2315 break;
2316 #ifdef LL_GNUC
2317 default:
2318 break;
2319 #endif // LL_GNUC
2320 }
2321 }
2322}
2323
2324// Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-0.2.0g
2325bool RlvHandler::onGetPath(const LLUUID &uuid, const std::string& strOption, std::string& strReply) const
2326{
2327 // Sanity check - no need to go through all this trouble if we don't have a shared root
2328 LLViewerInventoryCategory* pRlvRoot = getSharedRoot();
2329 if (!pRlvRoot)
2330 return false;
2331
2332 LLUUID idItem;
2333
2334 // <option> can be a clothing layer
2335 EWearableType layerType = LLWearable::typeNameToType(strOption);
2336 if (WT_INVALID != layerType)
2337 {
2338 idItem = gAgent.getWearableItem(layerType);
2339 }
2340 else
2341 {
2342 LLViewerJointAttachment* pAttachPt = NULL;
2343
2344 // ... or it can be empty
2345 if (strOption.empty())
2346 {
2347 // (in which case we act on the object that issued the command)
2348 LLViewerObject* pObj = gObjectList.findObject(uuid);
2349 if ( (pObj) && (pObj->isAttachment()) && (gAgent.getAvatarObject()) )
2350 pAttachPt = gAgent.getAvatarObject()->getTargetAttachmentPoint(pObj);
2351 }
2352 else
2353 {
2354 // ... or it can specify an attach point
2355 pAttachPt = getAttachPoint(strOption, true);
2356 }
2357
2358 // If we found something, get its inventory item UUID
2359 if (pAttachPt)
2360 idItem = pAttachPt->getItemID();
2361 }
2362
2363 // If we found something and it's under the shared root, then get its path
2364 if ( (!idItem.isNull()) && (gInventory.isObjectDescendentOf(idItem, pRlvRoot->getUUID())) )
2365 {
2366 LLInventoryItem* pItem = gInventory.getItem(idItem);
2367 if (pItem)
2368 {
2369 // ... unless the containing folder's name specifies an attach point (or nostrip) in which case we need its parent
2370 LLViewerInventoryCategory* pFolder = gInventory.getCategory(pItem->getParentUUID());
2371 #ifdef RLV_EXTENSION_FLAG_NOSTRIP
2372 if ( (getAttachPoint(pFolder, true)) || (pFolder->getName() == ".("RLV_FOLDER_FLAG_NOSTRIP")") )
2373 #else
2374 if (getAttachPoint(pFolder, true))
2375 #endif // RLV_EXTENSION_FLAG_NOSTRIP
2376 strReply = getSharedPath(pFolder->getParentUUID());
2377 else
2378 strReply = getSharedPath(pFolder);
2379 }
2380 }
2381 return !strReply.empty();
2382}
2383
2384struct rlv_wear_info { U32 cntWorn, cntTotal, cntChildWorn, cntChildTotal; };
2385
2386// Checked: 2009-05-30 (RLVa-0.2.0e) | Modified: RLVa-0.2.0e
2387void RlvHandler::onGetInvWorn(const std::string& strPath, std::string& strReply) const
2388{
2389 // Sanity check - getAvatarObject() can't be NULL [see rlvIsWearingItem()] and the folder should exist and not be hidden
2390 LLViewerInventoryCategory* pFolder = getSharedFolder(strPath);
2391 if ((!gAgent.getAvatarObject()) || (!pFolder) || (pFolder->getName().empty()) || (RLV_FOLDER_PREFIX_HIDDEN == pFolder->getName()[0]))
2392 return;
2393
2394 // Collect everything @attachall would be attaching
2395 LLInventoryModel::cat_array_t folders;
2396 LLInventoryModel::item_array_t items;
2397 RlvWearableItemCollector functor(pFolder->getUUID(), true, true);
2398 gInventory.collectDescendentsIf(pFolder->getUUID(), folders, items, FALSE, functor);
2399
2400 rlv_wear_info wi = {0};
2401
2402 // Add all the folders to a lookup map
2403 std::map<LLUUID, rlv_wear_info> mapFolders;
2404 mapFolders.insert(std::pair<LLUUID, rlv_wear_info>(pFolder->getUUID(), wi));
2405 for (S32 idxFolder = 0, cntFolder = folders.count(); idxFolder < cntFolder; idxFolder++)
2406 mapFolders.insert(std::pair<LLUUID, rlv_wear_info>(folders.get(idxFolder)->getUUID(), wi));
2407
2408 // Iterate over all the found items
2409 LLViewerInventoryItem* pItem; std::map<LLUUID, rlv_wear_info>::iterator itFolder;
2410 for (S32 idxItem = 0, cntItem = items.count(); idxItem < cntItem; idxItem++)
2411 {
2412 pItem = items.get(idxItem);
2413
2414 // The "folded parent" is the folder this item should be considered a direct descendent of (may or may not match actual parent)
2415 const LLUUID& idParent = functor.getFoldedParent(pItem->getParentUUID());
2416
2417 // Walk up the tree: sooner or later one of the parents will be a folder in the map
2418 LLViewerInventoryCategory* pParent = gInventory.getCategory(idParent);
2419 while ( (itFolder = mapFolders.find(pParent->getUUID())) == mapFolders.end() )
2420 pParent = gInventory.getCategory(pParent->getParentUUID());
2421
2422 U32 &cntWorn = (idParent == pParent->getUUID()) ? itFolder->second.cntWorn : itFolder->second.cntChildWorn,
2423 &cntTotal = (idParent == pParent->getUUID()) ? itFolder->second.cntTotal : itFolder->second.cntChildTotal;
2424
2425 if (rlvIsWearingItem(pItem))
2426 cntWorn++;
2427 cntTotal++;
2428 }
2429
2430 // Extract the result for the main folder
2431 itFolder = mapFolders.find(pFolder->getUUID());
2432 wi.cntWorn = itFolder->second.cntWorn;
2433 wi.cntTotal = itFolder->second.cntTotal;
2434 mapFolders.erase(itFolder);
2435
2436 // Build the result for each child folder
2437 for (itFolder = mapFolders.begin(); itFolder != mapFolders.end(); ++itFolder)
2438 {
2439 rlv_wear_info& wiFolder = itFolder->second;
2440
2441 wi.cntChildWorn += wiFolder.cntWorn + wiFolder.cntChildWorn;
2442 wi.cntChildTotal += wiFolder.cntTotal + wiFolder.cntChildTotal;
2443
2444 strReply += llformat(",%s|%d%d", gInventory.getCategory(itFolder->first)->getName().c_str(),
2445 (0 == wiFolder.cntTotal) ? 0 : (0 == wiFolder.cntWorn) ? 1 : (wiFolder.cntWorn != wiFolder.cntTotal) ? 2 : 3,
2446 (0 == wiFolder.cntChildTotal) ? 0 : (0 == wiFolder.cntChildWorn) ? 1 : (wiFolder.cntChildWorn != wiFolder.cntChildTotal) ? 2 : 3
2447 );
2448 }
2449
2450 // Now just prepend the root and done
2451 strReply = llformat("|%d%d", (0 == wi.cntTotal) ? 0 : (0 == wi.cntWorn) ? 1 : (wi.cntWorn != wi.cntTotal) ? 2 : 3,
2452 (0 == wi.cntChildTotal) ? 0 : (0 == wi.cntChildWorn) ? 1 : (wi.cntChildWorn != wi.cntChildTotal) ? 2: 3) + strReply;
2453}
2454
2455// (In case anyone cares: this isn't used in public builds)
2456bool RlvHandler::getWornInfo(const LLInventoryCategory* pFolder, U8& wiFolder, U8& wiChildren) const
2457{
2458 // Sanity check - getAvatarObject() can't be NULL [see rlvIsWearingItem()] and the folder should exist and not be hidden
2459 if ((!gAgent.getAvatarObject()) || (!pFolder) || (pFolder->getName().empty()) || (RLV_FOLDER_PREFIX_HIDDEN == pFolder->getName()[0]))
2460 return false;
2461
2462 LLInventoryModel::cat_array_t folders;
2463 LLInventoryModel::item_array_t items;
2464 RlvWearableItemCollector functor(pFolder->getUUID(), true, true);
2465 gInventory.collectDescendentsIf(pFolder->getUUID(), folders, items, FALSE, functor);
2466
2467 LLViewerInventoryItem* pItem;
2468 U32 cntWorn = 0, cntTotal = 0, cntChildWorn = 0, cntChildTotal = 0;
2469 for (S32 idxItem = 0, cntItem = items.count(); idxItem < cntItem; idxItem++)
2470 {
2471 pItem = items.get(idxItem);
2472
2473 bool fDirectDescendent = (pFolder->getUUID() == functor.getFoldedParent(pItem->getParentUUID()));
2474 U32 &refWorn = (fDirectDescendent) ? cntWorn : cntChildWorn, &refTotal = (fDirectDescendent) ? cntTotal : cntChildTotal;
2475
2476 if (rlvIsWearingItem(pItem))
2477 refWorn++;
2478 refTotal++;
2479 }
2480
2481 wiFolder = (0 == cntTotal + cntChildTotal) ? 0 : (0 == cntWorn + cntChildWorn) ? 1 :
2482 (cntWorn + cntChildWorn != cntTotal + cntChildTotal) ? 2 : 3;
2483 wiChildren = (0 == cntChildTotal) ? 0 : (0 == cntChildWorn) ? 1 : (cntChildWorn != cntChildTotal) ? 2 : 3;
2484
2485 return true;
2486}
2487
2488// ============================================================================
2489// Initialization helper functions
2490//
2491
2492BOOL RlvHandler::setEnabled(BOOL fEnable)
2493{
2494 if (m_fEnabled == fEnable)
2495 return fEnable;
2496
2497 if (fEnable)
2498 {
2499 if (gSavedSettings.controlExists(RLV_SETTING_NOSETENV))
2500 fNoSetEnv = gSavedSettings.getBOOL(RLV_SETTING_NOSETENV);
2501 if (gSavedSettings.controlExists(RLV_SETTING_ENABLELEGACYNAMING))
2502 fLegacyNaming = gSavedSettings.getBOOL(RLV_SETTING_ENABLELEGACYNAMING);
2503 if (gSavedSettings.controlExists(RLV_SETTING_SHOWNAMETAGS))
2504 RlvSettings::fShowNameTags = gSavedSettings.getBOOL(RLV_SETTING_SHOWNAMETAGS);
2505
2506 RlvCommand::initLookupTable();
2507 gRlvHandler.addObserver(new RlvExtGetSet());
2508
2509 if (LLStartUp::getStartupState() >= STATE_CLEANUP)
2510 fetchSharedInventory();
2511
2512 m_fEnabled = TRUE;
2513 }
2514 else if (canDisable())
2515 {
2516 #ifdef RLV_DEBUG
2517 RLV_INFOS << "Disabling RLV:" << LL_ENDL;
2518 #endif // RLV_DEBUG
2519
2520 gRlvHandler.clearState();
2521
2522 #ifdef RLV_DEBUG
2523 RLV_INFOS << "\t--> RLV disabled" << LL_ENDL;
2524 #endif // RLV_DEBUG
2525
2526 m_fEnabled = FALSE;
2527 }
2528
2529 #ifdef RLV_ADVANCED_MENU
2530 // RELEASE-RLVa: LL defines CLIENT_MENU_NAME but we can't get to it from here so we need to keep those two in sync manually
2531 LLMenuGL* pClientMenu = NULL;
2532 if ( (gMenuBarView) && ((pClientMenu = gMenuBarView->getChildMenuByName("Advanced", FALSE)) != NULL) )
2533 {
2534 pClientMenu->setItemVisible("RLVa", m_fEnabled);
2535 pClientMenu->setItemEnabled("RLVa", m_fEnabled);
2536 }
2537 #endif // RLV_ADVANCED_MENU
2538
2539 return m_fEnabled; // Return enabled/disabled state
2540}
2541
2542BOOL RlvHandler::canDisable()
2543{
2544 return FALSE;
2545}
2546
2547void RlvHandler::clearState()
2548{
2549 // TODO-RLVa: should restore all RLV controlled debug variables to their defaults
2550
2551 // Issue @clear on behalf of every object that has a currently active RLV restriction (even if it's just an exception)
2552 LLUUID idObj; LLViewerObject* pObj; bool fDetachable;
2553 while (m_Objects.size())
2554 {
2555 idObj = m_Objects.begin()->first; // Need a copy since after @clear the data it points to will no longer exist
2556 fDetachable = ((pObj = gObjectList.findObject(idObj)) != NULL) ? isDetachable(pObj) : true;
2557
2558 processCommand(idObj, "clear", false);
2559 if (!fDetachable)
2560 processCommand(idObj, "detachme=force", false);
2561 }
2562
2563 // Sanity check - these should all be empty after we issue @clear on the last object
2564 if ( (!m_Objects.empty()) || !(m_Exceptions.empty()) || (!m_Attachments.empty()) )
2565 {
2566 RLV_ERRS << "Object, exception or attachment map not empty after clearing state!" << LL_ENDL;
2567 m_Objects.clear();
2568 m_Exceptions.clear();
2569 m_Attachments.clear();
2570 }
2571
2572 // These all need manual clearing
2573 memset(m_LayersAdd, 0, sizeof(S16) * WT_COUNT);
2574 memset(m_LayersRem, 0, sizeof(S16) * WT_COUNT);
2575 memset(m_Behaviours, 0, sizeof(S16) * RLV_BHVR_COUNT);
2576 m_AttachPending.clear();
2577 m_Emitter.clearObservers(); // <- calls delete on all active observers
2578
2579 // Clear dynamically allocated memory
2580 if (m_pGCTimer)
2581 {
2582 delete m_pGCTimer;
2583 m_pGCTimer = NULL;
2584 }
2585 if (m_pWLSnapshot)
2586 {
2587 delete m_pWLSnapshot;
2588 m_pWLSnapshot = NULL;
2589 }
2590}
2591
2592// ============================================================================
diff --git a/linden/indra/newview/rlvhandler.h b/linden/indra/newview/rlvhandler.h
new file mode 100644
index 0000000..5295a72
--- /dev/null
+++ b/linden/indra/newview/rlvhandler.h
@@ -0,0 +1,445 @@
1#ifndef RLV_HANDLER_H
2#define RLV_HANDLER_H
3
4#include "llagentconstants.h"
5#include "llappviewer.h"
6#include "llformat.h"
7#include "llversionviewer.h"
8#include "llviewerjointattachment.h"
9#include "llviewerobject.h"
10#include "llwearable.h"
11
12#include "rlvhelper.h"
13#include "rlvevent.h"
14#include "rlvmultistringsearch.h"
15
16// ============================================================================
17
18typedef std::map<LLUUID, RlvObject> rlv_object_map_t;
19typedef std::multimap<S32, LLUUID> rlv_detach_map_t;
20typedef std::map<S32, LLUUID> rlv_reattach_map_t;
21typedef std::multimap<ERlvBehaviour, RlvException> rlv_exception_map_t;
22
23class RlvHandler
24{
25public:
26 RlvHandler();
27 ~RlvHandler();
28
29 // --------------------------------
30
31 /*
32 * Attachment point helper functions
33 */
34public:
35 // Returns a pointer to the attachment point for a supplied parameter
36 LLViewerJointAttachment* getAttachPoint(const std::string& strText, bool fExact) const;
37 LLViewerJointAttachment* getAttachPoint(const LLInventoryItem* pItem, bool fStrict) const;
38 LLViewerJointAttachment* getAttachPoint(const LLInventoryCategory* pFolder, bool fStrict) const;
39 LLViewerJointAttachment* getAttachPointLegacy(const LLInventoryCategory* pFolder) const;
40 S32 getAttachPointIndex(std::string strText, bool fExact) const;
41 S32 getAttachPointIndex(LLViewerObject* pObj) const;
42 S32 getAttachPointIndex(const LLViewerJointAttachment* pObj) const;
43 bool hasAttachPointName(const LLInventoryItem* pItem, bool fStrict) const;
44
45 // --------------------------------
46
47 /*
48 * Rule checking functions
49 */
50 // NOTE: - to check @detach=n -> hasLockedAttachment() / hasLockedHUD() / isDetachable()
51 // - to check exceptions -> isException()
52 // - to check @addoutfit=n -> isWearable()
53 // - to check @remoutfit=n -> isRemovable()
54public:
55 // Returns TRUE is at least one object contains the specified behaviour (and optional option)
56 bool hasBehaviour(ERlvBehaviour eBehaviour) const { return (eBehaviour < RLV_BHVR_COUNT) ? (0 != m_Behaviours[eBehaviour]) : false; }
57 bool hasBehaviour(ERlvBehaviour eBehaviour, const std::string& strOption) const;
58 // Returns TRUE if at least one object (except the specified one) contains the specified behaviour (and optional option)
59 bool hasBehaviourExcept(ERlvBehaviour eBehaviour, const LLUUID& idObj) const;
60 bool hasBehaviourExcept(ERlvBehaviour eBehaviour, const std::string& strOption, const LLUUID& idObj) const;
61
62 // Returns TRUE if there is at least 1 non-detachable attachment
63 bool hasLockedAttachment() const { return (0 != m_Attachments.size()); }
64 // Returns TRUE if there is at least 1 non-detachable HUD attachment
65 bool hasLockedHUD() const;
66 // Returns TRUE if the specified attachment point is detachable
67 bool isDetachable(S32 idxAttachPt) const { return (idxAttachPt) && (m_Attachments.find(idxAttachPt) == m_Attachments.end()); }
68 bool isDetachable(const LLInventoryItem* pItem) const;
69 bool isDetachable(LLViewerJointAttachment* pAttachPt) const;
70 bool isDetachable(LLViewerObject* pObj) const;
71 // Returns TRUE if the specified attachment point is set non-detachable by anything other than pObj (or one of its children)
72 bool isDetachableExcept(S32 idxAttachPt, LLViewerObject* pObj) const;
73 // Marks the specified attachment point as (non-)detachable (return value indicates success ; used by unit tests)
74 bool setDetachable(S32 idxAttachPt, const LLUUID& idRlvObj, bool fDetachable);
75 bool setDetachable(LLViewerObject* pObj, const LLUUID& idRlvObj, bool fDetachable);
76
77 // Adds or removes an exception for the specified behaviour
78 void addException(const LLUUID& idObj, ERlvBehaviour eBhvr, const RlvExceptionOption& varOption);
79 void removeException(const LLUUID& idObj, ERlvBehaviour eBhvr, const RlvExceptionOption& varOption);
80 // Returns TRUE if the specified option was added as an exception for the specified behaviour
81 bool isException(ERlvBehaviour eBhvr, const RlvExceptionOption& varOption, ERlvExceptionCheck typeCheck = RLV_CHECK_DEFAULT) const;
82 // Returns TRUE if the specified behaviour should behave "permissive" (rather than "strict"/"secure")
83 bool isPermissive(ERlvBehaviour eBhvr) const;
84
85 // Returns TRUE if the specified layer is removable (use hasBehaviour(RLV_BHVR_REMOUTFIT) for the general case)
86 bool isRemovable(EWearableType type) const { return (type < WT_COUNT) ? (0 == m_LayersRem[type]) : true; }
87 // Returns TRUE if the specified layer is not remoutfit blocked by any object (except the one specified by UUID)
88 bool isRemovableExcept(EWearableType type, const LLUUID& idObj) const;
89 // Returns TRUE if the inventory item is strippable by @detach or @remoutfit
90 bool isStrippable(const LLUUID& idItem) const;
91 // Returns TRUE if the specified layer is wearable (use hasBehaviour(RLV_BHVR_ADDOUTFIT) for the general case)
92 bool isWearable(EWearableType type) const { return (type < WT_COUNT) ? (0 == m_LayersAdd[type]) : true; }
93
94 // Returns TRUE if the composite folder doesn't contain any "locked" items
95 bool canTakeOffComposite(const LLInventoryCategory* pFolder) const;
96 // Returns TRUE if the folder is a composite folder and optionally returns the name
97 bool getCompositeInfo(const LLInventoryCategory* pFolder, std::string* pstrName) const;
98 // Returns TRUE if the inventory item belongs to a composite folder and optionally returns the name and composite folder
99 bool getCompositeInfo(const LLUUID& idItem, std::string* pstrName, LLViewerInventoryCategory** ppFolder) const;
100 // Returns TRUE if the folder is a composite folder
101 bool isCompositeFolder(const LLInventoryCategory* pFolder) const;
102 // Returns TRUE if the inventory item belongs to a composite folder
103 bool isCompositeDescendent(const LLUUID& idItem) const;
104 // Returns TRUE if the inventory item is part of a folded composite folder and should be hidden from @getoufit or @getattach
105 bool isHiddenCompositeItem(const LLUUID& idItem, const std::string& strItemType) const;
106
107 // --------------------------------
108
109 /*
110 * Helper functions
111 */
112public:
113 // Accessors
114 bool getCanCancelTp() const { return m_fCanCancelTp; } // @accepttp and @tpto
115 void setCanCancelTp(bool fAllow) { m_fCanCancelTp = fAllow; } // @accepttp and @tpto
116
117 // Command specific helper functions
118 bool canShowHoverText(LLViewerObject* pObj) const; // @showhovertext* command family
119 void filterChat(std::string& strUTF8Text, bool fFilterEmote) const; // @sendchat, @recvchat and @redirchat
120 void filterLocation(std::string& strUTF8Text) const; // @showloc
121 void filterNames(std::string& strUTF8Text) const; // @shownames
122 const std::string& getAnonym(const std::string& strName) const; // @shownames
123 std::string getVersionString() const; // @version
124 std::string getVersionNumString() const; // @versionnum
125 BOOL isAgentNearby(const LLUUID& uuid) const; // @shownames
126 bool redirectChatOrEmote(const std::string& strUTF8Test) const; // @redirchat and @rediremote
127
128 // Command processing helper functions
129 BOOL processCommand(const LLUUID& idObj, const std::string& strCommand, bool fFromObj);
130 void processRetainedCommands();
131 void retainCommand(const std::string& strObj, const LLUUID& idObj, const std::string& strCmd);
132
133 // Returns a pointer to the currently executing command (do *not* save this pointer)
134 const RlvCommand* getCurrentCommand() const { return m_pCurCommand; }
135 // Returns the UUID of the object we're currently executing a command for
136 const LLUUID& getCurrentObject() const { return m_idCurObject; }
137
138 // Initialization
139 static BOOL canDisable();
140 static BOOL isEnabled() { return m_fEnabled; }
141 static void initLookupTables();
142 static BOOL setEnabled(BOOL fEnable);
143protected:
144 void clearState();
145
146 // --------------------------------
147
148 /*
149 * Inventory related functions
150 */
151public:
152 // Starts a fetch of everything under the shared root (if there is one)
153 static void fetchSharedInventory();
154 // Returns the path of the supplied folder (relative to the shared root)
155 std::string getSharedPath(const LLViewerInventoryCategory* pFolder) const;
156 std::string getSharedPath(const LLUUID& idFolder) const;
157 // Returns a pointer to the shared root folder (if there is one)
158 static LLViewerInventoryCategory* getSharedRoot();
159 // A "folded folder" is a folder whose items logically belong to the grandparent rather than the parent
160 bool isFoldedFolder(const LLInventoryCategory* pFolder, bool fAttach) const;
161 bool isFoldedFolderLegacy(const LLInventoryCategory* pFolder, bool fAttach) const;
162protected:
163 // Find all folders that match a supplied criteria (clears the supplied array)
164 bool findSharedFolders(const std::string& strCriteria, LLInventoryModel::cat_array_t& folders) const;
165
166 // Returns a subfolder of idParent that starts with name (exact match > partial match)
167 LLViewerInventoryCategory* getSharedFolder(const LLUUID& idParent, const std::string& strName) const;
168 // Looks up a folder from a path (relative to the shared root)
169 LLViewerInventoryCategory* getSharedFolder(const std::string& strPath) const;
170
171 bool getWornInfo(const LLInventoryCategory* pFolder, U8& wiFolder, U8& wiChildren) const;
172
173 // --------------------------------
174
175 /*
176 * Event handling (forwards to registered observers if we don't handle the command)
177 */
178public:
179 BOOL addObserver(RlvObserver* pObserver) { return m_Emitter.addObserver(pObserver); }
180 BOOL removeObserver(RlvObserver* pObserver) { return m_Emitter.remObserver(pObserver); }
181 void addBehaviourObserver(RlvBehaviourObserver* pBhvrObserver);
182 void removeBehaviourObserver(RlvBehaviourObserver* pBhvrObserver);
183 void notifyBehaviourObservers(const RlvCommand& rlvCmd, bool fInternal);
184
185 // Externally invoked event handlers
186 void onAttach(LLViewerJointAttachment* pAttachPt, bool fFullyLoaded); // LLVOAvatar::attachObject()
187 void onDetach(LLViewerJointAttachment* pAttachPt); // LLVOAvatar::detachObject()
188 bool onGC(); // RlvGCTimer::tick()
189 void onSavedAssetIntoInventory(const LLUUID& idItem); // LLInventoryModel::processSaveAssetIntoInventory()
190protected:
191 BOOL processAddCommand(const LLUUID& uuid, const RlvCommand& rlvCmd);
192 BOOL processRemoveCommand(const LLUUID& uuid, const RlvCommand& rlvCmd);
193 BOOL processClearCommand(const LLUUID& idObj, const RlvCommand& rlvCmd);
194 BOOL processReplyCommand(const LLUUID& uuid, const RlvCommand& rlvCmd) const;
195 BOOL processForceCommand(const LLUUID& uuid, const RlvCommand& rlvCmd) const;
196
197 // Command handlers (exist for no other reason than to keep the length of the processXXX functions down)
198 void onForceDetach(const LLUUID& idObj, const std::string& strOption) const;
199 void onForceRemOutfit(const LLUUID& idObj, const std::string& strOption) const;
200 bool onForceSit(const LLUUID& uuid, const std::string& strOption) const;
201 void onForceWear(const std::string& strPath, bool fAttach, bool fMatchAll) const;
202 bool onGetPath(const LLUUID& uuid, const std::string& strOption, std::string& strReply) const;
203 void onGetInvWorn(const std::string& strPath, std::string &strReply) const;
204
205 // --------------------------------
206
207 /*
208 * Member variables
209 */
210public:
211 static BOOL fNoSetEnv;
212 static BOOL fLegacyNaming;
213
214 static const std::string cstrSharedRoot; // Name of the shared root folder
215 static const std::string cstrBlockedRecvIM; // Stand-in text for incoming IM when recvim restricted
216 static const std::string cstrBlockedSendIM; // Stand-in text for outgoing IM when sendim restricted
217 static const std::string cstrHidden; // General purpose "this was censored" text
218 static const std::string cstrHiddenParcel;
219 static const std::string cstrHiddenRegion;
220 static const std::string cstrMsgRecvIM; // Message sent to IM sender when sendim restricted
221 static const std::string cstrMsgTpLure; // Message sent to tplure sender when tplure restricted
222 static const std::string cstrAnonyms[28];
223protected:
224 rlv_object_map_t m_Objects; // Map of objects that have active restrictions (by UUID)
225 rlv_exception_map_t m_Exceptions; // Map of UUIDs that are exempt from the associated ERlvBehaviour
226 rlv_detach_map_t m_Attachments; // Map of locked attachments (attachment point index -> object that issued @detach=n)
227 S16 m_LayersAdd[WT_COUNT]; // Array of locked layers (reference counted)
228 S16 m_LayersRem[WT_COUNT]; // Array of locked layers (reference counted)
229 S16 m_Behaviours[RLV_BHVR_COUNT];
230
231 rlv_retained_list_t m_Retained;
232 rlv_reattach_map_t m_AttachPending;
233 rlv_reattach_map_t m_DetachPending;
234 RlvGCTimer* m_pGCTimer;
235 RlvWLSnapshot* m_pWLSnapshot;
236
237 RlvCommand* m_pCurCommand; // Convenience (see @tpto)
238 LLUUID m_idCurObject; // Convenience (see @tpto)
239
240 mutable RlvEventEmitter<RlvObserver> m_Emitter;
241 mutable std::list<RlvBehaviourObserver*> m_BhvrObservers;
242 RlvBehaviourNotifyObserver* m_pBhvrNotify;
243
244 static BOOL m_fEnabled; // Use setEnabled() to toggle this
245 static BOOL m_fFetchStarted; // TRUE if we fired off an inventory fetch
246 static BOOL m_fFetchComplete; // TRUE if everything was fetched
247 static RlvMultiStringSearch m_AttachLookup; // Lookup table for attachment names (lower case)
248
249 bool m_fCanCancelTp;
250
251 friend class RlvSharedRootFetcher; // Fetcher needs access to m_fFetchComplete
252 friend class RlvGCTimer; // Timer clear its own point at destruction
253
254 // --------------------------------
255
256 /*
257 * Internal access functions used by unit tests
258 */
259public:
260 const rlv_object_map_t* getObjectMap() const { return &m_Objects; }
261 const rlv_exception_map_t* getExceptionMap() const { return &m_Exceptions; }
262 const rlv_detach_map_t* getDetachMap() const { return &m_Attachments; }
263 #ifdef RLV_DEBUG_TESTS
264 const S16* getAddLayers() const { return m_LayersAdd; }
265 const S16* getRemLayers() const { return m_LayersRem; }
266 const S16* getBehaviours() const { return m_Behaviours; }
267 const rlv_retained_list_t* getRetainedList() const { return &m_Retained; }
268 #endif // RLV_DEBUG_TESTS
269};
270
271typedef RlvHandler rlv_handler_t;
272extern rlv_handler_t gRlvHandler;
273
274// ============================================================================
275// Inlined member functions
276//
277
278// Checked: 2009-10-04 (RLVa-1.0.4a) | Modified: RLVa-1.0.4a
279inline void RlvHandler::addException(const LLUUID& idObj, ERlvBehaviour eBhvr, const RlvExceptionOption& varOption)
280{
281 m_Exceptions.insert(std::pair<ERlvBehaviour, RlvException>(eBhvr, RlvException(idObj, eBhvr, varOption)));
282}
283
284// Checked: 2009-07-09 (RLVa-1.0.0f) | Modified: RLVa-1.0.0f
285inline bool RlvHandler::canShowHoverText(LLViewerObject *pObj) const
286{
287 return ( (!pObj) || (LL_PCODE_VOLUME != pObj->getPCode()) ||
288 !( (hasBehaviour(RLV_BHVR_SHOWHOVERTEXTALL)) ||
289 ( (hasBehaviour(RLV_BHVR_SHOWHOVERTEXTWORLD)) && (!pObj->isHUDAttachment()) ) ||
290 ( (hasBehaviour(RLV_BHVR_SHOWHOVERTEXTHUD)) && (pObj->isHUDAttachment()) ) ||
291 (isException(RLV_BHVR_SHOWHOVERTEXT, pObj->getID(), RLV_CHECK_PERMISSIVE)) ) );
292}
293
294// Checked: 2009-05-23 (RLVa-0.2.0d) | Modified: RLVa-0.2.0d
295inline S32 RlvHandler::getAttachPointIndex(std::string strText, bool fExact) const
296{
297 U16 nParam; RlvMultiStringSearchMatch match;
298 LLStringUtil::toLower(strText);
299 return (fExact) ? ((m_AttachLookup.getExactMatchParam(strText, nParam)) ? nParam : 0)
300 : ((m_AttachLookup.findLast(strText, match)) ? match.nParam : 0);
301}
302
303// Checked: 2009-05-23 (RLVa-0.2.0d) | Modified: RLVa-0.2.0d
304inline S32 RlvHandler::getAttachPointIndex(LLViewerObject* pObj) const
305{
306 return (pObj) ? ATTACHMENT_ID_FROM_STATE(pObj->getState()) : 0;
307}
308
309// Checked: 2009-06-02 (RLVa-0.2.0g)
310inline std::string RlvHandler::getSharedPath(const LLUUID& idFolder) const
311{
312 return getSharedPath(gInventory.getCategory(idFolder)); // getSharedPath() has a NULL pointer check so this is safe
313}
314
315// Checked: 2009-06-07 (RLVa-0.2.1c)
316inline std::string RlvHandler::getVersionString() const
317{
318 return llformat("RestrainedLife viewer v%d.%d.%d (%s %d.%d.%d.%d - RLVa %d.%d.%d)",
319 RLV_VERSION_MAJOR, RLV_VERSION_MINOR, RLV_VERSION_PATCH,
320 LLAppViewer::instance()->getSecondLifeTitle().c_str(), LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VERSION_BUILD,
321 RLVa_VERSION_MAJOR, RLVa_VERSION_MINOR, RLVa_VERSION_PATCH);
322}
323
324// Checked: 2009-10-04 (RLVa-1.0.4b) | Added: RLVa-1.0.4b
325inline std::string RlvHandler::getVersionNumString() const
326{
327 return llformat("%d%02d%02d%02d", RLV_VERSION_MAJOR, RLV_VERSION_MINOR, RLV_VERSION_PATCH, RLV_VERSION_BUILD);
328}
329
330// Checked: 2009-05-23 (RLVa-0.2.0d) | Modified: RLVa-0.2.0d
331inline bool RlvHandler::hasAttachPointName(const LLInventoryItem *pItem, bool fStrict) const
332{
333 return (getAttachPoint(pItem, fStrict) != NULL); // getAttachPoint() has a NULL pointer check so this is safe
334}
335
336// Checked:
337inline bool RlvHandler::hasBehaviour(ERlvBehaviour eBehaviour, const std::string& strOption) const
338{
339 return hasBehaviourExcept(eBehaviour, strOption, LLUUID::null);
340}
341
342// Checked:
343inline bool RlvHandler::hasBehaviourExcept(ERlvBehaviour eBehaviour, const LLUUID& idObj) const
344{
345 return hasBehaviourExcept(eBehaviour, std::string(), idObj);
346}
347
348#ifdef RLV_EXPERIMENTAL_COMPOSITES
349 // Checked:
350 inline bool RlvHandler::isCompositeFolder(const LLInventoryCategory* pFolder) const
351 {
352 return getCompositeInfo(pFolder, NULL);
353 }
354
355 // Checked:
356 inline bool RlvHandler::isCompositeDescendent(const LLUUID& idItem) const
357 {
358 return getCompositeInfo(idItem, NULL, NULL);
359 }
360#endif // RLV_EXPERIMENTAL_COMPOSITES
361
362// Checked: 2009-09-08 (RLVa-1.0.2c) | Added: RLVa-1.0.2c
363inline bool RlvHandler::isDetachable(LLViewerJointAttachment *pAttachPt) const
364{
365 // If there's an attached object it's faster to just use that; otherwise look up the attachment index because it might be locked empty
366 return (pAttachPt == NULL) ||
367 ( (pAttachPt->getObject() != NULL) && isDetachable(pAttachPt->getObject()) ) || (isDetachable(getAttachPointIndex(pAttachPt)));
368}
369
370// Checked: 2009-05-23 (RLVa-0.2.0d) | Modified: RLVa-0.2.0d
371inline bool RlvHandler::isDetachable(LLViewerObject* pObj) const
372{
373 return (pObj == NULL) || (!pObj->isAttachment()) || (isDetachable(getAttachPointIndex(pObj)));
374}
375
376inline bool RlvHandler::isPermissive(ERlvBehaviour eBhvr) const
377{
378 return (RlvCommand::hasStrictVariant(eBhvr))
379 ? !((hasBehaviour(RLV_BHVR_PERMISSIVE)) || (isException(RLV_BHVR_PERMISSIVE, eBhvr, RLV_CHECK_PERMISSIVE)))
380 : true;
381}
382
383// Checked: 2009-07-29 (RLVa-1.0.1b) | Added: RLVa-1.0.1b
384inline bool RlvHandler::isFoldedFolder(const LLInventoryCategory* pFolder, bool fAttach) const
385{
386 return
387 (
388 // .(<attachpt>) type folder (on detach we don't care about its children, but on attach there can only be 1 attachment)
389 ( (gRlvHandler.getAttachPoint(pFolder, true)) &&
390 ( (!fAttach) || (1 == rlvGetDirectDescendentsCount(pFolder, LLAssetType::AT_OBJECT))) )
391 #ifdef RLV_EXTENSION_FLAG_NOSTRIP
392 // .(nostrip) folder
393 || ( (pFolder) && (".("RLV_FOLDER_FLAG_NOSTRIP")" == pFolder->getName()) )
394 #endif // RLV_EXTENSION_FLAG_NOSTRIP
395 );
396}
397
398// Checked: 2009-05-23 (RLVa-0.2.0d) | Added: RLVa-0.2.0d
399inline bool RlvHandler::isRemovableExcept(EWearableType type, const LLUUID& idObj) const
400{
401 // NOTE: mind the bitwise OR rather than the logical OR!!
402 return (isRemovable(type)) || !( (hasBehaviourExcept(RLV_BHVR_REMOUTFIT, idObj)) |
403 (hasBehaviourExcept(RLV_BHVR_REMOUTFIT, LLWearable::typeToTypeName(type), idObj)) );
404}
405
406#ifndef RLV_EXTENSION_FLAG_NOSTRIP
407 // Checked: 2009-05-23 (RLVa-0.2.0d) | Added: RLVa-0.2.0d
408 bool RlvHandler::isStrippable(const LLUUID& idItem) const
409 {
410 return true;
411 }
412#endif // RLV_EXTENSION_FLAG_NOSTRIP
413
414// Checked: 2009-10-04 (RLVa-1.0.4a) | Modified: RLVa-1.0.4a
415inline void RlvHandler::removeException(const LLUUID& idObj, ERlvBehaviour eBhvr, const RlvExceptionOption& varOption)
416{
417 for (rlv_exception_map_t::iterator itException = m_Exceptions.lower_bound(eBhvr),
418 endException = m_Exceptions.upper_bound(eBhvr); itException != endException; ++itException)
419 {
420 if ( (itException->second.idObject == idObj) && (itException->second.varOption == varOption) )
421 {
422 m_Exceptions.erase(itException);
423 break;
424 }
425 }
426}
427
428// Checked: 2009-08-05 (RLVa-1.0.1e) | Modified: RLVa-1.0.1e
429inline void RlvHandler::retainCommand(const std::string& strObj, const LLUUID& idObj, const std::string& strCmd)
430{
431 #ifdef RLV_DEBUG
432 RLV_INFOS << "[" << idObj << "]: " << strCmd << " (retaining)" << LL_ENDL;
433 #endif // RLV_DEBUG
434 m_Retained.push_back(RlvRetainedCommand(strObj, idObj, strCmd));
435}
436
437// Checked: 2009-05-23 (RLVa-0.2.0d) | Modified: RLVa-0.2.0d
438inline bool RlvHandler::setDetachable(LLViewerObject* pObj, const LLUUID& idRlvObj, bool fDetachable)
439{
440 return setDetachable(getAttachPointIndex(pObj), idRlvObj, fDetachable); // getAttachPointIndex() has a NULL pointer check
441}
442
443// ============================================================================
444
445#endif // RLV_HANDLER_H
diff --git a/linden/indra/newview/rlvhelper.cpp b/linden/indra/newview/rlvhelper.cpp
new file mode 100644
index 0000000..c8d430d
--- /dev/null
+++ b/linden/indra/newview/rlvhelper.cpp
@@ -0,0 +1,668 @@
1#include "llviewerprecompiledheaders.h"
2#include "llagent.h"
3#include "llfloaterwindlight.h"
4#include "llviewerobject.h"
5#include "llviewerstats.h"
6#include "llviewerwindow.h"
7#include "llvoavatar.h"
8#include "llwlparammanager.h"
9
10#include "rlvhelper.h"
11#include "rlvevent.h"
12#include "rlvhandler.h"
13
14// ============================================================================
15// Static variable initialization
16//
17
18RlvCommand::RlvBhvrTable RlvCommand::m_BhvrMap;
19
20// ============================================================================
21// RlvCommmand
22//
23
24// Checked: 2009-09-10 (RLVa-1.0.3a) | Modified: RLVa-1.0.3a
25RlvCommand::RlvCommand(const std::string& strCommand)
26 : m_eBehaviour(RLV_BHVR_UNKNOWN), m_fStrict(false), m_eParamType(RLV_TYPE_UNKNOWN)
27{
28 if ((m_fValid = parseCommand(strCommand, m_strBehaviour, m_strOption, m_strParam)))
29 {
30 S32 nTemp = 0;
31 if ( ("n" == m_strParam) || ("add" == m_strParam) )
32 m_eParamType = RLV_TYPE_ADD;
33 else if ( ("y" == m_strParam) || ("rem" == m_strParam) )
34 m_eParamType = RLV_TYPE_REMOVE;
35 else if ("force" == m_strParam)
36 m_eParamType = RLV_TYPE_FORCE;
37 else if (LLStringUtil::convertToS32(m_strParam, nTemp)) // Assume it's a reply command if we can convert <param> to an S32
38 m_eParamType = RLV_TYPE_REPLY;
39 else if (m_strBehaviour == "clear") // clear is the odd one out so just make it its own type
40 m_eParamType = RLV_TYPE_CLEAR;
41 else
42 {
43 m_eParamType = RLV_TYPE_UNKNOWN;
44 m_fValid = false;
45 }
46 }
47
48 if (!m_fValid)
49 {
50 m_strBehaviour = m_strOption = m_strParam = "";
51 return;
52 }
53
54 // Check if this is the "strict" (aka "secure") variation of a behaviour
55 std::string::size_type idxStrict = m_strBehaviour.find("_sec");
56 m_fStrict = (std::string::npos != idxStrict) && (idxStrict + 4 == m_strBehaviour.length());
57
58 RlvBhvrTable::const_iterator itBhvr = m_BhvrMap.find( (!m_fStrict) ? m_strBehaviour : m_strBehaviour.substr(0, idxStrict));
59 if ( (itBhvr != m_BhvrMap.end()) && ((!m_fStrict) || (hasStrictVariant(itBhvr->second))) )
60 m_eBehaviour = itBhvr->second;
61}
62
63
64bool RlvCommand::parseCommand(const std::string& strCommand, std::string& strBehaviour, std::string& strOption, std::string& strParam)
65{
66 // (See behaviour notes for the command parsing truth table)
67
68 // Format: <behaviour>[:<option>]=<param>
69 int idxParam = strCommand.find('=');
70 int idxOption = (idxParam > 0) ? strCommand.find(':') : -1;
71 if (idxOption > idxParam - 1)
72 idxOption = -1;
73
74 // If <behaviour> is missing it's always an improperly formatted command
75 if ( (0 == idxOption) || (0 == idxParam) )
76 return false;
77
78 strBehaviour = strCommand.substr(0, (-1 != idxOption) ? idxOption : idxParam);
79 strOption = strParam = "";
80
81 // If <param> is missing it's an improperly formatted command
82 if ( (-1 == idxParam) || ((int)strCommand.length() - 1 == idxParam) )
83 {
84 // Unless "<behaviour> == "clear" AND (idxOption == 0)"
85 // OR <behaviour> == "clear" AND (idxParam != 0) [see table above]
86 if ( ("clear" == strBehaviour) && ( (!idxOption) || (idxParam) ) )
87 return true;
88 return false;
89 }
90
91 if ( (-1 != idxOption) && (idxOption + 1 != idxParam) )
92 strOption = strCommand.substr(idxOption + 1, idxParam - idxOption - 1);
93 strParam = strCommand.substr(idxParam + 1);
94
95 return true;
96}
97
98void RlvCommand::initLookupTable()
99{
100 static bool fInitialized = false;
101 if (!fInitialized)
102 {
103 // NOTE: keep this matched with the enumeration at all times
104 std::string arBehaviours[RLV_BHVR_COUNT] =
105 {
106 "version", "detach", "sendchat", "emote", "chatshout", "chatnormal", "chatwhisper", "redirchat", "rediremote",
107 "sendim", "recvchat", "recvemote", "recvim", "tplm", "tploc", "tplure", "sittp", "edit", "rez", "addoutfit",
108 "remoutfit", "getoutfit", "getattach", "showinv", "viewnote", "unsit", "sit", "sendchannel", "getstatus", "getstatusall",
109 "getinv", "getinvworn", "findfolder", "findfolders", "attach", "attachall", "detachall", "getpath", "attachthis",
110 "attachallthis", "detachthis", "detachallthis", "fartouch", "showworldmap", "showminimap", "showloc", "tpto", "accepttp",
111 "acceptpermission", "shownames", "fly", "getsitid", "setdebug", "setenv", "detachme", "showhovertextall",
112 "showhovertextworld", "showhovertexthud", "showhovertext", "notify", "defaultwear", "versionnum", "permissive"
113 };
114
115 for (int idxBvhr = 0; idxBvhr < RLV_BHVR_COUNT; idxBvhr++)
116 m_BhvrMap.insert(std::pair<std::string, ERlvBehaviour>(arBehaviours[idxBvhr], (ERlvBehaviour)idxBvhr));
117
118 fInitialized = true;
119 }
120}
121
122// =========================================================================
123// RlvObject
124//
125
126RlvObject::RlvObject(const LLUUID& idObj) : m_UUID(idObj), m_nLookupMisses(0)
127{
128 LLViewerObject* pObj = gObjectList.findObject(idObj);
129 m_fLookup = (NULL != pObj);
130 m_idxAttachPt = (pObj) ? ATTACHMENT_ID_FROM_STATE(pObj->getState()) : 0;
131}
132
133bool RlvObject::addCommand(const RlvCommand& rlvCmd)
134{
135 // Sanity checking
136 if (RLV_TYPE_ADD != rlvCmd.getParamType())
137 return false;
138
139 // Don't add duplicate commands for this object (ie @detach=n followed by another @detach=n later on)
140 for (rlv_command_list_t::iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd)
141 {
142 if ( (itCmd->getBehaviour() == rlvCmd.getBehaviour()) && (itCmd->getOption() == rlvCmd.getOption()) &&
143 (itCmd->isStrict() == rlvCmd.isStrict() ) )
144 {
145 return false;
146 }
147 }
148
149 // Now that we know it's not a duplicate, add it to the end of the list
150 m_Commands.push_back(rlvCmd);
151
152 return true;
153}
154
155bool RlvObject::removeCommand(const RlvCommand& rlvCmd)
156{
157 // Sanity checking
158 if (RLV_TYPE_REMOVE != rlvCmd.getParamType())
159 return false;
160
161 for (rlv_command_list_t::iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd)
162 {
163 //if (*itCmd == rlvCmd) <- commands will never be equal since one is an add and the other is a remove *rolls eyes*
164 if ( (itCmd->getBehaviour() == rlvCmd.getBehaviour()) && (itCmd->getOption() == rlvCmd.getOption()) &&
165 (itCmd->isStrict() == rlvCmd.isStrict() ) )
166 {
167 m_Commands.erase(itCmd);
168 return true;
169 }
170 }
171 return false; // Command was never added so nothing to remove now
172}
173
174bool RlvObject::hasBehaviour(ERlvBehaviour eBehaviour, bool fStrictOnly) const
175{
176 for (rlv_command_list_t::const_iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd)
177 if ( (itCmd->getBehaviourType() == eBehaviour) && (itCmd->getOption().empty()) && ((!fStrictOnly) || (itCmd->isStrict())) )
178 return true;
179 return false;
180}
181
182bool RlvObject::hasBehaviour(ERlvBehaviour eBehaviour, const std::string& strOption, bool fStrictOnly) const
183{
184 for (rlv_command_list_t::const_iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd)
185 if ( (itCmd->getBehaviourType() == eBehaviour) && (itCmd->getOption() == strOption) && ((!fStrictOnly) || (itCmd->isStrict())) )
186 return true;
187 return false;
188}
189
190// Checked: 2009-06-07 (RLVa-0.2.1c)
191std::string RlvObject::getStatusString(const std::string& strMatch) const
192{
193 std::string strStatus, strCmd;
194
195 for (rlv_command_list_t::const_iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd)
196 {
197 strCmd = itCmd->asString();
198 if ( (strMatch.empty()) || (std::string::npos != strCmd.find(strMatch)) )
199 {
200 if (!strStatus.empty())
201 strStatus.push_back('/');
202 strStatus += strCmd;
203 }
204 }
205
206 return strStatus;
207}
208
209// ============================================================================
210// RlvWearableItemCollector
211//
212
213// Checked: 2009-05-30 (RLVa-0.2.0e) | Added: RLVa-0.2.0e
214const LLUUID& RlvWearableItemCollector::getFoldedParent(const LLUUID& idFolder) const
215{
216 std::map<LLUUID, LLUUID>::const_iterator itFolder = m_Folding.end(), itCur = m_Folding.find(idFolder);
217 while (itCur != m_Folding.end())
218 {
219 itFolder = itCur;
220 itCur = m_Folding.find(itFolder->second);
221 }
222 return (m_Folding.end() == itFolder) ? idFolder : itFolder->second;
223}
224
225// Checked: 2009-07-29 (RLVa-1.0.1b) | Modified: RLVa-1.0.1b
226bool RlvWearableItemCollector::onCollectFolder(const LLInventoryCategory* pFolder)
227{
228 const LLUUID& idParent = pFolder->getParentUUID();
229 if (m_Wearable.end() == std::find(m_Wearable.begin(), m_Wearable.end(), idParent))
230 return false; // Not the child of a wearable folder == skip
231
232 const std::string& strFolder = pFolder->getName();
233 if (strFolder.empty()) // Shouldn't happen but does... naughty Lindens
234 return false;
235
236 #ifdef RLV_EXTENSION_FLAG_NOSTRIP
237 if ( (!m_fAttach) && (-1 != strFolder.find(RLV_FOLDER_FLAG_NOSTRIP)) ) // Don't process "nostrip" folders on detach
238 return false;
239 #endif // RLV_EXTENSION_FLAG_NOSTRIP
240
241 if (gRlvHandler.isFoldedFolder(pFolder, m_fAttach)) // Check for folder that should get folded under its parent
242 {
243 m_Tentative.push_front(pFolder->getUUID());
244 m_Folding.insert(std::pair<LLUUID, LLUUID>(pFolder->getUUID(), idParent));
245 }
246 else if ( (RLV_FOLDER_PREFIX_HIDDEN != strFolder[0]) && (m_fMatchAll) ) // Collect from any non-hidden child folder for *all
247 {
248 m_Wearable.push_front(pFolder->getUUID());
249 return (idParent == m_idFolder); // (Convenience for @getinvworn)
250 }
251 #ifdef RLV_EXPERIMENTAL_COMPOSITES
252 else if ( (RLV_FOLDER_PREFIX_HIDDEN == strFolder[0]) && // Hidden folder that's a...
253 (gRlvHandler.isCompositeFolder(pFolder)) && // ... composite folder which we...
254 ((m_fAttach) || (gRlvHandler.canTakeOffComposite(pFolder))) ) // ... attach or can detach (see composite locking)
255 {
256 m_Wearable.push_front(pFolder->getUUID());
257 m_Folding.insert(std::pair<LLUUID, LLUUID>(pFolder->getUUID(), idParent));
258 }
259 #endif // RLV_EXPERIMENTAL_COMPOSITES
260
261 return false;
262}
263
264// Checked: 2009-05-26 (RLVa-0.2.0d) | Modified: RLVa-0.2.0d
265bool RlvWearableItemCollector::onCollectItem(const LLInventoryItem* pItem)
266{
267 #ifdef RLV_EXTENSION_FLAG_NOSTRIP
268 if ( (!m_fAttach) && (-1 != pItem->getName().find(RLV_FOLDER_FLAG_NOSTRIP)) ) // Don't process "nostrip" items on detach
269 return false;
270 #endif // RLV_EXTENSION_FLAG_NOSTRIP
271
272 const LLUUID& idParent = pItem->getParentUUID(); bool fRet = false;
273 switch (pItem->getType())
274 {
275 case LLAssetType::AT_BODYPART:
276 if (!m_fAttach)
277 break; // Don't process body parts on detach
278 case LLAssetType::AT_CLOTHING:
279 #ifdef RLV_EXTENSION_FLAG_NOSTRIP
280 fRet = ( (m_Wearable.end() != std::find(m_Wearable.begin(), m_Wearable.end(), idParent)) ||
281 ( (m_fAttach) && (m_Tentative.end() != std::find(m_Tentative.begin(), m_Tentative.end(), idParent)) &&
282 (gInventory.getCategory(pItem->getParentUUID())->getName() == ".("RLV_FOLDER_FLAG_NOSTRIP")") ) );
283 #else
284 fRet = (m_Wearable.end() != std::find(m_Wearable.begin(), m_Wearable.end(), idParent));
285 #endif // RLV_EXTENSION_FLAG_NOSTRIP
286 break;
287 case LLAssetType::AT_OBJECT:
288 fRet = ( (m_Wearable.end() != std::find(m_Wearable.begin(), m_Wearable.end(), idParent)) ||
289 (m_Tentative.end() != std::find(m_Tentative.begin(), m_Tentative.end(), idParent)) ) &&
290 ( (!m_fAttach) || (gRlvHandler.hasAttachPointName(pItem, true)) ); // Only care about attach point on attach*
291 break;
292 #ifdef RLV_EXPERIMENTAL_FORCEWEAR_GESTURES
293 case LLAssetType::AT_GESTURE:
294 fRet = (m_Wearable.end() != std::find(m_Wearable.begin(), m_Wearable.end(), idParent));
295 break;
296 #endif // RLV_EXPERIMENTAL_FORCEWEAR_GESTURES
297 default:
298 break;
299 }
300 return fRet;
301}
302
303// Checked: 2009-05-26 (RLVa-0.2.0d) | Modified: RLVa-0.2.0d
304bool RlvWearableItemCollector::operator()(LLInventoryCategory* pFolder, LLInventoryItem* pItem)
305{
306 // NOTE: this is used for more than was originally intended so only modify if you're sure it won't break something obscure
307 return (pFolder) ? onCollectFolder(pFolder) : ( (pItem) ? onCollectItem(pItem) : false );
308}
309
310// ============================================================================
311// RlvWLSnapshot
312//
313
314// Checked: 2009-06-03 (RLVa-0.2.0h) | Added: RLVa-0.2.0h
315void RlvWLSnapshot::restoreSnapshot(const RlvWLSnapshot* pWLSnapshot)
316{
317 LLWLParamManager* pWLParams = LLWLParamManager::instance();
318 if ( (pWLSnapshot) && (pWLParams) )
319 {
320 pWLParams->mAnimator.mIsRunning = pWLSnapshot->fIsRunning;
321 pWLParams->mAnimator.mUseLindenTime = pWLSnapshot->fUseLindenTime;
322 pWLParams->mCurParams = pWLSnapshot->WLParams;
323 pWLParams->propagateParameters();
324 }
325}
326
327// Checked: 2009-09-16 (RLVa-1.0.3c) | Modified: RLVa-1.0.3c
328RlvWLSnapshot* RlvWLSnapshot::takeSnapshot()
329{
330 // HACK: see RlvExtGetSet::onGetEnv
331 if (!LLFloaterWindLight::isOpen())
332 {
333 LLFloaterWindLight::instance()->close();
334 LLFloaterWindLight::instance()->syncMenu();
335 }
336
337 RlvWLSnapshot* pWLSnapshot = NULL;
338 LLWLParamManager* pWLParams = LLWLParamManager::instance();
339 if (pWLParams)
340 {
341 pWLSnapshot = new RlvWLSnapshot();
342 pWLSnapshot->fIsRunning = pWLParams->mAnimator.mIsRunning;
343 pWLSnapshot->fUseLindenTime = pWLParams->mAnimator.mUseLindenTime;
344 pWLSnapshot->WLParams = pWLParams->mCurParams;
345 }
346 return pWLSnapshot;
347}
348
349// =========================================================================
350// RlvSettings
351//
352
353BOOL RlvSettings::fShowNameTags = FALSE;
354
355BOOL RlvSettings::getEnableWear()
356{
357 return rlvGetSettingBOOL(RLV_SETTING_ENABLEWEAR, TRUE) && (!gRlvHandler.hasBehaviour(RLV_BHVR_DEFAULTWEAR));
358}
359
360#ifdef RLV_EXTENSION_STARTLOCATION
361 // Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-0.2.1d
362 void RlvSettings::updateLoginLastLocation()
363 {
364 if (gSavedPerAccountSettings.controlExists(RLV_SETTING_LOGINLASTLOCATION))
365 {
366 BOOL fValue = (gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC)) ||
367 ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) &&
368 (gAgent.getAvatarObject()) && (!gAgent.getAvatarObject()->mIsSitting) );
369 if (gSavedPerAccountSettings.getBOOL(RLV_SETTING_LOGINLASTLOCATION) != fValue)
370 {
371 gSavedPerAccountSettings.setBOOL(RLV_SETTING_LOGINLASTLOCATION, fValue);
372 gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE);
373 }
374 }
375 }
376#endif // RLV_EXTENSION_STARTLOCATION
377
378// =========================================================================
379// Various helper classes/timers/functors
380//
381
382BOOL RlvGCTimer::tick()
383{
384 bool fContinue = gRlvHandler.onGC();
385 if (!fContinue)
386 gRlvHandler.m_pGCTimer = NULL;
387 return !fContinue;
388}
389
390void RlvCurrentlyWorn::fetchWorn()
391{
392 LLInventoryFetchObserver::item_ref_t idItems;
393
394 // Fetch all currently worn clothing layers and body parts
395 for (int type = 0; type < (int)WT_COUNT; type++)
396 {
397 const LLUUID& idItem = gAgent.getWearableItem((EWearableType)type);
398 if (idItem.notNull())
399 idItems.push_back(idItem);
400 }
401
402 // Fetch all currently worn attachments
403 LLVOAvatar* pAvatar = gAgent.getAvatarObject();
404 if (pAvatar)
405 {
406 for (LLVOAvatar::attachment_map_t::const_iterator itAttach = pAvatar->mAttachmentPoints.begin();
407 itAttach != pAvatar->mAttachmentPoints.end(); ++itAttach)
408 {
409 const LLUUID& idItem = itAttach->second->getItemID();
410 if (idItem.notNull())
411 idItems.push_back(idItem);
412 }
413 }
414
415 RlvCurrentlyWorn f;
416 f.fetchItems(idItems);
417}
418
419// Checked: 2009-07-06 (RLVa-1.0.0c) | Modified: RLVa-0.2.0f
420bool RlvSelectHasLockedAttach::apply(LLSelectNode* pNode)
421{
422 return (pNode->getObject()) ? !gRlvHandler.isDetachable(pNode->getObject()) : false;
423}
424
425// Checked: 2009-07-05 (RLVa-1.0.0b) | Modified: RLVa-0.2.0f
426bool RlvSelectIsOwnedByOrGroupOwned::apply(LLSelectNode* pNode)
427{
428 return (pNode->mPermissions->isGroupOwned()) || (pNode->mPermissions->getOwner() == m_idAgent);
429}
430
431// Checked: 2009-05-31 (RLVa-0.2.0f) | Modified: RLVa-0.2.0f
432bool RlvSelectIsSittingOn::apply(LLSelectNode* pNode)
433{
434 return (pNode->getObject()) && (pNode->getObject()->getRootEdit() == m_pObject);
435}
436
437// ============================================================================
438// Various helper functions
439//
440
441// Checked: 2009-09-08 (RLVa-1.0.2c) | Modified: RLVa-1.0.2c
442BOOL rlvAttachToEnabler(void* pParam)
443{
444 // Enables/disables an option on the "Attach to (HUD)" submenu depending on whether it is (un)detachable
445 return gRlvHandler.isDetachable((LLViewerJointAttachment*)pParam);
446}
447
448// Checked: 2009-07-05 (RLVa-1.0.0b) | Modified: RLVa-0.2.0g
449bool rlvCanDeleteOrReturn()
450{
451 bool fIsAllowed = true;
452
453 if (gRlvHandler.hasBehaviour(RLV_BHVR_REZ))
454 {
455 // We'll allow if none of the prims are owned by the avie or group owned
456 LLObjectSelectionHandle handleSel = LLSelectMgr::getInstance()->getSelection();
457 RlvSelectIsOwnedByOrGroupOwned func(gAgent.getID());
458 if ( (handleSel.notNull()) && ((0 == handleSel->getRootObjectCount()) || (NULL != handleSel->getFirstRootNode(&func, FALSE))) )
459 fIsAllowed = false;
460 }
461
462 if ( (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (gAgent.getAvatarObject()) )
463 {
464 // We'll allow if the avie isn't sitting on any of the selected objects
465 LLObjectSelectionHandle handleSel = LLSelectMgr::getInstance()->getSelection();
466 RlvSelectIsSittingOn func(gAgent.getAvatarObject()->getRoot());
467 if ( (handleSel.notNull()) && (handleSel->getFirstRootNode(&func, TRUE)) )
468 fIsAllowed = false;
469 }
470
471 return fIsAllowed;
472}
473
474// Checked: 2009-10-04 (RLVa-1.0.4b) | Modified: RLVa-1.0.4b
475BOOL rlvEnableWearEnabler(void* pParam)
476{
477 // Visually disables the "Enable Wear" option when restricted from toggling it
478 return (!gRlvHandler.hasBehaviour(RLV_BHVR_DEFAULTWEAR));
479}
480
481// Checked: 2009-05-26 (RLVa-0.2.0d) | Modified: RLVa-0.2.0d
482S32 rlvGetDirectDescendentsCount(const LLInventoryCategory* pFolder, LLAssetType::EType type)
483{
484 S32 cntType = 0;
485 if (pFolder)
486 {
487 LLInventoryModel::cat_array_t* pFolders;
488 LLInventoryModel::item_array_t* pItems;
489 gInventory.getDirectDescendentsOf(pFolder->getUUID(), pFolders, pItems);
490
491 if (pItems)
492 {
493 for (S32 idxItem = 0, cntItem = pItems->count(); idxItem < cntItem; idxItem++)
494 if (pItems->get(idxItem)->getType() == type)
495 cntType++;
496 }
497 }
498 return cntType;
499}
500
501#ifdef RLV_ADVANCED_TOGGLE_RLVA
502 // Checked: 2009-07-12 (RLVa-1.0.0h) | Modified: RLVa-1.0.0h
503 void rlvToggleEnabled(void*)
504 {
505 gSavedSettings.setBOOL(RLV_SETTING_MAIN, !rlv_handler_t::isEnabled());
506
507 #if RLV_TARGET < RLV_MAKE_TARGET(1, 23, 0) // Version: 1.22.11
508 LLStringUtil::format_map_t args;
509 args["[MESSAGE]"] = llformat("Restrained Life Support will be %s after you restart",
510 (rlv_handler_t::isEnabled()) ? "disabled" : "enabled" );
511 gViewerWindow->alertXml("GenericAlert", args);
512 #else // Version: 1.23.4
513 LLSD args;
514 args["MESSAGE"] = llformat("Restrained Life Support will be %s after you restart",
515 (rlv_handler_t::isEnabled()) ? "disabled" : "enabled" );
516 LLNotifications::instance().add("GenericAlert", args);
517 #endif
518 }
519 // Checked: 2009-07-08 (RLVa-1.0.0e)
520 BOOL rlvGetEnabled(void*)
521 {
522 return rlv_handler_t::isEnabled();
523 }
524#endif // RLV_ADVANCED_TOGGLE_RLVA
525
526// =========================================================================
527// Message sending functions
528//
529
530// Checked: 2009-08-11 (RLVa-1.0.1h) | Added: RLVa-1.0.1h
531void rlvForceDetach(LLViewerJointAttachment* pAttachPt)
532{
533 // Copy/paste from handle_detach_from_avatar()
534 LLViewerObject* attached_object = pAttachPt->getObject();
535 if (attached_object)
536 {
537 gMessageSystem->newMessage("ObjectDetach");
538 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
539 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
540 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
541
542 gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
543 gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, attached_object->getLocalID());
544 gMessageSystem->sendReliable( gAgent.getRegionHost() );
545 }
546}
547
548void rlvSendBusyMessage(const LLUUID& idTo, const std::string& strMsg, const LLUUID& idSession)
549{
550 // (See process_improved_im)
551 std::string strFullName;
552 gAgent.buildFullname(strFullName);
553
554 pack_instant_message(gMessageSystem, gAgent.getID(), FALSE, gAgent.getSessionID(), idTo, strFullName,
555 strMsg, IM_ONLINE, IM_BUSY_AUTO_RESPONSE, idSession);
556 gAgent.sendReliableMessage();
557}
558
559// Checked: 2009-08-05 (RLVa-1.0.1e) | Modified: RLVa-1.0.1e
560bool rlvSendChatReply(S32 nChannel, const std::string& strReply)
561{
562 if (!rlvIsValidReplyChannel(nChannel))
563 return false;
564
565 // Copy/paste from send_chat_from_viewer()
566 LLMessageSystem* msg = gMessageSystem;
567 msg->newMessageFast(_PREHASH_ChatFromViewer);
568 msg->nextBlockFast(_PREHASH_AgentData);
569 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
570 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
571 msg->nextBlockFast(_PREHASH_ChatData);
572 msg->addStringFast(_PREHASH_Message, strReply);
573 msg->addU8Fast(_PREHASH_Type, CHAT_TYPE_SHOUT);
574 msg->addS32("Channel", nChannel);
575 gAgent.sendReliableMessage();
576 LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
577
578 return true;
579}
580
581// =========================================================================
582// String helper functions
583//
584
585// Checked: 2009-07-04 (RLVa-1.0.0a)
586void rlvStringReplace(std::string& strText, std::string strFrom, const std::string& strTo)
587{
588 if (strFrom.empty())
589 return;
590
591 size_t lenFrom = strFrom.length();
592 size_t lenTo = strTo.length();
593
594 std::string strTemp(strText);
595 LLStringUtil::toLower(strTemp);
596 LLStringUtil::toLower(strFrom);
597
598 std::string::size_type idxCur, idxStart = 0, idxOffset = 0;
599 while ( (idxCur = strTemp.find(strFrom, idxStart)) != std::string::npos)
600 {
601 strText.replace(idxCur + idxOffset, lenFrom, strTo);
602 idxStart = idxCur + lenFrom;
603 idxOffset += lenTo - lenFrom;
604 }
605}
606
607// Checked: 2009-07-29 (RLVa-1.0.1b) | Added: RLVa-1.0.1b
608std::string rlvGetFirstParenthesisedText(const std::string& strText, std::string::size_type* pidxMatch /*=NULL*/)
609{
610 if (pidxMatch)
611 *pidxMatch = std::string::npos; // Assume we won't find anything
612
613 std::string::size_type idxIt, idxStart; int cntLevel = 1;
614 if ((idxStart = strText.find_first_of('(')) == std::string::npos)
615 return std::string();
616
617 const char* pstrText = strText.c_str(); idxIt = idxStart;
618 while ( (cntLevel > 0) && (idxIt < strText.length()) )
619 {
620 if ('(' == pstrText[++idxIt])
621 cntLevel++;
622 else if (')' == pstrText[idxIt])
623 cntLevel--;
624 }
625
626 if (idxIt < strText.length())
627 {
628 if (pidxMatch)
629 *pidxMatch = idxStart; // Return the character index of the starting '('
630 return strText.substr(idxStart + 1, idxIt - idxStart - 1);
631 }
632 return std::string();
633}
634
635// Checked: 2009-07-29 (RLVa-1.0.1b) | Added: RLVa-1.0.1b
636std::string rlvGetLastParenthesisedText(const std::string& strText, std::string::size_type* pidxStart /*=NULL*/)
637{
638 if (pidxStart)
639 *pidxStart = std::string::npos; // Assume we won't find anything
640
641 // Extracts the last - matched - parenthesised text from the input string
642 std::string::size_type idxIt, idxEnd; int cntLevel = 1;
643 if ((idxEnd = strText.find_last_of(')')) == std::string::npos)
644 return std::string();
645
646 const char* pstrText = strText.c_str(); idxIt = idxEnd;
647 while ( (cntLevel > 0) && (idxIt >= 0) )
648 {
649 if (')' == pstrText[--idxIt])
650 cntLevel++;
651 else if ('(' == pstrText[idxIt])
652 cntLevel--;
653 }
654
655 if ( (idxIt >= 0) && (idxIt < strText.length()) ) // NOTE: allow for std::string::size_type to be signed or unsigned
656 {
657 if (pidxStart)
658 *pidxStart = idxIt; // Return the character index of the starting '('
659 return strText.substr(idxIt + 1, idxEnd - idxIt - 1);
660 }
661 return std::string();
662}
663
664// =========================================================================
665// Debug helper functions
666//
667
668// =========================================================================
diff --git a/linden/indra/newview/rlvhelper.h b/linden/indra/newview/rlvhelper.h
new file mode 100644
index 0000000..42d10b8
--- /dev/null
+++ b/linden/indra/newview/rlvhelper.h
@@ -0,0 +1,416 @@
1#ifndef RLV_HELPER_H
2#define RLV_HELPER_H
3
4#include "llboost.h"
5#include "llinventorymodel.h"
6#include "llselectmgr.h"
7#include "llviewercontrol.h"
8#include "llviewerobjectlist.h"
9#include "llwlparamset.h"
10#include "rlvdefines.h"
11
12#ifdef LL_WINDOWS
13 #pragma warning (push)
14 #pragma warning (disable : 4702) // warning C4702: unreachable code
15#endif
16#include <boost/variant.hpp>
17#ifdef LL_WINDOWS
18 #pragma warning (pop)
19#endif
20
21// ============================================================================
22// RlvCommand
23//
24
25class RlvCommand
26{
27public:
28 explicit RlvCommand(const std::string& strCommand);
29
30 /*
31 * Member functions
32 */
33public:
34 std::string asString() const;
35 const std::string& getBehaviour() const { return m_strBehaviour; }
36 ERlvBehaviour getBehaviourType() const { return m_eBehaviour; }
37 const std::string& getOption() const { return m_strOption; }
38 const std::string& getParam() const { return m_strParam; }
39 ERlvParamType getParamType() const { return m_eParamType; }
40 bool isStrict() const { return m_fStrict; }
41 bool isValid() const { return m_fValid; }
42
43 static ERlvBehaviour getBehaviourFromString(const std::string& strBhvr);
44 static const std::string& getStringFromBehaviour(ERlvBehaviour eBhvr);
45 static bool hasStrictVariant(ERlvBehaviour eBhvr);
46
47 static void initLookupTable();
48protected:
49 static bool parseCommand(const std::string& strCommand, std::string& strBehaviour, std::string& strOption, std::string& strParam);
50
51 /*
52 * Operators
53 */
54public:
55 bool operator ==(const RlvCommand&) const;
56
57 /*
58 * Member variables
59 */
60protected:
61 bool m_fValid;
62 std::string m_strBehaviour;
63 ERlvBehaviour m_eBehaviour;
64 bool m_fStrict;
65 std::string m_strOption;
66 std::string m_strParam;
67 ERlvParamType m_eParamType;
68
69 typedef std::map<std::string, ERlvBehaviour> RlvBhvrTable;
70 static RlvBhvrTable m_BhvrMap;
71
72 friend class RlvHandler;
73};
74typedef std::list<RlvCommand> rlv_command_list_t;
75
76// ============================================================================
77// RlvObject
78//
79
80class RlvObject
81{
82public:
83 RlvObject(const LLUUID& idObj);
84
85 /*
86 * Member functions
87 */
88public:
89 bool addCommand(const RlvCommand& rlvCmd);
90 bool removeCommand(const RlvCommand& rlvCmd);
91
92 std::string getStatusString(const std::string& strMatch) const;
93 bool hasBehaviour(ERlvBehaviour eBehaviour, bool fStrictOnly) const;
94 bool hasBehaviour(ERlvBehaviour eBehaviour, const std::string& strOption, bool fStrictOnly) const;
95
96 const rlv_command_list_t* getCommandList() const { return &m_Commands; }
97
98 /*
99 * Member variables
100 */
101protected:
102 LLUUID m_UUID; // The object's UUID
103 S32 m_idxAttachPt; // The object's attachment point (or 0 if it's not an attachment)
104 bool m_fLookup; // TRUE if the object existed in gObjectList at one point in time
105 S16 m_nLookupMisses; // Count of unsuccessful lookups in gObjectList by the GC
106 rlv_command_list_t m_Commands; // List of behaviours held by this object (in the order they were received)
107
108 friend class RlvHandler;
109};
110
111// ============================================================================
112// RlvCriteriaCategoryCollector - Criteria based folder matching filter used by @findfolder and @findfolders
113//
114
115class RlvCriteriaCategoryCollector : public LLInventoryCollectFunctor
116{
117public:
118 RlvCriteriaCategoryCollector(const std::string& strCriteria)
119 {
120 std::string::size_type idxIt, idxLast = 0;
121 while (idxLast < strCriteria.length())
122 {
123 idxIt = strCriteria.find("&&", idxLast);
124 if (std::string::npos == idxIt)
125 idxIt = strCriteria.length();
126 if (idxIt != idxLast)
127 m_Criteria.push_back(strCriteria.substr(idxLast, idxIt - idxLast));
128 idxLast = idxIt + 2;
129 }
130 }
131 virtual ~RlvCriteriaCategoryCollector() {}
132
133 virtual bool operator()(LLInventoryCategory* pFolder, LLInventoryItem* pItem)
134 {
135 if ( (!pFolder) || (m_Criteria.empty()) ) // We're only interested in matching folders, we don't care about items
136 return false; // (if there are no criteria then we don't want to return a match)
137
138 std::string strFolderName = pFolder->getName();
139 LLStringUtil::toLower(strFolderName);
140
141 if ( (strFolderName.empty()) || (RLV_FOLDER_PREFIX_HIDDEN == strFolderName[0]) )
142 return false;
143
144 for (std::list<std::string>::const_iterator itCrit = m_Criteria.begin(); itCrit != m_Criteria.end(); ++itCrit)
145 if (std::string::npos == strFolderName.find(*itCrit)) // Return false on the first mismatch
146 return false;
147 return true;
148 }
149
150protected:
151 std::list<std::string> m_Criteria;
152};
153
154// ============================================================================
155// RlvWearableItemCollector - Inventory item filter used by attach/detach/attachall/detachall/getinvworn
156//
157
158class RlvWearableItemCollector : public LLInventoryCollectFunctor
159{
160public:
161 RlvWearableItemCollector(const LLUUID& idFolder, bool fAttach, bool fMatchAll)
162 : m_idFolder(idFolder), m_fAttach(fAttach), m_fMatchAll(fMatchAll)
163 {
164 m_Wearable.push_back(idFolder);
165 }
166 virtual ~RlvWearableItemCollector() {}
167
168 virtual bool operator()(LLInventoryCategory* pFolder, LLInventoryItem* pItem);
169
170 const LLUUID& getFoldedParent(const LLUUID& idFolder) const;
171protected:
172 bool m_fAttach;
173 bool m_fMatchAll;
174 const LLUUID m_idFolder;
175
176 bool onCollectFolder(const LLInventoryCategory* pFolder);
177 bool onCollectItem(const LLInventoryItem* pItem);
178
179 std::list<LLUUID> m_Tentative;
180 std::list<LLUUID> m_Wearable;
181
182 std::map<LLUUID, LLUUID> m_Folding;
183};
184
185// ============================================================================
186// RlvRetainedCommand
187//
188
189struct RlvRetainedCommand
190{
191public:
192 std::string strObject;
193 LLUUID idObject;
194 std::string strCmd;
195
196 RlvRetainedCommand(const std::string obj, const LLUUID& uuid, const std::string& cmd) : strObject(obj), idObject(uuid), strCmd(cmd) {}
197private:
198 RlvRetainedCommand();
199};
200typedef std::list<RlvRetainedCommand> rlv_retained_list_t;
201
202// ============================================================================
203// RlvException
204//
205
206typedef boost::variant<std::string, LLUUID, S32, ERlvBehaviour> RlvExceptionOption;
207
208struct RlvException
209{
210public:
211 LLUUID idObject; // UUID of the object that added the exception
212 ERlvBehaviour eBehaviour; // Behaviour the exception applies to
213 RlvExceptionOption varOption; // Exception data (type is dependent on eBehaviour)
214
215 RlvException(const LLUUID& idObj, ERlvBehaviour eBhvr, const RlvExceptionOption& option) : idObject(idObj), eBehaviour(eBhvr), varOption(option) {}
216private:
217 RlvException();
218};
219
220// ============================================================================
221// RlvWLSnapshot
222//
223
224struct RlvWLSnapshot
225{
226public:
227 static void restoreSnapshot(const RlvWLSnapshot* pWLSnapshot);
228 static RlvWLSnapshot* takeSnapshot();
229private:
230 RlvWLSnapshot() {}
231
232 bool fIsRunning;
233 bool fUseLindenTime;
234 LLWLParamSet WLParams;
235};
236
237// ============================================================================
238// RlvSettings
239//
240
241inline BOOL rlvGetSettingBOOL(const std::string& strSetting, BOOL fDefault)
242{
243 return (gSavedSettings.controlExists(strSetting)) ? gSavedSettings.getBOOL(strSetting) : fDefault;
244}
245inline BOOL rlvGetPerUserSettingsBOOL(const std::string& strSetting, BOOL fDefault)
246{
247 return (gSavedPerAccountSettings.controlExists(strSetting)) ? gSavedPerAccountSettings.getBOOL(strSetting) : fDefault;
248}
249
250class RlvSettings
251{
252public:
253 static BOOL getDebug() { return rlvGetSettingBOOL(RLV_SETTING_DEBUG, FALSE); }
254 static BOOL getForbidGiveToRLV() { return rlvGetSettingBOOL(RLV_SETTING_FORBIDGIVETORLV, TRUE); }
255
256 static BOOL getEnableWear();
257 static BOOL getHideLockedLayers() { return rlvGetSettingBOOL(RLV_SETTING_HIDELOCKEDLAYER, FALSE); }
258 static BOOL getHideLockedAttach() { return rlvGetSettingBOOL(RLV_SETTING_HIDELOCKEDATTACH, FALSE); }
259 static BOOL getHideLockedInventory() { return rlvGetSettingBOOL(RLV_SETTING_HIDELOCKEDINVENTORY, FALSE); }
260 static BOOL getShowNameTags() { return fShowNameTags; }
261
262 #ifdef RLV_EXTENSION_STARTLOCATION
263 static BOOL getLoginLastLocation() { return rlvGetPerUserSettingsBOOL(RLV_SETTING_LOGINLASTLOCATION, TRUE); }
264 static void updateLoginLastLocation();
265 #endif // RLV_EXTENSION_STARTLOCATION
266
267 static BOOL fShowNameTags;
268};
269
270// ============================================================================
271// State keeping classes/structure
272//
273
274// ============================================================================
275// Various helper classes/timers/functors
276//
277
278class RlvGCTimer : public LLEventTimer
279{
280public:
281 RlvGCTimer() : LLEventTimer(30.0) {}
282 virtual BOOL tick();
283};
284
285class RlvCurrentlyWorn : public LLInventoryFetchObserver
286{
287public:
288 RlvCurrentlyWorn() {}
289 ~RlvCurrentlyWorn() {}
290 virtual void done() {}
291
292 static void fetchWorn();
293 void fetchItem(const LLUUID& idItem);
294};
295
296struct RlvSelectHasLockedAttach : public LLSelectedNodeFunctor
297{
298 virtual bool apply(LLSelectNode* pNode);
299};
300
301struct RlvSelectIsOwnedByOrGroupOwned : public LLSelectedNodeFunctor
302{
303 RlvSelectIsOwnedByOrGroupOwned(const LLUUID& uuid) : m_idAgent(uuid) {}
304 virtual bool apply(LLSelectNode* pNode);
305 LLUUID m_idAgent;
306};
307
308struct RlvSelectIsSittingOn : public LLSelectedNodeFunctor
309{
310 RlvSelectIsSittingOn(LLXform* pObject) : m_pObject(pObject) {}
311 virtual bool apply(LLSelectNode* pNode);
312 LLXform* m_pObject;
313};
314
315// ============================================================================
316// Various helper functions
317//
318
319BOOL rlvAttachToEnabler(void* pParam);
320bool rlvCanDeleteOrReturn();
321BOOL rlvEnableWearEnabler(void* pParam);
322S32 rlvGetDirectDescendentsCount(const LLInventoryCategory* pFolder, LLAssetType::EType type);
323bool rlvIsEmote(const std::string& strUTF8Text);
324bool rlvIsValidReplyChannel(S32 nChannel);
325bool rlvIsWearingItem(const LLInventoryItem* pItem);
326
327void rlvForceDetach(LLViewerJointAttachment* pAttachPt);
328void rlvSendBusyMessage(const LLUUID& idTo, const std::string& strMsg, const LLUUID& idSession = LLUUID::null);
329bool rlvSendChatReply(const std::string& strChannel, const std::string& strReply);
330bool rlvSendChatReply(S32 nChannel, const std::string& strReply);
331
332std::string rlvGetFirstParenthesisedText(const std::string& strText, std::string::size_type* pidxMatch = NULL);
333std::string rlvGetLastParenthesisedText(const std::string& strText, std::string::size_type* pidxStart = NULL);
334void rlvStringReplace(std::string& strText, std::string strFrom, const std::string& strTo);
335
336#ifdef RLV_ADVANCED_TOGGLE_RLVA
337 // "Advanced / RLVa / Enable RLV" menu option
338 void rlvToggleEnabled(void*);
339 BOOL rlvGetEnabled(void*);
340#endif // RLV_ADVANCED_TOGGLE_RLVA
341
342// ============================================================================
343// Debug helper functions
344//
345
346// ============================================================================
347// Inlined class member functions
348//
349
350// Checked: 2009-09-19 (RLVa-1.0.3d)
351inline std::string RlvCommand::asString() const
352{
353 // NOTE: @clear=<param> should be represented as clear:<param>
354 return (m_eParamType != RLV_TYPE_CLEAR)
355 ? (!m_strOption.empty()) ? (std::string(m_strBehaviour)).append(":").append(m_strOption) : (std::string(m_strBehaviour))
356 : (!m_strParam.empty()) ? (std::string(m_strBehaviour)).append(":").append(m_strParam) : (std::string(m_strBehaviour));
357}
358
359inline bool RlvCommand::operator ==(const RlvCommand& rhs) const
360{
361 // The specification notes that "@detach=n" is semantically identical to "@detach=add" (same for "y" and "rem"
362 return (m_strBehaviour == rhs.m_strBehaviour) && (m_strOption == rhs.m_strOption) &&
363 ( (RLV_TYPE_UNKNOWN != m_eParamType) ? (m_eParamType == rhs.m_eParamType) : (m_strParam == rhs.m_strParam) );
364}
365
366inline void RlvCurrentlyWorn::fetchItem(const LLUUID& idItem)
367{
368 if (idItem.notNull())
369 {
370 LLInventoryFetchObserver::item_ref_t idItems;
371 idItems.push_back(idItem);
372 fetchItems(idItems);
373 }
374}
375
376inline bool RlvCommand::hasStrictVariant(ERlvBehaviour eBhvr)
377{
378 switch (eBhvr)
379 {
380 case RLV_BHVR_RECVCHAT:
381 case RLV_BHVR_RECVEMOTE:
382 case RLV_BHVR_RECVIM:
383 case RLV_BHVR_SENDIM:
384 case RLV_BHVR_TPLURE:
385 case RLV_BHVR_SENDCHANNEL:
386 return true;
387 default:
388 return false;
389 }
390}
391
392// ============================================================================
393// Inlined helper functions
394//
395
396inline bool rlvIsEmote(const std::string& strUTF8Text)
397{
398 return (strUTF8Text.length() > 4) && ( (strUTF8Text.compare(0, 4, "/me ") == 0) || (strUTF8Text.compare(0, 4, "/me'") == 0) );
399}
400
401// Checked: 2009-09-05 (RLVa-1.0.2a) | Added: RLVa-1.0.2a
402inline bool rlvIsValidReplyChannel(S32 nChannel)
403{
404 return (nChannel > 0) && (CHAT_CHANNEL_DEBUG != nChannel);
405}
406
407// Checked: 2009-08-05 (RLVa-1.0.1e) | Added: RLVa-1.0.0e
408inline bool rlvSendChatReply(const std::string& strChannel, const std::string& strReply)
409{
410 S32 nChannel;
411 return (LLStringUtil::convertToS32(strChannel, nChannel)) ? rlvSendChatReply(nChannel, strReply) : false;
412}
413
414// ============================================================================
415
416#endif // RLV_HELPER_H
diff --git a/linden/indra/newview/rlvmultistringsearch.cpp b/linden/indra/newview/rlvmultistringsearch.cpp
new file mode 100644
index 0000000..0aa9889
--- /dev/null
+++ b/linden/indra/newview/rlvmultistringsearch.cpp
@@ -0,0 +1,196 @@
1#include "llviewerprecompiledheaders.h"
2
3#include "rlvmultistringsearch.h"
4
5// ====================================================================================
6
7#ifndef RLV_LOWORD
8 #define RLV_LOWORD(x) ( (U16)( ((U32)x) & 0xFFFF) )
9#endif // RLV_LOWORD
10
11#ifndef RLV_HIWORD
12 #define RLV_HIWORD(x) ( (U16)( (((U32)x) >> 16) & 0xFFFF) )
13#endif // RLV_HIWORD
14
15// ====================================================================================
16
17// (TODO-RLV: oops, forgot I was experimenting with word matching, get rid of that again?)
18#define isLetter(ch) \
19 ( ( (ch >= 'a') && (ch <= 'z') ) || ( (ch >= 'A') && (ch <= 'Z') ) )
20
21RlvMultiStringSearch::RlvMultiStringSearch()
22 : m_FSM(256), // Start our FSM with room for 256 states (enough for all attachment point names)
23 m_cntState(0)
24{
25}
26
27void RlvMultiStringSearch::addKeyword(const std::string& strKeyword, U16 nParam) {
28 U16 nCurState = 0; // Always start the loop at state 0
29
30 //
31 // Make sure there are enough unused rows to accomodate the worst case (== strKeyword.length() new states)
32 //
33 size_t nMaxState = m_FSM.getSize();
34 if (m_cntState + strKeyword.length() > nMaxState)
35 // Allocate enough new rows (in batches of 256 rows)
36 m_FSM.resize(nMaxState + ((strKeyword.length() / 256) + 1) * 256);
37
38 //
39 // Walk the string character by character
40 //
41 for (int idxCh = 0, cntCh = strKeyword.length(); idxCh < cntCh; idxCh++) {
42 // Look up the next state for current character
43 unsigned char ch = strKeyword[idxCh];
44 U16 nState = RLV_LOWORD(m_FSM[nCurState][ch]);
45
46 // If we're at the last character in the keyword then set the termination bit
47 if (cntCh - 1 == idxCh)
48 {
49 // (Only set the termination bit for the state because this keyword might be a substring of another keyword)
50 m_FSM[nCurState][ch] = (nParam << 16) | (nState | 0x8000);
51 }
52 else if ( (nState & 0x7FFF) == 0 ) // If the new state is 0 then we're creating a new path
53 {
54 // (Preserve the termination bit because another keyword might be a substring of this one)
55 nState = ++m_cntState | (nState & 0x8000);
56
57 // Store the new path in the FSM
58 //m_FSM[nCurState][ch] = (nParam << 16) | nState;
59 m_FSM[nCurState][ch] |= nState;
60 }
61
62 nCurState = nState & 0x7FFF; // Mask out the termination bit since we never need it for the current state
63 }
64}
65
66// (Iterating over a "const char*" is *significantly* faster than "std::string")
67bool RlvMultiStringSearch::findNext(const char* pstrText, int idxCh, int cntCh, RlvMultiStringSearchMatch& match, bool fWordMatch) const
68{
69 U16 nCurState = 0; // Always start the loop at state 0
70 U32 nLastMatch = 0; // Holds the state of the last (possibly partial) keyword match
71
72 //
73 // Walk the string character by character
74 //
75 for (; idxCh < cntCh; idxCh++)
76 {
77 // Keep track of the current state in case we need to backtrack
78 U16 nPrevState = nCurState;
79
80 // If we're currently in state 0, save the current character index (for backtracking or as keyword index match)
81 if (nCurState == 0)
82 match.idxMatch = idxCh;
83
84 // Look up the current character in the FSM
85 unsigned char ch = (unsigned char)pstrText[idxCh];
86 U32 nCell = m_FSM[nCurState & 0x7FFF][ch];
87
88 // If the termination bit is set then we found a keyword substring match
89 // If the next state is non-zero then we can't stop yet because the matched keyword might be a substring of another keyword
90 if (nCell & 0x8000)
91 {
92 if ( 0 == (nCell & 0x7FFF) )
93 {
94 // Termination bit with 'next state' equal to 0: matched keyword which isn't also a substring of any other keyword
95 match.lenMatch = idxCh - match.idxMatch + 1;
96 match.nParam = RLV_HIWORD(nCell);
97
98 // Rudimentary word matching: check if the match is a 'word'
99 if
100 (
101 (!fWordMatch) ||
102 (
103 ( (0 == match.idxMatch) || (!isLetter(pstrText[match.idxMatch - 1])) ) && // Start of string OR non-letter
104 ( (!isLetter(pstrText[match.idxMatch + match.lenMatch])) )
105 )
106 )
107 {
108 return true;
109 }
110
111 // Not a word, but there's no need to backtrack: we can move on from the character after the current one
112 nCell = 0; // Will set nCurState == 0 further down
113 match.idxMatch = idxCh; // Makes sure we move on to the next character instead of backtracking
114 }
115 else
116 {
117 nLastMatch = nCell;
118
119 // In case it turns out that we need to backtrack and return this match, save the length of this match
120 match.lenMatch = idxCh - match.idxMatch + 1;
121 }
122 }
123
124 nCurState = RLV_LOWORD(nCell);
125
126 // If our new state is 0, but our previous state wasn't, then we followed a false lead and need to backtrack
127 if ( (nPrevState != 0) && (nCurState == 0) )
128 {
129 // * if nLastMatch == 0 then we need to backtrack and keep going
130 // * if nLastMatch != 0 then we previously encountered a keyword match so return that one
131 if (nLastMatch) {
132 // Rudimentary word matching: check if the match is a 'word'
133 if
134 (
135 (!fWordMatch) ||
136 (
137 ( (0 == match.idxMatch) || (!isLetter(pstrText[match.idxMatch - 1])) ) && // Start of string OR non-letter
138 ( (!isLetter(pstrText[match.idxMatch + match.lenMatch])) )
139 )
140 )
141 {
142 match.nParam = RLV_HIWORD(nLastMatch);
143 return true;
144 } else
145 // Not a word match, so throw away this partial match and backtrack
146 nLastMatch = 0;
147 }
148
149 idxCh = match.idxMatch;
150 }
151 }
152
153 // We encountered a match, but while investigating whether it was a substring of another keyword we ran out of characters
154 if (nLastMatch)
155 {
156 // Rudimentary word matching: check if we started at the beginning of a word (we know the one behind us is '\0')
157 if ( (!fWordMatch) || ( (0 == match.idxMatch) || (!isLetter(pstrText[match.idxMatch - 1])) ) )
158 {
159 match.nParam = RLV_HIWORD(nLastMatch);
160 return true;
161 }
162 }
163
164 // None of the keywords is contained in the string: return failure
165 match.idxMatch = -1;
166 return false;
167}
168
169bool RlvMultiStringSearch::findLast(const std::string& strText, RlvMultiStringSearchMatch& match) const {
170 RlvMultiStringSearchMatch matchTemp;
171 match.idxMatch = -1; // (Needed to make the return work in case we don't find anything)
172 matchTemp.lenMatch = 0; // (Needed to make the first loop iteration start at 0)
173
174 // Iterating over a "const char*" is *significantly* faster than "std::string"
175 const char* pstrText = strText.c_str();
176 int lenText = strText.length();
177
178 while (findNext(pstrText, matchTemp.idxMatch + matchTemp.lenMatch + 1, lenText, matchTemp))
179 match = matchTemp;
180
181 return (match.idxMatch != -1);
182}
183
184std::vector<RlvMultiStringSearchMatch> RlvMultiStringSearch::findAll(const std::string& strText) {
185 std::vector<RlvMultiStringSearchMatch> arMatch;
186
187 RlvMultiStringSearchMatch match;
188 match.lenMatch = 0; // (Needed to make the first loop iteration start at 0)
189
190 while (findNext(strText, match.idxMatch + match.lenMatch + 1, match))
191 arMatch.push_back(match);
192
193 return arMatch;
194}
195
196// ====================================================================================
diff --git a/linden/indra/newview/rlvmultistringsearch.h b/linden/indra/newview/rlvmultistringsearch.h
new file mode 100644
index 0000000..43b0172
--- /dev/null
+++ b/linden/indra/newview/rlvmultistringsearch.h
@@ -0,0 +1,191 @@
1#ifndef RLV_MULTISTRINGSEARCH_H
2#define RLV_MULTISTRINGSEARCH_H
3
4// ============================================================================
5// Template classes for our state machine (2 dimensional array of type T)
6
7// STL vector
8template<typename T> class RlvMultiStringSearchFSM_STL
9{
10public:
11 /*
12 * Constructor/destructor
13 */
14
15 // Initialize the FSM with an initial capacity of 'nCapacity' states
16 RlvMultiStringSearchFSM_STL(size_t nCapacity)
17 {
18 m_arFSM.reserve(nCapacity);
19
20 T* pT;
21 for (size_t idx = 0; idx < nCapacity; idx++)
22 {
23 // The width of each row is determined by the alphabet we're using (in this case UTF-8
24 // so while every character might consist of multiple bytes there are
25 // still only 256 'columns' in the state machine)
26 pT = new T[256]();
27
28 // The above *should* initialize to 0 but since we can't account for every compiler doing it :(
29 memset(pT, 0, sizeof(T) * 256);
30
31 m_arFSM.push_back(pT);
32 }
33 };
34
35 ~RlvMultiStringSearchFSM_STL()
36 {
37 // Free any memory we previously allocated
38 for (int idx = 0, cnt = m_arFSM.size(); idx < cnt; idx++)
39 delete[] m_arFSM[idx];
40 }
41
42 /*
43 * Operators
44 */
45 // ASSERTION: nState < m_arFSM.size() at all times
46 // In other words: do *NOT* go out of bounds on the array (no memory will have allocated for that non-existing state)
47 // (There probably should be a check for that even in release but it seems wasteful, just don't do it :p)
48 inline T* operator[](size_t nState)
49 {
50 //#ifdef _DEBUG
51 // assert( nState < m_arFSM.size() );
52 //#endif // _DEBUG
53
54 return m_arFSM[nState];
55 }
56 inline const T* operator[](size_t nState) const
57 {
58 //#ifdef _DEBUG
59 // assert( nState < m_arFSM.size() );
60 //#endif // _DEBUG
61
62 return m_arFSM[nState];
63 }
64
65 /*
66 * Public member functions
67 */
68
69 size_t getSize() const { return m_arFSM.size(); }
70
71 void resize(size_t nNewCapacity)
72 {
73 // Get our current capacity (only rows > capacity need memory allocated)
74 size_t nCurCapacity = m_arFSM.capacity();
75
76 // Only expand, never shrink
77 if (nNewCapacity <= nCurCapacity)
78 {
79 //#ifdef _DEBUG
80 // assert(false);
81 //#endif //_DEBUG
82
83 return;
84 }
85 m_arFSM.resize(nNewCapacity);
86
87 // For each new state we added, allocate memory for the columns
88 for(size_t idx = nCurCapacity; idx < nNewCapacity; idx++)
89 // The memset is redundant (or rather *should* be) but since we can't account for every compiler doing it :(
90 m_arFSM[idx] = (T*)memset(new T[256](), 0, sizeof(T) * 256);
91 }
92
93protected:
94 /*
95 * Member variables
96 */
97 std::vector<T*> m_arFSM;
98};
99
100// ============================================================================
101
102struct RlvMultiStringSearchMatch
103{
104 int idxMatch; // Starting character index into the string of the matched keyword (-1 if no match)
105 int lenMatch; // Length of the matched keyword (undefined if no match)
106 U16 nParam; // User supplied parameter for the matched keyword (undefined if no match)
107
108 RlvMultiStringSearchMatch() : idxMatch(-1) {}
109};
110
111// ============================================================================
112// The actual search class
113
114class RlvMultiStringSearch
115{
116public:
117 /*
118 * Constructor/destructor
119 */
120 RlvMultiStringSearch();
121 //~RlvMultiStringSearch();
122
123 /*
124 * Public member functions
125 */
126
127 // Add a keyword to the state machine (if it already exists then it will simply overwrite the existing parameter)
128 void addKeyword(const std::string& strKeyword, U16 nParam);
129
130 BOOL getExactMatchParam(const std::string& strText, U16& nParam) const
131 {
132 RlvMultiStringSearchMatch match;
133 if (findFirst(strText, match))
134 {
135 // We have an exact match if the starting index is 0
136 // and the length of the match matches the length of the string
137 if ( (0 == match.idxMatch) && (match.lenMatch == (int)strText.length()) )
138 {
139 nParam = match.nParam;
140 return TRUE;
141 }
142 }
143
144 return FALSE; // Fall-through: no (exact) match
145 }
146
147 // Finds the first occurance of any keyword in the supplied string
148 bool findFirst(const std::string& strText, RlvMultiStringSearchMatch& match) const;
149 // Finds the next occurance of any keyword in the supplied string
150 bool findNext(const std::string& strText, int idxCh, RlvMultiStringSearchMatch& match) const;
151 // Finds all occurances of any keyword in the supplied string
152 std::vector<RlvMultiStringSearchMatch> findAll(const std::string& strText);
153 // Finds the last occurance of any keyword in the supplied string (non-optimized)
154 bool findLast(const std::string& strText, RlvMultiStringSearchMatch& match) const;
155
156protected:
157 // Finds the next occurance of any keyword in the supplied string
158 bool findNext(const char* pstrText, int idxCh, int cntCh, RlvMultiStringSearchMatch& match, bool fWordMatch = true) const;
159
160 /*
161 * Member variables
162 */
163 RlvMultiStringSearchFSM_STL<U32> m_FSM; // Our finite state machine (4 bytes * 256 = 1Kb of memory/state)
164 // HIWORD(U32) = 16-bits of user data
165 // LOWORD(U32) = ABBBBBBBBBBBBBBB
166 // A = termination bit
167 // If (set) and (B == 0): match
168 // If (set) and (B != 0): match, but might only be a substring of another keyword
169 // B = next state (0..32767)
170 // If (B == 0): false lead -> backtrack
171 // If (B != 0): partial keyword match, next state
172 size_t m_cntState; // The number of states in the FSM (= the number of *used* rows in the array)
173};
174
175// ============================================================================
176// Inlined member functions
177//
178
179inline bool RlvMultiStringSearch::findFirst(const std::string& strText, RlvMultiStringSearchMatch& match) const
180{
181 return findNext(strText.c_str(), 0, strText.length(), match);
182}
183
184inline bool RlvMultiStringSearch::findNext(const std::string& strText, int idxCh, RlvMultiStringSearchMatch& match) const
185{
186 return findNext(strText.c_str(), idxCh, strText.length(), match);
187}
188
189// ============================================================================
190
191#endif // RLV_MULTISTRINGSEARCH_H
diff --git a/linden/indra/newview/skins/default/colors_base.xml b/linden/indra/newview/skins/default/colors_base.xml
index b498b4c..b90f8aa 100644
--- a/linden/indra/newview/skins/default/colors_base.xml
+++ b/linden/indra/newview/skins/default/colors_base.xml
@@ -68,11 +68,9 @@
68<TextEmbeddedItemReadOnlyColor value="58, 147, 242, 255" /> <!-- Text of read-only items embedded in notecards --> 68<TextEmbeddedItemReadOnlyColor value="58, 147, 242, 255" /> <!-- Text of read-only items embedded in notecards -->
69<TextEmbeddedItemColor value="0, 0, 128, 255" /> <!-- Text of items embedded in notecards --> 69<TextEmbeddedItemColor value="0, 0, 128, 255" /> <!-- Text of items embedded in notecards -->
70<TextDefaultColor value="0, 20, 0, 255"/> <!-- Non-keyword text in the script editor --> 70<TextDefaultColor value="0, 20, 0, 255"/> <!-- Non-keyword text in the script editor -->
71<ScriptBgReadOnlyColor value="100, 100, 100, 255" /> <!-- Not used -->
72<TextLinkColor value="144, 165, 208, 255"/> 71<TextLinkColor value="144, 165, 208, 255"/>
73<TextLinkHoverColor value="255, 255, 255, 255"/> 72<TextLinkHoverColor value="255, 255, 255, 255"/>
74 73
75
76<!-- LISTBOXES --> 74<!-- LISTBOXES -->
77<ScrollBgReadOnlyColor value="200, 209, 204, 255" /> <!-- Background of read only lists --> 75<ScrollBgReadOnlyColor value="200, 209, 204, 255" /> <!-- Background of read only lists -->
78<ScrollBgWriteableColor value="200, 209, 204, 255" /> <!-- Background of editable lists, e.g. groups--> 76<ScrollBgWriteableColor value="200, 209, 204, 255" /> <!-- Background of editable lists, e.g. groups-->
@@ -84,6 +82,7 @@
84<ScrollHighlightedColor value="183, 184, 188, 128" /> <!-- Hover color --> 82<ScrollHighlightedColor value="183, 184, 188, 128" /> <!-- Hover color -->
85<ScrollbarThumbColor value="60, 76, 124, 255" /> <!-- Scroll bar --> 83<ScrollbarThumbColor value="60, 76, 124, 255" /> <!-- Scroll bar -->
86<ScrollbarTrackColor value="153, 154, 158, 255" /> <!-- Scroll bar background --> 84<ScrollbarTrackColor value="153, 154, 158, 255" /> <!-- Scroll bar background -->
85<ScrollReadOnlyColor value="100, 100, 100, 255" /> <!-- Color for inactive but not disabled lists -->
87 86
88<!-- MENUS --> 87<!-- MENUS -->
89<MenuBarBgColor value="62, 62, 62, 255" /> <!-- Menu bar background --> 88<MenuBarBgColor value="62, 62, 62, 255" /> <!-- Menu bar background -->
@@ -163,6 +162,9 @@
163<MapAvatar value="0, 255, 0, 255" /> <!-- Your avatar's glyph color --> 162<MapAvatar value="0, 255, 0, 255" /> <!-- Your avatar's glyph color -->
164<MapFriend value="255, 255, 0, 255" /> <!-- Your friends' glyph color --> 163<MapFriend value="255, 255, 0, 255" /> <!-- Your friends' glyph color -->
165<MapMuted value="128, 128, 128, 255" /> <!-- Muted avatars' glyph color --> 164<MapMuted value="128, 128, 128, 255" /> <!-- Muted avatars' glyph color -->
165<MapSelected value="255, 0, 0, 255" /> <!-- Selected avatars' glyph color -->
166<MapImpDev value="90, 45, 101, 255" /> <!-- Imprudence developers glyph color -->
167<MapPartner value="214, 40, 107, 255" /> <!-- (unused) Your avatar's partner's glyph color -->
166 168
167 <!-- MINI-MAP --> 169 <!-- MINI-MAP -->
168<NetMapBackgroundColor value="0, 0, 0, 77" /> <!-- Mini-map floater background --> 170<NetMapBackgroundColor value="0, 0, 0, 77" /> <!-- Mini-map floater background -->
diff --git a/linden/indra/newview/skins/default/html/en-us/loading/imprudence_loading.png b/linden/indra/newview/skins/default/html/en-us/loading/imprudence_loading.png
new file mode 100644
index 0000000..f9ea7a2
--- /dev/null
+++ b/linden/indra/newview/skins/default/html/en-us/loading/imprudence_loading.png
Binary files differ
diff --git a/linden/indra/newview/skins/default/html/en-us/loading/loading.html b/linden/indra/newview/skins/default/html/en-us/loading/loading.html
index 1c62d2f..97174b0 100644
--- a/linden/indra/newview/skins/default/html/en-us/loading/loading.html
+++ b/linden/indra/newview/skins/default/html/en-us/loading/loading.html
@@ -2,7 +2,7 @@
2<table width="100%" height="100%" border="0"> 2<table width="100%" height="100%" border="0">
3 <tr> 3 <tr>
4 <td align="center" valign="middle" style="font-size:0.8em;"> 4 <td align="center" valign="middle" style="font-size:0.8em;">
5 <img src="sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;loading... 5 <img src="imprudence_loading.png" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;loading...
6 </td> 6 </td>
7 </tr> 7 </tr>
8</table> 8</table>
diff --git a/linden/indra/newview/skins/default/textures/arrow_left.tga b/linden/indra/newview/skins/default/textures/arrow_left.tga
new file mode 100644
index 0000000..68e6280
--- /dev/null
+++ b/linden/indra/newview/skins/default/textures/arrow_left.tga
Binary files differ
diff --git a/linden/indra/newview/skins/default/textures/arrow_right.tga b/linden/indra/newview/skins/default/textures/arrow_right.tga
new file mode 100644
index 0000000..7a5a30e
--- /dev/null
+++ b/linden/indra/newview/skins/default/textures/arrow_right.tga
Binary files differ
diff --git a/linden/indra/newview/skins/default/textures/map_avatar_32.tga b/linden/indra/newview/skins/default/textures/map_avatar_32.tga
new file mode 100644
index 0000000..aebeab4
--- /dev/null
+++ b/linden/indra/newview/skins/default/textures/map_avatar_32.tga
Binary files differ
diff --git a/linden/indra/newview/skins/default/textures/map_avatar_above_32.tga b/linden/indra/newview/skins/default/textures/map_avatar_above_32.tga
new file mode 100644
index 0000000..65bd056
--- /dev/null
+++ b/linden/indra/newview/skins/default/textures/map_avatar_above_32.tga
Binary files differ
diff --git a/linden/indra/newview/skins/default/textures/map_avatar_below_32.tga b/linden/indra/newview/skins/default/textures/map_avatar_below_32.tga
new file mode 100644
index 0000000..496c44b
--- /dev/null
+++ b/linden/indra/newview/skins/default/textures/map_avatar_below_32.tga
Binary files differ
diff --git a/linden/indra/newview/skins/default/textures/map_avatar_you_32.tga b/linden/indra/newview/skins/default/textures/map_avatar_you_32.tga
new file mode 100644
index 0000000..782207e
--- /dev/null
+++ b/linden/indra/newview/skins/default/textures/map_avatar_you_32.tga
Binary files differ
diff --git a/linden/indra/newview/skins/default/textures/textures.xml b/linden/indra/newview/skins/default/textures/textures.xml
index 34c9dea..0a3aee7 100644
--- a/linden/indra/newview/skins/default/textures/textures.xml
+++ b/linden/indra/newview/skins/default/textures/textures.xml
@@ -150,7 +150,6 @@
150 150
151 <texture name="map_avatar_16.tga"/> 151 <texture name="map_avatar_16.tga"/>
152 <texture name="map_avatar_8.tga"/> 152 <texture name="map_avatar_8.tga"/>
153 <texture name="map_avatar_you_8.tga"/>
154 <texture name="map_event.tga"/> 153 <texture name="map_event.tga"/>
155 <texture name="map_event_mature.tga"/> 154 <texture name="map_event_mature.tga"/>
156 <texture name="map_home.tga"/> 155 <texture name="map_home.tga"/>
@@ -365,6 +364,9 @@
365 <texture name="icn_label_music.tga"/> 364 <texture name="icn_label_music.tga"/>
366 <texture name="icn_label_media.tga"/> 365 <texture name="icn_label_media.tga"/>
367 <texture name="arrow_down.tga"/> 366 <texture name="arrow_down.tga"/>
367 <texture name="arrow_up.tga"/>
368 <texture name="arrow_left.tga"/>
369 <texture name="arrow_right.tga"/>
368 <texture name="cloud-particle.j2c" use_mips="true"/> 370 <texture name="cloud-particle.j2c" use_mips="true"/>
369 371
370 <texture name="skin_thumbnail_default.png" preload="true" /> 372 <texture name="skin_thumbnail_default.png" preload="true" />
diff --git a/linden/indra/newview/skins/default/xui/de/floater_about.xml b/linden/indra/newview/skins/default/xui/de/floater_about.xml
index 28785c6..1f7518a 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_about.xml
@@ -1,7 +1,24 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="floater_about" title="Über Second Life"> 2<floater name="floater_about" title="Über Second Life">
3 <text_editor name="credits_editor"> 3 <text_editor name="credits_editor">
4 Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl und vielen anderen. 4 The Imprudence Viewer was rocked hard by:
5 Jacek Antonelli, McCabe Maxsted, and Armin Weatherwax.
6 http://www.imprudenceviewer.org
7
8 Imprudence is so awesome thanks to contributions from many generous people:
9
10 For their patches and code contributions, we thank Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Angus Boyd, Asuka Neely, Balp Allen, Carjay McGinnis, Dale Glass, Felix Duesenburg, Henri Beauchamp, Kitty Barnett, Latif Khalifa, Mana Janus, Matthew Dowd, Michelle2 Zenovka, Nicholaz Beresford, Paul Churchill, Peter Lameth, Robin Cornelius, Stephen Zenith, Thomas Shikami, Vadim Bigbear, Zi Ree, and Zwagoth Klaar.
11
12 For their WindLight presets, we thank Ana Lutetia, CodeBastard Redgrave, and Torley Linden.
13
14 Thanks also to the developers of the Green Life Emerald Viewer, Hippo Viewer, and Meerkat Viewer for viewer enhancements we have incorporated. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
15
16 For a complete list of who did what, read the release notes!
17
18
19 Second Life Copyright (C) 1999-2009 Linden Research Inc.
20
21 Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les und vielen anderen.
5 22
6Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar 23Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
7 24
diff --git a/linden/indra/newview/skins/default/xui/de/floater_choose_group.xml b/linden/indra/newview/skins/default/xui/de/floater_choose_group.xml
index dd29aa7..327cb02 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_choose_group.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_choose_group.xml
@@ -5,4 +5,7 @@
5 </text> 5 </text>
6 <button label="OK" label_selected="OK" name="OK" /> 6 <button label="OK" label_selected="OK" name="OK" />
7 <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" /> 7 <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" />
8 <string name="none">
9 keine
10 </string>
8</floater> 11</floater>
diff --git a/linden/indra/newview/skins/default/xui/de/panel_groups.xml b/linden/indra/newview/skins/default/xui/de/panel_groups.xml
index 95a2ef1..a7d6f98 100644
--- a/linden/indra/newview/skins/default/xui/de/panel_groups.xml
+++ b/linden/indra/newview/skins/default/xui/de/panel_groups.xml
@@ -12,4 +12,7 @@
12 <button label="Verlassen" name="Leave" /> 12 <button label="Verlassen" name="Leave" />
13 <button label="Erstellen..." name="Create" /> 13 <button label="Erstellen..." name="Create" />
14 <button label="Suchen..." name="Search..." /> 14 <button label="Suchen..." name="Search..." />
15 <string name="none">
16 keine
17 </string>
15</panel> 18</panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/alerts.xml b/linden/indra/newview/skins/default/xui/en-us/alerts.xml
index 4a36636..abf45cc 100644
--- a/linden/indra/newview/skins/default/xui/en-us/alerts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/alerts.xml
@@ -1,6 +1,2893 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<alerts> 2<alerts>
3 <alert modal="true" name="ConfirmTeleportHome"> 3<!-- TODO: Make sure all the Imprudence <= 1.2 alerts get pulled out before this file goes bye-bye. -->
4 <alert modal="true" name="AddFriendWithMessage" title="Add Friend">
5 <message name="message">
6Friends can give permissions to track each
7other on the map and receive online status updates.
8
9Offer friendship to [NAME]?
10 </message>
11 <editline name="editline">
12 Would you be my friend?
13 </editline>
14 <option name="Offer">
15 OK
16 </option>
17 <option name="Cancel">
18 Cancel
19 </option>
20 </alert>
21 <alert modal="true" name="RemoveFromFriends">
22 <message name="message">
23 Do you want to remove [FIRST_NAME] [LAST_NAME] from your Friends List?
24 </message>
25 <option name="Remove">
26 OK
27 </option>
28 <option name="Cancel">
29 Cancel
30 </option>
31 </alert>
32 <alert modal="true" name="RemoveMultipleFromFriends">
33 <message name="message">
34 Do you want to remove multiple friends from your Friends list?
35 </message>
36 <option name="Remove">
37 OK
38 </option>
39 <option name="Cancel">
40 Cancel
41 </option>
42 </alert>
43 <alert modal="true" name="GodDeleteAllScriptedPublicObjectsByUser">
44 <message name="message">
45 Are you sure you want to delete all scripted objects owned by
46** [AVATAR_NAME] **
47on all others land in this sim?
48 </message>
49 <option name="DELETE!!">
50 OK
51 </option>
52 <option default="true" name="Cancel">
53 Cancel
54 </option>
55 </alert>
56 <alert modal="true" name="GodDeleteAllScriptedObjectsByUser">
57 <message name="message">
58 Are you sure you want to DELETE ALL scripted objects owned by
59** [AVATAR_NAME] **
60on ALL LAND in this sim?
61 </message>
62 <option name="!!DELETEALL!!">
63 OK
64 </option>
65 <option default="true" name="Cancel">
66 Cancel
67 </option>
68 </alert>
69 <alert modal="true" name="GodDeleteAllObjectsByUser">
70 <message name="message">
71 Are you sure you want to DELETE ALL objects (scripted or not)
72owned by
73** [AVATAR_NAME] **
74on ALL LAND in this sim?
75 </message>
76 <option name="!!DELETEALL!!">
77 OK
78 </option>
79 <option default="true" name="Cancel">
80 Cancel
81 </option>
82 </alert>
83 <alert modal="true" name="PublishGroupInfoToWeb">
84 <message name="message">
85 Selecting the &quot;Publish on the Web&quot; option allows us to publish
86the group name, insignia, charter, titles, and founder on the
87[SECOND_LIFE] website. You are responsible for indicating if any
88of the above content is considered Mature according to the
89Community Standards.
90 </message>
91 </alert>
92 <alert modal="true" name="BlankClassifiedName">
93 <message name="message">
94 You must specify a name for your classified.
95 </message>
96 </alert>
97 <alert modal="true" name="MinClassifiedPrice">
98 <message name="message">
99 Price to pay for listing must be at least L$[MIN_PRICE].
100
101Please enter a higher price.
102 </message>
103 </alert>
104 <alert modal="true" name="CantLoadVertexShaders">
105 <message name="message">
106 Unable to load Vertex Shaders.
107 </message>
108 </alert>
109 <alert modal="true" name="ConfirmObjectDeleteLock">
110 <message name="message">
111 At least one of the items you have selected is locked.
112
113Are you sure you want to delete these items?
114 </message>
115 <option name="Yes">
116 OK
117 </option>
118 <option name="No">
119 Cancel
120 </option>
121 </alert>
122 <alert modal="true" name="ConfirmObjectDeleteNoCopy">
123 <message name="message">
124 At least one of the items you have selected is not copyable.
125
126Are you sure you want to delete these items?
127 </message>
128 <option name="Yes">
129 OK
130 </option>
131 <option name="No">
132 Cancel
133 </option>
134 </alert>
135 <alert modal="true" name="ConfirmObjectDeleteNoOwn">
136 <message name="message">
137 You do not own least one of the items you have selected .
138
139Are you sure you want to delete these items?
140 </message>
141 <option name="Yes">
142 OK
143 </option>
144 <option name="No">
145 Cancel
146 </option>
147 </alert>
148 <alert modal="true" name="ConfirmObjectDeleteLockNoCopy">
149 <message name="message">
150 At least one object is locked.
151At least one object is not copyable.
152
153Are you sure you want to delete these items?
154 </message>
155 <option name="Yes">
156 OK
157 </option>
158 <option name="No">
159 Cancel
160 </option>
161 </alert>
162 <alert modal="true" name="ConfirmObjectDeleteLockNoOwn">
163 <message name="message">
164 At least one object is locked.
165You do not own least one object.
166
167Are you sure you want to delete these items?
168 </message>
169 <option name="Yes">
170 OK
171 </option>
172 <option name="No">
173 Cancel
174 </option>
175 </alert>
176 <alert modal="true" name="ConfirmObjectDeleteNoCopyNoOwn">
177 <message name="message">
178 At least one object is not copyable.
179You do not own least one object.
180
181Are you sure you want to delete these items?
182 </message>
183 <option name="Yes">
184 OK
185 </option>
186 <option name="No">
187 Cancel
188 </option>
189 </alert>
190 <alert modal="true" name="ConfirmObjectDeleteLockNoCopyNoOwn">
191 <message name="message">
192 At least one object is locked.
193At least one object is not copyable.
194You do not own least one object.
195
196Are you sure you want to delete these items?
197 </message>
198 <option name="Yes">
199 OK
200 </option>
201 <option name="No">
202 cancel
203 </option>
204 </alert>
205 <alert modal="true" name="ConfirmObjectTakeLock">
206 <message name="message">
207 At least one object is locked.
208
209Are you sure you want to take these items?
210 </message>
211 <option name="Yes">
212 OK
213 </option>
214 <option default="true" name="No">
215 Cancel
216 </option>
217 </alert>
218 <alert modal="true" name="ConfirmObjectTakeNoOwn">
219 <message name="message">
220 You do not own all of the objects you are taking.
221If you continue, next owner permissions will be
222applied and possibly restrict your
223ability to modify or copy them.
224
225Are you sure you want to take these items?
226 </message>
227 <option name="Yes">
228 OK
229 </option>
230 <option default="true" name="No">
231 Cancel
232 </option>
233 </alert>
234 <alert modal="true" name="ConfirmObjectTakeLockNoOwn">
235 <message name="message">
236 At least one object is locked.
237You do not own all of the objects you are taking.
238If you continue, next owner permissions will be
239applied and possibly restrict your
240ability to modify or copy them.
241However, you can take the current selection.
242
243Are you sure you want to take these items?
244 </message>
245 <option name="Yes">
246 OK
247 </option>
248 <option default="true" name="No">
249 Cancel
250 </option>
251 </alert>
252 <alert modal="true" name="CantBuyLandAcrossMultipleRegions">
253 <message name="message">
254 Unable to buy land because selection spans multiple regions.
255
256Please select a smaller area and try again.
257 </message>
258 </alert>
259 <alert modal="true" name="DeedLandToGroup">
260 <message name="message">
261 By deeding this parcel, the group will be required
262to have and maintain sufficient land use credits.
263The purchase price of the land is not refunded to
264the owner. If a deeded parcel is sold, the sale
265price will be divided evenly among group members.
266
267Deed this [AREA] m2 of land to the group
268&apos;[GROUP_NAME]&apos;?
269 </message>
270 <option name="Deed">
271 OK
272 </option>
273 <option name="Cancel">
274 Cancel
275 </option>
276 </alert>
277 <alert modal="true" name="DeedLandToGroupWithContribution">
278 <message name="message">
279 By deeding this parcel, the group will be required
280to have and maintain sufficient land use credits.
281The deed will include a simultaneous land
282contribution to the group from &apos;[FIRST_NAME] [LAST_NAME]&apos;.
283The purchase price of the land is not refunded to
284the owner. If a deeded parcel is sold, the sale
285price will be divided evenly among group members.
286
287Deed this [AREA] m2 of land to the group
288&apos;[GROUP_NAME]&apos;?
289 </message>
290 <option name="Deed">
291 OK
292 </option>
293 <option name="Cancel">
294 Cancel
295 </option>
296 </alert>
297 <alert modal="true" name="DisplaySetToSafe">
298 <message name="message">
299 Display settings have been set to safe levels
300because you have specified the -safe option.
301 </message>
302 </alert>
303 <alert modal="true" name="DisplaySetToRecommended">
304 <message name="message">
305 Display settings have been set to recommended levels
306based on your system configuration.
307 </message>
308 </alert>
309 <alert modal="true" name="UnableToConnect">
310 <message name="message">
311 Unable to connect to server.
312Could not request domain name: [HOST_NAME]
313 </message>
314 </alert>
315 <alert modal="true" name="CanNotFindServer">
316 <message name="message">
317 Unable to find the server domain name.
318This could be the result of a lost network connection
319or a server problem.
320
321Please try again in a few minutes, or click Help
322for advice and a link to the system status web page.
323 </message>
324 <option name="OK">
325 OK
326 </option>
327 <option name="Help">
328 Help
329 </option>
330 </alert>
331 <alert modal="true" name="PleaseSelectServer">
332 <message name="message">
333 Please select a server.
334Unable to connect to [IP_ADDRESS]
335 </message>
336 </alert>
337 <alert modal="true" name="SystemMayBeDown">
338 <message name="message">
339 Unable to connect to [SECOND_LIFE]
340The system may be down.
341
342Please try again in a few minutes, or click Help
343for advice and a link to the system status web page.
344 </message>
345 <option name="OK">
346 OK
347 </option>
348 <option name="Help">
349 Help
350 </option>
351 </alert>
352 <alert modal="true" name="ErrorMessage">
353 <message name="message">
354 [ERROR_MESSAGE]
355 </message>
356 </alert>
357 <alert modal="true" name="QuickTimeOutOfDate">
358 <ignore name="ignore">
359 When QuickTime is disabled because it is out of date
360 </ignore>
361 <message name="message">
362 Streaming video has been disabled because the version of
363QuickTime installed on your system is out of date.
364
365Visit http://www.apple.com/quicktime/ and download an update.
366 </message>
367 </alert>
368 <alert modal="true" name="AvatarMoved">
369 <message name="message">
370 Your [TYPE] location is not currently available. [HELP]
371You have been moved into a nearby region.
372 </message>
373 </alert>
374 <alert modal="true" name="ClothingLoading">
375 <message name="message">
376 Your clothing is still downloading.
377You can use [SECOND_LIFE] normally and other users will see you correctly.
378 </message>
379 <ignore name="ignore">
380 When clothing is taking a long time to download
381 </ignore>
382 </alert>
383 <alert modal="true" name="FirstRun">
384 <message name="message">
385 [SECOND_LIFE] installation is complete.
386
387If this is your first time using [SECOND_LIFE], you will need to create
388an account before you can log on.
389Return to www.secondlife.com to create a new account?
390 </message>
391 <option name="NewAccount...">
392 New Account...
393 </option>
394 <option name="Continue">
395 Continue
396 </option>
397 </alert>
398 <alert modal="true" name="SetByHostFail">
399 <message name="message">
400 Unable to connect to server.
401Could not resolve domain name: [HOST_NAME]
402
403Please check your network connection.
404 </message>
405 </alert>
406 <alert modal="true" name="LoginPacketNeverReceived">
407 <message name="message">
408 We&apos;re having trouble connecting. There may be a problem with your internet connection or the Second Life servers.
409
410You can either check your internet connection and try again in a few minutes, click Help to connect to our support site, or click Teleport to attempt to teleport home.
411 </message>
412 <option name="OK">
413 OK
414 </option>
415 <option name="Help">
416 Help
417 </option>
418 <option name="Teleport">
419 Teleport
420 </option>
421 </alert>
422 <alert modal="true" name="WelcomeNoClothes">
423 <message name="message">
424 Your character will appear in a moment.
425
426Use arrow keys to walk.
427Press the F1 key at any time for help or
428to learn more about [SECOND_LIFE].
429 </message>
430 </alert>
431 <alert modal="true" name="WelcomeChooseSex" nodefault="true">
432 <message name="message">
433 Your character will appear in a moment.
434
435Use arrow keys to walk.
436Press the F1 key at any time for help or
437to learn more about [SECOND_LIFE].
438Please choose the male or female avatar.
439You can change your mind later.
440 </message>
441 <option name="Male">
442 Male
443 </option>
444 <option name="Female">
445 Female
446 </option>
447 </alert>
448 <alert modal="true" name="NotEnoughCurrency">
449 <message name="message">
450 [NAME] L$ [PRICE] You don&apos;t have enough L$ to do that.
451 </message>
452 </alert>
453 <alert modal="true" name="GrantedModifyRights">
454 <message name="message">
455 You have been granted the privilege to modify [FIRST_NAME] [LAST_NAME]&apos;s objects.
456 </message>
457 </alert>
458 <alert modal="true" name="RevokedModifyRights">
459 <message name="message">
460 Your privilege to modify [FIRST_NAME] [LAST_NAME]&apos;s objects has been revoked
461 </message>
462 </alert>
463 <alert modal="true" name="FlushMapVisibilityCaches">
464 <message name="message">
465 This will flush the map caches on this region.
466This is really only useful for debugging.
467(In production, wait 5 minutes, then everyone&apos;s map will
468update after they relog.)
469 </message>
470 <option name="OK">
471 OK
472 </option>
473 <option name="Cancel">
474 Cancel
475 </option>
476 </alert>
477 <alert modal="true" name="OnlyCopyContentsOfSingleItem">
478 <message name="message">
479 Unable to copy the contents of more than one item at a time.
480Please select only one object and try again.
481 </message>
482 <option name="OK">
483 OK
484 </option>
485 <option name="Cancel">
486 Cancel
487 </option>
488 </alert>
489 <alert modal="true" name="KickUsersFromRegion">
490 <message name="message">
491 Teleport all Residents in this region home?
492 </message>
493 <option name="OK">
494 OK
495 </option>
496 <option name="Cancel">
497 Cancel
498 </option>
499 </alert>
500 <alert modal="true" name="EstateObjectReturn">
501 <message name="message">
502 Are you sure you want to return objects owned by
503[USER_NAME] ?
504 </message>
505 <option name="Return">
506 OK
507 </option>
508 <option default="true" name="Cancel">
509 Cancel
510 </option>
511 </alert>
512 <alert modal="true" name="InvalidTerrainBitDepth">
513 <message name="message">
514 Couldn&apos;t set region textures:
515Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].
516
517Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image
518then click &quot;Apply&quot; again.
519 </message>
520 </alert>
521 <alert modal="true" name="InvalidTerrainSize">
522 <message name="message">
523 Couldn&apos;t set region textures:
524Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
525
526Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image
527then click &quot;Apply&quot; again.
528 </message>
529 </alert>
530 <alert modal="true" name="RawUploadStarted">
531 <message name="message">
532 Upload started. It may take up to two minutes,
533depending on your connection speed.
534 </message>
535 </alert>
536 <alert modal="true" name="ConfirmBakeTerrain">
537 <message name="message">
538 Do you really want to bake the current terrain,
539make it the center for terrain raise/lower limits
540and the default for the &apos;Revert&apos; tool?
541 </message>
542 <option name="Bake">
543 OK
544 </option>
545 <option name="Cancel">
546 Cancel
547 </option>
548 </alert>
549 <alert modal="true" name="MaxAllowedAgentOnRegion">
550 <message name="message">
551 You can only have [MAX_AGENTS] Allowed Residents.
552 </message>
553 </alert>
554 <alert modal="true" name="MaxBannedAgentsOnRegion">
555 <message name="message">
556 You can only have [MAX_BANNED] Banned Residents.
557 </message>
558 </alert>
559 <alert modal="true" name="MaxAgentOnRegionBatch">
560 <message name="message">
561 Failure while attempting to add [NUM_ADDED] agents:
562Exceeds the [MAX_AGENTS] [LIST_TYPE] limit by [NUM_EXCESS].
563 </message>
564 </alert>
565
566 <alert modal="true" name="MaxAllowedGroupsOnRegion">
567 <message name="message">
568 You can only have [MAX_GROUPS] Allowed Groups.
569 </message>
570 <option name="Bake">
571 Bake
572 </option>
573 <option name="Cancel">
574 Cancel
575 </option>
576 </alert>
577 <alert modal="true" name="MaxManagersOnRegion">
578 <message name="message">
579 You can only have [MAX_MANAGER] Estate Managers.
580 </message>
581 </alert>
582 <alert modal="true" name="OwnerCanNotBeDenied">
583 <message name="message">
584 Can&apos;t add estate owner to estate &apos;Banned Resident&apos; list.
585 </message>
586 </alert>
587 <alert modal="true" name="CanNotChangeAppearanceUntilLoaded">
588 <message name="message">
589 Can&apos;t change appearance until clothing and shape are loaded.
590 </message>
591 </alert>
592 <alert modal="true" name="ClassifiedMustBeAlphanumeric">
593 <message name="message">
594 The name of your classified must start with a letter
595from A to Z or a number. No punctuation is allowed.
596 </message>
597 </alert>
598 <alert modal="true" name="CantSetBuyObject">
599 <message name="message">
600 Can&apos;t set Buy Object, because the object is not for sale.
601Please set the object for sale and try again.
602 </message>
603 </alert>
604 <alert modal="true" name="FinishedRawDownload">
605 <message name="message">
606 Finished download of raw terrain file to:
607[DOWNLOAD_PATH].
608 </message>
609 </alert>
610 <alert modal="true" name="DownloadWindowsMandatory">
611 <message name="message">
612 A new version of [SECOND_LIFE] is available.
613[MESSAGE]
614You must download this update to use [SECOND_LIFE].
615 </message>
616 <option name="Download">
617 Download
618 </option>
619 <option name="Quit">
620 Quit
621 </option>
622 </alert>
623 <alert modal="true" name="DownloadWindows">
624 <message name="message">
625 An updated version of [SECOND_LIFE] is available.
626[MESSAGE]
627This update is not required, but we suggest you install it to improve performance and stability.
628 </message>
629 <option name="Download">
630 Download
631 </option>
632 <option default="true" name="Continue">
633 Continue
634 </option>
635 </alert>
636 <alert modal="true" name="DownloadWindowsReleaseForDownload">
637 <message name="message">
638 An updated version of [SECOND_LIFE] is available.
639[MESSAGE]
640This update is not required, but we suggest you install it to improve performance and stability.
641 </message>
642 <option name="Download">
643 Download
644 </option>
645 <option name="Continue">
646 Continue
647 </option>
648 </alert>
649 <alert modal="true" name="DownloadMacMandatory">
650 <message name="message">
651 A new version of [SECOND_LIFE] is available.
652[MESSAGE]
653You must download this update to use [SECOND_LIFE].
654
655Download to your Applications folder?
656 </message>
657 <option name="Download">
658 Download
659 </option>
660 <option name="Quit">
661 Quit
662 </option>
663 </alert>
664 <alert modal="true" name="DownloadMac">
665 <message name="message">
666 An updated version of [SECOND_LIFE] is available.
667[MESSAGE]
668This update is not required, but we suggest you install it to improve performance and stability.
669
670Download to your Applications folder?
671 </message>
672 <option name="Download">
673 Download
674 </option>
675 <option default="true" name="Continue">
676 Continue
677 </option>
678 </alert>
679 <alert modal="true" name="DownloadMacReleaseForDownload">
680 <message name="message">
681 An updated version of [SECOND_LIFE] is available.
682[MESSAGE]
683This update is not required, but we suggest you install it to improve performance and stability.
684
685Download to your Applications folder?
686 </message>
687 <option name="Download">
688 Download
689 </option>
690 <option name="Continue">
691 Continue
692 </option>
693 </alert>
694 <alert modal="true" name="DeedObjectToGroup">
695 <message name="message">
696 Deeding this object will cause the group to:
697* Receive L$ paid into the object
698 </message>
699 <ignore name="ignore">
700 When deeding objects to groups
701 </ignore>
702 <option name="Deed">
703 Deed
704 </option>
705 <option name="Cancel">
706 Cancel
707 </option>
708 </alert>
709 <alert modal="true" name="WebLaunchExternalTarget">
710 <message name="message">
711 Open your system Web browser to view this content?
712 </message>
713 <ignore name="ignore">
714 When opening your system browser to view a Web page
715 </ignore>
716 <option name="Open">
717 OK
718 </option>
719 <option name="Cancel">
720 Cancel
721 </option>
722 </alert>
723 <alert modal="true" name="WebLaunchJoinNow">
724 <message name="message">
725 Go to www.secondlife.com to manage your account?
726 </message>
727 <ignore name="ignore">
728 When launching web browser to manage your account
729 </ignore>
730 <option name="OK">
731 OK
732 </option>
733 <option name="Cancel">
734 Cancel
735 </option>
736 </alert>
737 <alert modal="true" name="WebLaunchBugReport101">
738 <message name="message">
739 Visit the [SECOND_LIFE] Wiki and Learn how to Report Bugs Correctly.
740 </message>
741 <ignore name="ignore">
742 When launching web browser to view the Bug Reporting 101 Wiki
743 </ignore>
744 <option name="Gotopage">
745 OK
746 </option>
747 <option name="Cancel">
748 Cancel
749 </option>
750 </alert>
751 <alert modal="true" name="WebLaunchSecurityIssues">
752 <message name="message">
753 Visit the [SECOND_LIFE] Wiki for Details of How to Report a Security Issue.
754 </message>
755 <ignore name="ignore">
756 When launching web browser to view Security Issues Wiki
757 </ignore>
758 <option name="Gotopage">
759 OK
760 </option>
761 <option name="Cancel">
762 Cancel
763 </option>
764 </alert>
765 <alert modal="true" name="WebLaunchQAWiki">
766 <message name="message">
767 Visit the [SECOND_LIFE] QA Wiki.
768 </message>
769 <ignore name="ignore">
770 When launching web browser to view the QA Wiki
771 </ignore>
772 <option name="Gotopage">
773 OK
774 </option>
775 <option name="Cancel">
776 Cancel
777 </option>
778 </alert>
779 <alert modal="true" name="WebLaunchPublicIssue">
780 <message name="message">
781 Visit the [SECOND_LIFE] Public Issue Tracker, Where you can Report Bugs and other Issues.
782 </message>
783 <ignore name="ignore">
784 When launching web browser to view the Public Issue Tracker
785 </ignore>
786 <option name="Gotopage">
787 Go to page
788 </option>
789 <option name="Cancel">
790 Cancel
791 </option>
792 </alert>
793 <alert modal="true" name="WebLaunchPublicIssueHelp">
794 <message name="message">
795 Visit the [SECOND_LIFE] Wiki for info on how to use the Public Issue Tracker.
796 </message>
797 <ignore name="ignore">
798 When launching web browser to view Public Issue Tracker Wiki
799 </ignore>
800 <option name="Gotopage">
801 Go to page
802 </option>
803 <option name="Cancel">
804 Cancel
805 </option>
806 </alert>
807 <alert modal="true" name="WebLaunchForums">
808 <message name="message">
809 Search the [SECOND_LIFE] Knowledge Base for the latest tips and tricks.
810 </message>
811 <ignore name="ignore">
812 When launching web browser to view the knowledge base
813 </ignore>
814 <option name="Gotopage">
815 OK
816 </option>
817 <option name="Cancel">
818 Cancel
819 </option>
820 </alert>
821 <alert modal="true" name="WebLaunchSupport">
822 <message name="message">
823 Contact [SECOND_LIFE] Support.
824 </message>
825 <ignore name="ignore">
826 When launching web browser to contact support
827 </ignore>
828 <option name="Gotopage">
829 OK
830 </option>
831 <option name="Cancel">
832 Cancel
833 </option>
834 </alert>
835 <alert modal="true" name="WebLaunchImprudenceBlog">
836 <message name="message">
837 Go to the Official Imprudence Blog, for the Latest News and Information.
838 </message>
839 <ignore name="ignore">
840 When launching web browser to view the blog
841 </ignore>
842 <option name="Gotopage">
843 OK
844 </option>
845 <option name="Cancel">
846 Cancel
847 </option>
848 </alert>
849 <alert modal="true" name="WebLaunchImprudenceForums">
850 <message name="message">
851 Go to the Official Imprudence Forums to discuss the Imprudence Project.
852 </message>
853 <ignore name="ignore">
854 When launching web browser to view the forums
855 </ignore>
856 <option name="Gotopage">
857 OK
858 </option>
859 <option name="Cancel">
860 Cancel
861 </option>
862 </alert>
863 <alert modal="true" name="WebLaunchLSLGuide">
864 <message name="message">
865 Go to the Scripting Guide for scripting help?
866 </message>
867 <ignore name="ignore">
868 When launching web browser to view the Scripting Guide
869 </ignore>
870 <option name="Gotopage">
871 OK
872 </option>
873 <option name="Cancel">
874 Cancel
875 </option>
876 </alert>
877 <alert modal="true" name="WebLaunchLSLWiki">
878 <message name="message">
879 Go to the LSL Portal for scripting help?
880 </message>
881 <ignore name="ignore">
882 When launching web browser to view the LSL Portal
883 </ignore>
884 <option name="Gotopage">
885 Go to page
886 </option>
887 <option name="Cancel">
888 Cancel
889 </option>
890 </alert>
891 <alert modal="true" name="ReturnToOwner">
892 <message name="message">
893 Are you sure you want to return the selected
894objects to their owners? Transferable deeded
895objects will be returned to their previous owners.
896
897*WARNING* No-transfer deeded objects will be deleted!
898 </message>
899 <ignore name="ignore">
900 When returning objects to their owners
901 </ignore>
902 <option name="Return">
903 OK
904 </option>
905 <option name="Cancel">
906 Cancel
907 </option>
908 </alert>
909 <alert name="GroupLeaveConfirmOfficer">
910 <message name="message">
911 You are currently an officer of the group [GROUP].
912Leave Group?
913 </message>
914 <option name="Leave">
915 OK
916 </option>
917 <option name="Cancel">
918 Cancel
919 </option>
920 </alert>
921 <alert name="GroupLeaveConfirmMember">
922 <message name="message">
923 You are currently a member of the group [GROUP].
924Leave Group?
925 </message>
926 <option name="Leave">
927 OK
928 </option>
929 <option name="Cancel">
930 Cancel
931 </option>
932 </alert>
933 <alert name="ConfirmKick" unique="true">
934 <message name="message">
935 Do you REALLY want to kick all users off the grid?
936 </message>
937 <option name="Kick">
938 Kick All Users
939 </option>
940 <option name="Cancel">
941 Cancel
942 </option>
943 </alert>
944 <alert modal="true" name="MuteLinden">
945 <message name="message">
946 Sorry, you cannot mute a Linden.
947 </message>
948 <option name="OK">
949 OK
950 </option>
951 </alert>
952 <alert modal="true" name="MuteByNameFailed" title="Mute object by name failed">
953 <message name="message">
954 You already have muted this name.
955 </message>
956 <option name="OK">
957 OK
958 </option>
959 </alert>
960 <alert name="RemoveItemWarn">
961 <message name="message">
962 Though permitted, deleting contents may damage the
963object. Do you want to delete that item?
964 </message>
965 <option name="Yes">
966 OK
967 </option>
968 <option default="true" name="No">
969 Cancel
970 </option>
971 </alert>
972 <alert name="CantRateOwnedByGroup">
973 <message name="message">
974 Can&apos;t rate this object&apos;s owner, object is owned by a group.
975 </message>
976 <option name="OK">
977 OK
978 </option>
979 </alert>
980 <alert name="CantOfferCallingCard">
981 <message name="message">
982 Cannot offer a calling card at this time. Please try again in a moment.
983 </message>
984 <option name="OK">
985 OK
986 </option>
987 </alert>
988 <alert name="CantOfferFriendship">
989 <message name="message">
990 Cannot offer friendship at this time. Please try again in a moment.
991 </message>
992 <option name="OK">
993 OK
994 </option>
995 </alert>
996 <alert name="CantSetHome">
997 <message name="message">
998 Can&apos;t set home to here.
999 </message>
1000 <option name="OK">
1001 OK
1002 </option>
1003 </alert>
1004 <alert name="BusyModeSet">
1005 <message name="message">
1006 Busy mode set.
1007Chat and instant messages will be hidden. Instant
1008messages will get your Busy mode response. All teleportation
1009offers will be declined. All inventory offers will go to your
1010Trash.
1011 </message>
1012 <ignore name="ignore">
1013 When setting busy mode
1014 </ignore>
1015 <option name="OK">
1016 OK
1017 </option>
1018 </alert>
1019 <alert name="NoPVPDetected">
1020 <message name="message">
1021 No player vs. player (PvP) abuse detected
1022 </message>
1023 <option name="OK">
1024 OK
1025 </option>
1026 </alert>
1027 <alert name="NotecardAttachPermFail">
1028 <message name="message">
1029 Only items with unrestricted &apos;next owner&apos; permissions
1030can be attached to notecards.
1031 </message>
1032 <option name="OK">
1033 OK
1034 </option>
1035 </alert>
1036 <alert name="JoinedTooManyGroupsMember">
1037 <message name="message">
1038 You are a member of too many groups to join
1039another one. Please leave at least one group
1040before joining this one, or decline the offer.
1041To leave a group select the &apos;Groups..&apos; option
1042from the &apos;Edit&apos; menu.
1043[NAME] has invited you to join a group as a member.
1044[INVITE]
1045 </message>
1046 <option name="Join">
1047 Join
1048 </option>
1049 <option name="Decline">
1050 Decline
1051 </option>
1052 </alert>
1053 <alert name="JoinedTooManyGroupsOfficer">
1054 <message name="message">
1055 You are a member of too many groups to join
1056another one. Please leave at least one group
1057before joining this one, or decline the offer.
1058To leave a group select the &apos;Groups..&apos; option
1059from the &apos;Edit&apos; menu.
1060[NAME] has invited you to join a group as an officer.
1061[INVITE]
1062 </message>
1063 <option name="Join">
1064 Join
1065 </option>
1066 <option name="Decline">
1067 Decline
1068 </option>
1069 </alert>
1070 <alert name="KickUser">
1071 <message name="message">
1072 Kick this user with what message?
1073 </message>
1074 <editline name="editline">
1075 An administrator has logged you off.
1076 </editline>
1077 <option name="OK">
1078 OK
1079 </option>
1080 <option name="Cancel">
1081 Cancel
1082 </option>
1083 </alert>
1084 <alert name="KickAllUsers">
1085 <message name="message">
1086 Kick everyone currently on the grid with what message?
1087 </message>
1088 <editline name="editline">
1089 An administrator has logged you off.
1090 </editline>
1091 <option name="OK">
1092 OK
1093 </option>
1094 <option name="Cancel">
1095 Cancel
1096 </option>
1097 </alert>
1098 <alert name="FreezeUser">
1099 <message name="message">
1100 Freeze this user with what message?
1101 </message>
1102 <editline name="editline">
1103 You have been frozen. You cannot move or chat. An administrator will contact you via instant message (IM).
1104 </editline>
1105 <option name="OK">
1106 OK
1107 </option>
1108 <option name="Cancel">
1109 Cancel
1110 </option>
1111 </alert>
1112 <alert name="UnFreezeUser">
1113 <message name="message">
1114 Unfreeze this user with what message?
1115 </message>
1116 <editline name="editline">
1117 You are no longer frozen.
1118 </editline>
1119 <option name="OK">
1120 OK
1121 </option>
1122 <option name="Cancel">
1123 Cancel
1124 </option>
1125 </alert>
1126 <alert name="ExpungeUser">
1127 <message name="message">
1128 Enter the agent id of a user to expunge
1129 </message>
1130 <editline />
1131 <option name="OK">
1132 OK
1133 </option>
1134 <option name="Cancel">
1135 Cancel
1136 </option>
1137 </alert>
1138 <alert modal="true" name="OfferTeleport">
1139 <message name="message">
1140 Offer a teleport to your location with the following message?
1141 </message>
1142 <editline name="editline">
1143 Join me in [REGION]
1144 </editline>
1145 <option name="OK">
1146 OK
1147 </option>
1148 <option name="Cancel">
1149 Cancel
1150 </option>
1151 </alert>
1152 <alert modal="true" name="OfferTeleportFromGod">
1153 <message name="message">
1154 God summon user to your location?
1155 </message>
1156 <editline name="editline">
1157 Join me in [REGION]
1158 </editline>
1159 <option name="OK">
1160 OK
1161 </option>
1162 <option name="Cancel">
1163 Cancel
1164 </option>
1165 </alert>
1166 <alert modal="true" name="TeleportFromLandmark">
1167 <message name="message">
1168 Are you sure you want to teleport?
1169 </message>
1170 <ignore name="ignore">
1171 When teleporting from a landmark in inventory
1172 </ignore>
1173 <option name="Teleport">
1174 Teleport
1175 </option>
1176 <option name="Cancel">
1177 Cancel
1178 </option>
1179 </alert>
1180 <alert name="MessageEstate" title="Message everyone in your Estate">
1181 <message name="message">
1182 Type a short announcement which will be
1183sent to everyone currently in your estate.
1184 </message>
1185 <editline name="editline" />
1186 <option name="OK">
1187 OK
1188 </option>
1189 <option name="Cancel">
1190 Cancel
1191 </option>
1192 </alert>
1193 <alert name="ChangeLindenEstate" title="Change Linden Estate">
1194 <message name="message">
1195 You are about to change a Linden owned estate (mainland,
1196teen grid, orientation, etc.).
1197
1198This is EXTREMELY DANGEROUS because it can fundamentally
1199affect the user experience. On the mainland, it will change
1200thousands of regions and make the spaceserver hiccup.
1201
1202Proceed?
1203 </message>
1204 <option name="ChangeEstate">
1205 OK
1206 </option>
1207 <option name="Cancel">
1208 Cancel
1209 </option>
1210 </alert>
1211 <alert name="ChangeLindenAccess" title="Change Linden Estate Access">
1212 <message name="message">
1213 You are about to change the access list for a Linden owned
1214estate (mainland, teen grid, orientation, etc.).
1215
1216This is DANGEROUS and should only be done to invoke the
1217hack allowing objects/L$ to be transfered in/out of
1218a grid.
1219It will change thousands of regions and make the
1220spaceserver hiccup.
1221 </message>
1222 <option name="ChangeEstate">
1223 OK
1224 </option>
1225 <option name="Cancel">
1226 Cancel
1227 </option>
1228 </alert>
1229 <alert name="EstateAllowedAgentAdd" title="Select estate">
1230 <message name="message">
1231 Add to allowed list for this estate only or for [ALL_ESTATES]?
1232 </message>
1233 <option name="ThisEstate">
1234 This Estate
1235 </option>
1236 <option name="AllEstates">
1237 All Estates
1238 </option>
1239 <option name="Cancel">
1240 Cancel
1241 </option>
1242 </alert>
1243 <alert name="EstateAllowedAgentRemove" title="Select estate">
1244 <message name="message">
1245 Remove from allowed list for this estate only or for [ALL_ESTATES]?
1246 </message>
1247 <option name="ThisEstate">
1248 This Estate
1249 </option>
1250 <option name="AllEstates">
1251 All Estates
1252 </option>
1253 <option name="Cancel">
1254 Cancel
1255 </option>
1256 </alert>
1257 <alert name="EstateAllowedGroupAdd" title="Select estate">
1258 <message name="message">
1259 Add to group allowed list for this estate only or for [ALL_ESTATES]?
1260 </message>
1261 <option name="ThisEstate">
1262 This Estate
1263 </option>
1264 <option name="AllEstates">
1265 All Estates
1266 </option>
1267 <option name="Cancel">
1268 Cancel
1269 </option>
1270 </alert>
1271 <alert name="EstateAllowedGroupRemove" title="Select estate">
1272 <message name="message">
1273 Remove from group allowed list for this estate only or [ALL_ESTATES]?
1274 </message>
1275 <option name="ThisEstate">
1276 This Estate
1277 </option>
1278 <option name="AllEstates">
1279 All Estates
1280 </option>
1281 <option name="Cancel">
1282 Cancel
1283 </option>
1284 </alert>
1285 <alert name="EstateBannedAgentAdd" title="Select estate">
1286 <message name="message">
1287 Deny access for this estate only or for [ALL_ESTATES]?
1288 </message>
1289 <option name="ThisEstate">
1290 This Estate
1291 </option>
1292 <option name="AllEstates">
1293 All Estates
1294 </option>
1295 <option name="Cancel">
1296 Cancel
1297 </option>
1298 </alert>
1299 <alert name="EstateBannedAgentRemove" title="Select estate">
1300 <message name="message">
1301 Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]?
1302 </message>
1303 <option name="ThisEstate">
1304 This Estate
1305 </option>
1306 <option name="AllEstates">
1307 All Estates
1308 </option>
1309 <option name="Cancel">
1310 Cancel
1311 </option>
1312 </alert>
1313 <alert name="EstateManagerAdd" title="Select estate">
1314 <message name="message">
1315 Add estate manager for this estate only or for [ALL_ESTATES]?
1316 </message>
1317 <option name="ThisEstate">
1318 This Estate
1319 </option>
1320 <option name="AllEstates">
1321 All Estates
1322 </option>
1323 <option name="Cancel">
1324 Cancel
1325 </option>
1326 </alert>
1327 <alert name="EstateManagerRemove" title="Select estate">
1328 <message name="message">
1329 Remove estate manager for this estate only or for [ALL_ESTATES]?
1330 </message>
1331 <option name="ThisEstate">
1332 This Estate
1333 </option>
1334 <option name="AllEstates">
1335 All Estates
1336 </option>
1337 <option name="Cancel">
1338 Cancel
1339 </option>
1340 </alert>
1341 <alert name="EstateCovenantChange" title="Select estate">
1342 <message name="message">
1343 Change Covenant Message for this estate only or for [ALL_ESTATES]?
1344 </message>
1345 <option name="ThisEstate">
1346 This Estate
1347 </option>
1348 <option name="AllEstates">
1349 All Estates
1350 </option>
1351 <option name="Cancel">
1352 Cancel
1353 </option>
1354 </alert>
1355 <alert name="EstateKickUser" title="Confirm Kick">
1356 <message name="message">
1357 Kick [EVIL_USER] from this estate?
1358 </message>
1359 <option name="Kick">
1360 OK
1361 </option>
1362 <option name="Cancel">
1363 Cancel
1364 </option>
1365 </alert>
1366 <alert modal="true" name="EstateChangeCovenant">
1367 <message name="message">
1368 Are you sure you want to change the Estate Covenant?
1369 </message>
1370 <option name="Change">
1371 OK
1372 </option>
1373 <option name="Cancel">
1374 Cancel
1375 </option>
1376 </alert>
1377 <alert modal="true" name="ProblemImportingEstateCovenant">
1378 <message name="message">
1379 Problem importing estate covenant.
1380 </message>
1381 <option name="OK">
1382 OK
1383 </option>
1384 </alert>
1385 <alert modal="true" name="ProblemAddingEstateManager">
1386 <message name="message">
1387 Problems adding a new estate manager. One or more estates may have a full manager list.
1388 </message>
1389 </alert>
1390 <alert modal="true" name="ProblemAddingEstateGeneric">
1391 <message name="message">
1392 Problems adding to this estate list. One or more estates may have a full list.
1393 </message>
1394 </alert>
1395 <alert modal="true" name="UnableToLoadNotecard">
1396 <message name="message">
1397 Unable to load notecard&apos;s asset at this time.
1398 </message>
1399 <option name="OK">
1400 OK
1401 </option>
1402 </alert>
1403 <alert modal="true" name="NotAllowedToViewNotecard">
1404 <message name="message">
1405 Insufficient permissions to view notecard associated with asset ID requested.
1406 </message>
1407 <option name="OK">
1408 OK
1409 </option>
1410 </alert>
1411 <alert modal="true" name="MissingNotecardAssetID">
1412 <message name="message">
1413 Asset ID for notecard is missing from database.
1414 </message>
1415 <option name="OK">
1416 OK
1417 </option>
1418 </alert>
1419 <alert name="PublishClassified">
1420 <message name="message">
1421 Remember: Classified ad fees are non-refundable.
1422
1423Publish this classified now for L$[AMOUNT]?
1424 </message>
1425 <option name="Publish">
1426 OK
1427 </option>
1428 <option name="Cancel">
1429 Cancel
1430 </option>
1431 </alert>
1432 <alert name="SetClassifiedMature">
1433 <message name="message">
1434Does this classified contain Mature content?
1435 </message>
1436 <option name="Mature">
1437 Yes
1438 </option>
1439 <option name="Not Mature">
1440 No
1441 </option>
1442 <option name="Cancel">
1443 Cancel
1444 </option>
1445 </alert>
1446 <alert name="SetGroupMature">
1447 <message name="message">
1448Does this group contain Mature content?
1449 </message>
1450 <option name="Mature">
1451 Yes
1452 </option>
1453 <option name="Not Mature">
1454 No
1455 </option>
1456 <option name="Cancel">
1457 Cancel
1458 </option>
1459 </alert>
1460 <alert name="ConfirmRestart" title="Confirm restart">
1461 <message name="message">
1462 Do you really want to restart this region in 2 minutes?
1463 </message>
1464 <option name="Restart">
1465 OK
1466 </option>
1467 <option name="Cancel">
1468 Cancel
1469 </option>
1470 </alert>
1471 <alert name="MessageRegion" title="Message everyone in this region">
1472 <message name="message">
1473 Type a short announcement which will be
1474sent to everyone in this region.
1475 </message>
1476 <editline name="editline" />
1477 <option name="OK">
1478 OK
1479 </option>
1480 <option name="Cancel">
1481 Cancel
1482 </option>
1483 </alert>
1484 <alert modal="true" name="HelpRegionBlockTerraform" title="Block Terraform">
1485 <message name="message">
1486 If this box is checked, land owners will not be able to terraform
1487their land regardless of the per-parcel &apos;Edit Terrain&apos; setting.
1488
1489Default: off
1490 </message>
1491 </alert>
1492 <alert modal="true" name="HelpRegionBlockFly" title="Block Fly">
1493 <message name="message">
1494 If this box is checked, people will not be able to fly in this region
1495regardless of the per-parcel &apos;Fly&apos; setting.
1496
1497Default: off
1498 </message>
1499 </alert>
1500 <alert modal="true" name="HelpRegionAllowDamage" title="Allow Damage">
1501 <message name="message">
1502 If this box is checked, the health system across all parcels
1503regardless of individual parcel settings. If this box is left
1504unchecked, individual parcel owners will still be able to
1505activate the health system on their parcels.
1506
1507Default: off
1508 </message>
1509 </alert>
1510 <alert modal="true" name="HelpRegionAgentLimit" title="Agent Limit">
1511 <message name="message">
1512 Sets the maximum number of avatars allowed in this region.
1513Performance may vary depending on the
1514number avatars present.
1515
1516Default: 40
1517 </message>
1518 </alert>
1519 <alert modal="true" name="HelpRegionObjectBonus" title="Object Bonus">
1520 <message name="message">
1521 The Object Bonus is a multiplier for primitives allowed on any given
1522parcel. The range allowed is 1 to 10. Set at &apos;1&apos;, each 512m2 parcel
1523is allowed 117 objects. Set at &apos;2&apos;, each 512m2 parcel is
1524allowed 234, or twice as many, and so on. The max number of objects
1525allowed per region remains 15,000 no matter what the
1526Object Bonus is. Once set, be aware that lowering the Object Bonus may cause objects to be returned or deleted.
1527
1528Default: 1.0
1529 </message>
1530 </alert>
1531 <alert modal="true" name="HelpRegionMaturity" title="Maturity">
1532 <message name="message">
1533 Sets the maturity of the region, as shown at the top
1534 of the screen and in pop-up tips on the map. This setting
1535also affects search results - Residents can choose not to find
1536content in Mature regions.
1537
1538It may take some time for this change to be reflected
1539on the map.
1540
1541Default: PG
1542 </message>
1543 </alert>
1544 <alert modal="true" name="HelpRegionRestrictPushObject" title="Restrict Pushing">
1545 <message name="message">
1546 This checkbox sets the full region to restricted push permissions.
1547When enabled, Residents may only be pushed by themselves
1548or by the parcel&apos;s owner.
1549(Push refers to the llPushObject() LSL function.)
1550
1551Default: Off
1552 </message>
1553 </alert>
1554 <alert modal="true" name="HelpParcelChanges" title="Parcel Join/Subdivide">
1555 <message name="message">
1556 This checkbox sets whether or not parcels not owned by the estate owner
1557can be joined or subdivided.
1558If this option is unchecked:
1559 * Only estate owners or managers can join or subdivide parcels.
1560 * They may only join or subdivide parcels belonging to the owner,
1561 or to a group where they have the appropriate group powers.
1562If this option is checked:
1563 * All parcel owners can join or subdivide the parcels they own.
1564 * For group owned parcels, those with appropriate group powers
1565 may join or subdivide parcels.
1566
1567Default: Checked
1568 </message>
1569 </alert>
1570 <alert modal="true" name="HelpRegionSearch" title="Do Not Show In Search">
1571 <message name="message">
1572 Checking this box will block parcel owners from listing their parcels in search
1573Default: Off
1574 </message>
1575 </alert>
1576 <alert modal="true" name="HelpParcelSearch" title="Do Not Show In Search">
1577 <message name="message">
1578 Checking this box will show:
1579- this parcel in search results
1580- this parcel&apos;s public objects
1581 </message>
1582 </alert>
1583 <alert modal="true" name="RegionMaturityChange" title="Changed Region Maturity">
1584 <message name="message">
1585 The maturity rating for this region has been updated.
1586It may take some time for the change to be
1587reflected on the map.
1588 </message>
1589 </alert>
1590 <alert modal="true" name="HelpRegionLandResell" title="Land Resale">
1591 <message name="message">
1592 Estate owners and managers can sell any land owned by the estate owner.
1593If this option is left unchecked, buyers cannot resell their land in this region.
1594If this option is checked, buyers can resell their land in this region.
1595
1596Default: Disallow
1597 </message>
1598 </alert>
1599 <alert modal="true" name="HelpEstateCovenantID" title="Covenant Asset ID">
1600 <message name="message">
1601 Sets the notecard asset ID for the Estate Covenant belonging to this
1602estate.
1603
1604Default: 00000000-0000-0000-0000-000000000000 or none
1605 </message>
1606 </alert>
1607 <alert modal="true" name="HelpRegionDisableScripts" title="Disable Scripts">
1608 <message name="message">
1609 When sim performance is poor, a script may be to blame. Open the
1610Statistics Bar (Ctrl-Shift-1). Look at the Simulator Physics FPS.
1611If it is lower than 45, open the Time panel located at the
1612bottom of the Stats Bar. If Script Time reads 25 ms or higher, click
1613the Get Top Scripts button. You will be given the name and location
1614of scripts that may be causing poor performance.
1615
1616Checking the Disable Scripts box and then pressing the Apply
1617button will temporarily disable all scripts in this region. You may
1618need to do this in order to travel to the location of a noted
1619&apos;top script&apos;. Once you have arrived at the location, investigate the
1620script to determine if it is causing the problem. You may want to
1621contact the owner of the script or delete or return the object.
1622Uncheck the Disable Script box and then Apply to reactivate
1623the scripts in the region.
1624
1625Default: off
1626 </message>
1627 </alert>
1628 <alert modal="true" name="HelpRegionDisableCollisions" title="Disable Collisions">
1629 <message name="message">
1630 When sim performance is poor, physical objects may be to blame.
1631Open the Statistics Bar (Ctrl-Shift-1). Look at the Simulator
1632Physics FPS. If it is lower than 45, open the Time panel
1633located at the bottom of the Stats Bar. If Sim Time (Physics)
1634reads 20 ms or higher, click the Get Top Colliders button.
1635You will be given the name and location of physical objects
1636that may be causing poor performance.
1637
1638Checking the Disable Collisions box and then pressing the Apply
1639button will temporarily disable object-object collisions. You may
1640need to do this in order to travel to the location of a noted
1641&apos;top collider&apos;. Once you have arrived at the location, investigate the
1642object - is it constantly colliding with other objects? You may want to
1643contact the owner of the object or delete or return the object.
1644Uncheck the Disable Collisions box and then Apply to reactivate
1645collisions in the region.
1646
1647Default: off
1648 </message>
1649 </alert>
1650 <alert modal="true" name="HelpRegionDisablePhysics" title="Disable Physics">
1651 <message name="message">
1652 Disable Physics is similar to Disable Collisions, except all
1653physics simulation is disabled. This means that not only will
1654objects stop colliding, but avatars will be unable to move.
1655
1656This should only be used when Disable Collisions does not
1657give back enough performance to the region to investigate
1658a physics problem or Top Collider.
1659
1660Be sure to re-enable physics when you are done, or avatars
1661will continue to be unable to move.
1662
1663Default: off
1664 </message>
1665 </alert>
1666 <alert modal="true" name="HelpRegionTopColliders" title="Top Colliders">
1667 <message name="message">
1668 Show a list of objects experiencing the greatest number
1669of potential object-object collisions. These objects can
1670slow performance. Select View &gt; Statistics Bar and
1671look under Simulator &gt; Time &gt; Sim Time (Physics) to see
1672if more than 20 ms is being spent in physics.
1673 </message>
1674 </alert>
1675 <alert modal="true" name="HelpRegionTopScripts" title="Top Scripts">
1676 <message name="message">
1677 Show a list of objects spending the most time running
1678LSL scripts. These objects can slow performance.
1679Select View &gt; Statistics Bar and look under
1680Simulator &gt; Time &gt; Script Time to see if more than
168125 ms is being spent in scripts.
1682 </message>
1683 </alert>
1684 <alert modal="true" name="HelpRegionRestart" title="Restart Region">
1685 <message name="message">
1686 Restart the server process running this region after a
1687two minute warning. All Residents in the region will be
1688disconnected. The region will save its data, and should
1689come back up within 90 seconds.
1690
1691Restarting the region will not fix most performance
1692problems, and should usually be used only when directed.
1693 </message>
1694 </alert>
1695 <alert modal="true" name="HelpRegionWaterHeight" title="Water Height">
1696 <message name="message">
1697 This is the height in meters where water appears. If
1698this setting is anything other than 20 and you have
1699water that is adjacent to the edge of world or &apos;void&apos;
1700water, there will be a visible gap.
1701
1702Default: 20
1703 </message>
1704 </alert>
1705 <alert modal="true" name="HelpRegionTerrainRaise" title="Terrain Raise">
1706 <message name="message">
1707 This is the distance in meters that parcel owners can raise
1708their terrain above the &apos;baked&apos; terrain default
1709height.
1710
1711Default: 4
1712 </message>
1713 </alert>
1714 <alert modal="true" name="HelpRegionTerrainLower" title="Terrain Lower">
1715 <message name="message">
1716 This is the distance in meters that parcel owners can lower
1717their terrain below the &apos;baked&apos; terrain default
1718height.
1719
1720Default: -4
1721 </message>
1722 </alert>
1723 <alert modal="true" name="HelpRegionUploadRaw" title="Upload RAW Terrain">
1724 <message name="message">
1725 This button uploads a .RAW file to the region you are in.
1726The file must have the correct dimensions (RGB, 256x256)
1727and 13 channels. The best way to create a
1728terrain file is to download the existing RAW file. A good
1729first step is to modify the red channel (land height),
1730and upload it.
1731
1732The upload can take up to 45 seconds. Note that uploading a
1733terrain file *will not* move the objects that are on the land,
1734only the terrain itself and the permissions associated with the
1735parcels. This can result in objects going underground.
1736
1737For more information on editing region height fields, consult F1 Help.
1738 </message>
1739 </alert>
1740 <alert modal="true" name="HelpRegionDownloadRaw" title="Download RAW Terrain">
1741 <message name="message">
1742 This button downloads a file containing the height field data,
1743parcel dimensions, parcel for sale status and some parcel permissions
1744for this region. When opening the file in a program such as
1745Photoshop you must specify the document&apos;s dimensions which
1746are: RGB, 256x256 with 13 channels. This terrain file cannot
1747be opened in any other way.
1748
1749For more information on editing region height fields, consult F1 help.
1750 </message>
1751 </alert>
1752 <alert modal="true" name="HelpRegionUseEstateSun" title="Use Estate Sun">
1753 <message name="message">
1754 This checkbox makes the sun position in this region the
1755same as the sun position in the rest of the estate.
1756
1757Default: on
1758 </message>
1759 </alert>
1760 <alert modal="true" name="HelpRegionFixedSun" title="Fixed Sun">
1761 <message name="message">
1762 This checkbox sets the sun position to the position
1763in the Phase slider and stops the sun from moving.
1764
1765Default: off
1766 </message>
1767 </alert>
1768 <alert modal="true" name="HelpRegionBakeTerrain" title="Bake Terrain">
1769 <message name="message">
1770 This button saves the current shape of the terrain as the
1771new default for the region. Once baked, the land can revert
1772to the saved shape whenever you or others use the Edit Terrain
1773&apos;Revert&apos; option. The baked terrain is also the middle
1774point for the terrain raise and lower limits.
1775 </message>
1776 </alert>
1777 <alert modal="true" name="HelpEstateEstateManager" title="Estate Managers">
1778 <message name="message">
1779 An estate manager is a Resident to whom you have delegated
1780control of region and estate settings. An estate manager
1781can change any setting in these panels, except for uploading,
1782downloading, and baking terrain. In particular, they can
1783allow or ban Residents from your estate.
1784
1785Estate managers can only be added or removed by the owner
1786of the estate, not by each other. Please only choose
1787Residents you trust as estate managers, as you will be
1788ultimately responsible for their actions.
1789 </message>
1790 </alert>
1791 <alert modal="true" name="HelpEstateUseGlobalTime" title="Use Global Time">
1792 <message name="message">
1793 This checkbox makes the sun in your estate follow
1794the same position as on the Linden-owned &apos;mainland&apos;
1795estates.
1796
1797Default: on
1798 </message>
1799 </alert>
1800 <alert modal="true" name="HelpEstateFixedSun" title="Fixed Sun">
1801 <message name="message">
1802 This checkbox sets the sun position to the position
1803in the Phase slider and stops the sun from moving.
1804 </message>
1805 </alert>
1806 <alert modal="true" name="HelpEstateExternallyVisible" title="Public Access">
1807 <message name="message">
1808 This checkbox sets whether Residents who are on other estates can enter this
1809estate without being on an access list.
1810
1811Default: on
1812 </message>
1813 </alert>
1814 <alert modal="true" name="HelpEstateAllowDirectTeleport" title="Allow Direct Teleport">
1815 <message name="message">
1816 When checked, allows Residents to directly teleport to any
1817point in your estate. When unchecked, Residents teleport
1818to the nearest telehub.
1819
1820Default: off
1821 </message>
1822 </alert>
1823 <alert modal="true" name="HelpEstateAllowResident" title="Allow Access">
1824 <message name="message">
1825 Access to this estate will be limited to Residents
1826listed here and any groups below. This setting is
1827only available when Public Access is
1828unchecked.
1829 </message>
1830 </alert>
1831 <alert modal="true" name="HelpEstateAllowGroup" title="Allow Group Access">
1832 <message name="message">
1833 Access to this estate will be limited to groups
1834listed here and any Residents above. This setting is
1835only available when Public Access is
1836unchecked.
1837 </message>
1838 </alert>
1839 <alert modal="true" name="HelpEstateAbuseEmailAddress" title="Abuse Email Address">
1840 <message name="message">
1841 Setting this to a valid email address will cause
1842abuse reports on this estate to be sent to that address.
1843Setting it blank will cause abuse reports to be sent
1844only to Linden Lab.
1845 </message>
1846 </alert>
1847 <alert modal="true" name="HelpEstateBanResident" title="Deny Access">
1848 <message name="message">
1849 Residents on this list are denied access to your estate,
1850regardless of any other settings.
1851 </message>
1852 </alert>
1853 <alert modal="true" name="HelpEstateVoiceChat" title="Allow Voice Chat">
1854 <message name="message">
1855 Parcels in this estate are allowed to have their own voice
1856channels in which residents may hear and talk with others
1857nearby.
1858
1859Default: off
1860 </message>
1861 </alert>
1862 <alert modal="true" name="VoiceVersionMismatch" title="Voice Version Mismatch">
1863 <message name="message">
1864 This version of Second Life is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update Second Life.
1865 </message>
1866 </alert>
1867 <alert modal="true" name="HelpEstateCovenant" title="Estate Covenant">
1868 <message name="message">
1869 Setting an estate covenant enables you to sell parcels
1870within that estate. If a covenant is not set, you cannot
1871sell the land. The notecard for your covenant can be empty
1872if you do not wish to apply any rules or advise buyers of
1873anything in relation to the land before they buy it.
1874
1875A covenant can be used to communicate rules, guidelines,
1876cultural information or simply your own expectations to the
1877prospective buyer. This can include zoning, building regulations,
1878payment options or any other information you feel it is
1879important for the new owner to have seen and to have agreed
1880to before they purchase.
1881
1882The buyer must agree to the covenant by ticking the check box
1883before they will be able to finish the purchase. Estate
1884covenants are always visible in the About Land dialog for
1885any parcels that have one set.
1886 </message>
1887 </alert>
1888 <alert modal="true" name="BuyObjectOneOnly" title="Can&apos;t Buy Objects">
1889 <message name="message">
1890 Unable to buy more than one object at a time.
1891Please select only one object and try again.
1892 </message>
1893 </alert>
1894 <alert modal="true" name="BuyObjectOneOwner" title="Can&apos;t Buy Objects">
1895 <message name="message">
1896 Cannot buy objects from different owners at the same time.
1897Please select only one object and try again.
1898 </message>
1899 </alert>
1900 <alert modal="true" name="BuyContentsOneOnly" title="Can&apos;t Buy Contents">
1901 <message name="message">
1902 Unable to buy the contents of more than one object at a time.
1903Please select only one object and try again.
1904 </message>
1905 </alert>
1906 <alert modal="true" name="BuyContentsOneOwner" title="Can&apos;t Buy Contents">
1907 <message name="message">
1908 Cannot buy objects from different owners at the same time.
1909Please select only one object and try again.
1910 </message>
1911 </alert>
1912 <alert name="PermYes">
1913 <message name="message">
1914 Yes
1915 </message>
1916 </alert>
1917 <alert name="PermNo">
1918 <message name="message">
1919 No
1920 </message>
1921 </alert>
1922 <alert modal="true" name="BuyOriginal">
1923 <message name="message">
1924 Buy original object from [OWNER] for L$[PRICE]?
1925You will become the owner of this object.
1926You will be able to:
1927 Modify: [MODIFYPERM]
1928 Copy: [COPYPERM]
1929 Resell or Give Away: [RESELLPERM]
1930 </message>
1931 <option name="Buy">
1932 OK
1933 </option>
1934 <option name="Cancel">
1935 Cancel
1936 </option>
1937 </alert>
1938 <alert modal="true" name="BuyOriginalNoOwner">
1939 <message name="message">
1940 Buy original object for L$[PRICE]?
1941You will become the owner of this object.
1942You will be able to:
1943 Modify: [MODIFYPERM]
1944 Copy: [COPYPERM]
1945 Resell or Give Away: [RESELLPERM]
1946 </message>
1947 <option name="Buy">
1948 OK
1949 </option>
1950 <option name="Cancel">
1951 Cancel
1952 </option>
1953 </alert>
1954 <alert modal="true" name="BuyCopy">
1955 <message name="message">
1956 Buy a copy from [OWNER] for L$[PRICE]?
1957The object will be copied to your inventory.
1958You will be able to:
1959 Modify: [MODIFYPERM]
1960 Copy: [COPYPERM]
1961 Resell or Give Away: [RESELLPERM]
1962 </message>
1963 <option name="Buy">
1964 OK
1965 </option>
1966 <option name="Cancel">
1967 Cancel
1968 </option>
1969 </alert>
1970 <alert modal="true" name="BuyCopyNoOwner">
1971 <message name="message">
1972 Buy a copy for L$[PRICE]?
1973The object will be copied to your inventory.
1974You will be able to:
1975 Modify: [MODIFYPERM]
1976 Copy: [COPYPERM]
1977 Resell or Give Away: [RESELLPERM]
1978 </message>
1979 <option name="Buy">
1980 OK
1981 </option>
1982 <option name="Cancel">
1983 Cancel
1984 </option>
1985 </alert>
1986 <alert modal="true" name="BuyContents">
1987 <message name="message">
1988 Buy contents from [OWNER] for L$[PRICE]?
1989They will be copied to your inventory.
1990 </message>
1991 <option name="Buy">
1992 OK
1993 </option>
1994 <option name="Cancel">
1995 Cancel
1996 </option>
1997 </alert>
1998 <alert modal="true" name="BuyContentsNoOwner">
1999 <message name="message">
2000 Buy contents for L$[PRICE]?
2001They will be copied to your inventory.
2002 </message>
2003 <option name="Buy">
2004 OK
2005 </option>
2006 <option name="Cancel">
2007 Cancel
2008 </option>
2009 </alert>
2010 <alert modal="true" name="ConfirmPurchase" nodefault="true">
2011 <message name="message">
2012 This transaction will:
2013[ACTION]
2014
2015Are you sure you want to proceed with this purchase?
2016 </message>
2017 <option name="Confirm">
2018 OK
2019 </option>
2020 <option name="Cancel">
2021 Cancel
2022 </option>
2023 </alert>
2024 <alert modal="true" name="ConfirmPurchasePassword" nodefault="true">
2025 <message name="message">
2026 This transaction will:
2027[ACTION]
2028
2029Are you sure you want to proceed with this purchase?
2030Please re-enter your password and click OK.
2031 </message>
2032 <editline />
2033 <option name="ConfirmPurchase">
2034 OK
2035 </option>
2036 <option name="Cancel">
2037 Cancel
2038 </option>
2039 </alert>
2040 <alert name="SetPickLocation">
2041 <message name="message">
2042 Note:
2043You have updated the location
2044of this pick but the other details
2045will retain their original values.
2046 </message>
2047 <option name="OK">
2048 OK
2049 </option>
2050 </alert>
2051 <alert modal="true" name="MoveInventoryFromObject">
2052 <message name="message">
2053 You have selected &apos;no copy&apos; inventory items.
2054These items will be moved to your inventory, not copied.
2055
2056Move the inventory item(s)?
2057 </message>
2058 <ignore name="ignore">
2059 When moving no-copy inventory from objects
2060 </ignore>
2061 <option name="Move">
2062 OK
2063 </option>
2064 <option name="Don&apos;tMove">
2065 Cancel
2066 </option>
2067 </alert>
2068 <alert modal="true" name="MoveInventoryFromScriptedObject">
2069 <message name="message">
2070 You have selected &apos;no copy&apos; inventory items. These items
2071will be moved to your inventory, not copied.
2072Because this object is scripted, moving these items
2073to your inventory may cause the script to malfunction.
2074
2075Move the inventory item(s)?
2076 </message>
2077 <ignore name="ignore">
2078 When moving no-copy inventory from scripted objects
2079 </ignore>
2080 <option name="Move">
2081 OK
2082 </option>
2083 <option name="Don&apos;tMove">
2084 Cancel
2085 </option>
2086 </alert>
2087 <alert name="ClickActionNotPayable">
2088 <message name="message">
2089 Warning: The Pay Object click action has been set, but it
2090will only work if a script is added with a money() event.
2091 </message>
2092 <ignore name="ignore">
2093 When Setting &apos;Pay&apos; on objects without money() events
2094 </ignore>
2095 </alert>
2096 <alert modal="true" name="OpenObjectCannotCopy">
2097 <message name="message">
2098 There are no items in this object that you are allowed to copy.
2099 </message>
2100 </alert>
2101 <alert modal="true" name="WebLaunchAccountHistory">
2102 <message name="message">
2103 Go to the Second Life web site to see your account history?
2104 </message>
2105 <ignore name="ignore">
2106 When loading account history web page
2107 </ignore>
2108 <option name="Gotopage">
2109 Go to page
2110 </option>
2111 <option name="Cancel">
2112 Cancel
2113 </option>
2114 </alert>
2115 <alert modal="true" name="ClickOpenF1Help">
2116 <message name="message">
2117 Visit the Second Life Support Web site? (note: this is not an Imprudence Help site)
2118 </message>
2119 <ignore name="ignore">
2120 When visiting the Second Life Support Website.
2121 </ignore>
2122 <option name="Gotopage">
2123 Go
2124 </option>
2125 <option name="Cancel">
2126 Cancel
2127 </option>
2128 </alert>
2129 <alert modal="true" name="RetryFetchInventoryDescendents">
2130 <message name="message">
2131 Inventory fetch from server timed out. Retry?
2132 </message>
2133 <ignore name="ignore">
2134 Retry Fetch Inventory Descendents
2135 </ignore>
2136 <option name="Retry">
2137 Retry
2138 </option>
2139 <option name="Cancel">
2140 Cancel
2141 </option>
2142 </alert>
2143 <alert modal="true" name="ConfirmQuit">
2144 <message name="message">
2145 Are you sure you want to quit?
2146 </message>
2147 <ignore name="ignore">
2148 When Quitting Second Life.
2149 </ignore>
2150 <option name="Quit">
2151 Quit
2152 </option>
2153 <option name="Continue">
2154 Continue
2155 </option>
2156 </alert>
2157 <alert modal="true" name="HelpReportAbuseEmailLL">
2158 <message name="message">
2159 Use this tool to report violations of the Terms of Service
2160and Community Standards. See:
2161
2162http://secondlife.com/corporate/tos.php
2163http://secondlife.com/corporate/cs.php
2164
2165All reported abuses of the Terms of Service and Community Standards
2166are investigated and resolved. You can view the incident
2167resolution on the Incident Report at:
2168
2169http://secondlife.com/support/incidentreport.php
2170 </message>
2171 </alert>
2172 <alert modal="true" name="HelpReportAbuseEmailEO">
2173 <message name="message">
2174 IMPORTANT: This report will go to the owner of the
2175region you are currently in and not to Linden Lab.
2176
2177As a service to residents and visitors, the owner of
2178the region you are in has elected to receive and resolve
2179all reports originating in this region. Linden Lab will
2180not investigate reports you file from this location.
2181
2182The region owner will resolve reports based on the local
2183rules of this region as outlined in the estate Covenant.
2184(View covenants by going to the World menu and selecting
2185About Land.)
2186
2187The resolution of this report applies only to this Region;
2188Residents access to other areas of Second Life will not be
2189affected by the outcome of this report. Only Linden Lab can
2190restrict access to the entirety of Second Life.
2191 </message>
2192 </alert>
2193 <alert modal="true" name="HelpReportBug">
2194 <message name="message">
2195 Use this tool to *only* report technical features that do not perform
2196as described or expected, please provide as much detail as possible,
2197You may reply to the auto-response email to add more details to your
2198report.
2199
2200All bug reports are investigated and assessed. No email response will be sent.
2201
2202If you are having a technical difficulty, please contact Support at:
2203
2204http://secondlife.com/community/support.php
2205
2206Note: Incomplete reports will not be investigated
2207 </message>
2208 </alert>
2209 <alert modal="true" name="HelpReportAbuseSelectCategory">
2210 <message name="message">
2211 Please select a category for this abuse report.
2212Selecting a category helps us file and process abuse reports.
2213 </message>
2214 </alert>
2215 <alert modal="true" name="HelpReportBugSelectCategory">
2216 <message name="message">
2217 Please select a category for this bug.
2218Selecting a category helps us file and process bug reports.
2219 </message>
2220 </alert>
2221 <alert modal="true" name="HelpReportAbuseAbuserNameEmpty">
2222 <message name="message">
2223 Please enter the name of the abuser.
2224Entering an accurate value helps us file and process abuse reports.
2225 </message>
2226 </alert>
2227 <alert modal="true" name="HelpReportAbuseAbuserLocationEmpty">
2228 <message name="message">
2229 Please enter the location where the abuse took place.
2230Entering an accurate value helps us file and process abuse reports.
2231 </message>
2232 </alert>
2233 <alert modal="true" name="HelpReportAbuseSummaryEmpty">
2234 <message name="message">
2235 Please enter a summary of the abuse that took place.
2236Entering an accurate summary helps us file and process abuse reports.
2237 </message>
2238 </alert>
2239 <alert modal="true" name="HelpReportBugSummaryEmpty">
2240 <message name="message">
2241 Please enter a summary of the bug.
2242Entering an accurate summary helps us file and process bug reports.
2243 </message>
2244 </alert>
2245 <alert modal="true" name="HelpReportAbuseDetailsEmpty">
2246 <message name="message">
2247 Please enter a detailed description of the abuse that took place.
2248Be as specific as you can, including names and the details of the
2249incident you are reporting.
2250Entering an accurate description helps us file and process abuse reports.
2251 </message>
2252 </alert>
2253 <alert modal="true" name="HelpReportBugDetailsEmpty">
2254 <message name="message">
2255 Please enter a detailed description of the bug.
2256Be as specific as you can, including steps to reproduce the bug
2257if possible.
2258Entering an accurate description helps us file and process bug reports.
2259 </message>
2260 </alert>
2261 <alert modal="true" name="HelpReportAbuseContainsCopyright">
2262 <message name="message">
2263 Dear Resident,
2264
2265You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly:
2266
2267(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the Second Life permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the Second Life Community Standards or Terms of Service. However, the Abuse Team does not handle and will not respond to requests to remove content from the Second Life world.
2268
2269(2) The DMCA or Content Removal Process. To request removal of content from Second Life, you MUST submit a valid notification of infringement as provided in our DMCA Policy at http://secondlife.com/corporate/dmca.php.
2270
2271If you still wish to continue with the abuse process, please close this window and finish submitting your report. You may need to select the specific category 'CopyBot or Permissions Exploit'.
2272
2273Thank you,
2274
2275Linden Lab
2276 </message>
2277 </alert>
2278 <alert modal="true" name="FailedRequirementsCheck">
2279 <message name="message">
2280 The following required components are missing from [FLOATER]:
2281[COMPONENTS]
2282 </message>
2283 </alert>
2284 <alert name="ReplaceAttachment" title="Replace Existing Attachment">
2285 <message name="message">
2286 There is already an object attached to this point on your body.
2287Do you want to replace it with the selected object?
2288 </message>
2289 <ignore name="ignore" save_option="true">
2290 When replacing existing attachments
2291 </ignore>
2292 <option ignore="Replace Automatically" name="Yes">
2293 OK
2294 </option>
2295 <option ignore="Never Replace" name="No">
2296 Cancel
2297 </option>
2298 </alert>
2299 <alert name="BusyModePay" title="Busy Mode Warning">
2300 <message name="message">
2301 You are in Busy Mode, which means you will not
2302receive any items offered in exchange for
2303this payment.
2304
2305Would you like to leave Busy Mode before
2306completing this transaction?
2307 </message>
2308 <ignore name="ignore" save_option="true">
2309 When paying a person or object in busy mode
2310 </ignore>
2311 <option ignore="Always leave Busy Mode" name="Yes">
2312 OK
2313 </option>
2314 <option ignore="Never leave Busy Mode" name="No">
2315 Cancel
2316 </option>
2317 </alert>
2318 <alert modal="true" name="ConfirmEmptyTrash">
2319 <message name="message">
2320 Are you sure you want to permanently remove
2321the contents of your Trash folder?
2322 </message>
2323 <ignore name="ignore">
2324 When emptying your inventory trash folder
2325 </ignore>
2326 <option default="true" name="Yes">
2327 OK
2328 </option>
2329 <option name="No">
2330 Cancel
2331 </option>
2332 </alert>
2333 <alert modal="true" name="ConfirmClearBrowserCache">
2334 <message name="message">
2335 Are you sure you want to clear your browser cache?
2336 </message>
2337 <option default="true" name="Yes">
2338 Yes
2339 </option>
2340 <option name="No">
2341 Cancel
2342 </option>
2343 </alert>
2344 <alert modal="true" name="ConfirmClearCookies">
2345 <message name="message">
2346 Are you sure you want to clear your cookies?
2347 </message>
2348 <option default="true" name="Yes">
2349 Yes
2350 </option>
2351 <option name="No">
2352 Cancel
2353 </option>
2354 </alert>
2355 <alert modal="true" name="ConfirmClearMediaUrlList">
2356 <message name="message">
2357 Are you sure you want to clear your list of saved URLs?
2358 </message>
2359 <option default="true" name="Yes">
2360 Yes
2361 </option>
2362 <option name="No">
2363 Cancel
2364 </option>
2365 </alert>
2366 <alert modal="true" name="ConfirmEmptyLostAndFound">
2367 <message name="message">
2368 Are you sure you want to permanently remove
2369the contents of your Lost And Found folder?
2370 </message>
2371 <ignore name="ignore">
2372 When emptying your inventory Lost And Found folder
2373 </ignore>
2374 <option default="true" name="Yes">
2375 Yes
2376 </option>
2377 <option name="No">
2378 No
2379 </option>
2380 </alert>
2381 <alert modal="true" name="CopySLURL">
2382 <message name="message">
2383 The following SLURL has been copied to your clipboard:
2384 [SLURL]
2385
2386Put it in a web page to give others easy access to this location or
2387try it out yourself by pasting it into the address bar of your web browser.
2388 </message>
2389 <ignore name="ignore">
2390 When copying a SLURL to your clipboard
2391 </ignore>
2392 </alert>
2393 <alert modal="true" name="GraphicsPreferencesHelp">
2394 <message name="message">
2395 This panel controls window size and resolution and the quality of the client&apos;s graphics. The Preferences > Graphics interface allows you to choose between four graphics levels: Low, Mid, High, and Ultra. You may also customize your graphics settings by checking the Custom checkbox and manipulating the following settings:
2396
2397Shaders: Enable or disable various types of pixel shaders.
2398
2399Reflection Detail: Sets the types of objects that water can reflect.
2400
2401Avatar Rendering: Sets options that affect how the client renders avatars.
2402
2403Draw Distance: Affects how far out from your viewpoint objects will be rendered in the scene.
2404
2405Max Particle Count: Sets the maximum number of particles you are able to see on your screen at once.
2406
2407Post Process Quality: Sets the resolution with which Glow is rendered.
2408
2409Mesh Detail: Sets the amount of detail or number of triangles used in rendering certain objects. A higher value takes longer to render, but makes these objects appear with more detail.
2410
2411Lighting Detail: Selects what types of lights you would like to render.
2412
2413Terrain Detail: Sets the amount of detail you would like to see for the terrain texture.
2414 </message>
2415 </alert>
2416 <alert modal="true" name="WLSavePresetAlert">
2417 <message name="message">
2418 Do you wish to overwrite the saved preset?
2419 </message>
2420 <option name="Save">
2421 Yes
2422 </option>
2423 <option name="Cancel">
2424 No
2425 </option>
2426 </alert>
2427 <alert modal="true" name="WLDeletePresetAlert">
2428 <message name="message">
2429 Do you wish to delete [SKY]?
2430 </message>
2431 <option name="Delete">
2432 Yes
2433 </option>
2434 <option name="Cancel">
2435 No
2436 </option>
2437 </alert>
2438 <alert modal="true" name="WLNoEditDefault">
2439 <message name="message">
2440 You cannot edit or delete a default preset.
2441 </message>
2442 </alert>
2443 <alert modal="true" name="WLMissingSky">
2444 <message name="message">
2445 This day cycle file references a missing sky file: [SKY].
2446 </message>
2447 </alert>
2448 <alert modal="true" name="PPSaveEffectAlert">
2449 <message name="message">
2450 PostProcess Effect exists. Do you still wish overwrite it?
2451 </message>
2452 <option name="Save">
2453 Yes
2454 </option>
2455 <option name="Cancel">
2456 No
2457 </option>
2458 </alert>
2459 <alert modal="true" name="HelpEditSky">
2460 <message name="message">
2461 Edit the WindLight sliders to create and save a set of skies.
2462 </message>
2463 </alert>
2464 <alert modal="true" name="HelpEditDayCycle">
2465 <message name="message">
2466 Set which skies to turn to throughout the day.
2467 </message>
2468 </alert>
2469 <alert modal="true" name="EnvSettingsHelpButton">
2470 <message name="message">
2471 These settings adjust the way the environment looks locally on your computer. Your graphics card needs to support atmospheric shaders in order to have access to all of the settings.
2472
2473Adjust the &quot;Time of Day&quot; slider to change the day&apos;s phase locally on the viewer.
2474
2475Adjust the &quot;Cloud Cover&quot; slider to control how much the clouds cover the sky.
2476
2477Pick a color in the &quot;Water Color&quot; color picker to change the color of the water.
2478
2479Adjust the &quot;Water Fog&quot; slider to control how dense the fog is underwater.
2480
2481Click &quot;Use Estate Time&quot; to reset the time of day to the region&apos;s current time of day and remain linked to it.
2482
2483Click &quot;Advanced Sky&quot; to bring up an editor with more advanced settings for the sky.
2484
2485Click &quot;Advanced Water&quot; to bring up an editor with more advanced settings for the water.
2486 </message>
2487 </alert>
2488 <alert modal="true" name="HelpDayCycle">
2489 <message name="message">
2490 The Day Cycle Editor gives you control over the sky during Second Life&apos;s day/night cycle. This is the cycle that is used by the Basic Environment Editor&apos;s Time of Day slider.
2491
2492The Day Cycle Editor works by setting keyframes. These are nodes (represented by the gray blips on the time graph) that have Sky Presets associated with them. As the Time of Day progresses, the WindLight sky &quot;animates&quot; as it interpolates between these keyframes.
2493
2494The yellow arrow above the timeline represents your current view, based on Time of Day. Click and drag it to see how your day will animate. You may add or delete keyframes by pressing the Add Key and Delete Key buttons to the right of the timeline.
2495
2496You can set the time position of a keyframe by either dragging it along the timeline, or by setting its value manually in the Key Frame Settings frame. Within the Key Frame Settings frame, you&apos;ll be able to associate the keyframe with its respective WindLight preset.
2497
2498Length of Cycle dictates the overall duration of a &quot;day&quot;. Setting this to a low value (for instance, 2 min.) will mean your entire 24-hour timeline will animate in only two real minutes! Once you are satisfied with your timeline and keyframe cycle, use the Play and Stop buttons to preview the results. Remember- you can also move the yellow time-indicator arrow above the timeline to see the cycle animate interactively. Using the Use Estate Time button will synchronize your day length and time of day with the Estate&apos;s day cycle.
2499
2500Once you are pleased with your Day Cycle, you can save and load it with the Save Test Day and Load Test Day buttons. Note that, for now, we only allow one Day Cycle.
2501 </message>
2502 </alert>
2503 <alert modal="true" name="HelpBlueHorizon">
2504 <message name="message">
2505 Use the Red/Green/Blue (RGB) sliders to adjust the color of the sky. You can use the Intensity (I) slider to move all three RGB sliders in unison.
2506 </message>
2507 </alert>
2508 <alert modal="true" name="HelpHazeHorizon">
2509 <message name="message">
2510 Haze Horizon is one of the most useful parameters for
2511adjusting overall light exposure in the scene. It is
2512effective for simulating many exposure settings,
2513such as white-outs from the sun and darker,
2514closed-iris settings.
2515 </message>
2516 </alert>
2517 <alert modal="true" name="HelpBlueDensity">
2518 <message name="message">
2519 Blue Density affects the overall color saturation of the sky and fog. If you move the Intensity (I) slider to the right, colors will become brighter and more vibrant. If you move it all the way to the left, the colors will become duller, eventually fading to black and white. If you want to fine-tune the sky&apos;s color balance, you can control individual elements of saturation by using the Red/Green/Blue (RGB) sliders.
2520 </message>
2521 </alert>
2522 <alert modal="true" name="HelpHazeDensity">
2523 <message name="message">
2524 Haze Density controls the level of dull, gray
2525haze in the atmosphere. It is effective for
2526simulating scenes with high levels of smoke
2527and man-made pollutants. It is also effective
2528for simulating fog and mist.
2529 </message>
2530 </alert>
2531 <alert modal="true" name="HelpDensityMult">
2532 <message name="message">
2533 The Density Multiplier can be used to affect the overall atmospheric density. At lower settings, it creates a feeling of &quot;thin air&quot;, and at higher settings, it creates a very heavy, smoggy effect.
2534 </message>
2535 </alert>
2536 <alert modal="true" name="HelpDistanceMult">
2537 <message name="message">
2538 Adjusts WindLight&apos;s perceived distance. A value of
2539zero effectively turns off WindLight&apos;s influence
2540on terrain and objects. Values greater than 1 simulate
2541greater distances for thicker atmospheric effects.
2542 </message>
2543 </alert>
2544 <alert modal="true" name="HelpMaxAltitude">
2545 <message name="message">
2546 Max Altitude adjusts the altitude calculations WindLight
2547performs when computing its atmospheric lighting. At
2548later times of day, it is useful for adjusting how
2549&quot;deep&quot; the sunset appears.
2550 </message>
2551 </alert>
2552 <alert modal="true" name="HelpSunlightColor">
2553 <message name="message">
2554 Adjusts the color and intensity of the direct light in the scene.
2555 </message>
2556 </alert>
2557 <alert modal="true" name="HelpSunAmbient">
2558 <message name="message">
2559 Adjusts the color and intensity of ambient atmospheric light in the scene.
2560 </message>
2561 </alert>
2562 <alert modal="true" name="HelpSunGlow">
2563 <message name="message">
2564 The Size slider controls the size of the sun.
2565The Focus slider controls how blurred the sun
2566is over the sky.
2567 </message>
2568 </alert>
2569 <alert modal="true" name="HelpSceneGamma">
2570 <message name="message">
2571 Adjust the screen&apos;s distribution of light and dark.
2572 </message>
2573 </alert>
2574 <alert modal="true" name="HelpStarBrightness">
2575 <message name="message">
2576 Adjusts the brightness of the stars in the sky.
2577 </message>
2578 </alert>
2579 <alert modal="true" name="HelpTimeOfDay">
2580 <message name="message">
2581 Controls the location of the sun in the sky.
2582Similar to elevation.
2583 </message>
2584 </alert>
2585 <alert modal="true" name="HelpEastAngle">
2586 <message name="message">
2587 Controls the location of the sun in the sky.
2588Similar to azimuth.
2589 </message>
2590 </alert>
2591 <alert modal="true" name="HelpCloudColor">
2592 <message name="message">
2593 Edits the color of the clouds. It is generally
2594recommended to keep it whitish,
2595but hey, have fun if you want.
2596 </message>
2597 </alert>
2598 <alert modal="true" name="HelpCloudDetail">
2599 <message name="message">
2600 Controls the detail image layered on top
2601of the main cloud image. X and Y control
2602its position. D (Density) controls how puffy or
2603fractured the clouds appear.
2604 </message>
2605 </alert>
2606 <alert modal="true" name="HelpCloudDensity">
2607 <message name="message">
2608 Allows you to control the position of the clouds
2609with the X and Y sliders and how dense they are
2610with the the D slider.
2611 </message>
2612 </alert>
2613 <alert modal="true" name="HelpCloudCoverage">
2614 <message name="message">
2615 Controls how much the clouds cover the sky.
2616 </message>
2617 </alert>
2618 <alert modal="true" name="HelpCloudScale">
2619 <message name="message">
2620 Controls the scaling of the cloud image on the sky dome.
2621 </message>
2622 </alert>
2623 <alert modal="true" name="HelpCloudScrollX">
2624 <message name="message">
2625 Controls the speed of the clouds as they move in the X direction.
2626 </message>
2627 </alert>
2628 <alert modal="true" name="HelpCloudScrollY">
2629 <message name="message">
2630 Controls the speed of the clouds as they move in the Y direction.
2631 </message>
2632 </alert>
2633 <alert modal="true" name="HelpClassicClouds">
2634 <message name="message">
2635 Check this box to enable rendering of Second Life&apos;s older classic clouds in addition to WindLight&apos;s clouds.
2636 </message>
2637 </alert>
2638 <alert modal="true" name="HelpWaterFogColor">
2639 <message name="message">
2640 Chooses the color of the underwater fog.
2641 </message>
2642 </alert>
2643 <alert modal="true" name="HelpWaterFogDensity">
2644 <message name="message">
2645 Controls how dense the water fog is and how far you can see underwater.
2646 </message>
2647 </alert>
2648 <alert modal="true" name="HelpUnderWaterFogMod">
2649 <message name="message">
2650 Modifies the effect of the Fog Density Exponent to control how far you can see when your avatar is underwater.
2651 </message>
2652 </alert>
2653 <alert modal="true" name="HelpWaterGlow">
2654 <message name="message">
2655 Controls how much the surface of the water glows.
2656 </message>
2657 </alert>
2658 <alert modal="true" name="HelpWaterNormalScale">
2659 <message name="message">
2660 Controls the scaling of the three wavelets that make up the water.
2661 </message>
2662 </alert>
2663 <alert modal="true" name="HelpWaterFresnelScale">
2664 <message name="message">
2665 Controls how much light is reflected at different angles.
2666 </message>
2667 </alert>
2668 <alert modal="true" name="HelpWaterFresnelOffset">
2669 <message name="message">
2670 Controls how much light intensity is reflected.
2671 </message>
2672 </alert>
2673 <alert modal="true" name="HelpWaterScaleAbove">
2674 <message name="message">
2675 Controls how much light is refracted from looking above the surface of the water.
2676 </message>
2677 </alert>
2678 <alert modal="true" name="HelpWaterScaleBelow">
2679 <message name="message">
2680 Controls how much light is refracted from looking from below the surface of the water.
2681 </message>
2682 </alert>
2683 <alert modal="true" name="HelpWaterBlurMultiplier">
2684 <message name="message">
2685 Controls how waves and reflections are mixed.
2686 </message>
2687 </alert>
2688 <alert modal="true" name="HelpWaterNormalMap">
2689 <message name="message">
2690 Controls what normal map is layered across the water to determine reflections/refractions.
2691 </message>
2692 </alert>
2693 <alert modal="true" name="HelpWaterWave1">
2694 <message name="message">
2695 Controls where and how fast the large scaled version of the normal map moves in the X and Y direction.
2696 </message>
2697 </alert>
2698 <alert modal="true" name="HelpWaterWave2">
2699 <message name="message">
2700 Controls where and how fast the the small scaled version of the normal map moves in the X and Y direction.
2701 </message>
2702 </alert>
2703 <alert name="NewSkyPreset">
2704 <message name="message">
2705 Give me a name for the new sky.
2706 </message>
2707 <editline name="editline">
2708 New Preset
2709 </editline>
2710 <option name="OK">
2711 OK
2712 </option>
2713 <option name="Cancel">
2714 Cancel
2715 </option>
2716 </alert>
2717 <alert modal="true" name="ExistsSkyPresetAlert">
2718 <message name="message">
2719 Preset already exists!
2720 </message>
2721 </alert>
2722 <alert name="NewWaterPreset">
2723 <message name="message">
2724 Give me a name for the new water preset.
2725 </message>
2726 <editline name="editline">
2727 New Preset
2728 </editline>
2729 <option name="OK">
2730 OK
2731 </option>
2732 <option name="Cancel">
2733 Cancel
2734 </option>
2735 </alert>
2736 <alert modal="true" name="ExistsWaterPresetAlert">
2737 <message name="message">
2738 Preset already exists!
2739 </message>
2740 </alert>
2741 <alert modal="true" name="WaterNoEditDefault">
2742 <message name="message">
2743 You cannot edit or delete a default preset.
2744 </message>
2745 </alert>
2746 <alert modal="true" name="ChatterBoxSessionStartError">
2747 <message name="message">
2748 Unable to start a new chat session with [RECIPIENT].
2749[REASON]
2750 </message>
2751 <option default="true" name="OK">
2752 OK
2753 </option>
2754 </alert>
2755 <alert modal="true" name="ChatterBoxSessionEventError">
2756 <message name="message">
2757 [EVENT]
2758[REASON]
2759 </message>
2760 <option default="true" name="OK">
2761 OK
2762 </option>
2763 </alert>
2764 <alert modal="true" name="ForceCloseChatterBoxSession">
2765 <message name="message">
2766 Your chat session with [NAME] must close.
2767[REASON]
2768 </message>
2769 <option default="true" name="OK">
2770 OK
2771 </option>
2772 </alert>
2773 <alert modal="true" name="Cannot_Purchase_an_Attachment">
2774 <message name="message">
2775 Items may not be purchased while
2776they are part of an attachment.
2777 </message>
2778 </alert>
2779 <alert modal="true" name="DebitPermissionDetails"
2780 title="About Requests for the Debit Permission">
2781 <message name="message">
2782 Granting this request gives a script ongoing permission to take Linden dollars (L$) from your account. To revoke this permission, the object owner must delete the object or reset the scripts in the object.
2783 </message>
2784 <option default="true" name="OK">
2785 OK
2786 </option>
2787 </alert>
2788 <alert modal="true" name="AutoWearNewClothing">
2789 <message name="message">
2790 Would you like to automatically wear the clothing item you create?
2791 </message>
2792 <ignore name="ignore">
2793 Automatically wear new clothing
2794 </ignore>
2795 <option name="Yes">
2796 Yes
2797 </option>
2798 <option name="No">
2799 No
2800 </option>
2801 </alert>
2802 <alert modal="true" name="BadURL">
2803 <message name="message">
2804 Second Life doesn&apos;t know how to handle the link:
2805 [SLURL]
2806Most links are similar to this:
2807
2808secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-
2809fd37083abc4c/about
2810
2811Please check the spelling and try again.
2812 </message>
2813 </alert>
2814 <alert modal="true" name="NotAgeVerified">
2815 <message name="message">
2816 You need to be age-verified in order to access this parcel.
2817Would you like to visit the Second Life website to verify your age?
2818
2819[_URL]
2820 </message>
2821 <ignore name="ignore">
2822 Warn about lack of age verification
2823 </ignore>
2824 <option name="Yes">
2825 Yes
2826 </option>
2827 <option name="No">
2828 No
2829 </option>
2830 <url option="0">
2831 https://secondlife.com/account/verification.php
2832 </url>
2833 </alert>
2834 <alert modal="true" name="Cannot enter parcel: no payment info on file">
2835 <message name="message">
2836 This parcel requires that you have payment information on file before you can access it.
2837Would you like to visit the Second Life website to set this up?
2838
2839[_URL]
2840 </message>
2841 <ignore name="ignore">
2842 Warn about lack of payment info
2843 </ignore>
2844 <option name="Yes">
2845 Yes
2846 </option>
2847 <option name="No">
2848 No
2849 </option>
2850 <url option="0">
2851 https://secondlife.com/account/
2852 </url>
2853 </alert>
2854 <alert modal="true" name="MissingString">
2855 <message name="message">
2856 The string [STRING_NAME] is missing from strings.xml
2857 </message>
2858 </alert>
2859
2860 <alert modal="true" name="ConfirmAutoPilot">
2861 <message name="message">
2862 Are you sure you want to move here?
2863 </message>
2864 <ignore name="ignore">
2865 When using auto-pilot
2866 </ignore>
2867 <option name="Move">
2868 Move
2869 </option>
2870 <option name="Cancel">
2871 Cancel
2872 </option>
2873 </alert>
2874
2875 <alert modal="true" name="ConfirmDoubleClickTP">
2876 <message name="message">
2877 Are you sure you want to teleport here?
2878 </message>
2879 <ignore name="ignore">
2880 When double-click teleporting
2881 </ignore>
2882 <option name="Teleport">
2883 Teleport
2884 </option>
2885 <option name="Cancel">
2886 Cancel
2887 </option>
2888 </alert>
2889
2890 <alert modal="true" name="ConfirmTeleportHome">
4 <message name="message"> 2891 <message name="message">
5 Are you sure you want to teleport home? 2892 Are you sure you want to teleport home?
6 </message> 2893 </message>
@@ -98,5 +2985,31 @@ WARNING: Don't restore if you aren't sure where the object will go!
98 Cancel 2985 Cancel
99 </option> 2986 </option>
100 </alert> 2987 </alert>
2988 <alert modal="true" name="IMLogNotFound">
2989 <message name="message">
2990 IM history could not be found for [NAME].
2991 </message>
2992 <option name="OK">
2993 OK
2994 </option>
2995 </alert>
2996
2997 <!-- [RLVa:KB] -->
2998 <alert modal="true" name="FirstRLVGiveToRLV">
2999 <message name="message">
3000Folders starting with &apos;#RLV/~&apos; can automatically be placed under your #RLV shared folder after you accept the inventory offer.
3001
3002Please note that - if enabled - the accepted inventory items will instantly be available to scripts and will have full use of the RLV API which may cause unexpected or undesirable situations.
3003
3004Do you want to enable this feature?
3005 </message>
3006 <option name="Yes">
3007 Yes
3008 </option>
3009 <option name="No">
3010 No
3011 </option>
3012 </alert>
3013 <!-- [/RLVa:KB] -->
101</alerts> 3014</alerts>
102<!-- This file is no longer used. Please see notifications.xml and make your changes there. --> 3015<!-- This file is no longer used. Please see notifications.xml and make your changes there. -->
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
index 5418364..c26d7ae 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
@@ -7,7 +7,24 @@
7 follows="left|top|right|bottom" font="SansSerifSmall" height="168" left="6" 7 follows="left|top|right|bottom" font="SansSerifSmall" height="168" left="6"
8 max_length="65536" mouse_opaque="true" name="credits_editor" width="458" 8 max_length="65536" mouse_opaque="true" name="credits_editor" width="458"
9 word_wrap="true"> 9 word_wrap="true">
10 Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others. 10 The Imprudence Viewer was rocked hard by:
11 Jacek Antonelli, McCabe Maxsted, and Armin Weatherwax.
12 http://www.imprudenceviewer.org
13
14 Imprudence is so awesome thanks to contributions from many generous people:
15
16 For their patches and code contributions, we thank Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Angus Boyd, Asuka Neely, Balp Allen, Carjay McGinnis, Dale Glass, Felix Duesenburg, Henri Beauchamp, Kitty Barnett, Latif Khalifa, Mana Janus, Matthew Dowd, Michelle2 Zenovka, Nicholaz Beresford, Paul Churchill, Peter Lameth, Robin Cornelius, Stephen Zenith, Thomas Shikami, Vadim Bigbear, Zi Ree, and Zwagoth Klaar.
17
18 For their WindLight presets, we thank Ana Lutetia, CodeBastard Redgrave, and Torley Linden.
19
20 Thanks also to the developers of the Green Life Emerald Viewer, Hippo Viewer, and Meerkat Viewer for viewer enhancements we have incorporated. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
21
22 For a complete list of who did what, read the release notes!
23
24
25 Second Life Copyright (C) 1999-2009 Linden Research Inc.
26
27 Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others.
11 28
12 Thank you to the following residents for helping to ensure that this is the best version yet: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, 29 Thank you to the following residents for helping to ensure that this is the best version yet: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime,
13Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, 30Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida,
@@ -39,7 +56,11 @@ Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft
39 Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) 56 Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
40 57
41 58
59 I get by with a little help from my friends. --Richard Starkey</text_editor>
42 To be a success in business, be daring, be first, be different. --Henry Marchant</text_editor> 60 To be a success in business, be daring, be first, be different. --Henry Marchant</text_editor>
61 Begin, be bold and venture to be wise. -- Horace
62
63 If you don't like something, change it. If you can't change it, change your attitude. -- Maya Angelou </text_editor>
43 64
44 <text_editor bottom_delta="174" embedded_items="false" 65 <text_editor bottom_delta="174" embedded_items="false"
45 follows="left|top|right|bottom" font="SansSerif" height="238" left="6" 66 follows="left|top|right|bottom" font="SansSerif" height="238" left="6"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_animation_list.xml b/linden/indra/newview/skins/default/xui/en-us/floater_animation_list.xml
new file mode 100644
index 0000000..be7de86
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_animation_list.xml
@@ -0,0 +1,74 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater
3 name="animation list"
4 title="Animation List"
5 can_resize="true"
6 can_minimize="true"
7 can_close="true"
8 can_drag_on_left="false"
9 rect_control="FloaterAnimationListRect"
10 min_width="1000"
11 min_height="275"
12 >
13 <scroll_list
14 name="animation_list"
15 left="10"
16 right="-10"
17 top="-20"
18 bottom="100"
19 column_padding="0"
20 can_resize="true"
21 follows="left|top|bottom|right"
22 draw_heading="true"
23 multi_select="true"
24 search_column="1"
25 tool_tip="Hold shift or control while clicking to select multiple thingers"
26 >
27 <!-- Icons relating to the avatar, currently: tracking, and marked -->
28 <column name="Anim Name" label="Anim Name" width="250"/>
29 <column name="Animation UUID" label="Animation UUID" width="250"/>
30 <!--<column name="object_name" label="Distance" dynamicwidth="true"/>-->
31 <column name="Source Object UUID" label="Source Object UUID" width="250"/>
32 <column name="Source Owner" label="Source Owner" width="250"/>
33 <!-- What the avatar is doing: producing sounds, rezzing, particles, etc -->
34 </scroll_list>
35 <panel
36 name="options"
37 left="10"
38 right="-10"
39 top="90"
40 bottom="10"
41 border="true"
42 mouse_opaque="true"
43 bevel_style="in"
44 background_visible="true"
45 background_opaque="true"
46 follows="left|right|bottom"
47 bg_opaque_color="0,0,0,0.3"
48 bg_alpha_color="blue"
49 can_resize="false"
50 >
51 </panel>
52
53 <button bottom="55" follows="left|bottom" font="SansSerifSmall" halign="center"
54 height="20" label="Stop Selected" left_delta="5"
55 mouse_opaque="true" name="Stop Selected"
56 tool_tip="Stop selected animations" width="150" />
57 <button bottom_delta="0" follows="left|bottom" font="SansSerifSmall" halign="center"
58 height="20" label="Revoke Selected" left_delta="155"
59 mouse_opaque="true" name="Revoke Selected"
60 tool_tip="Revokes animation permissions for object associated with the selections" width="150" />
61 <button bottom_delta="0" follows="left|bottom" font="SansSerifSmall" halign="center"
62 height="20" label="Stop+Revoke Selected" left_delta="155"
63 mouse_opaque="true" name="Stop+Revoke Selected"
64 tool_tip="Revokes animation permissions for object(s) associated with the selections, as well as stopping the anim" width="150" />
65 <button bottom_delta="0" follows="left|bottom" font="SansSerifSmall" halign="center"
66 height="20" label="Open Owner Profile" left_delta="155"
67 mouse_opaque="true" name="Open Owner Profile"
68 tool_tip="Opens profile of the owner(s) of object(s) associated with the selections" width="150" />
69 <button bottom_delta="-25" enabled="false" follows="left|bottom" font="SansSerifSmall" halign="center"
70 height="20" label="Return Object" left_delta="-465"
71 mouse_opaque="true" name="Return Object"
72 tool_tip="Returns object(s) selected, if you have land powers" width="150" />
73
74</floater> \ No newline at end of file
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_asset_browser.xml b/linden/indra/newview/skins/default/xui/en-us/floater_asset_browser.xml
new file mode 100644
index 0000000..13c6b6c
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_asset_browser.xml
@@ -0,0 +1,29 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2
3<floater bottom="-300" can_close="true" can_drag_on_left="false" can_minimize="true"
4 can_resize="true" enabled="true" follows="left|bottom" height="620"
5 hidden="false" left="300" min_height="420" min_width="630"
6 mouse_opaque="true" name="asset browser" title="Asset Browser" width="720">
7
8 <inventory_panel allow_multi_select="false" border="true" bottom="-299" enabled="true"
9 follows="left|top" height="280" hidden="false" left="10"
10 mouse_opaque="true" name="inventory panel"
11 sort_order="TexturePickerSortOrder" width="231"/>
12
13 <button bottom="-350" follows="left|top" font="SansSerifSmall"
14 halign="center" height="20" hidden="false" label="Next &gt;&gt;"
15 left="160" mouse_opaque="true" name="button next" scale_image="TRUE"
16 width="80"/>
17
18 <button bottom_delta="-30" follows="left|top" font="SansSerifSmall"
19 halign="center" height="20" hidden="false" label="&lt;&lt; Previous"
20 left_delta="0" mouse_opaque="true" name="button previous" scale_image="TRUE"
21 width="80"/>
22
23 <button bottom_delta="-30" follows="left|top" font="SansSerifSmall"
24 halign="center" height="20" hidden="false" label="Refresh"
25 left_delta="0" mouse_opaque="true" name="button refresh" scale_image="TRUE"
26 width="80"/>
27
28</floater>
29
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
index 2a60a3b..e86bf71 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
@@ -1,5 +1,5 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater bottom="27" can_close="true" can_drag_on_left="false" can_minimize="false" 2<floater bottom="27" can_close="true" can_drag_on_left="false" can_minimize="true"
3 can_resize="true" can_tear_off="true" enabled="true" height="270" left="15" 3 can_resize="true" can_tear_off="true" enabled="true" height="270" left="15"
4 min_height="150" min_width="425" mouse_opaque="true" name="chat floater" 4 min_height="150" min_width="425" mouse_opaque="true" name="chat floater"
5 rect_control="FloaterChatRect" title="Local Chat" width="435"> 5 rect_control="FloaterChatRect" title="Local Chat" width="435">
@@ -100,10 +100,14 @@
100 <panel bottom="5" follows="left|right|bottom" left="5" name="chat_panel" right="-5" 100 <panel bottom="5" follows="left|right|bottom" left="5" name="chat_panel" right="-5"
101 tab_group="1" top="25"> 101 tab_group="1" top="25">
102 <string name="gesture_label">Gestures</string> 102 <string name="gesture_label">Gestures</string>
103 <spinner bottom="-22" decimal_digits="0" follows="left|bottom" height="20"
104 increment="1.00" initial_val="0" label="Channel" label_width="50" left="0"
105 max_val="2147483647" min_val="0" mouse_opaque="true" name="channel_control"
106 width="100" tool_tip="Set the default channel for inworld chat"/>
103 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="0" 107 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="0"
104 enabled="true" follows="left|right|bottom" font="SansSerif" 108 enabled="true" follows="left|right|bottom" font="SansSerif"
105 handle_edit_keys_directly="false" height="20" label="Click here to chat." 109 handle_edit_keys_directly="false" height="20" label="Click here to chat."
106 left="0" max_length="254" mouse_opaque="true" name="Chat Editor" 110 left="105" max_length="254" mouse_opaque="true" name="Chat Editor"
107 right="-70" select_all_on_focus_received="false" select_on_focus="false" 111 right="-70" select_all_on_focus_received="false" select_on_focus="false"
108 tab_group="1" /> 112 tab_group="1" />
109 <flyout_button bottom="0" follows="right|bottom" height="20" label="Say" left="-65" 113 <flyout_button bottom="0" follows="right|bottom" height="20" label="Say" left="-65"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_chatterbox_vertical.xml b/linden/indra/newview/skins/default/xui/en-us/floater_chatterbox_vertical.xml
new file mode 100644
index 0000000..8b1f41b
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_chatterbox_vertical.xml
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<multi_floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="true"
3 height="390" name="floater_chatterbox"
4 rect_control="ChatterboxRect" title="Communicate" width="392">
5 <tab_container bottom="2" follows="left|right|top|bottom" height="370" left="0"
6 name="chatterbox_tabs" tab_position="left" tab_width="126" width="395" />
7 <string name="unread_count_string_singular">
8 Unread IM
9 </string>
10 <string name="unread_count_string_plural">
11 Unread IMs
12 </string>
13</multi_floater>
14
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_choose_group.xml b/linden/indra/newview/skins/default/xui/en-us/floater_choose_group.xml
index 02001e9..f438262 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_choose_group.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_choose_group.xml
@@ -18,4 +18,7 @@
18 <button bottom="-236" font="SansSerif" halign="center" height="20" label="Cancel" 18 <button bottom="-236" font="SansSerif" halign="center" height="20" label="Cancel"
19 label_selected="Cancel" left_delta="88" mouse_opaque="true" name="Cancel" 19 label_selected="Cancel" left_delta="88" mouse_opaque="true" name="Cancel"
20 width="80" /> 20 width="80" />
21 <string name="none">
22 none
23 </string>
21</floater> 24</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml b/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
index b97b1e4..a8f699a 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_customize.xml
@@ -1121,4 +1121,27 @@ scratch and wear it.
1121 height="20" label="Make Outfit..." label_selected="Make Outfit..." 1121 height="20" label="Make Outfit..." label_selected="Make Outfit..."
1122 mouse_opaque="true" name="Make Outfit" left="100" scale_image="true" 1122 mouse_opaque="true" name="Make Outfit" left="100" scale_image="true"
1123 width="100" /> 1123 width="100" />
1124
1125 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
1126 bottom="-400" drop_shadow_visible="true" follows="left|top"
1127 font="SansSerif" h_pad="0" halign="left" height="16"
1128 left="8" mouse_opaque="true" name="AvatarHeightText" v_pad="0" width="140">
1129 Avatar Height:
1130 </text>
1131 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
1132 bottom_delta="-18" drop_shadow_visible="true" follows="left|top"
1133 font="SansSerif" h_pad="0" halign="left" height="16"
1134 left="8" mouse_opaque="true" name="HeightText" v_pad="0" width="140">
1135 Avatar Height
1136 </text>
1137 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
1138 bottom_delta="-18" drop_shadow_visible="true" follows="left|top"
1139 font="SansSerif" h_pad="0" halign="left" height="16"
1140 left="8" mouse_opaque="true" name="HeightText2" v_pad="0" width="140">
1141 Avatar Height2
1142 </text>
1143
1144 <button bottom="-536" follows="right|bottom" font="SansSerif" halign="center" height="20" hidden="false" label="Export" label_selected="Export" right="-280" mouse_opaque="true" name="Export" scale_image="true" width="80" />
1145 <button bottom="-536" follows="right|bottom" font="SansSerif" halign="center" height="20" hidden="false" label="Import" label_selected="Import" right="-370" mouse_opaque="true" name="Import" scale_image="true" width="80" />
1146
1124</floater> 1147</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_directory.xml b/linden/indra/newview/skins/default/xui/en-us/floater_directory.xml
index df9657c..a600c86 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_directory.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_directory.xml
@@ -1,11 +1,11 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="true" can_drag_on_left="false" can_minimize="true" 2<floater can_close="true" can_drag_on_left="false" can_minimize="true"
3 can_resize="true" height="570" min_height="570" min_width="780" 3 can_resize="true" height="590" min_height="590" min_width="780"
4 name="directory" rect_control="FloaterFindRect2" title="Search Second Life" 4 name="directory" rect_control="FloaterFindRect2" title="Search Second Life"
5 width="780"> 5 width="780">
6 <tab_container bottom="-570" follows="left|top|right|bottom" height="550" left="0" 6 <tab_container bottom="-590" follows="left|top|right|bottom" height="570" left="0"
7 mouse_opaque="false" name="Directory Tabs" tab_position="top" width="780"> 7 mouse_opaque="false" name="Directory Tabs" tab_position="top" width="780">
8 <panel border="true" bottom="-549" follows="left|top|right|bottom" height="533" 8 <panel border="true" bottom="-569" follows="left|top|right|bottom" height="553"
9 label="All" left="1" mouse_opaque="false" name="find_all_panel" width="778"> 9 label="All" left="1" mouse_opaque="false" name="find_all_panel" width="778">
10 <string name="searching_text"> 10 <string name="searching_text">
11 Searching... 11 Searching...
@@ -84,7 +84,7 @@
84 </string> 84 </string>
85 <string name="default_search_page">"http://secondlife.com/app/search/index.php?"</string> 85 <string name="default_search_page">"http://secondlife.com/app/search/index.php?"</string>
86 </panel> 86 </panel>
87 <panel border="true" bottom="-549" follows="left|top|right|bottom" height="533" 87 <panel border="true" bottom="-569" follows="left|top|right|bottom" height="553"
88 label="Classifieds" left="1" left_delta="68" mouse_opaque="false" 88 label="Classifieds" left="1" left_delta="68" mouse_opaque="false"
89 name="classified_panel" width="778"> 89 name="classified_panel" width="778">
90 <string name="searching_text"> 90 <string name="searching_text">
@@ -159,7 +159,7 @@
159 <button bottom="-533" follows="left|bottom" font="SansSerif" halign="center" 159 <button bottom="-533" follows="left|bottom" font="SansSerif" halign="center"
160 height="20" label="Delete" label_selected="Delete" left="80" 160 height="20" label="Delete" label_selected="Delete" left="80"
161 mouse_opaque="true" name="Delete" width="80" /> 161 mouse_opaque="true" name="Delete" width="80" />
162 <scroll_list background_visible="true" bottom="-510" column_padding="0" draw_border="true" 162 <scroll_list background_visible="true" bottom="-533" column_padding="0" draw_border="true"
163 draw_heading="true" follows="left|top|right|bottom" height="450" left="4" 163 draw_heading="true" follows="left|top|right|bottom" height="450" left="4"
164 mouse_opaque="true" multi_select="false" name="results" search_column="2" width="339"> 164 mouse_opaque="true" multi_select="false" name="results" search_column="2" width="339">
165 <column label="" name="icon" width="24" /> 165 <column label="" name="icon" width="24" />
@@ -178,8 +178,8 @@
178 height="20" label="&lt; Prev" label_selected="&lt; Prev" 178 height="20" label="&lt; Prev" label_selected="&lt; Prev"
179 mouse_opaque="true" name="&lt; Prev" right="258" width="80" /> 179 mouse_opaque="true" name="&lt; Prev" right="258" width="80" />
180 </panel> 180 </panel>
181 <panel border="true" bottom="-549" default_tab_group="1" 181 <panel border="true" bottom="-569" default_tab_group="1"
182 follows="left|top|right|bottom" height="533" label="Events" left="1" 182 follows="left|top|right|bottom" height="553" label="Events" left="1"
183 mouse_opaque="false" name="events_panel" width="778"> 183 mouse_opaque="false" name="events_panel" width="778">
184 <string name="searching_text"> 184 <string name="searching_text">
185 Searching... 185 Searching...
@@ -285,8 +285,8 @@
285 <button bottom="-533" follows="left|bottom" font="SansSerif" halign="center" 285 <button bottom="-533" follows="left|bottom" font="SansSerif" halign="center"
286 height="20" label="Delete" label_selected="Delete" left="80" 286 height="20" label="Delete" label_selected="Delete" left="80"
287 mouse_opaque="true" name="Delete" width="80" /> 287 mouse_opaque="true" name="Delete" width="80" />
288 <scroll_list background_visible="true" bottom="-510" column_padding="0" draw_border="true" draw_heading="true" 288 <scroll_list background_visible="true" bottom="-533" column_padding="0" draw_border="true" draw_heading="true"
289 follows="left|top|right|bottom" height="450" left="4" mouse_opaque="true" 289 follows="left|top|right|bottom" height="484" left="4" mouse_opaque="true"
290 multi_select="false" name="results" search_column="2" width="339"> 290 multi_select="false" name="results" search_column="2" width="339">
291 <column label="" name="icon" width="24" /> 291 <column label="" name="icon" width="24" />
292 <column label="" name="type" width="-1" /> 292 <column label="" name="type" width="-1" />
@@ -306,7 +306,7 @@
306 height="20" label="&lt; Prev" label_selected="&lt; Prev" 306 height="20" label="&lt; Prev" label_selected="&lt; Prev"
307 mouse_opaque="true" name="&lt; Prev" right="258" width="80" /> 307 mouse_opaque="true" name="&lt; Prev" right="258" width="80" />
308 </panel> 308 </panel>
309 <panel border="true" bottom="-549" follows="left|top|right|bottom" height="533" 309 <panel border="true" bottom="-569" follows="left|top|right|bottom" height="553"
310 label="Showcase" left="1" mouse_opaque="false" name="showcase_panel" 310 label="Showcase" left="1" mouse_opaque="false" name="showcase_panel"
311 width="778"> 311 width="778">
312 <string name="searching_text">Searching...</string> 312 <string name="searching_text">Searching...</string>
@@ -338,7 +338,7 @@
338 <string name="redirect_404_url">http://secondlife.com/app/search/notfound.html</string> 338 <string name="redirect_404_url">http://secondlife.com/app/search/notfound.html</string>
339 <string name="default_search_page">"http://secondlife.com/app/showcase/index.php?"</string> 339 <string name="default_search_page">"http://secondlife.com/app/showcase/index.php?"</string>
340 </panel> 340 </panel>
341 <panel border="true" bottom="-549" follows="left|top|right|bottom" height="533" 341 <panel border="true" bottom="-569" follows="left|top|right|bottom" height="553"
342 label="Land Sales" left="1" mouse_opaque="false" name="land_sales_panel" 342 label="Land Sales" left="1" mouse_opaque="false" name="land_sales_panel"
343 width="778" default_tab_group="1"> 343 width="778" default_tab_group="1">
344 <string name="searching_text"> 344 <string name="searching_text">
@@ -411,8 +411,8 @@ To buy direct, visit the land and click on the place name in the title bar.
411 <button bottom="-48" follows="left|top" font="SansSerif" halign="center" height="20" 411 <button bottom="-48" follows="left|top" font="SansSerif" halign="center" height="20"
412 label="Search" label_selected="Search" left="208" mouse_opaque="true" 412 label="Search" label_selected="Search" left="208" mouse_opaque="true"
413 name="Search" tab_group="5" width="70" /> 413 name="Search" tab_group="5" width="70" />
414 <scroll_list background_visible="true" bottom="-510" column_padding="0" draw_border="true" draw_heading="true" 414 <scroll_list background_visible="true" bottom="-533" column_padding="0" draw_border="true" draw_heading="true"
415 follows="left|top|right|bottom" height="450" left="4" mouse_opaque="true" 415 follows="left|top|right|bottom" height="484" left="4" mouse_opaque="true"
416 multi_select="false" name="results" search_column="2" tab_group="10" width="387"> 416 multi_select="false" name="results" search_column="2" tab_group="10" width="387">
417 <column label="" name="icon" width="24" /> 417 <column label="" name="icon" width="24" />
418 <column label="" name="type" width="-1" /> 418 <column label="" name="type" width="-1" />
@@ -433,7 +433,7 @@ To buy direct, visit the land and click on the place name in the title bar.
433 height="20" label="&lt; Prev" label_selected="&lt; Prev" 433 height="20" label="&lt; Prev" label_selected="&lt; Prev"
434 mouse_opaque="true" name="&lt; Prev" right="258" width="80" /> 434 mouse_opaque="true" name="&lt; Prev" right="258" width="80" />
435 </panel> 435 </panel>
436 <panel border="true" bottom="-549" follows="left|top|right|bottom" height="533" 436 <panel border="true" bottom="-569" follows="left|top|right|bottom" height="553"
437 label="Places" left="1" mouse_opaque="false" name="places_panel" 437 label="Places" left="1" mouse_opaque="false" name="places_panel"
438 width="778"> 438 width="778">
439 <string name="searching_text"> 439 <string name="searching_text">
@@ -550,10 +550,10 @@ To buy direct, visit the land and click on the place name in the title bar.
550 <button bottom="-48" follows="right|top" font="SansSerif" halign="center" height="20" 550 <button bottom="-48" follows="right|top" font="SansSerif" halign="center" height="20"
551 label="Search" label_selected="Search" left="121" mouse_opaque="true" 551 label="Search" label_selected="Search" left="121" mouse_opaque="true"
552 name="Search" width="95" /> 552 name="Search" width="95" />
553 <scroll_list background_visible="true" bottom="-510" column_padding="0" draw_border="true" 553 <scroll_list background_visible="true" bottom="-533" column_padding="0" draw_border="true"
554 draw_heading="true" 554 draw_heading="true"
555 555
556 follows="left|top|right|bottom" height="450" left="4" mouse_opaque="true" 556 follows="left|top|right|bottom" height="484" left="4" mouse_opaque="true"
557 multi_select="false" name="results" search_column="2" width="339"> 557 multi_select="false" name="results" search_column="2" width="339">
558 <column label="" name="icon" width="24" /> 558 <column label="" name="icon" width="24" />
559 <column label="" name="type" width="-1" /> 559 <column label="" name="type" width="-1" />
@@ -571,7 +571,7 @@ To buy direct, visit the land and click on the place name in the title bar.
571 height="20" label="&lt; Prev" label_selected="&lt; Prev" 571 height="20" label="&lt; Prev" label_selected="&lt; Prev"
572 mouse_opaque="true" name="&lt; Prev" right="258" width="80" /> 572 mouse_opaque="true" name="&lt; Prev" right="258" width="80" />
573 </panel> 573 </panel>
574 <panel border="true" bottom="-549" follows="left|top|right|bottom" height="533" 574 <panel border="true" bottom="-569" follows="left|top|right|bottom" height="553"
575 label="People" left="1" mouse_opaque="false" name="people_panel" 575 label="People" left="1" mouse_opaque="false" name="people_panel"
576 width="778"> 576 width="778">
577 <string name="searching_text"> 577 <string name="searching_text">
@@ -592,10 +592,10 @@ To buy direct, visit the land and click on the place name in the title bar.
592 <button bottom="-48" follows="right|top" font="SansSerif" halign="center" height="20" 592 <button bottom="-48" follows="right|top" font="SansSerif" halign="center" height="20"
593 label="Search" label_selected="Search" left="121" mouse_opaque="true" 593 label="Search" label_selected="Search" left="121" mouse_opaque="true"
594 name="Search" width="95" /> 594 name="Search" width="95" />
595 <scroll_list background_visible="true" bottom="-510" column_padding="0" draw_border="true" 595 <scroll_list background_visible="true" bottom="-533" column_padding="0" draw_border="true"
596 draw_heading="true" 596 draw_heading="true"
597 597
598 follows="left|top|right|bottom" height="450" left="4" mouse_opaque="true" 598 follows="left|top|right|bottom" height="484" left="4" mouse_opaque="true"
599 multi_select="false" name="results" search_column="2" width="326"> 599 multi_select="false" name="results" search_column="2" width="326">
600 <column label="" name="icon" width="24" /> 600 <column label="" name="icon" width="24" />
601 <column label="" name="type" width="-1" /> 601 <column label="" name="type" width="-1" />
@@ -612,7 +612,7 @@ To buy direct, visit the land and click on the place name in the title bar.
612 height="20" label="&lt; Prev" label_selected="&lt; Prev" 612 height="20" label="&lt; Prev" label_selected="&lt; Prev"
613 mouse_opaque="true" name="&lt; Prev" right="244" width="80" /> 613 mouse_opaque="true" name="&lt; Prev" right="244" width="80" />
614 </panel> 614 </panel>
615 <panel border="true" bottom="-549" follows="left|top|right|bottom" height="533" 615 <panel border="true" bottom="-569" follows="left|top|right|bottom" height="553"
616 label="Groups" left="1" mouse_opaque="false" 616 label="Groups" left="1" mouse_opaque="false"
617 name="groups_panel" 617 name="groups_panel"
618 width="778"> 618 width="778">
@@ -683,15 +683,15 @@ To buy direct, visit the land and click on the place name in the title bar.
683 <string name="default_search_page">"http://secondlife.com/app/search/index_groups.php?"</string> 683 <string name="default_search_page">"http://secondlife.com/app/search/index_groups.php?"</string>
684 </panel> 684 </panel>
685 </tab_container> 685 </tab_container>
686 <panel bottom="-560" follows="right|top" height="470" left="340" 686 <panel bottom="-580" follows="right|top" height="490" left="340"
687 name="classified_details_panel" width="440" /> 687 name="classified_details_panel" width="440" />
688 <panel bottom="-560" follows="right|top" height="486" left="350" name="Panel Avatar" 688 <panel bottom="-580" follows="right|top" height="506" left="350" name="Panel Avatar"
689 width="430" /> 689 width="430" />
690 <panel bottom="-560" follows="right|top" height="470" left="340" 690 <panel bottom="-560" follows="right|top" height="490" left="340"
691 name="event_details_panel" width="440" /> 691 name="event_details_panel" width="440" />
692 <panel bottom="-580" follows="right|top" height="515" left="350" 692 <panel bottom="-600" follows="right|top" height="535" left="350"
693 name="group_details_panel_holder" width="430"> 693 name="group_details_panel_holder" width="430">
694 <panel bottom="0" follows="right|top" height="470" left="0" name="group_details_panel" 694 <panel bottom="0" follows="right|top" height="490" left="0" name="group_details_panel"
695 width="430" /> 695 width="430" />
696 </panel> 696 </panel>
697 <panel bottom="-560" follows="right|top" height="470" left="340" 697 <panel bottom="-560" follows="right|top" height="470" left="340"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
index 6fef552..be8508f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
@@ -49,6 +49,8 @@
49 image_overlay="icn_voice-call-end.tga" image_overlay_alignment="left" 49 image_overlay="icn_voice-call-end.tga" image_overlay_alignment="left"
50 label="End Call" left_delta="0" name="end_call_btn" pad_right="10" 50 label="End Call" left_delta="0" name="end_call_btn" pad_right="10"
51 visible="false" width="100" /> 51 visible="false" width="100" />
52 <button bottom="-40" follows="left|top" halign="center" height="20" label="History" left_delta="105"
53 name="history_btn" visible="true" width="85" />
52 <text bottom_delta="0" left="-240" height="14" width="230" name="inventory_send" halign="right" 54 <text bottom_delta="0" left="-240" height="14" width="230" name="inventory_send" halign="right"
53 text_color="LabelTextColor" follows="right|top" drop_shadow_visible="true" 55 text_color="LabelTextColor" follows="right|top" drop_shadow_visible="true"
54 bg_visible="false" border_drop_shadow_visible="false" border_visible="false"> 56 bg_visible="false" border_drop_shadow_visible="false" border_visible="false">
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
index af60c11..2e97d64 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
@@ -49,11 +49,13 @@
49 <button bottom_delta="0" enabled="false" follows="left|top" halign="right" height="20" 49 <button bottom_delta="0" enabled="false" follows="left|top" halign="right" height="20"
50 image_overlay="icn_voice-call-start.tga" image_overlay_alignment="left" 50 image_overlay="icn_voice-call-start.tga" image_overlay_alignment="left"
51 label="Join Call" left_delta="85" name="start_call_btn" pad_right="12" 51 label="Join Call" left_delta="85" name="start_call_btn" pad_right="12"
52 width="80" /> 52 width="92" />
53 <button bottom_delta="0" follows="left|top" halign="right" height="20" 53 <button bottom_delta="0" follows="left|top" halign="right" height="20"
54 image_overlay="icn_voice-call-end.tga" image_overlay_alignment="left" 54 image_overlay="icn_voice-call-end.tga" image_overlay_alignment="left"
55 label="End Call" left_delta="0" name="end_call_btn" pad_right="12" 55 label="End Call" left_delta="0" name="end_call_btn" pad_right="12"
56 visible="false" width="80" /> 56 visible="false" width="92" />
57 <button bottom="-20" follows="left|top" halign="center" height="20" label="History" left_delta="97"
58 name="history_btn" visible="true" width="85" />
57 <button bottom_delta="0" follows="right|top" height="20" label="&lt; &lt;" 59 <button bottom_delta="0" follows="right|top" height="20" label="&lt; &lt;"
58 label_selected="&gt; &gt;" left="143" name="toggle_active_speakers_btn" 60 label_selected="&gt; &gt;" left="143" name="toggle_active_speakers_btn"
59 right="176" 61 right="176"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml b/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml
index 3d1c569..103a11e 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml
@@ -205,5 +205,27 @@
205 <on_click filter="" function="Inventory.SetSortBy" userdata="systemfolderstotop" /> 205 <on_click filter="" function="Inventory.SetSortBy" userdata="systemfolderstotop" />
206 </menu_item_check> 206 </menu_item_check>
207 </menu> 207 </menu>
208 <menu bottom_delta="64" drop_shadow="true" height="49"
209 label="Search" left="0" mouse_opaque="false" name="Search" opaque="true"
210 tear_off="true" width="118">
211 <menu_item_check bottom_delta="-18" control_name="Inventory.SearchByName" height="18"
212 label="By Name" left="0" mouse_opaque="true" name="By Name" width="118">
213 <on_click filter="" function="Inventory.SetSearchBy" userdata="name" />
214 </menu_item_check>
215 <menu_item_check bottom_delta="-18" control_name="Inventory.SearchByCreator" height="18"
216 label="By Creator" left="0" mouse_opaque="true" name="By Creator" width="118">
217 <on_click filter="" function="Inventory.SetSearchBy" userdata="creator" />
218 </menu_item_check>
219 <menu_item_check bottom_delta="-18" control_name="Inventory.SearchByDesc" height="18"
220 label="By Description" left="0" mouse_opaque="true" name="By Description" width="118">
221 <on_click filter="" function="Inventory.SetSearchBy" userdata="desc" />
222 </menu_item_check>
223 <menu_item_separator bottom_delta="-8" height="8" left="0" mouse_opaque="true" name="separator"
224 width="118" />
225 <menu_item_check bottom_delta="-18" control_name="Inventory.SearchByAll" height="18"
226 label="By All" left="0" mouse_opaque="true" name="By All" width="118">
227 <on_click filter="" function="Inventory.SetSearchBy" userdata="all" />
228 </menu_item_check>
229 </menu>
208 </menu_bar> 230 </menu_bar>
209</floater> 231</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_login.xml b/linden/indra/newview/skins/default/xui/en-us/floater_login.xml
new file mode 100644
index 0000000..96e2aa3
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_login.xml
@@ -0,0 +1,260 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="false" can_drag_on_left="false" can_minimize="false"
3 can_resize="true" height="400" min_height="400" min_width="600"
4 name="floater_login" title="plasticwuzhere" width="600">
5
6 <!-- Grid Selector -->
7 <text type="string" length="1" enabled="true" name="grid_selector_label"
8 height="10" width="100" left="5" top="-20"
9 h_pad="0" v_pad="0" halign="left"
10 font="SansSerif"
11 follows="left|top" bg_visible="false" border_visible="false" mouse_opaque="true"
12 drop_shadow_visible="true" border_drop_shadow_visible="false">
13 Select a grid:
14 </text>
15
16 <scroll_list background_visible="true" bottom_delta="25" draw_border="true"
17 draw_stripes="false"
18 follows="top|left|bottom" height="340" left="5" multi_select="false"
19 name="grid_selector" width="170">
20 <column label="" name="grid" width="200" />
21 </scroll_list>
22
23 <!-- Grid Selector Buttons -->
24 <button label="Add" label_selected="Delete" enabled="true" name="btn_add"
25 height="18" width="55" left="5" bottom_delta="-20"
26 halign="center"
27 follows="left|bottom" scale_image="true"
28 font="SansSerifSmall" mouse_opaque="true" />
29 <button label="Copy" label_selected="Add" enabled="true" name="btn_copy"
30 height="18" width="55" left_delta="58" bottom_delta="0"
31 halign="center"
32 follows="left|bottom" scale_image="true"
33 font="SansSerifSmall" mouse_opaque="true" />
34 <button label="Delete" label_selected="Copy" enabled="true" name="btn_delete"
35 height="18" width="55" left_delta="58" bottom_delta="0"
36 halign="center"
37 follows="left|bottom" scale_image="true"
38 font="SansSerifSmall" mouse_opaque="true" />
39
40 <!-- Grid Details -->
41 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
42 top="-25" drop_shadow_visible="true" follows="left|top"
43 font="SansSerif" h_pad="0" halign="left" height="16"
44 left_delta="60" mouse_opaque="true" name="gridnick_text" v_pad="0" width="120">
45 Grid Name:
46 </text>
47 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="360"
48 follows="left|top|right" font="SansSerif" handle_edit_keys_directly="true"
49 height="20" left_delta="90" max_length="40" mouse_opaque="true"
50 name="gridnick" select_all_on_focus_received="true" width="200" />
51
52
53 <!--
54 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
55 bottom_delta="-23" drop_shadow_visible="true" follows="left|top"
56 font="SansSerif" h_pad="0" halign="left" height="16"
57 left_delta="-90" mouse_opaque="true" name="first_name_text" v_pad="0" width="100">
58 First Name:
59 </text>
60 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
61 follows="left|top|right" font="SansSerif" handle_edit_keys_directly="true"
62 height="20" left_delta="90" max_length="45" mouse_opaque="true"
63 name="first_name" select_all_on_focus_received="true" width="200" />
64
65 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
66 bottom_delta="-23" drop_shadow_visible="true" follows="left|top"
67 font="SansSerif" h_pad="0" halign="left" height="16"
68 left_delta="-90" mouse_opaque="true" name="last_name_text" v_pad="0" width="100">
69 Last Name:
70 </text>
71 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
72 follows="left|top|right" font="SansSerif" handle_edit_keys_directly="true"
73 height="20" left_delta="90" max_length="45" mouse_opaque="true"
74 name="last_name" select_all_on_focus_received="true" width="200" />
75
76 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
77 bottom_delta="-23" drop_shadow_visible="true" follows="left|top"
78 font="SansSerif" h_pad="0" halign="left" height="16"
79 left_delta="-90" mouse_opaque="true" name="avatar_password_text" v_pad="0" width="120">
80 Password:
81 </text>
82 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
83 follows="left|top|right" font="SansSerif" handle_edit_keys_directly="true"
84 height="20" left_delta="90" max_length="16" mouse_opaque="true"
85 name="avatar_password" select_all_on_focus_received="true" width="200" />
86
87 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
88 bottom_delta="-22" drop_shadow_visible="true" follows="left|top"
89 font="SansSerif" h_pad="0" halign="left" height="16"
90 left_delta="-90" mouse_opaque="true" name="start_location_text" v_pad="0"
91 width="95">
92 Start Location:
93 </text>
94 <combo_box allow_text_entry="true" bottom_delta="0" follows="left|top|right" height="18"
95 left_delta="90" max_chars="128" mouse_opaque="true"
96 name="start_location_combo" width="180">
97 <combo_item name="MyHome" value="My Home">
98 My Home
99 </combo_item>
100 <combo_item name="MyLastLocation" value="My Last Location">
101 My Last Location
102 </combo_item>
103 <combo_item name="Typeregionname" value="&lt;Type region name&gt;">
104 &lt;Type region name&gt;
105 </combo_item>
106 </combo_box>
107 -->
108
109 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
110 bottom_delta="-23" drop_shadow_visible="true" follows="left|top"
111 font="SansSerif" h_pad="0" halign="left" height="16"
112 left_delta="-90" mouse_opaque="true" name="loginuri_text" v_pad="0" width="120">
113 Login URI:
114 </text>
115 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
116 follows="left|top|right" font="SansSerif" handle_edit_keys_directly="true"
117 height="20" left_delta="90" max_length="255" mouse_opaque="true"
118 name="loginuri" select_all_on_focus_received="true" width="320" />
119
120 <button label="Get Grid Info" label_selected="Get Grid Info" enabled="true" name="btn_gridinfo"
121 height="18" width="100" bottom_delta="-22"
122 halign="center"
123 follows="left|top" scale_image="true"
124 font="SansSerifSmall" mouse_opaque="true" />
125
126 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
127 bottom_delta="-50" drop_shadow_visible="true" follows="left|top"
128 font="SansSerif" h_pad="0" halign="left" height="16"
129 left="182" mouse_opaque="true" name="loginpage_text" v_pad="0" width="120">
130 Optional Fields
131 </text>
132 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
133 bottom_delta="-22" drop_shadow_visible="true" follows="left|top"
134 font="SansSerif" h_pad="0" halign="left" height="16"
135 left_delta="0" mouse_opaque="true" name="loginpage_text" v_pad="0" width="120">
136 Login Page:
137 </text>
138 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
139 follows="left|top|right" font="SansSerifSmall" handle_edit_keys_directly="true"
140 height="20" left_delta="90" max_length="255" mouse_opaque="true"
141 name="loginpage" select_all_on_focus_received="true" width="320" />
142
143 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
144 bottom_delta="-22" drop_shadow_visible="true" follows="left|top"
145 font="SansSerif" h_pad="0" halign="left" height="16"
146 left_delta="-90" mouse_opaque="true" name="helperuri_text" v_pad="0" width="120">
147 Helper URI:
148 </text>
149 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
150 follows="left|top|right" font="SansSerifSmall" handle_edit_keys_directly="true"
151 height="20" left_delta="90" max_length="255" mouse_opaque="true"
152 name="helperuri" select_all_on_focus_received="true" width="320" />
153
154 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
155 bottom_delta="-22" drop_shadow_visible="true" follows="left|top"
156 font="SansSerif" h_pad="0" halign="left" height="16"
157 left_delta="-90" mouse_opaque="true" name="website_text" v_pad="0" width="120">
158 Website:
159 </text>
160 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
161 follows="left|top|right" font="SansSerifSmall" handle_edit_keys_directly="true"
162 height="20" left_delta="90" max_length="255" mouse_opaque="true"
163 name="website" select_all_on_focus_received="true" width="320" />
164
165 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
166 bottom_delta="-22" drop_shadow_visible="true" follows="left|top"
167 font="SansSerif" h_pad="0" halign="left" height="16"
168 left_delta="-90" mouse_opaque="true" name="support_text" v_pad="0" width="120">
169 Support URL:
170 </text>
171 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
172 follows="left|top|right" font="SansSerifSmall" handle_edit_keys_directly="true"
173 height="20" left_delta="90" max_length="255" mouse_opaque="true"
174 name="support" select_all_on_focus_received="true" width="320" />
175
176 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
177 bottom_delta="-22" drop_shadow_visible="true" follows="left|top"
178 font="SansSerif" h_pad="0" halign="left" height="16"
179 left_delta="-90" mouse_opaque="true" name="register_text" v_pad="0" width="120">
180 Account URL:
181 </text>
182 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
183 follows="left|top|right" font="SansSerifSmall" handle_edit_keys_directly="true"
184 height="20" left_delta="90" max_length="255" mouse_opaque="true"
185 name="register" select_all_on_focus_received="true" width="320" />
186
187 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
188 bottom_delta="-22" drop_shadow_visible="true" follows="left|top"
189 font="SansSerif" h_pad="0" halign="left" height="16"
190 left_delta="-90" mouse_opaque="true" name="password_text" v_pad="0" width="120">
191 Password URL:
192 </text>
193 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="0"
194 follows="left|top|right" font="SansSerifSmall" handle_edit_keys_directly="true"
195 height="20" left_delta="90" max_length="255" mouse_opaque="true"
196 name="password" select_all_on_focus_received="true" width="320" />
197
198 <view_border bevel_style="none" border_thickness="1" bottom_delta="-4" follows="top|left" height="155" left_delta="-93" name="OptionalPrefsBorder" width="417" />
199
200 <!-- Combo box for multi avatar grid manager avatar name
201 <combo_box allow_text_entry="true" bevel_style="in" border_style="line" border_thickness="1"
202 bottom_delta="0" follows="left|top" font="SansSerif" handle_edit_keys_directly="true"
203 height="20" left="290" max_length="45" mouse_opaque="true"
204 name="name_combo" select_all_on_focus_received="true" width="185" />
205 -->
206 <!-- Buttons for mutli avatar grid manager
207 <button bottom="159" follows="top|right" font="SansSerif" halign="center"
208 height="20" label="New" label_selected="New"
209 left="480" mouse_opaque="true" name="new_btn" scale_image="TRUE"
210 width="70" />
211 -->
212 <!--
213 <button bottom="134" follows="top|right" font="SansSerif" halign="center"
214 height="20" label="Remove" label_selected="Remove"
215 left="480" mouse_opaque="true" name="remove_btn" scale_image="TRUE"
216 width="70" />
217-->
218
219 <!-- Checkbox for selecting a global avatar (for when combo box avatar selector works)
220 <check_box bottom="85" follows="left|top" font="SansSerifSmall" height="16"
221 initial_value="false" label="Global Avatar"
222 left_delta="0" mouse_opaque="true" name="global_check" width="138" />
223
224 <check_box bottom="10" follows="left|bottom" font="SansSerifSmall" height="16"
225 initial_value="false" label="Remember password"
226 left_delta="165" mouse_opaque="true" name="remember_check" width="138" />
227
228 <check_box bottom="10" follows="left|bottom" font="SansSerifSmall" height="16"
229 initial_value="false" label="secret level"
230 left_delta="165" mouse_opaque="true" name="gawd_mode" width="138" />
231 -->
232
233 <!-- Cancel/Connect Buttons -->
234
235 <!--
236 <button bottom="-44" follows="right|top" font="SansSerif" halign="center"
237 height="24" label="Set as Default" label_selected="Set as Default"
238 left="470" mouse_opaque="true" name="set_default" scale_image="TRUE"
239 width="110" />
240 -->
241
242 <!-- <button bottom="28" follows="right|bottom" font="SansSerif" halign="center"
243 height="24" label="Connect" label_selected="Connect"
244 left="280" mouse_opaque="true" name="connect_btn" scale_image="TRUE"
245 width="100" /> -->
246 <button bottom="8" follows="right|bottom" font="SansSerif" halign="center"
247 height="24" label="Ok" label_selected="Apply" left="280"
248 mouse_opaque="true" name="btn_ok" scale_image="TRUE" width="100" />
249 <button bottom="8" follows="right|bottom" font="SansSerif" halign="center"
250 height="24" label="Apply" label_selected="Apply" left="385"
251 mouse_opaque="true" name="btn_apply" scale_image="TRUE" width="100" />
252 <button bottom="8" follows="right|bottom" font="SansSerif" halign="center"
253 height="24" label="Undo" label_selected="Undo" left="490"
254 mouse_opaque="true" name="btn_cancel" scale_image="TRUE" width="100" />
255 <!--
256 <combo_box allow_text_entry="true" bottom="32" follows="left|bottom" height="18"
257 left_delta="135" max_chars="40" mouse_opaque="true"
258 name="server_combo" width="200" />
259 -->
260</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_media_browser.xml b/linden/indra/newview/skins/default/xui/en-us/floater_media_browser.xml
index 1a43be7..fca0379 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_media_browser.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_media_browser.xml
@@ -1,8 +1,8 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="true" 2<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="true"
3 height="440" min_height="140" min_width="467" name="floater_about" 3 height="440" min_height="140" min_width="467" name="floater_about"
4 rect_control="FloaterMediaRect" title="Media Browser" width="820"> 4 rect_control="FloaterMediaRect" title="Web Browser" width="560">
5 <layout_stack name="stack1" bottom="0" follows="left|right|top|bottom" left="10" top="-20" width="800"> 5 <layout_stack name="stack1" bottom="0" follows="left|right|top|bottom" left="10" top="-20" width="540">
6 <layout_panel auto_resize="false" bottom="0" height="20" left="0" name="nav_controls" user_resize="false" 6 <layout_panel auto_resize="false" bottom="0" height="20" left="0" name="nav_controls" user_resize="false"
7 width="800"> 7 width="800">
8 <button bottom="0" follows="left|top" height="20" label="Back" left="0" name="back" 8 <button bottom="0" follows="left|top" height="20" label="Back" left="0" name="back"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml b/linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
index 9f1e164..57f955f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_mini_map.xml
@@ -1,7 +1,107 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="true" can_drag_on_left="false" can_minimize="false" can_resize="true" 2<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="true"
3 can_tear_off="false" follows="top|right" height="220" min_height="64" min_width="64" 3 can_tear_off="false" follows="top|right" height="455" min_height="400" min_width="240"
4 name="minimap" rect_control="FloaterMiniMapRect" width="200"> 4 name="minimap" rect_control="FloaterMiniMapRect" width="200" short_title="Mini-Map">
5 <panel bottom="2" follows="left|top|right|bottom" height="216" label="Mini Map" 5
6 left="2" mouse_opaque="false" name="mini_mapview" width="196" /> 6 <panel label="Mini Map" name="mini_mapview"
7 top="-2" left="2" bottom="196" right="196"
8 follows="left|top|right|bottom" mouse_opaque="false" />
9
10 <panel name="RadarPanel" label="Radar"
11 background_visible="true" bg_alpha_color="NetMapBackgroundColor"
12 left="2" top="196" right="196" height="120"
13 follows="left|right|bottom" border="false" mouse_opaque="true">
14
15 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
16 bottom="-20" drop_shadow_visible="true" follows="left|top"
17 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="10"
18 mouse_opaque="true" name="lblAvatarCount" v_pad="0"
19 width="220">
20 0
21 </text>
22 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
23 bottom="-20" drop_shadow_visible="true" follows="left|top"
24 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="27"
25 mouse_opaque="true" name="avatars_in" v_pad="0"
26 width="220">
27 Avatars in
28 </text>
29 <slider bottom_delta="0" left_delta="55" follows="left|top" width="110" height="15"
30 name="near_me_range" label="" control_name="NearMeRange"
31 min_val="5" max_val="512" increment="1" initial_val="96" decimal_digits="0" />
32 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
33 bottom_delta="0" left="190" drop_shadow_visible="true" follows="left|top"
34 font="SansSerifSmall" h_pad="0" halign="left" height="15"
35 mouse_opaque="true" name="meters" v_pad="0"
36 width="40">
37 m
38 </text>
39 <tab_container border="false" bottom_delta="-176" height="172" left="0" mouse_opaque="false"
40 name="button_container" tab_position="top" follows="left|right|bottom" width="198">
41 <panel border="true" bottom="-180" follows="left|top|right|bottom" height="160"
42 label="Avatars" left="1" mouse_opaque="true" name="avatar_tab" width="198">
43 <button bottom="-25" follows="top|right" height="22" label="IM/Call"
44 left="-85" name="im_btn" tool_tip="Open Instant Message session"
45 width="80" />
46 <button bottom_delta="-25" follows="top|right" height="22" label="Profile"
47 left_delta="0" name="profile_btn"
48 tool_tip="Show picture, groups, and other information" width="80" />
49 <button bottom_delta="-25" follows="top|right" height="22" label="Teleport..."
50 left_delta="0" name="offer_teleport_btn"
51 tool_tip="Offer this friend a teleport to your current location" width="80" />
52 <button bottom_delta="-25" follows="top|right" height="22" label="Track"
53 left_delta="0" name="track_btn"
54 tool_tip="Create a beacon to track friends you can map" width="80" />
55 <button bottom_delta="-25" follows="top|right" height="22" label="Invite..."
56 left_delta="0" name="invite_btn"
57 tool_tip="Remove this person from your friends list" width="80" />
58 <button bottom_delta="-25" follows="top|right" height="22" label="Add..."
59 left_delta="0" name="add_btn" tool_tip="Offer friendship to a resident"
60 width="80" />
61 </panel>
62 <panel border="true" bottom="-160" follows="left|top|right|bottom" height="160"
63 label="Estate" left="1" mouse_opaque="true" name="estate_tab" width="198">
64 <button bottom="-25" follows="top|right" height="22" label="Freeze..."
65 left="-85" name="freeze_btn" tool_tip=""
66 width="80" />
67 <button bottom_delta="-25" follows="top|right" height="22" label="Eject..."
68 left_delta="0" name="eject_btn"
69 tool_tip="" width="80" />
70 <button bottom_delta="-25" follows="top|right" height="22" label="Mute..."
71 left_delta="0" name="mute_btn"
72 tool_tip="" width="80" />
73 <button bottom_delta="0" follows="top|right" height="22" label="Unmute..."
74 left_delta="0" name="unmute_btn"
75 tool_tip="" width="80" />
76 <button bottom_delta="-25" follows="top|right" height="22" label="Report..."
77 left_delta="0" name="ar_btn"
78 tool_tip="" width="80" />
79 <button bottom_delta="-25" follows="top|right" height="22" label="Kick..."
80 left_delta="0" name="estate_eject_btn" tool_tip=""
81 width="80" />
82 </panel>
83 </tab_container>
84 <scroll_list bottom="-190" width="104" height="143" left="4"
85 follows="left|bottom|right" draw_border="false" draw_heading="true"
86 draw_stripes="true" column_padding="5" sort_column="1" mouse_opaque="true"
87 background_visible="true" multi_select="false" name="RadarList">
88 <column name="avatar_name" label="Name" dynamicwidth="true" />
89 <column name="avatar_distance" label="Dist." width="48" />
90 </scroll_list>
91 </panel>
92 <string name="no_one_near">
93 No avatars within range
94 </string>
95 <string name="is_muted">
96 (muted)
97 </string>
98 <string name="is_typing">
99 (typing)
100 </string>
101 <string name="entering_chat_range">
102 [NAME] has entered chat range ([DISTANCE]m)
103 </string>
104 <string name="entering_sim_range">
105 [NAME] has entered the sim ([DISTANCE]m)
106 </string>
7</floater> 107</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml b/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
index 568f155..27a08c1 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml
@@ -225,6 +225,12 @@ now wearing into it.
225 width="489"> 225 width="489">
226 Items to include in outfit: 226 Items to include in outfit:
227 </text> 227 </text>
228 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
229 label="Check All" left_delta="200" mouse_opaque="true"
230 name="Check All" scale_image="true" width="90" />
231 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
232 label="Uncheck All" left_delta="100" mouse_opaque="true"
233 name="Uncheck All" scale_image="true" width="90" />
228 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 234 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
229 bottom="-196" drop_shadow_visible="true" enabled="true" follows="left|top" 235 bottom="-196" drop_shadow_visible="true" enabled="true" follows="left|top"
230 font="SansSerifSmall" h_pad="0" halign="left" height="14" left="13" 236 font="SansSerifSmall" h_pad="0" halign="left" height="14" left="13"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_postcard.xml b/linden/indra/newview/skins/default/xui/en-us/floater_postcard.xml
index 631db0d..9cf7b5f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_postcard.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_postcard.xml
@@ -43,7 +43,7 @@
43 <button bottom_delta="0" follows="right|bottom" height="20" label="Send" 43 <button bottom_delta="0" follows="right|bottom" height="20" label="Send"
44 left_delta="-106" name="send_btn" width="100" /> 44 left_delta="-106" name="send_btn" width="100" />
45 <string name="default_subject"> 45 <string name="default_subject">
46 Postcard from Second Life. 46 Postcard from a virtual world.
47 </string> 47 </string>
48 <string name="default_message"> 48 <string name="default_message">
49 Check this out! 49 Check this out!
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_prim_import.xml b/linden/indra/newview/skins/default/xui/en-us/floater_prim_import.xml
new file mode 100644
index 0000000..191b31e
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_prim_import.xml
@@ -0,0 +1,5 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="true" can_drag_on_left="true" can_minimize="false"
3 can_resize="false" height="80" name="Import" title="Import progress" width="200" mouse_opaque="true">
4 <text height="15" left="10" name="name_label" top="-10"> Progress </text>
5</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_profile.xml b/linden/indra/newview/skins/default/xui/en-us/floater_profile.xml
index daf45cf..c67443f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_profile.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_profile.xml
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="true" can_drag_on_left="false" can_minimize="true" 2<floater can_close="true" can_drag_on_left="false" can_minimize="true"
3 can_resize="false" height="520" min_height="0" min_width="0" 3 can_resize="false" height="545" min_height="0" min_width="0"
4 name="avatarinfo" title="Profile" width="420"> 4 name="avatarinfo" title="Profile" width="420">
5 <panel bottom="-520" height="486" left="0" name="Panel Avatar" width="430" /> 5 <panel bottom="-545" height="511" left="0" name="Panel Avatar" width="430" />
6</floater> 6</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_rlv_behaviour.xml b/linden/indra/newview/skins/default/xui/en-us/floater_rlv_behaviour.xml
new file mode 100644
index 0000000..d9e70e6
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_rlv_behaviour.xml
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="true"
3 height="425" min_height="200" min_width="375" name="rlvBehaviours"
4 title="Active RLV Restrictions" width="350">
5 <scroll_list bottom="-400" draw_border="true" draw_heading="true"
6 follows="top|left|bottom|right" height="365" left="15" multi_select="false"
7 name="behaviour_list" right="-15">
8 <column label="Restriction" name="behaviour" width="170" />
9 <column label="Object Name" name="name" width="170" />
10 </scroll_list>
11</floater> \ No newline at end of file
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml b/linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml
index b83a6df..653c75b 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_script_ed_panel.xml
@@ -35,6 +35,12 @@
35 width="138" /> 35 width="138" />
36 <menu_item_call bottom_delta="-58" height="20" label="Revert All Changes" left="0" 36 <menu_item_call bottom_delta="-58" height="20" label="Revert All Changes" left="0"
37 mouse_opaque="true" name="Revert All Changes" width="138" /> 37 mouse_opaque="true" name="Revert All Changes" width="138" />
38 <menu_item_separator bottom_delta="-66" height="8" left="0" mouse_opaque="true" name="separator"
39 width="138" />
40 <menu_item_call bottom_delta="-76" height="20" label="Save to Disk" left="0"
41 mouse_opaque="true" name="Save to Disk" width="138" />
42 <menu_item_call bottom_delta="-96" height="20" label="Load from Disk" left="0"
43 mouse_opaque="true" name="Load from Disk" width="138" />
38 </menu> 44 </menu>
39 <menu bottom="665" drop_shadow="true" enabled="true" height="198" 45 <menu bottom="665" drop_shadow="true" enabled="true" height="198"
40 left="222" mouse_opaque="false" name="Edit" opaque="true" tear_off="false" 46 left="222" mouse_opaque="false" name="Edit" opaque="true" tear_off="false"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_snapshot.xml b/linden/indra/newview/skins/default/xui/en-us/floater_snapshot.xml
index bb719cf..efe524c 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_snapshot.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_snapshot.xml
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater bottom="-300" can_close="true" can_drag_on_left="false" can_minimize="false" 2<floater bottom="-320" can_close="true" can_drag_on_left="false" can_minimize="true"
3 can_resize="false" follows="left|top" height="526" name="Snapshot" 3 can_resize="false" follows="left|top" height="546" name="Snapshot"
4 rect_control="FloaterSnapshotRect" title="Snapshot Preview" width="215"> 4 rect_control="FloaterSnapshotRect" title="Snapshot Preview" width="215">
5 <text bottom_delta="-40" follows="top|left" height="15" left="10" name="type_label" 5 <text bottom_delta="-40" follows="top|left" height="15" left="10" name="type_label"
6 width="195"> 6 width="195">
@@ -140,9 +140,9 @@
140 <check_box bottom_delta="-20" follows="left|top" label="Constrain Proportions" left="10" 140 <check_box bottom_delta="-20" follows="left|top" label="Constrain Proportions" left="10"
141 name="keep_aspect_check" /> 141 name="keep_aspect_check" />
142 <slider bottom_delta="-20" decimal_digits="0" follows="left|top" height="15" 142 <slider bottom_delta="-20" decimal_digits="0" follows="left|top" height="15"
143 increment="1" initial_val="75" label="Image Quality" left="10" 143 increment="1" initial_val="75" label="Image Quality" left="10" label_width="80"
144 max_val="100" min_val="0" name="image_quality_slider" width="210" /> 144 max_val="100" min_val="0" name="image_quality_slider" width="210" />
145 <check_box bottom_delta="0" follows="left|top" label="High resolution snapshot" 145 <check_box bottom_delta="-20" follows="left|top" label="High resolution snapshot"
146 left="10" name="high_res_check" /> 146 left="10" name="high_res_check" />
147 <text bottom_delta="-28" follows="left|top" height="20" left="10" 147 <text bottom_delta="-28" follows="left|top" height="20" left="10"
148 name="layer_type_label" width="50"> 148 name="layer_type_label" width="50">
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
index a7ba9a6..959ebde 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater bottom="-359" can_close="true" can_drag_on_left="false" can_minimize="true" 2<floater bottom="-374" can_close="true" can_drag_on_left="false" can_minimize="true"
3 can_resize="false" follows="left|top" height="550" 3 can_resize="false" follows="left|top" height="565"
4 left="308" min_height="100" min_width="100" mouse_opaque="true" 4 left="308" min_height="100" min_width="100" mouse_opaque="true"
5 name="toolbox floater" rect_control="ToolboxRect" sound_flags="0" title="" 5 name="toolbox floater" rect_control="ToolboxRect" sound_flags="0" title=""
6 short_title="Build" width="272"> 6 short_title="Build" width="272">
@@ -79,14 +79,18 @@
79 <check_box bottom_delta="-15" follows="left|top" font="SansSerifSmall" height="16" 79 <check_box bottom_delta="-15" follows="left|top" font="SansSerifSmall" height="16"
80 initial_value="false" label="Select Faces to Texture" left="4" mouse_opaque="true" 80 initial_value="false" label="Select Faces to Texture" left="4" mouse_opaque="true"
81 name="radio select face" radio_style="true" width="114" /> 81 name="radio select face" radio_style="true" width="114" />
82 <check_box bottom_delta="-22" control_name="SnapEnabled" follows="left|top" 82 <check_box bottom_delta="-19" control_name="EditLinkedParts" follows="left|top"
83 font="SansSerifSmall" height="16" initial_value="true" label="Use Grid" 83 font="SansSerifSmall" height="16" initial_value="false"
84 left_delta="0" mouse_opaque="true" name="checkbox snap to grid" width="134" /> 84 label="Edit linked parts" left="4" mouse_opaque="true"
85 <button bottom_delta="0" follows="left|top" font="SansSerifSmall" halign="center" 85 name="checkbox edit linked parts" width="114" />
86 height="16" label="Options..." label_selected="Options..." left_delta="75" 86 <button bottom_delta="-19" follows="left|top" font="SansSerifSmall"
87 mouse_opaque="true" name="Options..." scale_image="TRUE" width="80" /> 87 halign="center" height="18" label="Link" label_selected="Link"
88 left="10" mouse_opaque="true" name="link_btn" width="68" />
89 <button bottom_delta="0" follows="left|top" font="SansSerifSmall"
90 halign="center" height="18" label="Unlink" label_selected="Unlink"
91 left_delta="75" mouse_opaque="true" name="unlink_btn" width="68" />
88 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 92 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
89 bottom_delta="-20" drop_shadow_visible="true" follows="left|top" 93 bottom_delta="-18" drop_shadow_visible="true" follows="left|top"
90 font="SansSerifSmall" h_pad="0" halign="left" height="14" left="6" 94 font="SansSerifSmall" h_pad="0" halign="left" height="14" left="6"
91 mouse_opaque="true" name="text ruler mode" v_pad="0" width="68"> 95 mouse_opaque="true" name="text ruler mode" v_pad="0" width="68">
92 Ruler: 96 Ruler:
@@ -112,16 +116,13 @@
112 font="SansSerifSmall" height="16" initial_value="true" 116 font="SansSerifSmall" height="16" initial_value="true"
113 label="Stretch Textures" left_delta="0" mouse_opaque="true" 117 label="Stretch Textures" left_delta="0" mouse_opaque="true"
114 name="checkbox stretch textures" width="134" /> 118 name="checkbox stretch textures" width="134" />
115 <check_box bottom_delta="-15" control_name="EditLinkedParts" follows="left|top" 119 <check_box bottom_delta="-19" control_name="SnapEnabled" follows="left|top"
116 font="SansSerifSmall" height="16" initial_value="false" 120 font="SansSerifSmall" height="16" initial_value="true" label="Use Grid"
117 label="Edit linked parts" left="143" mouse_opaque="true" 121 left_delta="0" mouse_opaque="true" name="checkbox snap to grid" width="134" />
118 name="checkbox edit linked parts" width="114" /> 122 <button bottom_delta="-19" follows="left|top" font="SansSerifSmall"
119 <button bottom_delta="-18" follows="left|top" font="SansSerifSmall" 123 halign="center" valign="center"
120 halign="center" height="18" label="Link" label_selected="Link" 124 height="20" label="Options..." label_selected="Options..." left_delta="20"
121 right="-5" mouse_opaque="true" name="link_btn" width="78" /> 125 mouse_opaque="true" name="Options..." scale_image="TRUE" width="80" />
122 <button bottom_delta="-20" follows="left|top" font="SansSerifSmall"
123 halign="center" height="18" label="Unlink" label_selected="Unlink"
124 right="-5" mouse_opaque="true" name="unlink_btn" width="78" />
125 126
126 127
127<!-- Help text --> 128<!-- Help text -->
@@ -309,13 +310,13 @@
309 increment="0.1" initial_val="0.00" left="178" max_val="2.0" min_val="-1.0" 310 increment="0.1" initial_val="0.00" left="178" max_val="2.0" min_val="-1.0"
310 mouse_opaque="true" name="slider force" width="80" /> 311 mouse_opaque="true" name="slider force" width="80" />
311 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 312 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
312 bottom="-151" left="118" drop_shadow_visible="true" follows="left|top" 313 bottom="-168" left="118" drop_shadow_visible="true" follows="left|top"
313 font="SansSerifSmall" h_pad="0" halign="right" height="16" 314 font="SansSerifSmall" h_pad="0" halign="right" height="16"
314 mouse_opaque="true" name="obj_count" v_pad="0" width="143"> 315 mouse_opaque="true" name="obj_count" v_pad="0" width="143">
315 Selected objects: [COUNT] 316 Selected objects: [COUNT]
316 </text> 317 </text>
317 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 318 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
318 bottom="-163" left="118" drop_shadow_visible="true" follows="left|top" 319 bottom="-181" left="118" drop_shadow_visible="true" follows="left|top"
319 font="SansSerifSmall" h_pad="0" halign="right" height="16" 320 font="SansSerifSmall" h_pad="0" halign="right" height="16"
320 mouse_opaque="true" name="prim_count" v_pad="0" width="143"> 321 mouse_opaque="true" name="prim_count" v_pad="0" width="143">
321 primitives: [COUNT] 322 primitives: [COUNT]
@@ -323,7 +324,7 @@
323 324
324<!-- Sub-tabs --> 325<!-- Sub-tabs -->
325 326
326 <tab_container bottom="-550" follows="left|top" height="384" left="0" mouse_opaque="false" 327 <tab_container bottom="-565" follows="left|top" height="384" left="0" mouse_opaque="false"
327 name="Object Info Tabs" tab_max_width="52" tab_min_width="40" 328 name="Object Info Tabs" tab_max_width="52" tab_min_width="40"
328 tab_position="top" width="272"> 329 tab_position="top" width="272">
329 <panel border="true" bottom="-383" follows="left|top|right|bottom" height="367" 330 <panel border="true" bottom="-383" follows="left|top|right|bottom" height="367"
@@ -380,20 +381,36 @@
380 height="20" label="Profile..." label_selected="Profile..." left_delta="94" 381 height="20" label="Profile..." label_selected="Profile..." left_delta="94"
381 mouse_opaque="true" name="button owner profile" scale_image="TRUE" 382 mouse_opaque="true" name="button owner profile" scale_image="TRUE"
382 width="78" /> 383 width="78" />
384 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
385 bottom_delta="-20" drop_shadow_visible="true" follows="left|top"
386 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="10"
387 mouse_opaque="true" name="Last Owner:" v_pad="0" width="78">
388 Last Owner:
389 </text>
390 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
391 bottom_delta="0" drop_shadow_visible="true" follows="left|top"
392 font="SansSerifSmall" h_pad="0" halign="left" height="16" left_delta="78"
393 mouse_opaque="true" name="Last Owner Name" v_pad="0" width="88">
394 Thrax Linden
395 </text>
396 <button bottom_delta="0" follows="top|right" font="SansSerifSmall" halign="center"
397 height="20" label="Profile..." label_selected="Profile..." left_delta="94"
398 mouse_opaque="true" name="button last owner profile" scale_image="TRUE"
399 width="78" />
383 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 400 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
384 bottom="-106" drop_shadow_visible="true" follows="left|top" 401 bottom="-126" drop_shadow_visible="true" follows="left|top"
385 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="10" 402 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="10"
386 mouse_opaque="true" name="Group:" v_pad="0" width="78"> 403 mouse_opaque="true" name="Group:" v_pad="0" width="78">
387 Group: 404 Group:
388 </text> 405 </text>
389 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 406 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
390 bottom="-106" drop_shadow_visible="true" follows="left|top" 407 bottom="-126" drop_shadow_visible="true" follows="left|top"
391 font="SansSerifSmall" h_pad="0" halign="left" height="16" left_delta="78" 408 font="SansSerifSmall" h_pad="0" halign="left" height="16" left_delta="78"
392 mouse_opaque="true" name="Group Name Proxy" v_pad="0" visible="false" 409 mouse_opaque="true" name="Group Name Proxy" v_pad="0" visible="false"
393 width="88"> 410 width="88">
394 The Lindens 411 The Lindens
395 </text> 412 </text>
396 <button bottom="-106" follows="top|right" font="SansSerifSmall" halign="center" 413 <button bottom="-126" follows="top|right" font="SansSerifSmall" halign="center"
397 height="20" label="Set..." label_selected="Set..." left_delta="94" 414 height="20" label="Set..." label_selected="Set..." left_delta="94"
398 mouse_opaque="true" name="button set group" scale_image="TRUE" width="78" /> 415 mouse_opaque="true" name="button set group" scale_image="TRUE" width="78" />
399 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 416 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
@@ -419,7 +436,7 @@
419 <string name="text deed"> 436 <string name="text deed">
420 Deed 437 Deed
421 </string> 438 </string>
422 <button bottom="-186" follows="top|right" font="SansSerifSmall" halign="center" 439 <button bottom_delta="0" follows="top|right" font="SansSerifSmall" halign="center"
423 height="20" label="Deed..." label_selected="Deed..." left_delta="172" 440 height="20" label="Deed..." label_selected="Deed..." left_delta="172"
424 mouse_opaque="true" name="button deed" scale_image="TRUE" 441 mouse_opaque="true" name="button deed" scale_image="TRUE"
425 tool_tip="Group shared objects can be deeded by a group officer." 442 tool_tip="Group shared objects can be deeded by a group officer."
@@ -508,37 +525,37 @@
508 </combo_item> 525 </combo_item>
509 </combo_box> 526 </combo_box>
510 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 527 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
511 bottom="-115" drop_shadow_visible="true" follows="left|top" 528 bottom="-135" drop_shadow_visible="true" follows="left|top"
512 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="88" 529 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="88"
513 mouse_opaque="true" name="B:" v_pad="0" width="174"> 530 mouse_opaque="true" name="B:" v_pad="0" width="174">
514 B: 531 B:
515 </text> 532 </text>
516 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 533 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
517 bottom="-115" drop_shadow_visible="true" follows="left|top" 534 bottom="-135" drop_shadow_visible="true" follows="left|top"
518 font="SansSerifSmall" h_pad="0" halign="left" height="10" left_delta="50" 535 font="SansSerifSmall" h_pad="0" halign="left" height="10" left_delta="50"
519 mouse_opaque="true" name="O:" v_pad="0" width="124"> 536 mouse_opaque="true" name="O:" v_pad="0" width="124">
520 O; 537 O;
521 </text> 538 </text>
522 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 539 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
523 bottom="-115" drop_shadow_visible="true" follows="left|top" 540 bottom="-135" drop_shadow_visible="true" follows="left|top"
524 font="SansSerifSmall" h_pad="0" halign="left" height="10" left_delta="50" 541 font="SansSerifSmall" h_pad="0" halign="left" height="10" left_delta="50"
525 mouse_opaque="true" name="G:" v_pad="0" width="74"> 542 mouse_opaque="true" name="G:" v_pad="0" width="74">
526 G: 543 G:
527 </text> 544 </text>
528 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 545 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
529 bottom="-127" drop_shadow_visible="true" follows="left|top" 546 bottom="-147" drop_shadow_visible="true" follows="left|top"
530 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="88" 547 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="88"
531 mouse_opaque="true" name="E:" v_pad="0" width="174"> 548 mouse_opaque="true" name="E:" v_pad="0" width="174">
532 E: 549 E:
533 </text> 550 </text>
534 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 551 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
535 bottom="-127" drop_shadow_visible="true" follows="left|top" 552 bottom="-147" drop_shadow_visible="true" follows="left|top"
536 font="SansSerifSmall" h_pad="0" halign="left" height="10" left_delta="50" 553 font="SansSerifSmall" h_pad="0" halign="left" height="10" left_delta="50"
537 mouse_opaque="true" name="N:" v_pad="0" width="124"> 554 mouse_opaque="true" name="N:" v_pad="0" width="124">
538 N: 555 N:
539 </text> 556 </text>
540 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 557 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
541 bottom="-127" drop_shadow_visible="true" follows="left|top" 558 bottom="-147" drop_shadow_visible="true" follows="left|top"
542 font="SansSerifSmall" h_pad="0" halign="left" height="10" left_delta="50" 559 font="SansSerifSmall" h_pad="0" halign="left" height="10" left_delta="50"
543 mouse_opaque="true" name="F:" v_pad="0" width="74"> 560 mouse_opaque="true" name="F:" v_pad="0" width="74">
544 F: 561 F:
@@ -638,15 +655,15 @@
638 </text> 655 </text>
639 <spinner bottom_delta="-20" decimal_digits="3" follows="left|top" height="16" 656 <spinner bottom_delta="-20" decimal_digits="3" follows="left|top" height="16"
640 increment="0.01" initial_val="0" label="X" label_width="10" left="10" 657 increment="0.01" initial_val="0" label="X" label_width="10" left="10"
641 max_val="10" min_val="0.01" mouse_opaque="true" name="Scale X" 658 min_val="0.01" mouse_opaque="true" name="Scale X"
642 text_enabled_color="1, 1, 1, 1" width="96" /> 659 text_enabled_color="1, 1, 1, 1" width="96" />
643 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16" 660 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16"
644 increment="0.01" initial_val="0" label="Y" label_width="10" left="10" 661 increment="0.01" initial_val="0" label="Y" label_width="10" left="10"
645 max_val="10" min_val="0.01" mouse_opaque="true" name="Scale Y" 662 min_val="0.01" mouse_opaque="true" name="Scale Y"
646 text_enabled_color="1, 1, 1, 1" width="96" /> 663 text_enabled_color="1, 1, 1, 1" width="96" />
647 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16" 664 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16"
648 increment="0.01" initial_val="0" label="Z" label_width="10" left="10" 665 increment="0.01" initial_val="0" label="Z" label_width="10" left="10"
649 max_val="10" min_val="0.01" mouse_opaque="true" name="Scale Z" 666 min_val="0.01" mouse_opaque="true" name="Scale Z"
650 text_enabled_color="1, 1, 1, 1" width="96" /> 667 text_enabled_color="1, 1, 1, 1" width="96" />
651 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 668 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
652 bottom_delta="-16" drop_shadow_visible="true" follows="left|top" 669 bottom_delta="-16" drop_shadow_visible="true" follows="left|top"
@@ -755,12 +772,12 @@
755 Skew 772 Skew
756 </text> 773 </text>
757 <spinner bottom_delta="-20" decimal_digits="1" follows="left|top" height="16" 774 <spinner bottom_delta="-20" decimal_digits="1" follows="left|top" height="16"
758 increment="5" initial_val="0" left="121" max_val="95" min_val="0" 775 increment="5" initial_val="0" left="121" max_val="95" min_val="0"
759 mouse_opaque="true" name="Scale 1" width="68" label=" " label_width="10"/> 776 mouse_opaque="true" name="Scale 1" width="68" />
760 <spinner bottom_delta="0" decimal_digits="2" follows="left|top" height="16" 777 <spinner bottom_delta="0" decimal_digits="2" follows="left|top" height="16"
761 increment="0.05" initial_val="0" left_delta="73" max_val="0.95" label_width="10" 778 increment="0.05" initial_val="0" left_delta="73" max_val="0.95"
762 min_val="-0.95" mouse_opaque="true" name="Skew" width="68" label=" " /> 779 min_val="-0.95" mouse_opaque="true" name="Skew" width="68" />
763 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 780 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
764 bottom_delta="-15" drop_shadow_visible="true" follows="left|top" 781 bottom_delta="-15" drop_shadow_visible="true" follows="left|top"
765 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="121" 782 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="121"
766 mouse_opaque="true" name="Hollow Shape" v_pad="0" width="141"> 783 mouse_opaque="true" name="Hollow Shape" v_pad="0" width="141">
@@ -879,10 +896,10 @@
879 </text> 896 </text>
880 <spinner bottom_delta="-19" decimal_digits="3" follows="left|top" height="16" 897 <spinner bottom_delta="-19" decimal_digits="3" follows="left|top" height="16"
881 increment="0.05" initial_val="0" left="121" max_val="1" min_val="-1" 898 increment="0.05" initial_val="0" left="121" max_val="1" min_val="-1"
882 mouse_opaque="true" name="Radius Offset" width="68" label=" " label_width="10" /> 899 mouse_opaque="true" name="Radius Offset" width="68" />
883 <spinner bottom_delta="0" decimal_digits="2" follows="left|top" height="16" 900 <spinner bottom_delta="0" decimal_digits="2" follows="left|top" height="16"
884 increment="0.1" initial_val="1" left_delta="73" max_val="4" min_val="1" 901 increment="0.1" initial_val="1" left_delta="73" max_val="4" min_val="1"
885 mouse_opaque="true" name="Revolutions" width="68" label=" " label_width="10" /> 902 mouse_opaque="true" name="Revolutions" width="68" />
886 <texture_picker allow_no_texture="false" bottom="-211" can_apply_immediately="true" 903 <texture_picker allow_no_texture="false" bottom="-211" can_apply_immediately="true"
887 default_image_name="Default" follows="left|top" height="141" 904 default_image_name="Default" follows="left|top" height="141"
888 label="Sculpt Texture" left="121" mouse_opaque="true" 905 label="Sculpt Texture" left="121" mouse_opaque="true"
@@ -1238,25 +1255,6 @@
1238 Parcel Information 1255 Parcel Information
1239 </text> 1256 </text>
1240 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 1257 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
1241 bottom="-40" drop_shadow_visible="true" follows="left|top"
1242 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="40"
1243 mouse_opaque="true" name="label_parcel_modify" v_pad="0" width="150">
1244 Modify Parcel
1245 </text>
1246 <button bottom_delta="-24" follows="left|top" font="SansSerif" halign="center"
1247 height="20" label="Subdivide..." label_selected="Subdivide..." left="48"
1248 mouse_opaque="true" name="button subdivide land" scale_image="TRUE"
1249 width="112" />
1250 <button bottom_delta="-24" follows="left|top" font="SansSerif" halign="center"
1251 height="20" label="Join..." label_selected="Join..." left="48"
1252 mouse_opaque="true" name="button join land" scale_image="TRUE" width="112" />
1253 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
1254 bottom_delta="-56" drop_shadow_visible="true" follows="left|top"
1255 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="40"
1256 mouse_opaque="true" name="label_parcel_info" v_pad="0" width="150">
1257 Parcel Information
1258 </text>
1259 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
1260 bottom_delta="-24" drop_shadow_visible="true" follows="left|top" 1258 bottom_delta="-24" drop_shadow_visible="true" follows="left|top"
1261 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="48" 1259 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="48"
1262 mouse_opaque="true" name="label_area_price" v_pad="0" width="150"> 1260 mouse_opaque="true" name="label_area_price" v_pad="0" width="150">
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_water.xml b/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
index 9dcb96e..7038c93 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_water.xml
@@ -11,17 +11,23 @@
11 width="110"> 11 width="110">
12 Water Presets: 12 Water Presets:
13 </text> 13 </text>
14 <combo_box allow_text_entry="false" bottom="-50" follows="left|top" height="18" 14 <combo_box allow_text_entry="false" bottom="-52" follows="left|top" height="18"
15 left_delta="110" max_chars="20" mouse_opaque="true" 15 left_delta="120" max_chars="20" mouse_opaque="true"
16 name="WaterPresetsCombo" width="150" /> 16 name="WaterPresetsCombo" width="150" />
17 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20"
18 label="" label_selected="" left_delta="-25" image_overlay="arrow_left.tga"
19 mouse_opaque="true" name="prev" scale_image="true" width="20" />
20 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20"
21 label="" label_selected="" left_delta="180" image_overlay="arrow_right.tga"
22 mouse_opaque="true" name="next" scale_image="true" width="20" />
17 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20" 23 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20"
18 label="New" label_selected="New" left_delta="170" 24 label="New" label_selected="New" left_delta="40"
19 mouse_opaque="true" name="WaterNewPreset" scale_image="true" width="70" /> 25 mouse_opaque="true" name="WaterNewPreset" scale_image="true" width="70" />
20 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20" 26 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
21 label="Save" label_selected="Save" left_delta="80" 27 label="Save" label_selected="Save" left_delta="70"
22 mouse_opaque="true" name="WaterSavePreset" scale_image="true" width="70" /> 28 mouse_opaque="true" name="WaterSavePreset" scale_image="true" width="70" />
23 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20" 29 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
24 label="Delete" label_selected="Delete" left_delta="80" 30 label="Delete" label_selected="Delete" left_delta="70"
25 mouse_opaque="true" name="WaterDeletePreset" scale_image="true" width="70" /> 31 mouse_opaque="true" name="WaterDeletePreset" scale_image="true" width="70" />
26 <tab_container bottom="-240" follows="left|top" height="180" left="0" 32 <tab_container bottom="-240" follows="left|top" height="180" left="0"
27 mouse_opaque="false" name="Water Tabs" tab_position="top" width="700"> 33 mouse_opaque="false" name="Water Tabs" tab_position="top" width="700">
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml b/linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml
index 906e7de..471b3e5 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_windlight_options.xml
@@ -4,29 +4,35 @@
4 min_width="400" mouse_opaque="true" name="WindLight floater" 4 min_width="400" mouse_opaque="true" name="WindLight floater"
5 rect_control="FloaterAdvancedSkyRect" title="Advanced Sky Editor" 5 rect_control="FloaterAdvancedSkyRect" title="Advanced Sky Editor"
6 width="700"> 6 width="700">
7 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 7 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
8 bottom="-50" drop_shadow_visible="true" follows="left|top|right" 8 bottom="-50" drop_shadow_visible="true" follows="left|top|right"
9 font="SansSerif" h_pad="0" halign="left" height="16" 9 font="SansSerif" h_pad="0" halign="left" height="16"
10 left="10" mouse_opaque="true" name="KeyFramePresetsText" v_pad="0" 10 left="10" mouse_opaque="true" name="KeyFramePresetsText" v_pad="0"
11 width="110"> 11 width="110">
12 Sky Presets: 12 Sky Presets:
13 </text> 13 </text>
14 <combo_box allow_text_entry="false" bottom="-50" follows="left|top" height="18" 14 <combo_box allow_text_entry="false" bottom="-52" follows="left|top" height="18"
15 left_delta="110" max_chars="20" mouse_opaque="true" name="WLPresetsCombo" 15 left_delta="110" max_chars="20" mouse_opaque="true" name="WLPresetsCombo"
16 width="150" /> 16 width="150" />
17 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20"
18 label="" label_selected="" left_delta="-25" image_overlay="arrow_left.tga"
19 mouse_opaque="true" name="prev" scale_image="true" width="20" />
20 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20"
21 label="" label_selected="" left_delta="180" image_overlay="arrow_right.tga"
22 mouse_opaque="true" name="next" scale_image="true" width="20" />
17 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20" 23 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20"
18 label="New" label_selected="New" left_delta="170" 24 label="New" label_selected="New" left_delta="40"
19 mouse_opaque="true" name="WLNewPreset" scale_image="true" width="70" /> 25 mouse_opaque="true" name="WLNewPreset" scale_image="true" width="70" />
20 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20" 26 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
21 label="Save" label_selected="Save" left_delta="80" 27 label="Save" label_selected="Save" left_delta="70"
22 mouse_opaque="true" name="WLSavePreset" scale_image="true" width="70" /> 28 mouse_opaque="true" name="WLSavePreset" scale_image="true" width="70" />
23 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20" 29 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
24 label="Delete" label_selected="Delete" left_delta="80" 30 label="Delete" label_selected="Delete" left_delta="70"
25 mouse_opaque="true" name="WLDeletePreset" scale_image="true" width="70" /> 31 mouse_opaque="true" name="WLDeletePreset" scale_image="true" width="70" />
26 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20" 32 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
27 label="Day Cycle Editor" label_selected="Day Cycle Editor" 33 label="Day Cycle Editor" label_selected="Day Cycle Editor"
28 left_delta="120" mouse_opaque="true" name="WLDayCycleMenuButton" 34 left_delta="100" mouse_opaque="true" name="WLDayCycleMenuButton"
29 scale_image="true" width="120" /> 35 scale_image="true" width="125" />
30 <tab_container bottom="-220" follows="left|top" height="160" left="0" 36 <tab_container bottom="-220" follows="left|top" height="160" left="0"
31 mouse_opaque="false" name="WindLight Tabs" tab_position="top" width="700"> 37 mouse_opaque="false" name="WindLight Tabs" tab_position="top" width="700">
32 <panel border="true" bottom="-220" follows="left|top|right|bottom" height="160" 38 <panel border="true" bottom="-220" follows="left|top|right|bottom" height="160"
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml b/linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml
index 485ae9f..d1f5fc8 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml
@@ -19,8 +19,13 @@
19 <on_click function="MiniMap.Center" userdata="1" /> 19 <on_click function="MiniMap.Center" userdata="1" />
20 <on_check function="MiniMap.CheckCenter" userdata="1" /> 20 <on_check function="MiniMap.CheckCenter" userdata="1" />
21 </menu_item_check> 21 </menu_item_check>
22 <menu_item_check bottom_delta="-18" enabled="true" height="18" label="Rotate Mini-Map"
23 left="0" mouse_opaque="true" name="Rotate Mini-Map" width="128">
24 <on_click function="MiniMap.Rotate" userdata="" />
25 <on_check function="MiniMap.CheckRotate" userdata="" />
26 </menu_item_check>
22 <menu_item_separator /> 27 <menu_item_separator />
23 <menu_item_call bottom_delta="-18" enabled = "false" height="18" label="Show Map" 28 <menu_item_call bottom_delta="-18" enabled = "false" height="18" label="Show World Map"
24 left="0" mouse_opaque="true" name="Show Map" width="128"> 29 left="0" mouse_opaque="true" name="Show Map" width="128">
25 <on_click function="MiniMap.ShowWorldMap" userdata="" /> 30 <on_click function="MiniMap.ShowWorldMap" userdata="" />
26 </menu_item_call> 31 </menu_item_call>
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml b/linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
index 34c855d..6f4331d 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
@@ -4,10 +4,10 @@
4 <on_click function="Object.Open" /> 4 <on_click function="Object.Open" />
5 <on_enable function="Object.EnableOpen" /> 5 <on_enable function="Object.EnableOpen" />
6 </menu_item_call> 6 </menu_item_call>
7 <menu_item_call enabled="false" label="Create" mouse_opaque="true" name="Create"> 7 <menu_item_call enabled="false" label="Buy..." mouse_opaque="true" name="Buy...">
8 <on_click function="Object.Build" /> 8 <on_click function="Object.Buy" />
9 <on_enable function="EnableEdit" /> 9 <on_enable function="Object.EnableBuy" />
10 </menu_item_call> 10 </menu_item_call>
11 <menu_item_call enabled="false" label="Touch" mouse_opaque="true" name="Object Touch"> 11 <menu_item_call enabled="false" label="Touch" mouse_opaque="true" name="Object Touch">
12 <on_click function="Object.Touch" /> 12 <on_click function="Object.Touch" />
13 <on_enable function="Object.EnableTouch" userdata="Touch" name="EnableTouch"/> 13 <on_enable function="Object.EnableTouch" userdata="Touch" name="EnableTouch"/>
@@ -29,22 +29,27 @@
29 <on_click function="Object.Delete" /> 29 <on_click function="Object.Delete" />
30 <on_enable function="Object.EnableDelete" /> 30 <on_enable function="Object.EnableDelete" />
31 </menu_item_call> 31 </menu_item_call>
32 <menu_item_call enabled="false" label="Wear" mouse_opaque="true" name="Wear"> 32 <menu_item_call enabled="false" label="Build" mouse_opaque="true" name="Create">
33 <on_click function="Object.AttachToAvatar" /> 33 <on_click function="Object.Build" />
34 <on_enable function="Object.EnableWear" /> 34 <on_enable function="EnableEdit" />
35 </menu_item_call> 35 </menu_item_call>
36 <menu_item_call enabled="false" label="Take Copy" mouse_opaque="true" name="Take Copy"> 36
37 <on_click function="Tools.TakeCopy" /> 37 <menu_item_call enabled="false" label="Take Copy" mouse_opaque="true" name="Take Copy">
38 <on_enable function="Tools.EnableTakeCopy" /> 38 <on_click function="Tools.TakeCopy" />
39 </menu_item_call> 39 <on_enable function="Tools.EnableTakeCopy" />
40 <pie_menu label="Attach HUD &gt;" name="Object Attach HUD" /> 40 </menu_item_call>
41 <pie_menu label="Attach &gt;" name="Object Attach" /> 41 <pie_menu label="Attach HUD &gt;" name="Object Attach HUD" />
42 <menu_item_call enabled="false" label="Return..." mouse_opaque="true" name="Return..."> 42 <pie_menu label="Attach &gt;" name="Object Attach" />
43 <on_click function="Object.Return" /> 43 <menu_item_call enabled="false" label="Wear" mouse_opaque="true" name="Wear">
44 <on_enable function="Object.EnableReturn" /> 44 <on_click function="Object.AttachToAvatar" />
45 </menu_item_call> 45 <on_enable function="Object.EnableWear" />
46 <pie_menu label="More &gt;" name="Rate Menu"> 46 </menu_item_call>
47 <menu_item_separator /> 47 <pie_menu label="More &gt;" name="Rate Menu">
48 <menu_item_call label="Export" enabled="false" hidden="false"
49 mouse_opaqu="true" name="Export">
50 <on_click function="Object.Export" />
51 <on_enable function="Object.EnableExport" />
52 </menu_item_call>
48 <menu_item_call enabled="false" label="Mute" mouse_opaque="true" name="Object Mute"> 53 <menu_item_call enabled="false" label="Mute" mouse_opaque="true" name="Object Mute">
49 <on_click function="Object.Mute" /> 54 <on_click function="Object.Mute" />
50 <on_enable function="Object.EnableMute" /> 55 <on_enable function="Object.EnableMute" />
@@ -54,7 +59,9 @@
54 <on_click function="Object.ReportAbuse" /> 59 <on_click function="Object.ReportAbuse" />
55 <on_enable function="Object.EnableReportAbuse" /> 60 <on_enable function="Object.EnableReportAbuse" />
56 </menu_item_call> 61 </menu_item_call>
57 <menu_item_separator /> 62 <menu_item_call enabled="false" label="Go Here" mouse_opaque="true" name="Go Here">
63 <on_click function="GoToObject" />
64 </menu_item_call>
58 <menu_item_call enabled="true" label="Inspect" mouse_opaque="true" name="Object Inspect"> 65 <menu_item_call enabled="true" label="Inspect" mouse_opaque="true" name="Object Inspect">
59 <on_click function="Object.Inspect" /> 66 <on_click function="Object.Inspect" />
60 <on_enable function="Object.EnableInspect" /> 67 <on_enable function="Object.EnableInspect" />
@@ -68,11 +75,11 @@
68 <on_click function="Tools.Unlink" userdata="" /> 75 <on_click function="Tools.Unlink" userdata="" />
69 <on_enable function="Tools.EnableUnlink" /> 76 <on_enable function="Tools.EnableUnlink" />
70 </menu_item_call> 77 </menu_item_call>
71 </pie_menu> 78 </pie_menu>
72 <menu_item_call enabled="false" label="Buy..." mouse_opaque="true" name="Buy..."> 79 <menu_item_call enabled="false" label="Return..." mouse_opaque="true" name="Return...">
73 <on_click function="Object.Buy" /> 80 <on_click function="Object.Return" />
74 <on_enable function="Object.EnableBuy" /> 81 <on_enable function="Object.EnableReturn" />
75 </menu_item_call> 82 </menu_item_call>
76 </pie_menu> 83 </pie_menu>
77 <menu_item_call enabled="false" label="Edit..." mouse_opaque="true" name="Edit..."> 84 <menu_item_call enabled="false" label="Edit..." mouse_opaque="true" name="Edit...">
78 <on_click function="Object.Edit" /> 85 <on_click function="Object.Edit" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
index b0aecb1..24270d9 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml
@@ -32,6 +32,16 @@
32 </menu_item_call> 32 </menu_item_call>
33 </menu> 33 </menu>
34 <menu_item_separator /> 34 <menu_item_separator />
35 <menu_item_call name="Import" label="Import" enabled="false">
36 <on_click function="Object.Import" />
37 <on_enable function="Object.EnableImport" />
38 </menu_item_call>
39 <menu_item_call name="Upload + Import" label="Upload + Import"
40 enabled="false">
41 <on_click function="Object.ImportUpload" />
42 <on_enable function="Object.EnableImport" />
43 </menu_item_call>
44 <menu_item_separator />
35 <menu_item_call name="Close Window" 45 <menu_item_call name="Close Window"
36 label="Close Window" 46 label="Close Window"
37 shortcut="control|W"> 47 shortcut="control|W">
@@ -67,6 +77,10 @@
67 userdata="" /> 77 userdata="" />
68 </menu_item_call> 78 </menu_item_call>
69 <menu_item_separator /> 79 <menu_item_separator />
80 <menu_item_call name="Logout" label="Logout"
81 shortcut="control|alt|Q">
82 <on_click function="File.Logout" userdata="" />
83 </menu_item_call>
70 <menu_item_call name="Quit" label="Quit" 84 <menu_item_call name="Quit" label="Quit"
71 shortcut="control|Q"> 85 shortcut="control|Q">
72 <on_click function="File.Quit" userdata="" /> 86 <on_click function="File.Quit" userdata="" />
@@ -383,6 +397,11 @@
383 <on_click function="View.ToggleRenderType" userdata="hideparticles" /> 397 <on_click function="View.ToggleRenderType" userdata="hideparticles" />
384 <on_check function="View.CheckRenderType" userdata="hideparticles" /> 398 <on_check function="View.CheckRenderType" userdata="hideparticles" />
385 </menu_item_check> 399 </menu_item_check>
400 <menu_item_check name="Show HUD Attachments" label="Show HUD Attachments"
401 shortcut="alt|shift|H">
402 <on_click function="View.ShowHUDAttachments" userdata="" />
403 <on_check function="View.CheckHUDAttachments" />
404 </menu_item_check>
386 <menu_item_separator /> 405 <menu_item_separator />
387 <menu name="Zoom Level" create_jump_keys="true" 406 <menu name="Zoom Level" create_jump_keys="true"
388 label="Zoom Level" opaque="true" tear_off="true"> 407 label="Zoom Level" opaque="true" tear_off="true">
@@ -886,6 +905,25 @@
886 userdata="QuietSnapshotsToDisk" /> 905 userdata="QuietSnapshotsToDisk" />
887 <on_check control="QuietSnapshotsToDisk" /> 906 <on_check control="QuietSnapshotsToDisk" />
888 </menu_item_check> 907 </menu_item_check>
908 <menu_item_call label="Ground Sit" name="Ground Sit"
909 shortcut="control|alt|s">
910 <on_click function="Advanced.ToggleSit" userdata="" />
911 <on_Check function="Advanced.CheckSit" userdata="" />
912 </menu_item_call>
913 <menu_item_check label="Phantom Avatar" name="Phantom"
914 shortcut="control|alt|p">
915 <on_click function="Advanced.TogglePhantom" userdata="" />
916 <on_check function="Advanced.CheckPhantom" userdata="" />
917 </menu_item_check>
918 <menu_item_check label="Animation List" name="Animation List">
919 <on_click function="ShowFloater" userdata="animation list" />
920 <on_check function="FloaterVisible" userdata="animation list" />
921 </menu_item_check>
922 <menu_item_check label="Asset Browser" name="asset browser"
923 shortcut="alt|shift|a">
924 <on_click function="Advanced.ToggleAssetBrowser" userdata="" />
925 <on_check function="Advanced.CheckAssetBrowser" userdata="" />
926 </menu_item_check>
889 <menu_item_check name="Show Mouselook Crosshairs" 927 <menu_item_check name="Show Mouselook Crosshairs"
890 label="Show Mouselook Crosshairs"> 928 label="Show Mouselook Crosshairs">
891 <on_click function="ToggleControl" 929 <on_click function="ToggleControl"
@@ -1069,13 +1107,6 @@
1069 <on_check function="Advanced.CheckFeature" 1107 <on_check function="Advanced.CheckFeature"
1070 userdata="flexible" /> 1108 userdata="flexible" />
1071 </menu_item_check> 1109 </menu_item_check>
1072 <menu_item_check name="HUD Attachments"
1073 label="HUD Attachments"
1074 shortcut="">
1075 <on_click function="View.ShowHUDAttachments" userdata="" />
1076 <on_check function="View.CheckHUDAttachments" />
1077 </menu_item_check>
1078
1079 </menu> 1110 </menu>
1080 1111
1081 1112
@@ -1369,6 +1400,80 @@
1369 </menu> 1400 </menu>
1370 1401
1371 1402
1403 <!-- RLVa -->
1404
1405 <menu name="RLVa" drop_shadow="true" opaque="true" tear_off="true">
1406
1407 <menu name="Debug" drop_shadow="true" opaque="true" tear_off="true">
1408
1409 <menu_item_check name="Show Debug Messages"
1410 label="Show Debug Messages">
1411 <on_click function="ToggleControl" userdata="RestrainedLifeDebug" />
1412 <on_check control="RestrainedLifeDebug" />
1413 </menu_item_check>
1414
1415 <menu_item_separator />
1416
1417 <menu_item_check name="Enable Legacy Naming"
1418 label="Enable Legacy Naming">
1419 <on_click function="ToggleControl" userdata="RLVaEnableLegacyNaming" />
1420 <on_check control="RLVaEnableLegacyNaming" />
1421 </menu_item_check>
1422
1423 </menu>
1424
1425 <menu_item_separator />
1426
1427 <menu_item_check name="Enable Wear" label="Enable Wear">
1428 <on_click function="ToggleControl" userdata="RLVaEnableWear" />
1429 <on_check control="RLVaEnableWear" />
1430 </menu_item_check>
1431
1432 <menu_item_separator />
1433
1434 <menu_item_check name="Hide locked layers" label="Hide locked layers">
1435 <on_click function="ToggleControl" userdata="RLVaHideLockedLayers" />
1436 <on_check control="RLVaHideLockedLayers" />
1437 </menu_item_check>
1438
1439 <menu_item_check name="Hide locked attachments"
1440 label="Hide locked attachments">
1441 <on_click function="ToggleControl"
1442 userdata="RLVaHideLockedAttachments" />
1443 <on_check control="RLVaHideLockedAttachments" />
1444 </menu_item_check>
1445
1446 <!--
1447 <menu_item_check name="Hide locked inventory"
1448 label="Hide locked inventory">
1449 <on_click function="ToggleControl"
1450 userdata="RLVaHideLockedInventory" />
1451 <on_check control="RLVaHideLockedInventory" />
1452 </menu_item_check>
1453 -->
1454
1455 <menu_item_separator />
1456
1457 <menu_item_check name="Forbid Give to #RLV" label="Forbid Give to #RLV">
1458 <on_click function="ToggleControl"
1459 userdata="RestrainedLifeForbidGiveToRLV" />
1460 <on_check control="RestrainedLifeForbidGiveToRLV" />
1461 </menu_item_check>
1462
1463 <menu_item_check name="Show Name Tags" label="Show Name Tags">
1464 <on_click function="ToggleControl"
1465 userdata="RLVaShowNameTags" />
1466 <on_check control="RLVaShowNameTags" />
1467 </menu_item_check>
1468
1469 <menu_item_separator />
1470
1471 <menu_item_call name="Restrictions..." label="Restrictions...">
1472 <on_click function="RLVa.Behaviors.Show" userdata="" />
1473 </menu_item_call>
1474
1475 </menu>
1476
1372 1477
1373 <!-- UI --> 1478 <!-- UI -->
1374 1479
@@ -1888,6 +1993,13 @@
1888 userdata="ShowConsoleWindow" /> 1993 userdata="ShowConsoleWindow" />
1889 <on_check control="ShowConsoleWindow" /> 1994 <on_check control="ShowConsoleWindow" />
1890 </menu_item_check> 1995 </menu_item_check>
1996
1997 <menu_item_check name="Restrained Life Support"
1998 label="Restrained Life Support">
1999 <on_click function="RLVa.Main.Toggle" />
2000 <on_check function="RLVa.Main.Enabled" />
2001 </menu_item_check>
2002
1891 <menu_item_check name="Output Debug Minidump" 2003 <menu_item_check name="Output Debug Minidump"
1892 label="Output Debug Minidump"> 2004 label="Output Debug Minidump">
1893 <on_click function="ToggleControl" 2005 <on_click function="ToggleControl"
diff --git a/linden/indra/newview/skins/default/xui/en-us/notify.xml b/linden/indra/newview/skins/default/xui/en-us/notify.xml
index 128e4bd..dd03a32 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notify.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notify.xml
@@ -1,4 +1,1101 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<notifications> 2<notifications>
3 <notify name="SystemMessageTip" tip="true">
4 <message name="message">
5 [MESSAGE]
6 </message>
7 </notify>
8 <notify name="Cancelled" tip="true">
9 <message name="message">
10 Cancelled
11 </message>
12 </notify>
13 <notify name="CancelledSit" tip="true">
14 <message name="message">
15 Cancelled Sit
16 </message>
17 </notify>
18 <notify name="CancelledAttach" tip="true">
19 <message name="message">
20 Cancelled Attach
21 </message>
22 </notify>
23 <notify name="ReplacedMissingWearable" tip="true">
24 <message name="message">
25 Replaced missing clothing/body part with default.
26 </message>
27 </notify>
28 <notify name="FriendOnline" tip="true">
29 <message name="message">
30 [FIRST] [LAST] is Online
31 </message>
32 </notify>
33 <notify name="FriendOffline" tip="true">
34 <message name="message">
35 [FIRST] [LAST] is Offline
36 </message>
37 </notify>
38 <notify name="AddSelfFriend" tip="true">
39 <message name="message">
40 You cannot add yourself as a friend.
41 </message>
42 </notify>
43 <notify name="UploadingAuctionSnapshot" tip="true">
44 <message name="message">
45 Uploading in-world and web site snapshots...
46(Takes about 5 minutes.)
47 </message>
48 </notify>
49 <notify name="UploadPayment" tip="false">
50 <message name="message">
51 You paid L$[AMOUNT] to upload.
52 </message>
53 </notify>
54 <notify name="UploadingSnapshot" tip="true">
55 <message name="message">
56 Uploading in-world snapshot...
57(Takes a minute or so.)
58 </message>
59 </notify>
60 <notify name="UploadWebSnapshotDone" tip="true">
61 <message name="message">
62 Web site snapshot upload done.
63 </message>
64 </notify>
65 <notify name="UploadSnapshotDone" tip="true">
66 <message name="message">
67 In-world snapshot upload done
68 </message>
69 </notify>
70 <notify name="TerrainDownloaded" tip="true">
71 <message name="message">
72 Terrain.raw downloaded
73 </message>
74 </notify>
75 <notify name="InMaxGroups" tip="true">
76 <message name="message">
77 You are already in the maximum number of groups. You will need to leave a group before you can create one.
78 </message>
79 </notify>
80 <notify name="GestureMissing" tip="true">
81 <message name="message">
82 Gesture [NAME] is missing from database.
83 </message>
84 </notify>
85 <notify name="UnableToLoadGesture" tip="true">
86 <message name="message">
87 Unable to load gesture [NAME].
88Please try again.
89 </message>
90 </notify>
91 <notify name="InventoryLoaded" tip="true">
92 <message name="message">
93 Your inventory is loaded.
94 </message>
95 </notify>
96 <notify name="LandmarkMissing" tip="true">
97 <message name="message">
98 Landmark is missing from database.
99 </message>
100 </notify>
101 <notify name="UnableToLoadLandmark" tip="true">
102 <message name="message">
103 Unable to load landmark. Please try again.
104 </message>
105 </notify>
106 <notify name="CapsKeyOn" tip="true">
107 <message name="message">
108 Your Caps Lock key is on.
109As this will affect the password you type in,
110you will probably want to turn it off.
111 </message>
112 </notify>
113 <notify name="NotecardMissing" tip="true">
114 <message name="message">
115 Notecard is missing from database.
116 </message>
117 </notify>
118 <notify name="NotecardNoPermissions" tip="true">
119 <message name="message">
120 Insufficient permissions to view notecard.
121 </message>
122 </notify>
123 <notify name="RezItemNoPermissions" tip="true">
124 <message name="message">
125 Insufficient permissions to rez object.
126 </message>
127 </notify>
128 <notify name="UnableToLoadNotecard" tip="true">
129 <message name="message">
130 Unable to load notecard.
131Please try again.
132 </message>
133 </notify>
134 <notify name="ScriptMissing" tip="true">
135 <message name="message">
136 Script is missing from database.
137 </message>
138 </notify>
139 <notify name="ScriptNoPermissions" tip="true">
140 <message name="message">
141 Insufficient permissions to view script.
142 </message>
143 </notify>
144 <notify name="UnableToLoadScript" tip="true">
145 <message name="message">
146 Unable to load script. Please try again.
147 </message>
148 </notify>
149 <notify name="IncompleteInventory" tip="true">
150 <message name="message">
151 The complete contents you are offering are not yet
152locally available. Please try offering those items
153again in a minute.
154 </message>
155 </notify>
156 <notify name="CannotModifyProtectedCategories" tip="true">
157 <message name="message">
158 You cannot modify protected categories.
159 </message>
160 </notify>
161 <notify name="CannotRemoveProtectedCategories" tip="true">
162 <message name="message">
163 You cannot remove protected categories.
164 </message>
165 </notify>
166 <notify name="OfferedCard" tip="true">
167 <message name="message">
168 You have offered a calling card to [FIRST] [LAST]
169 </message>
170 </notify>
171 <notify name="UnableToBuyWhileDownloading" tip="true">
172 <message name="message">
173 Unable to buy while downloading object data.
174Please try again.
175 </message>
176 </notify>
177 <notify name="UnableToLinkWhileDownloading" tip="true">
178 <message name="message">
179 Unable to link while downloading object data.
180Please try again.
181 </message>
182 </notify>
183 <notify name="CannotBuyObjectsFromDifferentOwners" tip="true">
184 <message name="message">
185 Cannot buy objects from different owners at the same time.
186Please select a single object.
187 </message>
188 </notify>
189 <notify name="ObjectNotForSale" tip="true">
190 <message name="message">
191 Object does not appear to be for sale.
192 </message>
193 </notify>
194 <notify name="EnteringGodMode" tip="true">
195 <message name="message">
196 Entering god mode, level [LEVEL]
197 </message>
198 </notify>
199 <notify name="LeavingGodMode" tip="true">
200 <message name="message">
201 Leaving god mode, level [LEVEL]
202 </message>
203 </notify>
204 <notify name="CopyFailed" tip="true">
205 <message name="message">
206 Copy failed because you lack copy permission
207 </message>
208 </notify>
209 <notify name="InventoryAccepted" tip="true">
210 <message name="message">
211 [NAME] accepted your inventory offer.
212 </message>
213 </notify>
214 <notify name="InventoryDeclined" tip="true">
215 <message name="message">
216 [NAME] declined your inventory offer.
217 </message>
218 </notify>
219 <notify name="ObjectMessage" tip="true">
220 <message name="message">
221 [NAME]: [MESSAGE]
222 </message>
223 </notify>
224 <notify name="CallingCardAccepted" tip="true">
225 <message name="message">
226 Your calling card was accepted.
227 </message>
228 </notify>
229 <notify name="CallingCardDeclined" tip="true">
230 <message name="message">
231 Your calling card was declined.
232 </message>
233 </notify>
234 <notify name="TeleportToLandmark" tip="true">
235 <message name="message">
236 Now that you have reached the mainland, you can teleport to locations like &apos;[NAME]&apos; by clicking on the Inventory button on the bottom right of your screen, and then select the Landmarks folder.
237Double click on the landmark and click on Teleport to travel there.
238 </message>
239 </notify>
240 <notify name="TeleportToPerson" tip="true">
241 <message name="message">
242 Now that you have reached the mainland, you can contact residents like &apos;[NAME]&apos; by clicking on the Inventory button on the bottom right of your screen, and then select the Calling Cards folder.
243Double click on the card, click on Instant Message, and type a message.
244 </message>
245 </notify>
246 <notify name="CantSelectLandFromMultipleRegions" tip="true">
247 <message name="message">
248 Can&apos;t select land across server boundaries.
249Try selecting a smaller piece of land.
250 </message>
251 </notify>
252 <notify name="GenerticNotify" tip="false">
253 <message name="message">
254 [MESSAGE]
255 </message>
256 </notify>
257 <notify name="GroupVote" tip="false">
258 <message name="message">
259 [NAME] has proposed to vote on:
260[MESSAGE]
261 </message>
262 <option name="VoteNow">
263 Vote Now
264 </option>
265 <option name="Later">
266 Later
267 </option>
268 </notify>
269 <notify name="GroupElection" tip="false">
270 <message name="message">
271 [NAME] has started an election:
272[MESSAGE]
273 </message>
274 <option name="VoteNow">
275 Vote Now
276 </option>
277 <option name="Later">
278 Later
279 </option>
280 </notify>
281 <notify name="SystemMessage" tip="false">
282 <message name="message">
283 [MESSAGE]
284 </message>
285 </notify>
286 <notify name="EventNotification" tip="false">
287 <message name="message">
288 Event Notification:
289
290[NAME]
291[DATE]
292 </message>
293 <option name="Teleport">
294 Teleport
295 </option>
296 <option name="Description">
297 Description
298 </option>
299 <option name="Cancel">
300 Cancel
301 </option>
302 </notify>
303 <notify name="TransferObjectsHighlighted" tip="false">
304 <message name="message">
305 All objects on this parcel that will transfer
306to the purchaser of this parcel are now highlighted.
307
308* Trees and grasses that will transfer are not highlighted.
309 </message>
310 <option name="Done">
311 Done
312 </option>
313 </notify>
314 <notify name="DeactivatedGesturesTrigger" tip="false">
315 <message name="message">
316 Deactivated gestures with same trigger:
317[NAMES]
318 </message>
319 </notify>
320 <notify name="InventoryNetworkCorruption" tip="false">
321 <message name="message">
322 Inventory could not be loaded because of network corruption. This indicates a bad network connection.
323 </message>
324 </notify>
325 <notify name="NoQuickTime" tip="false">
326 <message name="message">
327 Apple&apos;s QuickTime software does not appear to be installed on your system.
328If you want to view streaming media on parcels that support it you should go to the QuickTime site (http://www.apple.com/quicktime) and install the QuickTime Player.
329 </message>
330 </notify>
331 <notify name="OwnedObjectsReturned" tip="false">
332 <message name="message">
333 The objects you own on the selected parcel of land
334have been returned back to your inventory.
335 </message>
336 </notify>
337 <notify name="OtherObjectsReturned" tip="false">
338 <message name="message">
339 The objects on the selected parcel of land
340that is owned by [FIRST] [LAST]
341have been returned to his or her inventory.
342 </message>
343 </notify>
344 <notify name="OtherObjectsReturned2" tip="false">
345 <message name="message">
346 The objects on the selected parcel of land
347owned by the resident &apos;[NAME]&apos;
348have been returned to their owner.
349 </message>
350 </notify>
351 <notify name="GroupObjectsReturned" tip="false">
352 <message name="message">
353 The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner&apos;s inventory.
354Transferable deeded objects have been returned to their previous owners.
355Non-transferable objects that are deeded to the group have been deleted.
356 </message>
357 </notify>
358 <notify name="UnOwnedObjectsReturned" tip="false">
359 <message name="message">
360 The objects on the selected parcel that are NOT owned by you have been returned to their owners.
361 </message>
362 </notify>
363 <notify name="NotSafe" tip="false" unique="true">
364 <message name="message">
365 This land has damage enabled (&apos;not safe&apos;).
366You can be hurt here. If you die, you will be teleported to your home location.
367 </message>
368 </notify>
369 <notify name="NoFly" tip="false" unique="true">
370 <message name="message">
371 This land has flying disabled (&apos;no fly&apos;).
372You cannot fly here.
373 </message>
374 </notify>
375 <notify name="PushRestricted" tip="false" unique="true">
376 <message name="message">
377 This land is &apos;No Pushing&apos;.
378You cannot push others here unless you own the land.
379 </message>
380 </notify>
381 <notify name="NoVoice" tip="false" unique="true">
382 <message name="message">
383 This land has voice disabled.
384 </message>
385 </notify>
386 <notify name="NoBuild" tip="false" unique="true">
387 <message name="message">
388 This land has building disabled (&apos;no build&apos;).
389You cannot create objects here.
390 </message>
391 </notify>
392 <notify name="ScriptsStopped" tip="false">
393 <message name="message">
394 An administrator has temporarily stopped scripts in this region.
395 </message>
396 </notify>
397 <notify name="ScriptsNotRunning" tip="false">
398 <message name="message">
399 This region is not running any scripts.
400 </message>
401 </notify>
402 <notify name="NoOutsideScripts" tip="false">
403 <message name="message">
404 This land has outside scripts disabled
405(&apos;no outside scripts&apos;).
406No scripts will run except those belonging to the land owner.
407 </message>
408 </notify>
409 <notify name="ApproveURL" tip="false">
410 <message name="message">
411 An object wants to display this web page on its surface:
412[URL]
413 </message>
414 <option name="LoadPage">
415 Load Page
416 </option>
417 <option name="Don&apos;tLoad">
418 Don&apos;t Load
419 </option>
420 </notify>
421 <notify name="ClaimPublicLand" tip="false">
422 <message name="message">
423 Can only claim public land in region you&apos;re in.
424 </message>
425 </notify>
426 <notify name="ObjectGiveItem" tip="false">
427 <message name="message">
428 An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named [OBJECTNAME].
429 </message>
430 <option name="Keep">
431 Keep
432 </option>
433 <option name="Discard">
434 Discard
435 </option>
436 <option name="Mute">
437 Mute
438 </option>
439 </notify>
440 <notify name="ObjectGiveItemUnknownUser" tip="false">
441 <message name="message">
442 An object named [OBJECTFROMNAME] owned by (an unknown user) has given you a [OBJECTTYPE] named [OBJECTNAME].
443 </message>
444 <option name="Keep">
445 Keep
446 </option>
447 <option name="Discard">
448 Discard
449 </option>
450 <option name="Mute">
451 Mute
452 </option>
453 </notify>
454 <notify name="UserGiveItem" tip="false">
455 <message name="message">
456 [NAME] has given you a [OBJECTTYPE] named &apos;[OBJECTNAME]&apos;.
457 </message>
458 <option name="Keep">
459 Keep
460 </option>
461 <option name="Discard">
462 Discard
463 </option>
464 <option name="Mute">
465 Mute
466 </option>
467 </notify>
468 <notify name="GodMessage" tip="false">
469 <message name="message">
470 [NAME]
471[MESSAGE]
472 </message>
473 </notify>
474 <notify name="JoinGroup" tip="false">
475 <message name="message">
476 [MESSAGE]
477 </message>
478 <option name="Join">
479 Join
480 </option>
481 <option name="Decline">
482 Decline
483 </option>
484 <option name="Info">
485 Info
486 </option>
487 </notify>
488 <notify name="JoinGroupOfficerNoFee" tip="false">
489 <message name="message">
490 [NAME] has invited you
491to join a group as an officer.
492There is no cost to join this group.
493
494[MESSAGE]
495 </message>
496 <option name="Join">
497 Join
498 </option>
499 <option name="Decline">
500 Decline
501 </option>
502 <option name="Info">
503 Info
504 </option>
505 </notify>
506 <notify name="JoinGroupMember" tip="false">
507 <message name="message">
508 [NAME] has invited you
509to join a group as a member.
510To join this group, you will have to pay a signup fee of L$[COST]
511
512[MESSAGE]
513 </message>
514 <option name="Join">
515 Join
516 </option>
517 <option name="Decline">
518 Decline
519 </option>
520 <option name="Info">
521 Info
522 </option>
523 </notify>
524 <notify name="JoinGroupMemberNoFee" tip="false">
525 <message name="message">
526 [NAME] has invited you
527to join a group as a member.
528There is no cost to join this group.
529
530[MESSAGE]
531 </message>
532 <option name="Join">
533 Join
534 </option>
535 <option name="Decline">
536 Decline
537 </option>
538 <option name="Info">
539 Info
540 </option>
541 </notify>
542 <notify name="OfferTeleport" tip="false">
543 <message name="message">
544 [NAME] has offered to teleport you
545to his or her location:
546
547[MESSAGE]
548 </message>
549 <option name="Teleport">
550 Teleport
551 </option>
552 <option name="Cancel">
553 Cancel
554 </option>
555 </notify>
556 <notify name="GotoURL" tip="false">
557 <message name="message">
558 [MESSAGE]
559[URL]
560 </message>
561 <option name="Later">
562 Later
563 </option>
564 <option name="GoNow...">
565 Go Now...
566 </option>
567 </notify>
568 <notify name="OfferFriendship" tip="false">
569 <message name="message">
570 [NAME] is offering friendship.
571
572[MESSAGE]
573
574(By default, you will be able to see each other&apos;s online status.)
575 </message>
576 <option name="Accept">
577 Accept
578 </option>
579 <option name="Decline">
580 Decline
581 </option>
582 <option name="Ignore">
583 Ignore
584 </option>
585 </notify>
586 <notify name="OfferFriendshipNoMessage" tip="false">
587 <message name="message">
588 [NAME] is offering friendship.
589
590(By default, you will be able to
591see each other&apos;s online status.)
592 </message>
593 <option name="Accept">
594 Accept
595 </option>
596 <option name="Decline">
597 Decline
598 </option>
599 <option name="Ignore">
600 Ignore
601 </option>
602 </notify>
603 <notify name="FriendshipAccepted" tip="false">
604 <message name="message">
605 [NAME] accepted your friendship offer.
606 </message>
607 </notify>
608 <notify name="FriendshipDeclined" tip="false">
609 <message name="message">
610 [NAME] declined your friendship offer.
611 </message>
612 </notify>
613 <notify name="OfferCallingCard" tip="false">
614 <message name="message">
615 [FIRST] [LAST] is offering their calling card.
616This will add a bookmark in your inventory
617so you can quickly IM this resident.
618 </message>
619 <option name="Accept">
620 Accept
621 </option>
622 <option name="Decline">
623 Decline
624 </option>
625 <option name="Ignore">
626 Ignore
627 </option>
628 </notify>
629 <notify name="RegionRestartMinutes" tip="false">
630 <message name="message">
631 Region is restarting in [MINUTES] minutes.
632If you remain in this region you will be logged out.
633 </message>
634 </notify>
635 <notify name="RegionRestartSeconds" tip="false">
636 <message name="message">
637 Region is restarting in [SECONDS] seconds.
638If you remain in this region you will be logged out.
639 </message>
640 </notify>
641 <notify name="LoadWebPage" tip="false">
642 <message name="message">
643 Load web page [URL]?
644
645[MESSAGE]
646
647From object: [OBJECTNAME], owner: [NAME]?
648 </message>
649 <option name="Gotopage">
650 Go to page
651 </option>
652 <option name="Cancel">
653 Cancel
654 </option>
655 </notify>
656 <notify name="FailedToLoadWearableUnnamed" tip="false">
657 <message name="message">
658 Oops!
659You tried to wear a [TYPE] and it did not load.
660
661Don't panic.
662Try again in a minute to give things a chance to settle down.
663 </message>
664 </notify>
665 <notify name="FailedToLoadWearable" tip="false">
666 <message name="message">
667 Oops!
668You tried to wear [TYPE] named [DESC] and it did not load.
669
670Don't panic.
671Try again in a minute to give things a chance to settle down.
672 </message>
673 </notify>
674 <notify name="FailedToFindWearableUnnamed" tip="false">
675 <message name="message">
676 Failed to find [TYPE] in database.
677 </message>
678 </notify>
679 <notify name="FailedToFindWearable" tip="false">
680 <message name="message">
681 Failed to find [TYPE] named [DESC] in database.
682 </message>
683 </notify>
684 <notify caution="true" name="ScriptTakeMoney" tip="false">
685 <message name="message">
686 Take Linden dollars (L$) from you
687 </message>
688 </notify>
689 <notify name="ActOnControlInputs" tip="false">
690 <message name="message">
691 Act on your control inputs
692 </message>
693 </notify>
694 <notify name="RemapControlInputs" tip="false">
695 <message name="message">
696 Remap your control inputs
697 </message>
698 </notify>
699 <notify name="AnimateYourAvatar" tip="false">
700 <message name="message">
701 Animate your avatar
702 </message>
703 </notify>
704 <notify name="AttachToYourAvatar" tip="false">
705 <message name="message">
706 Attach to your avatar
707 </message>
708 </notify>
709 <notify name="ReleaseOwnership" tip="false">
710 <message name="message">
711 Release ownership and become public
712 </message>
713 </notify>
714 <notify name="LinkAndDelink" tip="false">
715 <message name="message">
716 Link and delink from other objects
717 </message>
718 </notify>
719 <notify name="AddAndRemoveJoints" tip="false">
720 <message name="message">
721 Add and remove joints with other objects
722 </message>
723 </notify>
724 <notify name="ChangePermissions" tip="false">
725 <message name="message">
726 Change its permissions
727 </message>
728 </notify>
729 <notify name="TrackYourCamera" tip="false">
730 <message name="message">
731 Track your camera
732 </message>
733 </notify>
734 <notify name="ControlYourCamera" tip="false">
735 <message name="message">
736 Control your camera
737 </message>
738 </notify>
739 <notify name="ScriptQuestion" tip="false">
740 <message name="message">
741 &apos;[OBJECTNAME]&apos;, an object owned by &apos;[NAME]&apos;, would like to:
742
743[QUESTIONS]
744Is this OK?
745 </message>
746 <option name="Yes">
747 Yes
748 </option>
749 <option name="No">
750 No
751 </option>
752 <option name="Mute">
753 Mute
754 </option>
755 </notify>
756 <notify name="ScriptQuestionCautionChatGranted" tip="false">
757 <message name="message">
758 &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].
759 </message>
760 </notify>
761 <notify name="ScriptQuestionCautionChatDenied" tip="false">
762 <message name="message">
763 &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].
764 </message>
765 </notify>
766 <notify name="ScriptQuestionCautionWarn" tip="false">
767 <message name="message">
768 An object wants permission to take Linden dollars (L$) from your account.
769 </message>
770 </notify>
771 <notify caution="true" name="ScriptQuestionCaution" tip="false">
772 <message name="message">
773 &apos;[OBJECTNAME]&apos;, an object owned by &apos;[NAME]&apos;, would like to:
774
775[QUESTIONS]
776If you do not trust this object and its creator, you should deny the request. For additional information, click the Details button.
777
778Grant this request?
779 </message>
780 <option name="Grant">
781 Grant
782 </option>
783 <option default="true" name="Deny">
784 Deny
785 </option>
786 <option name="Details">
787 Details...
788 </option>
789 </notify>
790 <notify name="ScriptDialog" tip="false">
791 <message name="message">
792 [FIRST] [LAST]&apos;s &apos;[TITLE]&apos;
793[MESSAGE]
794 </message>
795 <option name="Ignore">
796 Ignore
797 </option>
798 </notify>
799 <notify name="ScriptDialogGroup" tip="false">
800 <message name="message">
801 [GROUPNAME]&apos;s &apos;[TITLE]&apos;
802[MESSAGE]
803 </message>
804 <option name="Ignore">
805 Ignore
806 </option>
807 </notify>
808 <notify name="FirstBalanceIncrease" tip="false">
809 <message name="message">
810 You just received L$[AMOUNT].
811Objects and other users may give you L$.
812Your balance is shown in the
813upper-right corner of the screen.
814 </message>
815 </notify>
816 <notify name="FirstBalanceDecrease" tip="false">
817 <message name="message">
818 You just paid L$[AMOUNT].
819Your balance is shown in the upper-right
820corner of the screen.
821 </message>
822 </notify>
823 <notify name="FirstSit" tip="false">
824 <message name="message">
825 You are sitting.
826Use the arrow keys (or AWSD) to change the view.
827Click the &apos;Stand Up&apos; button to get up.
828 </message>
829 </notify>
830 <notify name="FirstMap" tip="false">
831 <message name="message">
832 Click and drag to scroll the map.
833Double-click to teleport.
834Use the controls on the right to find things
835and display different backgrounds.
836 </message>
837 </notify>
838<!-- TODO: Make sure all the notifications from Imprudence <= 1.2 are out of here before deleting this. -->
839 <notify name="FirstMiniMap" tip="false">
840 <message name="message">
841 Right-click the Mini-Map for more options.
842 </message>
843 </notify>
844 <notify name="FirstBuild" tip="false">
845 <message name="message">
846 You can build new objects in some areas of [SECOND_LIFE].
847Use the tools in the upper left to build, and try
848holding down Ctrl or Alt to rapidly switch tools.
849Press Esc to stop building.
850 </message>
851 </notify>
852 <notify name="FirstLeftClickNoHit" tip="false">
853 <message name="message">
854 Left-clicking interacts with special objects.
855If the mouse pointer changes to a hand,
856you can interact with the object.
857Right-click always shows a menu of things you can do.
858 </message>
859 </notify>
860 <notify name="FirstTeleport" tip="false">
861 <message name="message">
862 This region doesn't allow point-to-point teleports, so you've been transported to the nearest telehub.
863Your destination is marked with a tall beacon.
864Follow the red arrow to the beacon, or click the arrow to dismiss the beacon.
865 </message>
866 </notify>
867 <notify name="FirstOverrideKeys" tip="false">
868 <message name="message">
869 Your movement keys are now being handled by an object.
870Try the arrow keys or AWSD to see what they do.
871Some objects (like guns) require you to go into mouselook to use them.
872Press &apos;M&apos; to do this.
873 </message>
874 </notify>
875 <notify name="FirstAppearance" tip="false">
876 <message name="message">
877 You are editing your appearance.
878To rotate and zoom view, use the arrow keys.
879When you are finished, press &apos;Save All&apos;
880to save your look and exit.
881You can edit your appearance as often as you like.
882 </message>
883 </notify>
884 <notify name="FirstInventory" tip="false">
885 <message name="message">
886 This is your inventory, which contains objects, notecards, clothing, and other things you own.
887* To wear an object or outfit folder, drag it onto yourself.
888* To bring an object into the world, drag it onto the ground.
889* To read a notecard, double-click it.
890 </message>
891 </notify>
892 <notify name="FirstSandbox" tip="false">
893 <message name="message">
894 This is a sandbox region.
895Objects you build here may be deleted after
896you leave the area, Sandboxes clean on a regular basis, please refer to the information at the top of the screen next to the region name.
897
898Sandbox regions are uncommon, and are marked with signs.
899 </message>
900 </notify>
901 <notify name="FirstFlexible" tip="false">
902 <message name="message">
903 This object is flexible.
904Flexible objects may not be physical and must be phantom
905until the flexible checkbox is unchecked.
906 </message>
907 </notify>
908 <notify name="FirstDebugMenus" tip="false">
909 <message name="message">
910 You have enabled the Advanced menu.
911This menu contains features useful for developers debugging Second Life.
912To toggle this menu on Windows press Ctrl-Alt-D. On Mac press Cmd-Opt-Shift-D.
913 </message>
914 </notify>
915 <notify name="FirstSculptedPrim" tip="false">
916 <message name="message">
917 You are editing a sculpted prim.
918Sculpted prims require a special texture to specify their shape.
919You can find example sculpted textures in the inventory library.
920 </message>
921 </notify>
922 <notify name="FirstMedia" tip="false">
923 <message name="message">
924 You have begun playing media. Media can set to play automatically in the preferences window under Audio / Video. Note that this can be a security risk for media sites you do not trust.
925 </message>
926 </notify>
927 <!-- [RLVa:KB] -->
928 <notify name="FirstRLVDetach" tip="false">
929 <message name="message">
930One of your attachments was made nondetachable using Restrained Life.
931Please note that this also disables the &apos;Wear&apos; option on all prim attachments in your inventory unless they are properly named.
932
933For more information search for &apos;Restrained Life&apos; on the SL wiki.
934 </message>
935 </notify>
936 <notify name="FirstRLVFartouch" tip="false">
937 <message name="message">
938You have been fartouch restricted: you will be unable to touch objects farther than 1.5m from your avatar until the restriction is lifted.
939
940Tip: if an object is out of range the mouse cursor will not change as you hover over it and you'll hear an error sound if you try to right-click it.
941 </message>
942 </notify>
943 <!-- [/RLVa:KB] -->
944 <notify name="MaxListSelectMessage" tip="true">
945 <message name="message">
946 You may only select up to [MAX_SELECT] items
947from this list.
948 </message>
949 </notify>
950 <notify name="VoiceInviteP2P" tip="false" unique="true">
951 <message name="message">
952 [NAME] is inviting you to a Voice Chat call.
953Click Accept to join the call or Decline to decline the invitation. Click Mute to mute this caller.
954 </message>
955 <option name="Accept">
956 Accept
957 </option>
958 <option name="Decline">
959 Decline
960 </option>
961 <option name="Mute">
962 Mute
963 </option>
964 </notify>
965 <notify name="AutoUnmuteByIM" tip="false">
966 <message name="message">
967 [FIRST] [LAST] was sent an instant message and has been automatically unmuted.
968 </message>
969 </notify>
970 <notify name="AutoUnmuteByMoney" tip="false">
971 <message name="message">
972 [FIRST] [LAST] was given money and has been automatically unmuted.
973 </message>
974 </notify>
975 <notify name="AutoUnmuteByInventory" tip="false">
976 <message name="message">
977 [FIRST] [LAST] was offered inventory and has been automatically unmuted.
978 </message>
979 </notify>
980 <notify name="VoiceInviteGroup" tip="false" unique="true">
981 <message name="message">
982 [NAME] has joined a Voice Chat call with the group [GROUP].
983Click Accept to join the call or Decline to decline the invitation. Click Mute to mute this caller.
984 </message>
985 <option name="Accept">
986 Accept
987 </option>
988 <option name="Decline">
989 Decline
990 </option>
991 <option name="Mute">
992 Mute
993 </option>
994 </notify>
995 <notify name="VoiceInviteAdHoc" tip="false" unique="true">
996 <message name="message">
997 [NAME] has joined a Voice Chat call with a conference chat..
998Click Accept to join the call or Decline to decline the invitation. Click Mute to mute this user.
999 </message>
1000 <option name="Accept">
1001 Accept
1002 </option>
1003 <option name="Decline">
1004 Decline
1005 </option>
1006 <option name="Mute">
1007 Mute
1008 </option>
1009 </notify>
1010 <notify name="InviteAdHoc" tip="false" unique="true">
1011 <message name="message">
1012 [NAME] is inviting you to a conference chat.
1013Click Accept to join the chat or Decline to decline the invitation. Click Mute to mute this user.
1014 </message>
1015 <option name="Accept">
1016 Accept
1017 </option>
1018 <option name="Decline">
1019 Decline
1020 </option>
1021 <option name="Mute">
1022 Mute
1023 </option>
1024 </notify>
1025 <notify name="VoiceChannelFull" tip="true" unique="true">
1026 <message name="message">
1027 The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum capacity. Please try again later.
1028 </message>
1029 </notify>
1030 <notify name="ProximalVoiceChannelFull" tip="true" unique="true">
1031 <message name="message">
1032 We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
1033 </message>
1034 </notify>
1035 <notify name="VoiceChannelDisconnected" tip="true" unique="true">
1036 <message name="message">
1037 You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to spatial voice chat.
1038 </message>
1039 </notify>
1040 <notify name="VoiceChannelDisconnectedP2P" tip="true" unique="true">
1041 <message name="message">
1042 [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to spatial voice chat.
1043 </message>
1044 </notify>
1045 <notify name="P2PCallDeclined" tip="true" unique="true">
1046 <message name="message">
1047 [VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to spatial voice chat.
1048 </message>
1049 </notify>
1050 <notify name="P2PCallNoAnswer" tip="true" unique="true">
1051 <message name="message">
1052 [VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to spatial voice chat.
1053 </message>
1054 </notify>
1055 <notify name="VoiceChannelJoinFailed" tip="true" unique="true">
1056 <message name="message">
1057 Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat.
1058 </message>
1059 </notify>
1060 <notify duration="10" name="VoiceLoginRetry" tip="true" unique="true">
1061 <message name="message">
1062 We are creating a voice channel for you. This may take up to one minute.
1063 </message>
1064 </notify>
1065 <notify name="Cannot enter parcel: not a group member" tip="true">
1066 <message name="message">
1067 Cannot enter parcel, you are not a member of the appropriate group.
1068 </message>
1069 </notify>
1070 <notify name="Cannot enter parcel: banned" tip="true">
1071 <message name="message">
1072 Cannot enter parcel, you have been banned.
1073 </message>
1074 </notify>
1075 <notify name="Cannot enter parcel: not on access list" tip="true">
1076 <message name="message">
1077 Cannot enter parcel, you are not on the access list.
1078 </message>
1079 </notify>
1080 <notify name="VoiceNotAllowed" tip="true" unique="true">
1081 <message name="message">
1082 You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME].
1083 </message>
1084 </notify>
1085 <notify name="VoiceCallGenericError" tip="true" unique="true">
1086 <message name="message">
1087 An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_NAME]. Please try again later.
1088 </message>
1089 </notify>
1090 <notify caution="true" duration="10" name="ServerVersionChanged" tip="true">
1091 <message name="message">
1092 The region you have entered is running a different simulator version. Click this message for details.
1093 </message>
1094 </notify>
1095 <notify caution="true" name="UnableToOpenCommandURL" tip="true">
1096 <message name="message">
1097 The URL you clicked cannot be opened from this web browser.
1098 </message>
1099 </notify>
3</notifications> 1100</notifications>
4<!-- This file is no longer used. Please see notifications.xml and make your changes there. --> 1101<!-- This file is no longer used. Please see notifications.xml and make your changes there. -->
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
index a3a4b1a..921cd8e 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml
@@ -1,430 +1,414 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel bottom="-550" height="486" left="350" name="Panel Avatar" width="430"> 2<panel bottom="-575" height="511" left="350" name="Panel Avatar" width="430">
3 <tab_container bottom="-486" height="486" left="0" mouse_opaque="false" name="tab" 3 <tab_container bottom="-511" height="511" left="0" mouse_opaque="false" name="tab"
4 tab_min_width="50" tab_position="top" width="419"> 4 tab_min_width="50" tab_position="top" width="419">
5 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466" 5 <panel border="true" bottom="-507" follows="left|top|right|bottom" height="491"
6 label="2nd Life" left="1" mouse_opaque="true" name="2nd Life" width="418"> 6 label="2nd Life" left="1" mouse_opaque="true" name="2nd Life" width="418">
7 <string name="CaptionTextAcctInfo"> 7 <string name="CaptionTextAcctInfo">
8 [ACCTTYPE] 8[ACCTTYPE]
9[PAYMENTINFO] 9[PAYMENTINFO]
10[AGEVERIFICATION] 10[AGEVERIFICATION]
11 </string> 11 </string>
12 <string name="AcctTypeResident"> 12 <string name="AcctTypeResident">
13 Resident 13 Resident
14 </string> 14 </string>
15 <string name="AcctTypeTrial"> 15 <string name="AcctTypeTrial">
16 Trial 16 Trial
17 </string> 17 </string>
18 <string name="AcctTypeCharterMember"> 18 <string name="AcctTypeCharterMember">
19 Charter Member 19 Charter Member
20 </string> 20 </string>
21 <string name="AcctTypeEmployee"> 21 <string name="AcctTypeEmployee">
22 Linden Lab Employee 22 Linden Lab Employee
23 </string> 23 </string>
24 <string name="PaymentInfoUsed"> 24 <string name="PaymentInfoUsed">
25 Payment Info Used 25 Payment Info Used
26 </string> 26 </string>
27 <string name="PaymentInfoOnFile"> 27 <string name="PaymentInfoOnFile">
28 Payment Info On File 28 Payment Info On File
29 </string> 29 </string>
30 <string name="NoPaymentInfoOnFile"> 30 <string name="NoPaymentInfoOnFile">
31 No Payment Info On File 31 No Payment Info On File
32 </string> 32 </string>
33 <string name="AgeVerified"> 33 <string name="AgeVerified">
34 Age-verified 34 Age-verified
35 </string> 35 </string>
36 <string name="NotAgeVerified"> 36 <string name="NotAgeVerified">
37 Not Age-verified 37 Not Age-verified
38 </string> 38 </string>
39 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 39 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
40 bottom="-24" drop_shadow_visible="true" follows="left|top" 40 bottom="-23" drop_shadow_visible="true" follows="left|top"
41 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 41 font="SansSerifsmall" h_pad="0" halign="left" height="16" right="-12"
42 mouse_opaque="true" name="Name:" v_pad="0" width="70"> 42 mouse_opaque="true" name="online_yes" v_pad="0" width="145">
43 Name: 43 Currently: Online
44 </text> 44 </text>
45 <name_editor bevel_style="in" border_style="line" 45 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
46 border_thickness="1" bottom="-24" enabled="false" follows="left|top" 46 bottom_delta="0" drop_shadow_visible="true" follows="left|top"
47 font="SansSerifSmall" height="16" is_unicode="false" left_delta="75" 47 font="SansSerifsmall" h_pad="0" halign="left" height="16" left_delta="0"
48 max_length="254" mouse_opaque="false" name="name" 48 mouse_opaque="true" name="online_no" v_pad="0" width="145">
49 width="180" /> 49 Currently: Offline
50 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 50 </text>
51 bottom="-24" drop_shadow_visible="true" follows="left|top" 51 <button bottom_delta="-19" font="SansSerif" halign="center" height="20"
52 font="SansSerifsmall" h_pad="0" halign="left" height="16" left="279" 52 label="Instant Message..." label_selected="Instant Message..."
53 mouse_opaque="true" name="online_yes" v_pad="0" width="121"> 53 right="-12" mouse_opaque="true" name="Instant Message..."
54 Currently Online 54 tool_tip="Instant Message (IM)" width="145" />
55 </text> 55 <button bottom_delta="-23" font="SansSerif" halign="center" height="20"
56 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 56 label="Offer Teleport..." label_selected="Offer Teleport..."
57 bottom_delta="-20" drop_shadow_visible="true" follows="left|top" 57 left_delta="0" mouse_opaque="true" name="Offer Teleport..." width="145" />
58 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="279" 58 <button bottom_delta="-34" font="SansSerif" halign="center" height="20"
59 mouse_opaque="true" name="label" v_pad="0" width="121"> 59 label="Add to Friends..." label_selected="Add to Friends..." left_delta="0"
60 Born: 60 mouse_opaque="true" name="Add Friend..." width="145" />
61 </text> 61 <button bottom_delta="-23" font="SansSerif" halign="center" height="20"
62 <line_editor bevel_style="in" border_style="line" 62 label="Invite to Group..." label_selected="Invite to Group..." left_delta="0"
63 mouse_opaque="true" name="Invite to Group..." width="145" />
64 <button bottom_delta="-23" font="SansSerif" halign="center" height="20" label="Find on Map"
65 label_selected="Find on Map" left_delta="0" mouse_opaque="true"
66 name="Find on Map" width="145" />
67 <button bottom_delta="-34" font="SansSerif" halign="center" height="20" label="Pay..."
68 label_selected="Pay..." left_delta="0" mouse_opaque="true" name="Pay..."
69 width="145" />
70 <button bottom_delta="-23" font="SansSerif" halign="center" height="20" label="Mute"
71 label_selected="Mute" left_delta="0" mouse_opaque="true" name="Mute"
72 width="145" />
73 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
74 bottom_delta="-25" drop_shadow_visible="true" follows="left|top"
75 font="SansSerifSmall" h_pad="0" halign="left" height="16" right="-12"
76 mouse_opaque="true" name="label" v_pad="0" width="145">
77 Born:
78 </text>
79 <line_editor bevel_style="in" border_style="line"
63 border_thickness="1" bottom_delta="-16" enabled="true" follows="left|top" 80 border_thickness="1" bottom_delta="-16" enabled="true" follows="left|top"
64 font="SansSerifSmall" height="16" is_unicode="false" left="279" 81 font="SansSerifSmall" height="18" is_unicode="false" right="-12"
65 max_length="254" mouse_opaque="false" name="born" 82 max_length="254" mouse_opaque="false" name="born"
66 width="121" /> 83 width="145" />
67 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 84 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
68 bottom_delta="-20" drop_shadow_visible="true" follows="left|top" 85 bottom_delta="-24" drop_shadow_visible="true" follows="left|top"
69 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="279" 86 font="SansSerifSmall" h_pad="0" halign="left" height="16" right="-12"
70 mouse_opaque="true" name="label2" v_pad="0" width="121"> 87 mouse_opaque="true" name="label2" v_pad="0" width="145">
71 Account: 88 Account:
72 </text> 89 </text>
73 <view_border bevel_style="in" bottom_delta="-48" follows="left|top" height="48" left="279" 90 <view_border bevel_style="in" bottom_delta="-52" follows="left|top" height="52" right="-12"
74 mouse_opaque="false" name="acct_border" width="121" /> 91 mouse_opaque="false" name="acct_border" width="145" />
75 <text bg_visible="false" border_drop_shadow_visible="false" 92 <text bg_visible="false" border_drop_shadow_visible="false"
76 border_visible="true" bottom_delta="0" drop_shadow_visible="true" 93 border_visible="true" bottom_delta="0" drop_shadow_visible="true"
77 follows="left|top" font="SansSerifSmall" height="48" left="279" 94 follows="left|top" font="SansSerifSmall" height="48" left="264"
78 mouse_opaque="false" name="acct" width="121" /> 95 mouse_opaque="false" name="acct" width="121" />
79 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 96 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
80 bottom_delta="-20" drop_shadow_visible="true" follows="left|top" 97 bottom_delta="-25" drop_shadow_visible="true" follows="left|top"
81 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="279" 98 font="SansSerifSmall" h_pad="0" halign="left" height="16" right="-12"
82 mouse_opaque="true" name="partner_label" 99 mouse_opaque="true" name="partner_label"
83 tool_tip="Second Life partner. For more info on how to set, see www.secondlife.com/partner" 100 tool_tip="Second Life partner. For more info on how to set, see www.secondlife.com/partner"
84 v_pad="0" width="130"> 101 v_pad="0" width="145">
85 Partner: 102 Partner:
86 </text> 103 </text>
87 <button bottom_delta="2" follows="left|top" font="SansSerif" halign="center" 104 <button bottom_delta="1" follows="left|top" font="SansSerif" halign="center"
88 height="18" label="i" label_selected="i" left_delta="44" 105 height="18" label="i" label_selected="i" left_delta="44"
89 mouse_opaque="true" name="partner_info" 106 mouse_opaque="true" name="partner_info"
90 tool_tip="Click to open partner&apos;s profile" width="18" /> 107 tool_tip="Click to open partner&apos;s profile" width="20" />
91 <button bottom_delta="0" follows="left|top" font="SansSerif" halign="center" 108 <button bottom_delta="0" follows="left|top" font="SansSerif" halign="center"
92 height="18" label="?" label_selected="?" left_delta="24" 109 height="18" label="?" label_selected="?" left_delta="24"
93 mouse_opaque="true" name="partner_help" width="18" /> 110 mouse_opaque="true" name="partner_help" width="20" />
94 <line_editor bevel_style="in" border_style="line" 111 <line_editor bevel_style="in" border_style="line"
95 border_thickness="1" bottom_delta="-16" enabled="true" follows="left|top" 112 border_thickness="1" bottom_delta="-19" enabled="true" follows="left|top"
96 font="SansSerifSmall" height="16" is_unicode="false" left="279" 113 font="SansSerifSmall" height="18" is_unicode="false" right="-12"
97 max_length="254" mouse_opaque="false" name="partner_edit" 114 max_length="254" mouse_opaque="false" name="partner_edit"
98 tool_tip="Second Life partner. For more info on how to set, see www.secondlife.com/partner" 115 tool_tip="Second Life partner. For more info on how to set, see www.secondlife.com/partner"
99 width="121"> 116 width="145">
100 [FIRST] [LAST] 117 [FIRST] [LAST]
101 </line_editor> 118 </line_editor>
102 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 119 <name_editor bevel_style="in" border_style="line"
103 bottom="-44" drop_shadow_visible="true" follows="left|top" 120 border_thickness="1" bottom="-23" enabled="false" follows="left|top"
104 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 121 font="SansSerifSmall" height="16" is_unicode="false" left="12"
105 mouse_opaque="true" name="Photo:" v_pad="0" width="70"> 122 max_length="254" mouse_opaque="false" name="name"
106 Photo: 123 width="235" />
107 </text> 124 <texture_picker allow_no_texture="true" bottom="271" can_apply_immediately="false"
108 <texture_picker allow_no_texture="true" bottom="-179" can_apply_immediately="false" 125 default_image_name="None" follows="left|top" height="192" label=""
109 default_image_name="None" follows="left|top" height="151" label="" 126 left="12" mouse_opaque="true" name="img" scale_image="false" auto-resize="false"
110 left="79" mouse_opaque="true" name="img" 127 tool_tip="Click to choose a picture" width="235" />
111 tool_tip="Click to choose a picture" width="180" /> 128 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
112 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 129 bottom_delta="-6" drop_shadow_visible="true" follows="left|top"
113 bottom="-183" drop_shadow_visible="true" follows="left|top" 130 font="SansSerifSmall" h_pad="0" halign="left" height="16" left_delta="0"
114 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 131 mouse_opaque="true" name="About:" v_pad="0" width="170">
115 mouse_opaque="true" name="Groups:" v_pad="0" width="70"> 132 About (500 chars):
116 Groups: 133 </text>
117 </text> 134 <text_editor bottom_delta="-137" embedded_items="false"
118 <scroll_list background_visible="true" bottom="-258" column_padding="5" draw_border="true" 135 enabled="true" follows="left|top" font="SansSerifSmall" height="137"
119 follows="left|top" height="90" left="79" mouse_opaque="false" 136 is_unicode="false" left_delta="0" max_length="511" mouse_opaque="true"
120 multi_select="false" name="groups" width="321" /> 137 name="about" width="235" word_wrap="true" />
121 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 138
122 bottom="-280" drop_shadow_visible="true" follows="left|top" 139 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
123 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 140 bottom_delta="-20" drop_shadow_visible="true" follows="left|top"
124 mouse_opaque="true" name="About:" v_pad="0" width="70"> 141 font="SansSerifSmall" halign="left" height="16" left="12"
125 About: 142 mouse_opaque="true" name="Groups:" width="70">
126 </text> 143 Groups:
127 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 144 </text>
128 bottom_delta="-16" drop_shadow_visible="true" follows="left|top" 145 <scroll_list background_visible="true" bottom_delta="-80" column_padding="5" draw_border="true"
129 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="0" 146 follows="left|top" height="80" left_delta="0" mouse_opaque="false"
130 mouse_opaque="true" name="(500 chars)" v_pad="0" width="70"> 147 multi_select="false" name="groups" width="235" />
131 (500 chars) 148 <view_border blevel_style="in" bottom_delta="0" follows="left|top" height="80" right="-12"
132 </text> 149 mouse_opaque="false" name="drop_target_rect_vis" width="145" />
133 <text_editor bottom="-375" embedded_items="false" 150 <view_border blevel_style="in" border_thickness="0" bottom_delta="0" follows="left|top"
134 enabled="true" follows="left|top" font="SansSerifSmall" height="110" 151 height="80" left_delta="0" mouse_opaque="false" name="drop_target_rect"
135 is_unicode="false" left="79" max_length="511" mouse_opaque="true" 152 width="145" />
136 name="about" width="321" word_wrap="true" /> 153 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
137 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 154 bottom_delta="40" drop_shadow_visible="true" follows="left|top"
138 bottom="-403" drop_shadow_visible="true" follows="left|top" 155 font="SansSerifSmall" h_pad="0" halign="center" height="16" right="-28"
139 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="0" 156 mouse_opaque="true" name="drop target"
140 mouse_opaque="true" name="Give item:" v_pad="0" width="75"> 157 tool_tip="Drop inventory items here to give them to this resident." v_pad="2"
141 Give item: 158 width="115">
142 </text> 159 Drop inventory here
143 <view_border blevel_style="in" border_thickness="0" bottom="-466" follows="left|top" 160 </text>
144 height="466" left_delta="4" mouse_opaque="false" name="drop_target_rect" 161 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
145 width="409" /> 162 bottom_delta="-18" drop_shadow_visible="true" follows="left|top"
146 <view_border blevel_style="in" bottom="-403" follows="left|top" height="16" left_delta="75"
147 mouse_opaque="false" name="drop_target_rect_vis" width="321" />
148 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
149 bottom_delta="0" drop_shadow_visible="true" follows="left|top"
150 font="SansSerifSmall" h_pad="0" halign="center" height="16" left_delta="0" 163 font="SansSerifSmall" h_pad="0" halign="center" height="16" left_delta="0"
151 mouse_opaque="true" name="Give inventory" 164 mouse_opaque="true" name="Give inventory 2" width="115"
152 tool_tip="Drop inventory items here to give them to this person." v_pad="2" 165 tool_tip="Drop inventory items here to give them to this resident.">
153 width="321"> 166 to give to resident
154 Drop inventory item here. 167 </text>
155 </text> 168 <check_box bottom="1" follows="left|top" font="SansSerifSmall" height="16"
156 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16" 169 initial_value="false" label="Show profile in search" left="18" mouse_opaque="true"
157 initial_value="false" label="Show in search" left="75" mouse_opaque="true"
158 name="allow_publish" 170 name="allow_publish"
159 tool_tip="Publish extra profile information such as description and image in Search." 171 tool_tip="Publish extra profile information such as description and image in Search."
160 width="130" /> 172 width="145" />
161 <button bottom="-425" follows="left|top" font="SansSerif" halign="center" height="20" 173 <button bottom_delta="0" follows="left|top" font="SansSerif" halign="center" height="18"
162 label="?" label_selected="?" left_delta="145" mouse_opaque="true" name="?" 174 label="?" label_selected="?" left_delta="150" mouse_opaque="true" name="?"
163 width="20" /> 175 width="20" />
164 <button bottom="-428" font="SansSerif" halign="center" height="20" label="Find on Map" 176 </panel>
165 label_selected="Find on Map" left="24" mouse_opaque="true" 177 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
166 name="Find on Map" width="100" /> 178 label="Web" left="1" mouse_opaque="true" name="WebProfile" width="418">
167 <button bottom="-428" font="SansSerif" halign="center" height="20" 179 <line_editor bevel_style="in" border_style="line"
168 label="Offer Teleport..." label_selected="Offer Teleport..."
169 left_delta="102" mouse_opaque="true" name="Offer Teleport..." width="140" />
170 <button bottom="-428" font="SansSerif" halign="center" height="20"
171 label="Add Friend..." label_selected="Add Friend..." left_delta="142"
172 mouse_opaque="true" name="Add Friend..." width="130" />
173 <button bottom_delta="-24" font="SansSerif" halign="center" height="20" label="Pay..."
174 label_selected="Pay..." left="24" mouse_opaque="true" name="Pay..."
175 width="100" />
176 <button bottom_delta="0" font="SansSerif" halign="center" height="20"
177 label="Instant Message..." label_selected="Instant Message..."
178 left_delta="102" mouse_opaque="true" name="Instant Message..."
179 tool_tip="Instant Message (IM)" width="140" />
180 <button bottom_delta="0" font="SansSerif" halign="center" height="20" label="Mute"
181 label_selected="Mute" left_delta="142" mouse_opaque="true" name="Mute"
182 width="130" />
183 </panel>
184 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
185 label="Web" left="1" mouse_opaque="true" name="WebProfile" width="418">
186 <line_editor bevel_style="in" border_style="line"
187 border_thickness="1" bottom_delta="-18" enabled="false" follows="left|top" 180 border_thickness="1" bottom_delta="-18" enabled="false" follows="left|top"
188 font="SansSerifSmall" height="16" is_unicode="false" left="10" 181 font="SansSerifSmall" height="16" is_unicode="false" left="10"
189 max_length="254" mouse_opaque="true" name="url_edit" 182 max_length="254" mouse_opaque="true" name="url_edit"
190 width="400" /> 183 width="400" />
191 <flyout_button bottom_delta="-22" follows="left|top" font="SansSerifSmall" halign="center" 184 <flyout_button bottom_delta="-22" follows="left|top" font="SansSerifSmall" halign="center"
192 height="18" label="Load" label_selected="Load" left="10" 185 height="18" label="Load" label_selected="Load" left="10"
193 mouse_opaque="true" name="load" enabled="false" 186 mouse_opaque="true" name="load" enabled="false"
194 tool_tip="Load this profile page with embedded web browser." width="80" > 187 tool_tip="Load this profile page with embedded web browser." width="80" >
195 <flyout_button_item value="open" name="open_item">In external browser</flyout_button_item> 188 <flyout_button_item value="open" name="open_item">In external browser</flyout_button_item>
196 <flyout_button_item value="home" name="home_item">Home URL</flyout_button_item> 189 <flyout_button_item value="home" name="home_item">Home URL</flyout_button_item>
197 </flyout_button> 190 </flyout_button>
198 <button bottom_delta="0" follows="left|top" font="SansSerif" halign="center" 191 <button bottom_delta="0" follows="left|top" font="SansSerif" halign="center"
199 height="18" label="?" label_selected="?" left_delta="85" 192 height="18" label="?" label_selected="?" left_delta="85"
200 mouse_opaque="true" name="web_profile_help" width="18" /> 193 mouse_opaque="true" name="web_profile_help" width="18" />
201 <check_box bottom_delta="0" follows="right|top" font="SansSerifSmall" height="16" 194 <check_box bottom_delta="0" follows="right|top" font="SansSerifSmall" height="16"
202 initial_value="false" label="Automatically load web profiles" 195 initial_value="false" label="Automatically load web profiles"
203 left_delta="30" mouse_opaque="true" name="auto_load" 196 left_delta="30" mouse_opaque="true" name="auto_load"
204 tool_tip="Automatically load ALL profile webpages without asking first." 197 tool_tip="Automatically load ALL profile webpages without asking first."
205 width="127" /> 198 width="127" />
206 <web_browser border_visible="false" bottom="-444" follows="top|left|right" height="400" 199 <web_browser border_visible="false" bottom="-444" follows="top|left|right" height="400"
207 ignore_ui_scale="false" left="10" name="profile_html" start_url="" 200 ignore_ui_scale="false" left="10" name="profile_html" start_url=""
208 width="400" /> 201 width="400" />
209 <text bottom="5" follows="bottom|left|right" left="15" name="status_text" right="-70" 202 <text bottom="5" follows="bottom|left|right" left="15" name="status_text" right="-70"
210 top="25" /> 203 top="25" />
211 </panel> 204 </panel>
212 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466" 205 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
213 label="Interests" left="1" mouse_opaque="true" name="Interests" width="418"> 206 label="Interests" left="1" mouse_opaque="true" name="Interests" width="418">
214 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 207 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
215 bottom="-36" drop_shadow_visible="true" follows="left|top" 208 bottom="-36" drop_shadow_visible="true" follows="left|top"
216 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 209 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="12"
217 mouse_opaque="true" name="I Want To:" v_pad="0" width="70"> 210 mouse_opaque="true" name="I Want To:" v_pad="0" width="70">
218 I Want To: 211 I Want To:
219 </text> 212 </text>
220 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16" 213 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
221 initial_value="false" label="Build" left_delta="70" mouse_opaque="true" 214 initial_value="false" label="Build" left_delta="70" mouse_opaque="true"
222 name="chk0" width="90" /> 215 name="chk0" width="90" />
223 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16" 216 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
224 initial_value="false" label="Explore" left_delta="170" mouse_opaque="true" 217 initial_value="false" label="Explore" left_delta="170" mouse_opaque="true"
225 name="chk1" width="90" /> 218 name="chk1" width="90" />
226 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16" 219 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
227 initial_value="false" label="Meet" left_delta="-170" mouse_opaque="true" 220 initial_value="false" label="Meet" left_delta="-170" mouse_opaque="true"
228 name="chk2" width="57" /> 221 name="chk2" width="57" />
229 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16" 222 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
230 initial_value="false" label="Be Hired" left_delta="170" mouse_opaque="true" 223 initial_value="false" label="Be Hired" left_delta="170" mouse_opaque="true"
231 name="chk6" width="92" /> 224 name="chk6" width="92" />
232 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16" 225 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
233 initial_value="false" label="Group" left_delta="-170" mouse_opaque="true" 226 initial_value="false" label="Group" left_delta="-170" mouse_opaque="true"
234 name="chk3" width="90" /> 227 name="chk3" width="90" />
235 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16" 228 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
236 initial_value="false" label="Buy" left_delta="170" mouse_opaque="true" 229 initial_value="false" label="Buy" left_delta="170" mouse_opaque="true"
237 name="chk4" width="90" /> 230 name="chk4" width="90" />
238 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16" 231 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
239 initial_value="false" label="Sell" left_delta="-170" mouse_opaque="true" 232 initial_value="false" label="Sell" left_delta="-170" mouse_opaque="true"
240 name="chk5" width="50" /> 233 name="chk5" width="50" />
241 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16" 234 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
242 initial_value="false" label="Hire" left_delta="170" mouse_opaque="true" 235 initial_value="false" label="Hire" left_delta="170" mouse_opaque="true"
243 name="chk7" width="92" /> 236 name="chk7" width="92" />
244 <line_editor bevel_style="in" border_style="line" 237 <line_editor bevel_style="in" border_style="line"
245 border_thickness="1" bottom_delta="-20" enabled="true" follows="left|top" 238 border_thickness="1" bottom_delta="-20" enabled="true" follows="left|top"
246 font="SansSerifSmall" height="16" is_unicode="false" left="74" 239 font="SansSerifSmall" height="16" is_unicode="false" left="74"
247 max_length="254" mouse_opaque="true" name="want_to_edit" 240 max_length="254" mouse_opaque="true" name="want_to_edit"
248 width="330" /> 241 width="330" />
249 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 242 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
250 bottom_delta="-26" drop_shadow_visible="true" follows="left|top" 243 bottom_delta="-26" drop_shadow_visible="true" follows="left|top"
251 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 244 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="12"
252 mouse_opaque="true" name="Skills:" v_pad="0" width="70"> 245 mouse_opaque="true" name="Skills:" v_pad="0" width="70">
253 Skills: 246 Skills:
254 </text> 247 </text>
255 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16" 248 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
256 initial_value="false" label="Textures" left_delta="70" mouse_opaque="true" 249 initial_value="false" label="Textures" left_delta="70" mouse_opaque="true"
257 name="schk0" width="90" /> 250 name="schk0" width="90" />
258 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16" 251 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
259 initial_value="false" label="Architecture" left_delta="170" 252 initial_value="false" label="Architecture" left_delta="170"
260 mouse_opaque="true" name="schk1" width="93" /> 253 mouse_opaque="true" name="schk1" width="93" />
261 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16" 254 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
262 initial_value="false" label="Event Planning" left_delta="0" 255 initial_value="false" label="Event Planning" left_delta="0"
263 mouse_opaque="true" name="schk2" width="105" /> 256 mouse_opaque="true" name="schk2" width="105" />
264 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16" 257 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
265 initial_value="false" label="Modeling" left_delta="-170" 258 initial_value="false" label="Modeling" left_delta="-170"
266 mouse_opaque="true" name="schk3" width="90" /> 259 mouse_opaque="true" name="schk3" width="90" />
267 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16" 260 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
268 initial_value="false" label="Scripting" left_delta="0" mouse_opaque="true" 261 initial_value="false" label="Scripting" left_delta="0" mouse_opaque="true"
269 name="schk4" width="90" /> 262 name="schk4" width="90" />
270 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16" 263 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
271 initial_value="false" label="Custom Characters" left_delta="170" 264 initial_value="false" label="Custom Characters" left_delta="170"
272 mouse_opaque="true" name="schk5" width="127" /> 265 mouse_opaque="true" name="schk5" width="127" />
273 <line_editor bevel_style="in" border_style="line" 266 <line_editor bevel_style="in" border_style="line"
274 border_thickness="1" bottom_delta="-20" enabled="true" follows="left|top" 267 border_thickness="1" bottom_delta="-20" enabled="true" follows="left|top"
275 font="SansSerifSmall" height="16" is_unicode="false" left="74" 268 font="SansSerifSmall" height="16" is_unicode="false" left="74"
276 max_length="254" mouse_opaque="true" name="skills_edit" 269 max_length="254" mouse_opaque="true" name="skills_edit"
277 width="330" /> 270 width="330" />
278 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 271 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
279 bottom_delta="-30" drop_shadow_visible="true" follows="left|top" 272 bottom_delta="-30" drop_shadow_visible="true" follows="left|top"
280 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 273 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="12"
281 mouse_opaque="true" name="Languages:" v_pad="0" width="70"> 274 mouse_opaque="true" name="Languages:" v_pad="0" width="70">
282 Languages: 275 Languages:
283 </text> 276 </text>
284 <line_editor bevel_style="in" border_style="line" 277 <line_editor bevel_style="in" border_style="line"
285 border_thickness="1" bottom_delta="0" enabled="true" follows="left|top" 278 border_thickness="1" bottom_delta="0" enabled="true" follows="left|top"
286 font="SansSerifSmall" height="16" is_unicode="false" left="74" 279 font="SansSerifSmall" height="16" is_unicode="false" left="74"
287 max_length="254" mouse_opaque="true" name="languages_edit" 280 max_length="254" mouse_opaque="true" name="languages_edit"
288 width="330" /> 281 width="330" />
289 </panel> 282 </panel>
290 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466" 283 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
291 label="Picks" left="1" mouse_opaque="true" name="Picks" width="418"> 284 label="Picks" left="1" mouse_opaque="true" name="Picks" width="418">
292 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 285 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
293 bottom="-20" drop_shadow_visible="true" follows="left|top" 286 bottom="-20" drop_shadow_visible="true" follows="left|top"
294 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="114" 287 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="114"
295 mouse_opaque="true" 288 mouse_opaque="true"
296 name="Tell everyone about your favorite places in Second Life." v_pad="0" 289 name="Tell everyone about your favorite places in Second Life." v_pad="0"
297 width="302"> 290 width="302">
298 Tell everyone about your favorite places in Second Life. 291 Tell everyone about your favorite places in Second Life.
299 </text> 292 </text>
300 <button bottom_delta="-24" follows="left|top" font="SansSerif" halign="center" 293 <button bottom_delta="-24" follows="left|top" font="SansSerif" halign="center"
301 height="20" label="New..." label_selected="New..." left="114" 294 height="20" label="New..." label_selected="New..." left="114"
302 mouse_opaque="true" name="New..." width="75" /> 295 mouse_opaque="true" name="New..." width="75" />
303 <button bottom="-44" follows="left|top" font="SansSerif" halign="center" height="20" 296 <button bottom="-44" follows="left|top" font="SansSerif" halign="center" height="20"
304 label="Delete..." label_selected="Delete..." left_delta="79" 297 label="Delete..." label_selected="Delete..." left_delta="79"
305 mouse_opaque="true" name="Delete..." width="75" /> 298 mouse_opaque="true" name="Delete..." width="75" />
306 <tab_container bottom="-411" follows="left|top" height="363" left="4" mouse_opaque="false" 299 <tab_container bottom="-411" follows="left|top" height="363" left="12" mouse_opaque="false"
307 name="picks tab" tab_position="left" width="412" /> 300 name="picks tab" tab_position="left" width="412" />
308 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 301 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
309 bottom="-70" drop_shadow_visible="true" follows="left|top" font="SansSerif" 302 bottom="-70" drop_shadow_visible="true" follows="left|top" font="SansSerif"
310 h_pad="0" halign="left" height="20" left="114" mouse_opaque="false" 303 h_pad="0" halign="left" height="20" left="114" mouse_opaque="false"
311 name="loading_text" v_pad="0" width="302"> 304 name="loading_text" v_pad="0" width="302">
312 Loading... 305 Loading...
313 </text> 306 </text>
314 </panel> 307 </panel>
315 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466" 308 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
316 label="Classified" left="1" mouse_opaque="true" name="Classified" 309 label="Classified" left="1" mouse_opaque="true" name="Classified"
317 width="418"> 310 width="418">
318 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 311 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
319 bottom="-20" drop_shadow_visible="true" follows="left|top" 312 bottom="-20" drop_shadow_visible="true" follows="left|top"
320 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="114" 313 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="114"
321 mouse_opaque="true" 314 mouse_opaque="true"
322 name="Place an ad in Second Life&apos;s classified listings." v_pad="0" 315 name="Place an ad in Second Life&apos;s classified listings." v_pad="0"
323 width="302"> 316 width="302">
324 Place an ad in Second Life&apos;s classified listings. 317 Place an ad in Second Life&apos;s classified listings.
325 </text> 318 </text>
326 <button bottom_delta="-24" follows="left|top" font="SansSerif" halign="center" 319 <button bottom_delta="-24" follows="left|top" font="SansSerif" halign="center"
327 height="20" label="New..." label_selected="New..." left="114" 320 height="20" label="New..." label_selected="New..." left="114"
328 mouse_opaque="true" name="New..." width="75" /> 321 mouse_opaque="true" name="New..." width="75" />
329 <button bottom="-44" follows="left|top" font="SansSerif" halign="center" height="20" 322 <button bottom="-44" follows="left|top" font="SansSerif" halign="center" height="20"
330 label="Delete..." label_selected="Delete..." left_delta="79" 323 label="Delete..." label_selected="Delete..." left_delta="79"
331 mouse_opaque="true" name="Delete..." width="75" /> 324 mouse_opaque="true" name="Delete..." width="75" />
332 <tab_container bottom="-443" follows="left|top" height="395" left="4" mouse_opaque="false" 325 <tab_container bottom="-443" follows="left|top" height="395" left="12" mouse_opaque="false"
333 name="classified tab" tab_position="left" width="412" /> 326 name="classified tab" tab_position="left" width="412" />
334 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 327 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
335 bottom="-70" drop_shadow_visible="true" follows="left|top" font="SansSerif" 328 bottom="-70" drop_shadow_visible="true" follows="left|top" font="SansSerif"
336 h_pad="0" halign="left" height="20" left="114" mouse_opaque="false" 329 h_pad="0" halign="left" height="20" left="114" mouse_opaque="false"
337 name="loading_text" v_pad="0" width="302"> 330 name="loading_text" v_pad="0" width="302">
338 Loading... 331 Loading...
339 </text> 332 </text>
340 </panel> 333 </panel>
341 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466" 334 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
342 label="1st Life" left="1" mouse_opaque="true" name="1st Life" width="418"> 335 label="1st Life" left="1" mouse_opaque="true" name="1st Life" width="418">
343 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 336 <texture_picker allow_no_texture="true" bottom="220" can_apply_immediately="false"
344 bottom="-36" drop_shadow_visible="true" follows="left|top" 337 default_image_name="None" follows="left|top" height="235" label=""
345 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 338 left="12" mouse_opaque="true" name="img"
346 mouse_opaque="true" name="Photo:" v_pad="0" width="61"> 339 tool_tip="Click to choose a picture" width="235" />
347 Photo: 340 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
348 </text> 341 bottom_delta="-8" drop_shadow_visible="true" follows="left|top"
349 <texture_picker allow_no_texture="true" bottom="-171" can_apply_immediately="false" 342 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="12"
350 default_image_name="None" follows="left|top" height="151" label="" 343 mouse_opaque="true" name="Info:" v_pad="0" width="161">
351 left="70" mouse_opaque="true" name="img" 344 Info (250 chars):
352 tool_tip="Click to choose a picture" width="135" /> 345 </text>
353 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 346 <text_editor bottom_delta="-179" embedded_items="false"
354 bottom="-203" drop_shadow_visible="true" follows="left|top" 347 enabled="true" follows="left|top" font="SansSerifSmall" height="178"
355 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 348 is_unicode="false" left="12" max_length="254" mouse_opaque="false"
356 mouse_opaque="true" name="Info:" v_pad="0" width="61"> 349 name="about" width="378" word_wrap="true" />
357 Info: 350 </panel>
358 </text> 351 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
359 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
360 bottom_delta="-16" drop_shadow_visible="true" follows="left|top"
361 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="0"
362 mouse_opaque="true" name="(250 chars)" v_pad="0" width="65">
363 (250 chars)
364 </text>
365 <text_editor bottom="-347" embedded_items="false"
366 enabled="true" follows="left|top" font="SansSerifSmall" height="160"
367 is_unicode="false" left="70" max_length="254" mouse_opaque="false"
368 name="about" width="330" word_wrap="true" />
369 </panel>
370 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
371 label="My Notes" left="1" mouse_opaque="true" name="My Notes" width="418"> 352 label="My Notes" left="1" mouse_opaque="true" name="My Notes" width="418">
372 <string name="Loading"> 353 <string name="Loading">
373 Loading... 354 Loading...
374 </string> 355 </string>
375 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 356 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
376 bottom="-52" drop_shadow_visible="true" follows="left|top" 357 bottom="-52" drop_shadow_visible="true" follows="left|top"
377 font="SansSerifSmall" h_pad="0" halign="left" height="48" left="10" 358 font="SansSerifSmall" h_pad="0" halign="left" height="48" left="10"
378 mouse_opaque="true" name="label" v_pad="0" width="412"> 359 mouse_opaque="true" name="label" v_pad="0" width="412">
379 Use this space to record your notes about this person. Keep track 360 Use this space to record your notes about this person. Keep track
380of trades in progress, joint projects, etc. Only you can see these 361 of trades in progress, joint projects, etc. Only you can see these
381notes. This person cannot see them, nor can other people. 362 notes. This person cannot see them, nor can other people.
382 </text> 363 </text>
383 <text_editor bottom_delta="-260" embedded_items="false" enabled="true" follows="left|top" 364 <text_editor bottom_delta="-260" embedded_items="false" enabled="true" follows="left|top"
384 font="SansSerif" height="256" is_unicode="false" left="10" 365 font="SansSerif" height="256" is_unicode="false" left="10"
385 max_length="1023" mouse_opaque="true" name="notes edit" width="400" 366 max_length="1023" mouse_opaque="true" name="notes edit" width="400"
386 word_wrap="false" /> 367 word_wrap="false" />
387 </panel> 368 </panel>
388 </tab_container> 369 </tab_container>
389 <button bottom="-483" font="SansSerif" halign="center" height="20" label="OK" 370 <button bottom="-508" font="SansSerif" halign="center" height="20" label="OK"
390 label_selected="OK" left="208" mouse_opaque="true" name="OK" width="100" /> 371 label_selected="OK" left="208" mouse_opaque="true" name="OK" width="100" />
391 <button bottom_delta="0" font="SansSerif" halign="center" height="20" label="Cancel" 372 <button bottom="-508" font="SansSerif" halign="center" height="20" label="Cancel"
392 label_selected="Cancel" left_delta="105" mouse_opaque="true" name="Cancel" 373 label_selected="Cancel" left_delta="105" mouse_opaque="true" name="Cancel"
393 width="100" /> 374 width="100" />
394 <button bottom_delta="132" font="SansSerif" halign="center" height="20" label="Kick" 375 <button bottom_delta="0" font="SansSerif" halign="center" height="20" label="Kick"
395 label_selected="Kick" left="4" mouse_opaque="true" name="Kick" width="72" /> 376 label_selected="Kick" left="12" mouse_opaque="true" name="Kick" width="72" />
396 <button bottom_delta="-24" font="SansSerif" halign="center" height="20" label="Freeze" 377 <button bottom_delta="0" font="SansSerif" halign="center" height="20" label="Freeze"
397 label_selected="Freeze" left="4" mouse_opaque="true" name="Freeze" 378 label_selected="Freeze" left_delta="76" mouse_opaque="true" name="Freeze"
398 tool_tip="Stop this resident&apos;s movement and chat." width="72" /> 379 tool_tip="Stop this resident&apos;s movement and chat." width="72" />
399 <button bottom_delta="-24" font="SansSerif" halign="center" height="20" 380 <button bottom_delta="0" font="SansSerif" halign="center" height="20"
400 label="Unfreeze" label_selected="Unfreeze" left="4" mouse_opaque="true" 381 label="Unfreeze" label_selected="Unfreeze" left_delta="76" mouse_opaque="true"
401 name="Unfreeze" tool_tip="Thaw resident" width="72" /> 382 name="Unfreeze" tool_tip="Thaw resident" width="72" />
402 <button bottom_delta="-24" font="SansSerif" halign="center" height="20" label="CSR" 383 <button bottom_delta="0" font="SansSerif" halign="center" height="20" label="CSR"
403 label_selected="CSR" left="4" mouse_opaque="true" name="csr_btn" 384 label_selected="CSR" left_delta="76" mouse_opaque="true" name="csr_btn"
404 tool_tip="Open customer service tool for this resident" width="72" /> 385 tool_tip="Open customer service tool for this resident" width="72" />
405 <string name="ShowOnMapNonFriend"> 386 <string name="ShowOnMapNonFriend">
406 Show location on the map. 387 Show location on the map.
407Disabled because you have not 388 Disabled because you have not
408formed a friendship with them. 389 formed a friendship with them.
409 </string> 390 </string>
410 <string name="ShowOnMapFriendOffline"> 391 <string name="ShowOnMapFriendOffline">
411 Show location on the map. 392 Show location on the map.
412 Disabled because they are not online. 393 Disabled because they are not online.
413 </string> 394 </string>
414 <string name="ShowOnMapFriendOnline"> 395 <string name="ShowOnMapFriendOnline">
415 Show location on the map. 396 Show location on the map.
416 </string> 397 </string>
417 <string name="TeleportGod"> 398 <string name="TeleportGod">
418 Force a teleport to your location. 399 Force a teleport to your location.
419 </string> 400 </string>
420 <string name="TeleportPrelude"> 401 <string name="TeleportPrelude">
421 Offer a teleport to your location. 402 Offer a teleport to your location.
422Disabled until you leave Orientation Island. 403 Disabled until you leave Orientation Island.
423 </string> 404 </string>
424 <string name="TeleportNormal"> 405 <string name="TeleportNormal">
425 Offer a teleport to your location. 406 Offer a teleport to your location.
426 </string> 407 </string>
427 <string name="Loading"> 408 <string name="Loading">
428 Loading... 409 Loading...
429 </string> 410 </string>
411 <string name="HiddenLabel">
412 (hidden)
413 </string>
430</panel> 414</panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
index 464ecac..ac3a74a 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
@@ -8,13 +8,17 @@
8 <button bottom="-23" follows="left|bottom" font="SansSerif" halign="center" height="20" 8 <button bottom="-23" follows="left|bottom" font="SansSerif" halign="center" height="20"
9 label="Local Chat" left="7" name="History" 9 label="Local Chat" left="7" name="History"
10 tool_tip="Click here to see what has been said" width="93" /> 10 tool_tip="Click here to see what has been said" width="93" />
11 <spinner bottom="-24" decimal_digits="0" follows="left|bottom" height="20"
12 increment="1.00" initial_val="0" label="Channel" label_width="50" left="107"
13 max_val="2147483647" min_val="0" mouse_opaque="true" name="channel_control"
14 width="100" tool_tip="Set the default channel for inworld chat"/>
11 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="-23" 15 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="-23"
12 follows="left|right|bottom" font="SansSerif" 16 follows="left|right|bottom" font="SansSerif"
13 handle_edit_keys_directly="false" height="20" label="Click here to chat." 17 handle_edit_keys_directly="false" height="20" label="Click here to chat."
14 left="107" max_length="254" name="Chat Editor" 18 left="212" max_length="254" name="Chat Editor"
15 select_all_on_focus_received="false" select_on_focus="false" tab_group="1" 19 select_all_on_focus_received="false" select_on_focus="false" tab_group="1"
16 tool_tip="Press Enter to say, Ctrl-Enter to shout." width="105" /> 20 tool_tip="Press Enter to say, Ctrl-Enter to shout." width="5" />
17 <flyout_button bottom="-23" follows="right|bottom" height="20" label="Say" left_delta="109" 21 <flyout_button bottom="-23" follows="right|bottom" height="20" label="Say" left_delta="4"
18 list_position="above" mouse_opaque="true" name="Say" tool_tip="(Enter)" 22 list_position="above" mouse_opaque="true" name="Say" tool_tip="(Enter)"
19 width="80"> 23 width="80">
20 <flyout_button_item value="shout" name="shout_item"> 24 <flyout_button_item value="shout" name="shout_item">
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml b/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml
index c47985b..0bc7866 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_groups.xml
@@ -36,4 +36,7 @@
36 label="Search..." name="Search..." width="80" /> 36 label="Search..." name="Search..." width="80" />
37 <button bottom_delta="-25" follows="top|right" font="SansSerif" height="22" 37 <button bottom_delta="-25" follows="top|right" font="SansSerif" height="22"
38 label="Leave" name="Leave" width="80" /> 38 label="Leave" name="Leave" width="80" />
39 <string name="none">
40 none
41 </string>
39</panel> 42</panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_login.xml b/linden/indra/newview/skins/default/xui/en-us/panel_login.xml
index 4e0e69b..eef04e8 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_login.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_login.xml
@@ -1,56 +1,35 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel bottom="0" follows="left|top|right|bottom" height="600" left="0" 2
3 mouse_opaque="true" name="panel_login" width="800"> 3<panel name="panel_login"
4 <web_browser border_visible="false" bottom="0" follows="top|left|bottom|right" left="0" 4 bottom="0" left="0" height="600" width="800"
5 name="login_html" right="-1" 5 follows="left|top|right|bottom" mouse_opaque="true" >
6 start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody bgcolor=%22#000000%22 text=%22ffffff%22%3E%3Ch1%3E%3Ctt%3Eloading...%3C/tt%3E%3C/h1%3E %3C/body%3E %3C/html%3E" 6
7 top="-1" /> 7 <web_browser name="login_html"
8 bottom="0" top="-1" left="0" right="-1"
9 border_visible="false" follows="top|left|bottom|right"
10 start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody bgcolor=%22#000000%22 text=%22ffffff%22%3E%3Ch1%3E%3Ctt%3Eloading...%3C/tt%3E%3C/h1%3E %3C/body%3E %3C/html%3E" />
8 <string name="real_url"> 11 <string name="real_url">
9 http://secondlife.com/app/login/ 12 http://secondlife.com/app/login/
10 </string> 13 </string>
11 <string name="forgot_password_url"> 14 <string name="forgot_password_url">
12 http://secondlife.com/account/request.php 15 http://secondlife.com/account/request.php
13 </string> 16 </string>
14 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 17
15 bottom="54" drop_shadow_visible="true" follows="left|bottom" 18
16 font="SansSerif" h_pad="0" halign="left" height="16" 19 <!-- START LOCATION -->
17 left="32" mouse_opaque="true" name="first_name_text" v_pad="0" width="120"> 20
18 First Name: 21 <text name="start_location_text"
19 </text> 22 bottom="8" left="24" height="16" width="95"
20 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" 23 follows="left|bottom" h_pad="0" halign="right" v_pad="0"
21 follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" 24 bg_visible="false" drop_shadow_visible="true"
22 height="20" left="32" max_length="31" mouse_opaque="true" 25 border_visible="false" border_drop_shadow_visible="false"
23 name="first_name_edit" select_all_on_focus_received="true" width="120" /> 26 font="SansSerifSmall" mouse_opaque="true">
24 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
25 bottom="54" drop_shadow_visible="true" follows="left|bottom"
26 font="SansSerif" h_pad="0" halign="left" height="16"
27 left="164" mouse_opaque="true" name="last_name_text" v_pad="0" width="120">
28 Last Name:
29 </text>
30 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24"
31 follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true"
32 height="20" left="164" max_length="31" mouse_opaque="true"
33 name="last_name_edit" select_all_on_focus_received="true" width="120" />
34 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
35 bottom="54" drop_shadow_visible="true" follows="left|bottom"
36 font="SansSerif" h_pad="0" halign="left" height="16"
37 left="296" mouse_opaque="true" name="password_text" v_pad="0" width="120">
38 Password:
39 </text>
40 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24"
41 follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true"
42 height="20" left="296" max_length="16" mouse_opaque="true"
43 name="password_edit" select_all_on_focus_received="true" width="120" />
44 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
45 bottom="10" drop_shadow_visible="true" follows="left|bottom"
46 font="SansSerif" h_pad="0" halign="left" height="16"
47 left="32" mouse_opaque="true" name="start_location_text" v_pad="0"
48 width="95">
49 Start Location: 27 Start Location:
50 </text> 28 </text>
51 <combo_box allow_text_entry="true" bottom="8" follows="left|bottom" height="18" 29 <combo_box name="start_location_combo"
52 left_delta="97" max_chars="128" mouse_opaque="true" 30 bottom_delta="2" left_delta="100" height="16" width="150"
53 name="start_location_combo" width="155"> 31 follows="left|bottom" font="SansSerifSmall"
32 mouse_opaque="true" allow_text_entry="true" max_chars="128">
54 <combo_item name="MyHome" value="My Home"> 33 <combo_item name="MyHome" value="My Home">
55 My Home 34 My Home
56 </combo_item> 35 </combo_item>
@@ -61,36 +40,129 @@
61 &lt;Type region name&gt; 40 &lt;Type region name&gt;
62 </combo_item> 41 </combo_item>
63 </combo_box> 42 </combo_box>
64 <check_box bottom="10" control_name="RememberPassword" 43
65 follows="left|bottom" font="SansSerifSmall" height="16" 44
66 initial_value="false" label="Remember password" 45 <!-- FIRST NAME -->
67 left_delta="163" mouse_opaque="true" name="remember_check" width="138" /> 46
68 <button bottom="28" follows="left|bottom" font="SansSerif" halign="center" 47 <text name="first_name_text"
69 height="24" label="Log In" label_selected="Log In" 48 bottom="56" left="24" height="16" width="120"
70 left="435" mouse_opaque="true" name="connect_btn" scale_image="TRUE" 49 follows="left|bottom" h_pad="0" halign="left" v_pad="0"
71 width="120" /> 50 bg_visible="false" drop_shadow_visible="true"
72 <combo_box allow_text_entry="true" bottom="32" follows="left|bottom" height="18" 51 border_visible="false" border_drop_shadow_visible="false"
73 left_delta="135" max_chars="20" mouse_opaque="true" 52 font="SansSerif" mouse_opaque="true">
74 name="server_combo" width="120" /> 53 First Name:
75 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 54 </text>
76 bottom="45" drop_shadow_visible="true" follows="right|bottom" 55 <line_editor name="first_name_edit"
77 font="SansSerifSmall" font-style="UNDERLINE" h_pad="0" halign="right" height="16" 56 bottom_delta="-20" left_delta="0" height="20" width="120"
78 left="-210" mouse_opaque="true" name="create_new_account_text" v_pad="0" width="200" 57 follows="left|bottom" font="SansSerif"
79 hover="true" hover_color="50 115 185"> 58 bevel_style="in" border_style="line" border_thickness="1"
59 max_length="16" mouse_opaque="true"
60 handle_edit_keys_directly="true"
61 select_all_on_focus_received="true" />
62
63
64 <!-- LAST NAME -->
65
66 <text name="last_name_text"
67 bottom_delta="20" left_delta="130" height="16" width="120"
68 follows="left|bottom" h_pad="0" halign="left" v_pad="0"
69 bg_visible="false" drop_shadow_visible="true"
70 border_visible="false" border_drop_shadow_visible="false"
71 font="SansSerif" mouse_opaque="true">
72 Last Name:
73 </text>
74 <line_editor name="last_name_edit"
75 bottom_delta="-20" left_delta="0" height="20" width="120"
76 follows="left|bottom" font="SansSerif"
77 bevel_style="in" border_style="line" border_thickness="1"
78 max_length="16" mouse_opaque="true"
79 handle_edit_keys_directly="true"
80 select_all_on_focus_received="true" />
81
82
83 <!-- PASSWORD -->
84
85 <text name="password_text"
86 bottom_delta="20" left_delta="130" height="16" width="120"
87 follows="left|bottom" h_pad="0" halign="left" v_pad="0"
88 bg_visible="false" drop_shadow_visible="true"
89 border_visible="false" border_drop_shadow_visible="false"
90 font="SansSerif" mouse_opaque="true">
91 Password:
92 </text>
93 <line_editor name="password_edit"
94 bottom_delta="-20" left_delta="0" height="20" width="120"
95 follows="left|bottom" font="SansSerif"
96 bevel_style="in" border_style="line" border_thickness="1"
97 max_length="16" mouse_opaque="true"
98 handle_edit_keys_directly="true"
99 select_all_on_focus_received="true" />
100 <check_box name="remember_check" label="Remember password"
101 bottom_delta="-24" left_delta="0" height="16" width="140"
102 follows="left|bottom" font="SansSerifSmall"
103 initial_value="false" mouse_opaque="true" />
104
105
106 <!-- GRIDS -->
107
108 <text name="grid_text"
109 bottom="56" left_delta="150" height="16" width="120"
110 follows="left|bottom" h_pad="0" halign="left" v_pad="0"
111 bg_visible="false" drop_shadow_visible="true"
112 border_visible="false" border_drop_shadow_visible="false"
113 font="SansSerif" mouse_opaque="true">
114 Grid:
115 </text>
116 <combo_box name="server_combo"
117 bottom_delta="-20" left_delta="0" height="20" width="120"
118 follows="left|bottom" allow_text_entry="false"
119 max_chars="20" mouse_opaque="true" />
120 <button name="grid_btn" label="Grid Manager"
121 bottom_delta="-24" left_delta="10" height="16" width="100"
122 follows="left|bottom" font="SansSerifSmall" halign="center"
123 mouse_opaque="true" scale_image="TRUE" />
124
125
126 <!-- LOG IN -->
127
128 <button name="connect_btn" label="Log In"
129 bottom="34" left_delta="140" height="24" width="120"
130 follows="left|bottom" font="SansSerif" halign="center"
131 mouse_opaque="true" scale_image="TRUE" />
132
133
134 <!-- ACCOUNT / FORGOT PASSWORD -->
135
136 <text name="create_new_account_text"
137 bottom="45" left="-210" height="16" width="200"
138 follows="right|bottom" h_pad="0" halign="right" v_pad="0"
139 bg_visible="false" drop_shadow_visible="true"
140 border_visible="false" border_drop_shadow_visible="false"
141 font="SansSerifSmall" font-style="UNDERLINE"
142 mouse_opaque="true" hover="true" hover_color="50 115 185">
80 Sign up for account 143 Sign up for account
81 </text> 144 </text>
82 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 145
83 bottom="25" drop_shadow_visible="true" follows="right|bottom" 146 <text name="forgot_password_text"
84 font="SansSerifSmall" font-style="UNDERLINE" h_pad="0" halign="right" height="16" 147 bottom="25" left="-210" height="16" width="200"
85 left="-210" mouse_opaque="true" name="forgot_password_text" v_pad="0" width="200" 148 follows="right|bottom" h_pad="0" halign="right" v_pad="0"
86 hover="true" hover_color="50 115 185"> 149 bg_visible="false" drop_shadow_visible="true"
150 border_visible="false" border_drop_shadow_visible="false"
151 font="SansSerifSmall" font-style="UNDERLINE"
152 mouse_opaque="true" hover="true" hover_color="50 115 185">
87 Forgot your name or password? 153 Forgot your name or password?
88 </text> 154 </text>
89 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 155
90 bottom="5" drop_shadow_visible="true" follows="right|bottom" 156
91 font="SansSerifSmall" h_pad="0" halign="right" height="16" 157 <!-- CHANNEL & VERSION -->
92 left="-310" mouse_opaque="true" name="channel_text" v_pad="0" width="300" 158
93 hover="true" hover_color="50 115 185"> 159 <text name="channel_text"
160 bottom="5" left="-310" height="16" width="300"
161 follows="right|bottom" h_pad="0" halign="right" v_pad="0"
162 bg_visible="false" drop_shadow_visible="true"
163 border_visible="false" border_drop_shadow_visible="false"
164 font="SansSerifSmall" mouse_opaque="true"
165 hover="true" hover_color="50 115 185">
94 [VERSION] 166 [VERSION]
95 </text> 167 </text>
96</panel> 168</panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml b/linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml
index 1a93341..19faa62 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel background_opaque="false" background_visible="true" bg_alpha_color="NetMapBackgroundColor" 2<panel background_opaque="false" background_visible="true" bg_alpha_color="NetMapBackgroundColor"
3 border="false" follows="left|top|right|bottom" height="216" label="Mini Map" 3 border="false" follows="left|top|right|bottom" height="716" label="Mini Map"
4 mouse_opaque="false" name="mini_mapview" width="196"> 4 mouse_opaque="false" name="mini_mapview" width="196">
5 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 5 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
6 bottom="-40" drop_shadow_visible="false" font="SansSerifSmall" h_pad="0" 6 bottom="-40" drop_shadow_visible="false" font="SansSerifSmall" h_pad="0"
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_overlaybar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_overlaybar.xml
index e785909..8ad4fff 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_overlaybar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_overlaybar.xml
@@ -45,16 +45,21 @@
45 use_bounding_rect="true" width="395" /> 45 use_bounding_rect="true" width="395" />
46 </layout_stack> 46 </layout_stack>
47 </layout_panel> 47 </layout_panel>
48 <layout_panel auto_resize="false" bottom="0" left="0" min_width="220" mouse_opaque="false" 48 <layout_panel auto_resize="false" bottom="0" left="0" min_width="184" mouse_opaque="false"
49 name="windlight_remote_container" use_bounding_rect="true" user_resize="false"
50 width="186">
51 <panel background_visible="false" border="false" bottom="0" name="windlight_remote" />
52 </layout_panel>
53 <layout_panel auto_resize="false" bottom="0" left="0" min_width="220" mouse_opaque="false"
49 name="media_remote_container" use_bounding_rect="true" user_resize="false" 54 name="media_remote_container" use_bounding_rect="true" user_resize="false"
50 width="220"> 55 width="220">
51 <panel background_visible="false" border="false" bottom="0" name="media_remote" /> 56 <panel background_visible="false" border="false" bottom="0" name="media_remote" />
52 </layout_panel> 57 </layout_panel>
53 <layout_panel auto_resize="false" bottom="0" left="0" min_width="130" mouse_opaque="false" 58 <layout_panel auto_resize="false" bottom="0" left="0" min_width="130" mouse_opaque="false"
54 name="voice_remote_container" use_bounding_rect="true" user_resize="false" 59 name="voice_remote_container" use_bounding_rect="true" user_resize="false"
55 width="128"> 60 width="128">
56 <panel background_visible="false" border="false" bottom="0" name="voice_remote" /> 61 <panel background_visible="false" border="false" bottom="0" name="voice_remote" />
57 </layout_panel> 62 </layout_panel>
58 </layout_stack> 63 </layout_stack>
59 <string name="unread_count_string_plural"> 64 <string name="unread_count_string_plural">
60 New IMs 65 New IMs
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml
index 62ada26..5926374 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml
@@ -15,7 +15,7 @@
15 Streaming Preferences: 15 Streaming Preferences:
16 </text> 16 </text>
17 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 17 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
18 bottom="-280" drop_shadow_visible="true" enabled="true" follows="left|top" 18 bottom="-300" drop_shadow_visible="true" enabled="true" follows="left|top"
19 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10" 19 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
20 mouse_opaque="true" name="audio_prefs_text" v_pad="0" width="128"> 20 mouse_opaque="true" name="audio_prefs_text" v_pad="0" width="128">
21 Audio Preferences: 21 Audio Preferences:
@@ -28,6 +28,10 @@
28 label="Play Streaming Music When Available (uses more bandwidth)" 28 label="Play Streaming Music When Available (uses more bandwidth)"
29 left="142" mouse_opaque="true" name="streaming_music" radio_style="false" 29 left="142" mouse_opaque="true" name="streaming_music" radio_style="false"
30 width="339" /> 30 width="339" />
31 <check_box bottom_delta="-20" control_name="ShowStreamTitle" enabled="true"
32 follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
33 label="Show stream info in chat" left="162" mouse_opaque="true"
34 name="show_stream_title" radio_style="false" width="338" />
31 <check_box bottom_delta="-20" control_name="AudioStreamingVideo" enabled="true" 35 <check_box bottom_delta="-20" control_name="AudioStreamingVideo" enabled="true"
32 follows="left|top" font="SansSerifSmall" height="16" initial_value="true" 36 follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
33 label="Play Streaming Media When Available (uses more bandwidth)" 37 label="Play Streaming Media When Available (uses more bandwidth)"
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
index 50d1d68..e9ab27c 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
@@ -30,48 +30,52 @@
30 mouse_opaque="false" name="text_box2" v_pad="0" width="128"> 30 mouse_opaque="false" name="text_box2" v_pad="0" width="128">
31 Chat Color: 31 Chat Color:
32 </text> 32 </text>
33 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" 33 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
34 can_apply_immediately="true" color="1 1 1 1" control_name="UserChatColor" 34 can_apply_immediately="true" color="1 1 1 1" control_name="UserChatColor"
35 enabled="true" follows="left|top" height="47" label="You" left="148" 35 enabled="true" follows="left|top" height="47" label="You" left="148"
36 mouse_opaque="true" name="user" width="44" /> 36 mouse_opaque="true" name="user" width="54" />
37 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" 37 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
38 can_apply_immediately="true" color="1 1 1 1" control_name="AgentChatColor" 38 can_apply_immediately="true" color="1 1 1 1" control_name="AgentChatColor"
39 enabled="true" follows="left|top" height="47" label="Others" left_delta="54" 39 enabled="true" follows="left|top" height="56" label="Others" left_delta="68"
40 mouse_opaque="true" name="agent" width="44" /> 40 mouse_opaque="true" name="agent" width="54" />
41 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" 41 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
42 can_apply_immediately="true" color="0.6 0.6 1 1" 42 can_apply_immediately="true" color="0.6 0.6 1 1"
43 enabled="true" follows="left|top" height="47" label="IM" left_delta="54" 43 enabled="true" follows="left|top" height="56" label="IMs" left_delta="68"
44 mouse_opaque="true" name="im" width="44" /> 44 mouse_opaque="true" name="im" width="54" />
45 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" 45 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
46 can_apply_immediately="true" color="0.8 1 1 1" 46 can_apply_immediately="true" color="0.8 1 1 1"
47 enabled="true" follows="left|top" height="47" label="System" left_delta="54" 47 enabled="true" follows="left|top"
48 mouse_opaque="true" 48 height="56" label="System" left_delta="68" mouse_opaque="true"
49 name="system" width="44" /> 49 name="system" width="54" />
50 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" 50 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
51 can_apply_immediately="true" color="0.82 0.82 0.99 1" 51 can_apply_immediately="true" color="0.82 0.82 0.99 1"
52 control_name="ScriptErrorColor" enabled="true" follows="left|top" 52 control_name="ScriptErrorColor" enabled="true" follows="left|top"
53 height="47" label="Errors" left_delta="54" mouse_opaque="true" 53 height="56" label="Errors" left_delta="68" mouse_opaque="true"
54 name="script_error" width="44" /> 54 name="script_error" width="54" />
55 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150" 55 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
56 can_apply_immediately="true" color="0.7 0.9 0.7 1" 56 can_apply_immediately="true" color="0.7 0.9 0.7 1"
57 control_name="ObjectChatColor" enabled="true" follows="left|top" 57 control_name="ObjectChatColor" enabled="true" follows="left|top"
58 height="47" label="Objects" left="148" mouse_opaque="true" 58 height="47" label="Objects" left="148" mouse_opaque="true"
59 name="objects" width="44" /> 59 name="objects" width="54" />
60 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150" 60 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
61 can_apply_immediately="true" color="0.7 0.9 0.7 1"
62 control_name="ObjectIMColor" enabled="true" follows="left|top"
63 height="56" label="Object IMs" left_delta="68" mouse_opaque="true"
64 name="object_ims" width="54" />
65 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
61 can_apply_immediately="true" color="0.7 0.9 0.7 1" 66 can_apply_immediately="true" color="0.7 0.9 0.7 1"
62 enabled="true" follows="left|top" 67 enabled="true" follows="left|top"
63 height="47" label="Owner" left_delta="54" mouse_opaque="true" name="owner" 68 height="56" label="Owner" left_delta="68" mouse_opaque="true" name="owner"
64 width="44" /> 69 width="54" />
65 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150" 70 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
66 can_apply_immediately="true" color="0 0 0 1" 71 can_apply_immediately="true" color="0 0 0 1"
67 enabled="true" follows="left|top" 72 enabled="true" follows="left|top"
68 height="47" label="Bubble" left_delta="54" mouse_opaque="true" 73 height="56" label="Bubble" left_delta="68" mouse_opaque="true"
69 name="background" width="44" /> 74 name="background" width="54" />
70 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150" 75 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
71 can_apply_immediately="true" color="0.6 0.6 1 1" 76 can_apply_immediately="true" color="0.6 0.6 1 1"
72 enabled="true" follows="left|top" height="47" 77 enabled="true" follows="left|top" height="56"
73 label="URLs" left_delta="54" mouse_opaque="true" name="links" width="44" /> 78 label="URLs" left_delta="68" mouse_opaque="true" name="links" width="54" />
74
75 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 79 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
76 bottom_delta="-28" drop_shadow_visible="true" enabled="true" follows="left|top" 80 bottom_delta="-28" drop_shadow_visible="true" enabled="true" follows="left|top"
77 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12" 81 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
@@ -121,35 +125,41 @@
121 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 125 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
122 label="Close chat bar after hitting return" left="148" mouse_opaque="true" 126 label="Close chat bar after hitting return" left="148" mouse_opaque="true"
123 name="close_chat_on_return_check" radio_style="false" width="237" /> 127 name="close_chat_on_return_check" radio_style="false" width="237" />
124 <check_box bottom_delta="-20" enabled="true" 128 <check_box bottom_delta="-18" enabled="true"
125 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 129 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
126 label="Arrow keys always move avatar when chatting" left="148" 130 label="Arrow keys always move avatar when chatting" left="148"
127 mouse_opaque="true" name="arrow_keys_move_avatar_check" radio_style="false" 131 mouse_opaque="true" name="arrow_keys_move_avatar_check" radio_style="false"
128 width="237" /> 132 width="237" />
129 <check_box bottom_delta="-20" enabled="true" 133 <check_box bottom_delta="-18" enabled="true"
130 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 134 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
131 label="Show timestamps in Local Chat" left="148" mouse_opaque="true" 135 label="Show timestamps in Local Chat" left="148" mouse_opaque="true"
132 name="show_timestamps_check" radio_style="false" width="237" /> 136 name="show_timestamps_check" radio_style="false" width="237" />
137 <check_box bottom_delta="-20" enabled="true"
133 <check_box bottom_delta="-20" control_name="ScriptErrorsAsChat" enabled="true" 138 <check_box bottom_delta="-20" control_name="ScriptErrorsAsChat" enabled="true"
134 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 139 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
135 label="Show script errors and warnings as regular chat" left="148" 140 label="Show script errors and warnings as regular chat" left="148"
136 mouse_opaque="true" name="script_errors_as_chat" radio_style="false" 141 mouse_opaque="true" name="script_errors_as_chat" radio_style="false"
137 width="275" /> 142 width="275" />
138 <check_box bottom_delta="-20" enabled="true" 143 <check_box bottom_delta="-20" enabled="true"
144 <check_box bottom_delta="-18" enabled="true"
139 follows="left|top" font="SansSerifSmall" height="16" initial_value="true" 145 follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
140 label="Play typing animation when chatting" left="148" mouse_opaque="true" 146 label="Play typing animation when chatting" left="148" mouse_opaque="true"
141 name="play_typing_animation" radio_style="false" width="237" /> 147 name="play_typing_animation" radio_style="false" width="237" />
148 <check_box bottom_delta="-18" enabled="true" follows="left|top"
149 font="SansSerifSmall" height="16" initial_value="false"
150 label="Show custom chat channel" left="148" mouse_opaque="true"
151 name="toggle_channel_control" radio_style="false" width="237" />
142 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 152 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
143 bottom="-369" drop_shadow_visible="true" enabled="true" follows="left|top" 153 bottom="-379" drop_shadow_visible="true" enabled="true" follows="left|top"
144 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12" 154 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
145 mouse_opaque="false" name="text_box7" v_pad="0" width="128"> 155 mouse_opaque="false" name="text_box7" v_pad="0" width="128">
146 Bubble Chat: 156 Bubble Chat:
147 </text> 157 </text>
148 <check_box bottom="-376" control_name="UseChatBubbles" enabled="true" follows="left|top" 158 <check_box bottom="-386" control_name="UseChatBubbles" enabled="true" follows="left|top"
149 font="SansSerifSmall" height="16" initial_value="false" 159 font="SansSerifSmall" height="16" initial_value="false"
150 label="Show chat bubbles" left="148" mouse_opaque="true" 160 label="Show chat bubbles" left="148" mouse_opaque="true"
151 name="bubble_text_chat" radio_style="false" width="237" /> 161 name="bubble_text_chat" radio_style="false" width="237" />
152 <slider bottom="-392" can_edit_text="false" control_name="ChatBubbleOpacity" 162 <slider bottom="-402" can_edit_text="false" control_name="ChatBubbleOpacity"
153 decimal_digits="3" enabled="true" follows="left|top" height="12" 163 decimal_digits="3" enabled="true" follows="left|top" height="12"
154 increment="0.05" initial_val="1" label="Opacity" left="148" max_val="1" 164 increment="0.05" initial_val="1" label="Opacity" left="148" max_val="1"
155 min_val="0" mouse_opaque="true" name="bubble_chat_opacity" show_text="true" 165 min_val="0" mouse_opaque="true" name="bubble_chat_opacity" show_text="true"
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
index 5989e7d..6b17ab3 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml
@@ -62,9 +62,13 @@
62 UI Size: 62 UI Size:
63 </text> 63 </text>
64 <slider bottom="-217" can_edit_text="true" 64 <slider bottom="-217" can_edit_text="true"
65 decimal_digits="3" enabled="true" height="16" increment="0.025" 65 decimal_digits="3" enabled="true" height="16" increment="0.001"
66 initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true" 66 initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true"
67 name="ui_scale_slider" show_text="true" value="1" width="256" /> 67 name="ui_scale_slider" show_text="true" value="1" width="220" />
68 <button bottom="-221" enabled="true" follows="left|top"
69 font="SansSerif" halign="center" height="22" label="Reset"
70 label_selected="Reset" left_delta="226" mouse_opaque="true"
71 name="reset_ui_size" scale_image="true" width="80" />
68 <check_box bottom="-236" enabled="true" follows="left|top" 72 <check_box bottom="-236" enabled="true" follows="left|top"
69 font="SansSerifSmall" height="16" initial_value="false" 73 font="SansSerifSmall" height="16" initial_value="false"
70 label="Use resolution independent scale" left="151" mouse_opaque="true" 74 label="Use resolution independent scale" left="151" mouse_opaque="true"
@@ -73,7 +77,23 @@
73 follows="left|top" height="16" increment="1" initial_val="300" 77 follows="left|top" height="16" increment="1" initial_val="300"
74 label="Away Timeout:" label_width="141" left="10" max_val="600" 78 label="Away Timeout:" label_width="141" left="10" max_val="600"
75 min_val="30" mouse_opaque="true" name="afk_timeout_spinner" width="202" /> 79 min_val="30" mouse_opaque="true" name="afk_timeout_spinner" width="202" />
76 <check_box bottom="-286" enabled="true" 80 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
81 bottom_delta="-25" drop_shadow_visible="true" enabled="true" follows="left|top"
82 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
83 mouse_opaque="true" name="UI Size:" v_pad="0" width="128">
84 Mini-map notify:
85 </text>
86 <check_box bottom_delta="0" enabled="true"
87 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
88 label="Entering chat range" left="151"
89 mouse_opaque="true" name="mini_map_notify_chat" radio_style="false"
90 width="256" />
91 <check_box bottom_delta="0" enabled="true"
92 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
93 label="Entering sim" left="330"
94 mouse_opaque="true" name="mini_map_notify_sim" radio_style="false"
95 width="256" />
96 <check_box bottom="-304" enabled="true"
77 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 97 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
78 label="Notify when Linden dollars (L$) spent or received" left="151" 98 label="Notify when Linden dollars (L$) spent or received" left="151"
79 mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false" 99 mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false"
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
index 527309e..c663ae2 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml
@@ -6,8 +6,12 @@
6 left="470" name="GraphicsPreferencesHelpButton" width="22" /> 6 left="470" name="GraphicsPreferencesHelpButton" width="22" />
7 <check_box bottom="-23" enabled="true" follows="left|top" font="SansSerifSmall" 7 <check_box bottom="-23" enabled="true" follows="left|top" font="SansSerifSmall"
8 height="16" initial_value="false" 8 height="16" initial_value="false"
9 label="Run Second Life in a window" left="10" mouse_opaque="true" 9 label="Run Imprudence in a window" left="10" mouse_opaque="true"
10 name="windowed mode" radio_style="false" width="100" /> 10 name="windowed mode" radio_style="false" width="100" />
11 <check_box bottom_delta="0" enabled="true" follows="left|top"
12 font="SansSerifSmall" height="16" initial_value="false"
13 label="Show WindLight toolbar" left="275" mouse_opaque="true"
14 name="toggle_windlight_control" radio_style="false" width="237" />
11 <text_editor type="string" length="1" allow_html="false" bg_readonly_color="0 0 0 0" bottom="-43" 15 <text_editor type="string" length="1" allow_html="false" bg_readonly_color="0 0 0 0" bottom="-43"
12 embedded_items="false" enabled="false" follows="left|top" 16 embedded_items="false" enabled="false" follows="left|top"
13 font="SansSerifSmall" height="20" hide_border="true" 17 font="SansSerifSmall" height="20" hide_border="true"
@@ -247,7 +251,7 @@
247 <slider bottom="-135" can_edit_text="false" control_name="RenderFarClip" 251 <slider bottom="-135" can_edit_text="false" control_name="RenderFarClip"
248 decimal_digits="0" enabled="true" follows="left|top" height="16" 252 decimal_digits="0" enabled="true" follows="left|top" height="16"
249 increment="8" initial_val="160" label="Draw Distance:" 253 increment="8" initial_val="160" label="Draw Distance:"
250 label_width="140" left="215" max_val="512" min_val="64" mouse_opaque="true" 254 label_width="140" left="215" max_val="512" min_val="32" mouse_opaque="true"
251 name="DrawDistance" show_text="true" width="255" /> 255 name="DrawDistance" show_text="true" width="255" />
252 <slider bottom_delta="-20" can_edit_text="false" control_name="RenderMaxPartCount" 256 <slider bottom_delta="-20" can_edit_text="false" control_name="RenderMaxPartCount"
253 decimal_digits="0" enabled="true" follows="left|top" height="16" 257 decimal_digits="0" enabled="true" follows="left|top" height="16"
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
index ee00455..9b18e11 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
@@ -49,55 +49,59 @@
49 initial_value="false" label="Show online Friend notifications" left="148" 49 initial_value="false" label="Show online Friend notifications" left="148"
50 mouse_opaque="true" name="friends_online_notify_checkbox" 50 mouse_opaque="true" name="friends_online_notify_checkbox"
51 radio_style="false" width="256" /> 51 radio_style="false" width="256" />
52 <check_box bottom_delta="-20" enabled="true"
53 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
54 label="Vertical IM tabs (requires restart)" left_delta="0" mouse_opaque="true"
55 name="vertical-imtabs-toggle" radio_style="false" width="270" />
52 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 56 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
53 bottom="-125" drop_shadow_visible="true" enabled="true" follows="left|top" 57 bottom_delta="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
54 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12" 58 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
55 mouse_opaque="false" name="text_box3" v_pad="0" width="128"> 59 mouse_opaque="false" name="text_box3" v_pad="0" width="128">
56 Busy Mode Response: 60 Busy Mode Response:
57 </text> 61 </text>
58 <text_editor type="string" length="1" bottom="-185" embedded_items="false" enabled="true" follows="left|top" 62 <text_editor type="string" length="1" bottom_delta="-60" embedded_items="false" enabled="true" follows="left|top"
59 font="SansSerifSmall" height="70" left="148" max_length="255" 63 font="SansSerifSmall" height="70" left="148" max_length="255"
60 mouse_opaque="true" name="busy_response" width="330" word_wrap="true" /> 64 mouse_opaque="true" name="busy_response" width="330" word_wrap="true" />
61 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 65 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
62 bottom="-218" drop_shadow_visible="true" enabled="true" follows="left|top" 66 bottom_delta="-33" drop_shadow_visible="true" enabled="true" follows="left|top"
63 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12" 67 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
64 mouse_opaque="false" name="text_box4" v_pad="0" width="128"> 68 mouse_opaque="false" name="text_box4" v_pad="0" width="128">
65 Logging Options: 69 Logging Options:
66 </text> 70 </text>
67 <check_box bottom="-225" enabled="true" 71 <check_box bottom_delta="-7" enabled="true"
68 follows="left|top" font="SansSerifSmall" height="16" 72 follows="left|top" font="SansSerifSmall" height="16"
69 initial_value="false" label="Save a log of IM on my computer" left="148" 73 initial_value="false" label="Save a log of IM on my computer" left="148"
70 mouse_opaque="true" name="log_instant_messages" radio_style="false" 74 mouse_opaque="true" name="log_instant_messages" radio_style="false"
71 width="237" /> 75 width="237" />
72 <check_box bottom="-245" enabled="true" 76 <check_box bottom_delta="-20" enabled="true"
73 follows="left|top" font="SansSerifSmall" height="16" 77 follows="left|top" font="SansSerifSmall" height="16"
74 initial_value="false" label="Show timestamps in IM log" left="168" 78 initial_value="false" label="Show timestamps in IM log" left="168"
75 mouse_opaque="true" name="log_instant_messages_timestamp" radio_style="false" 79 mouse_opaque="true" name="log_instant_messages_timestamp" radio_style="false"
76 width="217" /> 80 width="217" />
77 <check_box bottom="-265" enabled="true" follows="left|top" 81 <check_box bottom_delta="-20" enabled="true" follows="left|top"
78 font="SansSerifSmall" height="16" initial_value="false" 82 font="SansSerifSmall" height="16" initial_value="false"
79 label="Show the end of last IM conversation" left="168" mouse_opaque="true" 83 label="Show the end of last IM conversation" left="168" mouse_opaque="true"
80 name="log_show_history" radio_style="false" width="217" /> 84 name="log_show_history" radio_style="false" width="217" />
81 <check_box bottom="-285" enabled="true" follows="left|top" 85 <check_box bottom_delta="-20" enabled="true" follows="left|top"
82 font="SansSerifSmall" height="16" initial_value="false" label="Save a log of Local Chat on my computer" 86 font="SansSerifSmall" height="16" initial_value="false" label="Save a log of Local Chat on my computer"
83 left="148" mouse_opaque="true" name="log_chat" radio_style="false" 87 left="148" mouse_opaque="true" name="log_chat" radio_style="false"
84 width="237" /> 88 width="237" />
85 <check_box bottom="-305" enabled="true" follows="left|top" 89 <check_box bottom_delta="-20" enabled="true" follows="left|top"
86 font="SansSerifSmall" height="16" initial_value="false" 90 font="SansSerifSmall" height="16" initial_value="false"
87 label="Show timestamps in Local Chat log" left="168" mouse_opaque="true" 91 label="Show timestamps in Local Chat log" left="168" mouse_opaque="true"
88 name="log_chat_timestamp" radio_style="false" width="217" /> 92 name="log_chat_timestamp" radio_style="false" width="217" />
89 <check_box bottom="-325" enabled="true" follows="left|top" 93 <check_box bottom_delta="-20" enabled="true" follows="left|top"
90 font="SansSerifSmall" height="16" initial_value="false" 94 font="SansSerifSmall" height="16" initial_value="false"
91 label="Show incoming IM in Local Chat log" left="168" mouse_opaque="true" 95 label="Show incoming IM in Local Chat log" left="168" mouse_opaque="true"
92 name="log_chat_IM" radio_style="false" width="217" /> 96 name="log_chat_IM" radio_style="false" width="217" />
93 <check_box bottom="-345" enabled="true" follows="left|top" 97 <check_box bottom_delta="-20" enabled="true" follows="left|top"
94 font="SansSerifSmall" height="16" initial_value="false" 98 font="SansSerifSmall" height="16" initial_value="false"
95 label="Include date with timestamps" left="148" mouse_opaque="true" 99 label="Include date with timestamps" left="148" mouse_opaque="true"
96 name="log_date_timestamp" radio_style="false" width="237" /> 100 name="log_date_timestamp" radio_style="false" width="237" />
97 <button bottom="-367" follows="right|bottom" font="SansSerif" halign="center" 101 <button bottom_delta="-22" follows="right|bottom" font="SansSerif" halign="center"
98 height="20" label="Change Path" label_selected="Change Path" left="170" 102 height="20" label="Change Path" label_selected="Change Path" left="170"
99 mouse_opaque="true" name="log_path_button" width="90" /> 103 mouse_opaque="true" name="log_path_button" width="90" />
100 <line_editor border_drop_shadow_visible="false" border_visible="false" bottom="-366" 104 <line_editor border_drop_shadow_visible="false" border_visible="false" bottom_delta="1"
101 drop_shadow_visible="true" enabled="false" follows="top|left|right" 105 drop_shadow_visible="true" enabled="false" follows="top|left|right"
102 font="SansSerifSmall" halign="right" height="19" left="248" 106 font="SansSerifSmall" halign="right" height="19" left="248"
103 max_length="254" mouse_opaque="false" name="log_path_string" right="-20" /> 107 max_length="254" mouse_opaque="false" name="log_path_string" right="-20" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
index 48da432..655859a 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
@@ -8,10 +8,10 @@
8 mouse_opaque="false" name="text_box" v_pad="0" width="200"> 8 mouse_opaque="false" name="text_box" v_pad="0" width="200">
9 Maximum Bandwidth: 9 Maximum Bandwidth:
10 </text> 10 </text>
11 <slider bottom_delta="-25" can_edit_text="true" 11 <slider bottom_delta="-25" can_edit_text="true" control_name="ThrottleBandwidthKBPS"
12 decimal_digits="0" enabled="true" follows="left|top" height="15" 12 decimal_digits="0" enabled="true" follows="left|top" height="15"
13 increment="10" initial_val="50" left_delta="0" max_val="1500" min_val="50" 13 increment="10" initial_val="1000" left_delta="0" max_val="5000" min_val="50"
14 mouse_opaque="true" name="max_bandwidth" show_text="true" value="500" 14 mouse_opaque="true" name="max_bandwidth" show_text="true" value="1000"
15 width="180" /> 15 width="180" />
16 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 16 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
17 bottom_delta="4" drop_shadow_visible="true" enabled="true" 17 bottom_delta="4" drop_shadow_visible="true" enabled="true"
@@ -25,22 +25,15 @@
25 follows="left|top" font="SansSerifSmall" h_pad="0" halign="left" 25 follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
26 height="10" left="12" mouse_opaque="false" name="cache_size_label_l" 26 height="10" left="12" mouse_opaque="false" name="cache_size_label_l"
27 v_pad="0" width="200"> 27 v_pad="0" width="200">
28 Disk Cache Size: 28 Disk Cache Size (MB):
29 </text> 29 </text>
30 <slider bottom_delta="-25" can_edit_text="true" 30 <slider bottom_delta="-25" can_edit_text="true" control_name="CacheSize"
31 decimal_digits="0" enabled="true" follows="left|top" height="15" 31 decimal_digits="0" enabled="true" follows="left|top" height="15"
32 increment="10" initial_val="50" left_delta="0" max_val="1000" min_val="10" 32 increment="10" initial_val="50" left_delta="0" max_val="1000" min_val="10"
33 mouse_opaque="true" name="cache_size" show_text="true" width="180" /> 33 mouse_opaque="true" name="cache_size" show_text="true" width="180" />
34 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
35 bottom_delta="4" drop_shadow_visible="true" enabled="true"
36 follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
37 height="10" left_delta="186" mouse_opaque="false" name="text_box5"
38 v_pad="0" width="40">
39 MB
40 </text>
41 <button bottom="-55" bottom_delta="-4" enabled="true" follows="left|bottom" 34 <button bottom="-55" bottom_delta="-4" enabled="true" follows="left|bottom"
42 font="SansSerif" halign="center" height="22" label="Clear Cache" left="340" 35 font="SansSerif" halign="center" height="22" label="Clear Cache" left="340"
43 left_delta="30" mouse_opaque="true" name="clear_cache" scale_image="true" 36 left_delta="186" mouse_opaque="true" name="clear_cache" scale_image="true"
44 width="100" /> 37 width="100" />
45 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 38 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
46 bottom="-70" bottom_delta="-17" drop_shadow_visible="true" enabled="true" 39 bottom="-70" bottom_delta="-17" drop_shadow_visible="true" enabled="true"
@@ -51,7 +44,7 @@
51 </text> 44 </text>
52 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-28" 45 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-28"
53 enabled="false" follows="left|top" font="SansSerif" 46 enabled="false" follows="left|top" font="SansSerif"
54 handle_edit_keys_directly="true" height="20" left_delta="7" 47 handle_edit_keys_directly="true" height="20" left_delta="0"
55 max_length="4096" mouse_opaque="true" name="cache_location" 48 max_length="4096" mouse_opaque="true" name="cache_location"
56 select_all_on_focus_received="false" width="470" word_wrap="false" /> 49 select_all_on_focus_received="false" width="470" word_wrap="false" />
57 <button bottom_delta="-25" enabled="true" follows="left|top" font="SansSerif" 50 <button bottom_delta="-25" enabled="true" follows="left|top" font="SansSerif"
@@ -61,12 +54,12 @@
61 font="SansSerif" halign="center" height="22" label="Reset" 54 font="SansSerif" halign="center" height="22" label="Reset"
62 label_selected="Set" left_delta="103" mouse_opaque="true" 55 label_selected="Set" left_delta="103" mouse_opaque="true"
63 name="reset_cache" scale_image="true" width="100" /> 56 name="reset_cache" scale_image="true" width="100" />
64 <check_box bottom="-173" bottom_delta="-35" 57 <check_box bottom="-173" bottom_delta="-25" control_name="ConnectionPortEnabled"
65 enabled="true" follows="left|top" font="SansSerifSmall" height="16" 58 enabled="true" follows="left|top" font="SansSerifSmall" height="16"
66 initial_value="false" label="Custom Port Connection" left="12" 59 initial_value="false" label="Custom Port Connection" left="12"
67 mouse_opaque="true" name="connection_port_enabled" radio_style="false" 60 mouse_opaque="true" name="connection_port_enabled" radio_style="false"
68 width="256" /> 61 width="256" />
69 <spinner bottom="-193" bottom_delta="-20" 62 <spinner bottom="-193" bottom_delta="-20" control_name="ConnectionPort"
70 decimal_digits="0" enabled="true" follows="left|top" height="16" 63 decimal_digits="0" enabled="true" follows="left|top" height="16"
71 increment="1" initial_val="13000" label="Port Number:" label_width="75" 64 increment="1" initial_val="13000" label="Port Number:" label_width="75"
72 left_delta="20" max_val="13050" min_val="13000" mouse_opaque="true" 65 left_delta="20" max_val="13050" min_val="13000" mouse_opaque="true"
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_windlight_controls.xml b/linden/indra/newview/skins/default/xui/en-us/panel_windlight_controls.xml
new file mode 100644
index 0000000..b9c6fc3
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_windlight_controls.xml
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel bg_visible="false" border="false" border_visible="false" bottom="1"
3 enabled="true" follows="right|bottom" height="20" left="0"
4 name="windlight_controls" width="182">
5 <button bottom="-21" follows="left|bottom" font="SansSerif" halign="center" height="20"
6 label="Editor" left="4" name="Environment"
7 tool_tip="Click here to adjust world environment" width="80" />
8 <flyout_button bottom="-21" follows="left|bottom" height="20" label="Sky" left_delta="82" width="71"
9 list_position="above" mouse_opaque="true" name="Presets" tool_tip="Windlight presets">
10 </flyout_button>
11 <button bottom="-22" follows="left|bottom" font="SansSerif" halign="center" height="22" toggle="true"
12 label="" left_delta="72" name="Popup" scale_image="true" control_name="ShowWindlightSettingsPopup"
13 tool_tip="Click here to adjust draw distance" width="22" />
14</panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote.xml b/linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote.xml
new file mode 100644
index 0000000..8be72fc
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote.xml
@@ -0,0 +1,34 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel bg_visible="false" border="false" border_visible="false" bottom="0"
3 enabled="true" follows="right|bottom" height="20" left="0" mouse_opaque="true"
4 name="windlight_remote" use_bounding_rect="true" width="182">
5 <panel bottom="1" filename="panel_bg_tab.xml" name="panel_bg_tab" height="22" left="0" width="182" />
6 <panel bottom="3" filename="panel_windlight_controls.xml" name="panel_windlight_controls" height="20" left="0" width="182" />
7 <string name="atmosphere">
8 Atmosphere
9 </string>
10 <string name="lighting">
11 Lighting
12 </string>
13 <string name="clouds">
14 Clouds
15 </string>
16 <string name="advanced_water">
17 Advanced Water
18 </string>
19 <string name="sunrise">
20 Sunrise
21 </string>
22 <string name="sunset">
23 Midday
24 </string>
25 <string name="noon">
26 Noon
27 </string>
28 <string name="midnight">
29 Midnight
30 </string>
31 <string name="revert_region">
32 Revert to Region Default
33 </string>
34</panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml b/linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml
new file mode 100644
index 0000000..4cb49a3
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_windlight_remote_expanded.xml
@@ -0,0 +1,52 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel bg_visible="false" border="false" border_visible="false" bottom="0"
3 follows="right|bottom" height="67" left="0" mouse_opaque="true"
4 name="windlight_remote" use_bounding_rect="true" width="182">
5 <panel bottom="1" filename="panel_bg_tab.xml" name="panel_bg_tab" height="67" left="0" width="182" />
6 <slider bottom="-20" can_edit_text="false" control_name="RenderFarClip"
7 decimal_digits="0" enabled="true" height="18"
8 increment="8" initial_val="160" label="Draw Distance:"
9 label_width="78" left="6" max_val="512" min_val="32" mouse_opaque="true"
10 name="DrawDistance" show_text="true" width="170" />
11 <slider bottom_delta="-20" can_edit_text="false" control_name="RenderMaxPartCount"
12 decimal_digits="0" enabled="true" follows="left|top" height="18"
13 increment="256" initial_val="4096"
14 label="Max. Particles:" label_width="78" left_delta="0"
15 max_val="8192" min_val="0" mouse_opaque="true" name="MaxParticleCount"
16 show_text="true" width="176" />
17 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
18 bottom="-14" drop_shadow_visible="true" enabled="true" follows="left|top"
19 font="SansSerifSmall" h_pad="0" halign="left" height="12"
20 left="170" mouse_opaque="true" name="DrawDistanceMeterText2" v_pad="0"
21 width="8">
22 m
23 </text>
24 <panel bottom="13" filename="panel_windlight_controls.xml" left="0" width="182" />
25 <string name="atmosphere">
26 Atmosphere
27 </string>
28 <string name="lighting">
29 Lighting
30 </string>
31 <string name="clouds">
32 Clouds
33 </string>
34 <string name="advanced_water">
35 Advanced Water
36 </string>
37 <string name="sunrise">
38 Sunrise
39 </string>
40 <string name="sunset">
41 Midday
42 </string>
43 <string name="noon">
44 Noon
45 </string>
46 <string name="midnight">
47 Midnight
48 </string>
49 <string name="revert_region">
50 Revert to Region Default
51 </string>
52</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_about.xml b/linden/indra/newview/skins/default/xui/fr/floater_about.xml
index b6dd0b1..1287465 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -1,35 +1,52 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes"?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="floater_about" title="A propos de Second Life"> 2<floater name="floater_about" title="A propos de Second Life">
3 <text_editor name="credits_editor"> 3 <text_editor name="credits_editor">
4 Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl et de nombreuses autres personnes. 4 The Imprudence Viewer was rocked hard by:
5 5 Jacek Antonelli, McCabe Maxsted, and Armin Weatherwax.
6 Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu&apos;à présent) : able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar 6 http://www.imprudenceviewer.org
7 7
8 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion 8 Imprudence is so awesome thanks to contributions from many generous people:
9 APR Copyright (C) 2000-2004 The Apache Software Foundation 9
10 cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) 10 For their patches and code contributions, we thank Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Angus Boyd, Asuka Neely, Balp Allen, Carjay McGinnis, Dale Glass, Felix Duesenburg, Henri Beauchamp, Kitty Barnett, Latif Khalifa, Mana Janus, Matthew Dowd, Michelle2 Zenovka, Nicholaz Beresford, Paul Churchill, Peter Lameth, Robin Cornelius, Stephen Zenith, Thomas Shikami, Vadim Bigbear, Zi Ree, and Zwagoth Klaar.
11 expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. 11
12 FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). 12 For their WindLight presets, we thank Ana Lutetia, CodeBastard Redgrave, and Torley Linden.
13 GL Copyright (C) 1999-2004 Brian Paul. 13
14 Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. 14 Thanks also to the developers of the Green Life Emerald Viewer, Hippo Viewer, and Meerkat Viewer for viewer enhancements we have incorporated. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
15 jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) 15
16 jpeglib Copyright (C) 1991-1998, Thomas G. Lane. 16 For a complete list of who did what, read the release notes!
17 ogg/vorbis Copyright (C) 2001, Xiphophorus 17
18 OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. 18
19 SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga 19 Second Life Copyright (C) 1999-2009 Linden Research Inc.
20 SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 20
21 xmlrpc-epi Copyright (C) 2000 Epinions, Inc. 21 Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les et de nombreuses autres personnes.
22 zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler. 22
23 google-perftools Copyright (c) 2005, Google Inc. 23 Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu&apos;à présent) : able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
24 24
25 Tous droits réservés. Voir licenses.txt pour plus de détails. 25 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
26 26 APR Copyright (C) 2000-2004 The Apache Software Foundation
27 Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) 27 cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
28 28 expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
29 29 FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
30 Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant 30 GL Copyright (C) 1999-2004 Brian Paul.
31 </text_editor> 31 Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
32 <string name="you_are_at"> 32 jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
33 Votre position : [POSITION] 33 jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
34 </string> 34 ogg/vorbis Copyright (C) 2001, Xiphophorus
35</floater> 35 OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
36 SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
37 SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
38 xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
39 zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler.
40 google-perftools Copyright (c) 2005, Google Inc.
41
42 Tous droits réservés. Voir licenses.txt pour plus de détails.
43
44 Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
45
46
47 Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant
48 </text_editor>
49 <string name="you_are_at">
50 Votre position : [POSITION]
51 </string>
52</floater>
diff --git a/linden/indra/newview/skins/default/xui/ja/floater_about.xml b/linden/indra/newview/skins/default/xui/ja/floater_about.xml
index 9306a6c..ce318a5 100644
--- a/linden/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -1,7 +1,24 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="floater_about" title="Second Lifeã«ã¤ã„ã¦"> 2<floater name="floater_about" title="Second Lifeã«ã¤ã„ã¦">
3 <text_editor name="credits_editor"> 3 <text_editor name="credits_editor">
4 Second Lifeã¯ã€ Philipã€Tessaã€Andrewã€Coryã€Jamesã€Benã€Charã€Charlieã€Colinã€Danã€Danielã€Dougã€Ericã€Hamletã€Haneyã€Eveã€Hunterã€Ianã€Jeffã€Jenniferã€Jimã€Johnã€Leeã€Markã€Peterã€Phoenixã€Richardã€Robinã€Xenonã€Steveã€Tanyaã€Eddieã€Aviã€Frankã€Bruceã€Aaronã€Aliceã€Bobã€Debraã€Eileenã€Helenã€Janetã€Louieã€Leviathaniaã€Stefanã€Rayã€Kevinã€Tomã€Mikebã€MikeTã€Burgessã€Elenaã€Tracyã€Billã€Toddã€Ryanã€Zachã€Sarahã€Novaã€Timã€Stephanieã€Michaelã€Evanã€Nicolasã€Catherineã€Rachelleã€Daveã€Hollyã€Bubã€Kellyã€Magellanã€Ramziã€Donã€Sabinã€Jillã€Rheyaã€Jeskaã€Torleyã€Konaã€Callumã€Charityã€Ventrellaã€Jackã€Vektorã€Irisã€Chrisã€Nicoleã€Mickã€Reubenã€Blueã€Babbageã€Yedwabã€Deanaã€Laurenã€Brentã€Pathfinderã€Chadrickã€Altruimaã€Jesseã€Teenyã€Monroeã€Icculusã€Davidã€Tessã€Lizzieã€Patsyã€Isaacã€Lawrenceã€Cynã€Boã€Giaã€Annetteã€Mariusã€Tboneã€Jonathanã€Karenã€Ginsuã€Satokoã€Yukoã€Makikoã€Thomasã€Harryã€Sethã€Alexeiã€Brianã€Guyã€Runitaiã€Ethanã€Dataã€Corneliusã€Kennyã€Swissã€Zeroã€Natriaã€Wendyã€Stephenã€Teepleã€Thumperã€Lucyã€Deeã€Miaã€Lianaã€Warrenã€Brankaã€Auraã€beezã€Miloã€Hermiaã€Redã€Thraxã€Joeã€Sallyã€Magentaã€Moguraã€Paulã€Joseã€Rejeanã€Henrikã€Lexieã€Amberã€Loganã€Xanã€Noraã€Morpheusã€Donovanã€Leylaã€MichaelFrancisã€Beastã€Cubeã€Buckyã€Joshuaã€Stryfeã€Harmonyã€Teresaã€Claudiaã€Walkerã€Glennã€Fritzã€Fordakã€Juneã€Cleopetraã€Jeanã€Ivyã€Betsyã€Rooseveltã€Spikeã€Kenã€Whichã€Tofuã€Chiyoã€Robã€Zeeã€dustinã€Georgeã€Delã€Matthewã€Catã€Jacquiã€Lightfootã€Adrianã€Violaã€Alfredã€Noelã€Irfanã€Sunilã€Yoolã€Rikaã€Janeã€Xtremeã€Frontierã€a2ã€Neoã€Siobhanã€Yozã€Justinã€Elleã€Qarlã€Benjaminã€Isabelã€Gulliverã€Everettã€Christopherã€Izzyã€Stephanyã€Garryã€Sejongã€Seanã€Tobinã€Iridiumã€Metaã€Anthonyã€Jeremyã€JPã€Jakeã€Mauriceã€Madhaviã€Leopardã€Kyleã€Joonã€Kariã€Bertã€Belindaã€Jonã€Kristiã€Bridieã€Pramodã€KJã€Socratesã€Mariaã€Ivanã€Aricã€Yamasakiã€Adreanneã€Jayã€MitchKã€Cerenã€Cocoã€Durlã€Jennyã€Periapseã€Karticã€Storrsã€Lotteã€Sandyã€Rohnã€Colossusã€Zenã€BigPapiã€Bradã€Pastramiã€Kurzã€Maniã€Neuroã€Jaimeã€MJã€Rowanã€Sgtã€Elvisã€Geckoã€Samuelã€Sardonyxã€Leoã€Bryanã€Nikoã€Softã€Poppyã€Rachelã€Akiã€Angeloã€Banzaiã€Alexaã€Sueã€CeeLoã€Benderã€CGã€Gillianã€Pelleã€Nickã€Echoã€Zaraã€Christineã€Shamiranã€Emmaã€Blakeã€Keikoã€Plexusã€Joppaã€Sidewinderã€Ericaã€Ashleiã€Twilightã€Kristenã€Brettã€Qã€Enusã€Simonã€Bevisã€Kraftã€Kipã€Chandlerã€Ronã€LauraPã€Ramã€KyleJMã€Scouseã€Prosperoã€Melissaã€Martyã€Natã€Hamiltonã€Kendã€Lordanã€Jimmyã€Kosmoã€Seraphã€Greenã€Ekimã€Wiggoã€JTã€Romeã€Dorisã€Mizã€Benocã€Whumpã€Trinityã€Patchã€Kateã€TJã€Baoã€Joohwanã€Christyã€Sofiaã€Matiasã€Cogsworthã€Johanã€Orehã€Cheahã€Angelaã€Brandyã€Mangoã€Lanã€Aleksã€Gloriaã€Heidyã€Mitchellã€Spaceã€Coltonã€Bambersã€Einsteinã€Maggieã€Malbersã€Roseã€Winnieã€Stellaã€Miltonã€Rothmanã€Niallã€Marinã€Allisonã€Katieã€Dawnã€Kattã€Dustyã€Kalpanaã€Judyã€Andreaã€Ambroffã€Infinityã€Gailã€Ricoã€Raymondã€Yiã€Williamã€Christaã€Mã€Teaganã€Scoutã€Mollyã€Danteã€Corrã€Dynamikeã€Usiã€Kayleeã€Vidtutsã€Lilã€Danicaã€Saschaã€Kelvã€Jacobã€Nyaã€Rodneyã€Brandonã€Elsieã€Blondinã€Grantã€Katrinã€Nyxã€Gabrielã€Locklainnã€Claireã€Devinã€Minervaã€Montyã€Austinã€Bradfordã€Siã€Keiraã€Hã€Caitlinã€Ditaã€Makaiã€Jennã€Annã€Meredithã€Clareã€Joyã€Praveenã€Codyã€Edmundã€Rutheã€Sirenaã€Gayathriã€Spiderã€FJã€Davidoffã€Tianã€Jennieã€Louiseã€Oskarã€Landonã€Noelleã€Jarvã€Ingridã€Alã€Sommerã€Docã€Ariaã€Huinã€Grayã€Liliã€Virã€DJã€Yangã€Tã€Simoneã€Maestroã€Scottã€Charleneã€Quixoteã€Amandaã€Susanã€Zedã€Anneã€Enkiduã€Esbeeã€Joroanã€Katelinã€Roxieã€Tayã€Scarletã€Kevinã€Johnnyã€Wolfgangã€Andrenã€Bobã€Howardã€Merovã€Randã€Rayã€Michonã€Newellã€Galenã€Dessieã€Lesã€Michonã€Jenelleã€Geoã€Sizã€Shapiroã€Peteã€Calyleã€Seleneã€Allenã€Phoebeã€Goldinã€Kimmoraã€Dakotaã€Slatonã€Lindquistã€Zoeyã€Hariã€Othelloã€Rohitã€Sheldonã€Petraã€Vialeã€Gordonã€Kayeã€Pinkã€Fernyã€Emersonã€Davyã€Briã€Chanã€Juanã€Robertã€Terrenceã€Nathanã€Carlã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚ 4 The Imprudence Viewer was rocked hard by:
5 Jacek Antonelli, McCabe Maxsted, and Armin Weatherwax.
6 http://www.imprudenceviewer.org
7
8 Imprudence is so awesome thanks to contributions from many generous people:
9
10 For their patches and code contributions, we thank Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Angus Boyd, Asuka Neely, Balp Allen, Carjay McGinnis, Dale Glass, Felix Duesenburg, Henri Beauchamp, Kitty Barnett, Latif Khalifa, Mana Janus, Matthew Dowd, Michelle2 Zenovka, Nicholaz Beresford, Paul Churchill, Peter Lameth, Robin Cornelius, Stephen Zenith, Thomas Shikami, Vadim Bigbear, Zi Ree, and Zwagoth Klaar.
11
12 For their WindLight presets, we thank Ana Lutetia, CodeBastard Redgrave, and Torley Linden.
13
14 Thanks also to the developers of the Green Life Emerald Viewer, Hippo Viewer, and Meerkat Viewer for viewer enhancements we have incorporated. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
15
16 For a complete list of who did what, read the release notes!
17
18
19 Second Life Copyright (C) 1999-2009 Linden Research Inc.
20
21 Second Lifeã¯ã€ Philipã€Tessaã€Andrewã€Coryã€Jamesã€Benã€Charã€Charlieã€Colinã€Danã€Danielã€Dougã€Ericã€Hamletã€Haneyã€Eveã€Hunterã€Ianã€Jeffã€Jenniferã€Jimã€Johnã€Leeã€Markã€Peterã€Phoenixã€Richardã€Robinã€Xenonã€Steveã€Tanyaã€Eddieã€Aviã€Frankã€Bruceã€Aaronã€Aliceã€Bobã€Debraã€Eileenã€Helenã€Janetã€Louieã€Leviathaniaã€Stefanã€Rayã€Kevinã€Tomã€Mikebã€MikeTã€Burgessã€Elenaã€Tracyã€Billã€Toddã€Ryanã€Zachã€Sarahã€Novaã€Timã€Stephanieã€Michaelã€Evanã€Nicolasã€Catherineã€Rachelleã€Daveã€Hollyã€Bubã€Kellyã€Magellanã€Ramziã€Donã€Sabinã€Jillã€Rheyaã€Jeskaã€Torleyã€Konaã€Callumã€Charityã€Ventrellaã€Jackã€Vektorã€Irisã€Chrisã€Nicoleã€Mickã€Reubenã€Blueã€Babbageã€Yedwabã€Deanaã€Laurenã€Brentã€Pathfinderã€Chadrickã€Altruimaã€Jesseã€Teenyã€Monroeã€Icculusã€Davidã€Tessã€Lizzieã€Patsyã€Isaacã€Lawrenceã€Cynã€Boã€Giaã€Annetteã€Mariusã€Tboneã€Jonathanã€Karenã€Ginsuã€Satokoã€Yukoã€Makikoã€Thomasã€Harryã€Sethã€Alexeiã€Brianã€Guyã€Runitaiã€Ethanã€Dataã€Corneliusã€Kennyã€Swissã€Zeroã€Natriaã€Wendyã€Stephenã€Teepleã€Thumperã€Lucyã€Deeã€Miaã€Lianaã€Warrenã€Brankaã€Auraã€beezã€Miloã€Hermiaã€Redã€Thraxã€Joeã€Sallyã€Magentaã€Moguraã€Paulã€Joseã€Rejeanã€Henrikã€Lexieã€Amberã€Loganã€Xanã€Noraã€Morpheusã€Donovanã€Leylaã€MichaelFrancisã€Beastã€Cubeã€Buckyã€Joshuaã€Stryfeã€Harmonyã€Teresaã€Claudiaã€Walkerã€Glennã€Fritzã€Fordakã€Juneã€Cleopetraã€Jeanã€Ivyã€Betsyã€Rooseveltã€Spikeã€Kenã€Whichã€Tofuã€Chiyoã€Robã€Zeeã€dustinã€Georgeã€Delã€Matthewã€Catã€Jacquiã€Lightfootã€Adrianã€Violaã€Alfredã€Noelã€Irfanã€Sunilã€Yoolã€Rikaã€Janeã€Xtremeã€Frontierã€a2ã€Neoã€Siobhanã€Yozã€Justinã€Elleã€Qarlã€Benjaminã€Isabelã€Gulliverã€Everettã€Christopherã€Izzyã€Stephanyã€Garryã€Sejongã€Seanã€Tobinã€Iridiumã€Metaã€Anthonyã€Jeremyã€JPã€Jakeã€Mauriceã€Madhaviã€Leopardã€Kyleã€Joonã€Kariã€Bertã€Belindaã€Jonã€Kristiã€Bridieã€Pramodã€KJã€Socratesã€Mariaã€Ivanã€Aricã€Yamasakiã€Adreanneã€Jayã€MitchKã€Cerenã€Cocoã€Durlã€Jennyã€Periapseã€Karticã€Storrsã€Lotteã€Sandyã€Rohnã€Colossusã€Zenã€BigPapiã€Bradã€Pastramiã€Kurzã€Maniã€Neuroã€Jaimeã€MJã€Rowanã€Sgtã€Elvisã€Geckoã€Samuelã€Sardonyxã€Leoã€Bryanã€Nikoã€Softã€Poppyã€Rachelã€Akiã€Angeloã€Banzaiã€Alexaã€Sueã€CeeLoã€Benderã€CGã€Gillianã€Pelleã€Nickã€Echoã€Zaraã€Christineã€Shamiranã€Emmaã€Blakeã€Keikoã€Plexusã€Joppaã€Sidewinderã€Ericaã€Ashleiã€Twilightã€Kristenã€Brettã€Qã€Enusã€Simonã€Bevisã€Kraftã€Kipã€Chandlerã€Ronã€LauraPã€Ramã€KyleJMã€Scouseã€Prosperoã€Melissaã€Martyã€Natã€Hamiltonã€Kendã€Lordanã€Jimmyã€Kosmoã€Seraphã€Greenã€Ekimã€Wiggoã€JTã€Romeã€Dorisã€Mizã€Benocã€Whumpã€Trinityã€Patchã€Kateã€TJã€Baoã€Joohwanã€Christyã€Sofiaã€Matiasã€Cogsworthã€Johanã€Orehã€Cheahã€Angelaã€Brandyã€Mangoã€Lanã€Aleksã€Gloriaã€Heidyã€Mitchellã€Spaceã€Coltonã€Bambersã€Einsteinã€Maggieã€Malbersã€Roseã€Winnieã€Stellaã€Miltonã€Rothmanã€Niallã€Marinã€Allisonã€Katieã€Dawnã€Kattã€Dustyã€Kalpanaã€Judyã€Andreaã€Ambroffã€Infinityã€Gailã€Ricoã€Raymondã€Yiã€Williamã€Christaã€Mã€Teaganã€Scoutã€Mollyã€Danteã€Corrã€Dynamikeã€Usiã€Kayleeã€Vidtutsã€Lilã€Danicaã€Saschaã€Kelvã€Jacobã€Nyaã€Rodneyã€Brandonã€Elsieã€Blondinã€Grantã€Katrinã€Nyxã€Gabrielã€Locklainnã€Claireã€Devinã€Minervaã€Montyã€Austinã€Bradfordã€Siã€Keiraã€Hã€Caitlinã€Ditaã€Makaiã€Jennã€Annã€Meredithã€Clareã€Joyã€Praveenã€Codyã€Edmundã€Rutheã€Sirenaã€Gayathriã€Spiderã€FJã€Davidoffã€Tianã€Jennieã€Louiseã€Oskarã€Landonã€Noelleã€Jarvã€Ingridã€Alã€Sommerã€Docã€Ariaã€Huinã€Grayã€Liliã€Virã€DJã€Yangã€Tã€Simoneã€Maestroã€Scottã€Charleneã€Quixoteã€Amandaã€Susanã€Zedã€Anneã€Enkiduã€Esbeeã€Joroanã€Katelinã€Roxieã€Tayã€Scarletã€Kevinã€Johnnyã€Wolfgangã€Andrenã€Bobã€Howardã€Merovã€Randã€Rayã€Michonã€Newellã€Galenã€Dessieã€Lesã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚
5 22
6 ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ã“れã¾ã§ã§æœ€é«˜ã®ã‚‚ã®ã«ãªã‚‹ã‚ˆã†ã”å”力をã„ãŸã ã„ãŸä»¥ä¸‹ã®ä½äººã®çš†æ§˜ã«æ·±ã感è¬ã„ãŸã—ã¾ã™ã€‚ able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar 23 ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ã“れã¾ã§ã§æœ€é«˜ã®ã‚‚ã®ã«ãªã‚‹ã‚ˆã†ã”å”力をã„ãŸã ã„ãŸä»¥ä¸‹ã®ä½äººã®çš†æ§˜ã«æ·±ã感è¬ã„ãŸã—ã¾ã™ã€‚ able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
7 24
diff --git a/linden/indra/newview/skins/default/xui/ja/floater_choose_group.xml b/linden/indra/newview/skins/default/xui/ja/floater_choose_group.xml
index 08c91f1..0e3153c 100644
--- a/linden/indra/newview/skins/default/xui/ja/floater_choose_group.xml
+++ b/linden/indra/newview/skins/default/xui/ja/floater_choose_group.xml
@@ -5,4 +5,7 @@
5 </text> 5 </text>
6 <button label="OK" label_selected="OK" name="OK" /> 6 <button label="OK" label_selected="OK" name="OK" />
7 <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" /> 7 <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
8 <string name="none">
9 グループãªã—
10 </string>
8</floater> 11</floater>
diff --git a/linden/indra/newview/skins/default/xui/ja/panel_groups.xml b/linden/indra/newview/skins/default/xui/ja/panel_groups.xml
index 785fd86..adfdcd4 100644
--- a/linden/indra/newview/skins/default/xui/ja/panel_groups.xml
+++ b/linden/indra/newview/skins/default/xui/ja/panel_groups.xml
@@ -13,4 +13,7 @@
13 <button label="抜ã‘ã‚‹" name="Leave" /> 13 <button label="抜ã‘ã‚‹" name="Leave" />
14 <button label="作æˆ..." name="Create" /> 14 <button label="作æˆ..." name="Create" />
15 <button label="検索..." name="Search..." /> 15 <button label="検索..." name="Search..." />
16 <string name="none">
17 グループãªã—
18 </string>
16</panel> 19</panel>
diff --git a/linden/indra/newview/skins/default/xui/ko/floater_about.xml b/linden/indra/newview/skins/default/xui/ko/floater_about.xml
index 8d532b7..075e8ea 100644
--- a/linden/indra/newview/skins/default/xui/ko/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/ko/floater_about.xml
@@ -1,7 +1,24 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="floater_about" title="세컨드ë¼ì´í”„ ì •ë³´"> 2<floater name="floater_about" title="세컨드ë¼ì´í”„ ì •ë³´">
3 <text_editor name="credits_editor"> 3 <text_editor name="credits_editor">
4 세컨드ë¼ì´í”„ 제작ìžë“¤: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, ê·¸ ì™¸ì— ë§Žì€ ë¶„ë“¤ì´ ìˆ˜ê³ í•´ 주셨습니다. 4 The Imprudence Viewer was rocked hard by:
5 Jacek Antonelli, McCabe Maxsted, and Armin Weatherwax.
6 http://www.imprudenceviewer.org
7
8 Imprudence is so awesome thanks to contributions from many generous people:
9
10 For their patches and code contributions, we thank Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Angus Boyd, Asuka Neely, Balp Allen, Carjay McGinnis, Dale Glass, Felix Duesenburg, Henri Beauchamp, Kitty Barnett, Latif Khalifa, Mana Janus, Matthew Dowd, Michelle2 Zenovka, Nicholaz Beresford, Paul Churchill, Peter Lameth, Robin Cornelius, Stephen Zenith, Thomas Shikami, Vadim Bigbear, Zi Ree, and Zwagoth Klaar.
11
12 For their WindLight presets, we thank Ana Lutetia, CodeBastard Redgrave, and Torley Linden.
13
14 Thanks also to the developers of the Green Life Emerald Viewer, Hippo Viewer, and Meerkat Viewer for viewer enhancements we have incorporated. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
15
16 For a complete list of who did what, read the release notes!
17
18
19 Second Life Copyright (C) 1999-2009 Linden Research Inc.
20
21 세컨드ë¼ì´í”„ 제작ìžë“¤: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, ê·¸ ì™¸ì— ë§Žì€ ë¶„ë“¤ì´ ìˆ˜ê³ í•´ 주셨습니다.
5 22
6 현재 ë²„ì „ì´ ìµœìƒì˜ ë²„ì „ì´ ë  ìˆ˜ 있ë„ë¡ ë„와주신 여러분께 ê°ì‚¬ë“œë¦½ë‹ˆë‹¤: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar 23 현재 ë²„ì „ì´ ìµœìƒì˜ ë²„ì „ì´ ë  ìˆ˜ 있ë„ë¡ ë„와주신 여러분께 ê°ì‚¬ë“œë¦½ë‹ˆë‹¤: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
7 24
diff --git a/linden/indra/newview/skins/default/xui/ko/floater_choose_group.xml b/linden/indra/newview/skins/default/xui/ko/floater_choose_group.xml
index 2cb821a..53bb889 100644
--- a/linden/indra/newview/skins/default/xui/ko/floater_choose_group.xml
+++ b/linden/indra/newview/skins/default/xui/ko/floater_choose_group.xml
@@ -5,4 +5,7 @@
5 </text> 5 </text>
6 <button label="확ì¸" label_selected="확ì¸" name="OK" /> 6 <button label="확ì¸" label_selected="확ì¸" name="OK" />
7 <button label="취소" label_selected="취소" name="Cancel" /> 7 <button label="취소" label_selected="취소" name="Cancel" />
8 <string name="none">
9 그룹 ì—†ìŒ
10 </string>
8</floater> 11</floater>
diff --git a/linden/indra/newview/skins/default/xui/ko/panel_groups.xml b/linden/indra/newview/skins/default/xui/ko/panel_groups.xml
index cdd28a6..8e66006 100644
--- a/linden/indra/newview/skins/default/xui/ko/panel_groups.xml
+++ b/linden/indra/newview/skins/default/xui/ko/panel_groups.xml
@@ -13,4 +13,7 @@
13 <button label="탈퇴" name="Leave" width="90"/> 13 <button label="탈퇴" name="Leave" width="90"/>
14 <button label="만들기" name="Create" width="90"/> 14 <button label="만들기" name="Create" width="90"/>
15 <button label="검색" name="Search..." width="90"/> 15 <button label="검색" name="Search..." width="90"/>
16 <string name="none">
17 그룹 ì—†ìŒ
18 </string>
16</panel> 19</panel>
diff --git a/linden/indra/newview/skins/default/xui/zh/floater_about.xml b/linden/indra/newview/skins/default/xui/zh/floater_about.xml
index 334e7eb..fbcb953 100644
--- a/linden/indra/newview/skins/default/xui/zh/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/zh/floater_about.xml
@@ -1,7 +1,24 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="floater_about" title="关于第二人生"> 2<floater name="floater_about" title="关于第二人生">
3 <text_editor name="credits_editor"> 3 <text_editor name="credits_editor">
4 第二人生的推出应感谢以下人物的贡献: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl ä»¥åŠæ›´å¤šäººã€‚ 4 The Imprudence Viewer was rocked hard by:
5 Jacek Antonelli, McCabe Maxsted, and Armin Weatherwax.
6 http://www.imprudenceviewer.org
7
8 Imprudence is so awesome thanks to contributions from many generous people:
9
10 For their patches and code contributions, we thank Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Angus Boyd, Asuka Neely, Balp Allen, Carjay McGinnis, Dale Glass, Felix Duesenburg, Henri Beauchamp, Kitty Barnett, Latif Khalifa, Mana Janus, Matthew Dowd, Michelle2 Zenovka, Nicholaz Beresford, Paul Churchill, Peter Lameth, Robin Cornelius, Stephen Zenith, Thomas Shikami, Vadim Bigbear, Zi Ree, and Zwagoth Klaar.
11
12 For their WindLight presets, we thank Ana Lutetia, CodeBastard Redgrave, and Torley Linden.
13
14 Thanks also to the developers of the Green Life Emerald Viewer, Hippo Viewer, and Meerkat Viewer for viewer enhancements we have incorporated. Special thanks to the folks at Linden Lab for releasing the viewer source, without which this endeavor would have been impossible.
15
16 For a complete list of who did what, read the release notes!
17
18
19 Second Life Copyright (C) 1999-2009 Linden Research Inc.
20
21 第二人生的推出应感谢以下人物的贡献: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les ä»¥åŠæ›´å¤šäººã€‚
5 22
6感谢以下居民,他们的帮助ä¿è¯äº†è¿™æ¬¡ç¬¬äºŒäººç”Ÿçš„版本是有å²ä»¥æ¥æœ€å‡ºè‰²çš„: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar 23感谢以下居民,他们的帮助ä¿è¯äº†è¿™æ¬¡ç¬¬äºŒäººç”Ÿçš„版本是有å²ä»¥æ¥æœ€å‡ºè‰²çš„: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
7 24
diff --git a/linden/indra/newview/skins/silver/colors_base.xml b/linden/indra/newview/skins/silver/colors_base.xml
index a69f43f..f9bf283 100644
--- a/linden/indra/newview/skins/silver/colors_base.xml
+++ b/linden/indra/newview/skins/silver/colors_base.xml
@@ -68,7 +68,8 @@
68<TextEmbeddedItemReadOnlyColor value="58, 147, 242, 255" /> <!-- Text of read-only items embedded in notecards --> 68<TextEmbeddedItemReadOnlyColor value="58, 147, 242, 255" /> <!-- Text of read-only items embedded in notecards -->
69<TextEmbeddedItemColor value="0, 0, 128, 255" /> <!-- Text of items embedded in notecards --> 69<TextEmbeddedItemColor value="0, 0, 128, 255" /> <!-- Text of items embedded in notecards -->
70<TextDefaultColor value="0, 20, 0, 255"/> <!-- Non-keyword text in the script editor --> 70<TextDefaultColor value="0, 20, 0, 255"/> <!-- Non-keyword text in the script editor -->
71<ScriptBgReadOnlyColor value="180, 180, 180, 255" /> <!-- Not used --> 71<TextLinkColor value="0, 20, 255, 255"/>
72<TextLinkHoverColor value="0, 50, 255, 255"/>
72 73
73<!-- LISTBOXES --> 74<!-- LISTBOXES -->
74<ScrollBgReadOnlyColor value="255, 255, 255, 140" /> <!-- Background of read only lists --> 75<ScrollBgReadOnlyColor value="255, 255, 255, 140" /> <!-- Background of read only lists -->
@@ -81,7 +82,8 @@
81<ScrollHighlightedColor value="145, 180, 220, 128" /> <!-- Hover color --> 82<ScrollHighlightedColor value="145, 180, 220, 128" /> <!-- Hover color -->
82<ScrollbarThumbColor value="120, 160, 200, 255" /> <!-- Scroll bar --> 83<ScrollbarThumbColor value="120, 160, 200, 255" /> <!-- Scroll bar -->
83<ScrollbarTrackColor value="183, 202, 220, 255" /> <!-- Scroll bar background --> 84<ScrollbarTrackColor value="183, 202, 220, 255" /> <!-- Scroll bar background -->
84 85<ScrollReadOnlyColor value="180, 180, 180, 255" /> <!-- Color for inactive but not disabled lists -->
86
85<!-- MENUS --> 87<!-- MENUS -->
86<MenuBarBgColor value="185, 200, 220, 230" /> <!-- Menu bar background --> 88<MenuBarBgColor value="185, 200, 220, 230" /> <!-- Menu bar background -->
87<MenuBarGodBgColor value="100, 200, 130, 230" /> <!-- Menu bar background with God Mode enabled --> 89<MenuBarGodBgColor value="100, 200, 130, 230" /> <!-- Menu bar background with God Mode enabled -->
@@ -160,6 +162,9 @@
160<MapAvatar value="0, 255, 0, 255" /> <!-- Your avatar's glyph color --> 162<MapAvatar value="0, 255, 0, 255" /> <!-- Your avatar's glyph color -->
161<MapFriend value="255, 255, 0, 255" /> <!-- Your friends' glyph color --> 163<MapFriend value="255, 255, 0, 255" /> <!-- Your friends' glyph color -->
162<MapMuted value="128, 128, 128, 255" /> <!-- Muted avatars' glyph color --> 164<MapMuted value="128, 128, 128, 255" /> <!-- Muted avatars' glyph color -->
165<MapSelected value="255, 0, 0, 255" /> <!-- Selected avatars' glyph color -->
166<MapImpDev value="90, 45, 101, 255" /> <!-- Imprudence developers glyph color -->
167<MapPartner value="214, 40, 107, 255" /> <!-- (unused) Your avatar's partner's glyph color -->
163 168
164<!-- MINI-MAP --> 169<!-- MINI-MAP -->
165<NetMapBackgroundColor value="0, 0, 0, 77" /> <!-- Mini-map floater background --> 170<NetMapBackgroundColor value="0, 0, 0, 77" /> <!-- Mini-map floater background -->
diff --git a/linden/indra/newview/skins/silver/textures/arrow_left.tga b/linden/indra/newview/skins/silver/textures/arrow_left.tga
new file mode 100644
index 0000000..43fbf12
--- /dev/null
+++ b/linden/indra/newview/skins/silver/textures/arrow_left.tga
Binary files differ
diff --git a/linden/indra/newview/skins/silver/textures/arrow_right.tga b/linden/indra/newview/skins/silver/textures/arrow_right.tga
new file mode 100644
index 0000000..a92ac9c
--- /dev/null
+++ b/linden/indra/newview/skins/silver/textures/arrow_right.tga
Binary files differ
diff --git a/linden/indra/newview/skins/silver/xui/en-us/floater_chatterbox.xml b/linden/indra/newview/skins/silver/xui/en-us/floater_chatterbox.xml
deleted file mode 100644
index 025a616..0000000
--- a/linden/indra/newview/skins/silver/xui/en-us/floater_chatterbox.xml
+++ /dev/null
@@ -1,12 +0,0 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<multi_floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="true"
3 height="390" name="floater_chatterbox"
4 rect_control="ChatterboxRect" title="Communicate" width="392">
5<icon enabled="false" image_name="tabarea.tga"
6 bg_alpha_color="blue" color="DefaultShadowLight" border="false"
7 bottom="-389" follows="left|right|bottom" height="17" left="1" scale_image="true"
8 mouse_opaque="false" name="chatterbox_tab_container" width="391"></icon>
9 <tab_container bottom="2" follows="left|right|top|bottom" height="370" left="0"
10 name="chatterbox_tabs" tab_position="bottom" tab_width="80" width="395" />
11</multi_floater>
12
diff --git a/linden/indra/newview/skins/silver/xui/en-us/floater_script_ed_panel.xml b/linden/indra/newview/skins/silver/xui/en-us/floater_script_ed_panel.xml
deleted file mode 100644
index 12ae6dc..0000000
--- a/linden/indra/newview/skins/silver/xui/en-us/floater_script_ed_panel.xml
+++ /dev/null
@@ -1,86 +0,0 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel bottom="-550" enabled="true" follows="left|top|right|bottom" height="508"
3 left="0" mouse_opaque="true" name="script panel" width="500">
4 <text_editor type="string" length="1" bottom="-393"
5 embedded_items="false" enabled="true" follows="left|top|right|bottom"
6 font="Monospace" height="376" ignore_tab="false" left="4"
7 max_length="65536" mouse_opaque="true" name="Script Editor" width="492"
8 word_wrap="true" show_line_numbers="true">
9 Loading...
10 </text_editor>
11 <button bottom="-499" enabled="true" follows="right|bottom" font="SansSerif"
12 halign="center" height="20" label="Save" label_selected="Save" left="360"
13 mouse_opaque="true" name="Save_btn" width="128" />
14 <scroll_list background_visible="true" bottom="-457" column_padding="5" draw_border="true"
15 draw_heading="false" draw_stripes="true" enabled="true"
16 follows="left|right|bottom" height="60" left="4" mouse_opaque="true"
17 multi_select="false" name="lsl errors" width="492" />
18 <combo_box allow_text_entry="false" bottom="-499" enabled="true" follows="left|bottom"
19 height="20" label="Insert..." left="12" max_chars="20" mouse_opaque="true"
20 name="Insert..." width="128" />
21 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
22 bottom="-473" drop_shadow_visible="true" enabled="true"
23 follows="left|bottom" font="SansSerifSmall" h_pad="0" halign="left"
24 height="12" left="12" mouse_opaque="true" name="line_col" v_pad="0"
25 width="128" />
26 <menu_bar bottom="-15" drop_shadow="false" enabled="true" follows="left|top|right"
27 height="18" left="8" mouse_opaque="false" name="script_menu" opaque="false"
28 tear_off="false" width="476">
29 <menu bottom="0" drop_shadow="true" enabled="true" height="62"
30 left="0" mouse_opaque="false" name="File" opaque="true" tear_off="false"
31 width="138">
32 <menu_item_call bottom_delta="-30" height="20" label="Save" left="0" mouse_opaque="true"
33 name="Save" width="138" />
34 <menu_item_separator bottom_delta="-38" height="8" left="0" mouse_opaque="true" name="separator"
35 width="138" />
36 <menu_item_call bottom_delta="-58" height="20" label="Revert All Changes" left="0"
37 mouse_opaque="true" name="Revert All Changes" width="138" />
38 </menu>
39 <menu bottom="665" drop_shadow="true" enabled="true" height="198"
40 left="222" mouse_opaque="false" name="Edit" opaque="true" tear_off="false"
41 width="139">
42 <menu_item_call bottom_delta="-30" enabled="false" height="20" label="Undo" left="0"
43 mouse_opaque="true" name="Undo" width="139" />
44 <menu_item_call bottom_delta="-50" enabled="false" height="20" label="Redo" left="0"
45 mouse_opaque="true" name="Redo" width="139" />
46 <menu_item_separator bottom_delta="-58" enabled="true" height="8" label="-----------" left="0"
47 mouse_opaque="true" name="separator" width="139" />
48 <menu_item_call bottom_delta="-78" enabled="false" height="20" label="Cut" left="0"
49 mouse_opaque="true" name="Cut" width="139" />
50 <menu_item_call bottom_delta="-98" enabled="false" height="20" label="Copy" left="0"
51 mouse_opaque="true" name="Copy" width="139" />
52 <menu_item_call bottom_delta="-118" enabled="false" height="20" label="Paste" left="0"
53 mouse_opaque="true" name="Paste" width="139" />
54 <menu_item_separator bottom_delta="-126" enabled="true" height="8" label="-----------" left="0"
55 mouse_opaque="true" name="separator2" width="139" />
56 <menu_item_call bottom_delta="-146" enabled="true" height="20" label="Select All" left="0"
57 mouse_opaque="true" name="Select All" width="139" />
58 <menu_item_call bottom_delta="-166" enabled="false" height="20" label="Deselect" left="0"
59 mouse_opaque="true" name="Deselect" width="139" />
60 <menu_item_separator bottom_delta="-174" enabled="true" height="8" label="-----------" left="0"
61 mouse_opaque="true" name="separator3" width="139" />
62 <menu_item_call bottom_delta="-194" enabled="true" height="20" label="Search / Replace..."
63 left="0" mouse_opaque="true" name="Search / Replace..." width="139" />
64 </menu>
65 <menu bottom="-18" drop_shadow="true" enabled="true" height="34"
66 left="0" mouse_opaque="false" name="Help" opaque="true" tear_off="false"
67 width="112">
68 <menu_item_call bottom="-30" enabled="true" height="20" label="Help..." left="0"
69 mouse_opaque="true" name="Help..." width="112" />
70 <menu_item_call bottom="-30" enabled="true" height="20" label="LSL Wiki Help..." left="0"
71 mouse_opaque="true" name="LSL Wiki Help..." width="112" />
72 </menu>
73 </menu_bar>
74 <string name="loading">
75 Loading...
76 </string>
77 <string name="can_not_view">
78 You are not allowed to view this script.
79 </string>
80 <string name="public_objects_can_not_run">
81 Public Objects cannot run scripts
82 </string>
83 <string name="script_running">
84 Running
85 </string>
86</panel>
diff --git a/linden/indra/newview/skins/silver/xui/en-us/floater_script_queue.xml b/linden/indra/newview/skins/silver/xui/en-us/floater_script_queue.xml
deleted file mode 100644
index c44457c..0000000
--- a/linden/indra/newview/skins/silver/xui/en-us/floater_script_queue.xml
+++ /dev/null
@@ -1,13 +0,0 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater bottom="-763" can_close="true" can_drag_on_left="false" can_minimize="true"
3 can_resize="true" enabled="true" height="400" left="408" min_height="100"
4 min_width="100" mouse_opaque="true" name="queue" title="Reset Progress"
5 width="300">
6 <button bottom="-392" enabled="true" follows="right|bottom" font="SansSerif"
7 halign="center" height="24" label="Close" label_selected="Close" left="220"
8 mouse_opaque="true" name="close" width="64" />
9 <scroll_list background_visible="true" bottom="-364" column_padding="5" draw_border="true"
10 draw_heading="false" draw_stripes="true" enabled="true"
11 follows="left|top|right|bottom" height="344" left="4" mouse_opaque="true"
12 multi_select="false" name="queue output" width="292" />
13</floater>
diff --git a/linden/indra/newview/skins/silver/xui/en-us/floater_windlight_options.xml b/linden/indra/newview/skins/silver/xui/en-us/floater_windlight_options.xml
index 11859cc..d801251 100644
--- a/linden/indra/newview/skins/silver/xui/en-us/floater_windlight_options.xml
+++ b/linden/indra/newview/skins/silver/xui/en-us/floater_windlight_options.xml
@@ -4,29 +4,35 @@
4 min_width="400" mouse_opaque="true" name="WindLight floater" 4 min_width="400" mouse_opaque="true" name="WindLight floater"
5 rect_control="FloaterAdvancedSkyRect" title="Advanced Sky Editor" 5 rect_control="FloaterAdvancedSkyRect" title="Advanced Sky Editor"
6 width="700"> 6 width="700">
7 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 7 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
8 bottom="-50" drop_shadow_visible="true" follows="left|top|right" 8 bottom="-50" drop_shadow_visible="true" follows="left|top|right"
9 font="SansSerif" h_pad="0" halign="left" height="16" 9 font="SansSerif" h_pad="0" halign="left" height="16"
10 left="10" mouse_opaque="true" name="KeyFramePresetsText" v_pad="0" 10 left="10" mouse_opaque="true" name="KeyFramePresetsText" v_pad="0"
11 width="110"> 11 width="110">
12 Sky Presets: 12 Sky Presets:
13 </text> 13 </text>
14 <combo_box allow_text_entry="false" bottom="-50" follows="left|top" height="18" 14 <combo_box allow_text_entry="false" bottom="-52" follows="left|top" height="18"
15 left_delta="110" max_chars="20" mouse_opaque="true" name="WLPresetsCombo" 15 left_delta="110" max_chars="20" mouse_opaque="true" name="WLPresetsCombo"
16 width="150" /> 16 width="150" />
17 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20"
18 label="" label_selected="" left_delta="-25" image_overlay="arrow_left.tga"
19 mouse_opaque="true" name="prev" scale_image="true" width="20" />
20 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20"
21 label="" label_selected="" left_delta="180" image_overlay="arrow_right.tga"
22 mouse_opaque="true" name="next" scale_image="true" width="20" />
17 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20" 23 <button bottom="-53" enabled="true" font="SansSerif" halign="center" height="20"
18 label="New" label_selected="New" left_delta="170" 24 label="New" label_selected="New" left_delta="40"
19 mouse_opaque="true" name="WLNewPreset" scale_image="true" width="70" /> 25 mouse_opaque="true" name="WLNewPreset" scale_image="true" width="70" />
20 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20" 26 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
21 label="Save" label_selected="Save" left_delta="80" 27 label="Save" label_selected="Save" left_delta="70"
22 mouse_opaque="true" name="WLSavePreset" scale_image="true" width="70" /> 28 mouse_opaque="true" name="WLSavePreset" scale_image="true" width="70" />
23 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20" 29 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
24 label="Delete" label_selected="Delete" left_delta="80" 30 label="Delete" label_selected="Delete" left_delta="70"
25 mouse_opaque="true" name="WLDeletePreset" scale_image="true" width="70" /> 31 mouse_opaque="true" name="WLDeletePreset" scale_image="true" width="70" />
26 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20" 32 <button bottom_delta="0" enabled="true" font="SansSerif" halign="center" height="20"
27 label="Day Cycle Editor" label_selected="Day Cycle Editor" 33 label="Day Cycle Editor" label_selected="Day Cycle Editor"
28 left_delta="120" mouse_opaque="true" name="WLDayCycleMenuButton" 34 left_delta="100" mouse_opaque="true" name="WLDayCycleMenuButton"
29 scale_image="true" width="120" /> 35 scale_image="true" width="125" />
30 <tab_container bottom="-220" follows="left|top" height="160" left="0" 36 <tab_container bottom="-220" follows="left|top" height="160" left="0"
31 mouse_opaque="false" name="WindLight Tabs" tab_position="top" width="700"> 37 mouse_opaque="false" name="WindLight Tabs" tab_position="top" width="700">
32 <panel border="true" bottom="-220" follows="left|top|right|bottom" height="160" 38 <panel border="true" bottom="-220" follows="left|top|right|bottom" height="160"
diff --git a/linden/indra/newview/skins/silver/xui/en-us/panel_avatar.xml b/linden/indra/newview/skins/silver/xui/en-us/panel_avatar.xml
deleted file mode 100644
index 62738dc..0000000
--- a/linden/indra/newview/skins/silver/xui/en-us/panel_avatar.xml
+++ /dev/null
@@ -1,430 +0,0 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel bottom="-550" height="486" left="350" name="Panel Avatar" width="430">
3 <tab_container bottom="-486" height="486" left="0" mouse_opaque="false" name="tab"
4 tab_min_width="50" tab_position="top" width="419">
5 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
6 label="2nd Life" left="1" mouse_opaque="true" name="2nd Life" width="418">
7 <string name="CaptionTextAcctInfo">
8 [ACCTTYPE]
9[PAYMENTINFO]
10[AGEVERIFICATION]
11 </string>
12 <string name="AcctTypeResident">
13 Resident
14 </string>
15 <string name="AcctTypeTrial">
16 Trial
17 </string>
18 <string name="AcctTypeCharterMember">
19 Charter Member
20 </string>
21 <string name="AcctTypeEmployee">
22 Linden Lab Employee
23 </string>
24 <string name="PaymentInfoUsed">
25 Payment Info Used
26 </string>
27 <string name="PaymentInfoOnFile">
28 Payment Info On File
29 </string>
30 <string name="NoPaymentInfoOnFile">
31 No Payment Info On File
32 </string>
33 <string name="AgeVerified">
34 Age-verified
35 </string>
36 <string name="NotAgeVerified">
37 Not Age-verified
38 </string>
39 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
40 bottom="-24" drop_shadow_visible="true" follows="left|top"
41 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
42 mouse_opaque="true" name="Name:" v_pad="0" width="70">
43 Name:
44 </text>
45 <name_editor bevel_style="in" border_style="line"
46 border_thickness="1" bottom="-24" enabled="false" follows="left|top"
47 font="SansSerifSmall" height="16" is_unicode="false" left_delta="75"
48 max_length="254" mouse_opaque="false" name="name"
49 width="180" />
50 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
51 bottom="-24" drop_shadow_visible="true" follows="left|top"
52 font="SansSerifsmall" h_pad="0" halign="left" height="16" left="279"
53 mouse_opaque="true" name="online_yes" v_pad="0" width="121">
54 Currently Online
55 </text>
56 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
57 bottom_delta="-20" drop_shadow_visible="true" follows="left|top"
58 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="279"
59 mouse_opaque="true" name="label" v_pad="0" width="121">
60 Born:
61 </text>
62 <line_editor bevel_style="in" border_style="line"
63 border_thickness="1" bottom_delta="-16" enabled="true" follows="left|top"
64 font="SansSerifSmall" height="16" is_unicode="false" left="279"
65 max_length="254" mouse_opaque="false" name="born"
66 width="121" />
67 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
68 bottom_delta="-20" drop_shadow_visible="true" follows="left|top"
69 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="279"
70 mouse_opaque="true" name="label2" v_pad="0" width="121">
71 Account:
72 </text>
73 <view_border bevel_style="in" bottom_delta="-48" follows="left|top" height="48" left="279"
74 mouse_opaque="false" name="acct_border" width="121" />
75 <text bg_visible="false" border_drop_shadow_visible="false"
76 border_visible="true" bottom_delta="0" drop_shadow_visible="true"
77 follows="left|top" font="SansSerifSmall" height="48" left="279"
78 mouse_opaque="false" name="acct" width="121" />
79 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
80 bottom_delta="-20" drop_shadow_visible="true" follows="left|top"
81 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="279"
82 mouse_opaque="true" name="partner_label"
83 tool_tip="Second Life partner. For more info on how to set, see www.secondlife.com/partner"
84 v_pad="0" width="130">
85 Partner:
86 </text>
87 <button bottom_delta="2" follows="left|top" font="SansSerif" halign="center"
88 height="16" label="i" label_selected="i" left_delta="44"
89 mouse_opaque="true" name="partner_info"
90 tool_tip="Click to open partner&apos;s profile" width="18" />
91 <button bottom_delta="0" follows="left|top" font="SansSerif" halign="center"
92 height="16" label="?" label_selected="?" left_delta="24"
93 mouse_opaque="true" name="partner_help" width="18" />
94 <line_editor bevel_style="in" border_style="line"
95 border_thickness="1" bottom_delta="-16" enabled="true" follows="left|top"
96 font="SansSerifSmall" height="16" is_unicode="false" left="279"
97 max_length="254" mouse_opaque="false" name="partner_edit"
98 tool_tip="Second Life partner. For more info on how to set, see www.secondlife.com/partner"
99 width="121">
100 [FIRST] [LAST]
101 </line_editor>
102 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
103 bottom="-44" drop_shadow_visible="true" follows="left|top"
104 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
105 mouse_opaque="true" name="Photo:" v_pad="0" width="70">
106 Photo:
107 </text>
108 <texture_picker allow_no_texture="true" bottom="-179" can_apply_immediately="false"
109 default_image_name="None" follows="left|top" height="151" label=""
110 left="79" mouse_opaque="true" name="img"
111 tool_tip="Click to choose a picture" width="180" />
112 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
113 bottom="-183" drop_shadow_visible="true" follows="left|top"
114 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
115 mouse_opaque="true" name="Groups:" v_pad="0" width="70">
116 Groups:
117 </text>
118 <scroll_list background_visible="true" bottom="-258" column_padding="5" draw_border="true"
119 follows="left|top" height="90" left="79" mouse_opaque="false"
120 multi_select="false" name="groups" width="321" />
121 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
122 bottom="-280" drop_shadow_visible="true" follows="left|top"
123 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
124 mouse_opaque="true" name="About:" v_pad="0" width="70">
125 About:
126 </text>
127 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
128 bottom_delta="-16" drop_shadow_visible="true" follows="left|top"
129 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="0"
130 mouse_opaque="true" name="(500 chars)" v_pad="0" width="70">
131 (500 chars)
132 </text>
133 <text_editor bottom="-375" embedded_items="false"
134 enabled="true" follows="left|top" font="SansSerifSmall" height="110"
135 is_unicode="false" left="79" max_length="511" mouse_opaque="true"
136 name="about" width="321" word_wrap="true" />
137 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
138 bottom="-403" drop_shadow_visible="true" follows="left|top"
139 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="0"
140 mouse_opaque="true" name="Give item:" v_pad="0" width="75">
141 Give item:
142 </text>
143 <view_border blevel_style="in" border_thickness="0" bottom="-466" follows="left|top"
144 height="466" left_delta="4" mouse_opaque="false" name="drop_target_rect"
145 width="409" />
146 <view_border blevel_style="in" bottom="-403" follows="left|top" height="16" left_delta="75"
147 mouse_opaque="false" name="drop_target_rect_vis" width="321" />
148 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
149 bottom_delta="0" drop_shadow_visible="true" follows="left|top"
150 font="SansSerifSmall" h_pad="0" halign="center" height="16" left_delta="0"
151 mouse_opaque="true" name="Give inventory"
152 tool_tip="Drop inventory items here to give them to this person." v_pad="2"
153 width="321">
154 Drop inventory item here.
155 </text>
156 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
157 initial_value="false" label="Show in search" left="75" mouse_opaque="true"
158 name="allow_publish"
159 tool_tip="Publish extra profile information such as description and image in Search."
160 width="130" />
161 <button bottom="-423" follows="left|top" font="SansSerif" halign="center" height="16"
162 label="?" label_selected="?" left_delta="145" mouse_opaque="true" name="?"
163 width="20" />
164 <button bottom="-428" font="SansSerif" halign="center" height="20" label="Find on Map"
165 label_selected="Find on Map" left="24" mouse_opaque="true"
166 name="Find on Map" width="100" />
167 <button bottom="-428" font="SansSerif" halign="center" height="20"
168 label="Offer Teleport..." label_selected="Offer Teleport..."
169 left_delta="102" mouse_opaque="true" name="Offer Teleport..." width="140" />
170 <button bottom="-428" font="SansSerif" halign="center" height="20"
171 label="Add Friend..." label_selected="Add Friend..." left_delta="142"
172 mouse_opaque="true" name="Add Friend..." width="130" />
173 <button bottom_delta="-24" font="SansSerif" halign="center" height="20" label="Pay..."
174 label_selected="Pay..." left="24" mouse_opaque="true" name="Pay..."
175 width="100" />
176 <button bottom_delta="0" font="SansSerif" halign="center" height="20"
177 label="Instant Message..." label_selected="Instant Message..."
178 left_delta="102" mouse_opaque="true" name="Instant Message..."
179 tool_tip="Instant Message (IM)" width="140" />
180 <button bottom_delta="0" font="SansSerif" halign="center" height="20" label="Mute"
181 label_selected="Mute" left_delta="142" mouse_opaque="true" name="Mute"
182 width="130" />
183 </panel>
184 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
185 label="Web" left="1" mouse_opaque="true" name="WebProfile" width="418">
186 <line_editor bevel_style="in" border_style="line"
187 border_thickness="1" bottom_delta="-18" enabled="false" follows="left|top"
188 font="SansSerifSmall" height="16" is_unicode="false" left="10"
189 max_length="254" mouse_opaque="true" name="url_edit"
190 width="400" />
191 <flyout_button bottom_delta="-22" follows="left|top" font="SansSerifSmall" halign="center"
192 height="18" label="Load" label_selected="Load" left="10"
193 mouse_opaque="true" name="load" enabled="false"
194 tool_tip="Load this profile page with embedded web browser." width="80" >
195 <flyout_button_item value="open" name="open_item">In external browser</flyout_button_item>
196 <flyout_button_item value="home" name="home_item">Home URL</flyout_button_item>
197 </flyout_button>
198 <button bottom_delta="0" follows="left|top" font="SansSerif" halign="center"
199 height="18" label="?" label_selected="?" left_delta="85"
200 mouse_opaque="true" name="web_profile_help" width="18" />
201 <check_box bottom_delta="0" follows="right|top" font="SansSerifSmall" height="16"
202 initial_value="false" label="Automatically load web profiles"
203 left_delta="30" mouse_opaque="true" name="auto_load"
204 tool_tip="Automatically load ALL profile webpages without asking first."
205 width="127" />
206 <web_browser border_visible="false" bottom="-444" follows="top|left|right" height="400"
207 ignore_ui_scale="false" left="10" name="profile_html" start_url=""
208 width="400" />
209 <text bottom="5" follows="bottom|left|right" left="15" name="status_text" right="-70"
210 top="25" />
211 </panel>
212 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
213 label="Interests" left="1" mouse_opaque="true" name="Interests" width="418">
214 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
215 bottom="-36" drop_shadow_visible="true" follows="left|top"
216 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
217 mouse_opaque="true" name="I Want To:" v_pad="0" width="70">
218 I Want To:
219 </text>
220 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
221 initial_value="false" label="Build" left_delta="70" mouse_opaque="true"
222 name="chk0" width="90" />
223 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
224 initial_value="false" label="Explore" left_delta="170" mouse_opaque="true"
225 name="chk1" width="90" />
226 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
227 initial_value="false" label="Meet" left_delta="-170" mouse_opaque="true"
228 name="chk2" width="57" />
229 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
230 initial_value="false" label="Be Hired" left_delta="170" mouse_opaque="true"
231 name="chk6" width="92" />
232 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
233 initial_value="false" label="Group" left_delta="-170" mouse_opaque="true"
234 name="chk3" width="90" />
235 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
236 initial_value="false" label="Buy" left_delta="170" mouse_opaque="true"
237 name="chk4" width="90" />
238 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
239 initial_value="false" label="Sell" left_delta="-170" mouse_opaque="true"
240 name="chk5" width="50" />
241 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
242 initial_value="false" label="Hire" left_delta="170" mouse_opaque="true"
243 name="chk7" width="92" />
244 <line_editor bevel_style="in" border_style="line"
245 border_thickness="1" bottom_delta="-20" enabled="true" follows="left|top"
246 font="SansSerifSmall" height="16" is_unicode="false" left="74"
247 max_length="254" mouse_opaque="true" name="want_to_edit"
248 width="330" />
249 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
250 bottom_delta="-26" drop_shadow_visible="true" follows="left|top"
251 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
252 mouse_opaque="true" name="Skills:" v_pad="0" width="70">
253 Skills:
254 </text>
255 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
256 initial_value="false" label="Textures" left_delta="70" mouse_opaque="true"
257 name="schk0" width="90" />
258 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
259 initial_value="false" label="Architecture" left_delta="170"
260 mouse_opaque="true" name="schk1" width="93" />
261 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
262 initial_value="false" label="Event Planning" left_delta="0"
263 mouse_opaque="true" name="schk2" width="105" />
264 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
265 initial_value="false" label="Modeling" left_delta="-170"
266 mouse_opaque="true" name="schk3" width="90" />
267 <check_box bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16"
268 initial_value="false" label="Scripting" left_delta="0" mouse_opaque="true"
269 name="schk4" width="90" />
270 <check_box bottom_delta="0" follows="left|top" font="SansSerifSmall" height="16"
271 initial_value="false" label="Custom Characters" left_delta="170"
272 mouse_opaque="true" name="schk5" width="127" />
273 <line_editor bevel_style="in" border_style="line"
274 border_thickness="1" bottom_delta="-20" enabled="true" follows="left|top"
275 font="SansSerifSmall" height="16" is_unicode="false" left="74"
276 max_length="254" mouse_opaque="true" name="skills_edit"
277 width="330" />
278 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
279 bottom_delta="-30" drop_shadow_visible="true" follows="left|top"
280 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
281 mouse_opaque="true" name="Languages:" v_pad="0" width="70">
282 Languages:
283 </text>
284 <line_editor bevel_style="in" border_style="line"
285 border_thickness="1" bottom_delta="0" enabled="true" follows="left|top"
286 font="SansSerifSmall" height="16" is_unicode="false" left="74"
287 max_length="254" mouse_opaque="true" name="languages_edit"
288 width="330" />
289 </panel>
290 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
291 label="Picks" left="1" mouse_opaque="true" name="Picks" width="418">
292 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
293 bottom="-20" drop_shadow_visible="true" follows="left|top"
294 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="114"
295 mouse_opaque="true"
296 name="Tell everyone about your favorite places in Second Life." v_pad="0"
297 width="302">
298 Tell everyone about your favorite places in Second Life.
299 </text>
300 <button bottom_delta="-24" follows="left|top" font="SansSerif" halign="center"
301 height="20" label="New..." label_selected="New..." left="114"
302 mouse_opaque="true" name="New..." width="75" />
303 <button bottom="-44" follows="left|top" font="SansSerif" halign="center" height="20"
304 label="Delete..." label_selected="Delete..." left_delta="79"
305 mouse_opaque="true" name="Delete..." width="75" />
306 <tab_container bottom="-411" follows="left|top" height="363" left="4" mouse_opaque="false"
307 name="picks tab" tab_position="left" width="412" />
308 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
309 bottom="-70" drop_shadow_visible="true" follows="left|top" font="SansSerif"
310 h_pad="0" halign="left" height="20" left="114" mouse_opaque="false"
311 name="loading_text" v_pad="0" width="302">
312 Loading...
313 </text>
314 </panel>
315 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
316 label="Classified" left="1" mouse_opaque="true" name="Classified"
317 width="418">
318 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
319 bottom="-20" drop_shadow_visible="true" follows="left|top"
320 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="114"
321 mouse_opaque="true"
322 name="Place an ad in Second Life&apos;s classified listings." v_pad="0"
323 width="302">
324 Place an ad in Second Life&apos;s classified listings.
325 </text>
326 <button bottom_delta="-24" follows="left|top" font="SansSerif" halign="center"
327 height="20" label="New..." label_selected="New..." left="114"
328 mouse_opaque="true" name="New..." width="75" />
329 <button bottom="-44" follows="left|top" font="SansSerif" halign="center" height="20"
330 label="Delete..." label_selected="Delete..." left_delta="79"
331 mouse_opaque="true" name="Delete..." width="75" />
332 <tab_container bottom="-443" follows="left|top" height="395" left="4" mouse_opaque="false"
333 name="classified tab" tab_position="left" width="412" />
334 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
335 bottom="-70" drop_shadow_visible="true" follows="left|top" font="SansSerif"
336 h_pad="0" halign="left" height="20" left="114" mouse_opaque="false"
337 name="loading_text" v_pad="0" width="302">
338 Loading...
339 </text>
340 </panel>
341 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
342 label="1st Life" left="1" mouse_opaque="true" name="1st Life" width="418">
343 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
344 bottom="-36" drop_shadow_visible="true" follows="left|top"
345 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
346 mouse_opaque="true" name="Photo:" v_pad="0" width="61">
347 Photo:
348 </text>
349 <texture_picker allow_no_texture="true" bottom="-171" can_apply_immediately="false"
350 default_image_name="None" follows="left|top" height="151" label=""
351 left="70" mouse_opaque="true" name="img"
352 tool_tip="Click to choose a picture" width="135" />
353 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
354 bottom="-203" drop_shadow_visible="true" follows="left|top"
355 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
356 mouse_opaque="true" name="Info:" v_pad="0" width="61">
357 Info:
358 </text>
359 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
360 bottom_delta="-16" drop_shadow_visible="true" follows="left|top"
361 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="0"
362 mouse_opaque="true" name="(250 chars)" v_pad="0" width="65">
363 (250 chars)
364 </text>
365 <text_editor bottom="-347" embedded_items="false"
366 enabled="true" follows="left|top" font="SansSerifSmall" height="160"
367 is_unicode="false" left="70" max_length="254" mouse_opaque="false"
368 name="about" width="330" word_wrap="true" />
369 </panel>
370 <panel border="true" bottom="-482" follows="left|top|right|bottom" height="466"
371 label="My Notes" left="1" mouse_opaque="true" name="My Notes" width="418">
372 <string name="Loading">
373 Loading...
374 </string>
375 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
376 bottom="-52" drop_shadow_visible="true" follows="left|top"
377 font="SansSerifSmall" h_pad="0" halign="left" height="48" left="10"
378 mouse_opaque="true" name="label" v_pad="0" width="412">
379 Use this space to record your notes about this person. Keep track
380of trades in progress, joint projects, etc. Only you can see these
381notes. This person cannot see them, nor can other people.
382 </text>
383 <text_editor bottom_delta="-260" embedded_items="false" enabled="true" follows="left|top"
384 font="SansSerif" height="256" is_unicode="false" left="10"
385 max_length="1023" mouse_opaque="true" name="notes edit" width="400"
386 word_wrap="false" />
387 </panel>
388 </tab_container>
389 <button bottom="-483" font="SansSerif" halign="center" height="20" label="OK"
390 label_selected="OK" left="208" mouse_opaque="true" name="OK" width="100" />
391 <button bottom_delta="0" font="SansSerif" halign="center" height="20" label="Cancel"
392 label_selected="Cancel" left_delta="105" mouse_opaque="true" name="Cancel"
393 width="100" />
394 <button bottom_delta="132" font="SansSerif" halign="center" height="20" label="Kick"
395 label_selected="Kick" left="4" mouse_opaque="true" name="Kick" width="72" />
396 <button bottom_delta="-24" font="SansSerif" halign="center" height="20" label="Freeze"
397 label_selected="Freeze" left="4" mouse_opaque="true" name="Freeze"
398 tool_tip="Stop this resident&apos;s movement and chat." width="72" />
399 <button bottom_delta="-24" font="SansSerif" halign="center" height="20"
400 label="Unfreeze" label_selected="Unfreeze" left="4" mouse_opaque="true"
401 name="Unfreeze" tool_tip="Thaw resident" width="72" />
402 <button bottom_delta="-24" font="SansSerif" halign="center" height="20" label="CSR"
403 label_selected="CSR" left="4" mouse_opaque="true" name="csr_btn"
404 tool_tip="Open customer service tool for this resident" width="72" />
405 <string name="ShowOnMapNonFriend">
406 Show location on the map.
407Disabled because you have not
408formed a friendship with them.
409 </string>
410 <string name="ShowOnMapFriendOffline">
411 Show location on the map.
412 Disabled because they are not online.
413 </string>
414 <string name="ShowOnMapFriendOnline">
415 Show location on the map.
416 </string>
417 <string name="TeleportGod">
418 Force a teleport to your location.
419 </string>
420 <string name="TeleportPrelude">
421 Offer a teleport to your location.
422Disabled until you leave Orientation Island.
423 </string>
424 <string name="TeleportNormal">
425 Offer a teleport to your location.
426 </string>
427 <string name="Loading">
428 Loading...
429 </string>
430</panel>
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index 158d092..76a176d 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -773,26 +773,28 @@ class LinuxManifest(ViewerManifest):
773 773
774 self.package_file = installer_name + '.tar.bz2' 774 self.package_file = installer_name + '.tar.bz2'
775 775
776 if("package" in self.args['actions'] or 776 # Disabled for now. It's a waste of time to package every compile.
777 "unpacked" in self.args['actions']): 777
778 778 # if("package" in self.args['actions'] or
779 # temporarily move directory tree so that it has the right 779 # "unpacked" in self.args['actions']):
780 # name in the tarfile 780 #
781 self.run_command("mv %(dst)s %(inst)s" % { 781 # # temporarily move directory tree so that it has the right
782 'dst': self.get_dst_prefix(), 782 # # name in the tarfile
783 'inst': self.build_path_of(installer_name)}) 783 # self.run_command("mv %(dst)s %(inst)s" % {
784 try: 784 # 'dst': self.get_dst_prefix(),
785 # --numeric-owner hides the username of the builder for 785 # 'inst': self.build_path_of(installer_name)})
786 # security etc. 786 # try:
787 self.run_command('tar -C %(dir)s --numeric-owner -cjf ' 787 # # --numeric-owner hides the username of the builder for
788 '%(inst_path)s.tar.bz2 %(inst_name)s' % { 788 # # security etc.
789 'dir': self.get_build_prefix(), 789 # self.run_command('tar -C %(dir)s --numeric-owner -cjf '
790 'inst_name': installer_name, 790 # '%(inst_path)s.tar.bz2 %(inst_name)s' % {
791 'inst_path':self.build_path_of(installer_name)}) 791 # 'dir': self.get_build_prefix(),
792 finally: 792 # 'inst_name': installer_name,
793 self.run_command("mv %(inst)s %(dst)s" % { 793 # 'inst_path':self.build_path_of(installer_name)})
794 'dst': self.get_dst_prefix(), 794 # finally:
795 'inst': self.build_path_of(installer_name)}) 795 # self.run_command("mv %(inst)s %(dst)s" % {
796 # 'dst': self.get_dst_prefix(),
797 # 'inst': self.build_path_of(installer_name)})
796 798
797 799
798class Linux_i686Manifest(LinuxManifest): 800class Linux_i686Manifest(LinuxManifest):
@@ -823,14 +825,11 @@ class Linux_i686Manifest(LinuxManifest):
823 self.path("libELFIO.so") 825 self.path("libELFIO.so")
824 self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3") 826 self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3")
825 827
826 self.path("libopenal.so") # symlink
827 self.path("libopenal.so.1") 828 self.path("libopenal.so.1")
828 self.path("libalut.so") 829 self.path("libalut.so.0")
829 830
830 # Gstreamer libs 831 # Gstreamer libs
831 self.path("libgstbase-0.10.so") # symlink
832 self.path("libgstbase-0.10.so.0") 832 self.path("libgstbase-0.10.so.0")
833 self.path("libgstreamer-0.10.so") # symlink
834 self.path("libgstreamer-0.10.so.0") 833 self.path("libgstreamer-0.10.so.0")
835 self.path("libgstaudio-0.10.so.0") 834 self.path("libgstaudio-0.10.so.0")
836 self.path("libgstbase-0.10.so.0") 835 self.path("libgstbase-0.10.so.0")
@@ -847,18 +846,10 @@ class Linux_i686Manifest(LinuxManifest):
847 self.path("libgstvideo-0.10.so.0") 846 self.path("libgstvideo-0.10.so.0")
848 847
849 # Gstreamer plugin dependencies 848 # Gstreamer plugin dependencies
850 self.path("libavcodec.so.52")
851 self.path("libavformat.so.52")
852 self.path("libavutil.so.49")
853 self.path("libxvidcore.so.4")
854 self.path("libfaac.so.0")
855 self.path("libfaad.so.1")
856 self.path("libmp3lame.so.0")
857 self.path("libogg.so.0") 849 self.path("libogg.so.0")
850 self.path("libtheora.so.0")
858 self.path("libvorbis.so.0") 851 self.path("libvorbis.so.0")
859 self.path("libvorbisenc.so.2") 852 self.path("libvorbisenc.so.2")
860 self.path("libxml2.so.2")
861 self.path("libxvidcore.so.4")
862 853
863 # Gstreamer plugins 854 # Gstreamer plugins
864 if self.prefix("gstreamer-plugins"): 855 if self.prefix("gstreamer-plugins"):
@@ -873,7 +864,6 @@ class Linux_i686Manifest(LinuxManifest):
873 self.path("libgstdecodebin2.so") 864 self.path("libgstdecodebin2.so")
874 self.path("libgstdecodebin.so") 865 self.path("libgstdecodebin.so")
875 self.path("libgstesd.so") 866 self.path("libgstesd.so")
876 self.path("libgstffmpegcolorspace.so")
877 self.path("libgstffmpeg.so") 867 self.path("libgstffmpeg.so")
878 self.path("libgstgnomevfs.so") 868 self.path("libgstgnomevfs.so")
879 self.path("libgsticydemux.so") 869 self.path("libgsticydemux.so")
diff --git a/linden/install.xml b/linden/install.xml
index c2053d6..964c3ef 100644
--- a/linden/install.xml
+++ b/linden/install.xml
@@ -461,16 +461,16 @@
461 <key>linux</key> 461 <key>linux</key>
462 <map> 462 <map>
463 <key>md5sum</key> 463 <key>md5sum</key>
464 <string>2f1a9e14f9213c2c9564c1c1cfdd6d47</string> 464 <string>674b2a79cef8ddd28f53b28b44dcffe2</string>
465 <key>url</key> 465 <key>url</key>
466 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-linux-20080817.tar.bz2</uri> 466 <uri>http://imprudenceviewer.org/download/libs/glib-2.20.5-linux-20091009.tar.bz2</uri>
467 </map> 467 </map>
468 <key>windows</key> 468 <key>windows</key>
469 <map> 469 <map>
470 <key>md5sum</key> 470 <key>md5sum</key>
471 <string>3d5e29d444dde4815b36082eedfc775a</string> 471 <string>b1e0e16472c0e5d3b6291870e3f20b0c</string>
472 <key>url</key> 472 <key>url</key>
473 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-windows-20080817.tar.bz2</uri> 473 <uri>http://imprudenceviewer.org/download/libs/glib-2.18.4-windows-03162009.tar.bz2</uri>
474 </map> 474 </map>
475 </map> 475 </map>
476 </map> 476 </map>
@@ -498,9 +498,9 @@
498 <key>linux</key> 498 <key>linux</key>
499 <map> 499 <map>
500 <key>md5sum</key> 500 <key>md5sum</key>
501 <string>c829b638b6eef71ca63418cb9aea46a2</string> 501 <string>591900261bddbe3d1e579f7e6070081a</string>
502 <key>url</key> 502 <key>url</key>
503 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20080613.tar.bz2</uri> 503 <uri>http://imprudenceviewer.org/download/libs/gstreamer-0.10.24-linux-20091005.tar.bz2</uri>
504 </map> 504 </map>
505 <key>linux64</key> 505 <key>linux64</key>
506 <map> 506 <map>
@@ -512,9 +512,9 @@
512 <key>windows</key> 512 <key>windows</key>
513 <map> 513 <map>
514 <key>md5sum</key> 514 <key>md5sum</key>
515 <string>f8db21e781735ba5dd84f3043d20e882</string> 515 <string>70ffd9d5e1c45a634be1beed70371784</string>
516 <key>url</key> 516 <key>url</key>
517 <uri>http://imprudenceviewer.org/download/libs/gstreamer-0.10.22-windows-04172009.tar.bz2</uri> 517 <uri>http://imprudenceviewer.org/download/libs/gstreamer-0.10.22-windows-20090903.tar.bz2</uri>
518 </map> 518 </map>
519 </map> 519 </map>
520 </map> 520 </map>
@@ -524,21 +524,32 @@
524 <string>lgpl</string> 524 <string>lgpl</string>
525 <key>packages</key> 525 <key>packages</key>
526 <map> 526 <map>
527 <key>linux</key>
528 <map>
529 <key>md5sum</key>
530 <string>2cce992f4506fbc11f827aa80eb499f4</string>
531 <key>url</key>
532 <uri>http://imprudenceviewer.org/download/libs/gstreamer-plugins-linux-20091008.tar.bz2</uri>
533 </map>
527 <key>windows</key> 534 <key>windows</key>
528 <map> 535 <map>
529 <key>md5sum</key> 536 <key>md5sum</key>
530 <string>9693550810903d5bca10e018fccd7994</string> 537 <string>77b954b9313459cb7cd6046bf91de296</string>
531 <key>url</key> 538 <key>url</key>
532 <uri>http://imprudenceviewer.org/download/libs/gstreamer-plugins-windows-20090608.tar.bz2</uri> 539 <uri>http://imprudenceviewer.org/download/libs/gstreamer-plugins-windows-20090903.tar.bz2</uri>
533 </map> 540 </map>
534 </map> 541 </map>
535 </map> 542 </map>
536 <key>gtk-atk-pango-glib</key> 543 <key>gtk-etc</key>
537 <map> 544 <map>
538 <key>copyright</key> 545 <key>copyright</key>
539 <string>Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald</string> 546 <string>Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
547atk: Copyright 2001 Sun Microsystems Inc.
548cairo: Copyright © 2002 University of Southern California, Copyright © 2005 Red Hat, Inc.
549
550</string>
540 <key>description</key> 551 <key>description</key>
541 <string>Libraries associated with GTK for gui features. atk: interfaces for accessibility; glib: low-level core functionality for using GTK+ and GNOME; pango: layout/rendering of text w/ emphasis on internationalization.</string> 552 <string>GTK+ and associated libraries (atk, cairo, pango, pixman)</string>
542 <key>license</key> 553 <key>license</key>
543 <string>lgpl</string> 554 <string>lgpl</string>
544 <key>packages</key> 555 <key>packages</key>
@@ -546,16 +557,9 @@
546 <key>linux</key> 557 <key>linux</key>
547 <map> 558 <map>
548 <key>md5sum</key> 559 <key>md5sum</key>
549 <string>21c16a74f8fc9a62e3ab944a6eb7403d</string> 560 <string>143844d33c5075bf30f8af1fd86a6f09</string>
550 <key>url</key>
551 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080616.tar.bz</uri>
552 </map>
553 <key>windows</key>
554 <map>
555 <key>md5sum</key>
556 <string>d963750bcd333a108b3697d220c87d09</string>
557 <key>url</key> 561 <key>url</key>
558 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-windows-20080613.tar.bz2</uri> 562 <uri>http://imprudenceviewer.org/download/libs/gtk-etc-linux-20091008.tar.bz2</uri>
559 </map> 563 </map>
560 </map> 564 </map>
561 </map> 565 </map>
@@ -729,9 +733,9 @@ anguage Infrstructure (CLI) international standard</string>
729 <key>windows</key> 733 <key>windows</key>
730 <map> 734 <map>
731 <key>md5sum</key> 735 <key>md5sum</key>
732 <string>a3975dcdb9a3ba0ca179b673b5e9b55e</string> 736 <string>200bdf3c5a5489210fcee965f639a3f9</string>
733 <key>url</key> 737 <key>url</key>
734 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.35-windows-20090306.tar.bz2</uri> 738 <uri>http://imprudenceviewer.org/download/libs/libpng-1.2.34-1-windows-04172009.tar.bz2</uri>
735 </map> 739 </map>
736 </map> 740 </map>
737 </map> 741 </map>
@@ -763,9 +767,9 @@ anguage Infrstructure (CLI) international standard</string>
763 <key>linux</key> 767 <key>linux</key>
764 <map> 768 <map>
765 <key>md5sum</key> 769 <key>md5sum</key>
766 <string>4b5d2dcfe8a49b73fb69f10aab441092</string> 770 <string>cec4328f5808b49836c467831a5f285e</string>
767 <key>url</key> 771 <key>url</key>
768 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20080613.tar.bz2</uri> 772 <uri>http://imprudenceviewer.org/download/libs/libxml2-2.7.4-r1-linux-20091005.tar.bz2</uri>
769 </map> 773 </map>
770 <key>linux64</key> 774 <key>linux64</key>
771 <map> 775 <map>
@@ -914,7 +918,7 @@ anguage Infrstructure (CLI) international standard</string>
914 <key>description</key> 918 <key>description</key>
915 <string>Ogg: container format Vorbis: audio compression scheme</string> 919 <string>Ogg: container format Vorbis: audio compression scheme</string>
916 <key>license</key> 920 <key>license</key>
917 <string>ogg-vorbis</string> 921 <string>xiph-bsd</string>
918 <key>packages</key> 922 <key>packages</key>
919 <map> 923 <map>
920 <key>darwin</key> 924 <key>darwin</key>
@@ -927,9 +931,9 @@ anguage Infrstructure (CLI) international standard</string>
927 <key>linux</key> 931 <key>linux</key>
928 <map> 932 <map>
929 <key>md5sum</key> 933 <key>md5sum</key>
930 <string>6dc0536329a0aadf76e3054ffd4da61c</string> 934 <string>92c614b34fc283588625805076d58e93</string>
931 <key>url</key> 935 <key>url</key>
932 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux-20081201.tar.bz2</uri> 936 <uri>http://imprudenceviewer.org/download/libs/ogg-vorbis-linux-20091003.tar.bz2</uri>
933 </map> 937 </map>
934 <key>linux64</key> 938 <key>linux64</key>
935 <map> 939 <map>
@@ -947,79 +951,79 @@ anguage Infrstructure (CLI) international standard</string>
947 </map> 951 </map>
948 </map> 952 </map>
949 </map> 953 </map>
950 <key>openSSL</key> 954 <key>openal</key>
951 <map> 955 <map>
956 <key>copyright</key>
957 <string>Copyright (C) 2008 by authors.</string>
958 <key>description</key>
959 <string>3D Audio library</string>
952 <key>license</key> 960 <key>license</key>
953 <string>openSSL</string> 961 <string>lgpl</string>
954 <key>packages</key> 962 <key>packages</key>
955 <map> 963 <map>
956 <key>darwin</key> 964 <key>darwin</key>
957 <map> 965 <map>
958 <key>md5sum</key> 966 <key>md5sum</key>
959 <string>a7b49e0f3eedbd5de117a3524c414b3a</string> 967 <string>f30b851e089108978c8218295a405159</string>
960 <key>url</key> 968 <key>url</key>
961 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080812.tar.bz2</uri> 969 <uri>http://imprudenceviewer.org/download/libs/openal-darwin-20090418.tar.bz2</uri>
962 </map> 970 </map>
963 <key>linux</key> 971 <key>linux</key>
964 <map> 972 <map>
965 <key>md5sum</key> 973 <key>md5sum</key>
966 <string>f219ef07b02e2abb9282345c3a8f2b39</string> 974 <string>6f69d70ec18a3c3c2dee81bf6331c784</string>
967 <key>url</key> 975 <key>url</key>
968 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080812.tar.bz2</uri> 976 <uri>http://imprudenceviewer.org/download/libs/openal-linux-20091009.tar.bz2</uri>
969 </map>
970 <key>linux64</key>
971 <map>
972 <key>md5sum</key>
973 <string>00b23f28a2457d9dabbaff0b29ee7323</string>
974 <key>url</key>
975 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8g-linux64-20080909.tar.bz2</uri>
976 </map> 977 </map>
977 <key>windows</key> 978 <key>windows</key>
978 <map> 979 <map>
979 <key>md5sum</key> 980 <key>md5sum</key>
980 <string>dd85209081b832e836de6e1538541d89</string> 981 <string>7c33758dc0a047c244de03133dd76c2a</string>
981 <key>url</key> 982 <key>url</key>
982 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8j-windows-20090129.tar.bz2</uri> 983 <uri>http://imprudence.s3.amazonaws.com/extras/openal-soft-1.6.372-windows-01262009.tar.bz2</uri>
983 </map> 984 </map>
984 </map> 985 </map>
985 </map> 986 </map>
986 <key>openal-soft</key> 987 <key>openSSL</key>
987 <map> 988 <map>
988 <key>copyright</key>
989 <string>Copyright (C) 2008 by authors.</string>
990 <key>description</key>
991 <string>3D Audio library</string>
992 <key>license</key> 989 <key>license</key>
993 <string>lgpl</string> 990 <string>openSSL</string>
994 <key>packages</key> 991 <key>packages</key>
995 <map> 992 <map>
996 <key>darwin</key> 993 <key>darwin</key>
997 <map> 994 <map>
998 <key>md5sum</key> 995 <key>md5sum</key>
999 <string>a0757244e3e6688fde2ffeea35cc1f96</string> 996 <string>a7b49e0f3eedbd5de117a3524c414b3a</string>
1000 <key>url</key> 997 <key>url</key>
1001 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-darwin-20080924.tar.bz2</uri> 998 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080812.tar.bz2</uri>
1002 </map> 999 </map>
1003 <key>linux</key> 1000 <key>linux</key>
1004 <map> 1001 <map>
1005 <key>md5sum</key> 1002 <key>md5sum</key>
1006 <string>f0d9a8d1318b519cffe6c40c9cac4e21</string> 1003 <string>f219ef07b02e2abb9282345c3a8f2b39</string>
1007 <key>url</key> 1004 <key>url</key>
1008 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-linux-20081010c-59a71b14-plughw.tar.bz2</uri> 1005 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080812.tar.bz2</uri>
1006 </map>
1007 <key>linux32</key>
1008 <map>
1009 <key>md5sum</key>
1010 <string>1037114c5b7ad906daca2b4820080b5b</string>
1011 <key>url</key>
1012 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8g-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
1009 </map> 1013 </map>
1010 <key>linux64</key> 1014 <key>linux64</key>
1011 <map> 1015 <map>
1012 <key>md5sum</key> 1016 <key>md5sum</key>
1013 <string>5ad0a3ab623356c1ad61394ba238f99f</string> 1017 <string>00b23f28a2457d9dabbaff0b29ee7323</string>
1014 <key>url</key> 1018 <key>url</key>
1015 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-soft-1.6.372-linux64-20081219.tar.bz2</uri> 1019 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8g-linux64-20080909.tar.bz2</uri>
1016 </map> 1020 </map>
1017 <key>windows</key> 1021 <key>windows</key>
1018 <map> 1022 <map>
1019 <key>md5sum</key> 1023 <key>md5sum</key>
1020 <string>a0757244e3e6688fde2ffeea35cc1f96</string> 1024 <string>8a75180cae12d268071c090abb031ba5</string>
1021 <key>url</key> 1025 <key>url</key>
1022 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-windows-20080924.tar.bz2</uri> 1026 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-windows-20080613.tar.bz2</uri>
1023 </map> 1027 </map>
1024 </map> 1028 </map>
1025 </map> 1029 </map>
@@ -1115,6 +1119,25 @@ anguage Infrstructure (CLI) international standard</string>
1115 </map> 1119 </map>
1116 </map> 1120 </map>
1117 </map> 1121 </map>
1122 <key>theora</key>
1123 <map>
1124 <key>copyright</key>
1125 <string>Copyright (C) 2002-2009 Xiph.org Foundation</string>
1126 <key>description</key>
1127 <string>Ogg Theora video format</string>
1128 <key>license</key>
1129 <string>xiph-bsd</string>
1130 <key>packages</key>
1131 <map>
1132 <key>linux</key>
1133 <map>
1134 <key>md5sum</key>
1135 <string>a6e6e250efaf3f25db4699d9b5dfec4b</string>
1136 <key>url</key>
1137 <uri>http://imprudenceviewer.org/download/libs/theora-linux-20091003.tar.bz2</uri>
1138 </map>
1139 </map>
1140 </map>
1118 <key>tut</key> 1141 <key>tut</key>
1119 <map> 1142 <map>
1120 <key>copyright</key> 1143 <key>copyright</key>
@@ -1258,9 +1281,9 @@ anguage Infrstructure (CLI) international standard</string>
1258 <key>windows</key> 1281 <key>windows</key>
1259 <map> 1282 <map>
1260 <key>md5sum</key> 1283 <key>md5sum</key>
1261 <string>9ad657cc5146fef77ffa8dd1c069018f</string> 1284 <string>0efbf671a0d686bb0141895e91fbfc46</string>
1262 <key>url</key> 1285 <key>url</key>
1263 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-windows-20080723.tar.bz2</uri> 1286 <uri>http://imprudenceviewer.org/download/libs/zlib-1.1.4-windows-20090829.tar.bz2</uri>
1264 </map> 1287 </map>
1265 </map> 1288 </map>
1266 </map> 1289 </map>
@@ -1408,7 +1431,7 @@ Cass Everitt - cass@r3.nu
1408 <key>url</key> 1431 <key>url</key>
1409 <string>http://www.mozilla.org/MPL/MPL-1.1.html</string> 1432 <string>http://www.mozilla.org/MPL/MPL-1.1.html</string>
1410 </map> 1433 </map>
1411 <key>ogg-vorbis</key> 1434 <key>xiph-bsd</key>
1412 <map> 1435 <map>
1413 <key>url</key> 1436 <key>url</key>
1414 <string>http://www.xiph.org/licenses/bsd/</string> 1437 <string>http://www.xiph.org/licenses/bsd/</string>
diff --git a/linden/scripts/install.py b/linden/scripts/install.py
index 5069918..1db9bb3 100755
--- a/linden/scripts/install.py
+++ b/linden/scripts/install.py
@@ -64,7 +64,7 @@ def add_indra_lib_path():
64base_dir = add_indra_lib_path() 64base_dir = add_indra_lib_path()
65 65
66import copy 66import copy
67import md5 67from hashlib import md5
68import optparse 68import optparse
69import os 69import os
70import platform 70import platform
@@ -75,8 +75,6 @@ import tempfile
75import urllib2 75import urllib2
76import urlparse 76import urlparse
77 77
78from sets import Set as set, ImmutableSet as frozenset
79
80from indra.base import llsd 78from indra.base import llsd
81from indra.util import helpformatter 79from indra.util import helpformatter
82 80
@@ -106,7 +104,7 @@ class InstallFile(object):
106 return "ifile{%s:%s}" % (self.pkgname, self.url) 104 return "ifile{%s:%s}" % (self.pkgname, self.url)
107 105
108 def _is_md5sum_match(self): 106 def _is_md5sum_match(self):
109 hasher = md5.new(file(self.filename, 'rb').read()) 107 hasher = md5(file(self.filename, 'rb').read())
110 if hasher.hexdigest() == self.md5sum: 108 if hasher.hexdigest() == self.md5sum:
111 return True 109 return True
112 return False 110 return False