summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rwxr-xr-xindra/cmake/00-Common.cmake12
-rwxr-xr-xindra/cmake/APR.cmake6
-rwxr-xr-xindra/cmake/Audio.cmake6
-rwxr-xr-xindra/cmake/BerkeleyDB.cmake6
-rwxr-xr-xindra/cmake/Boost.cmake6
-rwxr-xr-xindra/cmake/CARes.cmake6
-rwxr-xr-xindra/cmake/CURL.cmake6
-rwxr-xr-xindra/cmake/Copy3rdPartyLibs.cmake4
-rwxr-xr-xindra/cmake/DBusGlib.cmake4
-rwxr-xr-xindra/cmake/EXPAT.cmake6
-rwxr-xr-xindra/cmake/ExamplePlugin.cmake6
-rw-r--r--indra/cmake/FMODEX.cmake8
-rwxr-xr-xindra/cmake/FindJsonCpp.cmake4
-rwxr-xr-xindra/cmake/FreeType.cmake6
-rw-r--r--indra/cmake/GLEXT.cmake4
-rwxr-xr-xindra/cmake/GLH.cmake6
-rwxr-xr-xindra/cmake/GLOD.cmake4
-rwxr-xr-xindra/cmake/GStreamer010Plugin.cmake6
-rwxr-xr-xindra/cmake/Glui.cmake6
-rwxr-xr-xindra/cmake/GoogleBreakpad.cmake6
-rwxr-xr-xindra/cmake/GooglePerfTools.cmake6
-rwxr-xr-xindra/cmake/Hunspell.cmake6
-rwxr-xr-xindra/cmake/JPEG.cmake6
-rwxr-xr-xindra/cmake/JsonCpp.cmake6
-rw-r--r--[-rwxr-xr-x]indra/cmake/LLAddBuildTest.cmake10
-rwxr-xr-xindra/cmake/LLWindow.cmake6
-rwxr-xr-xindra/cmake/NDOF.cmake6
-rwxr-xr-xindra/cmake/OPENAL.cmake6
-rwxr-xr-xindra/cmake/OpenJPEG.cmake6
-rwxr-xr-xindra/cmake/OpenSSL.cmake6
-rwxr-xr-xindra/cmake/PNG.cmake6
-rwxr-xr-xindra/cmake/Prebuilt.cmake10
-rwxr-xr-xindra/cmake/PulseAudio.cmake4
-rwxr-xr-xindra/cmake/Tut.cmake4
-rwxr-xr-xindra/cmake/UI.cmake6
-rwxr-xr-xindra/cmake/Variables.cmake2
-rwxr-xr-xindra/cmake/ViewerMiscLibs.cmake4
-rwxr-xr-xindra/cmake/WebKitLibPlugin.cmake6
-rwxr-xr-xindra/cmake/XmlRpcEpi.cmake6
-rwxr-xr-xindra/cmake/ZLIB.cmake6
-rwxr-xr-xindra/llcommon/llmemory.h3
-rwxr-xr-xindra/llcommon/llsdserialize.cpp2
-rwxr-xr-xindra/llcommon/llsdserialize_xml.cpp2
-rwxr-xr-xindra/llcommon/llsys.cpp2
-rwxr-xr-xindra/llimage/llimagejpeg.h2
-rwxr-xr-xindra/llinventory/llfoldertype.cpp2
-rwxr-xr-xindra/llmath/llmath.h6
-rwxr-xr-xindra/llmath/lloctree.h15
-rwxr-xr-xindra/llmath/llquaternion.cpp449
-rwxr-xr-xindra/llmath/llquaternion.h50
-rwxr-xr-xindra/llmath/v3dmath.h65
-rwxr-xr-xindra/llmath/v3math.h34
-rwxr-xr-xindra/llmessage/llares.h2
-rwxr-xr-xindra/llmessage/llhttpassetstorage.cpp2
-rwxr-xr-xindra/llmessage/lltransfermanager.cpp8
-rwxr-xr-xindra/llprimitive/llmodel.cpp2
-rwxr-xr-xindra/llui/llchatentry.cpp10
-rwxr-xr-xindra/llui/llfolderview.cpp22
-rwxr-xr-xindra/llui/llkeywords.cpp508
-rwxr-xr-xindra/llui/llkeywords.h119
-rwxr-xr-xindra/llui/llnotifications.cpp1
-rwxr-xr-xindra/llui/llnotifications.h8
-rw-r--r--indra/llui/llnotificationslistener.cpp27
-rwxr-xr-xindra/llui/lltextbase.cpp54
-rwxr-xr-xindra/llui/lltextbase.h40
-rwxr-xr-xindra/llui/lltexteditor.cpp129
-rwxr-xr-xindra/llui/lltexteditor.h56
-rwxr-xr-xindra/llui/lltooltip.cpp3
-rwxr-xr-xindra/llui/llxuiparser.cpp2
-rwxr-xr-xindra/llvfs/llvfile.cpp2
-rwxr-xr-xindra/llvfs/tests/lldiriterator_test.cpp6
-rwxr-xr-xindra/llwindow/lldxhardware.cpp178
-rwxr-xr-xindra/llwindow/llwindow.cpp4
-rwxr-xr-xindra/llwindow/llwindowmacosx.cpp27
-rwxr-xr-xindra/llwindow/llwindowsdl.cpp4
-rwxr-xr-xindra/llwindow/llwindowwin32.cpp34
-rwxr-xr-xindra/llxml/llxmlnode.h2
-rwxr-xr-xindra/llxml/llxmlparser.h2
-rwxr-xr-xindra/newview/CMakeLists.txt27
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rwxr-xr-xindra/newview/app_settings/keywords_lsl_default.xml18289
-rwxr-xr-xindra/newview/app_settings/llsd-lsl-syntax.rng390
-rwxr-xr-xindra/newview/app_settings/settings.xml497
-rwxr-xr-xindra/newview/featuretable_mac.txt6
-rwxr-xr-xindra/newview/installers/windows/installer_template.nsi187
-rwxr-xr-xindra/newview/installers/windows/lang_da.nsibin7108 -> 8026 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_de.nsibin8260 -> 9346 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_en-us.nsibin7542 -> 8120 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_es.nsibin7846 -> 8764 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_fr.nsibin8114 -> 9030 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_it.nsibin7438 -> 8372 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_ja.nsibin6302 -> 7288 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_pl.nsibin7450 -> 8426 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_pt-br.nsibin7832 -> 8788 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_ru.nsibin7598 -> 8144 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_tr.nsibin7722 -> 8266 bytes
-rwxr-xr-xindra/newview/installers/windows/lang_zh.nsibin5824 -> 6798 bytes
-rwxr-xr-xindra/newview/llagent.cpp17
-rwxr-xr-xindra/newview/llagentcamera.cpp2
-rwxr-xr-xindra/newview/llagentwearables.cpp61
-rwxr-xr-xindra/newview/llappearancemgr.cpp27
-rwxr-xr-xindra/newview/llappviewer.cpp14
-rwxr-xr-xindra/newview/llcolorswatch.h3
-rwxr-xr-xindra/newview/llconversationmodel.cpp9
-rw-r--r--indra/newview/llconversationmodel.h2
-rwxr-xr-xindra/newview/lldrawpoolbump.cpp2
-rwxr-xr-xindra/newview/llfloaterabout.cpp8
-rwxr-xr-xindra/newview/llfloateravatarpicker.cpp4
-rwxr-xr-xindra/newview/llfloaterbvhpreview.cpp2
-rwxr-xr-xindra/newview/llfloatercolorpicker.cpp14
-rwxr-xr-xindra/newview/llfloatergesture.cpp26
-rw-r--r--indra/newview/llfloatergotoline.cpp2
-rw-r--r--indra/newview/llfloatergroupbulkban.cpp134
-rw-r--r--indra/newview/llfloatergroupbulkban.h48
-rwxr-xr-xindra/newview/llfloaterimcontainer.cpp118
-rwxr-xr-xindra/newview/llfloaterimcontainer.h4
-rwxr-xr-xindra/newview/llfloaternamedesc.cpp6
-rwxr-xr-xindra/newview/llfloaterperms.cpp229
-rwxr-xr-xindra/newview/llfloaterperms.h55
-rwxr-xr-xindra/newview/llfloaterpreference.cpp9
-rwxr-xr-xindra/newview/llfloaterpreference.h1
-rw-r--r--indra/newview/llfloaterscriptedprefs.cpp65
-rw-r--r--indra/newview/llfloaterscriptedprefs.h51
-rwxr-xr-xindra/newview/llfloatertools.cpp6
-rwxr-xr-xindra/newview/llfloaterwebcontent.cpp16
-rwxr-xr-xindra/newview/llfloaterwebcontent.h1
-rwxr-xr-xindra/newview/llgroupactions.cpp5
-rwxr-xr-xindra/newview/llgroupmgr.cpp200
-rwxr-xr-xindra/newview/llgroupmgr.h81
-rwxr-xr-xindra/newview/llimview.cpp35
-rwxr-xr-xindra/newview/llimview.h8
-rwxr-xr-xindra/newview/llinventorybridge.cpp42
-rwxr-xr-xindra/newview/llinventorybridge.h1
-rwxr-xr-xindra/newview/llinventorypanel.cpp8
-rwxr-xr-xindra/newview/lllocalbitmaps.cpp17
-rwxr-xr-xindra/newview/lllocalbitmaps.h1
-rwxr-xr-xindra/newview/llmaniprotate.cpp29
-rwxr-xr-xindra/newview/llmanipscale.cpp713
-rwxr-xr-xindra/newview/llmanipscale.h53
-rwxr-xr-xindra/newview/llmaniptranslate.cpp13
-rwxr-xr-xindra/newview/llmaniptranslate.h2
-rwxr-xr-xindra/newview/llmeshrepository.cpp6
-rwxr-xr-xindra/newview/llnamelistctrl.cpp62
-rwxr-xr-xindra/newview/llnamelistctrl.h26
-rwxr-xr-xindra/newview/llpanelcontents.cpp11
-rw-r--r--indra/newview/llpanelgroupbulk.cpp421
-rw-r--r--indra/newview/llpanelgroupbulk.h74
-rw-r--r--indra/newview/llpanelgroupbulkban.cpp259
-rw-r--r--indra/newview/llpanelgroupbulkban.h49
-rw-r--r--indra/newview/llpanelgroupbulkimpl.h99
-rwxr-xr-xindra/newview/llpanelgroupinvite.cpp9
-rwxr-xr-xindra/newview/llpanelgrouplandmoney.cpp33
-rwxr-xr-xindra/newview/llpanelgrouproles.cpp846
-rwxr-xr-xindra/newview/llpanelgrouproles.h70
-rwxr-xr-xindra/newview/llpanelland.cpp2
-rwxr-xr-xindra/newview/llpanellandmarks.cpp1
-rwxr-xr-xindra/newview/llpanelplaceprofile.cpp10
-rwxr-xr-xindra/newview/llpanelplaceprofile.h1
-rwxr-xr-xindra/newview/llpanelteleporthistory.cpp62
-rwxr-xr-xindra/newview/llpreview.cpp2
-rwxr-xr-xindra/newview/llpreviewscript.cpp105
-rwxr-xr-xindra/newview/llpreviewscript.h20
-rw-r--r--indra/newview/llscripteditor.cpp289
-rw-r--r--indra/newview/llscripteditor.h70
-rwxr-xr-xindra/newview/llsidepanelinventory.cpp12
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp4
-rwxr-xr-xindra/newview/llspatialpartition.cpp1
-rwxr-xr-xindra/newview/llstartup.cpp1
-rw-r--r--indra/newview/llsyntaxid.cpp330
-rw-r--r--indra/newview/llsyntaxid.h73
-rwxr-xr-xindra/newview/lltexturefetch.cpp4
-rwxr-xr-xindra/newview/lltoastnotifypanel.cpp2
-rwxr-xr-xindra/newview/lltooldraganddrop.cpp90
-rwxr-xr-xindra/newview/lltoolpie.cpp12
-rwxr-xr-xindra/newview/llviewercontrol.cpp1
-rwxr-xr-xindra/newview/llviewerfloaterreg.cpp4
-rw-r--r--indra/newview/llviewerfoldertype.cpp2
-rwxr-xr-xindra/newview/llviewerinventory.cpp129
-rwxr-xr-xindra/newview/llviewerinventory.h2
-rwxr-xr-xindra/newview/llviewermedia.cpp2
-rwxr-xr-xindra/newview/llviewermenu.cpp2
-rwxr-xr-xindra/newview/llviewermenufile.cpp12
-rwxr-xr-xindra/newview/llviewermessage.cpp82
-rwxr-xr-xindra/newview/llviewerobject.cpp2
-rwxr-xr-xindra/newview/llviewerobjectlist.cpp3
-rwxr-xr-xindra/newview/llviewerregion.cpp39
-rwxr-xr-xindra/newview/llviewerwindow.cpp2
-rwxr-xr-xindra/newview/llvoicevivox.cpp2
-rwxr-xr-xindra/newview/llvoicevivox.h2
-rwxr-xr-xindra/newview/llvovolume.cpp4
-rwxr-xr-xindra/newview/pipeline.cpp62
-rw-r--r--[-rwxr-xr-x]indra/newview/roles_constants.h102
-rwxr-xr-xindra/newview/skins/default/colors.xml44
-rwxr-xr-xindra/newview/skins/default/textures/textures.xml6
-rwxr-xr-xindra/newview/skins/default/xui/da/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_about.xml2
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_buy_object.xml4
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_perm_prefs.xml108
-rw-r--r--indra/newview/skins/default/xui/en/floater_perms_default.xml503
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_region_debug_console.xml1
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_report_abuse.xml128
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_ed_prefs.xml359
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_tools.xml20
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_conversation.xml9
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_inventory_add.xml7
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_object.xml19
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_viewer.xml27
-rwxr-xr-xindra/newview/skins/default/xui/en/notifications.xml63
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_bulk_ban.xml108
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_group_invite.xml4
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_group_roles.xml946
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_place_profile.xml18
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_preferences_advanced.xml11
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_script_ed.xml30
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_teleport_history_item.xml15
-rwxr-xr-xindra/newview/skins/default/xui/en/role_actions.xml5
-rw-r--r--indra/newview/skins/default/xui/en/script_editor.xml11
-rwxr-xr-xindra/newview/skins/default/xui/en/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_preferences_privacy.xml4
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/pl/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_preferences_privacy.xml2
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_preferences_privacy.xml2
-rwxr-xr-xindra/test/llsdmessagebuilder_tut.cpp2
-rwxr-xr-xindra/test/lltemplatemessagebuilder_tut.cpp4
231 files changed, 26733 insertions, 2922 deletions
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 244110ff66..52b0f4e8b4 100755
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -174,12 +174,12 @@ if (LINUX)
endif (WORD_SIZE EQUAL 32)
add_definitions(-mfpmath=sse)
#add_definitions(-ftree-vectorize) # THIS CRASHES GCC 3.1-3.2
- if (NOT STANDALONE)
+ if (NOT USESYSTEMLIBS)
# this stops us requiring a really recent glibc at runtime
add_definitions(-fno-stack-protector)
# linking can be very memory-hungry, especially the final viewer link
set(CMAKE_CXX_LINK_FLAGS "-Wl,--no-keep-memory")
- endif (NOT STANDALONE)
+ endif (NOT USESYSTEMLIBS)
set(CMAKE_CXX_FLAGS_DEBUG "-fno-inline ${CMAKE_CXX_FLAGS_DEBUG}")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 ${CMAKE_CXX_FLAGS_RELEASE}")
@@ -226,14 +226,14 @@ if (LINUX OR DARWIN)
endif (LINUX OR DARWIN)
-if (STANDALONE)
- add_definitions(-DLL_STANDALONE=1)
+if (USESYSTEMLIBS)
+ add_definitions(-DLL_USESYSTEMLIBS=1)
if (LINUX AND ${ARCH} STREQUAL "i686")
add_definitions(-march=pentiumpro)
endif (LINUX AND ${ARCH} STREQUAL "i686")
-else (STANDALONE)
+else (USESYSTEMLIBS)
set(${ARCH}_linux_INCLUDES
ELFIO
atk-1.0
@@ -242,6 +242,6 @@ else (STANDALONE)
gtk-2.0
pango-1.0
)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED)
diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake
index a87027f5f6..1a01671002 100755
--- a/indra/cmake/APR.cmake
+++ b/indra/cmake/APR.cmake
@@ -8,9 +8,9 @@ set(APR_FIND_REQUIRED ON)
set(APRUTIL_FIND_QUIETLY ON)
set(APRUTIL_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindAPR)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(apr_suite)
if (WINDOWS)
if (LLCOMMON_LINK_SHARED)
@@ -52,4 +52,4 @@ else (STANDALONE)
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} rt)
endif (LINUX)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/Audio.cmake b/indra/cmake/Audio.cmake
index d23bc2f9c6..876b7f82a8 100755
--- a/indra/cmake/Audio.cmake
+++ b/indra/cmake/Audio.cmake
@@ -1,13 +1,13 @@
# -*- cmake -*-
include(Prebuilt)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindPkgConfig)
pkg_check_modules(OGG REQUIRED ogg)
pkg_check_modules(VORBIS REQUIRED vorbis)
pkg_check_modules(VORBISENC REQUIRED vorbisenc)
pkg_check_modules(VORBISFILE REQUIRED vorbisfile)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(ogg-vorbis)
set(VORBIS_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
set(VORBISENC_INCLUDE_DIRS ${VORBIS_INCLUDE_DIRS})
@@ -32,7 +32,7 @@ else (STANDALONE)
set(VORBISENC_LIBRARIES vorbisenc)
set(VORBISFILE_LIBRARIES vorbisfile)
endif (WINDOWS)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
link_directories(
${VORBIS_LIBRARY_DIRS}
diff --git a/indra/cmake/BerkeleyDB.cmake b/indra/cmake/BerkeleyDB.cmake
index 57b53f46ff..5f6b644a15 100755
--- a/indra/cmake/BerkeleyDB.cmake
+++ b/indra/cmake/BerkeleyDB.cmake
@@ -3,9 +3,9 @@
set(DB_FIND_QUIETLY ON)
set(DB_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindBerkeleyDB)
-else (STANDALONE)
+else (USESYSTEMLIBS)
if (LINUX)
# Need to add dependency pthread explicitely to support ld.gold.
use_prebuilt_binary(db)
@@ -14,4 +14,4 @@ else (STANDALONE)
set(DB_LIBRARIES db-4.2)
endif (LINUX)
set(DB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake
index 348521a77c..25e54b7cbd 100755
--- a/indra/cmake/Boost.cmake
+++ b/indra/cmake/Boost.cmake
@@ -4,7 +4,7 @@ include(Prebuilt)
set(Boost_FIND_QUIETLY ON)
set(Boost_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindBoost)
set(BOOST_CONTEXT_LIBRARY boost_context-mt)
@@ -15,7 +15,7 @@ if (STANDALONE)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
set(BOOST_SYSTEM_LIBRARY boost_system-mt)
set(BOOST_THREAD_LIBRARY boost_thread-mt)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(boost)
set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
set(BOOST_VERSION "1.55")
@@ -122,4 +122,4 @@ else (STANDALONE)
optimized boost_thread-mt
debug boost_thread-mt-d)
endif (WINDOWS)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/CARes.cmake b/indra/cmake/CARes.cmake
index b0dac5b12f..baa55aa49d 100755
--- a/indra/cmake/CARes.cmake
+++ b/indra/cmake/CARes.cmake
@@ -5,9 +5,9 @@ include(Prebuilt)
set(CARES_FIND_QUIETLY ON)
set(CARES_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindCARes)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(ares)
add_definitions("-DCARES_STATICLIB")
if (WINDOWS)
@@ -18,4 +18,4 @@ else (STANDALONE)
set(CARES_LIBRARIES cares)
endif (WINDOWS)
set(CARES_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/ares)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake
index 9aba08e573..04afae594d 100755
--- a/indra/cmake/CURL.cmake
+++ b/indra/cmake/CURL.cmake
@@ -4,9 +4,9 @@ include(Prebuilt)
set(CURL_FIND_QUIETLY ON)
set(CURL_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindCURL)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(curl)
if (WINDOWS)
set(CURL_LIBRARIES
@@ -16,4 +16,4 @@ else (STANDALONE)
set(CURL_LIBRARIES libcurl.a)
endif (WINDOWS)
set(CURL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 8cd1e3e63b..28202f85d6 100755
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -355,9 +355,9 @@ copy_if_different(
)
set(third_party_targets ${third_party_targets} ${out_targets})
-if(NOT STANDALONE)
+if(NOT USESYSTEMLIBS)
add_custom_target(
stage_third_party_libs ALL
DEPENDS ${third_party_targets}
)
-endif(NOT STANDALONE)
+endif(NOT USESYSTEMLIBS)
diff --git a/indra/cmake/DBusGlib.cmake b/indra/cmake/DBusGlib.cmake
index 83c08d3350..d148a35a5b 100755
--- a/indra/cmake/DBusGlib.cmake
+++ b/indra/cmake/DBusGlib.cmake
@@ -1,7 +1,7 @@
# -*- cmake -*-
include(Prebuilt)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindPkgConfig)
pkg_check_modules(DBUSGLIB REQUIRED dbus-glib-1)
@@ -18,7 +18,7 @@ elseif (LINUX)
gobject-2.0
glib-2.0
)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
if (DBUSGLIB_FOUND)
set(DBUSGLIB ON CACHE BOOL "Build with dbus-glib message bus support.")
diff --git a/indra/cmake/EXPAT.cmake b/indra/cmake/EXPAT.cmake
index acb15dc623..c1155531ff 100755
--- a/indra/cmake/EXPAT.cmake
+++ b/indra/cmake/EXPAT.cmake
@@ -4,9 +4,9 @@ include(Prebuilt)
set(EXPAT_FIND_QUIETLY ON)
set(EXPAT_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindEXPAT)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(expat)
if (WINDOWS)
set(EXPAT_LIBRARIES libexpatMT)
@@ -14,4 +14,4 @@ else (STANDALONE)
set(EXPAT_LIBRARIES expat)
endif (WINDOWS)
set(EXPAT_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/ExamplePlugin.cmake b/indra/cmake/ExamplePlugin.cmake
index 599787ad21..5d826c1f66 100755
--- a/indra/cmake/ExamplePlugin.cmake
+++ b/indra/cmake/ExamplePlugin.cmake
@@ -2,13 +2,13 @@
include(Linking)
include(Prebuilt)
-if (STANDALONE)
+if (USESYSTEMLIBS)
set(EXAMPLEPLUGIN OFF CACHE BOOL
"EXAMPLEPLUGIN support for the llplugin/llmedia test apps.")
-else (STANDALONE)
+else (USESYSTEMLIBS)
set(EXAMPLEPLUGIN ON CACHE BOOL
"EXAMPLEPLUGIN support for the llplugin/llmedia test apps.")
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
if (WINDOWS)
elseif (DARWIN)
diff --git a/indra/cmake/FMODEX.cmake b/indra/cmake/FMODEX.cmake
index 65bc1cabeb..720933d1b7 100644
--- a/indra/cmake/FMODEX.cmake
+++ b/indra/cmake/FMODEX.cmake
@@ -4,17 +4,17 @@
# When building using proprietary binaries though (i.e. having access to LL private servers),
# we always build with FMODEX.
# Open source devs should use the -DFMODEX:BOOL=ON then if they want to build with FMOD, whether
-# they are using STANDALONE or not.
+# they are using USESYSTEMLIBS or not.
if (INSTALL_PROPRIETARY)
set(FMODEX ON CACHE BOOL "Using FMOD Ex sound library.")
endif (INSTALL_PROPRIETARY)
if (FMODEX)
- if (STANDALONE)
+ if (USESYSTEMLIBS)
# In that case, we use the version of the library installed on the system
set(FMODEX_FIND_REQUIRED ON)
include(FindFMODEX)
- else (STANDALONE)
+ else (USESYSTEMLIBS)
if (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR)
# If the path have been specified in the arguments, use that
set(FMODEX_LIBRARIES ${FMODEX_LIBRARY})
@@ -41,6 +41,6 @@ if (FMODEX)
set(FMODEX_LIBRARIES ${FMODEX_LIBRARY})
set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/fmodex)
endif (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR)
- endif (STANDALONE)
+ endif (USESYSTEMLIBS)
endif (FMODEX)
diff --git a/indra/cmake/FindJsonCpp.cmake b/indra/cmake/FindJsonCpp.cmake
index 0b056ada58..9398779cff 100755
--- a/indra/cmake/FindJsonCpp.cmake
+++ b/indra/cmake/FindJsonCpp.cmake
@@ -23,10 +23,10 @@ EXEC_PROGRAM(${CMAKE_CXX_COMPILER}
# Try to find a library that was compiled with the same compiler version as we currently use.
SET(JSONCPP_NAMES ${JSONCPP_NAMES} libjson_linux-gcc-${_gcc_COMPILER_VERSION}_libmt.so)
-IF (STANDALONE)
+IF (USESYSTEMLIBS)
# On standalone, assume that the system installed library was compiled with the used compiler.
SET(JSONCPP_NAMES ${JSONCPP_NAMES} libjson.so)
-ENDIF (STANDALONE)
+ENDIF (USESYSTEMLIBS)
FIND_LIBRARY(JSONCPP_LIBRARY
NAMES ${JSONCPP_NAMES}
PATHS /usr/lib /usr/local/lib
diff --git a/indra/cmake/FreeType.cmake b/indra/cmake/FreeType.cmake
index d5bbfc7d84..a36485f6d0 100755
--- a/indra/cmake/FreeType.cmake
+++ b/indra/cmake/FreeType.cmake
@@ -1,14 +1,14 @@
# -*- cmake -*-
include(Prebuilt)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindPkgConfig)
pkg_check_modules(FREETYPE REQUIRED freetype2)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(freetype)
set(FREETYPE_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/freetype2/)
set(FREETYPE_LIBRARIES freetype)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
link_directories(${FREETYPE_LIBRARY_DIRS})
diff --git a/indra/cmake/GLEXT.cmake b/indra/cmake/GLEXT.cmake
index 0a3dd976b4..a749644202 100644
--- a/indra/cmake/GLEXT.cmake
+++ b/indra/cmake/GLEXT.cmake
@@ -1,8 +1,8 @@
# -*- cmake -*-
include(Prebuilt)
-if (NOT STANDALONE)
+if (NOT USESYSTEMLIBS)
use_prebuilt_binary(glext)
use_prebuilt_binary(glh_linear)
set(GLEXT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
-endif (NOT STANDALONE)
+endif (NOT USESYSTEMLIBS)
diff --git a/indra/cmake/GLH.cmake b/indra/cmake/GLH.cmake
index 911dbe4017..d5262f2efa 100755
--- a/indra/cmake/GLH.cmake
+++ b/indra/cmake/GLH.cmake
@@ -4,8 +4,8 @@ include(Prebuilt)
set(GLH_FIND_REQUIRED TRUE)
set(GLH_FIND_QUIETLY TRUE)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindGLH)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(glh_linear)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/GLOD.cmake b/indra/cmake/GLOD.cmake
index 6bdbaf621e..3683768af9 100755
--- a/indra/cmake/GLOD.cmake
+++ b/indra/cmake/GLOD.cmake
@@ -1,9 +1,9 @@
# -*- cmake -*-
include(Prebuilt)
-if (NOT STANDALONE)
+if (NOT USESYSTEMLIBS)
use_prebuilt_binary(GLOD)
-endif (NOT STANDALONE)
+endif (NOT USESYSTEMLIBS)
set(GLOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
set(GLOD_LIBRARIES GLOD)
diff --git a/indra/cmake/GStreamer010Plugin.cmake b/indra/cmake/GStreamer010Plugin.cmake
index 8918ee0c90..3fbc40ef8f 100755
--- a/indra/cmake/GStreamer010Plugin.cmake
+++ b/indra/cmake/GStreamer010Plugin.cmake
@@ -1,14 +1,14 @@
# -*- cmake -*-
include(Prebuilt)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindPkgConfig)
pkg_check_modules(GSTREAMER010 REQUIRED gstreamer-0.10)
pkg_check_modules(GSTREAMER010_PLUGINS_BASE REQUIRED gstreamer-plugins-base-0.10)
elseif (LINUX)
use_prebuilt_binary(gstreamer)
- # possible libxml should have its own .cmake file instead
+ # possible libxml2 should have its own .cmake file instead
use_prebuilt_binary(libxml2)
set(GSTREAMER010_FOUND ON FORCE BOOL)
set(GSTREAMER010_PLUGINS_BASE_FOUND ON FORCE BOOL)
@@ -26,7 +26,7 @@ elseif (LINUX)
gthread-2.0
glib-2.0
)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
if (GSTREAMER010_FOUND AND GSTREAMER010_PLUGINS_BASE_FOUND)
set(GSTREAMER010 ON CACHE BOOL "Build with GStreamer-0.10 streaming media support.")
diff --git a/indra/cmake/Glui.cmake b/indra/cmake/Glui.cmake
index f62a56856c..db353a91ec 100755
--- a/indra/cmake/Glui.cmake
+++ b/indra/cmake/Glui.cmake
@@ -2,14 +2,14 @@
include(Linking)
include(Prebuilt)
-if (STANDALONE)
+if (USESYSTEMLIBS)
set(GLUI OFF CACHE BOOL
"GLUI support for the llplugin/llmedia test apps.")
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(glui)
set(GLUI ON CACHE BOOL
"GLUI support for the llplugin/llmedia test apps.")
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
if (LINUX)
set(GLUI ON CACHE BOOL
diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake
index 7f9ba4ea8e..829e1ac08a 100755
--- a/indra/cmake/GoogleBreakpad.cmake
+++ b/indra/cmake/GoogleBreakpad.cmake
@@ -1,10 +1,10 @@
# -*- cmake -*-
include(Prebuilt)
-if (STANDALONE)
+if (USESYSTEMLIBS)
set(BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED ON)
include(FindGoogleBreakpad)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(google_breakpad)
if (DARWIN)
set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler)
@@ -18,5 +18,5 @@ else (STANDALONE)
# yes, this does look dumb, no, it's not incorrect
#
set(BREAKPAD_INCLUDE_DIRECTORIES "${LIBS_PREBUILT_DIR}/include/google_breakpad" "${LIBS_PREBUILT_DIR}/include/google_breakpad/google_breakpad")
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake
index f3fd008e49..c1faeb9325 100755
--- a/indra/cmake/GooglePerfTools.cmake
+++ b/indra/cmake/GooglePerfTools.cmake
@@ -5,9 +5,9 @@ include(Prebuilt)
# set ON or OFF as desired.
set (USE_TCMALLOC OFF)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindGooglePerfTools)
-else (STANDALONE)
+else (USESYSTEMLIBS)
if (WINDOWS)
if (USE_TCMALLOC)
use_prebuilt_binary(gperftools)
@@ -34,7 +34,7 @@ else (STANDALONE)
${LIBS_PREBUILT_DIR}/include)
set(GOOGLE_PERFTOOLS_FOUND "YES")
endif (LINUX)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
if (GOOGLE_PERFTOOLS_FOUND)
# XXX Disable temporarily, until we have compilation issues on 64-bit
diff --git a/indra/cmake/Hunspell.cmake b/indra/cmake/Hunspell.cmake
index 0c9cf93316..ef74d95b2a 100755
--- a/indra/cmake/Hunspell.cmake
+++ b/indra/cmake/Hunspell.cmake
@@ -4,9 +4,9 @@ include(Prebuilt)
set(HUNSPELL_FIND_QUIETLY ON)
set(HUNSPELL_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindHUNSPELL)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(libhunspell)
if (WINDOWS)
set(HUNSPELL_LIBRARY libhunspell)
@@ -19,4 +19,4 @@ else (STANDALONE)
endif()
set(HUNSPELL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/hunspell)
use_prebuilt_binary(dictionaries)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/JPEG.cmake b/indra/cmake/JPEG.cmake
index 4f99efd602..d6da22aecc 100755
--- a/indra/cmake/JPEG.cmake
+++ b/indra/cmake/JPEG.cmake
@@ -5,9 +5,9 @@ include(Linking)
set(JPEG_FIND_QUIETLY ON)
set(JPEG_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindJPEG)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(jpeglib)
if (LINUX)
set(JPEG_LIBRARIES jpeg)
@@ -17,4 +17,4 @@ else (STANDALONE)
set(JPEG_LIBRARIES jpeglib)
endif (LINUX)
set(JPEG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake
index 7ad73e5683..0aab2d6634 100755
--- a/indra/cmake/JsonCpp.cmake
+++ b/indra/cmake/JsonCpp.cmake
@@ -5,9 +5,9 @@ include(Prebuilt)
set(JSONCPP_FIND_QUIETLY ON)
set(JSONCPP_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindJsonCpp)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(jsoncpp)
if (WINDOWS)
set(JSONCPP_LIBRARIES
@@ -19,4 +19,4 @@ else (STANDALONE)
set(JSONCPP_LIBRARIES libjson_linux-gcc-4.1.3_libmt.a)
endif (WINDOWS)
set(JSONCPP_INCLUDE_DIR "${LIBS_PREBUILT_DIR}/include/jsoncpp" "${LIBS_PREBUILT_DIR}/include/json")
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index 068aeea212..804624f5ec 100755..100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -202,9 +202,9 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
- if(STANDALONE)
+ if(USESYSTEMLIBS)
SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES COMPILE_FLAGS -I"${TUT_INCLUDE_DIR}")
- endif(STANDALONE)
+ endif(USESYSTEMLIBS)
# The following was copied to llcorehttp/CMakeLists.txt's texture_load target.
# Any changes made here should be replicated there.
@@ -275,10 +275,10 @@ MACRO(SET_TEST_PATH LISTVAR)
set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources ${SHARED_LIB_STAGING_DIR}/Release/Resources /usr/lib)
ELSE(WINDOWS)
# Linux uses a single staging directory anyway.
- IF (STANDALONE)
+ IF (USESYSTEMLIBS)
set(${LISTVAR} ${CMAKE_BINARY_DIR}/llcommon /usr/lib /usr/local/lib)
- ELSE (STANDALONE)
+ ELSE (USESYSTEMLIBS)
set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} /usr/lib)
- ENDIF (STANDALONE)
+ ENDIF (USESYSTEMLIBS)
ENDIF(WINDOWS)
ENDMACRO(SET_TEST_PATH)
diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake
index ad732ef650..ba07a80f05 100755
--- a/indra/cmake/LLWindow.cmake
+++ b/indra/cmake/LLWindow.cmake
@@ -4,7 +4,7 @@ include(Variables)
include(GLEXT)
include(Prebuilt)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindSDL)
# This should be done by FindSDL. Sigh.
@@ -13,14 +13,14 @@ if (STANDALONE)
SDL_INCLUDE_DIR
SDL_LIBRARY
)
-else (STANDALONE)
+else (USESYSTEMLIBS)
if (LINUX)
use_prebuilt_binary(SDL)
set (SDL_FOUND TRUE)
set (SDL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/i686-linux)
set (SDL_LIBRARY SDL directfb fusion direct)
endif (LINUX)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
if (SDL_FOUND)
include_directories(${SDL_INCLUDE_DIR})
diff --git a/indra/cmake/NDOF.cmake b/indra/cmake/NDOF.cmake
index be6fe415f2..e72845db53 100755
--- a/indra/cmake/NDOF.cmake
+++ b/indra/cmake/NDOF.cmake
@@ -4,10 +4,10 @@ include(Prebuilt)
set(NDOF ON CACHE BOOL "Use NDOF space navigator joystick library.")
if (NDOF)
- if (STANDALONE)
+ if (USESYSTEMLIBS)
set(NDOF_FIND_REQUIRED ON)
include(FindNDOF)
- else (STANDALONE)
+ else (USESYSTEMLIBS)
use_prebuilt_binary(ndofdev)
if (WINDOWS)
@@ -18,7 +18,7 @@ if (NDOF)
set(NDOF_INCLUDE_DIR ${ARCH_PREBUILT_DIRS}/include/ndofdev)
set(NDOF_FOUND 1)
- endif (STANDALONE)
+ endif (USESYSTEMLIBS)
endif (NDOF)
if (NDOF_FOUND)
diff --git a/indra/cmake/OPENAL.cmake b/indra/cmake/OPENAL.cmake
index a3e1fb924e..c084d68de7 100755
--- a/indra/cmake/OPENAL.cmake
+++ b/indra/cmake/OPENAL.cmake
@@ -10,14 +10,14 @@ endif (LINUX)
if (OPENAL)
set(OPENAL_LIB_INCLUDE_DIRS "${LIBS_PREBUILT_DIR}/include/AL")
- if (STANDALONE)
+ if (USESYSTEMLIBS)
include(FindPkgConfig)
include(FindOpenAL)
pkg_check_modules(OPENAL_LIB REQUIRED openal)
pkg_check_modules(FREEALUT_LIB REQUIRED freealut)
- else (STANDALONE)
+ else (USESYSTEMLIBS)
use_prebuilt_binary(openal_soft)
- endif (STANDALONE)
+ endif (USESYSTEMLIBS)
if(WINDOWS)
set(OPENAL_LIBRARIES
OpenAL32
diff --git a/indra/cmake/OpenJPEG.cmake b/indra/cmake/OpenJPEG.cmake
index fcc82c2f49..bf0bde2ba7 100755
--- a/indra/cmake/OpenJPEG.cmake
+++ b/indra/cmake/OpenJPEG.cmake
@@ -4,9 +4,9 @@ include(Prebuilt)
set(OPENJPEG_FIND_QUIETLY ON)
set(OPENJPEG_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindOpenJPEG)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(openjpeg)
if(WINDOWS)
@@ -19,4 +19,4 @@ else (STANDALONE)
endif(WINDOWS)
set(OPENJPEG_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/openjpeg)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake
index a1c75ad489..eb548bdcc1 100755
--- a/indra/cmake/OpenSSL.cmake
+++ b/indra/cmake/OpenSSL.cmake
@@ -4,9 +4,9 @@ include(Prebuilt)
set(OpenSSL_FIND_QUIETLY ON)
set(OpenSSL_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindOpenSSL)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(openssl)
if (WINDOWS)
set(OPENSSL_LIBRARIES ssleay32 libeay32)
@@ -14,7 +14,7 @@ else (STANDALONE)
set(OPENSSL_LIBRARIES ssl crypto)
endif (WINDOWS)
set(OPENSSL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
if (LINUX)
set(CRYPTO_LIBRARIES crypto dl)
diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake
index 9653591f67..248a875a19 100755
--- a/indra/cmake/PNG.cmake
+++ b/indra/cmake/PNG.cmake
@@ -4,9 +4,9 @@ include(Prebuilt)
set(PNG_FIND_QUIETLY ON)
set(PNG_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindPNG)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(libpng)
if (WINDOWS)
set(PNG_LIBRARIES libpng16)
@@ -31,4 +31,4 @@ else (STANDALONE)
set(PNG_LIBRARIES png16)
set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng16)
endif()
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake
index ac0cbde253..e548805148 100755
--- a/indra/cmake/Prebuilt.cmake
+++ b/indra/cmake/Prebuilt.cmake
@@ -17,11 +17,11 @@ endif(INSTALL_PROPRIETARY)
# of previous attempts is serialized in the file
# ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
macro (use_prebuilt_binary _binary)
- if (NOT DEFINED STANDALONE_${_binary})
- set(STANDALONE_${_binary} ${STANDALONE})
- endif (NOT DEFINED STANDALONE_${_binary})
+ if (NOT DEFINED USESYSTEMLIBS_${_binary})
+ set(USESYSTEMLIBS_${_binary} ${USESYSTEMLIBS})
+ endif (NOT DEFINED USESYSTEMLIBS_${_binary})
- if (NOT STANDALONE_${_binary})
+ if (NOT USESYSTEMLIBS_${_binary})
if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed")
file(READ ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${_binary}_installed")
if(DEBUG_PREBUILT)
@@ -52,7 +52,7 @@ macro (use_prebuilt_binary _binary)
"Failed to download or unpack prebuilt '${_binary}'."
" Process returned ${${_binary}_installed}.")
endif (NOT ${_binary}_installed EQUAL 0)
- endif (NOT STANDALONE_${_binary})
+ endif (NOT USESYSTEMLIBS_${_binary})
endmacro (use_prebuilt_binary _binary)
endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED)
diff --git a/indra/cmake/PulseAudio.cmake b/indra/cmake/PulseAudio.cmake
index 360a971058..cce27f1bdd 100755
--- a/indra/cmake/PulseAudio.cmake
+++ b/indra/cmake/PulseAudio.cmake
@@ -4,7 +4,7 @@ include(Prebuilt)
set(PULSEAUDIO OFF CACHE BOOL "Build with PulseAudio support, if available.")
if (PULSEAUDIO)
- if (STANDALONE)
+ if (USESYSTEMLIBS)
include(FindPkgConfig)
pkg_check_modules(PULSEAUDIO libpulse)
@@ -20,7 +20,7 @@ if (PULSEAUDIO)
set(PULSEAUDIO_LIBRARIES
# none needed!
)
- endif (STANDALONE)
+ endif (USESYSTEMLIBS)
endif (PULSEAUDIO)
if (PULSEAUDIO_FOUND)
diff --git a/indra/cmake/Tut.cmake b/indra/cmake/Tut.cmake
index 7488e9dcb0..e11a3c3314 100755
--- a/indra/cmake/Tut.cmake
+++ b/indra/cmake/Tut.cmake
@@ -1,6 +1,6 @@
# -*- cmake -*-
include(Prebuilt)
-if (NOT STANDALONE)
+if (NOT USESYSTEMLIBS)
use_prebuilt_binary(tut)
-endif(NOT STANDALONE)
+endif(NOT USESYSTEMLIBS)
diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake
index d0fd4df03a..58acdc22bd 100755
--- a/indra/cmake/UI.cmake
+++ b/indra/cmake/UI.cmake
@@ -2,7 +2,7 @@
include(Prebuilt)
include(FreeType)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindPkgConfig)
if (LINUX)
@@ -31,7 +31,7 @@ if (STANDALONE)
list(APPEND UI_LIBRARIES ${${pkg}_LIBRARIES})
add_definitions(${${pkg}_CFLAGS_OTHERS})
endforeach(pkg)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(gtk-atk-pango-glib)
if (LINUX)
set(UI_LIBRARIES
@@ -59,7 +59,7 @@ else (STANDALONE)
foreach(include ${${LL_ARCH}_INCLUDES})
include_directories(${LIBS_PREBUILT_DIR}/include/${include})
endforeach(include)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
if (LINUX)
add_definitions(-DLL_GTK=1 -DLL_X11=1)
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 22d0a7f0fe..963b1bd386 100755
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -183,7 +183,7 @@ if (XCODE_VERSION GREATER 4.2)
endif (XCODE_VERSION GREATER 4.2)
set(VERSION_BUILD "0" CACHE STRING "Revision number passed in from the outside")
-set(STANDALONE OFF CACHE BOOL "Do not use Linden-supplied prebuilt libraries.")
+set(USESYSTEMLIBS OFF CACHE BOOL "Use libraries from your system rather than Linden-supplied prebuilt libraries.")
set(UNATTENDED OFF CACHE BOOL "Should be set to ON for building with VC Express editions.")
set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.")
diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake
index 5b00c989a4..d4be24799f 100755
--- a/indra/cmake/ViewerMiscLibs.cmake
+++ b/indra/cmake/ViewerMiscLibs.cmake
@@ -1,10 +1,10 @@
# -*- cmake -*-
include(Prebuilt)
-if (NOT STANDALONE)
+if (NOT USESYSTEMLIBS)
use_prebuilt_binary(libhunspell)
use_prebuilt_binary(libuuid)
use_prebuilt_binary(slvoice)
use_prebuilt_binary(fontconfig)
-endif(NOT STANDALONE)
+endif(NOT USESYSTEMLIBS)
diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake
index 89f7a6197b..f7c548a2fd 100755
--- a/indra/cmake/WebKitLibPlugin.cmake
+++ b/indra/cmake/WebKitLibPlugin.cmake
@@ -3,7 +3,7 @@ include(Linking)
include(Prebuilt)
include(OpenSSL)
-if (STANDALONE)
+if (USESYSTEMLIBS)
# The minimal version, 4.4.3, is rather arbitrary: it's the version in Debian/Lenny.
find_package(Qt4 4.4.3 COMPONENTS QtCore QtGui QtNetwork QtOpenGL QtWebKit REQUIRED)
include(${QT_USE_FILE})
@@ -29,11 +29,11 @@ if (STANDALONE)
list(APPEND QT_PLUGIN_LIBRARIES jpeg)
set(WEBKITLIBPLUGIN OFF CACHE BOOL
"WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(llqtwebkit)
set(WEBKITLIBPLUGIN ON CACHE BOOL
"WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
if (WINDOWS)
set(WEBKIT_PLUGIN_LIBRARIES
diff --git a/indra/cmake/XmlRpcEpi.cmake b/indra/cmake/XmlRpcEpi.cmake
index 5bd4848245..3a0caa0a06 100755
--- a/indra/cmake/XmlRpcEpi.cmake
+++ b/indra/cmake/XmlRpcEpi.cmake
@@ -4,9 +4,9 @@ include(Prebuilt)
set(XMLRPCEPI_FIND_QUIETLY ON)
set(XMLRPCEPI_FIND_REQUIRED ON)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindXmlRpcEpi)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(xmlrpc-epi)
if (WINDOWS)
set(XMLRPCEPI_LIBRARIES
@@ -17,4 +17,4 @@ else (STANDALONE)
set(XMLRPCEPI_LIBRARIES xmlrpc-epi)
endif (WINDOWS)
set(XMLRPCEPI_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/cmake/ZLIB.cmake b/indra/cmake/ZLIB.cmake
index 0470f3e797..6cff0753b2 100755
--- a/indra/cmake/ZLIB.cmake
+++ b/indra/cmake/ZLIB.cmake
@@ -5,9 +5,9 @@ set(ZLIB_FIND_REQUIRED ON)
include(Prebuilt)
-if (STANDALONE)
+if (USESYSTEMLIBS)
include(FindZLIB)
-else (STANDALONE)
+else (USESYSTEMLIBS)
use_prebuilt_binary(zlib)
if (WINDOWS)
set(ZLIB_LIBRARIES
@@ -32,4 +32,4 @@ else (STANDALONE)
set(ZLIB_LIBRARIES z)
endif (WINDOWS)
set(ZLIB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/zlib)
-endif (STANDALONE)
+endif (USESYSTEMLIBS)
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index db52f2b1f4..7d1d541a4b 100755
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -257,7 +257,8 @@ inline void ll_memcpy_nonaliased_aligned_16(char* __restrict dst, const char* __
assert((bytes % sizeof(F32))== 0);
ll_assert_aligned(src,16);
ll_assert_aligned(dst,16);
- assert((src < dst) ? ((src + bytes) < dst) : ((dst + bytes) < src));
+
+ assert((src < dst) ? ((src + bytes) <= dst) : ((dst + bytes) <= src));
assert(bytes%16==0);
char* end = dst + bytes;
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index b2add301f9..d49ff0feb5 100755
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -34,7 +34,7 @@
#include <iostream>
#include "apr_base64.h"
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
# include <zlib.h>
#else
# include "zlib/zlib.h" // for davep's dirty little zip functions
diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp
index e1a91f1367..8d72a1c329 100755
--- a/indra/llcommon/llsdserialize_xml.cpp
+++ b/indra/llcommon/llsdserialize_xml.cpp
@@ -35,7 +35,7 @@
extern "C"
{
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
# include <expat.h>
#else
# include "expat/expat.h"
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 07fe259e47..06e118aa44 100755
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -33,7 +33,7 @@
#include "llsys.h"
#include <iostream>
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
# include <zlib.h>
#else
# include "zlib/zlib.h"
diff --git a/indra/llimage/llimagejpeg.h b/indra/llimage/llimagejpeg.h
index 5b596d9fa4..2142660c81 100755
--- a/indra/llimage/llimagejpeg.h
+++ b/indra/llimage/llimagejpeg.h
@@ -33,7 +33,7 @@
#include "llwin32headerslean.h"
extern "C" {
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
# include <jpeglib.h>
# include <jerror.h>
#else
diff --git a/indra/llinventory/llfoldertype.cpp b/indra/llinventory/llfoldertype.cpp
index 8b568ea560..5f8aaae20b 100755
--- a/indra/llinventory/llfoldertype.cpp
+++ b/indra/llinventory/llfoldertype.cpp
@@ -92,7 +92,7 @@ LLFolderDictionary::LLFolderDictionary()
addEntry(LLFolderType::FT_MESH, new FolderEntry("mesh", TRUE));
- addEntry(LLFolderType::FT_INBOX, new FolderEntry("inbox", FALSE));
+ addEntry(LLFolderType::FT_INBOX, new FolderEntry("inbox", TRUE));
addEntry(LLFolderType::FT_OUTBOX, new FolderEntry("outbox", FALSE));
addEntry(LLFolderType::FT_BASIC_ROOT, new FolderEntry("basic_rt", TRUE));
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 29db799154..a8b27ad189 100755
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -1,4 +1,4 @@
-/**
+/**
* @file llmath.h
* @brief Useful math constants and macros.
*
@@ -73,6 +73,7 @@ const F32 F_E = 2.71828182845904523536f;
const F32 F_SQRT2 = 1.4142135623730950488016887242097f;
const F32 F_SQRT3 = 1.73205080756888288657986402541f;
const F32 OO_SQRT2 = 0.7071067811865475244008443621049f;
+const F32 OO_SQRT3 = 0.577350269189625764509f;
const F32 DEG_TO_RAD = 0.017453292519943295769236907684886f;
const F32 RAD_TO_DEG = 57.295779513082320876798154814105f;
const F32 F_APPROXIMATELY_ZERO = 0.00001f;
@@ -84,6 +85,9 @@ const F32 OO_LN2 = 1.4426950408889634073599246810019f;
const F32 F_ALMOST_ZERO = 0.0001f;
const F32 F_ALMOST_ONE = 1.0f - F_ALMOST_ZERO;
+const F32 GIMBAL_THRESHOLD = 0.000436f; // sets the gimballock threshold 0.025 away from +/-90 degrees
+// formula: GIMBAL_THRESHOLD = sin(DEG_TO_RAD * gimbal_threshold_angle);
+
// BUG: Eliminate in favor of F_APPROXIMATELY_ZERO above?
const F32 FP_MAG_THRESHOLD = 0.0000001f;
diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index 02220c41d8..7b5240c651 100755
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -36,6 +36,8 @@
extern U32 gOctreeMaxCapacity;
+extern float gOctreeMinSize;
+
/*#define LL_OCTREE_PARANOIA_CHECK 0
#if LL_DARWIN
#define LL_OCTREE_MAX_CAPACITY 32
@@ -106,6 +108,7 @@ public:
: mParent((oct_node*)parent),
mOctant(octant)
{
+ llassert(size[0] >= gOctreeMinSize*0.5f);
//always keep a NULL terminated list to avoid out of bounds exceptions in debug builds
mData.push_back(NULL);
mDataEnd = &mData[0];
@@ -213,7 +216,7 @@ public:
F32 size = mSize[0];
F32 p_size = size * 2.f;
- return (radius <= 0.001f && size <= 0.001f) ||
+ return (radius <= gOctreeMinSize && size <= gOctreeMinSize) ||
(radius <= p_size && radius > size);
}
@@ -319,7 +322,7 @@ public:
//is it here?
if (isInside(data->getPositionGroup()))
{
- if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) ||
+ if (((getElementCount() < gOctreeMaxCapacity || getSize()[0] <= gOctreeMinSize) && contains(data->getBinRadius()) ||
(data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= gOctreeMaxCapacity)))
{ //it belongs here
mData.push_back(NULL);
@@ -356,8 +359,9 @@ public:
LLVector4a val;
val.setSub(center, getCenter());
val.setAbs(val);
-
- S32 lt = val.lessThan(LLVector4a::getEpsilon()).getGatheredBits() & 0x7;
+ LLVector4a min_diff(gOctreeMinSize);
+
+ S32 lt = val.lessThan(min_diff).getGatheredBits() & 0x7;
if( lt == 0x7 )
{
@@ -389,6 +393,7 @@ public:
}
#endif
+ llassert(size[0] >= gOctreeMinSize*0.5f);
//make the new kid
child = new LLOctreeNode<T>(center, size, this);
addChild(child);
@@ -796,6 +801,8 @@ public:
this->setSize(size2);
this->updateMinMax();
+ llassert(size[0] >= gOctreeMinSize);
+
//copy our children to a new branch
LLOctreeNode<T>* newnode = new LLOctreeNode<T>(center, size, this);
diff --git a/indra/llmath/llquaternion.cpp b/indra/llmath/llquaternion.cpp
index 7381d5eb99..47374c287f 100755
--- a/indra/llmath/llquaternion.cpp
+++ b/indra/llmath/llquaternion.cpp
@@ -1,4 +1,4 @@
-/**
+/**
* @file llquaternion.cpp
* @brief LLQuaternion class implementation.
*
@@ -58,34 +58,40 @@ LLQuaternion::LLQuaternion(const LLMatrix3 &mat)
LLQuaternion::LLQuaternion(F32 angle, const LLVector4 &vec)
{
- LLVector3 v(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
- v.normalize();
-
- F32 c, s;
- c = cosf(angle*0.5f);
- s = sinf(angle*0.5f);
-
- mQ[VX] = v.mV[VX] * s;
- mQ[VY] = v.mV[VY] * s;
- mQ[VZ] = v.mV[VZ] * s;
- mQ[VW] = c;
- normalize();
+ F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ angle *= 0.5;
+ F32 c = cosf(angle);
+ F32 s = sinf(angle) / mag;
+ mQ[VX] = vec.mV[VX] * s;
+ mQ[VY] = vec.mV[VY] * s;
+ mQ[VZ] = vec.mV[VZ] * s;
+ mQ[VW] = c;
+ }
+ else
+ {
+ loadIdentity();
+ }
}
LLQuaternion::LLQuaternion(F32 angle, const LLVector3 &vec)
{
- LLVector3 v(vec);
- v.normalize();
-
- F32 c, s;
- c = cosf(angle*0.5f);
- s = sinf(angle*0.5f);
-
- mQ[VX] = v.mV[VX] * s;
- mQ[VY] = v.mV[VY] * s;
- mQ[VZ] = v.mV[VZ] * s;
- mQ[VW] = c;
- normalize();
+ F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ angle *= 0.5;
+ F32 c = cosf(angle);
+ F32 s = sinf(angle) / mag;
+ mQ[VX] = vec.mV[VX] * s;
+ mQ[VY] = vec.mV[VY] * s;
+ mQ[VZ] = vec.mV[VZ] * s;
+ mQ[VW] = c;
+ }
+ else
+ {
+ loadIdentity();
+ }
}
LLQuaternion::LLQuaternion(const LLVector3 &x_axis,
@@ -136,57 +142,61 @@ void LLQuaternion::quantize8(F32 lower, F32 upper)
const LLQuaternion& LLQuaternion::setAngleAxis(F32 angle, F32 x, F32 y, F32 z)
{
- LLVector3 vec(x, y, z);
- vec.normalize();
-
- angle *= 0.5f;
- F32 c, s;
- c = cosf(angle);
- s = sinf(angle);
-
- mQ[VX] = vec.mV[VX]*s;
- mQ[VY] = vec.mV[VY]*s;
- mQ[VZ] = vec.mV[VZ]*s;
- mQ[VW] = c;
-
- normalize();
+ F32 mag = sqrtf(x * x + y * y + z * z);
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ angle *= 0.5;
+ F32 c = cosf(angle);
+ F32 s = sinf(angle) / mag;
+ mQ[VX] = x * s;
+ mQ[VY] = y * s;
+ mQ[VZ] = z * s;
+ mQ[VW] = c;
+ }
+ else
+ {
+ loadIdentity();
+ }
return (*this);
}
const LLQuaternion& LLQuaternion::setAngleAxis(F32 angle, const LLVector3 &vec)
{
- LLVector3 v(vec);
- v.normalize();
-
- angle *= 0.5f;
- F32 c, s;
- c = cosf(angle);
- s = sinf(angle);
-
- mQ[VX] = v.mV[VX]*s;
- mQ[VY] = v.mV[VY]*s;
- mQ[VZ] = v.mV[VZ]*s;
- mQ[VW] = c;
-
- normalize();
+ F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ angle *= 0.5;
+ F32 c = cosf(angle);
+ F32 s = sinf(angle) / mag;
+ mQ[VX] = vec.mV[VX] * s;
+ mQ[VY] = vec.mV[VY] * s;
+ mQ[VZ] = vec.mV[VZ] * s;
+ mQ[VW] = c;
+ }
+ else
+ {
+ loadIdentity();
+ }
return (*this);
}
const LLQuaternion& LLQuaternion::setAngleAxis(F32 angle, const LLVector4 &vec)
{
- LLVector3 v(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
- v.normalize();
-
- F32 c, s;
- c = cosf(angle*0.5f);
- s = sinf(angle*0.5f);
-
- mQ[VX] = v.mV[VX]*s;
- mQ[VY] = v.mV[VY]*s;
- mQ[VZ] = v.mV[VZ]*s;
- mQ[VW] = c;
-
- normalize();
+ F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ angle *= 0.5;
+ F32 c = cosf(angle);
+ F32 s = sinf(angle) / mag;
+ mQ[VX] = vec.mV[VX] * s;
+ mQ[VY] = vec.mV[VY] * s;
+ mQ[VZ] = vec.mV[VZ] * s;
+ mQ[VW] = c;
+ }
+ else
+ {
+ loadIdentity();
+ }
return (*this);
}
@@ -219,68 +229,80 @@ const LLQuaternion& LLQuaternion::set(const LLMatrix4 &mat)
// deprecated
const LLQuaternion& LLQuaternion::setQuat(F32 angle, F32 x, F32 y, F32 z)
{
- LLVector3 vec(x, y, z);
- vec.normalize();
-
- angle *= 0.5f;
- F32 c, s;
- c = cosf(angle);
- s = sinf(angle);
-
- mQ[VX] = vec.mV[VX]*s;
- mQ[VY] = vec.mV[VY]*s;
- mQ[VZ] = vec.mV[VZ]*s;
- mQ[VW] = c;
-
- normalize();
+ F32 mag = sqrtf(x * x + y * y + z * z);
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ angle *= 0.5;
+ F32 c = cosf(angle);
+ F32 s = sinf(angle) / mag;
+ mQ[VX] = x * s;
+ mQ[VY] = y * s;
+ mQ[VZ] = z * s;
+ mQ[VW] = c;
+ }
+ else
+ {
+ loadIdentity();
+ }
return (*this);
}
// deprecated
const LLQuaternion& LLQuaternion::setQuat(F32 angle, const LLVector3 &vec)
{
- LLVector3 v(vec);
- v.normalize();
-
- angle *= 0.5f;
- F32 c, s;
- c = cosf(angle);
- s = sinf(angle);
-
- mQ[VX] = v.mV[VX]*s;
- mQ[VY] = v.mV[VY]*s;
- mQ[VZ] = v.mV[VZ]*s;
- mQ[VW] = c;
-
- normalize();
+ F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ angle *= 0.5;
+ F32 c = cosf(angle);
+ F32 s = sinf(angle) / mag;
+ mQ[VX] = vec.mV[VX] * s;
+ mQ[VY] = vec.mV[VY] * s;
+ mQ[VZ] = vec.mV[VZ] * s;
+ mQ[VW] = c;
+ }
+ else
+ {
+ loadIdentity();
+ }
return (*this);
}
const LLQuaternion& LLQuaternion::setQuat(F32 angle, const LLVector4 &vec)
{
- LLVector3 v(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
- v.normalize();
-
- F32 c, s;
- c = cosf(angle*0.5f);
- s = sinf(angle*0.5f);
-
- mQ[VX] = v.mV[VX]*s;
- mQ[VY] = v.mV[VY]*s;
- mQ[VZ] = v.mV[VZ]*s;
- mQ[VW] = c;
-
- normalize();
+ F32 mag = sqrtf(vec.mV[VX] * vec.mV[VX] + vec.mV[VY] * vec.mV[VY] + vec.mV[VZ] * vec.mV[VZ]);
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ angle *= 0.5;
+ F32 c = cosf(angle);
+ F32 s = sinf(angle) / mag;
+ mQ[VX] = vec.mV[VX] * s;
+ mQ[VY] = vec.mV[VY] * s;
+ mQ[VZ] = vec.mV[VZ] * s;
+ mQ[VW] = c;
+ }
+ else
+ {
+ loadIdentity();
+ }
return (*this);
}
const LLQuaternion& LLQuaternion::setQuat(F32 roll, F32 pitch, F32 yaw)
{
- LLMatrix3 rot_mat(roll, pitch, yaw);
- rot_mat.orthogonalize();
- *this = rot_mat.quaternion();
-
- normalize();
+ roll *= 0.5f;
+ pitch *= 0.5f;
+ yaw *= 0.5f;
+ F32 sinX = sinf(roll);
+ F32 cosX = cosf(roll);
+ F32 sinY = sinf(pitch);
+ F32 cosY = cosf(pitch);
+ F32 sinZ = sinf(yaw);
+ F32 cosZ = cosf(yaw);
+ mQ[VW] = cosX * cosY * cosZ - sinX * sinY * sinZ;
+ mQ[VX] = sinX * cosY * cosZ + cosX * sinY * sinZ;
+ mQ[VY] = cosX * sinY * cosZ - sinX * cosY * sinZ;
+ mQ[VZ] = cosX * cosY * sinZ + sinX * sinY * cosZ;
return (*this);
}
@@ -425,68 +447,44 @@ LLMatrix4 LLQuaternion::getMatrix4(void) const
// calculate the shortest rotation from a to b
void LLQuaternion::shortestArc(const LLVector3 &a, const LLVector3 &b)
{
- // Make a local copy of both vectors.
- LLVector3 vec_a = a;
- LLVector3 vec_b = b;
-
- // Make sure neither vector is zero length. Also normalize
- // the vectors while we are at it.
- F32 vec_a_mag = vec_a.normalize();
- F32 vec_b_mag = vec_b.normalize();
- if (vec_a_mag < F_APPROXIMATELY_ZERO ||
- vec_b_mag < F_APPROXIMATELY_ZERO)
- {
- // Can't calculate a rotation from this.
- // Just return ZERO_ROTATION instead.
- loadIdentity();
- return;
- }
-
- // Create an axis to rotate around, and the cos of the angle to rotate.
- LLVector3 axis = vec_a % vec_b;
- F32 cos_theta = vec_a * vec_b;
-
- // Check the angle between the vectors to see if they are parallel or anti-parallel.
- if (cos_theta > 1.0 - F_APPROXIMATELY_ZERO)
- {
- // a and b are parallel. No rotation is necessary.
- loadIdentity();
- }
- else if (cos_theta < -1.0 + F_APPROXIMATELY_ZERO)
+ F32 ab = a * b; // dotproduct
+ LLVector3 c = a % b; // crossproduct
+ F32 cc = c * c; // squared length of the crossproduct
+ if (ab * ab + cc) // test if the arguments have sufficient magnitude
{
- // a and b are anti-parallel.
- // Rotate 180 degrees around some orthogonal axis.
- // Find the projection of the x-axis onto a, and try
- // using the vector between the projection and the x-axis
- // as the orthogonal axis.
- LLVector3 proj = vec_a.mV[VX] / (vec_a * vec_a) * vec_a;
- LLVector3 ortho_axis(1.f, 0.f, 0.f);
- ortho_axis -= proj;
-
- // Turn this into an orthonormal axis.
- F32 ortho_length = ortho_axis.normalize();
- // If the axis' length is 0, then our guess at an orthogonal axis
- // was wrong (a is parallel to the x-axis).
- if (ortho_length < F_APPROXIMATELY_ZERO)
+ if (cc > 0.0f) // test if the arguments are (anti)parallel
{
- // Use the z-axis instead.
- ortho_axis.setVec(0.f, 0.f, 1.f);
+ F32 s = sqrtf(ab * ab + cc) + ab; // note: don't try to optimize this line
+ F32 m = 1.0f / sqrtf(cc + s * s); // the inverted magnitude of the quaternion
+ mQ[VX] = c.mV[VX] * m;
+ mQ[VY] = c.mV[VY] * m;
+ mQ[VZ] = c.mV[VZ] * m;
+ mQ[VW] = s * m;
+ return;
+ }
+ if (ab < 0.0f) // test if the angle is bigger than PI/2 (anti parallel)
+ {
+ c = a - b; // the arguments are anti-parallel, we have to choose an axis
+ F32 m = sqrtf(c.mV[VX] * c.mV[VX] + c.mV[VY] * c.mV[VY]); // the length projected on the XY-plane
+ if (m > FP_MAG_THRESHOLD)
+ {
+ mQ[VX] = -c.mV[VY] / m; // return the quaternion with the axis in the XY-plane
+ mQ[VY] = c.mV[VX] / m;
+ mQ[VZ] = 0.0f;
+ mQ[VW] = 0.0f;
+ return;
+ }
+ else // the vectors are parallel to the Z-axis
+ {
+ mQ[VX] = 1.0f; // rotate around the X-axis
+ mQ[VY] = 0.0f;
+ mQ[VZ] = 0.0f;
+ mQ[VW] = 0.0f;
+ return;
+ }
}
-
- // Construct a quaternion from this orthonormal axis.
- mQ[VX] = ortho_axis.mV[VX];
- mQ[VY] = ortho_axis.mV[VY];
- mQ[VZ] = ortho_axis.mV[VZ];
- mQ[VW] = 0.f;
- }
- else
- {
- // a and b are NOT parallel or anti-parallel.
- // Return the rotation between these vectors.
- F32 theta = (F32)acos(cos_theta);
-
- setAngleAxis(theta, axis);
}
+ loadIdentity();
}
// constrains rotation to a cone angle specified in radians
@@ -838,79 +836,82 @@ LLQuaternion::Order StringToOrder( const char *str )
void LLQuaternion::getAngleAxis(F32* angle, LLVector3 &vec) const
{
- F32 cos_a = mQ[VW];
- if (cos_a > 1.0f) cos_a = 1.0f;
- if (cos_a < -1.0f) cos_a = -1.0f;
-
- F32 sin_a = (F32) sqrt( 1.0f - cos_a * cos_a );
-
- if ( fabs( sin_a ) < 0.0005f )
- sin_a = 1.0f;
- else
- sin_a = 1.f/sin_a;
-
- F32 temp_angle = 2.0f * (F32) acos( cos_a );
- if (temp_angle > F_PI)
- {
- // The (angle,axis) pair should never have angles outside [PI, -PI]
- // since we want the _shortest_ (angle,axis) solution.
- // Since acos is defined for [0, PI], and we multiply by 2.0, we
- // can push the angle outside the acceptible range.
- // When this happens we set the angle to the other portion of a
- // full 2PI rotation, and negate the axis, which reverses the
- // direction of the rotation (by the right-hand rule).
- *angle = 2.f * F_PI - temp_angle;
- vec.mV[VX] = - mQ[VX] * sin_a;
- vec.mV[VY] = - mQ[VY] * sin_a;
- vec.mV[VZ] = - mQ[VZ] * sin_a;
+ F32 v = sqrtf(mQ[VX] * mQ[VX] + mQ[VY] * mQ[VY] + mQ[VZ] * mQ[VZ]); // length of the vector-component
+ if (v > FP_MAG_THRESHOLD)
+ {
+ F32 oomag = 1.0f / v;
+ F32 w = mQ[VW];
+ if (mQ[VW] < 0.0f)
+ {
+ w = -w; // make VW positive
+ oomag = -oomag; // invert the axis
+ }
+ vec.mV[VX] = mQ[VX] * oomag; // normalize the axis
+ vec.mV[VY] = mQ[VY] * oomag;
+ vec.mV[VZ] = mQ[VZ] * oomag;
+ *angle = 2.0f * atan2f(v, w); // get the angle
}
else
{
- *angle = temp_angle;
- vec.mV[VX] = mQ[VX] * sin_a;
- vec.mV[VY] = mQ[VY] * sin_a;
- vec.mV[VZ] = mQ[VZ] * sin_a;
+ *angle = 0.0f; // no rotation
+ vec.mV[VX] = 0.0f; // around some dummy axis
+ vec.mV[VY] = 0.0f;
+ vec.mV[VZ] = 1.0f;
}
}
-
// quaternion does not need to be normalized
void LLQuaternion::getEulerAngles(F32 *roll, F32 *pitch, F32 *yaw) const
{
- LLMatrix3 rot_mat(*this);
- rot_mat.orthogonalize();
- rot_mat.getEulerAngles(roll, pitch, yaw);
-
-// // NOTE: LLQuaternion's are actually inverted with respect to
-// // the matrices, so this code also assumes inverted quaternions
-// // (-x, -y, -z, w). The result is that roll,pitch,yaw are applied
-// // in reverse order (yaw,pitch,roll).
-// F32 x = -mQ[VX], y = -mQ[VY], z = -mQ[VZ], w = mQ[VW];
-// F64 m20 = 2.0*(x*z-y*w);
-// if (1.0f - fabsf(m20) < F_APPROXIMATELY_ZERO)
-// {
-// *roll = 0.0f;
-// *pitch = (F32)asin(m20);
-// *yaw = (F32)atan2(2.0*(x*y-z*w), 1.0 - 2.0*(x*x+z*z));
-// }
-// else
-// {
-// *roll = (F32)atan2(-2.0*(y*z+x*w), 1.0-2.0*(x*x+y*y));
-// *pitch = (F32)asin(m20);
-// *yaw = (F32)atan2(-2.0*(x*y+z*w), 1.0-2.0*(y*y+z*z));
-// }
+ F32 sx = 2 * (mQ[VX] * mQ[VW] - mQ[VY] * mQ[VZ]); // sine of the roll
+ F32 sy = 2 * (mQ[VY] * mQ[VW] + mQ[VX] * mQ[VZ]); // sine of the pitch
+ F32 ys = mQ[VW] * mQ[VW] - mQ[VY] * mQ[VY]; // intermediate cosine 1
+ F32 xz = mQ[VX] * mQ[VX] - mQ[VZ] * mQ[VZ]; // intermediate cosine 2
+ F32 cx = ys - xz; // cosine of the roll
+ F32 cy = sqrtf(sx * sx + cx * cx); // cosine of the pitch
+ if (cy > GIMBAL_THRESHOLD) // no gimbal lock
+ {
+ *roll = atan2f(sx, cx);
+ *pitch = atan2f(sy, cy);
+ *yaw = atan2f(2 * (mQ[VZ] * mQ[VW] - mQ[VX] * mQ[VY]), ys + xz);
+ }
+ else // gimbal lock
+ {
+ if (sy > 0)
+ {
+ *pitch = F_PI_BY_TWO;
+ *yaw = 2 * atan2f(mQ[VZ] + mQ[VX], mQ[VW] + mQ[VY]);
+ }
+ else
+ {
+ *pitch = -F_PI_BY_TWO;
+ *yaw = 2 * atan2f(mQ[VZ] - mQ[VX], mQ[VW] - mQ[VY]);
+ }
+ *roll = 0;
+ }
}
// Saves space by using the fact that our quaternions are normalized
LLVector3 LLQuaternion::packToVector3() const
{
+ F32 x = mQ[VX];
+ F32 y = mQ[VY];
+ F32 z = mQ[VZ];
+ F32 w = mQ[VW];
+ F32 mag = sqrtf(x * x + y * y + z * z + w * w);
+ if (mag > FP_MAG_THRESHOLD)
+ {
+ x /= mag;
+ y /= mag;
+ z /= mag; // no need to normalize w, it's not used
+ }
if( mQ[VW] >= 0 )
{
- return LLVector3( mQ[VX], mQ[VY], mQ[VZ] );
+ return LLVector3( x, y , z );
}
else
{
- return LLVector3( -mQ[VX], -mQ[VY], -mQ[VZ] );
+ return LLVector3( -x, -y, -z );
}
}
diff --git a/indra/llmath/llquaternion.h b/indra/llmath/llquaternion.h
index ca0dfe206b..e56929ed0f 100755
--- a/indra/llmath/llquaternion.h
+++ b/indra/llmath/llquaternion.h
@@ -1,4 +1,4 @@
-/**
+/**
* @file llquaternion.h
* @brief LLQuaternion class header file.
*
@@ -304,43 +304,29 @@ inline const LLQuaternion& LLQuaternion::setQuat(const F32 *q)
return (*this);
}
-// There may be a cheaper way that avoids the sqrt.
-// Does sin_a = VX*VX + VY*VY + VZ*VZ?
-// Copied from Matrix and Quaternion FAQ 1.12
inline void LLQuaternion::getAngleAxis(F32* angle, F32* x, F32* y, F32* z) const
{
- F32 cos_a = mQ[VW];
- if (cos_a > 1.0f) cos_a = 1.0f;
- if (cos_a < -1.0f) cos_a = -1.0f;
-
- F32 sin_a = (F32) sqrt( 1.0f - cos_a * cos_a );
-
- if ( fabs( sin_a ) < 0.0005f )
- sin_a = 1.0f;
- else
- sin_a = 1.f/sin_a;
-
- F32 temp_angle = 2.0f * (F32) acos( cos_a );
- if (temp_angle > F_PI)
+ F32 v = sqrtf(mQ[VX] * mQ[VX] + mQ[VY] * mQ[VY] + mQ[VZ] * mQ[VZ]); // length of the vector-component
+ if (v > FP_MAG_THRESHOLD)
{
- // The (angle,axis) pair should never have angles outside [PI, -PI]
- // since we want the _shortest_ (angle,axis) solution.
- // Since acos is defined for [0, PI], and we multiply by 2.0, we
- // can push the angle outside the acceptible range.
- // When this happens we set the angle to the other portion of a
- // full 2PI rotation, and negate the axis, which reverses the
- // direction of the rotation (by the right-hand rule).
- *angle = 2.f * F_PI - temp_angle;
- *x = - mQ[VX] * sin_a;
- *y = - mQ[VY] * sin_a;
- *z = - mQ[VZ] * sin_a;
+ F32 oomag = 1.0f / v;
+ F32 w = mQ[VW];
+ if (w < 0.0f)
+ {
+ w = -w; // make VW positive
+ oomag = -oomag; // invert the axis
+ }
+ *x = mQ[VX] * oomag; // normalize the axis
+ *y = mQ[VY] * oomag;
+ *z = mQ[VZ] * oomag;
+ *angle = 2.0f * atan2f(v, w); // get the angle
}
else
{
- *angle = temp_angle;
- *x = mQ[VX] * sin_a;
- *y = mQ[VY] * sin_a;
- *z = mQ[VZ] * sin_a;
+ *angle = 0.0f; // no rotation
+ *x = 0.0f; // around some dummy axis
+ *y = 0.0f;
+ *z = 1.0f;
}
}
diff --git a/indra/llmath/v3dmath.h b/indra/llmath/v3dmath.h
index cab4c93a9f..4938273d5b 100755
--- a/indra/llmath/v3dmath.h
+++ b/indra/llmath/v3dmath.h
@@ -72,17 +72,22 @@ class LLVector3d
BOOL clamp(const F64 min, const F64 max); // Clamps all values to (min,max), returns TRUE if data changed
BOOL abs(); // sets all values to absolute value of original value (first octant), returns TRUE if changed
- inline const LLVector3d& clearVec(); // Clears LLVector3d to (0, 0, 0, 1)
+ inline const LLVector3d& clear(); // Clears LLVector3d to (0, 0, 0, 1)
+ inline const LLVector3d& clearVec(); // deprecated
inline const LLVector3d& setZero(); // Zero LLVector3d to (0, 0, 0, 0)
inline const LLVector3d& zeroVec(); // deprecated
- inline const LLVector3d& setVec(const F64 x, const F64 y, const F64 z); // Sets LLVector3d to (x, y, z, 1)
- inline const LLVector3d& setVec(const LLVector3d &vec); // Sets LLVector3d to vec
- inline const LLVector3d& setVec(const F64 *vec); // Sets LLVector3d to vec
- inline const LLVector3d& setVec(const LLVector3 &vec);
-
- F64 magVec() const; // Returns magnitude of LLVector3d
- F64 magVecSquared() const; // Returns magnitude squared of LLVector3d
- inline F64 normVec(); // Normalizes and returns the magnitude of LLVector3d
+ inline const LLVector3d& set(const F64 x, const F64 y, const F64 z); // Sets LLVector3d to (x, y, z, 1)
+ inline const LLVector3d& set(const LLVector3d &vec); // Sets LLVector3d to vec
+ inline const LLVector3d& set(const F64 *vec); // Sets LLVector3d to vec
+ inline const LLVector3d& set(const LLVector3 &vec);
+ inline const LLVector3d& setVec(const F64 x, const F64 y, const F64 z); // deprecated
+ inline const LLVector3d& setVec(const LLVector3d &vec); // deprecated
+ inline const LLVector3d& setVec(const F64 *vec); // deprecated
+ inline const LLVector3d& setVec(const LLVector3 &vec); // deprecated
+
+ F64 magVec() const; // deprecated
+ F64 magVecSquared() const; // deprecated
+ inline F64 normVec(); // deprecated
F64 length() const; // Returns magnitude of LLVector3d
F64 lengthSquared() const; // Returns magnitude squared of LLVector3d
@@ -127,7 +132,15 @@ class LLVector3d
typedef LLVector3d LLGlobalVec;
-const LLVector3d &LLVector3d::setVec(const LLVector3 &vec)
+inline const LLVector3d &LLVector3d::set(const LLVector3 &vec)
+{
+ mdV[0] = vec.mV[0];
+ mdV[1] = vec.mV[1];
+ mdV[2] = vec.mV[2];
+ return *this;
+}
+
+inline const LLVector3d &LLVector3d::setVec(const LLVector3 &vec)
{
mdV[0] = vec.mV[0];
mdV[1] = vec.mV[1];
@@ -184,6 +197,14 @@ inline BOOL LLVector3d::isFinite() const
// Clear and Assignment Functions
+inline const LLVector3d& LLVector3d::clear(void)
+{
+ mdV[0] = 0.f;
+ mdV[1] = 0.f;
+ mdV[2]= 0.f;
+ return (*this);
+}
+
inline const LLVector3d& LLVector3d::clearVec(void)
{
mdV[0] = 0.f;
@@ -208,6 +229,30 @@ inline const LLVector3d& LLVector3d::zeroVec(void)
return (*this);
}
+inline const LLVector3d& LLVector3d::set(const F64 x, const F64 y, const F64 z)
+{
+ mdV[VX] = x;
+ mdV[VY] = y;
+ mdV[VZ] = z;
+ return (*this);
+}
+
+inline const LLVector3d& LLVector3d::set(const LLVector3d &vec)
+{
+ mdV[0] = vec.mdV[0];
+ mdV[1] = vec.mdV[1];
+ mdV[2] = vec.mdV[2];
+ return (*this);
+}
+
+inline const LLVector3d& LLVector3d::set(const F64 *vec)
+{
+ mdV[0] = vec[0];
+ mdV[1] = vec[1];
+ mdV[2] = vec[2];
+ return (*this);
+}
+
inline const LLVector3d& LLVector3d::setVec(const F64 x, const F64 y, const F64 z)
{
mdV[VX] = x;
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index c807a30f7b..f3fbce4843 100755
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -1,4 +1,4 @@
-/**
+/**
* @file v3math.h
* @brief LLVector3 class header file.
*
@@ -159,9 +159,7 @@ F32 dist_vec(const LLVector3 &a, const LLVector3 &b); // Returns distance betwe
F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b
F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component
LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b
-// Returns a vector in direction of a, such that when projected onto b, gives you the same value as b
-// in other words: projected_vec(inverse_projected_vec(a, b), b) == b;
-LLVector3 inverse_projected_vec(const LLVector3 &a, const LLVector3 &b);
+LLVector3 inverse_projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a scaled such that projected_vec(inverse_projected_vec(a, b), b) == b;
LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)
LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)
LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
@@ -493,9 +491,15 @@ inline F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b)
inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)
{
- LLVector3 project_axis = b;
- project_axis.normalize();
- return project_axis * (a * project_axis);
+ F32 bb = b * b;
+ if (bb > FP_MAG_THRESHOLD * FP_MAG_THRESHOLD)
+ {
+ return ((a * b) / bb) * b;
+ }
+ else
+ {
+ return b.zero;
+ }
}
inline LLVector3 inverse_projected_vec(const LLVector3& a, const LLVector3& b)
@@ -571,15 +575,13 @@ inline void update_min_max(LLVector3& min, LLVector3& max, const F32* pos)
inline F32 angle_between(const LLVector3& a, const LLVector3& b)
{
- LLVector3 an = a;
- LLVector3 bn = b;
- an.normalize();
- bn.normalize();
- F32 cosine = an * bn;
- F32 angle = (cosine >= 1.0f) ? 0.0f :
- (cosine <= -1.0f) ? F_PI :
- (F32)acos(cosine);
- return angle;
+ F32 ab = a * b; // dotproduct
+ if (ab == -0.0f)
+ {
+ ab = 0.0f; // get rid of negative zero
+ }
+ LLVector3 c = a % b; // crossproduct
+ return atan2f(sqrtf(c * c), ab); // return the angle
}
inline BOOL are_parallel(const LLVector3 &a, const LLVector3 &b, F32 epsilon)
diff --git a/indra/llmessage/llares.h b/indra/llmessage/llares.h
index 0b5d49e322..c727363b60 100755
--- a/indra/llmessage/llares.h
+++ b/indra/llmessage/llares.h
@@ -39,7 +39,7 @@
# pragma warning(pop)
#endif
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
# include <ares.h>
#else
# include <ares/ares.h>
diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp
index f168ac4ec6..a30140e8f3 100755
--- a/indra/llmessage/llhttpassetstorage.cpp
+++ b/indra/llmessage/llhttpassetstorage.cpp
@@ -38,7 +38,7 @@
#include "llvfs.h"
#include "llxfer.h"
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
# include <zlib.h>
#else
# include "zlib/zlib.h"
diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp
index d6db20d7a3..ec7b21d8b6 100755
--- a/indra/llmessage/lltransfermanager.cpp
+++ b/indra/llmessage/lltransfermanager.cpp
@@ -1260,9 +1260,13 @@ bool LLTransferTarget::addDelayedPacket(
size);
#ifdef _DEBUG
- if (mDelayedPacketMap.find(packet_id) != mDelayedPacketMap.end())
+ transfer_packet_map::iterator iter = mDelayedPacketMap.find(packet_id);
+ if (iter != mDelayedPacketMap.end())
{
- LL_ERRS() << "Packet ALREADY in delayed packet map!" << LL_ENDL;
+ if (!(iter->second->mSize == size) && !(iter->second->mDatap == datap))
+ {
+ LL_ERRS() << "Packet ALREADY in delayed packet map!" << LL_ENDL;
+ }
}
#endif
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index b0456e3ccf..57a698b98f 100755
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -44,7 +44,7 @@
#pragma warning (default : 4264)
#endif
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
# include <zlib.h>
#else
# include "zlib/zlib.h"
diff --git a/indra/llui/llchatentry.cpp b/indra/llui/llchatentry.cpp
index c04b70eb64..dac001afab 100755
--- a/indra/llui/llchatentry.cpp
+++ b/indra/llui/llchatentry.cpp
@@ -51,6 +51,7 @@ LLChatEntry::LLChatEntry(const Params& p)
mCurrentHistoryLine = mLineHistory.begin();
mAutoIndent = false;
+ keepSelectionOnReturn(true);
}
LLChatEntry::~LLChatEntry()
@@ -179,15 +180,6 @@ BOOL LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)
{
BOOL handled = FALSE;
- // In the case of a chat entry, pressing RETURN when something is selected
- // should NOT erase the selection (unlike a notecard, for example)
- if (key == KEY_RETURN)
- {
- endOfDoc();
- startSelection();
- endSelection();
- }
-
LLTextEditor::handleSpecialKey(key, mask);
switch(key)
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index bc2388dd28..cca26f335a 100755
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -1130,18 +1130,18 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
if((mSelectedItems.size() > 0) && mScrollContainer)
{
LLFolderViewItem* last_selected = getCurSelectedItem();
+ BOOL shift_select = mask & MASK_SHIFT;
+ // don't shift select down to children of folders (they are implicitly selected through parent)
+ LLFolderViewItem* next = last_selected->getNextOpenNode(!shift_select);
- if (!mKeyboardSelection)
+ if (!mKeyboardSelection || (!shift_select && (!next || next == last_selected)))
{
setSelection(last_selected, FALSE, TRUE);
mKeyboardSelection = TRUE;
}
- LLFolderViewItem* next = NULL;
- if (mask & MASK_SHIFT)
+ if (shift_select)
{
- // don't shift select down to children of folders (they are implicitly selected through parent)
- next = last_selected->getNextOpenNode(FALSE);
if (next)
{
if (next->isSelected())
@@ -1158,7 +1158,6 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
}
else
{
- next = last_selected->getNextOpenNode();
if( next )
{
if (next == last_selected)
@@ -1194,18 +1193,18 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
if((mSelectedItems.size() > 0) && mScrollContainer)
{
LLFolderViewItem* last_selected = mSelectedItems.back();
+ BOOL shift_select = mask & MASK_SHIFT;
+ // don't shift select down to children of folders (they are implicitly selected through parent)
+ LLFolderViewItem* prev = last_selected->getPreviousOpenNode(!shift_select);
- if (!mKeyboardSelection)
+ if (!mKeyboardSelection || (!shift_select && prev == this))
{
setSelection(last_selected, FALSE, TRUE);
mKeyboardSelection = TRUE;
}
- LLFolderViewItem* prev = NULL;
- if (mask & MASK_SHIFT)
+ if (shift_select)
{
- // don't shift select down to children of folders (they are implicitly selected through parent)
- prev = last_selected->getPreviousOpenNode(FALSE);
if (prev)
{
if (prev->isSelected())
@@ -1222,7 +1221,6 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
}
else
{
- prev = last_selected->getPreviousOpenNode();
if( prev )
{
if (prev == this)
diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp
index fcd7b274e8..75773d7dfd 100755
--- a/indra/llui/llkeywords.cpp
+++ b/indra/llui/llkeywords.cpp
@@ -1,25 +1,25 @@
-/**
+/**
* @file llkeywords.cpp
* @brief Keyword list for LSL
*
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -30,49 +30,48 @@
#include <fstream>
#include "llkeywords.h"
+#include "llsdserialize.h"
#include "lltexteditor.h"
#include "llstl.h"
-#include <boost/tokenizer.hpp>
-
-const U32 KEYWORD_FILE_CURRENT_VERSION = 2;
-inline BOOL LLKeywordToken::isHead(const llwchar* s) const
+inline bool LLKeywordToken::isHead(const llwchar* s) const
{
// strncmp is much faster than string compare
- BOOL res = TRUE;
+ bool res = true;
const llwchar* t = mToken.c_str();
S32 len = mToken.size();
for (S32 i=0; i<len; i++)
{
if (s[i] != t[i])
{
- res = FALSE;
+ res = false;
break;
}
}
return res;
}
-LLKeywords::LLKeywords() : mLoaded(FALSE)
-{
-}
-
-inline BOOL LLKeywordToken::isTail(const llwchar* s) const
+inline bool LLKeywordToken::isTail(const llwchar* s) const
{
- BOOL res = TRUE;
+ bool res = true;
const llwchar* t = mDelimiter.c_str();
S32 len = mDelimiter.size();
for (S32 i=0; i<len; i++)
{
if (s[i] != t[i])
{
- res = FALSE;
+ res = false;
break;
}
}
return res;
}
+LLKeywords::LLKeywords()
+: mLoaded(false)
+{
+}
+
LLKeywords::~LLKeywords()
{
std::for_each(mWordTokenMap.begin(), mWordTokenMap.end(), DeletePairedPointer());
@@ -83,180 +82,307 @@ LLKeywords::~LLKeywords()
mDelimiterTokenList.clear();
}
-BOOL LLKeywords::loadFromFile( const std::string& filename )
+// Add the token as described
+void LLKeywords::addToken(LLKeywordToken::ETokenType type,
+ const std::string& key_in,
+ const LLColor4& color,
+ const std::string& tool_tip_in,
+ const std::string& delimiter_in)
{
- mLoaded = FALSE;
-
- ////////////////////////////////////////////////////////////
- // File header
-
- const S32 BUFFER_SIZE = 1024;
- char buffer[BUFFER_SIZE]; /* Flawfinder: ignore */
-
- llifstream file;
- file.open(filename); /* Flawfinder: ignore */
- if( file.fail() )
+ std::string tip_text = tool_tip_in;
+ LLStringUtil::replaceString(tip_text, "\\n", "\n" );
+ LLStringUtil::replaceString(tip_text, "\t", " " );
+ if (tip_text.empty())
{
- LL_INFOS() << "LLKeywords::loadFromFile() Unable to open file: " << filename << LL_ENDL;
- return mLoaded;
+ tip_text = "[no info]";
}
+ LLWString tool_tip = utf8str_to_wstring(tip_text);
- // Identifying string
- file >> buffer;
- if( strcmp( buffer, "llkeywords" ) )
- {
- LL_INFOS() << filename << " does not appear to be a keyword file" << LL_ENDL;
- return mLoaded;
- }
-
- // Check file version
- file >> buffer;
- U32 version_num;
- file >> version_num;
- if( strcmp(buffer, "version") || version_num != (U32)KEYWORD_FILE_CURRENT_VERSION )
+ LLWString key = utf8str_to_wstring(key_in);
+ LLWString delimiter = utf8str_to_wstring(delimiter_in);
+ switch(type)
{
- LL_INFOS() << filename << " does not appear to be a version " << KEYWORD_FILE_CURRENT_VERSION << " keyword file" << LL_ENDL;
- return mLoaded;
- }
+ case LLKeywordToken::TT_CONSTANT:
+ case LLKeywordToken::TT_CONTROL:
+ case LLKeywordToken::TT_EVENT:
+ case LLKeywordToken::TT_FUNCTION:
+ case LLKeywordToken::TT_LABEL:
+ case LLKeywordToken::TT_SECTION:
+ case LLKeywordToken::TT_TYPE:
+ case LLKeywordToken::TT_WORD:
+ mWordTokenMap[key] = new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null);
+ break;
- // start of line (SOL)
- std::string SOL_COMMENT("#");
- std::string SOL_WORD("[word ");
- std::string SOL_LINE("[line ");
- std::string SOL_ONE_SIDED_DELIMITER("[one_sided_delimiter ");
- std::string SOL_TWO_SIDED_DELIMITER("[two_sided_delimiter ");
- std::string SOL_DOUBLE_QUOTATION_MARKS("[double_quotation_marks ");
+ case LLKeywordToken::TT_LINE:
+ mLineTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null));
+ break;
- LLColor3 cur_color( 1, 0, 0 );
- LLKeywordToken::TOKEN_TYPE cur_type = LLKeywordToken::WORD;
+ case LLKeywordToken::TT_TWO_SIDED_DELIMITER:
+ case LLKeywordToken::TT_DOUBLE_QUOTATION_MARKS:
+ case LLKeywordToken::TT_ONE_SIDED_DELIMITER:
+ mDelimiterTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, delimiter));
+ break;
- while (!file.eof())
- {
- buffer[0] = 0;
- file.getline( buffer, BUFFER_SIZE );
- std::string line(buffer);
- if( line.find(SOL_COMMENT) == 0 )
- {
- continue;
- }
- else if( line.find(SOL_WORD) == 0 )
- {
- cur_color = readColor( line.substr(SOL_WORD.size()) );
- cur_type = LLKeywordToken::WORD;
- continue;
- }
- else if( line.find(SOL_LINE) == 0 )
- {
- cur_color = readColor( line.substr(SOL_LINE.size()) );
- cur_type = LLKeywordToken::LINE;
- continue;
- }
- else if( line.find(SOL_TWO_SIDED_DELIMITER) == 0 )
- {
- cur_color = readColor( line.substr(SOL_TWO_SIDED_DELIMITER.size()) );
- cur_type = LLKeywordToken::TWO_SIDED_DELIMITER;
- continue;
- }
- else if( line.find(SOL_DOUBLE_QUOTATION_MARKS) == 0 )
- {
- cur_color = readColor( line.substr(SOL_DOUBLE_QUOTATION_MARKS.size()) );
- cur_type = LLKeywordToken::DOUBLE_QUOTATION_MARKS;
- continue;
- }
- else if( line.find(SOL_ONE_SIDED_DELIMITER) == 0 )
- {
- cur_color = readColor( line.substr(SOL_ONE_SIDED_DELIMITER.size()) );
- cur_type = LLKeywordToken::ONE_SIDED_DELIMITER;
- continue;
- }
+ default:
+ llassert(0);
+ }
+}
- std::string token_buffer( line );
- LLStringUtil::trim(token_buffer);
-
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep_word("", " \t");
- tokenizer word_tokens(token_buffer, sep_word);
- tokenizer::iterator token_word_iter = word_tokens.begin();
+std::string LLKeywords::getArguments(LLSD& arguments)
+{
+ std::string argString = "";
- if( !token_buffer.empty() && token_word_iter != word_tokens.end() )
+ if (arguments.isArray())
+ {
+ U32 argsCount = arguments.size();
+ LLSD::array_iterator arrayIt = arguments.beginArray();
+ for ( ; arrayIt != arguments.endArray(); ++arrayIt)
{
- // first word is the keyword or a left delimiter
- std::string keyword = (*token_word_iter);
- LLStringUtil::trim(keyword);
-
- // second word may be a right delimiter
- std::string delimiter;
- if (cur_type == LLKeywordToken::TWO_SIDED_DELIMITER)
+ LLSD& args = (*arrayIt);
+ if (args.isMap())
{
- while (delimiter.length() == 0 && ++token_word_iter != word_tokens.end())
+ LLSD::map_iterator argsIt = args.beginMap();
+ for ( ; argsIt != args.endMap(); ++argsIt)
{
- delimiter = *token_word_iter;
- LLStringUtil::trim(delimiter);
+ argString += argsIt->second.get("type").asString() + " " + argsIt->first;
+ if (argsCount-- > 1)
+ {
+ argString += ", ";
+ }
}
}
- else if (cur_type == LLKeywordToken::DOUBLE_QUOTATION_MARKS)
+ else
{
- // Closing delimiter is identical to the opening one.
- delimiter = keyword;
+ LL_WARNS("SyntaxLSL") << "Argument array comtains a non-map element!" << LL_ENDL;
}
+ }
+ }
+ else if (!arguments.isUndefined())
+ {
+ LL_WARNS("SyntaxLSL") << "Not an array! Invalid arguments LLSD passed to function." << arguments << LL_ENDL;
+ }
+ return argString;
+}
- // following words are tooltip
- std::string tool_tip;
- while (++token_word_iter != word_tokens.end())
- {
- tool_tip += (*token_word_iter);
- }
- LLStringUtil::trim(tool_tip);
-
- if( !tool_tip.empty() )
+std::string LLKeywords::getAttribute(const std::string& key)
+{
+ attribute_iterator_t it = mAttributes.find(key);
+ return (it != mAttributes.end()) ? it->second : "";
+}
+
+LLColor4 LLKeywords::getColorGroup(const std::string& key_in)
+{
+ std::string color_group = "ScriptText";
+ if (key_in == "functions")
+ {
+ color_group = "SyntaxLslFunction";
+ }
+ else if (key_in == "controls")
+ {
+ color_group = "SyntaxLslControlFlow";
+ }
+ else if (key_in == "events")
+ {
+ color_group = "SyntaxLslEvent";
+ }
+ else if (key_in == "types")
+ {
+ color_group = "SyntaxLslDataType";
+ }
+ else if (key_in == "misc-flow-label")
+ {
+ color_group = "SyntaxLslControlFlow";
+ }
+ else if (key_in =="deprecated")
+ {
+ color_group = "SyntaxLslDeprecated";
+ }
+ else if (key_in =="god-mode")
+ {
+ color_group = "SyntaxLslGodMode";
+ }
+ else if (key_in == "constants"
+ || key_in == "constants-integer"
+ || key_in == "constants-float"
+ || key_in == "constants-string"
+ || key_in == "constants-key"
+ || key_in == "constants-rotation"
+ || key_in == "constants-vector")
+ {
+ color_group = "SyntaxLslConstant";
+ }
+ else
+ {
+ LL_WARNS("SyntaxLSL") << "Color key '" << key_in << "' not recognized." << LL_ENDL;
+ }
+
+ return LLUIColorTable::instance().getColor(color_group);
+}
+
+void LLKeywords::initialize(LLSD SyntaxXML)
+{
+ mSyntax = SyntaxXML;
+ mLoaded = true;
+}
+
+void LLKeywords::processTokens()
+{
+ if (!mLoaded)
+ {
+ return;
+ }
+
+ // Add 'standard' stuff: Quotes, Comments, Strings, Labels, etc. before processing the LLSD
+ std::string delimiter;
+ addToken(LLKeywordToken::TT_LABEL, "@", getColorGroup("misc-flow-label"), "Label\nTarget for jump statement", delimiter );
+ addToken(LLKeywordToken::TT_ONE_SIDED_DELIMITER, "//", LLUIColorTable::instance().getColor("SyntaxLslComment"), "Comment (single-line)\nNon-functional commentary or disabled code", delimiter );
+ addToken(LLKeywordToken::TT_TWO_SIDED_DELIMITER, "/*", LLUIColorTable::instance().getColor("SyntaxLslComment"), "Comment (multi-line)\nNon-functional commentary or disabled code", "*/" );
+ addToken(LLKeywordToken::TT_DOUBLE_QUOTATION_MARKS, "\"", LLUIColorTable::instance().getColor("SyntaxLslStringLiteral"), "String literal", "\"" );
+
+ LLSD::map_iterator itr = mSyntax.beginMap();
+ for ( ; itr != mSyntax.endMap(); ++itr)
+ {
+ if (itr->first == "llsd-lsl-syntax-version")
+ {
+ // Skip over version key.
+ }
+ else
+ {
+ if (itr->second.isMap())
{
- // Replace : with \n for multi-line tool tips.
- LLStringUtil::replaceChar( tool_tip, ':', '\n' );
- addToken(cur_type, keyword, cur_color, tool_tip, delimiter );
+ processTokensGroup(itr->second, itr->first);
}
else
{
- addToken(cur_type, keyword, cur_color, LLStringUtil::null, delimiter );
+ LL_WARNS("LSL-Tokens-Processing") << "Map for " + itr->first + " entries is missing! Ignoring." << LL_ENDL;
}
}
}
-
- file.close();
-
- mLoaded = TRUE;
- return mLoaded;
+ LL_INFOS("SyntaxLSL") << "Finished processing tokens." << LL_ENDL;
}
-// Add the token as described
-void LLKeywords::addToken(LLKeywordToken::TOKEN_TYPE type,
- const std::string& key_in,
- const LLColor3& color,
- const std::string& tool_tip_in,
- const std::string& delimiter_in)
+void LLKeywords::processTokensGroup(const LLSD& tokens, const std::string& group)
{
- LLWString key = utf8str_to_wstring(key_in);
- LLWString tool_tip = utf8str_to_wstring(tool_tip_in);
- LLWString delimiter = utf8str_to_wstring(delimiter_in);
- switch(type)
+ LLColor4 color;
+ LLColor4 color_group;
+ LLColor4 color_deprecated = getColorGroup("deprecated");
+ LLColor4 color_god_mode = getColorGroup("god-mode");
+
+ LLKeywordToken::ETokenType token_type = LLKeywordToken::TT_UNKNOWN;
+ // If a new token type is added here, it must also be added to the 'addToken' method
+ if (group == "constants")
{
- case LLKeywordToken::WORD:
- mWordTokenMap[key] = new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null);
- break;
+ token_type = LLKeywordToken::TT_CONSTANT;
+ }
+ else if (group == "controls")
+ {
+ token_type = LLKeywordToken::TT_CONTROL;
+ }
+ else if (group == "events")
+ {
+ token_type = LLKeywordToken::TT_EVENT;
+ }
+ else if (group == "functions")
+ {
+ token_type = LLKeywordToken::TT_FUNCTION;
+ }
+ else if (group == "label")
+ {
+ token_type = LLKeywordToken::TT_LABEL;
+ }
+ else if (group == "types")
+ {
+ token_type = LLKeywordToken::TT_TYPE;
+ }
- case LLKeywordToken::LINE:
- mLineTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null));
- break;
+ color_group = getColorGroup(group);
+ LL_INFOS("SyntaxLSL") << "Group: '" << group << "', using color: '" << color_group << "'" << LL_ENDL;
- case LLKeywordToken::TWO_SIDED_DELIMITER:
- case LLKeywordToken::DOUBLE_QUOTATION_MARKS:
- case LLKeywordToken::ONE_SIDED_DELIMITER:
- mDelimiterTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, delimiter));
- break;
+ if (tokens.isMap())
+ {
+ LLSD::map_const_iterator outer_itr = tokens.beginMap();
+ for ( ; outer_itr != tokens.endMap(); ++outer_itr )
+ {
+ if (outer_itr->second.isMap())
+ {
+ mAttributes.clear();
+ LLSD arguments = LLSD();
+ LLSD::map_const_iterator inner_itr = outer_itr->second.beginMap();
+ for ( ; inner_itr != outer_itr->second.endMap(); ++inner_itr )
+ {
+ if (inner_itr->first == "arguments")
+ {
+ if (inner_itr->second.isArray())
+ {
+ arguments = inner_itr->second;
+ }
+ }
+ else if (!inner_itr->second.isMap() && !inner_itr->second.isArray())
+ {
+ mAttributes[inner_itr->first] = inner_itr->second.asString();
+ }
+ else
+ {
+ LL_WARNS("SyntaxLSL") << "Not a valid attribute: " << inner_itr->first << LL_ENDL;
+ }
+ }
- default:
- llassert(0);
+ std::string tooltip = "";
+ switch (token_type)
+ {
+ case LLKeywordToken::TT_CONSTANT:
+ color_group = getColorGroup(group + "-" + getAttribute("type"));
+ tooltip = "Type: " + getAttribute("type") + ", Value: " + getAttribute("value");
+ break;
+ case LLKeywordToken::TT_EVENT:
+ tooltip = outer_itr->first + "(" + getArguments(arguments) + ")";
+ break;
+ case LLKeywordToken::TT_FUNCTION:
+ tooltip = getAttribute("return") + " " + outer_itr->first + "(" + getArguments(arguments) + ");";
+ tooltip.append("\nEnergy: ");
+ tooltip.append(getAttribute("energy").empty() ? "0.0" : getAttribute("energy"));
+ if (!getAttribute("sleep").empty())
+ {
+ tooltip += ", Sleep: " + getAttribute("sleep");
+ }
+ default:
+ break;
+ }
+
+ if (!getAttribute("tooltip").empty())
+ {
+ if (!tooltip.empty())
+ {
+ tooltip.append("\n");
+ }
+ tooltip.append(getAttribute("tooltip"));
+ }
+
+ color = getAttribute("deprecated") == "true" ? color_deprecated : color_group;
+
+ if (getAttribute("god-mode") == "true")
+ {
+ color = color_god_mode;
+ }
+
+ addToken(token_type, outer_itr->first, color, tooltip);
+ }
+ }
+ }
+ else if (tokens.isArray()) // Currently nothing should need this, but it's here for completeness
+ {
+ LL_INFOS("SyntaxLSL") << "Curious, shouldn't be an array here; adding all using color " << color << LL_ENDL;
+ for (S32 count = 0; count < tokens.size(); ++count)
+ {
+ addToken(token_type, tokens[count], color, "");
+ }
+ }
+ else
+ {
+ LL_WARNS("SyntaxLSL") << "Invalid map/array passed: '" << tokens << "'" << LL_ENDL;
}
}
+
LLKeywords::WStringMapIndex::WStringMapIndex(const WStringMapIndex& other)
{
if(other.mOwner)
@@ -276,15 +402,19 @@ LLKeywords::WStringMapIndex::WStringMapIndex(const LLWString& str)
copyData(str.data(), str.size());
}
-LLKeywords::WStringMapIndex::WStringMapIndex(const llwchar *start, size_t length):
-mData(start), mLength(length), mOwner(false)
+LLKeywords::WStringMapIndex::WStringMapIndex(const llwchar *start, size_t length)
+: mData(start)
+, mLength(length)
+, mOwner(false)
{
}
LLKeywords::WStringMapIndex::~WStringMapIndex()
{
- if(mOwner)
+ if (mOwner)
+ {
delete[] mData;
+ }
}
void LLKeywords::WStringMapIndex::copyData(const llwchar *start, size_t length)
@@ -301,13 +431,13 @@ bool LLKeywords::WStringMapIndex::operator<(const LLKeywords::WStringMapIndex &o
{
// NOTE: Since this is only used to organize a std::map, it doesn't matter if it uses correct collate order or not.
// The comparison only needs to strictly order all possible strings, and be stable.
-
+
bool result = false;
const llwchar* self_iter = mData;
const llwchar* self_end = mData + mLength;
const llwchar* other_iter = other.mData;
const llwchar* other_end = other.mData + other.mLength;
-
+
while(true)
{
if(other_iter >= other_end)
@@ -322,7 +452,7 @@ bool LLKeywords::WStringMapIndex::operator<(const LLKeywords::WStringMapIndex &o
{
// self is shorter than other.
result = true;
- break;
+ break;
}
else if(*self_iter != *other_iter)
{
@@ -334,20 +464,8 @@ bool LLKeywords::WStringMapIndex::operator<(const LLKeywords::WStringMapIndex &o
self_iter++;
other_iter++;
}
-
- return result;
-}
-LLColor3 LLKeywords::readColor( const std::string& s )
-{
- F32 r, g, b;
- r = g = b = 0.0f;
- S32 values_read = sscanf(s.c_str(), "%f, %f, %f]", &r, &g, &b );
- if( values_read != 3 )
- {
- LL_INFOS() << " poorly formed color in keyword file" << LL_ENDL;
- }
- return LLColor3( r, g, b );
+ return result;
}
LLTrace::BlockTimerStatHandle FTM_SYNTAX_COLORING("Syntax Coloring");
@@ -363,10 +481,10 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
{
return;
}
-
+
S32 text_len = wtext.size() + 1;
- seg_list->push_back( new LLNormalTextSegment( defaultColor, 0, text_len, editor ) );
+ seg_list->push_back( new LLNormalTextSegment( defaultColor, 0, text_len, editor ) );
const llwchar* base = wtext.c_str();
const llwchar* cur = base;
@@ -396,7 +514,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
continue;
}
- // cur is now at the first non-whitespace character of a new line
+ // cur is now at the first non-whitespace character of a new line
// Line start tokens
{
@@ -414,7 +532,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
cur++;
}
S32 seg_end = cur - base;
-
+
//create segments from seg_start to seg_end
insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor);
line_done = TRUE; // to break out of second loop.
@@ -459,14 +577,14 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
seg_start = cur - base;
cur += cur_delimiter->getLengthHead();
-
- LLKeywordToken::TOKEN_TYPE type = cur_delimiter->getType();
- if( type == LLKeywordToken::TWO_SIDED_DELIMITER || type == LLKeywordToken::DOUBLE_QUOTATION_MARKS )
+
+ LLKeywordToken::ETokenType type = cur_delimiter->getType();
+ if( type == LLKeywordToken::TT_TWO_SIDED_DELIMITER || type == LLKeywordToken::TT_DOUBLE_QUOTATION_MARKS )
{
while( *cur && !cur_delimiter->isTail(cur))
{
// Check for an escape sequence.
- if (type == LLKeywordToken::DOUBLE_QUOTATION_MARKS && *cur == '\\')
+ if (type == LLKeywordToken::TT_DOUBLE_QUOTATION_MARKS && *cur == '\\')
{
// Count the number of backslashes.
S32 num_backslashes = 0;
@@ -513,7 +631,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
}
else
{
- llassert( cur_delimiter->getType() == LLKeywordToken::ONE_SIDED_DELIMITER );
+ llassert( cur_delimiter->getType() == LLKeywordToken::TT_ONE_SIDED_DELIMITER );
// Left side is the delimiter. Right side is eol or eof.
while( *cur && ('\n' != *cur) )
{
@@ -555,11 +673,11 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
S32 seg_start = cur - base;
S32 seg_end = seg_start + seg_len;
- // LL_INFOS() << "Seg: [" << word.c_str() << "]" << LL_ENDL;
+ // llinfos << "Seg: [" << word.c_str() << "]" << llendl;
insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor);
}
- cur += seg_len;
+ cur += seg_len;
continue;
}
}
@@ -575,7 +693,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
void LLKeywords::insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* cur_token, S32 text_len, S32 seg_start, S32 seg_end, const LLColor4 &defaultColor, LLTextEditor& editor )
{
std::string::size_type pos = wtext.find('\n',seg_start);
-
+
while (pos!=-1 && pos < (std::string::size_type)seg_end)
{
if (pos!=seg_start)
@@ -622,10 +740,10 @@ void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSe
#ifdef _DEBUG
void LLKeywords::dump()
{
- LL_INFOS() << "LLKeywords" << LL_ENDL;
+ llinfos << "LLKeywords" << llendl;
- LL_INFOS() << "LLKeywords::sWordTokenMap" << LL_ENDL;
+ llinfos << "LLKeywords::sWordTokenMap" << llendl;
word_token_map_t::iterator word_token_iter = mWordTokenMap.begin();
while( word_token_iter != mWordTokenMap.end() )
{
@@ -634,7 +752,7 @@ void LLKeywords::dump()
++word_token_iter;
}
- LL_INFOS() << "LLKeywords::sLineTokenList" << LL_ENDL;
+ llinfos << "LLKeywords::sLineTokenList" << llendl;
for (token_list_t::iterator iter = mLineTokenList.begin();
iter != mLineTokenList.end(); ++iter)
{
@@ -643,7 +761,7 @@ void LLKeywords::dump()
}
- LL_INFOS() << "LLKeywords::sDelimiterTokenList" << LL_ENDL;
+ llinfos << "LLKeywords::sDelimiterTokenList" << llendl;
for (token_list_t::iterator iter = mDelimiterTokenList.begin();
iter != mDelimiterTokenList.end(); ++iter)
{
@@ -654,12 +772,12 @@ void LLKeywords::dump()
void LLKeywordToken::dump()
{
- LL_INFOS() << "[" <<
+ llinfos << "[" <<
mColor.mV[VX] << ", " <<
mColor.mV[VY] << ", " <<
mColor.mV[VZ] << "] [" <<
wstring_to_utf8str(mToken) << "]" <<
- LL_ENDL;
+ llendl;
}
#endif // DEBUG
diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h
index ac34015393..18e2ed06c5 100755
--- a/indra/llui/llkeywords.h
+++ b/indra/llui/llkeywords.h
@@ -1,25 +1,25 @@
-/**
+/**
* @file llkeywords.h
* @brief Keyword list for LSL
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -28,8 +28,10 @@
#define LL_LLKEYWORDS_H
+#include "lldir.h"
#include "llstring.h"
#include "v3color.h"
+#include "v4color.h"
#include <map>
#include <list>
#include <deque>
@@ -41,26 +43,35 @@ typedef LLPointer<LLTextSegment> LLTextSegmentPtr;
class LLKeywordToken
{
public:
- /**
+ /**
* @brief Types of tokens/delimters being parsed.
*
* @desc Tokens/delimiters that need to be identified/highlighted. All are terminated if an EOF is encountered.
- * - WORD are keywords in the normal sense, i.e. constants, events, etc.
- * - LINE are for entire lines (currently only flow control labels use this).
- * - ONE_SIDED_DELIMITER are for open-ended delimiters which are terminated by EOL.
- * - TWO_SIDED_DELIMITER are for delimiters that end with a different delimiter than they open with.
- * - DOUBLE_QUOTATION_MARKS are for delimiting areas using the same delimiter to open and close.
+ * - TT_WORD are keywords in the normal sense, i.e. constants, events, etc.
+ * - TT_LINE are for entire lines (currently only flow control labels use this).
+ * - TT_ONE_SIDED_DELIMITER are for open-ended delimiters which are terminated by EOL.
+ * - TT_TWO_SIDED_DELIMITER are for delimiters that end with a different delimiter than they open with.
+ * - TT_DOUBLE_QUOTATION_MARKS are for delimiting areas using the same delimiter to open and close.
*/
- enum TOKEN_TYPE
+ typedef enum e_token_type
{
- WORD,
- LINE,
- TWO_SIDED_DELIMITER,
- ONE_SIDED_DELIMITER,
- DOUBLE_QUOTATION_MARKS
- };
-
- LLKeywordToken( TOKEN_TYPE type, const LLColor3& color, const LLWString& token, const LLWString& tool_tip, const LLWString& delimiter )
+ TT_UNKNOWN,
+ TT_WORD,
+ TT_LINE,
+ TT_TWO_SIDED_DELIMITER,
+ TT_ONE_SIDED_DELIMITER,
+ TT_DOUBLE_QUOTATION_MARKS,
+ // Following constants are more specific versions of the preceding ones
+ TT_CONSTANT, // WORD
+ TT_CONTROL, // WORD
+ TT_EVENT, // WORD
+ TT_FUNCTION, // WORD
+ TT_LABEL, // LINE
+ TT_SECTION, // WORD
+ TT_TYPE // WORD
+ } ETokenType;
+
+ LLKeywordToken( ETokenType type, const LLColor4& color, const LLWString& token, const LLWString& tool_tip, const LLWString& delimiter )
:
mType( type ),
mToken( token ),
@@ -72,11 +83,11 @@ public:
S32 getLengthHead() const { return mToken.size(); }
S32 getLengthTail() const { return mDelimiter.size(); }
- BOOL isHead(const llwchar* s) const;
- BOOL isTail(const llwchar* s) const;
+ bool isHead(const llwchar* s) const;
+ bool isTail(const llwchar* s) const;
const LLWString& getToken() const { return mToken; }
- const LLColor3& getColor() const { return mColor; }
- TOKEN_TYPE getType() const { return mType; }
+ const LLColor4& getColor() const { return mColor; }
+ ETokenType getType() const { return mType; }
const LLWString& getToolTip() const { return mToolTip; }
const LLWString& getDelimiter() const { return mDelimiter; }
@@ -85,9 +96,9 @@ public:
#endif
private:
- TOKEN_TYPE mType;
+ ETokenType mType;
LLWString mToken;
- LLColor3 mColor;
+ LLColor4 mColor;
LLWString mToolTip;
LLWString mDelimiter;
};
@@ -98,18 +109,24 @@ public:
LLKeywords();
~LLKeywords();
- BOOL loadFromFile(const std::string& filename);
- BOOL isLoaded() const { return mLoaded; }
+ void clearLoaded() { mLoaded = false; }
+ LLColor4 getColorGroup(const std::string& key_in);
+ bool isLoaded() const { return mLoaded; }
- void findSegments(std::vector<LLTextSegmentPtr> *seg_list, const LLWString& text, const LLColor4 &defaultColor, class LLTextEditor& editor );
+ void findSegments(std::vector<LLTextSegmentPtr> *seg_list,
+ const LLWString& text,
+ const LLColor4 &defaultColor,
+ class LLTextEditor& editor);
+ void initialize(LLSD SyntaxXML);
+ void processTokens();
// Add the token as described
- void addToken(LLKeywordToken::TOKEN_TYPE type,
+ void addToken(LLKeywordToken::ETokenType type,
const std::string& key,
- const LLColor3& color,
+ const LLColor4& color,
const std::string& tool_tip = LLStringUtil::null,
const std::string& delimiter = LLStringUtil::null);
-
+
// This class is here as a performance optimization.
// The word token map used to be defined as std::map<LLWString, LLKeywordToken*>.
// This worked, but caused a performance bottleneck due to memory allocation and string copies
@@ -133,6 +150,9 @@ public:
const llwchar *mData;
size_t mLength;
bool mOwner;
+
+
+ LLColor4 mColor;
};
typedef std::map<WStringMapIndex, LLKeywordToken*> word_token_map_t;
@@ -140,20 +160,43 @@ public:
keyword_iterator_t begin() const { return mWordTokenMap.begin(); }
keyword_iterator_t end() const { return mWordTokenMap.end(); }
+ typedef std::map<WStringMapIndex, LLColor4> group_color_map_t;
+ typedef group_color_map_t::const_iterator color_iterator_t;
+ group_color_map_t mColorGroupMap;
+
#ifdef _DEBUG
void dump();
#endif
-private:
- LLColor3 readColor(const std::string& s);
- void insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, class LLTextEditor& editor);
- void insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* token, S32 text_len, S32 seg_start, S32 seg_end, const LLColor4 &defaultColor, LLTextEditor& editor);
-
- BOOL mLoaded;
+protected:
+ void processTokensGroup(const LLSD& Tokens, const std::string& Group);
+ void insertSegment(std::vector<LLTextSegmentPtr>& seg_list,
+ LLTextSegmentPtr new_segment,
+ S32 text_len,
+ const LLColor4 &defaultColor,
+ class LLTextEditor& editor);
+ void insertSegments(const LLWString& wtext,
+ std::vector<LLTextSegmentPtr>& seg_list,
+ LLKeywordToken* token,
+ S32 text_len,
+ S32 seg_start,
+ S32 seg_end,
+ const LLColor4 &defaultColor,
+ LLTextEditor& editor);
+
+ bool mLoaded;
+ LLSD mSyntax;
word_token_map_t mWordTokenMap;
typedef std::deque<LLKeywordToken*> token_list_t;
token_list_t mLineTokenList;
token_list_t mDelimiterTokenList;
+
+ typedef std::map<std::string, std::string> element_attributes_t;
+ typedef element_attributes_t::const_iterator attribute_iterator_t;
+ element_attributes_t mAttributes;
+ std::string getAttribute(const std::string& key);
+
+ std::string getArguments(LLSD& arguments);
};
#endif // LL_LLKEYWORDS_H
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 025cd81d92..de14391d1f 100755
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1189,6 +1189,7 @@ void LLNotificationChannel::connectToChannel( const std::string& channel_name )
}
else
{
+ mParents.push_back(channel_name);
LLNotificationChannelPtr p = LLNotifications::instance().getChannel(channel_name);
p->connectChanged(boost::bind(&LLNotificationChannelBase::updateItem, this, _1));
}
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index b0e8553a49..3cf432f330 100755
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -88,6 +88,7 @@
#include <boost/enable_shared_from_this.hpp>
#include <boost/type_traits.hpp>
#include <boost/signals2.hpp>
+#include <boost/range.hpp>
#include "llevents.h"
#include "llfunctorregistry.h"
@@ -840,6 +841,11 @@ public:
typedef LLNotificationSet::iterator Iterator;
std::string getName() const { return mName; }
+ typedef std::vector<std::string>::const_iterator parents_iter;
+ boost::iterator_range<parents_iter> getParents() const
+ {
+ return boost::iterator_range<parents_iter>(mParents);
+ }
void connectToChannel(const std::string& channel_name);
@@ -854,7 +860,7 @@ public:
private:
std::string mName;
- std::string mParent;
+ std::vector<std::string> mParents;
};
// An interface class to provide a clean linker seam to the LLNotifications class.
diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp
index 9e8e943ee6..b6a32a0e78 100644
--- a/indra/llui/llnotificationslistener.cpp
+++ b/indra/llui/llnotificationslistener.cpp
@@ -32,6 +32,7 @@
#include "llnotificationtemplate.h"
#include "llsd.h"
#include "llui.h"
+#include <boost/foreach.hpp>
LLNotificationsListener::LLNotificationsListener(LLNotifications & notifications) :
LLEventAPI("LLNotifications",
@@ -42,11 +43,10 @@ LLNotificationsListener::LLNotificationsListener(LLNotifications & notifications
"Add a notification with specified [\"name\"], [\"substitutions\"] and [\"payload\"].\n"
"If optional [\"reply\"] specified, arrange to send user response on that LLEventPump.",
&LLNotificationsListener::requestAdd);
- /* add("listChannels",
+ add("listChannels",
"Post to [\"reply\"] a map of info on existing channels",
&LLNotificationsListener::listChannels,
LLSD().with("reply", LLSD()));
- */
add("listChannelNotifications",
"Post to [\"reply\"] an array of info on notifications in channel [\"channel\"]",
&LLNotificationsListener::listChannelNotifications,
@@ -117,26 +117,27 @@ void LLNotificationsListener::NotificationResponder(const std::string& reply_pum
reponse_event["response"] = response;
LLEventPumps::getInstance()->obtain(reply_pump).post(reponse_event);
}
-/*
+
void LLNotificationsListener::listChannels(const LLSD& params) const
{
LLReqID reqID(params);
LLSD response(reqID.makeResponse());
- for (LLNotifications::
-
-
-
- for (LLNotifications::ChannelMap::const_iterator cmi(mNotifications.mChannels.begin()),
- cmend(mNotifications.mChannels.end());
+ for (LLNotificationChannel::instance_iter cmi(LLNotificationChannel::beginInstances()),
+ cmend(LLNotificationChannel::endInstances());
cmi != cmend; ++cmi)
{
- LLSD channelInfo;
- channelInfo["parent"] = cmi->second->getParentChannelName();
- response[cmi->first] = channelInfo;
+ LLSD channelInfo, parents;
+ BOOST_FOREACH(const std::string& parent, cmi->getParents())
+ {
+ parents.append(parent);
+ }
+ channelInfo["parents"] = parents;
+ channelInfo["parent"] = parents.size()? parents[0] : "";
+ response[cmi->getName()] = channelInfo;
}
LLEventPumps::instance().obtain(params["reply"]).post(response);
}
-*/
+
void LLNotificationsListener::listChannelNotifications(const LLSD& params) const
{
LLReqID reqID(params);
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 8906a6e736..71db0ac030 100755
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -70,43 +70,36 @@ bool LLTextBase::compare_segment_end::operator()(const LLTextSegmentPtr& a, cons
// helper functors
-struct LLTextBase::compare_bottom
+bool LLTextBase::compare_bottom::operator()(const S32& a, const LLTextBase::line_info& b) const
{
- bool operator()(const S32& a, const LLTextBase::line_info& b) const
- {
- return a > b.mRect.mBottom; // bottom of a is higher than bottom of b
- }
-
- bool operator()(const LLTextBase::line_info& a, const S32& b) const
- {
- return a.mRect.mBottom > b; // bottom of a is higher than bottom of b
- }
+ return a > b.mRect.mBottom; // bottom of a is higher than bottom of b
+}
- bool operator()(const LLTextBase::line_info& a, const LLTextBase::line_info& b) const
- {
- return a.mRect.mBottom > b.mRect.mBottom; // bottom of a is higher than bottom of b
- }
+bool LLTextBase::compare_bottom::operator()(const LLTextBase::line_info& a, const S32& b) const
+{
+ return a.mRect.mBottom > b; // bottom of a is higher than bottom of b
+}
-};
+bool LLTextBase::compare_bottom::operator()(const LLTextBase::line_info& a, const LLTextBase::line_info& b) const
+{
+ return a.mRect.mBottom > b.mRect.mBottom; // bottom of a is higher than bottom of b
+}
// helper functors
-struct LLTextBase::compare_top
+bool LLTextBase::compare_top::operator()(const S32& a, const LLTextBase::line_info& b) const
{
- bool operator()(const S32& a, const LLTextBase::line_info& b) const
- {
- return a > b.mRect.mTop; // top of a is higher than top of b
- }
+ return a > b.mRect.mTop; // top of a is higher than top of b
+}
- bool operator()(const LLTextBase::line_info& a, const S32& b) const
- {
- return a.mRect.mTop > b; // top of a is higher than top of b
- }
+bool LLTextBase::compare_top::operator()(const LLTextBase::line_info& a, const S32& b) const
+{
+ return a.mRect.mTop > b; // top of a is higher than top of b
+}
- bool operator()(const LLTextBase::line_info& a, const LLTextBase::line_info& b) const
- {
- return a.mRect.mTop > b.mRect.mTop; // top of a is higher than top of b
- }
-};
+bool LLTextBase::compare_top::operator()(const LLTextBase::line_info& a, const LLTextBase::line_info& b) const
+{
+ return a.mRect.mTop > b.mRect.mTop; // top of a is higher than top of b
+}
struct LLTextBase::line_end_compare
{
@@ -573,7 +566,8 @@ void LLTextBase::drawText()
if ( (getSpellCheck()) && (getWText().length() > 2) )
{
// Calculate start and end indices for the spell checking range
- S32 start = line_start, end = getLineEnd(last_line);
+ S32 start = line_start;
+ S32 end = getLineEnd(last_line);
if ( (mSpellCheckStart != start) || (mSpellCheckEnd != end) )
{
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index ecbfdaf84c..738b4d5b8e 100755
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -451,9 +451,31 @@ public:
LLScrollContainer* getScrollContainer() const { return mScroller; }
protected:
+ // protected member variables
+ // List of offsets and segment index of the start of each line. Always has at least one node (0).
+ struct line_info
+ {
+ line_info(S32 index_start, S32 index_end, LLRect rect, S32 line_num);
+ S32 mDocIndexStart;
+ S32 mDocIndexEnd;
+ LLRect mRect;
+ S32 mLineNum; // actual line count (ignoring soft newlines due to word wrap)
+ };
+ typedef std::vector<line_info> line_list_t;
+
// helper structs
- struct compare_bottom;
- struct compare_top;
+ struct compare_bottom
+ {
+ bool operator()(const S32& a, const line_info& b) const;
+ bool operator()(const line_info& a, const S32& b) const;
+ bool operator()(const line_info& a, const line_info& b) const;
+ };
+ struct compare_top
+ {
+ bool operator()(const S32& a, const line_info& b) const;
+ bool operator()(const line_info& a, const S32& b) const;
+ bool operator()(const line_info& a, const line_info& b) const;
+ };
struct line_end_compare;
typedef std::vector<LLTextSegmentPtr> segment_vec_t;
@@ -501,18 +523,6 @@ protected:
};
typedef std::multiset<LLTextSegmentPtr, compare_segment_end> segment_set_t;
- // protected member variables
- // List of offsets and segment index of the start of each line. Always has at least one node (0).
- struct line_info
- {
- line_info(S32 index_start, S32 index_end, LLRect rect, S32 line_num);
- S32 mDocIndexStart;
- S32 mDocIndexEnd;
- LLRect mRect;
- S32 mLineNum; // actual line count (ignoring soft newlines due to word wrap)
- };
- typedef std::vector<line_info> line_list_t;
-
// member functions
LLTextBase(const Params &p);
virtual ~LLTextBase();
@@ -522,7 +532,7 @@ protected:
virtual bool useLabel() const;
// draw methods
- void drawSelectionBackground(); // draws the black box behind the selected text
+ virtual void drawSelectionBackground(); // draws the black box behind the selected text
void drawCursor();
void drawText();
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index b4ebed0849..576e8f7600 100755
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -75,8 +75,6 @@ template class LLTextEditor* LLView::getChild<class LLTextEditor>(
//
// Constants
//
-const S32 UI_TEXTEDITOR_LINE_NUMBER_MARGIN = 32;
-const S32 UI_TEXTEDITOR_LINE_NUMBER_DIGITS = 4;
const S32 SPACES_PER_TAB = 4;
const F32 SPELLCHECK_DELAY = 0.5f; // delay between the last keypress and spell checking the word the cursor is on
@@ -236,7 +234,6 @@ LLTextEditor::Params::Params()
prevalidate_callback("prevalidate_callback"),
embedded_items("embedded_items", false),
ignore_tab("ignore_tab", true),
- show_line_numbers("show_line_numbers", false),
auto_indent("auto_indent", true),
default_color("default_color"),
commit_on_focus_lost("commit_on_focus_lost", false),
@@ -252,8 +249,7 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
mBaseDocIsPristine(TRUE),
mPristineCmd( NULL ),
mLastCmd( NULL ),
- mDefaultColor( p.default_color() ),
- mShowLineNumbers ( p.show_line_numbers ),
+ mDefaultColor( p.default_color() ),
mAutoIndent(p.auto_indent),
mCommitOnFocusLost( p.commit_on_focus_lost),
mAllowEmbeddedItems( p.embedded_items ),
@@ -264,7 +260,8 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
mContextMenu(NULL),
mShowContextMenu(p.show_context_menu),
mEnableTooltipPaste(p.enable_tooltip_paste),
- mPassDelete(FALSE)
+ mPassDelete(FALSE),
+ mKeepSelectionOnReturn(false)
{
mSourceID.generate();
@@ -277,14 +274,7 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
params.visible = p.border_visible;
mBorder = LLUICtrlFactory::create<LLViewBorder> (params);
addChild( mBorder );
-
setText(p.default_text());
-
- if (mShowLineNumbers)
- {
- mHPad += UI_TEXTEDITOR_LINE_NUMBER_MARGIN;
- updateRects();
- }
mParseOnTheFly = TRUE;
}
@@ -1664,7 +1654,7 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask)
case KEY_RETURN:
if (mask == MASK_NONE)
{
- if( hasSelection() )
+ if( hasSelection() && !mKeepSelectionOnReturn )
{
deleteSelection(FALSE);
}
@@ -2197,69 +2187,6 @@ void LLTextEditor::drawPreeditMarker()
}
}
-
-void LLTextEditor::drawLineNumbers()
-{
- LLGLSUIDefault gls_ui;
- LLRect scrolled_view_rect = getVisibleDocumentRect();
- LLRect content_rect = getVisibleTextRect();
- LLLocalClipRect clip(content_rect);
- S32 first_line = getFirstVisibleLine();
- S32 num_lines = getLineCount();
- if (first_line >= num_lines)
- {
- return;
- }
-
- S32 cursor_line = mLineInfoList[getLineNumFromDocIndex(mCursorPos)].mLineNum;
-
- if (mShowLineNumbers)
- {
- S32 left = 0;
- S32 top = getRect().getHeight();
- S32 bottom = 0;
-
- gl_rect_2d(left, top, UI_TEXTEDITOR_LINE_NUMBER_MARGIN, bottom, mReadOnlyBgColor.get() ); // line number area always read-only
- gl_rect_2d(UI_TEXTEDITOR_LINE_NUMBER_MARGIN, top, UI_TEXTEDITOR_LINE_NUMBER_MARGIN-1, bottom, LLColor4::grey3); // separator
-
- S32 last_line_num = -1;
-
- for (S32 cur_line = first_line; cur_line < num_lines; cur_line++)
- {
- line_info& line = mLineInfoList[cur_line];
-
- if ((line.mRect.mTop - scrolled_view_rect.mBottom) < mVisibleTextRect.mBottom)
- {
- break;
- }
-
- S32 line_bottom = line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom;
- // draw the line numbers
- if(line.mLineNum != last_line_num && line.mRect.mTop <= scrolled_view_rect.mTop)
- {
- const LLFontGL *num_font = LLFontGL::getFontMonospace();
- const LLWString ltext = utf8str_to_wstring(llformat("%d", line.mLineNum ));
- BOOL is_cur_line = cursor_line == line.mLineNum;
- const U8 style = is_cur_line ? LLFontGL::BOLD : LLFontGL::NORMAL;
- const LLColor4 fg_color = is_cur_line ? mCursorColor : mReadOnlyFgColor;
- num_font->render(
- ltext, // string to draw
- 0, // begin offset
- UI_TEXTEDITOR_LINE_NUMBER_MARGIN - 2, // x
- line_bottom, // y
- fg_color,
- LLFontGL::RIGHT, // horizontal alignment
- LLFontGL::BOTTOM, // vertical alignment
- style,
- LLFontGL::NO_SHADOW,
- S32_MAX, // max chars
- UI_TEXTEDITOR_LINE_NUMBER_MARGIN - 2); // max pixels
- last_line_num = line.mLineNum;
- }
- }
- }
-}
-
void LLTextEditor::draw()
{
{
@@ -2271,7 +2198,6 @@ void LLTextEditor::draw()
}
LLTextBase::draw();
- drawLineNumbers();
drawPreeditMarker();
@@ -2513,53 +2439,6 @@ BOOL LLTextEditor::tryToRevertToPristineState()
return isPristine(); // TRUE => success
}
-
-static LLTrace::BlockTimerStatHandle FTM_SYNTAX_HIGHLIGHTING("Syntax Highlighting");
-void LLTextEditor::loadKeywords(const std::string& filename,
- const std::vector<std::string>& funcs,
- const std::vector<std::string>& tooltips,
- const LLColor3& color)
-{
- LL_RECORD_BLOCK_TIME(FTM_SYNTAX_HIGHLIGHTING);
- if(mKeywords.loadFromFile(filename))
- {
- S32 count = llmin(funcs.size(), tooltips.size());
- for(S32 i = 0; i < count; i++)
- {
- std::string name = utf8str_trim(funcs[i]);
- mKeywords.addToken(LLKeywordToken::WORD, name, color, tooltips[i] );
- }
- segment_vec_t segment_list;
- mKeywords.findSegments(&segment_list, getWText(), mDefaultColor.get(), *this);
-
- mSegments.clear();
- segment_set_t::iterator insert_it = mSegments.begin();
- for (segment_vec_t::iterator list_it = segment_list.begin(); list_it != segment_list.end(); ++list_it)
- {
- insert_it = mSegments.insert(insert_it, *list_it);
- }
- }
-}
-
-void LLTextEditor::updateSegments()
-{
- if (mReflowIndex < S32_MAX && mKeywords.isLoaded() && mParseOnTheFly)
- {
- LL_RECORD_BLOCK_TIME(FTM_SYNTAX_HIGHLIGHTING);
- // HACK: No non-ascii keywords for now
- segment_vec_t segment_list;
- mKeywords.findSegments(&segment_list, getWText(), mDefaultColor.get(), *this);
-
- clearSegments();
- for (segment_vec_t::iterator list_it = segment_list.begin(); list_it != segment_list.end(); ++list_it)
- {
- insertSegment(*list_it);
- }
- }
-
- LLTextBase::updateSegments();
-}
-
void LLTextEditor::updateLinkSegments()
{
LLWString wtext = getWText();
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 3a96d8ed24..f6bdf917b4 100755
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -1,25 +1,25 @@
-/**
+/**
* @file lltexteditor.h
* @brief LLTextEditor base class
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -30,7 +30,6 @@
#define LL_LLTEXTEDITOR_H
#include "llrect.h"
-#include "llkeywords.h"
#include "llframetimer.h"
#include "llstyle.h"
#include "lleditmenuhandler.h"
@@ -43,7 +42,6 @@
class LLFontGL;
class LLScrollbar;
-class LLKeywordToken;
class TextCmd;
class LLUICtrlFactory;
class LLScrollContainer;
@@ -60,7 +58,6 @@ public:
Optional<bool> embedded_items,
ignore_tab,
- show_line_numbers,
commit_on_focus_lost,
show_context_menu,
enable_tooltip_paste,
@@ -131,7 +128,7 @@ public:
virtual BOOL canCopy() const;
virtual void paste();
virtual BOOL canPaste() const;
-
+
virtual void updatePrimary();
virtual void copyPrimary();
virtual void pastePrimary();
@@ -149,7 +146,7 @@ public:
void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE);
BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE);
void replaceTextAll(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive);
-
+
// Undo/redo stack
void blockUndo();
@@ -186,13 +183,6 @@ public:
void getCurrentLineAndColumn( S32* line, S32* col, BOOL include_wordwrap );
- void loadKeywords(const std::string& filename,
- const std::vector<std::string>& funcs,
- const std::vector<std::string>& tooltips,
- const LLColor3& func_color);
- LLKeywords::keyword_iterator_t keywordsBegin() { return mKeywords.begin(); }
- LLKeywords::keyword_iterator_t keywordsEnd() { return mKeywords.end(); }
-
// Hacky methods to make it into a word-wrapping, potentially scrolling,
// read-only text box.
void setCommitOnFocusLost(BOOL b) { mCommitOnFocusLost = b; }
@@ -204,7 +194,7 @@ public:
const LLUUID& getSourceID() const { return mSourceID; }
const LLTextSegmentPtr getPreviousSegment() const;
- void getSelectedSegments(segment_vec_t& segments) const;
+ void getSelectedSegments(segment_vec_t& segments) const;
void setShowContextMenu(bool show) { mShowContextMenu = show; }
bool getShowContextMenu() const { return mShowContextMenu; }
@@ -216,7 +206,7 @@ protected:
void drawPreeditMarker();
void assignEmbedded(const std::string &s);
-
+
void removeCharOrTab();
void indentSelectedLines( S32 spaces );
@@ -235,12 +225,12 @@ protected:
S32 nextWordPos(S32 cursorPos) const;
void autoIndent();
-
+
void findEmbeddedItemSegments(S32 start, S32 end);
void getSegmentsInRange(segment_vec_t& segments, S32 start, S32 end, bool include_partial) const;
virtual llwchar pasteEmbeddedItem(llwchar ext_char) { return ext_char; }
-
+
// Here's the method that takes and applies text commands.
S32 execute(TextCmd* cmd);
@@ -254,7 +244,7 @@ protected:
S32 removeChar(S32 pos);
S32 insert(S32 pos, const LLWString &wstr, bool group_with_next_op, LLTextSegmentPtr segment);
S32 remove(S32 pos, S32 length, bool group_with_next_op);
-
+
void focusLostHelper();
void updateAllowingLanguageInput();
BOOL hasPreeditString() const;
@@ -272,14 +262,14 @@ protected:
//
// Protected data
//
- // Probably deserves serious thought to hiding as many of these
+ // Probably deserves serious thought to hiding as many of these
// as possible behind protected accessor methods.
//
// Use these to determine if a click on an embedded item is a drag or not.
S32 mMouseDownX;
S32 mMouseDownY;
-
+
LLWString mPreeditWString;
LLWString mPreeditOverwrittenWString;
std::vector<S32> mPreeditPositions;
@@ -288,11 +278,12 @@ protected:
protected:
LLUIColor mDefaultColor;
- BOOL mShowLineNumbers;
bool mAutoIndent;
+ bool mParseOnTheFly;
- /*virtual*/ void updateSegments();
void updateLinkSegments();
+ void keepSelectionOnReturn(bool keep) { mKeepSelectionOnReturn = keep; }
+ class LLViewBorder* mBorder;
private:
//
@@ -302,23 +293,14 @@ private:
void cleanStringForPaste(LLWString & clean_string);
void pasteTextWithLinebreaks(LLWString & clean_string);
- void drawLineNumbers();
-
void onKeyStroke();
- //
- // Data
- //
- LLKeywords mKeywords;
-
// Concrete TextCmd sub-classes used by the LLTextEditor base class
class TextCmdInsert;
class TextCmdAddChar;
class TextCmdOverwriteChar;
class TextCmdRemove;
- class LLViewBorder* mBorder;
-
BOOL mBaseDocIsPristine;
TextCmd* mPristineCmd;
@@ -333,9 +315,9 @@ private:
BOOL mAllowEmbeddedItems;
bool mShowContextMenu;
- bool mParseOnTheFly;
bool mEnableTooltipPaste;
bool mPassDelete;
+ bool mKeepSelectionOnReturn; // disabling of removing selected text after pressing of Enter
LLUUID mSourceID;
@@ -353,4 +335,4 @@ extern template class LLTextEditor* LLView::getChild<class LLTextEditor>(
const std::string& name, BOOL recurse) const;
#endif
-#endif // LL_TEXTEDITOR_
+#endif // LL_TEXTEDITOR_H
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 5e1f12996e..7f2224870d 100755
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -477,7 +477,8 @@ void LLToolTipMgr::show(const std::string& msg)
void LLToolTipMgr::show(const LLToolTip::Params& params)
{
if (!params.styled_message.isProvided()
- && (!params.message.isProvided() || params.message().empty())) return;
+ && (!params.message.isProvided() || params.message().empty())
+ && !params.image.isProvided()) return;
// fill in default tooltip params from tool_tip.xml
LLToolTip::Params params_with_defaults(params);
diff --git a/indra/llui/llxuiparser.cpp b/indra/llui/llxuiparser.cpp
index 4390ca83e9..37d88cb9f9 100755
--- a/indra/llui/llxuiparser.cpp
+++ b/indra/llui/llxuiparser.cpp
@@ -30,7 +30,7 @@
#include "llxmlnode.h"
#include "llfasttimer.h"
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
#include <expat.h>
#else
#include "expat/expat.h"
diff --git a/indra/llvfs/llvfile.cpp b/indra/llvfs/llvfile.cpp
index 34b61ee0a0..b8588e99f4 100755
--- a/indra/llvfs/llvfile.cpp
+++ b/indra/llvfs/llvfile.cpp
@@ -105,7 +105,7 @@ BOOL LLVFile::read(U8 *buffer, S32 bytes, BOOL async, F32 priority)
// We can't do a read while there are pending async writes
waitForLock(VFSLOCK_APPEND);
- // *FIX: (???)
+ // *FIX: (?)
if (async)
{
mHandle = sVFSThread->read(mVFS, mFileID, mFileType, buffer, mPosition, bytes, threadPri());
diff --git a/indra/llvfs/tests/lldiriterator_test.cpp b/indra/llvfs/tests/lldiriterator_test.cpp
index 505d86faa7..a65e3dada5 100755
--- a/indra/llvfs/tests/lldiriterator_test.cpp
+++ b/indra/llvfs/tests/lldiriterator_test.cpp
@@ -51,9 +51,9 @@ namespace tut
void test_chop_662(void)
{
// Check a selection of bad group names from the crash reports
- LLDirIterator iter(".","+bad-group-name]+??-??.*");
- LLDirIterator iter1(".","))--@---bad-group-name2((??-??.*\\.txt");
- LLDirIterator iter2(".","__^v--x)Cuide d sua vida(x--v^__??-??.*");
+ LLDirIterator iter(".","+bad-group-name]+?\?-??.*");
+ LLDirIterator iter1(".","))--@---bad-group-name2((?\?-??.*\\.txt");
+ LLDirIterator iter2(".","__^v--x)Cuide d sua vida(x--v^__?\?-??.*");
}
template<> template<>
diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp
index ba5bc8fcfb..e7afef63f8 100755
--- a/indra/llwindow/lldxhardware.cpp
+++ b/indra/llwindow/lldxhardware.cpp
@@ -34,9 +34,12 @@
#include <dxdiag.h>
#undef INITGUID
+#include <wbemidl.h>
+
#include <boost/tokenizer.hpp>
#include "lldxhardware.h"
+
#include "llerror.h"
#include "llstring.h"
@@ -53,11 +56,160 @@ LLDXHardware gDXHardware;
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
-std::string get_string(IDxDiagContainer *containerp, WCHAR *wszPropName)
+typedef BOOL ( WINAPI* PfnCoSetProxyBlanket )( IUnknown* pProxy, DWORD dwAuthnSvc, DWORD dwAuthzSvc,
+ OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel,
+ RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities );
+
+HRESULT GetVideoMemoryViaWMI( WCHAR* strInputDeviceID, DWORD* pdwAdapterRam )
{
HRESULT hr;
+ bool bGotMemory = false;
+ HRESULT hrCoInitialize = S_OK;
+ IWbemLocator* pIWbemLocator = nullptr;
+ IWbemServices* pIWbemServices = nullptr;
+ BSTR pNamespace = nullptr;
+
+ *pdwAdapterRam = 0;
+ hrCoInitialize = CoInitialize( 0 );
+
+ hr = CoCreateInstance( CLSID_WbemLocator,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_IWbemLocator,
+ ( LPVOID* )&pIWbemLocator );
+#ifdef PRINTF_DEBUGGING
+ if( FAILED( hr ) ) wprintf( L"WMI: CoCreateInstance failed: 0x%0.8x\n", hr );
+#endif
+
+ if( SUCCEEDED( hr ) && pIWbemLocator )
+ {
+ // Using the locator, connect to WMI in the given namespace.
+ pNamespace = SysAllocString( L"\\\\.\\root\\cimv2" );
+
+ hr = pIWbemLocator->ConnectServer( pNamespace, nullptr, nullptr, 0L,
+ 0L, nullptr, nullptr, &pIWbemServices );
+#ifdef PRINTF_DEBUGGING
+ if( FAILED( hr ) ) wprintf( L"WMI: pIWbemLocator->ConnectServer failed: 0x%0.8x\n", hr );
+#endif
+ if( SUCCEEDED( hr ) && pIWbemServices != 0 )
+ {
+ HINSTANCE hinstOle32 = nullptr;
+
+ hinstOle32 = LoadLibraryW( L"ole32.dll" );
+ if( hinstOle32 )
+ {
+ PfnCoSetProxyBlanket pfnCoSetProxyBlanket = nullptr;
+
+ pfnCoSetProxyBlanket = ( PfnCoSetProxyBlanket )GetProcAddress( hinstOle32, "CoSetProxyBlanket" );
+ if( pfnCoSetProxyBlanket != 0 )
+ {
+ // Switch security level to IMPERSONATE.
+ pfnCoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr,
+ RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, 0 );
+ }
+
+ FreeLibrary( hinstOle32 );
+ }
+
+ IEnumWbemClassObject* pEnumVideoControllers = nullptr;
+ BSTR pClassName = nullptr;
+
+ pClassName = SysAllocString( L"Win32_VideoController" );
+
+ hr = pIWbemServices->CreateInstanceEnum( pClassName, 0,
+ nullptr, &pEnumVideoControllers );
+#ifdef PRINTF_DEBUGGING
+ if( FAILED( hr ) ) wprintf( L"WMI: pIWbemServices->CreateInstanceEnum failed: 0x%0.8x\n", hr );
+#endif
+
+ if( SUCCEEDED( hr ) && pEnumVideoControllers )
+ {
+ IWbemClassObject* pVideoControllers[10] = {0};
+ DWORD uReturned = 0;
+ BSTR pPropName = nullptr;
+
+ // Get the first one in the list
+ pEnumVideoControllers->Reset();
+ hr = pEnumVideoControllers->Next( 5000, // timeout in 5 seconds
+ 10, // return the first 10
+ pVideoControllers,
+ &uReturned );
+#ifdef PRINTF_DEBUGGING
+ if( FAILED( hr ) ) wprintf( L"WMI: pEnumVideoControllers->Next failed: 0x%0.8x\n", hr );
+ if( uReturned == 0 ) wprintf( L"WMI: pEnumVideoControllers uReturned == 0\n" );
+#endif
+
+ VARIANT var;
+ if( SUCCEEDED( hr ) )
+ {
+ bool bFound = false;
+ for( UINT iController = 0; iController < uReturned; iController++ )
+ {
+ if ( !pVideoControllers[iController] )
+ continue;
+
+ pPropName = SysAllocString( L"PNPDeviceID" );
+ hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
+#ifdef PRINTF_DEBUGGING
+ if( FAILED( hr ) )
+ wprintf( L"WMI: pVideoControllers[iController]->Get PNPDeviceID failed: 0x%0.8x\n", hr );
+#endif
+ if( SUCCEEDED( hr ) )
+ {
+ if( wcsstr( var.bstrVal, strInputDeviceID ) != 0 )
+ bFound = true;
+ }
+ VariantClear( &var );
+ if( pPropName ) SysFreeString( pPropName );
+
+ if( bFound )
+ {
+ pPropName = SysAllocString( L"AdapterRAM" );
+ hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
+#ifdef PRINTF_DEBUGGING
+ if( FAILED( hr ) )
+ wprintf( L"WMI: pVideoControllers[iController]->Get AdapterRAM failed: 0x%0.8x\n",
+ hr );
+#endif
+ if( SUCCEEDED( hr ) )
+ {
+ bGotMemory = true;
+ *pdwAdapterRam = var.ulVal;
+ }
+ VariantClear( &var );
+ if( pPropName ) SysFreeString( pPropName );
+ break;
+ }
+ SAFE_RELEASE( pVideoControllers[iController] );
+ }
+ }
+ }
+
+ if( pClassName )
+ SysFreeString( pClassName );
+ SAFE_RELEASE( pEnumVideoControllers );
+ }
+
+ if( pNamespace )
+ SysFreeString( pNamespace );
+ SAFE_RELEASE( pIWbemServices );
+ }
+
+ SAFE_RELEASE( pIWbemLocator );
+
+ if( SUCCEEDED( hrCoInitialize ) )
+ CoUninitialize();
+
+ if( bGotMemory )
+ return S_OK;
+ else
+ return E_FAIL;
+}
+
+void get_wstring(IDxDiagContainer* containerp, WCHAR* wszPropName, WCHAR* wszPropValue, int outputSize)
+{
+ HRESULT hr;
VARIANT var;
- WCHAR wszPropValue[256];
VariantInit( &var );
hr = containerp->GetProp(wszPropName, &var );
@@ -76,13 +228,19 @@ std::string get_string(IDxDiagContainer *containerp, WCHAR *wszPropName)
wcscpy( wszPropValue, (var.boolVal) ? L"true" : L"false" ); /* Flawfinder: ignore */
break;
case VT_BSTR:
- wcsncpy( wszPropValue, var.bstrVal, 255 ); /* Flawfinder: ignore */
- wszPropValue[255] = 0;
+ wcsncpy( wszPropValue, var.bstrVal, outputSize-1 ); /* Flawfinder: ignore */
+ wszPropValue[outputSize-1] = 0;
break;
}
}
// Clear the variant (this is needed to free BSTR memory)
VariantClear( &var );
+}
+
+std::string get_string(IDxDiagContainer *containerp, WCHAR *wszPropName)
+{
+ WCHAR wszPropValue[256];
+ get_wstring(containerp, wszPropName, wszPropValue, 256);
return utf16str_to_utf8str(wszPropValue);
}
@@ -361,8 +519,18 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
goto LCleanup;
}
- // Get the English VRAM string
+ DWORD vram = 0;
+
+ WCHAR deviceID[512];
+
+ get_wstring(device_containerp, L"szDeviceID", deviceID, 512);
+
+ if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID, &vram)))
{
+ mVRAM = vram/(1024*1024);
+ }
+ else
+ { // Get the English VRAM string
std::string ram_str = get_string(device_containerp, L"szDisplayMemoryEnglish");
// We don't need the device any more
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index 466c3baccf..5720660034 100755
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -71,7 +71,7 @@ S32 OSMessageBox(const std::string& text, const std::string& caption, U32 type)
}
S32 result = 0;
-#if LL_MESA_HEADLESS // !!! *FIX: (???)
+#if LL_MESA_HEADLESS // !!! *FIX: (?)
LL_WARNS() << "OSMessageBox: " << text << LL_ENDL;
return OSBTN_OK;
#elif LL_WINDOWS
@@ -323,7 +323,7 @@ bool LLSplashScreen::isVisible()
// static
LLSplashScreen *LLSplashScreen::create()
{
-#if LL_MESA_HEADLESS || LL_SDL // !!! *FIX: (???)
+#if LL_MESA_HEADLESS || LL_SDL // !!! *FIX: (?)
return 0;
#elif LL_WINDOWS
return new LLSplashScreenWin32;
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index b771e125f9..18d5152015 100755
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -39,6 +39,7 @@
#include "indra_constants.h"
#include <OpenGL/OpenGL.h>
+#include <Carbon/Carbon.h>
#include <CoreServices/CoreServices.h>
extern BOOL gDebugWindowProc;
@@ -1743,16 +1744,34 @@ LLSD LLWindowMacOSX::getNativeKeyData()
return result;
}
-
BOOL LLWindowMacOSX::dialogColorPicker( F32 *r, F32 *g, F32 *b)
{
- // Is this even used anywhere? Do we really need an OS color picker?
BOOL retval = FALSE;
- //S32 error = 0;
+ OSErr error = noErr;
+ NColorPickerInfo info;
+
+ memset(&info, 0, sizeof(info));
+ info.theColor.color.rgb.red = (UInt16)(*r * 65535.f);
+ info.theColor.color.rgb.green = (UInt16)(*g * 65535.f);
+ info.theColor.color.rgb.blue = (UInt16)(*b * 65535.f);
+ info.placeWhere = kCenterOnMainScreen;
+
+ error = NPickColor(&info);
+
+ if (error == noErr)
+ {
+ retval = info.newColorChosen;
+ if (info.newColorChosen)
+ {
+ *r = ((float) info.theColor.color.rgb.red) / 65535.0;
+ *g = ((float) info.theColor.color.rgb.green) / 65535.0;
+ *b = ((float) info.theColor.color.rgb.blue) / 65535.0;
+ }
+ }
+
return (retval);
}
-
void *LLWindowMacOSX::getPlatformWindow()
{
// NOTE: this will be NULL in fullscreen mode. Plan accordingly.
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index bb77a24590..c20e639fc7 100755
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -223,7 +223,7 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
mOriginalAspectRatio = 1024.0 / 768.0;
if (title.empty())
- mWindowTitle = "SDL Window"; // *FIX: (???)
+ mWindowTitle = "SDL Window"; // *FIX: (?)
else
mWindowTitle = title;
@@ -956,7 +956,7 @@ BOOL LLWindowSDL::setPosition(const LLCoordScreen position)
{
if(mWindow)
{
- // *FIX: (???)
+ // *FIX: (?)
//MacMoveWindow(mWindow, position.mX, position.mY, false);
}
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 19961d5759..cd2be87fad 100755
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -86,6 +86,18 @@ void show_window_creation_error(const std::string& title)
LL_WARNS("Window") << title << LL_ENDL;
}
+HGLRC SafeCreateContext(HDC hdc)
+{
+ __try
+ {
+ return wglCreateContext(hdc);
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ return NULL;
+ }
+}
+
//static
BOOL LLWindowWin32::sIsClassRegistered = FALSE;
@@ -1167,14 +1179,15 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
return FALSE;
}
- if (!(mhRC = wglCreateContext(mhDC)))
+
+ if (!(mhRC = SafeCreateContext(mhDC)))
{
close();
OSMessageBox(mCallbacks->translateString("MBGLContextErr"),
mCallbacks->translateString("MBError"), OSMB_OK);
return FALSE;
}
-
+
if (!wglMakeCurrent(mhDC, mhRC))
{
close();
@@ -1832,6 +1845,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// This helps prevent avatar walking after maximizing the window by double-clicking the title bar.
static bool sHandleLeftMouseUp = true;
+ // Ignore the double click received right after activating app.
+ // This is to avoid triggering double click teleport after returning focus (see MAINT-3786).
+ static bool sHandleDoubleClick = true;
+
LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(h_wnd, GWL_USERDATA);
@@ -1959,6 +1976,11 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
}
}
+ if (!activating)
+ {
+ sHandleDoubleClick = false;
+ }
+
window_imp->mCallbacks->handleActivateApp(window_imp, activating);
break;
@@ -2183,6 +2205,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_NCLBUTTONDOWN");
// A click in a non-client area, e.g. title bar or window border.
sHandleLeftMouseUp = false;
+ sHandleDoubleClick = true;
}
break;
@@ -2227,6 +2250,13 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
//case WM_RBUTTONDBLCLK:
{
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_LBUTTONDBLCLK");
+
+ if (!sHandleDoubleClick)
+ {
+ sHandleDoubleClick = true;
+ break;
+ }
+
// Because we move the cursor position in the app, we need to query
// to find out where the cursor at the time the event is handled.
// If we don't do this, many clicks could get buffered up, and if the
diff --git a/indra/llxml/llxmlnode.h b/indra/llxml/llxmlnode.h
index 7ffc8a4b17..0b8da5dc5d 100755
--- a/indra/llxml/llxmlnode.h
+++ b/indra/llxml/llxmlnode.h
@@ -30,7 +30,7 @@
#ifndef XML_STATIC
#define XML_STATIC
#endif
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
#include <expat.h>
#else
#include "expat/expat.h"
diff --git a/indra/llxml/llxmlparser.h b/indra/llxml/llxmlparser.h
index e0f8b69452..a5b210404f 100755
--- a/indra/llxml/llxmlparser.h
+++ b/indra/llxml/llxmlparser.h
@@ -30,7 +30,7 @@
#ifndef XML_STATIC
#define XML_STATIC
#endif
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
#include <expat.h>
#else
#include "expat/expat.h"
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e57a597994..b81b2aa9cf 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -238,6 +238,7 @@ set(viewer_SOURCE_FILES
llfloatergesture.cpp
llfloatergodtools.cpp
llfloatergotoline.cpp
+ llfloatergroupbulkban.cpp
llfloatergroupinvite.cpp
llfloatergroups.cpp
llfloaterhandler.cpp
@@ -278,6 +279,7 @@ set(viewer_SOURCE_FILES
llfloaterregionrestarting.cpp
llfloatersceneloadstats.cpp
llfloaterscriptdebug.cpp
+ llfloaterscriptedprefs.cpp
llfloaterscriptlimits.cpp
llfloatersearch.cpp
llfloatersellland.cpp
@@ -411,6 +413,8 @@ set(viewer_SOURCE_FILES
llpanelface.cpp
llpanelgenerictip.cpp
llpanelgroup.cpp
+ llpanelgroupbulk.cpp
+ llpanelgroupbulkban.cpp
llpanelgroupgeneral.cpp
llpanelgroupinvite.cpp
llpanelgrouplandmoney.cpp
@@ -503,6 +507,7 @@ set(viewer_SOURCE_FILES
llscenemonitor.cpp
llsceneview.cpp
llscreenchannel.cpp
+ llscripteditor.cpp
llscriptfloater.cpp
llscrollingpanelparam.cpp
llscrollingpanelparambase.cpp
@@ -532,6 +537,7 @@ set(viewer_SOURCE_FILES
llstylemap.cpp
llsurface.cpp
llsurfacepatch.cpp
+ llsyntaxid.cpp
llsyswellitem.cpp
llsyswellwindow.cpp
llteleporthistory.cpp
@@ -836,6 +842,7 @@ set(viewer_HEADER_FILES
llfloatergesture.h
llfloatergodtools.h
llfloatergotoline.h
+ llfloatergroupbulkban.h
llfloatergroupinvite.h
llfloatergroups.h
llfloaterhandler.h
@@ -879,6 +886,7 @@ set(viewer_HEADER_FILES
llfloaterregionrestarting.h
llfloatersceneloadstats.h
llfloaterscriptdebug.h
+ llfloaterscriptedprefs.h
llfloaterscriptlimits.h
llfloatersearch.h
llfloatersellland.h
@@ -1002,6 +1010,9 @@ set(viewer_HEADER_FILES
llpanelface.h
llpanelgenerictip.h
llpanelgroup.h
+ llpanelgroupbulk.h
+ llpanelgroupbulkimpl.h
+ llpanelgroupbulkban.h
llpanelgroupgeneral.h
llpanelgroupinvite.h
llpanelgrouplandmoney.h
@@ -1091,6 +1102,7 @@ set(viewer_HEADER_FILES
llscenemonitor.h
llsceneview.h
llscreenchannel.h
+ llscripteditor.h
llscriptfloater.h
llscrollingpanelparam.h
llscrollingpanelparambase.h
@@ -1119,6 +1131,7 @@ set(viewer_HEADER_FILES
llstylemap.h
llsurface.h
llsurfacepatch.h
+ llsyntaxid.h
llsyswellitem.h
llsyswellwindow.h
lltable.h
@@ -1476,9 +1489,9 @@ if (WINDOWS)
SOURCE_GROUP("Resource Files" FILES ${viewer_RESOURCE_FILES})
- if (NOT STANDALONE)
+ if (NOT USESYSTEMLIBS)
list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES})
- endif (NOT STANDALONE)
+ endif (NOT USESYSTEMLIBS)
find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR})
find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR})
@@ -1553,7 +1566,7 @@ set(viewer_APPSETTINGS_FILES
app_settings/high_graphics.xml
app_settings/ignorable_dialogs.xml
app_settings/keys.xml
- app_settings/keywords.ini
+ app_settings/keywords_lsl_default.xml
app_settings/logcontrol.xml
app_settings/low_graphics.xml
app_settings/mid_graphics.xml
@@ -1589,9 +1602,9 @@ source_group("Character File" FILES ${viewer_CHARACTER_FILES})
set_source_files_properties(${viewer_CHARACTER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
-if (NOT STANDALONE)
+if (NOT USESYSTEMLIBS)
list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES})
-endif (NOT STANDALONE)
+endif (NOT USESYSTEMLIBS)
if (WINDOWS)
file(GLOB viewer_INSTALLER_FILES installers/windows/*.nsi)
@@ -1873,7 +1886,7 @@ elseif (DARWIN)
LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP"
)
else (WINDOWS)
- # Linux
+ # Linux
set_target_properties(${VIEWER_BINARY_NAME}
PROPERTIES
LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Wl,--Map=${VIEWER_BINARY_NAME}.MAP"
@@ -2083,7 +2096,7 @@ if (DARWIN)
)
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-crash-logger)
-
+
if (ENABLE_SIGNING)
set(SIGNING_SETTING "--signature=${SIGNING_IDENTITY}")
else (ENABLE_SIGNING)
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 584a914c29..35c6ac5179 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-3.7.11
+3.7.14
diff --git a/indra/newview/app_settings/keywords_lsl_default.xml b/indra/newview/app_settings/keywords_lsl_default.xml
new file mode 100755
index 0000000000..37dd2db93f
--- /dev/null
+++ b/indra/newview/app_settings/keywords_lsl_default.xml
@@ -0,0 +1,18289 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<llsd>
+ <map>
+ <key>controls</key>
+ <map>
+ <key>do</key>
+ <map>
+ <key>tooltip</key>
+ <string>do / while loop\ndo {\n...\n} while (&lt;condition&gt;);</string>
+ </map>
+ <key>else</key>
+ <map>
+ <key>tooltip</key>
+ <string>if / else block\nif (&lt;condition&gt;) {\n...\n[} else [if (&lt;condition&gt;) {\n...]]\n}</string>
+ </map>
+ <key>for</key>
+ <map>
+ <key>tooltip</key>
+ <string>for loop\nfor (&lt;initializer&gt;; &lt;condition&gt;; &lt;post-iteration-statement&gt;)\n{ ...\n}</string>
+ </map>
+ <key>if</key>
+ <map>
+ <key>tooltip</key>
+ <string>if / else block\nif (&lt;condition&gt;) {\n...\n[} else [if (&lt;condition&gt;) {\n...]]\n}</string>
+ </map>
+ <key>jump</key>
+ <map>
+ <key>tooltip</key>
+ <string>jump statement\njump &lt;label&gt;</string>
+ </map>
+ <key>return</key>
+ <map>
+ <key>tooltip</key>
+ <string>Leave current event or function.\nreturn [&lt;variable&gt;];\nOptionally pass back a variable's value, from a function.</string>
+ </map>
+ <key>state</key>
+ <map>
+ <key>tooltip</key>
+ <string>state &lt;target&gt;\nIf the target state is not the same as the current one, change to the target state.</string>
+ </map>
+ <key>while</key>
+ <map>
+ <key>tooltip</key>
+ <string>while loop\nwhile (&lt;condition&gt;) {\n,,,\n}</string>
+ </map>
+ </map>
+ <key>types</key>
+ <map>
+ <key>float</key>
+ <map>
+ <key>tooltip</key>
+ <string>32 bit floating point value.\nThe range is 1.175494351E-38 to 3.402823466E+38.</string>
+ </map>
+ <key>integer</key>
+ <map>
+ <key>tooltip</key>
+ <string>32 bit integer value.\n−2,147,483,648 and +2,147,483,647 (that is 0x80000000 to 0x7FFFFFFF in hex).</string>
+ </map>
+ <key>key</key>
+ <map>
+ <key>tooltip</key>
+ <string>A 128 bit unique identifier (UUID).\nThe key is represented as hexidecimal characters (A-F and 0-9), grouped into sections (8,4,4,4,12 characters) and separated by hyphens (for a total of 36 characters). e.g. "A822FF2B-FF02-461D-B45D-DCD10A2DE0C2".</string>
+ </map>
+ <key>list</key>
+ <map>
+ <key>tooltip</key>
+ <string>A collection of other data types.\nLists are signified by square brackets surrounding their elements; the elements inside are separated by commas. e.g. [0, 1, 2, 3, 4] or ["Yes", "No", "Perhaps"].</string>
+ </map>
+ <key>quaternion</key>
+ <map>
+ <key>tooltip</key>
+ <string>The quaternion type is a left over from way back when LSL was created. It was later renamed to &lt;rotation&gt; to make it more user friendly, but it appears someone forgot to remove it ;-)</string>
+ </map>
+ <key>rotation</key>
+ <map>
+ <key>tooltip</key>
+ <string>The rotation type is one of several ways to represent an orientation in 3D.\nIt is a mathematical object called a quaternion. You can think of a quaternion as four numbers (x, y, z, w), three of which represent the direction an object is facing and a fourth that represents the object's banking left or right around that direction.</string>
+ </map>
+ <key>string</key>
+ <map>
+ <key>tooltip</key>
+ <string>Text data.\nThe editor accepts UTF-8 encoded text.</string>
+ </map>
+ <key>vector</key>
+ <map>
+ <key>tooltip</key>
+ <string>A vector is a data type that contains a set of three float values.\nVectors are used to represent colors (RGB), positions, and directions/velocities.</string>
+ </map>
+ </map>
+ <key>constants</key>
+ <map>
+ <key>ACTIVE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string>Objects in world that are running a script or currently physically moving.</string>
+ </map>
+ <key>AGENT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string>Objects in world that are agents.</string>
+ </map>
+ <key>AGENT_ALWAYS_RUN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_ATTACHMENTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string>The agent has attachments.</string>
+ </map>
+ <key>AGENT_AUTOPILOT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_AWAY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x40</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_BUSY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x800</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_BY_LEGACY_NAME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_BY_USERNAME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_CROUCHING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x400</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_FLYING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string>The agent is flying.</string>
+ </map>
+ <key>AGENT_IN_AIR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_LIST_PARCEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Agents on the same parcel where the script is running.</string>
+ </map>
+ <key>AGENT_LIST_PARCEL_OWNER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Agents on any parcel in the region where the parcel owner is the same as the owner of the parcel under the scripted object.</string>
+ </map>
+ <key>AGENT_LIST_REGION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>All agents in the region.</string>
+ </map>
+ <key>AGENT_MOUSELOOK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_ON_OBJECT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_SCRIPTED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4</string>
+ <key>tooltip</key>
+ <string>The agent has scripted attachments.</string>
+ </map>
+ <key>AGENT_SITTING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_TYPING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x200</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AGENT_WALKING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x80</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ALL_SIDES</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ANIM_ON</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string>Texture animation is on.</string>
+ </map>
+ <key>ATTACH_AVATAR_CENTER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>40</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's geometric centre.</string>
+ </map>
+ <key>ATTACH_BACK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's back.</string>
+ </map>
+ <key>ATTACH_BELLY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>28</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's belly.</string>
+ </map>
+ <key>ATTACH_CHEST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's chest.</string>
+ </map>
+ <key>ATTACH_CHIN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>12</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's chin.</string>
+ </map>
+ <key>ATTACH_HEAD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's head.</string>
+ </map>
+ <key>ATTACH_HUD_BOTTOM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>37</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ATTACH_HUD_BOTTOM_LEFT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>36</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ATTACH_HUD_BOTTOM_RIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>38</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ATTACH_HUD_CENTER_1</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>35</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ATTACH_HUD_CENTER_2</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>31</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ATTACH_HUD_TOP_CENTER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>33</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ATTACH_HUD_TOP_LEFT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>34</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ATTACH_HUD_TOP_RIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>32</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ATTACH_LEAR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>13</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left ear.</string>
+ </map>
+ <key>ATTACH_LEFT_PEC</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>29</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left pectoral.</string>
+ </map>
+ <key>ATTACH_LEYE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>15</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left eye.</string>
+ </map>
+ <key>ATTACH_LFOOT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left foot.</string>
+ </map>
+ <key>ATTACH_LHAND</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left hand.</string>
+ </map>
+ <key>ATTACH_LHIP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>25</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left hip.</string>
+ </map>
+ <key>ATTACH_LLARM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>21</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left lower arm.</string>
+ </map>
+ <key>ATTACH_LLLEG</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>27</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's lower left leg.</string>
+ </map>
+ <key>ATTACH_LPEC</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>30</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right pectoral. (Deprecated, use ATTACH_RIGHT_PEC)</string>
+ </map>
+ <key>ATTACH_LSHOULDER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left shoulder.</string>
+ </map>
+ <key>ATTACH_LUARM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>20</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left upper arm.</string>
+ </map>
+ <key>ATTACH_LULEG</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>27</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's lower upper leg.</string>
+ </map>
+ <key>ATTACH_MOUTH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>11</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's mouth.</string>
+ </map>
+ <key>ATTACH_NECK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>39</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's neck.</string>
+ </map>
+ <key>ATTACH_NOSE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>17</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's nose.</string>
+ </map>
+ <key>ATTACH_PELVIS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's pelvis.</string>
+ </map>
+ <key>ATTACH_REAR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>14</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right ear.</string>
+ </map>
+ <key>ATTACH_REYE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>16</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right eye.</string>
+ </map>
+ <key>ATTACH_RFOOT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right foot.</string>
+ </map>
+ <key>ATTACH_RHAND</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right hand.</string>
+ </map>
+ <key>ATTACH_RHIP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>22</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right hip.</string>
+ </map>
+ <key>ATTACH_RIGHT_PEC</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>30</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right pectoral.</string>
+ </map>
+ <key>ATTACH_RLARM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>19</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right lower arm.</string>
+ </map>
+ <key>ATTACH_RLLEG</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>24</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right lower leg.</string>
+ </map>
+ <key>ATTACH_RPEC</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>29</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's left pectoral. (deprecated, use ATTACH_LEFT_PEC)</string>
+ </map>
+ <key>ATTACH_RSHOULDER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right shoulder.</string>
+ </map>
+ <key>ATTACH_RUARM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>18</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right upper arm.</string>
+ </map>
+ <key>ATTACH_RULEG</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>23</integer>
+ <key>tooltip</key>
+ <string>Attach to the avatar's right upper leg.</string>
+ </map>
+ <key>AVOID_CHARACTERS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AVOID_DYNAMIC_OBSTACLES</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>AVOID_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_ACTIVE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>12</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_BEHINDNESS_ANGLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_BEHINDNESS_LAG</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_DISTANCE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_FOCUS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>17</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_FOCUS_LAG</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_FOCUS_LOCKED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>22</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_FOCUS_OFFSET</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_FOCUS_THRESHOLD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>11</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_PITCH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_POSITION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>13</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_POSITION_LAG</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_POSITION_LOCKED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>22</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CAMERA_POSITION_THRESHOLD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHANGED_ALLOWED_DROP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x40</string>
+ <key>tooltip</key>
+ <string>The object inventory has changed because an item was added through the llAllowInventoryDrop interface.</string>
+ </map>
+ <key>CHANGED_COLOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string>The object color has changed.</string>
+ </map>
+ <key>CHANGED_INVENTORY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string>The object inventory has changed.</string>
+ </map>
+ <key>CHANGED_LINK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string>The object has linked or its links were broken.</string>
+ </map>
+ <key>CHANGED_MEDIA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2048</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHANGED_OWNER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x80</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHANGED_REGION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHANGED_REGION_START</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x400</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHANGED_SCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string>The object scale (size) has changed.</string>
+ </map>
+ <key>CHANGED_SHAPE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4</string>
+ <key>tooltip</key>
+ <string>The object base shape has changed, e.g., a box to a cylinder.</string>
+ </map>
+ <key>CHANGED_TELEPORT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x200</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHANGED_TEXTURE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string>The texture offset, scale rotation, or simply the object texture has changed.</string>
+ </map>
+ <key>CHARACTER_ACCOUNT_FOR_SKIPPED_FRAMES</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>14</integer>
+ <key>tooltip</key>
+ <string>If set to false, character will not attempt to catch up on lost time when pathfinding performance is low, potentially providing more reliable movement (albeit while potentially appearing to be more stuttery). Default is true to match pre-existing behavior.</string>
+ </map>
+ <key>CHARACTER_AVOIDANCE_MODE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>Allows you to specify that a character should not try to avoid other characters, should not try to avoid dynamic obstacles (relatively fast moving objects and avatars), or both.</string>
+ </map>
+ <key>CHARACTER_CMD_JUMP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x01</string>
+ <key>tooltip</key>
+ <string>Makes the character jump. Requires an additional parameter, the height to jump, between 0.1m and 2.0m. This must be provided as the first element of the llExecCharacterCmd option list.</string>
+ </map>
+ <key>CHARACTER_CMD_SMOOTH_STOP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHARACTER_CMD_STOP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x00</string>
+ <key>tooltip</key>
+ <string>Stops any current pathfinding operation.</string>
+ </map>
+ <key>CHARACTER_DESIRED_SPEED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Speed of pursuit in meters per second.</string>
+ </map>
+ <key>CHARACTER_DESIRED_TURN_SPEED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>12</integer>
+ <key>tooltip</key>
+ <string>The character's maximum speed while turning about the Z axis. - Note that this is only loosely enforced.</string>
+ </map>
+ <key>CHARACTER_LENGTH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>Set collision capsule length - cannot be less than two times the radius.</string>
+ </map>
+ <key>CHARACTER_MAX_ACCEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string>The character's maximum acceleration rate.</string>
+ </map>
+ <key>CHARACTER_MAX_DECEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string>The character's maximum deceleration rate.</string>
+ </map>
+ <key>CHARACTER_MAX_SPEED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>13</integer>
+ <key>tooltip</key>
+ <string>The character's maximum speed.</string>
+ </map>
+ <key>CHARACTER_MAX_TURN_RADIUS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string>The character's turn radius when travelling at CHARACTER_MAX_TURN_SPEED.</string>
+ </map>
+ <key>CHARACTER_ORIENTATION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Valid options are: VERTICAL, HORIZONTAL.</string>
+ </map>
+ <key>CHARACTER_RADIUS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Set collision capsule radius.</string>
+ </map>
+ <key>CHARACTER_STAY_WITHIN_PARCEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>15</integer>
+ <key>tooltip</key>
+ <string>Determines whether a character can leave its starting parcel.\nTakes a boolean parameter. If TRUE, the character cannot voluntarilly leave the parcel, but can return to it.</string>
+ </map>
+ <key>CHARACTER_TYPE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>Specifies which walk-ability coefficient will be used by this character.</string>
+ </map>
+ <key>CHARACTER_TYPE_A</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHARACTER_TYPE_B</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHARACTER_TYPE_C</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHARACTER_TYPE_D</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CHARACTER_TYPE_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>CLICK_ACTION_BUY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>When the prim is clicked, the buy dialog is opened.</string>
+ </map>
+ <key>CLICK_ACTION_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Performs the default action: when the prim is clicked, touch events are triggered.</string>
+ </map>
+ <key>CLICK_ACTION_OPEN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>When the prim is clicked, the object inventory dialog is opened.</string>
+ </map>
+ <key>CLICK_ACTION_OPEN_MEDIA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>When the prim is touched, the web media dialog is opened.</string>
+ </map>
+ <key>CLICK_ACTION_PAY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>When the prim is clicked, the pay dialog is opened.</string>
+ </map>
+ <key>CLICK_ACTION_PLAY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>When the prim is clicked, html-on-a-prim is enabled?</string>
+ </map>
+ <key>CLICK_ACTION_SIT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>When the prim is clicked, the avatar sits upon it.</string>
+ </map>
+ <key>CLICK_ACTION_TOUCH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>When the prim is clicked, touch events are triggered.</string>
+ </map>
+ <key>CONTENT_TYPE_ATOM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>"application/atom+xml"</string>
+ </map>
+ <key>CONTENT_TYPE_FORM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string>"application/x-www-form-urlencoded"</string>
+ </map>
+ <key>CONTENT_TYPE_HTML</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>"text/html", only valid for embedded browsers on content owned by the person viewing. Falls back to "text/plain" otherwise.</string>
+ </map>
+ <key>CONTENT_TYPE_JSON</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>"application/json"</string>
+ </map>
+ <key>CONTENT_TYPE_LLSD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>"application/llsd+xml"</string>
+ </map>
+ <key>CONTENT_TYPE_RSS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string>"application/rss+xml"</string>
+ </map>
+ <key>CONTENT_TYPE_TEXT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>"text/plain"</string>
+ </map>
+ <key>CONTENT_TYPE_XHTML</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>"application/xhtml+xml"</string>
+ </map>
+ <key>CONTENT_TYPE_XML</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>"application/xml"</string>
+ </map>
+ <key>CONTROL_BACK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string>Test for the avatar move back control.</string>
+ </map>
+ <key>CONTROL_DOWN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string>Test for the avatar move down control.</string>
+ </map>
+ <key>CONTROL_FWD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string>Test for the avatar move forward control.</string>
+ </map>
+ <key>CONTROL_LBUTTON</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10000000</string>
+ <key>tooltip</key>
+ <string>Test for the avatar left button control.</string>
+ </map>
+ <key>CONTROL_LEFT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4</string>
+ <key>tooltip</key>
+ <string>Test for the avatar move left control.</string>
+ </map>
+ <key>CONTROL_ML_LBUTTON</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x40000000</string>
+ <key>tooltip</key>
+ <string>Test for the avatar left button control while in mouse look.</string>
+ </map>
+ <key>CONTROL_RIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string>Test for the avatar move right control.</string>
+ </map>
+ <key>CONTROL_ROT_LEFT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100</string>
+ <key>tooltip</key>
+ <string>Test for the avatar rotate left control.</string>
+ </map>
+ <key>CONTROL_ROT_RIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x200</string>
+ <key>tooltip</key>
+ <string>Test for the avatar rotate right control.</string>
+ </map>
+ <key>CONTROL_UP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string>Test for the avatar move up control.</string>
+ </map>
+ <key>DATA_BORN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>The date the agent was born, returned in ISO 8601 format of YYYY-MM-DD.</string>
+ </map>
+ <key>DATA_NAME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>The name of the agent.</string>
+ </map>
+ <key>DATA_ONLINE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>TRUE for online, FALSE for offline.</string>
+ </map>
+ <key>DATA_PAYINFO</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>DATA_RATING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Returns the agent ratings as a comma separated string of six integers. They are:
+ 1) Positive rated behaviour
+ 2) Negative rated behaviour
+ 3) Positive rated appearance
+ 4) Negative rated appearance
+ 5) Positive rated building
+ 6) Negative rated building</string>
+ </map>
+ <key>DATA_SIM_POS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>DATA_SIM_RATING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>DATA_SIM_STATUS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>DEBUG_CHANNEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2147483647</integer>
+ <key>tooltip</key>
+ <string>DEBUG_CHANNEL is an integer constant that, when passed to llSay, llWhisper, or llShout as a channel parameter, will print text to the Script Warning/Error Window.</string>
+ </map>
+ <key>DEG_TO_RAD</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>value</key>
+ <real>0.01745329</real>
+ <key>tooltip</key>
+ <string>0.01745329 - Number of radians per degree.
+ You can use this to convert degrees to radians by multiplying the degrees by this number.</string>
+ </map>
+ <key>DENSITY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Used with llSetPhysicsMaterial to enable the density value. Must be between 1.0 and 22587.0 (in Kg/m^3 -- see if you can figure out what 22587 represents)</string>
+ </map>
+ <key>EOF</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>0x0A0x0A0x0A</string>
+ <key>tooltip</key>
+ <string>Indicates the last line of a notecard was read.</string>
+ </map>
+ <key>ERR_GENERIC</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ERR_MALFORMED_PARAMS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ERR_PARCEL_PERMISSIONS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ERR_RUNTIME_PERMISSIONS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ERR_THROTTLED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ESTATE_ACCESS_ALLOWED_AGENT_ADD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Add the agent to this estate's Allowed Residents list.</string>
+ </map>
+ <key>ESTATE_ACCESS_ALLOWED_AGENT_REMOVE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string>Remove the agent from this estate's Allowed Residents list.</string>
+ </map>
+ <key>ESTATE_ACCESS_ALLOWED_GROUP_ADD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>16</integer>
+ <key>tooltip</key>
+ <string>Add the group to this estate's Allowed groups list.</string>
+ </map>
+ <key>ESTATE_ACCESS_ALLOWED_GROUP_REMOVE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>32</integer>
+ <key>tooltip</key>
+ <string>Remove the group from this estate's Allowed groups list.</string>
+ </map>
+ <key>ESTATE_ACCESS_BANNED_AGENT_ADD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>64</integer>
+ <key>tooltip</key>
+ <string>Add the agent to this estate's Banned residents list.</string>
+ </map>
+ <key>ESTATE_ACCESS_BANNED_AGENT_REMOVE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>128</integer>
+ <key>tooltip</key>
+ <string>Remove the agent from this estate's Banned residents list.</string>
+ </map>
+ <key>FALSE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>An integer constant for boolean comparisons. Has the value '0'.</string>
+ </map>
+ <key>FORCE_DIRECT_PATH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Makes character navigate in a straight line toward position. May be set to TRUE or FALSE.</string>
+ </map>
+ <key>FRICTION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Used with llSetPhysicsMaterial to enable the friction value. Must be between 0.0 and 255.0</string>
+ </map>
+ <key>GCNP_RADIUS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>GCNP_STATIC</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>GRAVITY_MULTIPLIER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string>Used with llSetPhysicsMaterial to enable the gravity multiplier value. Must be between -1.0 and +28.0</string>
+ </map>
+ <key>HORIZONTAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>HTTP_BODY_MAXLENGTH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>HTTP_BODY_TRUNCATED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>HTTP_CUSTOM_HEADER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>Add an extra custom HTTP header to the request. The first string is the name of the parameter to change, e.g. "Pragma", and the second string is the value, e.g. "no-cache". Up to 8 custom headers may be configured per request. Note that certain headers, such as the default headers, are blocked for security reasons.</string>
+ </map>
+ <key>HTTP_METHOD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>HTTP_MIMETYPE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>HTTP_PRAGMA_NO_CACHE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>Allows enabling/disbling of the "Pragma: no-cache" header.\nUsage: [HTTP_PRAGMA_NO_CACHE, integer SendHeader]. When SendHeader is TRUE, the "Pragma: no-cache" header is sent by the script. This matches the default behavior. When SendHeader is FALSE, no "Pragma" header is sent by the script.</string>
+ </map>
+ <key>HTTP_VERBOSE_THROTTLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>HTTP_VERIFY_CERT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_ALL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_ANIMATION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>20</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_BODYPART</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>13</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_CLOTHING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_GESTURE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>21</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_LANDMARK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_NOTECARD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_OBJECT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_SCRIPT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_SOUND</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>INVENTORY_TEXTURE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_APPEND</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_ARRAY</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>U+FDD2</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_DELETE</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>U+FDD8</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_FALSE</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>U+FDD7</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_INVALID</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>U+FDD0</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_NULL</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>U+FDD5</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_NUMBER</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>U+FDD3</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_OBJECT</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>U+FDD1</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_STRING</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>U+FDD4</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>JSON_TRUE</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>U+FDD6</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>KFM_CMD_PAUSE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>For use with KFM_COMMAND.</string>
+ </map>
+ <key>KFM_CMD_PLAY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>For use with KFM_COMMAND.</string>
+ </map>
+ <key>KFM_CMD_STOP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>For use with KFM_COMMAND.</string>
+ </map>
+ <key>KFM_COMMAND</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>KFM_DATA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>KFM_FORWARD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>For use with KFM_MODE.</string>
+ </map>
+ <key>KFM_LOOP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>For use with KFM_MODE.</string>
+ </map>
+ <key>KFM_MODE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>KFM_PING_PONG</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>For use with KFM_MODE.</string>
+ </map>
+ <key>KFM_REVERSE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>For use with KFM_MODE.</string>
+ </map>
+ <key>KFM_ROTATION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>For use with KFM_DATA.</string>
+ </map>
+ <key>KFM_TRANSLATION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>For use with KFM_DATA.</string>
+ </map>
+ <key>LAND_LARGE_BRUSH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>Use a large brush size.\nNOTE: This value is incorrect, a large brush should be 2.</string>
+ </map>
+ <key>LAND_LEVEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Action to level the land.</string>
+ </map>
+ <key>LAND_LOWER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Action to lower the land.</string>
+ </map>
+ <key>LAND_MEDIUM_BRUSH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Use a medium brush size.\nNOTE: This value is incorrect, a medium brush should be 1.</string>
+ </map>
+ <key>LAND_NOISE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LAND_RAISE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Action to raise the land.</string>
+ </map>
+ <key>LAND_REVERT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LAND_SMALL_BRUSH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Use a small brush size.\nNOTE: This value is incorrect, a small brush should be 0.</string>
+ </map>
+ <key>LAND_SMOOTH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LINK_ALL_CHILDREN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-3</integer>
+ <key>tooltip</key>
+ <string>This targets every object except the root in the linked set.</string>
+ </map>
+ <key>LINK_ALL_OTHERS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-2</integer>
+ <key>tooltip</key>
+ <string>This targets every object in the linked set except the object with the script.</string>
+ </map>
+ <key>LINK_ROOT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>This targets the root of the linked set.</string>
+ </map>
+ <key>LINK_SET</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string>This targets every object in the linked set.</string>
+ </map>
+ <key>LINK_THIS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-4</integer>
+ <key>tooltip</key>
+ <string>The link number of the prim containing the script.</string>
+ </map>
+ <key>LIST_STAT_GEOMETRIC_MEAN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LIST_STAT_MAX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LIST_STAT_MEAN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LIST_STAT_MEDIAN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LIST_STAT_MIN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LIST_STAT_NUM_COUNT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LIST_STAT_RANGE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LIST_STAT_STD_DEV</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LIST_STAT_SUM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LIST_STAT_SUM_SQUARES</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>LOOP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string>Loop the texture animation.</string>
+ </map>
+ <key>MASK_BASE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>MASK_EVERYONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>MASK_GROUP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>MASK_NEXT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>MASK_OWNER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>NULL_KEY</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>value</key>
+ <uuid>00000000-0000-0000-0000-000000000000</uuid>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_ATTACHED_POINT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>19</integer>
+ <key>tooltip</key>
+ <string>Gets the attachment point to which the object is attached.\nReturns 0 if the object is not an attachment (or is an avatar, etc).</string>
+ </map>
+ <key>OBJECT_CHARACTER_TIME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>17</integer>
+ <key>tooltip</key>
+ <string>Units in seconds</string>
+ </map>
+ <key>OBJECT_CREATOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string>Gets the object's creator key. If id is an avatar, a NULL_KEY is returned.</string>
+ </map>
+ <key>OBJECT_DESC</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Gets the object's description. If id is an avatar, an empty string is returned.</string>
+ </map>
+ <key>OBJECT_GROUP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string>Gets the prims's group key. If id is an avatar, a NULL_KEY is returned.</string>
+ </map>
+ <key>OBJECT_NAME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Gets the object's name.</string>
+ </map>
+ <key>OBJECT_OWNER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>Gets an object's owner's key. If id is group owned, a NULL_KEY is returned.</string>
+ </map>
+ <key>OBJECT_PATHFINDING_TYPE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>20</integer>
+ <key>tooltip</key>
+ <string>Returns the pathfinding setting of any object in the region. It returns an integer matching one of the OPT_* constants.</string>
+ </map>
+ <key>OBJECT_PHANTOM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>22</integer>
+ <key>tooltip</key>
+ <string>Returns boolean, detailing if phantom is enabled or disabled on the object.\nIf id is an avatar or attachment, 0 is returned.</string>
+ </map>
+ <key>OBJECT_PHYSICS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>21</integer>
+ <key>tooltip</key>
+ <string>Returns boolean, detailing if physics is enabled or disabled on the object.\nIf id is an avatar or attachment, 0 is returned.</string>
+ </map>
+ <key>OBJECT_PHYSICS_COST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>16</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_POS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>Gets the object's position in region coordinates.</string>
+ </map>
+ <key>OBJECT_PRIM_EQUIVALENCE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>13</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_RENDER_WEIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>24</integer>
+ <key>tooltip</key>
+ <string>This is a flag used with llGetObjectDetails to get the Avatar_Rendering_Cost of an avatar, based on values reported by nearby viewers.\nIf no data is available, -1 is returned.\nThe maximum render weight stored by the simulator is 500000. When called against an object, 0 is returned.</string>
+ </map>
+ <key>OBJECT_RETURN_PARCEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_RETURN_PARCEL_OWNER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_RETURN_REGION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_ROOT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>18</integer>
+ <key>tooltip</key>
+ <string>Gets the id of the root prim of the object requested.\nIf id is an avatar, return the id of the root prim of the linkset the avatar is sitting on (or the avatar's own id if the avatar is not sitting on an object within the region).</string>
+ </map>
+ <key>OBJECT_ROT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Gets the object's rotation.</string>
+ </map>
+ <key>OBJECT_RUNNING_SCRIPT_COUNT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_SCRIPT_MEMORY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>11</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_SCRIPT_TIME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>12</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_SERVER_COST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>14</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_STREAMING_COST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>15</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_TEMP_ON_REZ</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>23</integer>
+ <key>tooltip</key>
+ <string>Returns boolean, detailing if temporary is enabled or disabled on the object.</string>
+ </map>
+ <key>OBJECT_TOTAL_SCRIPT_COUNT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_UNKNOWN_DETAIL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>OBJECT_VELOCITY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>Gets the object's velocity.</string>
+ </map>
+ <key>OPT_AVATAR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Returned for avatars.</string>
+ </map>
+ <key>OPT_CHARACTER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Returned for pathfinding characters.</string>
+ </map>
+ <key>OPT_EXCLUSION_VOLUME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>Returned for exclusion volumes.</string>
+ </map>
+ <key>OPT_LEGACY_LINKSET</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Returned for movable obstacles, movable phantoms, physical, and volumedetect objects.</string>
+ </map>
+ <key>OPT_MATERIAL_VOLUME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>Returned for material volumes.</string>
+ </map>
+ <key>OPT_OTHER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string>Returned for attachments, Linden trees, and grass.</string>
+ </map>
+ <key>OPT_STATIC_OBSTACLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Returned for static obstacles.</string>
+ </map>
+ <key>OPT_WALKABLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>Returned for walkable objects.</string>
+ </map>
+ <key>PARCEL_COUNT_GROUP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_COUNT_OTHER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_COUNT_OWNER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_COUNT_SELECTED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_COUNT_TEMP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_COUNT_TOTAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_DETAILS_AREA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>The parcel's area, in square meters. (5 chars.).</string>
+ </map>
+ <key>PARCEL_DETAILS_DESC</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>The description of the parcel. (127 chars).</string>
+ </map>
+ <key>PARCEL_DETAILS_GROUP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>The parcel group's key. (36 chars.).</string>
+ </map>
+ <key>PARCEL_DETAILS_ID</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>The parcel's key. (36 chars.).</string>
+ </map>
+ <key>PARCEL_DETAILS_NAME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>The name of the parcel. (63 chars.).</string>
+ </map>
+ <key>PARCEL_DETAILS_OWNER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>The parcel owner's key. (36 chars.).</string>
+ </map>
+ <key>PARCEL_DETAILS_SEE_AVATARS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>The parcel's avatar visibility setting. (1 char.).</string>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x08000000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4000000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_CREATE_OBJECTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x40</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_DAMAGE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_FLY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10000000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_GROUP_SCRIPTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2000000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_LANDMARK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_SCRIPTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_ALLOW_TERRAFORM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_LOCAL_SOUND_ONLY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_RESTRICT_PUSHOBJECT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x200000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_USE_ACCESS_GROUP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_USE_ACCESS_LIST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x200</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_USE_BAN_LIST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x400</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_FLAG_USE_LAND_PASS_LIST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x800</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_AGENT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_AUTO_ALIGN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_DESC</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>12</integer>
+ <key>tooltip</key>
+ <string>Use this to get or set the parcel media description.</string>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_LOOP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_LOOP_SET</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>13</integer>
+ <key>tooltip</key>
+ <string>Used to get or set the parcel's media looping variable.</string>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_PAUSE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_PLAY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_SIZE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>11</integer>
+ <key>tooltip</key>
+ <string>Use this to get or set the parcel media pixel resolution.</string>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_STOP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_TEXTURE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_TIME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_TYPE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string>Use this to get or set the parcel media MIME type (e.g. "text/html").</string>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_UNLOAD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PARCEL_MEDIA_COMMAND_URL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PASSIVE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4</string>
+ <key>tooltip</key>
+ <string>Static in-world objects.</string>
+ </map>
+ <key>PATROL_PAUSE_AT_WAYPOINTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PAY_DEFAULT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PAY_HIDE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PAYMENT_INFO_ON_FILE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PAYMENT_INFO_USED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERM_ALL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x7FFFFFFF</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERM_COPY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERM_MODIFY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERM_MOVE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x80000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERM_TRANSFER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERMISSION_ATTACH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string>If this permission is enabled, the object can successfully call llAttachToAvatar to attach to the given avatar.</string>
+ </map>
+ <key>PERMISSION_CHANGE_JOINTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100</string>
+ <key>tooltip</key>
+ <string>(not yet implemented)</string>
+ </map>
+ <key>PERMISSION_CHANGE_LINKS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x80</string>
+ <key>tooltip</key>
+ <string>If this permission is enabled, the object can successfully call llCreateLink, llBreakLink, and llBreakAllLinks to change links to other objects.</string>
+ </map>
+ <key>PERMISSION_CHANGE_PERMISSIONS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x200</string>
+ <key>tooltip</key>
+ <string>(not yet implemented)</string>
+ </map>
+ <key>PERMISSION_CONTROL_CAMERA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x800</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERMISSION_DEBIT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string>If this permission is enabled, the object can successfully call llGiveMoney or llTransferLindenDollars to debit the owners account.</string>
+ </map>
+ <key>PERMISSION_OVERRIDE_ANIMATIONS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8000</string>
+ <key>tooltip</key>
+ <string>Permission to override default animations.</string>
+ </map>
+ <key>PERMISSION_RELEASE_OWNERSHIP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x40</string>
+ <key>tooltip</key>
+ <string>(not yet implemented)</string>
+ </map>
+ <key>PERMISSION_REMAP_CONTROLS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string>(not yet implemented)</string>
+ </map>
+ <key>PERMISSION_RETURN_OBJECTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>65536</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERMISSION_SILENT_ESTATE_MANAGEMENT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4000</string>
+ <key>tooltip</key>
+ <string>A script with this permission does not notify the object owner when it modifies estate access rules via llManageEstateAccess.</string>
+ </map>
+ <key>PERMISSION_TAKE_CONTROLS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4</string>
+ <key>tooltip</key>
+ <string>If this permission enabled, the object can successfully call the llTakeControls libray call.</string>
+ </map>
+ <key>PERMISSION_TELEPORT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERMISSION_TRACK_CAMERA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x400</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PERMISSION_TRIGGER_ANIMATION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string>If this permission is enabled, the object can successfully call llStartAnimation for the avatar that owns this.</string>
+ </map>
+ <key>PI</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>value</key>
+ <real>3.14159265</real>
+ <key>tooltip</key>
+ <string>3.14159265 - The number of radians in a semi-circle.</string>
+ </map>
+ <key>PI_BY_TWO</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>value</key>
+ <real>1.57079633</real>
+ <key>tooltip</key>
+ <string>1.57079633 - The number of radians in a quarter circle.</string>
+ </map>
+ <key>PING_PONG</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string>Play animation going forwards, then backwards.</string>
+ </map>
+ <key>PRIM_BUMP_BARK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_BLOBS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>12</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_BRICKS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_BRIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_CHECKER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_CONCRETE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_DARK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_DISKS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_GRAVEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>11</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_LARGETILE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>14</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_SHINY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>19</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_SIDING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>13</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_STONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_STUCCO</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>15</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_SUCTION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>16</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_TILE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_WEAVE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>17</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_BUMP_WOOD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_CAST_SHADOWS</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>24</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_COLOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>18</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_DESC</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>28</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_FLEXIBLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>21</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_FULLBRIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>20</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_GLOW</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>25</integer>
+ <key>tooltip</key>
+ <string>PRIM_GLOW is used to get or set the glow status of the face.</string>
+ </map>
+ <key>PRIM_HOLE_CIRCLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_HOLE_DEFAULT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x00</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_HOLE_SQUARE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_HOLE_TRIANGLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x30</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_LINK_TARGET</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>34</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MATERIAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MATERIAL_FLESH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MATERIAL_GLASS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MATERIAL_LIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MATERIAL_METAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MATERIAL_PLASTIC</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MATERIAL_RUBBER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MATERIAL_STONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MATERIAL_WOOD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_ALT_IMAGE_ENABLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Boolean. Gets/Sets the default image state (the image that the user sees before a piece of media is active) for the chosen face. The default image is specified by Second Life's server for that media type.</string>
+ </map>
+ <key>PRIM_MEDIA_AUTO_LOOP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Boolean. Gets/Sets whether auto-looping is enabled.</string>
+ </map>
+ <key>PRIM_MEDIA_AUTO_PLAY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>Boolean. Gets/Sets whether the media auto-plays when a Resident can view it.</string>
+ </map>
+ <key>PRIM_MEDIA_AUTO_SCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>Boolean. Gets/Sets whether auto-scaling is enabled. Auto-scaling forces the media to the full size of the texture.</string>
+ </map>
+ <key>PRIM_MEDIA_AUTO_ZOOM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string>Boolean. Gets/Sets whether clicking the media triggers auto-zoom and auto-focus on the media.</string>
+ </map>
+ <key>PRIM_MEDIA_CONTROLS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Integer. Gets/Sets the style of controls. Can be either PRIM_MEDIA_CONTROLS_STANDARD or PRIM_MEDIA_CONTROLS_MINI.</string>
+ </map>
+ <key>PRIM_MEDIA_CONTROLS_MINI</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Mini web navigation controls; does not include an address bar.</string>
+ </map>
+ <key>PRIM_MEDIA_CONTROLS_STANDARD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Standard web navigation controls.</string>
+ </map>
+ <key>PRIM_MEDIA_CURRENT_URL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>String. Gets/Sets the current url displayed on the chosen face. Changing this URL causes navigation. 1024 characters Maximum.</string>
+ </map>
+ <key>PRIM_MEDIA_FIRST_CLICK_INTERACT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string>Boolean. Gets/Sets whether the first click interaction is enabled.</string>
+ </map>
+ <key>PRIM_MEDIA_HEIGHT_PIXELS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string>Integer. Gets/Sets the height of the media in pixels.</string>
+ </map>
+ <key>PRIM_MEDIA_HOME_URL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>String. Gets/Sets the home URL for the chosen face. 1024 characters maximum.</string>
+ </map>
+ <key>PRIM_MEDIA_MAX_HEIGHT_PIXELS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2048</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_MAX_URL_LENGTH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1024</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_MAX_WHITELIST_COUNT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>64</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_MAX_WHITELIST_SIZE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1024</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_MAX_WIDTH_PIXELS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2048</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_PARAM_MAX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>14</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_PERM_ANYONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_PERM_GROUP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_PERM_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_PERM_OWNER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_MEDIA_PERMS_CONTROL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>14</integer>
+ <key>tooltip</key>
+ <string>Integer. Gets/Sets the permissions mask that control who can see the media control bar above the object:: PRIM_MEDIA_PERM_ANYONE, PRIM_MEDIA_PERM_GROUP, PRIM_MEDIA_PERM_NONE, PRIM_MEDIA_PERM_OWNER</string>
+ </map>
+ <key>PRIM_MEDIA_PERMS_INTERACT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>13</integer>
+ <key>tooltip</key>
+ <string>Integer. Gets/Sets the permissions mask that control who can interact with the object: PRIM_MEDIA_PERM_ANYONE, PRIM_MEDIA_PERM_GROUP, PRIM_MEDIA_PERM_NONE, PRIM_MEDIA_PERM_OWNER</string>
+ </map>
+ <key>PRIM_MEDIA_WHITELIST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>12</integer>
+ <key>tooltip</key>
+ <string>String. Gets/Sets the white-list as a string of escaped, comma-separated URLs. This string can hold up to 64 URLs or 1024 characters, whichever comes first.</string>
+ </map>
+ <key>PRIM_MEDIA_WHITELIST_ENABLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>11</integer>
+ <key>tooltip</key>
+ <string>Boolean. Gets/Sets whether navigation is restricted to URLs in PRIM_MEDIA_WHITELIST.</string>
+ </map>
+ <key>PRIM_MEDIA_WIDTH_PIXELS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string>Integer. Gets/Sets the width of the media in pixels.</string>
+ </map>
+ <key>PRIM_NAME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>27</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_OMEGA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>32</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_PHANTOM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_PHYSICS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_PHYSICS_SHAPE_CONVEX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Use the convex hull of the prim shape for physics (this is the default for mesh objects).</string>
+ </map>
+ <key>PRIM_PHYSICS_SHAPE_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Ignore this prim in the physics shape. NB: This cannot be applied to the root prim.</string>
+ </map>
+ <key>PRIM_PHYSICS_SHAPE_PRIM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Use the normal prim shape for physics (this is the default for all non-mesh objects).</string>
+ </map>
+ <key>PRIM_PHYSICS_SHAPE_TYPE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>30</integer>
+ <key>tooltip</key>
+ <string>Allows you to set the physics shape type of a prim via lsl. Permitted values are:
+ PRIM_PHYSICS_SHAPE_NONE, PRIM_PHYSICS_SHAPE_PRIM, PRIM_PHYSICS_SHAPE_CONVEX</string>
+ </map>
+ <key>PRIM_POINT_LIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>23</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_POS_LOCAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>33</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_POSITION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_ROT_LOCAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>29</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_ROTATION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SCULPT_FLAG_INVERT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>64</integer>
+ <key>tooltip</key>
+ <string>Render inside out (inverts the normals).</string>
+ </map>
+ <key>PRIM_SCULPT_FLAG_MIRROR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>128</integer>
+ <key>tooltip</key>
+ <string>Render an X axis mirror of the sculpty.</string>
+ </map>
+ <key>PRIM_SCULPT_TYPE_CYLINDER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SCULPT_TYPE_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SCULPT_TYPE_PLANE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SCULPT_TYPE_SPHERE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SCULPT_TYPE_TORUS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SHINY_HIGH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SHINY_LOW</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SHINY_MEDIUM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SHINY_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SIZE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_SLICE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>35</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TEMP_ON_REZ</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TEXGEN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>22</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TEXGEN_DEFAULT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TEXGEN_PLANAR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TEXT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>26</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TEXTURE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>17</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TYPE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TYPE_BOX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TYPE_CYLINDER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TYPE_PRISM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TYPE_RING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TYPE_SCULPT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TYPE_SPHERE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TYPE_TORUS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PRIM_TYPE_TUBE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PROFILE_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Disables profiling</string>
+ </map>
+ <key>PROFILE_SCRIPT_MEMORY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Enables memory profiling</string>
+ </map>
+ <key>PSYS_PART_BF_DEST_COLOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_BF_ONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_BF_ONE_MINUS_DEST_COLOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_BF_SOURCE_ALPHA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_BF_SOURCE_COLOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_BF_ZERO</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_BLEND_FUNC_DEST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>25</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_BLEND_FUNC_SOURCE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>24</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_BOUNCE_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4</string>
+ <key>tooltip</key>
+ <string>Particles bounce off of a plane at the objects Z height.</string>
+ </map>
+ <key>PSYS_PART_EMISSIVE_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100</string>
+ <key>tooltip</key>
+ <string>The particle glows.</string>
+ </map>
+ <key>PSYS_PART_END_ALPHA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>A float which determines the ending alpha of the object.</string>
+ </map>
+ <key>PSYS_PART_END_COLOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>A vector &lt;r, g, b&gt; which determines the ending color of the object.</string>
+ </map>
+ <key>PSYS_PART_END_GLOW</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>27</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_END_SCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>A vector &lt;sx, sy, z&gt;, which is the ending size of the particle billboard in meters (z is ignored).</string>
+ </map>
+ <key>PSYS_PART_FLAGS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Each particle that is emitted by the particle system is simulated based on the following flags. To use multiple flags, bitwise or (|) them together.</string>
+ </map>
+ <key>PSYS_PART_FOLLOW_SRC_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string>The particle position is relative to the source objects position.</string>
+ </map>
+ <key>PSYS_PART_FOLLOW_VELOCITY_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string>The particle orientation is rotated so the vertical axis faces towards the particle velocity.</string>
+ </map>
+ <key>PSYS_PART_INTERP_COLOR_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string>Interpolate both the color and alpha from the start value to the end value.</string>
+ </map>
+ <key>PSYS_PART_INTERP_SCALE_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string>Interpolate the particle scale from the start value to the end value.</string>
+ </map>
+ <key>PSYS_PART_MAX_AGE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>19</integer>
+ <key>tooltip</key>
+ <string>Age in seconds of a particle at which it dies.</string>
+ </map>
+ <key>PSYS_PART_RIBBON_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x400</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_START_ALPHA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>A float which determines the starting alpha of the object.</string>
+ </map>
+ <key>PSYS_PART_START_COLOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>A vector &lt;r.r, g.g, b.b&gt; which determines the starting color of the object.</string>
+ </map>
+ <key>PSYS_PART_START_GLOW</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>26</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_START_SCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>A vector &lt;sx, sy, z&gt;, which is the starting size of the particle billboard in meters (z is ignored).</string>
+ </map>
+ <key>PSYS_PART_TARGET_LINEAR_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x80</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_PART_TARGET_POS_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x40</string>
+ <key>tooltip</key>
+ <string>The particle heads towards the location of the target object as defined by PSYS_SRC_TARGET_KEY.</string>
+ </map>
+ <key>PSYS_PART_WIND_MASK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string>Particles have their velocity damped towards the wind velocity.</string>
+ </map>
+ <key>PSYS_SRC_ACCEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string>A vector &lt;x, y, z&gt; which is the acceleration to apply on particles.</string>
+ </map>
+ <key>PSYS_SRC_ANGLE_BEGIN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>22</integer>
+ <key>tooltip</key>
+ <string>Area in radians specifying where particles will NOT be created (for ANGLE patterns)</string>
+ </map>
+ <key>PSYS_SRC_ANGLE_END</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>23</integer>
+ <key>tooltip</key>
+ <string>Area in radians filled with particles (for ANGLE patterns) (if lower than PSYS_SRC_ANGLE_BEGIN, acts as PSYS_SRC_ANGLE_BEGIN itself, and PSYS_SRC_ANGLE_BEGIN acts as PSYS_SRC_ANGLE_END).</string>
+ </map>
+ <key>PSYS_SRC_BURST_PART_COUNT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>15</integer>
+ <key>tooltip</key>
+ <string>How many particles to release in a burst.</string>
+ </map>
+ <key>PSYS_SRC_BURST_RADIUS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>16</integer>
+ <key>tooltip</key>
+ <string>What distance from the center of the object to create the particles.</string>
+ </map>
+ <key>PSYS_SRC_BURST_RATE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>13</integer>
+ <key>tooltip</key>
+ <string>How often to release a particle burst (float seconds).</string>
+ </map>
+ <key>PSYS_SRC_BURST_SPEED_MAX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>18</integer>
+ <key>tooltip</key>
+ <string>Maximum speed that a particle should be moving.</string>
+ </map>
+ <key>PSYS_SRC_BURST_SPEED_MIN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>17</integer>
+ <key>tooltip</key>
+ <string>Minimum speed that a particle should be moving.</string>
+ </map>
+ <key>PSYS_SRC_INNERANGLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string>Specifies the inner angle of the arc created by the PSYS_SRC_PATTERN_ANGLE or PSYS_SRC_PATTERN_ANGLE_CONE source pattern.
+ The area specified will NOT have particles in it.</string>
+ </map>
+ <key>PSYS_SRC_MAX_AGE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>19</integer>
+ <key>tooltip</key>
+ <string>How long this particle system should last, 0.0 means forever.</string>
+ </map>
+ <key>PSYS_SRC_OMEGA</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>21</integer>
+ <key>tooltip</key>
+ <string>Sets the angular velocity to rotate the axis that SRC_PATTERN_ANGLE and SRC_PATTERN_ANGLE_CONE use.</string>
+ </map>
+ <key>PSYS_SRC_OUTERANGLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>11</integer>
+ <key>tooltip</key>
+ <string>Specifies the outer angle of the arc created by the PSYS_SRC_PATTERN_ANGLE or PSYS_SRC_PATTERN_ANGLE_CONE source pattern.
+ The area between the outer and inner angle will be filled with particles.</string>
+ </map>
+ <key>PSYS_SRC_PATTERN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>9</integer>
+ <key>tooltip</key>
+ <string>The pattern which is used to generate particles.
+ Use one of the following values: PSYS_SRC_PATTERN Values.</string>
+ </map>
+ <key>PSYS_SRC_PATTERN_ANGLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x04</string>
+ <key>tooltip</key>
+ <string>Shoot particles across a 2 dimensional area defined by the arc created from PSYS_SRC_OUTERANGLE. There will be an open area defined by PSYS_SRC_INNERANGLE within the larger arc.</string>
+ </map>
+ <key>PSYS_SRC_PATTERN_ANGLE_CONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x08</string>
+ <key>tooltip</key>
+ <string>Shoot particles out in a 3 dimensional cone with an outer arc of PSYS_SRC_OUTERANGLE and an inner open area defined by PSYS_SRC_INNERANGLE.</string>
+ </map>
+ <key>PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PSYS_SRC_PATTERN_DROP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x01</string>
+ <key>tooltip</key>
+ <string>Drop particles at the source position.</string>
+ </map>
+ <key>PSYS_SRC_PATTERN_EXPLODE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x02</string>
+ <key>tooltip</key>
+ <string>Shoot particles out in all directions, using the burst parameters.</string>
+ </map>
+ <key>PSYS_SRC_TARGET_KEY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>20</integer>
+ <key>tooltip</key>
+ <string>The key of a target object to move towards if PSYS_PART_TARGET_POS_MASK is enabled.</string>
+ </map>
+ <key>PSYS_SRC_TEXTURE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>12</integer>
+ <key>tooltip</key>
+ <string>An asset name for the texture to use for the particles.</string>
+ </map>
+ <key>PU_EVADE_HIDDEN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x07</string>
+ <key>tooltip</key>
+ <string>Triggered when an llEvade character thinks it has hidden from its pursuer.</string>
+ </map>
+ <key>PU_EVADE_SPOTTED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x08</string>
+ <key>tooltip</key>
+ <string>Triggered when an llEvade character switches from hiding to running</string>
+ </map>
+ <key>PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>10</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PU_FAILURE_INVALID_GOAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x03</string>
+ <key>tooltip</key>
+ <string>Goal is not on the navigation-mesh and cannot be reached.</string>
+ </map>
+ <key>PU_FAILURE_INVALID_START</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x02</string>
+ <key>tooltip</key>
+ <string>Character cannot navigate from the current location - e.g., the character is off the navmesh or too high above it.</string>
+ </map>
+ <key>PU_FAILURE_NO_NAVMESH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x09</string>
+ <key>tooltip</key>
+ <string>This is a fatal error reported to a character when there is no navmesh for the region. This usually indicates a server failure and users should file a bug report and include the time and region in which they received this message.</string>
+ </map>
+ <key>PU_FAILURE_NO_VALID_DESTINATION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x06</string>
+ <key>tooltip</key>
+ <string>There is no good place for the character to go - e.g., it is patrolling and all the patrol points are now unreachable.</string>
+ </map>
+ <key>PU_FAILURE_OTHER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1000000</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PU_FAILURE_PARCEL_UNREACHABLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>11</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PU_FAILURE_TARGET_GONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x05</string>
+ <key>tooltip</key>
+ <string>Target (for llPursue or llEvade) can no longer be tracked - e.g., it left the region or is an avatar that is now more than about 30m outside the region.</string>
+ </map>
+ <key>PU_FAILURE_UNREACHABLE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x04</string>
+ <key>tooltip</key>
+ <string>Goal is no longer reachable for some reason - e.g., an obstacle blocks the path.</string>
+ </map>
+ <key>PU_GOAL_REACHED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x01</string>
+ <key>tooltip</key>
+ <string>Character has reached the goal and will stop or choose a new goal (if wandering).</string>
+ </map>
+ <key>PU_SLOWDOWN_DISTANCE_REACHED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x00</string>
+ <key>tooltip</key>
+ <string>Character is near current goal.</string>
+ </map>
+ <key>PUBLIC_CHANNEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>PUBLIC_CHANNEL is an integer constant that, when passed to llSay, llWhisper, or llShout as a channel parameter, will print text to the publicly heard chat channel.</string>
+ </map>
+ <key>PURSUIT_FUZZ_FACTOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>Selects a random destination near the offset.</string>
+ </map>
+ <key>PURSUIT_GOAL_TOLERANCE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>PURSUIT_INTERCEPT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Define whether the character attempts to predict the target's location.</string>
+ </map>
+ <key>PURSUIT_OFFSET</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Go to a position offset from the target.</string>
+ </map>
+ <key>RAD_TO_DEG</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>value</key>
+ <real>57.2957795</real>
+ <key>tooltip</key>
+ <string>57.2957795 - Number of degrees per radian. You can use this number to convert radians to degrees by multiplying the radians by this number.</string>
+ </map>
+ <key>RC_DATA_FLAGS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_DETECT_PHANTOM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_GET_LINK_NUM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_GET_NORMAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_GET_ROOT_KEY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_MAX_HITS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_REJECT_AGENTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_REJECT_LAND</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>8</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_REJECT_NONPHYSICAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_REJECT_PHYSICAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RC_REJECT_TYPES</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RCERR_CAST_TIME_EXCEEDED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RCERR_SIM_PERF_LOW</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>RCERR_UNKNOWN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>-1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REGION_FLAG_ALLOW_DAMAGE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REGION_FLAG_ALLOW_DIRECT_TELEPORT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REGION_FLAG_BLOCK_FLY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x80000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REGION_FLAG_BLOCK_TERRAFORM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x40</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REGION_FLAG_DISABLE_COLLISIONS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REGION_FLAG_DISABLE_PHYSICS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REGION_FLAG_FIXED_SUN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REGION_FLAG_RESTRICT_PUSHOBJECT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x400000</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REGION_FLAG_SANDBOX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REMOTE_DATA_CHANNEL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REMOTE_DATA_REPLY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REMOTE_DATA_REQUEST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>REQUIRE_LINE_OF_SIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Define whether the character needs a line-of-sight to give chase.</string>
+ </map>
+ <key>RESTITUTION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Used with llSetPhysicsMaterial to enable the density value. Must be between 0.0 and 1.0</string>
+ </map>
+ <key>REVERSE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4</string>
+ <key>tooltip</key>
+ <string>Play animation in reverse direction.</string>
+ </map>
+ <key>ROTATE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string>Animate texture rotation.</string>
+ </map>
+ <key>SCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x40</string>
+ <key>tooltip</key>
+ <string>Animate the texture scale.</string>
+ </map>
+ <key>SCRIPTED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string>Scripted in-world objects.</string>
+ </map>
+ <key>SIM_STAT_PCT_CHARS_STEPPED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Returns the % of pathfinding characters skipped each frame, averaged over the last minute.\nThe returned value corresponds to the "Characters Updated" stat in the viewer's Statistics Bar.</string>
+ </map>
+ <key>SMOOTH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string>Slide in the X direction, instead of playing separate frames.</string>
+ </map>
+ <key>SQRT2</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>value</key>
+ <real>1.41421356</real>
+ <key>tooltip</key>
+ <string>1.41421356 - The square root of 2.</string>
+ </map>
+ <key>STATUS_BLOCK_GRAB</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>64</integer>
+ <key>tooltip</key>
+ <string>Controls whether the object can be grabbed.\nA grab is the default action when in third person, and is available as the hand tool in build mode. This is useful for physical objects that you don't want other people to be able to trivially disturb. The default is FALSE</string>
+ </map>
+ <key>STATUS_BLOCK_GRAB_OBJECT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1024</integer>
+ <key>tooltip</key>
+ <string>Prevent click-and-drag movement on all prims in the object.</string>
+ </map>
+ <key>STATUS_BOUNDS_ERROR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1002</integer>
+ <key>tooltip</key>
+ <string>Argument(s) passed to function had a bounds error.</string>
+ </map>
+ <key>STATUS_CAST_SHADOWS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x200</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>STATUS_DIE_AT_EDGE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x80</string>
+ <key>tooltip</key>
+ <string>Controls whether the object is returned to the owners inventory if it wanders off the edge of the world.\nIt is useful to set this status TRUE for things like bullets or rockets. The default is TRUE</string>
+ </map>
+ <key>STATUS_INTERNAL_ERROR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1999</integer>
+ <key>tooltip</key>
+ <string>An internal error occurred.</string>
+ </map>
+ <key>STATUS_MALFORMED_PARAMS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1000</integer>
+ <key>tooltip</key>
+ <string>Function was called with malformed parameters.</string>
+ </map>
+ <key>STATUS_NOT_FOUND</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1003</integer>
+ <key>tooltip</key>
+ <string>Object or other item was not found.</string>
+ </map>
+ <key>STATUS_NOT_SUPPORTED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1004</integer>
+ <key>tooltip</key>
+ <string>Feature not supported.</string>
+ </map>
+ <key>STATUS_OK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>Result of function call was a success.</string>
+ </map>
+ <key>STATUS_PHANTOM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string>Controls/indicates whether the object collides or not.\nSetting the value to TRUE makes the object non-colliding with all objects. It is a good idea to use this for most objects that move or rotate, but are non-physical. It is also useful for simulating volumetric lighting. The default is FALSE.</string>
+ </map>
+ <key>STATUS_PHYSICS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string>Controls/indicates whether the object moves physically.\nThis controls the same flag that the UI check-box for Physical controls. The default is FALSE.</string>
+ </map>
+ <key>STATUS_RETURN_AT_EDGE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>STATUS_ROTATE_X</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>STATUS_ROTATE_Y</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>STATUS_ROTATE_Z</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string>Controls/indicates whether the object can physically rotate around
+ the specific axis or not. This flag has no meaning
+ for non-physical objects. Set the value to FALSE
+ if you want to disable rotation around that axis. The
+ default is TRUE for a physical object.
+ A useful example to think about when visualizing
+ the effect is a sit-and-spin device. They spin around the
+ Z axis (up) but not around the X or Y axis.</string>
+ </map>
+ <key>STATUS_SANDBOX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string>Controls/indicates whether the object can cross region boundaries
+ and move more than 20 meters from its creation
+ point. The default if FALSE.</string>
+ </map>
+ <key>STATUS_TYPE_MISMATCH</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1001</integer>
+ <key>tooltip</key>
+ <string>Argument(s) passed to function had a type mismatch.</string>
+ </map>
+ <key>STATUS_WHITELIST_FAILED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2001</integer>
+ <key>tooltip</key>
+ <string>Whitelist Failed.</string>
+ </map>
+ <key>STRING_TRIM</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x03</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>STRING_TRIM_HEAD</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x01</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>STRING_TRIM_TAIL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x02</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TEXTURE_BLANK</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>value</key>
+ <uuid>5748decc-f629-461c-9a36-a35a221fe21f</uuid>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TEXTURE_DEFAULT</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>value</key>
+ <uuid>89556747-24cb-43ed-920b-47caed15465f</uuid>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TEXTURE_MEDIA</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>value</key>
+ <uuid>8b5fec65-8d8d-9dc5-cda8-8fdf2716e361</uuid>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TEXTURE_PLYWOOD</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>value</key>
+ <uuid>89556747-24cb-43ed-920b-47caed15465f</uuid>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TEXTURE_TRANSPARENT</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>value</key>
+ <uuid>8dcd4a48-2d37-4909-9f78-f7a9eb4ef903</uuid>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TOUCH_INVALID_FACE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0xFFFFFFFF</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TOUCH_INVALID_TEXCOORD</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>value</key>
+ <string>&lt;-1.0, -1.0, 0.0&gt;</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TOUCH_INVALID_VECTOR</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>value</key>
+ <string>&lt;0.0, 0.0, 0.0&gt;</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TRAVERSAL_TYPE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>7</integer>
+ <key>tooltip</key>
+ <string>One of TRAVERSAL_TYPE_FAST, TRAVERSAL_TYPE_SLOW, and TRAVERSAL_TYPE_NONE.</string>
+ </map>
+ <key>TRAVERSAL_TYPE_FAST</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TRAVERSAL_TYPE_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TRAVERSAL_TYPE_SLOW</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>TRUE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>An integer constant for boolean comparisons. Has the value '1'.</string>
+ </map>
+ <key>TWO_PI</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>value</key>
+ <real>6.28318530</real>
+ <key>tooltip</key>
+ <string>6.28318530 - The radians of a circle.</string>
+ </map>
+ <key>TYPE_FLOAT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>The list entry is a float.</string>
+ </map>
+ <key>TYPE_INTEGER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>The list entry is an integer.</string>
+ </map>
+ <key>TYPE_INVALID</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string>The list entry is invalid.</string>
+ </map>
+ <key>TYPE_KEY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>The list entry is a key.</string>
+ </map>
+ <key>TYPE_ROTATION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>6</integer>
+ <key>tooltip</key>
+ <string>The list entry is a rotation.</string>
+ </map>
+ <key>TYPE_STRING</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>The list entry is a string.</string>
+ </map>
+ <key>TYPE_VECTOR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>The list entry is a vector.</string>
+ </map>
+ <key>URL_REQUEST_DENIED</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>URL_REQUEST_DENIED</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>URL_REQUEST_GRANTED</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>value</key>
+ <string>URL_REQUEST_GRANTED</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>32</integer>
+ <key>tooltip</key>
+ <string>A slider between minimum (0.0) and maximum (1.0) deflection of angular orientation. That is, its a simple scalar for modulating the strength of angular deflection such that the vehicles preferred axis of motion points toward its real velocity.</string>
+ </map>
+ <key>VEHICLE_ANGULAR_DEFLECTION_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>33</integer>
+ <key>tooltip</key>
+ <string>The time-scale for exponential success of linear deflection deflection. Its another way to specify the strength of the vehicles tendency to reorient itself so that its preferred axis of motion agrees with its true velocity.</string>
+ </map>
+ <key>VEHICLE_ANGULAR_FRICTION_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>17</integer>
+ <key>tooltip</key>
+ <string>A vector of timescales for exponential decay of the vehicles angular velocity about its preferred axes of motion (at, left, up).
+ Range = [0.07, inf) seconds for each element of the vector.</string>
+ </map>
+ <key>VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>35</integer>
+ <key>tooltip</key>
+ <string>The timescale for exponential decay of the angular motors magnitude.</string>
+ </map>
+ <key>VEHICLE_ANGULAR_MOTOR_DIRECTION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>19</integer>
+ <key>tooltip</key>
+ <string>The direction and magnitude (in preferred frame) of the vehicles angular motor.The vehicle will accelerate (or decelerate if necessary) to match its velocity to its motor.</string>
+ </map>
+ <key>VEHICLE_ANGULAR_MOTOR_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>34</integer>
+ <key>tooltip</key>
+ <string>The timescale for exponential approach to full angular motor velocity.</string>
+ </map>
+ <key>VEHICLE_BANKING_EFFICIENCY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>38</integer>
+ <key>tooltip</key>
+ <string>A slider between anti (-1.0), none (0.0), and maxmum (1.0) banking strength.</string>
+ </map>
+ <key>VEHICLE_BANKING_MIX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>39</integer>
+ <key>tooltip</key>
+ <string>A slider between static (0.0) and dynamic (1.0) banking. "Static" means the banking scales only with the angle of roll, whereas "dynamic" is a term that also scales with the vehicles linear speed.</string>
+ </map>
+ <key>VEHICLE_BANKING_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>40</integer>
+ <key>tooltip</key>
+ <string>The timescale for banking to exponentially approach its maximum effect. This is another way to scale the strength of the banking effect, however it affects the term that is proportional to the difference between what the banking behavior is trying to do, and what the vehicle is actually doing.</string>
+ </map>
+ <key>VEHICLE_BUOYANCY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>27</integer>
+ <key>tooltip</key>
+ <string>A slider between minimum (0.0) and maximum anti-gravity (1.0).</string>
+ </map>
+ <key>VEHICLE_FLAG_CAMERA_DECOUPLED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x200</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x10</string>
+ <key>tooltip</key>
+ <string>Hover at global height.</string>
+ </map>
+ <key>VEHICLE_FLAG_HOVER_TERRAIN_ONLY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x8</string>
+ <key>tooltip</key>
+ <string>Ignore water height when hovering.</string>
+ </map>
+ <key>VEHICLE_FLAG_HOVER_UP_ONLY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x20</string>
+ <key>tooltip</key>
+ <string>Hover does not push down. Use this flag for hovering vehicles that should be able to jump above their hover height.</string>
+ </map>
+ <key>VEHICLE_FLAG_HOVER_WATER_ONLY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x4</string>
+ <key>tooltip</key>
+ <string>Ignore terrain height when hovering.</string>
+ </map>
+ <key>VEHICLE_FLAG_LIMIT_MOTOR_UP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x40</string>
+ <key>tooltip</key>
+ <string>Prevents ground vehicles from motoring into the sky.</string>
+ </map>
+ <key>VEHICLE_FLAG_LIMIT_ROLL_ONLY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x2</string>
+ <key>tooltip</key>
+ <string>For vehicles with vertical attractor that want to be able to climb/dive, for instance, aeroplanes that want to use the banking feature.</string>
+ </map>
+ <key>VEHICLE_FLAG_MOUSELOOK_BANK</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x100</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>VEHICLE_FLAG_MOUSELOOK_STEER</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x80</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>VEHICLE_FLAG_NO_DEFLECTION_UP</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string>This flag prevents linear deflection parallel to world z-axis. This is useful for preventing ground vehicles with large linear deflection, like bumper cars, from climbing their linear deflection into the sky.</string>
+ </map>
+ <key>VEHICLE_FLAG_NO_FLY_UP</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <string>0x1</string>
+ <key>tooltip</key>
+ <string>Old, changed to VEHICLE_FLAG_NO_DEFLECTION_UP</string>
+ </map>
+ <key>VEHICLE_HOVER_EFFICIENCY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>25</integer>
+ <key>tooltip</key>
+ <string>A slider between minimum (0.0 = bouncy) and maximum (1.0 = fast as possible) damped motion of the hover behavior. </string>
+ </map>
+ <key>VEHICLE_HOVER_HEIGHT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>24</integer>
+ <key>tooltip</key>
+ <string>The height (above the terrain or water, or global) at which the vehicle will try to hover.</string>
+ </map>
+ <key>VEHICLE_HOVER_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>26</integer>
+ <key>tooltip</key>
+ <string>Period of time (in seconds) for the vehicle to achieve its hover height.</string>
+ </map>
+ <key>VEHICLE_LINEAR_DEFLECTION_EFFICIENCY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>28</integer>
+ <key>tooltip</key>
+ <string>A slider between minimum (0.0) and maximum (1.0) deflection of linear velocity. That is, its a simple scalar for modulating the strength of linear deflection.</string>
+ </map>
+ <key>VEHICLE_LINEAR_DEFLECTION_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>29</integer>
+ <key>tooltip</key>
+ <string>The timescale for exponential success of linear deflection deflection. It is another way to specify how much time it takes for the vehicles linear velocity to be redirected to its preferred axis of motion.</string>
+ </map>
+ <key>VEHICLE_LINEAR_FRICTION_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>16</integer>
+ <key>tooltip</key>
+ <string>A vector of timescales for exponential decay of the vehicles linear velocity along its preferred axes of motion (at, left, up).
+ Range = [0.07, inf) seconds for each element of the vector.</string>
+ </map>
+ <key>VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>35</integer>
+ <key>tooltip</key>
+ <string>The timescale for exponential decay of the linear motors magnitude.</string>
+ </map>
+ <key>VEHICLE_LINEAR_MOTOR_DIRECTION</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>18</integer>
+ <key>tooltip</key>
+ <string>The direction and magnitude (in preferred frame) of the vehicles linear motor. The vehicle will accelerate (or decelerate if necessary) to match its velocity to its motor.
+ Range of magnitude = [0, 30] meters/second.</string>
+ </map>
+ <key>VEHICLE_LINEAR_MOTOR_OFFSET</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>20</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>VEHICLE_LINEAR_MOTOR_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>30</integer>
+ <key>tooltip</key>
+ <string>The timescale for exponential approach to full linear motor velocity.</string>
+ </map>
+ <key>VEHICLE_REFERENCE_FRAME</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>44</integer>
+ <key>tooltip</key>
+ <string>A rotation of the vehicles preferred axes of motion and orientation (at, left, up) with respect to the vehicles local frame (x, y, z).</string>
+ </map>
+ <key>VEHICLE_TYPE_AIRPLANE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>4</integer>
+ <key>tooltip</key>
+ <string>Uses linear deflection for lift, no hover, and banking to turn.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_AIRPLANE</string>
+ </map>
+ <key>VEHICLE_TYPE_BALLOON</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>5</integer>
+ <key>tooltip</key>
+ <string>Hover, and friction, but no deflection.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_BALLOON</string>
+ </map>
+ <key>VEHICLE_TYPE_BOAT</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>3</integer>
+ <key>tooltip</key>
+ <string>Hovers over water with lots of friction and some anglar deflection.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_BOAT</string>
+ </map>
+ <key>VEHICLE_TYPE_CAR</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>2</integer>
+ <key>tooltip</key>
+ <string>Another vehicle that bounces along the ground but needs the motors to be driven from external controls or timer events.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_CAR</string>
+ </map>
+ <key>VEHICLE_TYPE_NONE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>VEHICLE_TYPE_SLED</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>1</integer>
+ <key>tooltip</key>
+ <string>Simple vehicle that bumps along the ground, and likes to move along its local x-axis.\nSee http://wiki.secondlife.com/wiki/VEHICLE_TYPE_SLED</string>
+ </map>
+ <key>VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>36</integer>
+ <key>tooltip</key>
+ <string>A slider between minimum (0.0 = wobbly) and maximum (1.0 = firm as possible) stability of the vehicle to keep itself upright.</string>
+ </map>
+ <key>VEHICLE_VERTICAL_ATTRACTION_TIMESCALE</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>37</integer>
+ <key>tooltip</key>
+ <string>The period of wobble, or timescale for exponential approach, of the vehicle to rotate such that its preferred "up" axis is oriented along the worlds "up" axis.</string>
+ </map>
+ <key>VERTICAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>WANDER_PAUSE_AT_WAYPOINTS</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>0</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ZERO_ROTATION</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>value</key>
+ <string>&lt;0.0, 0.0, 0.0, 1.0&gt;</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>ZERO_VECTOR</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>value</key>
+ <string>&lt;0.0, 0.0, 0.0&gt;</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>default</key>
+ <map>
+ <key>tooltip</key>
+ <string>All scripts must have a default state, which is the first state entered when the script starts.\nIf another state is defined before the default state, the compiler will report a syntax error.</string>
+ </map>
+ </map>
+ <key>events</key>
+ <map>
+ <key>at_rot_target</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>TargetNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>TargetRotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>CurrentRotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is triggered when a script comes within a defined angle of a target rotation. The range and rotation, are set by a call to llRotTarget.</string>
+ </map>
+ <key>at_target</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>TargetNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>TargetPosition</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>CurrentPosition</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is triggered when the scripted object comes within a defined range of the target position, defined by the llTarget function call.</string>
+ </map>
+ <key>attach</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is triggered whenever an object is attached or detached from an avatar. If it is attached, the key of the avatar it is attached to is passed in, otherwise NULL_KEY is.</string>
+ </map>
+ <key>changed</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Changed</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Triggered when various events change the object. The change argument will be a bit-field of CHANGED_* constants.</string>
+ </map>
+ <key>collision</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>NumberOfCollisions</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised while another object, or avatar, is colliding with the object the script is attached to.
+ The number of detected objects is passed to the script. Information on those objects may be gathered via the llDetected* functions.</string>
+ </map>
+ <key>collision_end</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>NumberOfCollisions</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised when another object, or avatar, stops colliding with the object the script is attached to.
+ The number of detected objects is passed to the script. Information on those objects may be gathered via the llDetected* library functions.</string>
+ </map>
+ <key>collision_start</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>NumberOfCollisions</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised when another object, or avatar, starts colliding with the object the script is attached to.
+ The number of detected objects is passed to the script. Information on those objects may be gathered via the llDetected* library functions.</string>
+ </map>
+ <key>control</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Levels</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Edges</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Once a script has the ability to grab control inputs from the avatar, this event will be used to pass the commands into the script.
+ The levels and edges are bit-fields of control constants.</string>
+ </map>
+ <key>dataserver</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>RequestID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Data</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is triggered when the requested data is returned to the script.
+ Data may be requested by the llRequestAgentData, llRequestInventoryData, and llGetNotecardLine function calls, for example.</string>
+ </map>
+ <key>email</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Time</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Address</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Subject</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Body</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>NumberRemaining</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is triggered when an email sent to this script arrives.
+ The number remaining tells how many more emails are known to be still pending.</string>
+ </map>
+ <key>http_request</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>HTTPRequestID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>HTTPMethod</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Body</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Triggered when task receives an HTTP request.</string>
+ </map>
+ <key>http_response</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>HTTPRequestID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Status</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Metadata</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Body</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event handler is invoked when an HTTP response is received for a pending llHTTPRequest request or if a pending request fails or times out.</string>
+ </map>
+ <key>land_collision</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised when the object the script is attached to is colliding with the ground.</string>
+ </map>
+ <key>land_collision_end</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised when the object the script is attached to stops colliding with the ground.</string>
+ </map>
+ <key>land_collision_start</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised when the object the script is attached to begins to collide with the ground.</string>
+ </map>
+ <key>link_message</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>SendersLink</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Triggered when object receives a link message via llMessageLinked function call.</string>
+ </map>
+ <key>listen</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Channel</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Name</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised whenever a chat message matching the constraints set in the llListen command is received. The name and ID of the speaker, as well as the message, are passed in as parameters.
+ Channel 0 is the public chat channel that all avatars see as chat text. Channels 1 through 2,147,483,648 are private channels that are not sent to avatars but other scripts can listen on those channels.</string>
+ </map>
+ <key>money</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Payer</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Amount</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is triggered when a resident has given an amount of Linden dollars to the object.</string>
+ </map>
+ <key>moving_end</key>
+ <map>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Triggered whenever an object with this script stops moving.</string>
+ </map>
+ <key>moving_start</key>
+ <map>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Triggered whenever an object with this script starts moving.</string>
+ </map>
+ <key>no_sensor</key>
+ <map>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>This event is raised when sensors are active, via the llSensor function call, but are not sensing anything.</string>
+ </map>
+ <key>not_at_rot_target</key>
+ <map>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>When a target is set via the llRotTarget function call, but the script is outside the specified angle this event is raised.</string>
+ </map>
+ <key>not_at_target</key>
+ <map>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>When a target is set via the llTarget library call, but the script is outside the specified range this event is raised.</string>
+ </map>
+ <key>object_rez</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>RezzedObjectsID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Triggered when an object rezzes another object from its inventory via the llRezObject, or similar, functions. The id is the globally unique key for the object rezzed.</string>
+ </map>
+ <key>on_rez</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>StartParameter</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Triggered whenever an object is rezzed from inventory or by another object. The start parameter is passed in from the llRezObject call, or zero if from inventory.</string>
+ </map>
+ <key>path_update</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Type</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Reserved</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is called to inform the script of changes within the object's path-finding status.</string>
+ </map>
+ <key>remote_data</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>EventType</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ChannelID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>MessageID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Sender</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Data</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Data</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Triggered by various XML-RPC calls with event_type specifying the type of data.</string>
+ </map>
+ <key>run_time_permissions</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>PermissionFlags</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Scripts need permission from either the owner or the avatar they wish to act on before they may perform certain functions, such as debiting money from their owners account, triggering an animation on an avatar, or capturing control inputs. The llRequestPermissions library function is used to request these permissions and the various permissions integer constants can be supplied.
+ The integer returned to this event handler contains the current set of permissions flags, so if permissions equal 0 then no permissions are set.</string>
+ </map>
+ <key>sensor</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>NumberDetected</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised whenever objects matching the constraints of the llSensor command are detected.
+ The number of detected objects is passed to the script in the parameter. Information on those objects may be gathered via the llDetected* functions.</string>
+ </map>
+ <key>state_entry</key>
+ <map>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>The state_entry event occurs whenever a new state is entered, including at program start, and is always the first event handled.</string>
+ </map>
+ <key>state_exit</key>
+ <map>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>The state_exit event occurs whenever the state command is used to transition to another state. It is handled before the new states state_entry event.</string>
+ </map>
+ <key>timer</key>
+ <map>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>This event is raised at regular intervals set by the llSetTimerEvent library function.</string>
+ </map>
+ <key>touch</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>NumberOfTouches</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised while a user is touching the object the script is attached to.
+ The number of touching objects is passed to the script in the parameter.
+ Information on those objects may be gathered via the llDetected* library functions.</string>
+ </map>
+ <key>touch_end</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>NumberOfTouches</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised when a user stops touching the object the script is attached to. The number of touches is passed to the script in the parameter.
+ Information on those objects may be gathered via the llDetected* library functions.</string>
+ </map>
+ <key>touch_start</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>NumberOfTouches</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This event is raised when a user first touches the object the script is attached to. The number of touches is passed to the script in the parameter.
+ Information on those objects may be gathered via the llDetected() library functions.</string>
+ </map>
+ <key>transaction_result</key>
+ <map>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>RequestID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Success</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Message</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Triggered by llTransferMoney() function.</string>
+ </map>
+ </map>
+ <key>functions</key>
+ <map>
+ <key>llAbs</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>An integer value.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the absolute (positive) version of Value.</string>
+ </map>
+ <key>llAcos</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>A floating-point value.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the arc-cosine of Value, in radians.</string>
+ </map>
+ <key>llAddToLandBanList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Agent UUID to add to ban-list.</string>
+ </map>
+ </map>
+ <map>
+ <key>Hours</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Period, in hours, to ban the avatar for.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Add avatar ID to the parcel ban list for the specified number of Hours.\nA value of 0 for Hours will add the agent indefinitely.\nThe smallest value that Hours will accept is 0.01; anything smaller will be seen as 0.\nWhen values that small are used, it seems the function bans in approximately 30 second increments (Probably 36 second increments, as 0.01 of an hour is 36 seconds).\nResidents teleporting to a parcel where they are banned will be redirected to a neighbouring parcel.</string>
+ </map>
+ <key>llAddToLandPassList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Agent UUID to add to pass-list.</string>
+ </map>
+ </map>
+ <map>
+ <key>Hours</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Period, in hours, to allow the avatar for.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Add avatar ID to the land pass list, for a duration of Hours.</string>
+ </map>
+ <key>llAdjustSoundVolume</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Volume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>The volume to set.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Adjusts the volume (0.0 - 1.0) of the currently playing attached sound.\nThis function has no effect on sounds started with llTriggerSound.</string>
+ </map>
+ <key>llAllowInventoryDrop</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Flag</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, If TRUE allows anyone to drop inventory on prim, FALSE revokes.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If Flag == TRUE, users without object modify permissions can still drop inventory items into the object.</string>
+ </map>
+ <key>llAngleBetween</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rot1</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string>First rotation.</string>
+ </map>
+ </map>
+ <map>
+ <key>Rot2</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string>Second rotation.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the angle, in radians, between rotations Rot1 and Rot2.</string>
+ </map>
+ <key>llApplyImpulse</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Force</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Amount of impulse force to apply.</string>
+ </map>
+ </map>
+ <map>
+ <key>Local</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE, force is treated as a local directional vector instead of region directional vector.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Applies impulse to the object.\nIf Local == TRUE, apply the Force in local coordinates; otherwise, apply the Force in global coordinates.\nThis function only works on physical objects.</string>
+ </map>
+ <key>llApplyRotationalImpulse</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Force</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Amount of impulse force to apply.</string>
+ </map>
+ </map>
+ <map>
+ <key>Local</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE, uses local axis, if FALSE, uses region axis.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Applies rotational impulse to the object.\nIf Local == TRUE, apply the Force in local coordinates; otherwise, apply the Force in global coordinates.\nThis function only works on physical objects.</string>
+ </map>
+ <key>llAsin</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>A floating-point value.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the arc-sine, in radians, of Value.</string>
+ </map>
+ <key>llAtan2</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>y</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>A floating-point value.</string>
+ </map>
+ </map>
+ <map>
+ <key>x</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>A floating-point value.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the arc-tangent2 of y, x.</string>
+ </map>
+ <key>llAttachToAvatar</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AttachmentPoint</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Attach to avatar at point AttachmentPoint.\nRequires the PERMISSION_ATTACH runtime permission.</string>
+ </map>
+ <key>llAttachToAvatarTemp</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AttachPoint</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Valid attachment point or ATTACH_* constant.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Follows the same convention as llAttachToAvatar, with the exception that the object will not create new inventory for the user, and will disappear on detach or disconnect.</string>
+ </map>
+ <key>llAvatarOnLinkSitTarget</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If an avatar is sitting on the link's sit target, return the avatar's key, NULL_KEY otherwise.\nReturns a key that is the UUID of the user seated on the specified link's prim.</string>
+ </map>
+ <key>llAvatarOnSitTarget</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>If an avatar is seated on the sit target, returns the avatar's key, otherwise NULL_KEY.\nThis only will detect avatars sitting on sit targets defined with llSitTarget.</string>
+ </map>
+ <key>llAxes2Rot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Forward</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Forward/Back part of rotation.</string>
+ </map>
+ </map>
+ <map>
+ <key>Left</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Left/Right part of rotation.</string>
+ </map>
+ </map>
+ <map>
+ <key>Up</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Up/Down part of rotation.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the rotation represented by coordinate axes Forward, Left, and Up.</string>
+ </map>
+ <key>llAxisAngle2Rot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Axis</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Axis.</string>
+ </map>
+ </map>
+ <map>
+ <key>Angle</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Angle in radians.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the rotation that is a generated Angle about Axis.</string>
+ </map>
+ <key>llBase64ToInteger</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns an integer that is the Text, Base64 decoded as a big endian integer.\nReturns zero if Text is longer then 8 characters. If Text contains fewer then 6 characters, the return value is unpredictable.</string>
+ </map>
+ <key>llBase64ToString</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Converts a Base64 string to a conventional string.\nIf the conversion creates any unprintable characters, they are converted to question marks.</string>
+ </map>
+ <key>llBreakAllLinks</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>De-links all prims in the link set (requires permission PERMISSION_CHANGE_LINKS be set).</string>
+ </map>
+ <key>llBreakLink</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>De-links the prim with the given link number (requires permission PERMISSION_CHANGE_LINKS be set).</string>
+ </map>
+ <key>llCastRay</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>End</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Casts a ray into the physics world from 'start' to 'end' and returns data according to details in Options.\nReports collision data for intersections with objects.\nReturn value: [UUID_1, {link_number_1}, hit_position_1, {hit_normal_1}, UUID_2, {link_number_2}, hit_position_2, {hit_normal_2}, ... , status_code] where {} indicates optional data.</string>
+ </map>
+ <key>llCeil</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns smallest integer value &gt;= Value.</string>
+ </map>
+ <key>llClearCameraParams</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Resets all camera parameters to default values and turns off scripted camera control.</string>
+ </map>
+ <key>llClearLinkMedia</key>
+ <map>
+ <key>energy</key>
+ <real>0.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Link</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Clears (deletes) the media and all parameters from the given Face on the linked prim.\nReturns an integer that is a STATUS_* flag, which details the success/failure of the operation.</string>
+ </map>
+ <key>llClearPrimMedia</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Number of side to clear.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Clears (deletes) the media and all parameters from the given Face.\nReturns an integer that is a STATUS_* flag which details the success/failure of the operation.</string>
+ </map>
+ <key>llCloseRemoteDataChannel</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ChannelID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Closes the specified XML-RPC channel.</string>
+ </map>
+ <key>llCloud</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the cloud density at the object's position + Offset.</string>
+ </map>
+ <key>llCollisionFilter</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ObjectName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ObjectID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Accept</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>If TRUE, only accept collisions with ObjectName name AND ObjectID (either is optional), otherwise with objects not ObjectName AND ObjectID.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Specify an empty string or NULL_KEY for Accept, to not filter on the corresponding parameter.</string>
+ </map>
+ <key>llCollisionSound</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ImpactSound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ImpactVolume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Suppress default collision sounds, replace default impact sounds with ImpactSound.\nThe ImpactSound must be in the object inventory.\nSupply an empty string to suppress collision sounds.</string>
+ </map>
+ <key>llCollisionSprite</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ImpactSprite</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Suppress default collision sprites, replace default impact sprite with ImpactSprite; found in the object inventory (empty string to just suppress).</string>
+ </map>
+ <key>llCos</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Theta</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the cosine of Theta (Theta in radians).</string>
+ </map>
+ <key>llCreateCharacter</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Convert link-set to AI/Physics character.\nCreates a path-finding entity, known as a "character", from the object containing the script. Required to activate use of path-finding functions.\nOptions is a list of key/value pairs.</string>
+ </map>
+ <key>llCreateLink</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>TargetPrim</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Object UUID that is in the same region.</string>
+ </map>
+ </map>
+ <map>
+ <key>Parent</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>If FALSE, then TargetPrim becomes the root. If TRUE, then the script's object becomes the root.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Attempt to link the object the script is in, to target (requires permission PERMISSION_CHANGE_LINKS be set).\nRequires permission PERMISSION_CHANGE_LINKS be set.</string>
+ </map>
+ <key>llCSV2List</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Create a list from a string of comma separated values specified in Text.</string>
+ </map>
+ <key>llDeleteCharacter</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Convert link-set from AI/Physics character to Physics object.\nConvert the current link-set back to a standard object, removing all path-finding properties.</string>
+ </map>
+ <key>llDeleteSubList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Source</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>End</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Removes the slice from start to end and returns the remainder of the list.\nRemove a slice from the list and return the remainder, start and end are inclusive.\nUsing negative numbers for start and/or end causes the index to count backwards from the length of the list, so 0, -1 would delete the entire list.\nIf Start is larger than End the list deleted is the exclusion of the entries; so 6, 4 would delete the entire list except for the 5th. list entry.</string>
+ </map>
+ <key>llDeleteSubString</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Source</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>End</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Removes the indicated sub-string and returns the result.\nStart and End are inclusive.\nUsing negative numbers for Start and/or End causes the index to count backwards from the length of the string, so 0, -1 would delete the entire string.\nIf Start is larger than End, the sub-string is the exclusion of the entries; so 6, 4 would delete the entire string except for the 5th. character.</string>
+ </map>
+ <key>llDetachFromAvatar</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Remove the object containing the script from the avatar.</string>
+ </map>
+ <key>llDetectedGrab</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the grab offset of a user touching the object.\nReturns &lt;0.0, 0.0, 0.0&gt; if Number is not a valid object.</string>
+ </map>
+ <key>llDetectedGroup</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns TRUE if detected object or agent Number has the same user group active as this object.\nIt will return FALSE if the object or agent is in the group, but the group is not active.</string>
+ </map>
+ <key>llDetectedKey</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the key of detected object or avatar number.\nReturns NULL_KEY if Number is not a valid index.</string>
+ </map>
+ <key>llDetectedLinkNumber</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the link position of the triggered event for touches and collisions only.\n0 for a non-linked object, 1 for the root of a linked object, 2 for the first child, etc.</string>
+ </map>
+ <key>llDetectedName</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the name of detected object or avatar number.\nReturns the name of detected object number.\nReturns empty string if Number is not a valid index.</string>
+ </map>
+ <key>llDetectedOwner</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the key of detected object's owner.\nReturns invalid key if Number is not a valid index.</string>
+ </map>
+ <key>llDetectedPos</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the position of detected object or avatar number.\nReturns &lt;0.0, 0.0, 0.0&gt; if Number is not a valid index.</string>
+ </map>
+ <key>llDetectedRot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the rotation of detected object or avatar number.\nReturns &lt;0.0, 0.0, 0.0, 1.0&gt; if Number is not a valid offset.</string>
+ </map>
+ <key>llDetectedTouchBinormal</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Index of detection information</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the surface bi-normal for a triggered touch event.\nReturns a vector that is the surface bi-normal (tangent to the surface) where the touch event was triggered.</string>
+ </map>
+ <key>llDetectedTouchFace</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Index of detection information</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the index of the face where the avatar clicked in a triggered touch event.</string>
+ </map>
+ <key>llDetectedTouchNormal</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Index of detection information</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the surface normal for a triggered touch event.\nReturns a vector that is the surface normal (perpendicular to the surface) where the touch event was triggered.</string>
+ </map>
+ <key>llDetectedTouchPos</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Index of detected information</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the position, in region coordinates, where the object was touched in a triggered touch event.\nUnless it is a HUD, in which case it returns the position relative to the attach point.</string>
+ </map>
+ <key>llDetectedTouchST</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Index of detection information</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a vector that is the surface coordinates where the prim was touched.\nThe X and Y vector positions contain the horizontal (S) and vertical (T) face coordinates respectively.\nEach component is in the interval [0.0, 1.0].\nTOUCH_INVALID_TEXCOORD is returned if the surface coordinates cannot be determined (e.g. when the viewer does not support this function).</string>
+ </map>
+ <key>llDetectedTouchUV</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Index of detection information</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a vector that is the texture coordinates for where the prim was touched.\nThe X and Y vector positions contain the U and V face coordinates respectively.\nTOUCH_INVALID_TEXCOORD is returned if the touch UV coordinates cannot be determined (e.g. when the viewer does not support this function).</string>
+ </map>
+ <key>llDetectedType</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the type (AGENT, ACTIVE, PASSIVE, SCRIPTED) of detected object.\nReturns 0 if number is not a valid index.\nNote that number is a bit-field, so comparisons need to be a bitwise checked. e.g.:\ninteger iType = llDetectedType(0);\n{\n // ...do stuff with the agent\n}</string>
+ </map>
+ <key>llDetectedVel</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the velocity of the detected object Number.\nReturns&lt;0.0, 0.0, 0.0&gt; if Number is not a valid offset.</string>
+ </map>
+ <key>llDialog</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Buttons</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Channel</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Shows a dialog box on the avatar's screen with the message.\n
+ Up to 12 strings in the list form buttons.\n
+ If a button is clicked, the name is chatted on Channel.\nOpens a "notify box" in the given avatars screen displaying the message.\n
+ Up to twelve buttons can be specified in a list of strings. When the user clicks a button, the name of the button is said on the specified channel.\n
+ Channels work just like llSay(), so channel 0 can be heard by everyone.\n
+ The chat originates at the object's position, not the avatar's position, even though it is said as the avatar (uses avatar's UUID and Name etc.).\n
+ Examples:\n
+ llDialog(who, "Are you a boy or a girl?", [ "Boy", "Girl" ], -4913);\n
+ llDialog(who, "This shows only an OK button.", [], -192);\n
+ llDialog(who, "This chats so you can 'hear' it.", ["Hooray"], 0);</string>
+ </map>
+ <key>llDie</key>
+ <map>
+ <key>energy</key>
+ <real>0.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Delete the object which holds the script.</string>
+ </map>
+ <key>llDumpList2String</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Source</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Separator</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the list as a single string, using Separator between the entries.\nWrite the list out as a single string, using Separator between values.</string>
+ </map>
+ <key>llEdgeOfWorld</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Direction</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Checks to see whether the border hit by Direction from Position is the edge of the world (has no neighboring region).\nReturns TRUE if the line along Direction from Position hits the edge of the world in the current simulator, returns FALSE if that edge crosses into another simulator.</string>
+ </map>
+ <key>llEjectFromLand</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Ejects AvatarID from land that you own.\nEjects AvatarID from land that the object owner (group or resident) owns.</string>
+ </map>
+ <key>llEmail</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>20.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Address</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Subject</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sends email to Address with Subject and Message.\nSends an email to Address with Subject and Message.</string>
+ </map>
+ <key>llEscapeURL</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>URL</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns an escaped/encoded version of url, replacing spaces with %20 etc.\nReturns the string that is the URL-escaped version of URL (replacing spaces with %20, etc.).\n
+ This function returns the UTF-8 encoded escape codes for selected characters.</string>
+ </map>
+ <key>llEuler2Rot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Vector</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the rotation representation of the Euler angles.\nReturns the rotation represented by the Euler Angle.</string>
+ </map>
+ <key>llEvade</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>TargetID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Agent or object to evade.</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>No options yet.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Evade a specified target.\nCharacters will (roughly) try to hide from their pursuers if there is a good hiding spot along their fleeing path. Hiding means no direct line of sight from the head of the character (centre of the top of its physics bounding box) to the head of its pursuer and no direct path between the two on the navigation-mesh.</string>
+ </map>
+ <key>llExecCharacterCmd</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Command</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Command to send.</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>Height for CHARACTER_CMD_JUMP.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Execute a character command.\nSend a command to the path system.\nCurrently only supports stopping the current path-finding operation or causing the character to jump.</string>
+ </map>
+ <key>llFabs</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the positive version of Value.\nReturns the absolute value of Value.</string>
+ </map>
+ <key>llFleeFrom</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Source</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Global coordinate from which to flee.</string>
+ </map>
+ </map>
+ <map>
+ <key>Distance</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Distance in meters to flee from the source.</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>No options available at this time.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Flee from a point.\nDirects a character (llCreateCharacter) to keep away from a defined position in the region or adjacent regions.</string>
+ </map>
+ <key>llFloor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns largest integer value &lt;= Value.</string>
+ </map>
+ <key>llForceMouselook</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Enable</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE when an avatar sits on the prim, the avatar will be forced into mouse-look mode.\nFALSE is the default setting and will undo a previously set TRUE or do nothing.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If Enable is TRUE any avatar that sits on this object is forced into mouse-look mode.\nAfter calling this function with Enable set to TRUE, any agent sitting down on the prim will be forced into mouse-look.\nJust like llSitTarget, this changes a permanent property of the prim (not the object) and needs to be reset by calling this function with Enable set to FALSE in order to disable it.</string>
+ </map>
+ <key>llFrand</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Magnitude</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a pseudo random number in the range [0, Magnitude] or [Magnitude, 0].\nReturns a pseudo-random number between [0, Magnitude].</string>
+ </map>
+ <key>llGenerateKey</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Generates a key (SHA-1 hash) using UUID generation to create a unique key.\nAs the UUID produced is versioned, it should never return a value of NULL_KEY.\nThe specific UUID version is an implementation detail that has changed in the past and may change again in the future. Do not depend upon the UUID that is returned to be version 5 SHA-1 hash.</string>
+ </map>
+ <key>llGetAccel</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the acceleration of the object relative to the region's axes.\nGets the acceleration of the object.</string>
+ </map>
+ <key>llGetAgentInfo</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns an integer bit-field containing the agent information about id.\n
+ Returns AGENT_FLYING, AGENT_ATTACHMENTS, AGENT_SCRIPTED, AGENT_SITTING, AGENT_ON_OBJECT, AGENT_MOUSELOOK, AGENT_AWAY, AGENT_BUSY, AGENT_TYPING, AGENT_CROUCHING, AGENT_ALWAYS_RUN, AGENT_WALKING and/or AGENT_IN_AIR.\nReturns information about the given agent ID as a bit-field of agent info constants.</string>
+ </map>
+ <key>llGetAgentLanguage</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the language code of the preferred interface language of the avatar.\nReturns a string that is the language code of the preferred interface language of the resident.</string>
+ </map>
+ <key>llGetAgentList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Scope</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>The scope (region, parcel, parcel same owner) to return agents for.</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>List of options to apply. Current unused.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Requests a list of agents currently in the region, limited by the scope parameter.\nReturns a list [key UUID-0, key UUID-1, ..., key UUID-n] or [string error_msg] - returns avatar keys for all agents in the region limited to the area(s) specified by scope</string>
+ </map>
+ <key>llGetAgentSize</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If the avatar is in the same region, returns the size of the bounding box of the requested avatar by id, otherwise returns ZERO_VECTOR.\nIf the agent is in the same region as the object, returns the size of the avatar.</string>
+ </map>
+ <key>llGetAlpha</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the alpha value of Face.\nReturns the 'alpha' of the given face. If face is ALL_SIDES the value returned is the mean average of all faces.</string>
+ </map>
+ <key>llGetAndResetTime</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the script time in seconds and then resets the script timer to zero.\nGets the time in seconds since starting and resets the time to zero.</string>
+ </map>
+ <key>llGetAnimation</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the name of the currently playing locomotion animation for the avatar id.\nReturns the currently playing animation for the specified avatar ID.</string>
+ </map>
+ <key>llGetAnimationList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a list of keys of playing animations for an avatar.\nReturns a list of keys of all playing animations for the specified avatar ID.</string>
+ </map>
+ <key>llGetAnimationOverride</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AnimationState</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a string that is the name of the animation that is used for the specified animation state\nTo use this function the script must obtain either the PERMISSION_OVERRIDE_ANIMATIONS or PERMISSION_TRIGGER_ANIMATION permission (automatically granted to attached objects).</string>
+ </map>
+ <key>llGetAttached</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the object's attachment point, or 0 if not attached.\nReturns the object attachment point, or 0 if not attached.</string>
+ </map>
+ <key>llGetBoundingBox</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the bounding box around the object (including any linked prims) relative to its root prim, as a list in the format [ (vector) min_corner, (vector) max_corner ].</string>
+ </map>
+ <key>llGetCameraPos</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the current camera position for the agent the task has permissions for.\nReturns the position of the camera, of the user that granted the script PERMISSION_TRACK_CAMERA. If no user has granted the permission, it returns ZERO_VECTOR.</string>
+ </map>
+ <key>llGetCameraRot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the current camera orientation for the agent the task has permissions for. If no user has granted the PERMISSION_TRACK_CAMERA permission, returns ZERO_ROTATION.</string>
+ </map>
+ <key>llGetCenterOfMass</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the prim's centre of mass (unless called from the root prim, where it returns the object's centre of mass).</string>
+ </map>
+ <key>llGetClosestNavPoint</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Point</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>A point in region-local space.</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>No options at this time.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Get the closest navigable point to the point provided.\nThe function accepts a point in region-local space (like all the other path-finding methods) and returns either an empty list or a list containing a single vector which is the closest point on the navigation-mesh to the point provided.</string>
+ </map>
+ <key>llGetColor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the color on Face.\nReturns the color of Face as a vector of red, green, and blue values between 0 and 1. If face is ALL_SIDES the color returned is the mean average of each channel.</string>
+ </map>
+ <key>llGetCreator</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns a key for the creator of the prim.\nReturns the key of the object's original creator. Similar to llGetOwner.</string>
+ </map>
+ <key>llGetDate</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the current date in the UTC time zone in the format YYYY-MM-DD.\nReturns the current UTC date as YYYY-MM-DD.</string>
+ </map>
+ <key>llGetDisplayName</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Avatar UUID that is in the same region, or is otherwise known to the region.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the display name of an avatar, if the avatar is connected to the current region, or if the name has been cached. Otherwise, returns an empty string. Use llRequestDisplayName if the avatar may be absent from the region.</string>
+ </map>
+ <key>llGetEnergy</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns how much energy is in the object as a percentage of maximum.</string>
+ </map>
+ <key>llGetEnv</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>DataRequest</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>The type of data to request. Any other string will cause an empty string to be returned.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a string with the requested data about the region.</string>
+ </map>
+ <key>llGetForce</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the force (if the script is physical).\nReturns the current force if the script is physical.</string>
+ </map>
+ <key>llGetFreeMemory</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the number of free bytes of memory the script can use.\nReturns the available free space for the current script. This is inaccurate with LSO.</string>
+ </map>
+ <key>llGetFreeURLs</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the number of available URLs for the current script.\nReturns an integer that is the number of available URLs.</string>
+ </map>
+ <key>llGetGeometricCenter</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the vector that is the geometric center of the object relative to the root prim.</string>
+ </map>
+ <key>llGetGMTclock</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the time in seconds since midnight GMT.\nGets the time in seconds since midnight in GMT/UTC.</string>
+ </map>
+ <key>llGetHTTPHeader</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>HTTPRequestID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>A valid HTTP request key</string>
+ </map>
+ </map>
+ <map>
+ <key>Header</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Header value name</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the value for header for request_id.\nReturns a string that is the value of the Header for HTTPRequestID.</string>
+ </map>
+ <key>llGetInventoryCreator</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a key for the creator of the inventory item.\nThis function returns the UUID of the creator of item. If item is not found in inventory, the object says "No item named 'name'".</string>
+ </map>
+ <key>llGetInventoryKey</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the key that is the UUID of the inventory named.\nReturns the key of the inventory named.</string>
+ </map>
+ <key>llGetInventoryName</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryType</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Inventory item type</string>
+ </map>
+ </map>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Index number of inventory item.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the name of the inventory item of a given type, specified by index number.\nUse the inventory constants INVENTORY_* to specify the type.</string>
+ </map>
+ <key>llGetInventoryNumber</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryType</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Inventory item type</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the quantity of items of a given type (INVENTORY_* flag) in the prim's inventory.\nUse the inventory constants INVENTORY_* to specify the type.</string>
+ </map>
+ <key>llGetInventoryPermMask</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Inventory item name.</string>
+ </map>
+ </map>
+ <map>
+ <key>BitMask</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>MASK_BASE, MASK_OWNER, MASK_GROUP, MASK_EVERYONE or MASK_NEXT</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the requested permission mask for the inventory item.\nReturns the requested permission mask for the inventory item defined by InventoryItem. If item is not in the object's inventory, llGetInventoryPermMask returns FALSE and causes the object to say "No item named '&lt;item&gt;'", where "&lt;item&gt;" is item.</string>
+ </map>
+ <key>llGetInventoryType</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the type of the named inventory item.\nLike all inventory functions, llGetInventoryType is case-sensitive.</string>
+ </map>
+ <key>llGetKey</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the key of the prim the script is attached to.\nGet the key for the object which has this script.</string>
+ </map>
+ <key>llGetLandOwnerAt</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the key of the land owner, returns NULL_KEY if public.\nReturns the key of the land owner at Position, or NULL_KEY if public.</string>
+ </map>
+ <key>llGetLinkKey</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the key of the linked prim LinkNumber.\nReturns the key of LinkNumber in the link set.</string>
+ </map>
+ <key>llGetLinkMedia</key>
+ <map>
+ <key>energy</key>
+ <real>0.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag</string>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>The prim's side number</string>
+ </map>
+ </map>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>A list of PRIM_* property constants to return values of.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Get the media parameters for a particular face on linked prim, given the desired list of parameter names. Returns a list of values in the order requested. Returns an empty list if no media exists on the face.</string>
+ </map>
+ <key>llGetLinkName</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the name of LinkNumber in a link set.\nReturns the name of LinkNumber the link set.</string>
+ </map>
+ <key>llGetLinkNumber</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the link number of the prim containing the script (0 means not linked, 1 the prim is the root, 2 the prim is the first child, etc.).\nReturns the link number of the prim containing the script. 0 means no link, 1 the root, 2 for first child, etc.</string>
+ </map>
+ <key>llGetLinkNumberOfSides</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the number of sides of the specified linked prim.\nReturns an integer that is the number of faces (or sides) of the prim link.</string>
+ </map>
+ <key>llGetLinkPrimitiveParams</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag.</string>
+ </map>
+ </map>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>PRIM_* flags.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the list of primitive attributes requested in the Parameters list for LinkNumber.\nPRIM_* flags can be broken into three categories, face flags, prim flags, and object flags.\n* Supplying a prim or object flag will return that flags attributes.\n* Face flags require the user to also supply a face index parameter.</string>
+ </map>
+ <key>llGetListEntryType</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the type of the index entry in the list (TYPE_INTEGER, TYPE_FLOAT, TYPE_STRING, TYPE_KEY, TYPE_VECTOR, TYPE_ROTATION, or TYPE_INVALID if index is off list).\nReturns the type of the variable at Index in ListVariable.</string>
+ </map>
+ <key>llGetListLength</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the number of elements in the list.\nReturns the number of elements in ListVariable.</string>
+ </map>
+ <key>llGetLocalPos</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the position relative to the root.\nReturns the local position of a child object relative to the root.</string>
+ </map>
+ <key>llGetLocalRot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the rotation local to the root.\nReturns the local rotation of a child object relative to the root.</string>
+ </map>
+ <key>llGetMass</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the mass of object that the script is attached to.\nReturns the scripted object's mass. When called from a script in a link-set, the parent will return the sum of the link-set weights, while a child will return just its own mass. When called from a script inside an attachment, this function will return the mass of the avatar it's attached to, not its own.</string>
+ </map>
+ <key>llGetMassMKS</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Acts as llGetMass(), except that the units of the value returned are Kg.</string>
+ </map>
+ <key>llGetMaxScaleFactor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns a float that is the largest scaling factor that can be used with llScaleByFactor to resize the object. This maximum is determined by the Linkability Rules and prim scale limits.</string>
+ </map>
+ <key>llGetMemoryLimit</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Get the maximum memory a script can use, in bytes.</string>
+ </map>
+ <key>llGetMinScaleFactor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns a float that is the smallest scaling factor that can be used with llScaleByFactor to resize the object. This minimum is determined by the prim scale limits.</string>
+ </map>
+ <key>llGetNextEmail</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Address</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Subject</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Fetch the next queued email with that matches the given address and/or subject, via the email event.\nIf the parameters are blank, they are not used for filtering.</string>
+ </map>
+ <key>llGetNotecardLine</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>NotecardName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>LineNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns LineNumber from NotecardName via the dataserver event. The line index starts at zero.\nIf the requested line is passed the end of the note-card the dataserver event will return the constant EOF string.\nThe key returned by this function is a unique identifier which will be supplied to the dataserver event in the requested parameter.</string>
+ </map>
+ <key>llGetNumberOfNotecardLines</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>NotecardName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the number of lines contained within a notecard via the dataserver event.\nThe key returned by this function is a query ID for identifying the dataserver reply.</string>
+ </map>
+ <key>llGetNumberOfPrims</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the number of prims in a link set the script is attached to.\nReturns the number of prims in (and avatars seated on) the object the script is in.</string>
+ </map>
+ <key>llGetNumberOfSides</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the number of faces (or sides) of the prim.\nReturns the number of sides of the prim which has the script.</string>
+ </map>
+ <key>llGetObjectDesc</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the description of the prim the script is attached to.\nReturns the description of the scripted object/prim. You can set the description using llSetObjectDesc.</string>
+ </map>
+ <key>llGetObjectDetails</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Prim or avatar UUID that is in the same region.</string>
+ </map>
+ </map>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>List of OBJECT_* flags.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a list of object details specified in the Parameters list for the object or avatar in the region with key ID.\nParameters are specified by the OBJECT_* constants.</string>
+ </map>
+ <key>llGetObjectMass</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the mass of the avatar or object in the region.\nGets the mass of the object or avatar corresponding to ID.</string>
+ </map>
+ <key>llGetObjectName</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the name of the prim which the script is attached to.\nReturns the name of the prim (not object) which contains the script.</string>
+ </map>
+ <key>llGetObjectPermMask</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Category</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Category is one of MASK_BASE, MASK_OWNER, MASK_GROUP, MASK_EVERYONE, or MASK_NEXT</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the permission mask of the requested category for the object.</string>
+ </map>
+ <key>llGetObjectPrimCount</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ObjectID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the total number of prims for an object in the region.\nReturns the prim count for any object id in the same region.</string>
+ </map>
+ <key>llGetOmega</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the rotation velocity in radians per second.\nReturns a vector that is the rotation velocity of the object in radians per second.</string>
+ </map>
+ <key>llGetOwner</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the object owner's UUID.\nReturns the key for the owner of the object.</string>
+ </map>
+ <key>llGetOwnerKey</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ObjectID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the owner of ObjectID.\nReturns the key for the owner of object ObjectID.</string>
+ </map>
+ <key>llGetParcelDetails</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Location within the region.</string>
+ </map>
+ </map>
+ <map>
+ <key>ParcelDetails</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>List of details requested for the specified parcel location.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a list of parcel details specified in the ParcelDetails list for the parcel at Position.\nParameters is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS.\nReturns a list that is the parcel details specified in ParcelDetails (in the same order) for the parcel at Position.</string>
+ </map>
+ <key>llGetParcelFlags</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a mask of the parcel flags (PARCEL_FLAG_*) for the parcel that includes the point Position.\nReturns a bit-field specifying the parcel flags (PARCEL_FLAG_*) for the parcel at Position.</string>
+ </map>
+ <key>llGetParcelMaxPrims</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Region coordinates (z is ignored) of parcel.</string>
+ </map>
+ </map>
+ <map>
+ <key>SimWide</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean. If FALSE then the return is the maximum prims supported by the parcel. If TRUE then it is the combined number of prims on all parcels in the region owned by the specified parcel's owner.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the maximum number of prims allowed on the parcel at Position for a given scope.\nThe scope may be set to an individual parcel or the combined resources of all parcels with the same ownership in the region.</string>
+ </map>
+ <key>llGetParcelMusicURL</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Gets the streaming audio URL for the parcel object is on.\nThe object owner, avatar or group, must also be the land owner.</string>
+ </map>
+ <key>llGetParcelPrimCount</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Region coordinates of parcel to query.</string>
+ </map>
+ </map>
+ <map>
+ <key>Category</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>A PARCEL_COUNT_* flag.</string>
+ </map>
+ </map>
+ <map>
+ <key>SimWide</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean. If FALSE then the return is the maximum prims supported by the parcel. If TRUE then it is the combined number of prims on all parcels in the region owned by the specified parcel's owner.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the number of prims on the parcel at Position of the given category.\nCategories: PARCEL_COUNT_TOTAL, _OWNER, _GROUP, _OTHER, _SELECTED, _TEMP.\nReturns the number of prims used on the parcel at Position which are in Category.\nIf SimWide is TRUE, it returns the total number of objects for all parcels with matching ownership in the category specified.\nIf SimWide is FALSE, it returns the number of objects on this specific parcel in the category specified</string>
+ </map>
+ <key>llGetParcelPrimOwners</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>2.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a list of up to 100 residents who own objects on the parcel at Position, with per-owner land impact totals.\nRequires owner-like permissions for the parcel, and for the script owner to be present in the region.\nThe list is formatted as [ key agentKey1, integer agentLI1, key agentKey2, integer agentLI2, ... ], sorted by agent key.\nThe integers are the combined land impacts of the objects owned by the corresponding agents.</string>
+ </map>
+ <key>llGetPermissions</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns an integer bitmask of the permissions that have been granted to the script. Individual permissions can be determined using a bit-wise "and" operation against the PERMISSION_* constants</string>
+ </map>
+ <key>llGetPermissionsKey</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the key of the avatar that last granted or declined permissions to the script.\nReturns NULL_KEY if permissions were never granted or declined.</string>
+ </map>
+ <key>llGetPhysicsMaterial</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns a list of the form [float gravity_multiplier, float restitution, float friction, float density].</string>
+ </map>
+ <key>llGetPos</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the position of the task in region coordinates.\nReturns the vector position of the task in region coordinates.</string>
+ </map>
+ <key>llGetPrimitiveParams</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>PRIM_* flags and face parameters</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the primitive parameters specified in the parameters list.\nReturns primitive parameters specified in the Parameters list.</string>
+ </map>
+ <key>llGetPrimMediaParams</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>face number</string>
+ </map>
+ </map>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>One or more PRIM_MEDIA_* flags</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the media parameters for a particular face on an object, given the desired list of parameter names, in the order requested. Returns an empty list if no media exists on the face.</string>
+ </map>
+ <key>llGetRegionAgentCount</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the number of avatars in the region.\nReturns an integer that is the number of avatars in the region.</string>
+ </map>
+ <key>llGetRegionCorner</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns a vector, in meters, that is the global location of the south-west corner of the region which the object is in.\nReturns the Region-Corner of the simulator containing the task. The region-corner is a vector (values in meters) representing distance from the first region.</string>
+ </map>
+ <key>llGetRegionFlags</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the region flags (REGION_FLAG_*) for the region the object is in.\nReturns a bit-field specifying the region flags (REGION_FLAG_*) for the region the object is in.</string>
+ </map>
+ <key>llGetRegionFPS</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the mean region frames per second.</string>
+ </map>
+ <key>llGetRegionName</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the current region name.</string>
+ </map>
+ <key>llGetRegionTimeDilation</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the current time dilation as a float between 0.0 (full dilation) and 1.0 (no dilation).\nReturns the current time dilation as a float between 0.0 and 1.0.</string>
+ </map>
+ <key>llGetRootPosition</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the position (in region coordinates) of the root prim of the object which the script is attached to.\nThis is used to allow a child prim to determine where the root is.</string>
+ </map>
+ <key>llGetRootRotation</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the rotation (relative to the region) of the root prim of the object which the script is attached to.\nGets the global rotation of the root object of the object script is attached to.</string>
+ </map>
+ <key>llGetRot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the rotation relative to the region's axes.\nReturns the rotation.</string>
+ </map>
+ <key>llGetScale</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the scale of the prim.\nReturns a vector that is the scale (dimensions) of the prim.</string>
+ </map>
+ <key>llGetScriptName</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the name of the script that this function is used in.\nReturns the name of this script.</string>
+ </map>
+ <key>llGetScriptState</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ScriptName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns TRUE if the script named is running.\nReturns TRUE if ScriptName is running.</string>
+ </map>
+ <key>llGetSimStats</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>StatType</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Statistic type. Currently only SIM_STAT_PCT_CHARS_STEPPED is supported.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a float that is the requested statistic.</string>
+ </map>
+ <key>llGetSimulatorHostname</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>10.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the host-name of the machine which the script is running on.\nFor example, "sim225.agni.lindenlab.com".</string>
+ </map>
+ <key>llGetSPMaxMemory</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the maximum used memory for the current script. Only valid after using PROFILE_SCRIPT_MEMORY. Non-mono scripts always use 16k.\nReturns the integer of the most bytes used while llScriptProfiler was last active.</string>
+ </map>
+ <key>llGetStartParameter</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns an integer that is the script rez parameter.\nIf the object was rezzed by an agent, this function returns 0.</string>
+ </map>
+ <key>llGetStaticPath</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Starting position.</string>
+ </map>
+ </map>
+ <map>
+ <key>End</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Ending position.</string>
+ </map>
+ </map>
+ <map>
+ <key>Radius</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Radius of the character that the path is for, between 0.125m and 5.0m.</string>
+ </map>
+ </map>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>Currently only accepts the parameter CHARACTER_TYPE; the options are identical to those used for llCreateCharacter. The default value is CHARACTER_TYPE_NONE.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ <key>llGetStatus</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>StatusFlag</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>A STATUS_* flag</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns boolean value of the specified status (e.g. STATUS_PHANTOM) of the object the script is attached to.</string>
+ </map>
+ <key>llGetSubString</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>String</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>End</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a sub-string from String, in a range specified by the Start and End indicies (inclusive).\nUsing negative numbers for Start and/or End causes the index to count backwards from the length of the string, so 0, -1 would capture the entire string.\nIf Start is greater than End, the sub string is the exclusion of the entries.</string>
+ </map>
+ <key>llGetSunDirection</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns a normalized vector of the direction of the sun in the region.\nReturns the sun's direction on the simulator.</string>
+ </map>
+ <key>llGetTexture</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a string that is the texture on face (the inventory name if it is a texture in the prim's inventory, otherwise the key).\nReturns the texture of a face, if it is found in object inventory, its key otherwise.</string>
+ </map>
+ <key>llGetTextureOffset</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the texture offset of face in the x and y components of a vector.</string>
+ </map>
+ <key>llGetTextureRot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the texture rotation of side.</string>
+ </map>
+ <key>llGetTextureScale</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the texture scale of side in the x and y components of a vector.\nReturns the texture scale of a side in the x and y components of a vector.</string>
+ </map>
+ <key>llGetTime</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the time in seconds since the last region reset, script reset, or call to either llResetTime or llGetAndResetTime.</string>
+ </map>
+ <key>llGetTimeOfDay</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the time in seconds since Second Life midnight or since region up-time, whichever is smaller.\nThe Second Life day cycle is 4 hours.</string>
+ </map>
+ <key>llGetTimestamp</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns a time-stamp (UTC time zone) in the format: YYYY-MM-DDThh:mm:ss.ff..fZ.</string>
+ </map>
+ <key>llGetTorque</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the torque (if the script is physical).\nReturns a vector that is the torque (if the script is physical).</string>
+ </map>
+ <key>llGetUnixTime</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC from the system clock.</string>
+ </map>
+ <key>llGetUsedMemory</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the current used memory for the current script. Non-mono scripts always use 16K.\nReturns the integer of the number of bytes of memory currently in use by the script. Non-mono scripts always use 16K.</string>
+ </map>
+ <key>llGetUsername</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the username of an avatar, if the avatar is connected to the current region, or if the name has been cached. Otherwise, returns an empty string. Use llRequestUsername if the avatar may be absent from the region.</string>
+ </map>
+ <key>llGetVel</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the velocity of the object.\nReturns a vector that is the velocity of the object.</string>
+ </map>
+ <key>llGetWallclock</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the time in seconds since midnight California Pacific time (PST/PDT).\nReturns the time in seconds since simulator's time-zone midnight (Pacific Time).</string>
+ </map>
+ <key>llGiveInventory</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>TargetID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Give InventoryItem to destination represented by TargetID, as permitted by the permissions system.\nTargetID may be any agent or an object in the same region.</string>
+ </map>
+ <key>llGiveInventoryList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>3.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>TargetID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>FolderName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>InventoryItems</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Give InventoryItems to destination (represented by TargetID) as a new folder of items, as permitted by the permissions system.\nTargetID may be any agent or an object in the same region. If TargetID is an object, the items are passed directly to the object inventory (no folder is created).</string>
+ </map>
+ <key>llGiveMoney</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Amount</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Transfers Amount of L$ from script owner to AvatarID.\nThis call will silently fail if PERMISSION_DEBIT has not been granted.</string>
+ </map>
+ <key>llGodLikeRezObject</key>
+ <map>
+ <key>god-mode</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItemID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Rez directly off of a UUID if owner has dog-bit set.</string>
+ </map>
+ <key>llGround</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the ground height at the object position + offset.\nReturns the ground height at the object's position + Offset.</string>
+ </map>
+ <key>llGroundContour</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the ground contour direction below the object position + Offset.\nReturns the ground contour at the object's position + Offset.</string>
+ </map>
+ <key>llGroundNormal</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the ground normal below the object position + offset.\nReturns the ground contour at the object's position + Offset.</string>
+ </map>
+ <key>llGroundRepel</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Height</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Distance above the ground.</string>
+ </map>
+ </map>
+ <map>
+ <key>Water</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE then hover above water too.</string>
+ </map>
+ </map>
+ <map>
+ <key>Tau</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Seconds to critically damp in.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Critically damps to height if within height * 0.5 of level (either above ground level or above the higher of land and water if water == TRUE).\nCritically damps to fHeight if within fHeight * 0.5 of ground or water level.\n
+ The height is above ground level if iWater is FALSE or above the higher of land and water if iWater is TRUE.\n
+ Do not use with vehicles. Only works in physics-enabled objects.</string>
+ </map>
+ <key>llGroundSlope</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the ground slope below the object position + Offset.\nReturns the ground slope at the object position + Offset.</string>
+ </map>
+ <key>llHTTPRequest</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>URL</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>A valid HTTP/HTTPS URL.</string>
+ </map>
+ </map>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>Configuration parameters, specified as HTTP_* flag-value pairs.</string>
+ </map>
+ </map>
+ <map>
+ <key>Body</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Contents of the request.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sends an HTTP request to the specified URL with the Body of the request and Parameters.\nReturns a key that is a handle identifying the HTTP request made.</string>
+ </map>
+ <key>llHTTPResponse</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>HTTPRequestID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>A valid HTTP request key.</string>
+ </map>
+ </map>
+ <map>
+ <key>Status</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>HTTP Status (200, 400, 404, etc.).</string>
+ </map>
+ </map>
+ <map>
+ <key>Body</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Contents of the response.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Responds to an incoming HTTP request which was triggerd by an http_request event within the script. HTTPRequestID specifies the request to respond to (this ID is supplied in the http_request event handler). Status and Body specify the status code and message to respond with.</string>
+ </map>
+ <key>llInsertString</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>TargetVariable</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>SourceVariable</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Inserts SourceVariable into TargetVariable at Position, and returns the result.\nInserts SourceVariable into TargetVariable at Position and returns the result. Note this does not alter TargetVariable.</string>
+ </map>
+ <key>llInstantMessage</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>2.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>IMs Text to the user identified.\nSend Text to the user as an instant message.</string>
+ </map>
+ <key>llIntegerToBase64</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a string that is a Base64 big endian encode of Value.\nEncodes the Value as an 8-character Base64 string.</string>
+ </map>
+ <key>llJson2List</key>
+ <map>
+ <key>energy</key>
+ <real>0.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>JSON</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Converts the top level of the JSON string to a list.</string>
+ </map>
+ <key>llJsonGetValue</key>
+ <map>
+ <key>energy</key>
+ <real>0.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>JSON</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Specifiers</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Gets the value indicated by Specifiers from the JSON string.</string>
+ </map>
+ <key>llJsonSetValue</key>
+ <map>
+ <key>energy</key>
+ <real>0.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>JSON</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Specifiers</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a new JSON string that is the JSON given with the Value indicated by Specifiers set to Value.</string>
+ </map>
+ <key>llJsonValueType</key>
+ <map>
+ <key>energy</key>
+ <real>0.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>JSON</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Specifiers</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the type constant (JSON_*) for the value in JSON indicated by Specifiers.</string>
+ </map>
+ <key>llKey2Name</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Avatar or rezzed prim UUID.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the name of the prim or avatar specified by ID. The ID must be a valid rezzed prim or avatar key in the current simulator, otherwise an empty string is returned.\nFor avatars, the returned name is the legacy name</string>
+ </map>
+ <key>llLinkParticleSystem</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag</string>
+ </map>
+ </map>
+ <map>
+ <key>Rules</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Particle system rules list in the format [ rule1, data1, rule2, data2 . . . ruleN, dataN ]</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Creates a particle system in prim LinkNumber based on Rules. An empty list removes a particle system from object.\nList format is [ rule-1, data-1, rule-2, data-2 ... rule-n, data-n ].\nThis is identical to llParticleSystem except that it applies to a specified linked prim and not just the prim the script is in.</string>
+ </map>
+ <key>llLinkSitTarget</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag of the prim.</string>
+ </map>
+ </map>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Position for the sit target, relative to the prim's position.</string>
+ </map>
+ </map>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string>Rotation (relative to the prim's rotation) for the avatar.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Set the sit location for the linked prim(s). If Offset == &lt;0,0,0&gt; clear it.\nSet the sit location for the linked prim(s). The sit location is relative to the prim's position and rotation.</string>
+ </map>
+ <key>llList2CSV</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Creates a string of comma separated values from the list.\nCreate a string of comma separated values from the specified list.</string>
+ </map>
+ <key>llList2Float</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Copies the float at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to a float, then zero is returned.</string>
+ </map>
+ <key>llList2Integer</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Copies the integer at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to an integer, then zero is returned.</string>
+ </map>
+ <key>llList2Json</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>JsonType</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Type is JSON_ARRAY or JSON_OBJECT.</string>
+ </map>
+ </map>
+ <map>
+ <key>Values</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>List of values to convert.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Converts either a strided list of key:value pairs to a JSON_OBJECT, or a list of values to a JSON_ARRAY.</string>
+ </map>
+ <key>llList2Key</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Copies the key at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to a key, then null string is returned.</string>
+ </map>
+ <key>llList2List</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>End</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a subset of entries from ListVariable, in a range specified by the Start and End indicies (inclusive).\nUsing negative numbers for Start and/or End causes the index to count backwards from the length of the string, so 0, -1 would capture the entire string.\nIf Start is greater than End, the sub string is the exclusion of the entries.</string>
+ </map>
+ <key>llList2ListStrided</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>End</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Stride</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Copies the strided slice of the list from Start to End.\nReturns a copy of the strided slice of the specified list from Start to End.</string>
+ </map>
+ <key>llList2Rot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Copies the rotation at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to rotation, thenZERO_ROTATION is returned.</string>
+ </map>
+ <key>llList2String</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Copies the string at Index in the list.\nReturns the value at Index in the specified list as a string. If Index describes a location not in the list then null string is returned.</string>
+ </map>
+ <key>llList2Vector</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Index</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Copies the vector at Index in the list.\nReturns the value at Index in the specified list. If Index describes a location not in the list, or the value cannot be type-cast to a vector, then ZERO_VECTOR is returned.</string>
+ </map>
+ <key>llListen</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Channel</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>SpeakersName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>SpeakersID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Creates a listen callback for Text on Channel from SpeakersName and SpeakersID (SpeakersName, SpeakersID, and/or Text can be empty) and returns an identifier that can be used to deactivate or remove the listen.\nNon-empty values for SpeakersName, SpeakersID, and Text will filter the results accordingly, while empty strings and NULL_KEY will not filter the results, for string and key parameters respectively.\nPUBLIC_CHANNEL is the public chat channel that all avatars see as chat text. DEBUG_CHANNEL is the script debug channel, and is also visible to nearby avatars. All other channels are are not sent to avatars, but may be used to communicate with scripts.</string>
+ </map>
+ <key>llListenControl</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ChannelHandle</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Active</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Makes a listen event callback active or inactive. Pass in the value returned from llListen to the iChannelHandle parameter to specify which listener you are controlling.\nUse boolean values to specify Active</string>
+ </map>
+ <key>llListenRemove</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ChannelHandle</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Removes a listen event callback. Pass in the value returned from llListen to the iChannelHandle parameter to specify which listener to remove.</string>
+ </map>
+ <key>llListFindList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Find</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the index of the first instance of Find in ListVariable. Returns -1 if not found.\nReturns the position of the first instance of the Find list in the ListVariable. Returns -1 if not found.</string>
+ </map>
+ <key>llListInsertList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Target</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a list that contains all the elements from Target but with the elements from ListVariable inserted at Position start.\nReturns a new list, created by inserting ListVariable into the Target list at Position. Note this does not alter the Target.</string>
+ </map>
+ <key>llListRandomize</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Stride</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a version of the input ListVariable which has been randomized by blocks of size Stride.\nIf the remainder from the length of the list, divided by the stride is non-zero, this function does not randomize the list.</string>
+ </map>
+ <key>llListReplaceList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Target</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>End</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a list that is Target with Start through End removed and ListVariable inserted at Start.\nReturns a list replacing the slice of the Target list from Start to End with the specified ListVariable. Start and End are inclusive, so 0, 1 would replace the first two entries and 0, 0 would replace only the first list entry.</string>
+ </map>
+ <key>llListSort</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>List to sort.</string>
+ </map>
+ </map>
+ <map>
+ <key>Stride</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Stride length.</string>
+ </map>
+ </map>
+ <map>
+ <key>Ascending</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean. TRUE = result in ascending order, FALSE = result in descending order.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the specified list, sorted into blocks of stride in ascending order (if Ascending is TRUE, otherwise descending). Note that sort only works if the first entry of each block is the same datatype.</string>
+ </map>
+ <key>llListStatistics</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Operation</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>One of LIST_STAT_* values</string>
+ </map>
+ </map>
+ <map>
+ <key>ListVariable</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>Variable to analyze.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Performs a statistical aggregate function, specified by a LIST_STAT_* constant, on ListVariables.\nThis function allows a script to perform a statistical operation as defined by operation on a list composed of integers and floats.</string>
+ </map>
+ <key>llLoadURL</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>URL</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Shows dialog to avatar AvatarID offering to load web page at URL. If user clicks yes, launches their web browser.\nllLoadURL displays a dialogue box to the user, offering to load the specified web page using the default web browser.</string>
+ </map>
+ <key>llLog</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the natural logarithm of Value. Returns zero if Value &lt;= 0.\nReturns the base e (natural) logarithm of the specified Value.</string>
+ </map>
+ <key>llLog10</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the base 10 logarithm of Value. Returns zero if Value &lt;= 0.\nReturns the base 10 (common) logarithm of the specified Value.</string>
+ </map>
+ <key>llLookAt</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Target</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Strength</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Damping</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Cause object name to point its forward axis towards Target, at a force controlled by Strength and Damping.\nGood Strength values are around half the mass of the object and good Damping values are less than 1/10th of the Strength.\nAsymmetrical shapes require smaller Damping. A Strength of 0.0 cancels the look at.</string>
+ </map>
+ <key>llLoopSound</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Volume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Plays specified Sound, looping indefinitely, at Volume (0.0 - 1.0).\nOnly one sound may be attached to an object at a time.\nA second call to llLoopSound with the same key will not restart the sound, but the new volume will be used. This allows control over the volume of already playing sounds.\nSetting the volume to 0 is not the same as calling llStopSound; a sound with 0 volume will continue to loop.\nTo restart the sound from the beginning, call llStopSound before calling llLoopSound again.</string>
+ </map>
+ <key>llLoopSoundMaster</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Volume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Plays attached Sound, looping at volume (0.0 - 1.0), and declares it a sync master.\nBehaviour is identical to llLoopSound, with the addition of marking the source as a "Sync Master", causing "Slave" sounds to sync to it. If there are multiple masters within a viewers interest area, the most audible one (a function of both distance and volume) will win out as the master.\nThe use of multiple masters within a small area is unlikely to produce the desired effect.</string>
+ </map>
+ <key>llLoopSoundSlave</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Volume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Plays attached sound looping at volume (0.0 - 1.0), synced to most audible sync master.\nBehaviour is identical to llLoopSound, unless there is a "Sync Master" present.\nIf a Sync Master is already playing the Slave sound will begin playing from the same point the master is in its loop synchronizing the loop points of both sounds.\nIf a Sync Master is started when the Slave is already playing, the Slave will skip to the correct position to sync with the Master.</string>
+ </map>
+ <key>llMakeExplosion</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Particles</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Scale</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Velocity</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Lifetime</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Arc</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Texture</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Make a round explosion of particles. Deprecated: Use llParticleSystem instead.\nMake a round explosion of particles using texture from the objects inventory. Deprecated: Use llParticleSystem instead.</string>
+ </map>
+ <key>llMakeFire</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Particles</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Scale</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Velocity</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Lifetime</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Arc</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Texture</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Make fire like particles. Deprecated: Use llParticleSystem instead.\nMake fire particles using texture from the objects inventory. Deprecated: Use llParticleSystem instead.</string>
+ </map>
+ <key>llMakeFountain</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Particles</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Scale</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Velocity</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Lifetime</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Arc</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Texture</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Make a fountain of particles. Deprecated: Use llParticleSystem instead.\nMake a fountain of particles using texture from the objects inventory. Deprecated: Use llParticleSystem instead.</string>
+ </map>
+ <key>llMakeSmoke</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Particles</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Scale</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Velocity</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Lifetime</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Arc</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Texture</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Make smoke like particles. Deprecated: Use llParticleSystem instead.\nMake smoky particles using texture from the objects inventory. Deprecated: Use llParticleSystem instead.</string>
+ </map>
+ <key>llManageEstateAccess</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Action</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>One of the ESTATE_ACCESS_ALLOWED_* actions.</string>
+ </map>
+ </map>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>UUID of the avatar or group to act upon.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Adds or removes agents from the estate's agent access or ban lists, or groups to the estate's group access list. Action is one of the ESTATE_ACCESS_ALLOWED_* operations to perform.\nReturns an integer representing a boolean, TRUE if the call was successful; FALSE if throttled, invalid action, invalid or null id or object owner is not allowed to manage the estate.\nThe object owner is notified of any changes, unless PERMISSION_SILENT_ESTATE_MANAGEMENT has been granted to the script.</string>
+ </map>
+ <key>llMapDestination</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>RegionName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Direction</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Opens world map for avatar who touched is is wearing the script, centred on RegionName with Position highlighted. Only works for scripts attached to avatar, or during touch events.\nDirection currently has no effect.</string>
+ </map>
+ <key>llMD5String</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Nonce</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a string of 32 hex characters that is an RSA Data Security Inc., MD5 Message-Digest Algorithm of Text with Nonce used as the salt.\nReturns a 32-character hex string. (128-bit in binary.)</string>
+ </map>
+ <key>llMessageLinked</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Number</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sends Number, Text, and ID to members of the link set identified by LinkNumber.\nLinkNumber is either a linked number (available through llGetLinkNumber) or a LINK_* constant.</string>
+ </map>
+ <key>llMinEventDelay</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Delay</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Set the minimum time between events being handled.</string>
+ </map>
+ <key>llModifyLand</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Action</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>LAND_LEVEL, LAND_RAISE, LAND_LOWER, LAND_SMOOTH, LAND_NOISE or LAND_REVERT</string>
+ </map>
+ </map>
+ <map>
+ <key>Area</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>0, 1, 2 (2m x 2m, 4m x 4m, or 8m x 8m)</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Modify land with action (LAND_LEVEL, LAND_RAISE, LAND_LOWER, LAND_SMOOTH, LAND_NOISE, LAND_REVERT) on size (0, 1, 2, corresponding to 2m x 2m, 4m x 4m, 8m x 8m).</string>
+ </map>
+ <key>llModPow</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Power</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Modulus</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a Value raised to the Power, mod Modulus. ((a**b)%c) b is capped at 0xFFFF (16 bits).\nReturns (Value ^ Power) % Modulus. (Value raised to the Power, Modulus). Value is capped at 0xFFFF (16 bits).</string>
+ </map>
+ <key>llMoveToTarget</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Target</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Tau</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Critically damp to Target in Tau seconds (if the script is physical).\nCritically damp to position target in tau-seconds if the script is physical. Good tau-values are greater than 0.2. A tau of 0.0 stops the critical damping.</string>
+ </map>
+ <key>llNavigateTo</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Location</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Region coordinates for the character to navigate to.</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>List of parameters to control the type of path-finding used. Currently only FORCE_DIRECT_PATH supported.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Navigate to destination.\nDirects an object to travel to a defined position in the region or adjacent regions.</string>
+ </map>
+ <key>llOffsetTexture</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>OffsetS</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>OffsetT</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the texture S and T offsets for the chosen Face.\nIf Face is ALL_SIDES this function sets the texture offsets for all faces.</string>
+ </map>
+ <key>llOpenRemoteDataChannel</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Requests a channel to listen for XML-RPC calls. (Deprecated: XML-RPC should not be used. Use http-in instead.)\nWill trigger a remote_data event with type = REMOTE_DATA_CHANNEL and a channel ID (key) once it is available.\nThis channel ID must be referenced in the XML-RPC call to the script (from the internet) -- so the key must somehow get to the external XML-RPC client.</string>
+ </map>
+ <key>llOverMyLand</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns TRUE if id ID over land owned by the script owner, otherwise FALSE.\nReturns TRUE if key ID is over land owned by the object owner, FALSE otherwise.</string>
+ </map>
+ <key>llOwnerSay</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>says Text to owner only (if owner is in region).\nSays Text to the owner of the object running the script, if the owner has been within the object's simulator since logging into Second Life, regardless of where they may be in-world.</string>
+ </map>
+ <key>llParcelMediaCommandList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>2.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>CommandList</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>A list of PARCEL_MEDIA_COMMAND_* flags and their parameters </string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Controls the playback of multimedia resources on a parcel or for an agent, via one or more PARCEL_MEDIA_COMMAND_* arguments specified in CommandList.</string>
+ </map>
+ <key>llParcelMediaQuery</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>2.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>QueryList</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Queries the media properties of the parcel containing the script, via one or more PARCEL_MEDIA_COMMAND_* arguments specified in CommandList.\nThis function will only work if the script is contained within an object owned by the land-owner (or if the land is owned by a group, only if the object has been deeded to the group).</string>
+ </map>
+ <key>llParseString2List</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Separators</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Spacers</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Converts Text into a list, discarding Separators, keeping Spacers (Separators and Spacers must be lists of strings, maximum of 8 each).\nSeparators and Spacers are lists of strings with a maximum of 8 entries each.</string>
+ </map>
+ <key>llParseStringKeepNulls</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>list</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Separators</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Spacers</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Breaks Text into a list, discarding separators, keeping spacers, keeping any null values generated. (separators and spacers must be lists of strings, maximum of 8 each).\nllParseStringKeepNulls works almost exactly like llParseString2List, except that if a null is found it will add a null-string instead of discarding it like llParseString2List does.</string>
+ </map>
+ <key>llParticleSystem</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Creates a particle system in the prim the script is attached to, based on Parameters. An empty list removes a particle system from object.\nList format is [ rule-1, data-1, rule-2, data-2 ... rule-n, data-n ].</string>
+ </map>
+ <key>llPassCollisions</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Pass</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE, collisions are passed from children on to parents.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Configures how collision events are passed to scripts in the linkset.\nIf Pass == TRUE, collisions involving collision-handling scripted child prims are also passed on to the root prim. If Pass == FALSE (default behavior), such collisions will only trigger events in the affected child prim.</string>
+ </map>
+ <key>llPassTouches</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Pass</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE, touches are passed from children on to parents.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Configures how touch events are passed to scripts in the linkset.\nIf Pass == TRUE, touches involving touch-handling scripted child prims are also passed on to the root prim. If Pass == FALSE (default behavior), such touches will only trigger events in the affected child prim.</string>
+ </map>
+ <key>llPatrolPoints</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Points</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>A list of vectors for the character to travel through sequentially. The list must contain at least two entries.</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>No options available at this time.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Patrol a list of points.\nSets the points for a character (llCreateCharacter) to patrol along.</string>
+ </map>
+ <key>llPlaySound</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Volume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Plays Sound once, at Volume (0.0 - 1.0) and attached to the object.\nOnly one sound may be attached to an object at a time, and attaching a new sound or calling llStopSound will stop the previously attached sound.\nA second call to llPlaySound with the same sound will not restart the sound, but the new volume will be used, which allows control over the volume of already playing sounds.\nTo restart the sound from the beginning, call llStopSound before calling llPlaySound again.</string>
+ </map>
+ <key>llPlaySoundSlave</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Volume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Plays attached Sound once, at Volume (0.0 - 1.0), synced to next loop of most audible sync master.\nBehaviour is identical to llPlaySound, unless there is a "Sync Master" present. If a Sync Master is already playing, the Slave sound will not be played until the Master hits its loop point and returns to the beginning.\nllPlaySoundSlave will play the sound exactly once; if it is desired to have the sound play every time the Master loops, either use llLoopSoundSlave with extra silence padded on the end of the sound or ensure that llPlaySoundSlave is called at least once per loop of the Master.</string>
+ </map>
+ <key>llPow</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Exponent</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the Value raised to the power Exponent, or returns 0 and triggers Math Error for imaginary results.\nReturns the Value raised to the Exponent.</string>
+ </map>
+ <key>llPreloadSound</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Causes nearby viewers to preload the Sound from the object's inventory.\nThis is intended to prevent delays in starting new sounds when called upon.</string>
+ </map>
+ <key>llPursue</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>TargetID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Agent or object to pursue.</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>Parameters for pursuit.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Chase after a target.\nCauses the character (llCharacter) to pursue the target defined by TargetID.</string>
+ </map>
+ <key>llPushObject</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ObjectID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Impulse</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>AngularImpulse</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Local</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Applies Impulse and AngularImpulse to ObjectID.\nApplies the supplied impulse and angular impulse to the object specified.</string>
+ </map>
+ <key>llRefreshPrimURL</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>20.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Reloads the web page shown on the sides of the object.</string>
+ </map>
+ <key>llRegionSay</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Channel</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Any integer value except zero.</string>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Message to be transmitted.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Broadcasts Text to entire region on Channel (except for channel 0).</string>
+ </map>
+ <key>llRegionSayTo</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>TargetID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Avatar or object to say to.</string>
+ </map>
+ </map>
+ <map>
+ <key>Channel</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Output channel, any integer value.</string>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Message to be transmitted.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Says Text, on Channel, to avatar or object indicated by TargetID (if within region).\nIf TargetID is an avatar and Channel is nonzero, Text can be heard by any attachment on the avatar.</string>
+ </map>
+ <key>llReleaseCamera</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Return camera to agent.\nDeprecated: Use llClearCameraParams instead.</string>
+ </map>
+ <key>llReleaseControls</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Stop taking inputs.\nStop taking inputs from the avatar.</string>
+ </map>
+ <key>llReleaseURL</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>URL</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>URL to release.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Releases the specified URL, which was previously obtained using llRequestURL. Once released, the URL will no longer be usable.</string>
+ </map>
+ <key>llRemoteDataReply</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>3.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ChannelID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>MessageID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>sData</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>String data to send</string>
+ </map>
+ </map>
+ <map>
+ <key>iData</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Integer data to send</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Send an XML-RPC reply to MessageID on ChannelID with payload of string sData and integer iData. Deprecated: Use HTTP functions/events instead.\nThe size of sData is limited to 254 characters.</string>
+ </map>
+ <key>llRemoteDataSetRegion</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Deprecated: Use HTTP functions/events instead.\nIf an object using remote data channels changes regions, you must call this function to re-register the remote data channels.\nYou do not need to make this call if you don't change regions.</string>
+ </map>
+ <key>llRemoteLoadScriptPin</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>3.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ObjectID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Target prim to attempt copying into.</string>
+ </map>
+ </map>
+ <map>
+ <key>ScriptName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Name of the script in current inventory to copy.</string>
+ </map>
+ </map>
+ <map>
+ <key>PIN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Integer set on target prim as a Personal Information Number code.</string>
+ </map>
+ </map>
+ <map>
+ <key>Running</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>If the script should be set running in the target prim.</string>
+ </map>
+ </map>
+ <map>
+ <key>StartParameter</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Integer. Parameter passed to the script if set to be running.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If the owner of the object containing this script can modify the object identified by the specified object key, and if the PIN matches the PIN previously set using llSetRemoteScriptAccessPin (on the target prim), then the script will be copied into target. Running is a boolean specifying whether the script should be enabled once copied into the target object.</string>
+ </map>
+ <key>llRemoveFromLandBanList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Remove avatar from the land ban list.\nRemove specified avatar from the land parcel ban list.</string>
+ </map>
+ <key>llRemoveFromLandPassList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Remove avatar from the land pass list.\nRemove specified avatar from the land parcel pass list.</string>
+ </map>
+ <key>llRemoveInventory</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Remove the named inventory item.\nRemove the named inventory item from the object inventory.</string>
+ </map>
+ <key>llRemoveVehicleFlags</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Vehiclelags</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Removes the enabled bits in 'flags'.\nSets the vehicle flags to FALSE. Valid parameters can be found in the vehicle flags constants section.</string>
+ </map>
+ <key>llRequestAgentData</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Data</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Requests data about AvatarID. When data is available the dataserver event will be raised.\nThis function requests data about an avatar. If and when the information is collected, the dataserver event is triggered with the key returned from this function passed in the requested parameter. See the agent data constants (DATA_*) for details about valid values of data and what each will return in the dataserver event.</string>
+ </map>
+ <key>llRequestDisplayName</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Avatar UUID</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Requests the display name of the agent. When the display name is available the dataserver event will be raised.\nThe avatar identified does not need to be in the same region or online at the time of the request.\nReturns a key that is used to identify the dataserver event when it is raised.</string>
+ </map>
+ <key>llRequestInventoryData</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Requests data for the named InventoryItem.\nWhen data is available, the dataserver event will be raised with the key returned from this function in the requested parameter.\nThe only request currently implemented is to request data from landmarks, where the data returned is in the form "&lt;float, float, float&gt;" which can be cast to a vector. This position is in region local coordinates.</string>
+ </map>
+ <key>llRequestPermissions</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>PermissionMask</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Ask AvatarID to allow the script to perform certain actions, specified in the PermissionMask bitmask. PermissionMask should be one or more PERMISSION_* constants. Multiple permissions can be requested simultaneously by ORing the constants together. Many of the permissions requests can only go to object owner.\nThis call will not stop script execution. If the avatar grants the requested permissions, the run_time_permissions event will be called.</string>
+ </map>
+ <key>llRequestSecureURL</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Requests one HTTPS:// (SSL) URL for use by this object. The http_request event is triggered with results.\nReturns a key that is the handle used for identifying the request in the http_request event.</string>
+ </map>
+ <key>llRequestSimulatorData</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>RegionName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Data</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Requests the specified Data about RegionName. When the specified data is available, the dataserver event is raised.\nData should use one of the DATA_SIM_* constants.\nReturns a dataserver query ID and triggers the dataserver event when data is found.</string>
+ </map>
+ <key>llRequestURL</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Requests one HTTP:// URL for use by this script. The http_request event is triggered with the result of the request.\nReturns a key that is the handle used for identifying the result in the http_request event.</string>
+ </map>
+ <key>llRequestUsername</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Requests single-word user-name of an avatar. When data is available the dataserver event will be raised.\nRequests the user-name of the identified agent. When the user-name is available the dataserver event is raised.\nThe agent identified does not need to be in the same region or online at the time of the request.\nReturns a key that is used to identify the dataserver event when it is raised.</string>
+ </map>
+ <key>llResetAnimationOverride</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AnimationState</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Resets the animation of the specified animation state to the default value.\nIf animation state equals "ALL", then all animation states are reset.</string>
+ </map>
+ <key>llResetLandBanList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Removes all residents from the land ban list.</string>
+ </map>
+ <key>llResetLandPassList</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Removes all residents from the land access/pass list.</string>
+ </map>
+ <key>llResetOtherScript</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ScriptName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Resets the named script.</string>
+ </map>
+ <key>llResetScript</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Resets the script.</string>
+ </map>
+ <key>llResetTime</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Sets the time to zero.\nSets the internal timer to zero.</string>
+ </map>
+ <key>llReturnObjectsByID</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ObjectIDs</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>List of object UUIDs to be returned.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Return objects using their UUIDs.\nRequires the PERMISSION_RETURN_OBJECTS permission and that the script owner owns the parcel the returned objects are in, or is an estate manager or region owner.</string>
+ </map>
+ <key>llReturnObjectsByOwner</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Object owner's UUID.</string>
+ </map>
+ </map>
+ <map>
+ <key>Scope</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Return objects based upon their owner and a scope of parcel, parcel owner, or region.\nRequires the PERMISSION_RETURN_OBJECTS permission and that the script owner owns the parcel the returned objects are in, or is an estate manager or region owner.</string>
+ </map>
+ <key>llRezAtRoot</key>
+ <map>
+ <key>energy</key>
+ <real>200.0</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Velocity</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>StartParameter</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Instantiate owner's InventoryItem at Position with Velocity, Rotation and with StartParameter. The last selected root object's location will be set to Position.\nCreates object's inventory item at the given Position, with Velocity, Rotation, and StartParameter.</string>
+ </map>
+ <key>llRezObject</key>
+ <map>
+ <key>energy</key>
+ <real>200</real>
+ <key>sleep</key>
+ <real>0.1</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Velocity</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>StartParameter</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Instantiate owners InventoryItem at Position with Velocity, Rotation and with start StartParameter.\nCreates object's inventory item at Position with Velocity and Rotation supplied. The StartParameter value will be available to the newly created object in the on_rez event or through the llGetStartParameter function.\nThe Velocity parameter is ignored if the rezzed object is not physical.</string>
+ </map>
+ <key>llRot2Angle</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the rotation angle represented by Rotation.\nReturns the angle represented by the Rotation.</string>
+ </map>
+ <key>llRot2Axis</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the rotation axis represented by Rotation.\nReturns the axis represented by the Rotation.</string>
+ </map>
+ <key>llRot2Euler</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the Euler representation (roll, pitch, yaw) of Rotation.\nReturns the Euler Angle representation of the Rotation.</string>
+ </map>
+ <key>llRot2Fwd</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the forward vector defined by Rotation.\nReturns the forward axis represented by the Rotation.</string>
+ </map>
+ <key>llRot2Left</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the left vector defined by Rotation.\nReturns the left axis represented by the Rotation.</string>
+ </map>
+ <key>llRot2Up</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the up vector defined by Rotation.\nReturns the up axis represented by the Rotation.</string>
+ </map>
+ <key>llRotateTexture</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Radians</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the texture rotation for the specified Face to angle Radians.\nIf Face is ALL_SIDES, rotates the texture of all sides.</string>
+ </map>
+ <key>llRotBetween</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>rotation</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Vector1</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Vector2</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the rotation to rotate Vector1 to Vector2.\nReturns the rotation needed to rotate Vector1 to Vector2.</string>
+ </map>
+ <key>llRotLookAt</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Strength</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Damping</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Cause object to rotate to Rotation, with a force function defined by Strength and Damping parameters. Good strength values are around half the mass of the object and good damping values are less than 1/10th of the strength.\nAsymmetrical shapes require smaller damping.\nA strength of 0.0 cancels the look at.</string>
+ </map>
+ <key>llRotTarget</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>LeeWay</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Set rotations with error of LeeWay radians as a rotational target, and return an ID for the rotational target.\nThe returned number is a handle that can be used in at_rot_target and llRotTargetRemove.</string>
+ </map>
+ <key>llRotTargetRemove</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Handle</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Removes rotational target number.\nRemove rotational target indicated by the handle.</string>
+ </map>
+ <key>llRound</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns Value rounded to the nearest integer.\nReturns the Value rounded to the nearest integer.</string>
+ </map>
+ <key>llSameGroup</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns TRUE if avatar ID is in the same region and has the same active group, otherwise FALSE.\nReturns TRUE if the object or agent identified is in the same simulator and has the same active group as this object. Otherwise, returns FALSE.</string>
+ </map>
+ <key>llSay</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Channel</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Channel to use to say text on.</string>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Text to say.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Says Text on Channel.\nThis chat method has a range of 20m radius.\nPUBLIC_CHANNEL is the public chat channel that all avatars see as chat text. DEBUG_CHANNEL is the script debug channel, and is also visible to nearby avatars. All other channels are are not sent to avatars, but may be used to communicate with scripts.</string>
+ </map>
+ <key>llScaleByFactor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ScalingFactor</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>The multiplier to be used with the prim sizes and their local positions.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Attempts to resize the entire object by ScalingFactor, maintaining the size-position ratios of the prims.\n\nResizing is subject to prim scale limits and linkability limits. This function can not resize the object if the linkset is physical, a pathfinding character, in a keyframed motion, or if resizing would cause the parcel to overflow.\nReturns a boolean (an integer) TRUE if it succeeds, FALSE if it fails.</string>
+ </map>
+ <key>llScaleTexture</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Horizontal</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Vertical</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the diffuse texture Horizontal and Vertical repeats on Face of the prim the script is attached to.\nIf Face == ALL_SIDES, all sides are set in one call.\nNegative values for horizontal and vertical will flip the texture.</string>
+ </map>
+ <key>llScriptDanger</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns TRUE if Position is over public land, sandbox land, land that doesn't allow everyone to edit and build, or land that doesn't allow outside scripts.\nReturns true if the position is over public land, land that doesn't allow everyone to edit and build, or land that doesn't allow outside scripts.</string>
+ </map>
+ <key>llScriptProfiler</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>State</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>PROFILE_NONE or PROFILE_SCRIPT_MEMORY flags to control the state.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Enables or disables script profiling options. Currently only supports PROFILE_SCRIPT_MEMORY (Mono only) and PROFILE_NONE.\nMay significantly reduce script performance.</string>
+ </map>
+ <key>llSendRemoteData</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>3.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ChannelID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Destination</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Deprecated: use HTTP functions and events instead.\nSends an XML-RPC request to Destination through ChannelID with payload of ChannelID (in a string), integer Value and string Text.\nReturns a key that is the message_id for the resulting remote_data events.</string>
+ </map>
+ <key>llSensor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Name</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Object or avatar name.</string>
+ </map>
+ </map>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Object or avatar UUID.</string>
+ </map>
+ </map>
+ <map>
+ <key>Type</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Bit-field mask of AGENT, AGENT_BY_LEGACY_NAME, AGENT_BY_USERNAME, ACTIVE, PASSIVE, and/or SCRIPTED</string>
+ </map>
+ </map>
+ <map>
+ <key>Range</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Distance to scan. 0.0 - 96.0m.</string>
+ </map>
+ </map>
+ <map>
+ <key>Arc</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Angle, in radians, from the local x-axis of the prim to scan.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Performs a single scan for Name and ID with Type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within Range meters and Arc radians of forward vector.\nSpecifying a blank Name, 0 Type, or NULL_KEY ID will prevent filtering results based on that parameter. A range of 0.0 does not perform a scan.\nResults are returned in the sensor and no_sensor events.</string>
+ </map>
+ <key>llSensorRemove</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>removes sensor.\nRemoves the sensor set by llSensorRepeat.</string>
+ </map>
+ <key>llSensorRepeat</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Name</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Object or avatar name.</string>
+ </map>
+ </map>
+ <map>
+ <key>ID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>Object or avatar UUID.</string>
+ </map>
+ </map>
+ <map>
+ <key>Type</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Bit-field mask of AGENT, AGENT_BY_LEGACY_NAME, AGENT_BY_USERNAME, ACTIVE, PASSIVE, and/or SCRIPTED</string>
+ </map>
+ </map>
+ <map>
+ <key>Range</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Distance to scan. 0.0 - 96.0m.</string>
+ </map>
+ </map>
+ <map>
+ <key>Arc</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Angle, in radians, from the local x-axis of the prim to scan.</string>
+ </map>
+ </map>
+ <map>
+ <key>Rate</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Period, in seconds, between scans.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Initiates a periodic scan every Rate seconds, for Name and ID with Type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within Range meters and Arc radians of forward vector.\nSpecifying a blank Name, 0 Type, or NULL_KEY ID will prevent filtering results based on that parameter. A range of 0.0 does not perform a scan.\nResults are returned in the sensor and no_sensor events.</string>
+ </map>
+ <key>llSetAlpha</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Opacity</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the alpha (opacity) of Face.\nSets the alpha (opacity) value for Face. If Face is ALL_SIDES, sets the alpha for all faces. The alpha value is interpreted as an opacity percentage (1.0 is fully opaque, and 0.2 is mostly transparent). This function will clamp alpha values less than 0.1 to 0.1 and greater than 1.0 to 1.</string>
+ </map>
+ <key>llSetAngularVelocity</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AngVel</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>The angular velocity to set the object to.</string>
+ </map>
+ </map>
+ <map>
+ <key>Local</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>If TRUE, the AngVel is treated as a local directional vector instead of a regional directional vector.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets an object's angular velocity to AngVel, in local coordinates if Local == TRUE (if the script is physical).\nHas no effect on non-physical objects.</string>
+ </map>
+ <key>llSetAnimationOverride</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AnimationState</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>AnimationName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the animation (in object inventory) that will play for the given animation state.\nTo use this function the script must obtain the PERMISSION_OVERRIDE_ANIMATIONS permission.</string>
+ </map>
+ <key>llSetBuoyancy</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Buoyancy</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Set the tasks buoyancy (0 is none, &lt; 1.0 sinks, 1.0 floats, &gt; 1.0 rises).\nSet the object buoyancy. A value of 0 is none, less than 1.0 sinks, 1.0 floats, and greater than 1.0 rises.</string>
+ </map>
+ <key>llSetCameraAtOffset</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the camera used in this object, at offset, if an avatar sits on it.\nSets the offset that an avatar's camera will be moved to if the avatar sits on the object.</string>
+ </map>
+ <key>llSetCameraEyeOffset</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the camera eye offset used in this object if an avatar sits on it.</string>
+ </map>
+ <key>llSetCameraParams</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets multiple camera parameters at once. List format is [ rule-1, data-1, rule-2, data-2 . . . rule-n, data-n ].</string>
+ </map>
+ <key>llSetClickAction</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Action</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>A CLICK_ACTION_* flag</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the action performed when a prim is clicked upon.</string>
+ </map>
+ <key>llSetColor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Color</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the color, for the face.\nSets the color of the side specified. If Face is ALL_SIDES, sets the color on all faces.</string>
+ </map>
+ <key>llSetContentType</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>HTTPRequestID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>A valid http_request() key</string>
+ </map>
+ </map>
+ <map>
+ <key>ContentType</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Media type to use with any following llHTTPResponse(HTTPRequestID, ...)</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Set the media type of an LSL HTTP server response to ContentType.\nHTTPRequestID must be a valid http_request ID. ContentType must be one of the CONTENT_TYPE_* constants.</string>
+ </map>
+ <key>llSetDamage</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Damage</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the amount of damage that will be done to an avatar that this task hits. Task will be killed.\nSets the amount of damage that will be done to an avatar that this object hits. This object will be destroyed on damaging an avatar, and no collision event is triggered.</string>
+ </map>
+ <key>llSetForce</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Force</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Directional force.</string>
+ </map>
+ </map>
+ <map>
+ <key>Local</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE uses local axis, if FALSE uses region axis.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets Force on object, in object-local coordinates if Local == TRUE (otherwise, the region reference frame is used).\nOnly works on physical objects.</string>
+ </map>
+ <key>llSetForceAndTorque</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Force</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Directional force.</string>
+ </map>
+ </map>
+ <map>
+ <key>Torque</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Torque force.</string>
+ </map>
+ </map>
+ <map>
+ <key>Local</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE uses local axis, if FALSE uses region axis.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the Force and Torque of object, in object-local coordinates if Local == TRUE (otherwise, the region reference frame is used).\nOnly works on physical objects.</string>
+ </map>
+ <key>llSetHoverHeight</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Height</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Distance above the ground.</string>
+ </map>
+ </map>
+ <map>
+ <key>Water</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE then hover above water too.</string>
+ </map>
+ </map>
+ <map>
+ <key>Tau</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Seconds to critically damp in.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Critically damps a physical object to a Height (either above ground level or above the higher of land and water if water == TRUE).\nDo not use with vehicles. Use llStopHover to stop hovering.</string>
+ </map>
+ <key>llSetInventoryPermMask</key>
+ <map>
+ <key>god-mode</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>InventoryItem</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>An item in the prim's inventory</string>
+ </map>
+ </map>
+ <map>
+ <key>PermissionFlag</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>MASK_* flag</string>
+ </map>
+ </map>
+ <map>
+ <key>PermissionMask</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Permission bit-field (PERM_* flags)</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the given permission mask to the new value on the inventory item.</string>
+ </map>
+ <key>llSetKeyframedMotion</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Keyframes</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>Strided keyframe list of the form: position, orientation, time. Each keyframe is interpreted relative to the previous transform of the object.</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Requests that a non-physical object be key-framed according to key-frame list.\nSpecify a list of times, positions, and orientations to be followed by an object. The object will be smoothly moved between key-frames by the simulator. Collisions with other non-physical or key-framed objects will be ignored (no script events will fire and collision processing will not occur). Collisions with physical objects will be computed and reported, but the key-framed object will be unaffected by those collisions.\nKeyframes is a strided list containing positional, rotational, and time data for each step in the motion. Options is a list containing optional arguments and parameters (specified by KFM_* constants).</string>
+ </map>
+ <key>llSetLinkAlpha</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Opacity</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If a prim exists in the link chain at LinkNumber, set Face to Opacity.\nSets the Face, on the linked prim specified, to the Opacity.</string>
+ </map>
+ <key>llSetLinkCamera</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Prim link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag</string>
+ </map>
+ </map>
+ <map>
+ <key>EyeOffset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Offset, relative to the object's centre and expressed in local coordinates, that the camera looks from.</string>
+ </map>
+ </map>
+ <map>
+ <key>LookOffset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Offset, relative to the object's centre and expressed in local coordinates, that the camera looks toward.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the camera eye offset, and the offset that camera is looking at, for avatars that sit on the linked prim.</string>
+ </map>
+ <key>llSetLinkColor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag.</string>
+ </map>
+ </map>
+ <map>
+ <key>Color</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Color in RGB &lt;R.R, G.G, B.B&gt;</string>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Side number or ALL_SIDES.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If a task exists in the link chain at LinkNumber, set the Face to color.\nSets the color of the linked child's side, specified by LinkNumber.</string>
+ </map>
+ <key>llSetLinkMedia</key>
+ <map>
+ <key>energy</key>
+ <real>0.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Link</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims).</string>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Face number.</string>
+ </map>
+ </map>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>A set of name/value pairs (in no particular order)</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Set the media parameters for a particular face on linked prim, specified by Link. Returns an integer that is a STATUS_* flag which details the success/failure of the operation(s).\nMediaParameters is a set of name/value pairs in no particular order. Parameters not specified are unchanged, or if new media is added then set to the default specified.</string>
+ </map>
+ <key>llSetLinkPrimitiveParams</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag</string>
+ </map>
+ </map>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Set primitive parameters for LinkNumber based on Parameters.\nSets the parameters (or properties) of any linked prim in one step.</string>
+ </map>
+ <key>llSetLinkPrimitiveParamsFast</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag</string>
+ </map>
+ </map>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Set primitive parameters for LinkNumber based on Parameters, without a delay.\nSet parameters for link number, from the list of Parameters, with no built-in script sleep. This function is identical to llSetLinkPrimitiveParams, except without the delay.</string>
+ </map>
+ <key>llSetLinkTexture</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Texture</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the Texture of Face on a linked prim, specified by LinkNumber. Texture may be a UUID or name of a texture in prim inventory.</string>
+ </map>
+ <key>llSetLinkTextureAnim</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>LinkNumber</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Link number (0: unlinked, 1: root prim, &gt;1: child prims) or a LINK_* flag to effect</string>
+ </map>
+ </map>
+ <map>
+ <key>Mode</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Bitmask of animation options.</string>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Specifies which object face to animate or ALL_SIDES.</string>
+ </map>
+ </map>
+ <map>
+ <key>SizeX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Horizontal frames (ignored for ROTATE and SCALE).</string>
+ </map>
+ </map>
+ <map>
+ <key>SizeY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Vertical frames (ignored for ROTATE and SCALE).</string>
+ </map>
+ </map>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Start position/frame number (or radians for ROTATE).</string>
+ </map>
+ </map>
+ <map>
+ <key>Length</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Specifies the animation duration, in frames (or radians for ROTATE).</string>
+ </map>
+ </map>
+ <map>
+ <key>Rate</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Specifies the animation playback rate, in frames per second (must be greater than zero).</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Animates a texture on the prim specified by LinkNumber, by setting the texture scale and offset.\nMode is a bitmask of animation options.\nFace specifies which object face to animate.\nSizeX and SizeY specify the number of horizontal and vertical frames.Start specifes the animation start point.\nLength specifies the animation duration.\nRate specifies the animation playback rate.</string>
+ </map>
+ <key>llSetLocalRot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the rotation of a child prim relative to the root prim.</string>
+ </map>
+ <key>llSetMemoryLimit</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Limit</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>The amount to reserve, which must be less than the allowed maximum (currently 64KB) and not already have been exceeded.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Requests Limit bytes to be reserved for this script.\nReturns TRUE or FALSE indicating whether the limit was set successfully.\nThis function has no effect if the script is running in the LSO VM.</string>
+ </map>
+ <key>llSetObjectDesc</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Description</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the description of the prim to Description.\nThe description field is limited to 127 characters.</string>
+ </map>
+ <key>llSetObjectName</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Name</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the prim's name to Name.</string>
+ </map>
+ <key>llSetObjectPermMask</key>
+ <map>
+ <key>god-mode</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>PermissionFlag</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>MASK_* flag</string>
+ </map>
+ </map>
+ <map>
+ <key>PermissionMask</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Permission bit-field (PERM_* flags)</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the specified PermissionFlag permission to the value specified by PermissionMask on the object the script is attached to.</string>
+ </map>
+ <key>llSetParcelMusicURL</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>2.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>URL</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the streaming audio URL for the parcel the object is on.\nThe object must be owned by the owner of the parcel; if the parcel is group owned the object must be owned by that group.</string>
+ </map>
+ <key>llSetPayPrice</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Price</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>The default price shown in the textu input field.</string>
+ </map>
+ </map>
+ <map>
+ <key>QuickButtons</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>Specifies the 4 payment values shown in the payment dialog's buttons (or PAY_HIDE).</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the default amount when someone chooses to pay this object.\nPrice is the default price shown in the textu input field. QuickButtons specifies the 4 payment values shown in the payment dialog's buttons.\nInput field and buttons may be hidden with PAY_HIDE constant, and may be set to their default values using PAY_DEFAULT.</string>
+ </map>
+ <key>llSetPhysicsMaterial</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real/>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>MaterialBits</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>A bitmask specifying which of the parameters in the other arguments should be applied to the object.</string>
+ </map>
+ </map>
+ <map>
+ <key>GravityMultiplier</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Restitution</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Friction</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Density</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the selected parameters of the object's physics behavior.\nMaterialBits is a bitmask specifying which of the parameters in the other arguments should be applied to the object. GravityMultiplier, Restitution, Friction, and Density are the possible parameters to manipulate.</string>
+ </map>
+ <key>llSetPos</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Region coordinates to move to (within 10m).</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If the object is not physical, this function sets the position of the prim.\nIf the script is in a child prim, Position is treated as root relative and the link-set is adjusted.\nIf the prim is the root prim, the entire object is moved (up to 10m) to Position in region coordinates.</string>
+ </map>
+ <key>llSetPrimitiveParams</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Parameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>A list of changes.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This function changes the many properties (or "parameters") of a prim in one operation. Parameters is a list of changes.</string>
+ </map>
+ <key>llSetPrimMediaParams</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Face number</string>
+ </map>
+ </map>
+ <map>
+ <key>MediaParameters</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>A set of name/value pairs (in no particular order)</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the MediaParameters for a particular Face on the prim. Returns an integer that is a STATUS_* flag which details the success/failure of the operation(s).\nMediaParameters is a set of name/value pairs in no particular order. Parameters not specified are unchanged, or if new media is added then set to the default specified.</string>
+ </map>
+ <key>llSetPrimURL</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>20.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>URL</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Deprecated: Use llSetPrimMediaParams instead.</string>
+ </map>
+ <key>llSetRegionPos</key>
+ <map>
+ <key>energy</key>
+ <real>0.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Vector. The location to move to, in region coordinates.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Attempts to move the object so that the root prim is within 0.1m of Position.\nReturns an integer boolean, TRUE if the object is successfully placed within 0.1 m of Position, FALSE otherwise.\nPosition may be any location within the region or up to 10m across a region border.\nIf the position is below ground, it will be set to the ground level at that x,y location.</string>
+ </map>
+ <key>llSetRemoteScriptAccessPin</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>PIN</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If PIN is set to a non-zero number, the task will accept remote script loads via llRemoteLoadScriptPin() if it passes in the correct PIN. Othersise, llRemoteLoadScriptPin() is ignored.</string>
+ </map>
+ <key>llSetRot</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If the object is not physical, this function sets the rotation of the prim.\nIf the script is in a child prim, Rotation is treated as root relative and the link-set is adjusted.\nIf the prim is the root prim, the entire object is rotated to Rotation in the global reference frame.</string>
+ </map>
+ <key>llSetScale</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Scale</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the prim's scale (size) to Scale.</string>
+ </map>
+ <key>llSetScriptState</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ScriptName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Running</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Enable or disable the script Running state of Script in the prim.</string>
+ </map>
+ <key>llSetSitText</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Displays Text rather than 'Sit' in the viewer's context menu.</string>
+ </map>
+ <key>llSetSoundQueueing</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>QueueEnable</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, sound queuing: TRUE enables, FALSE disables (default).</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets whether successive calls to llPlaySound, llLoopSound, etc., (attached sounds) interrupt the currently playing sound.\nThe default for objects is FALSE. Setting this value to TRUE will make the sound wait until the current playing sound reaches its end. The queue is one level deep.</string>
+ </map>
+ <key>llSetSoundRadius</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Radius</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Maximum distance that sounds can be heard.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Limits radius for audibility of scripted sounds (both attached and triggered) to distance Radius.</string>
+ </map>
+ <key>llSetStatus</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Status</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets object status specified in Status bitmask (e.g. STATUS_PHYSICS|STATUS_PHANTOM) to boolean Value.\nFor a full list of STATUS_* constants, see wiki documentation.</string>
+ </map>
+ <key>llSetText</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Color</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Opacity</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Causes Text to float above the prim, using the specified Color and Opacity.</string>
+ </map>
+ <key>llSetTexture</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.2</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Texture</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Applies Texture to Face of prim.\nTexture may be a UUID or name of a texture in prim inventory.\nIf Face is ALL_SIDES, set the texture on all faces.</string>
+ </map>
+ <key>llSetTextureAnim</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Mode</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Mask of Mode flags.</string>
+ </map>
+ </map>
+ <map>
+ <key>Face</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Face number or ALL_SIDES.</string>
+ </map>
+ </map>
+ <map>
+ <key>SizeX</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Horizontal frames (ignored for ROTATE and SCALE).</string>
+ </map>
+ </map>
+ <map>
+ <key>SizeY</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Vertical frames (ignored for ROTATE and SCALE).</string>
+ </map>
+ </map>
+ <map>
+ <key>Start</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Start position/frame number (or radians for ROTATE).</string>
+ </map>
+ </map>
+ <map>
+ <key>Length</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>number of frames to display (or radians for ROTATE).</string>
+ </map>
+ </map>
+ <map>
+ <key>Rate</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string>Frames per second (must not greater than zero).</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Animates a texture by setting the texture scale and offset.\nMode is a bitmask of animation options.\nFace specifies which object face to animate.\nSizeX and SizeY specify the number of horizontal and vertical frames.Start specifes the animation start point.\nLength specifies the animation duration.\nRate specifies the animation playback rate.</string>
+ </map>
+ <key>llSetTimerEvent</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Rate</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Causes the timer event to be triggered every Rate seconds.\n Passing in 0.0 stops further timer events.</string>
+ </map>
+ <key>llSetTorque</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Torque</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Torque force.</string>
+ </map>
+ </map>
+ <map>
+ <key>Local</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, if TRUE uses local axis, if FALSE uses region axis.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets the Torque acting on the script's object, in object-local coordinates if Local == TRUE (otherwise, the region reference frame is used).\nOnly works on physical objects.</string>
+ </map>
+ <key>llSetTouchText</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Displays Text in the viewer context menu that acts on a touch.</string>
+ </map>
+ <key>llSetVehicleFlags</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Flags</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Enables the vehicle flags specified in the Flags bitmask.\nValid parameters can be found in the wiki documentation.</string>
+ </map>
+ <key>llSetVehicleFloatParam</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ParameterName</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ParameterValue</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets a vehicle float parameter.\nValid parameters can be found in the wiki documentation.</string>
+ </map>
+ <key>llSetVehicleRotationParam</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ParameterName</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ParameterValue</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets a vehicle rotation parameter.\nValid parameters can be found in the wiki documentation.</string>
+ </map>
+ <key>llSetVehicleType</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Type</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Activates the vehicle action on the object with vehicle preset Type.\nValid Types and an explanation of their characteristics can be found in wiki documentation.</string>
+ </map>
+ <key>llSetVehicleVectorParam</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>ParameterName</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>ParameterValue</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Sets a vehicle vector parameter.\nValid parameters can be found in the wiki documentation.</string>
+ </map>
+ <key>llSetVelocity</key>
+ <map>
+ <key>energy</key>
+ <real/>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Velocity</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>The velocity to apply.</string>
+ </map>
+ </map>
+ <map>
+ <key>Local</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>If TRUE, the Velocity is treated as a local directional vector instead of a regional directional vector.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If the object is physics-enabled, sets the object's linear velocity to Velocity.\nIf Local==TRUE, Velocity is treated as a local directional vector; otherwise, Velocity is treated as a global directional vector.</string>
+ </map>
+ <key>llSHA1String</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a string of 40 hex characters that is the SHA1 security Hash of Text.</string>
+ </map>
+ <key>llShout</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Channel</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Shouts Text on Channel.\nThis chat method has a range of 100m radius.\nPUBLIC_CHANNEL is the public chat channel that all avatars see as chat text. DEBUG_CHANNEL is the script debug channel, and is also visible to nearby avatars. All other channels are are not sent to avatars, but may be used to communicate with scripts.</string>
+ </map>
+ <key>llSin</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Theta</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the sine of Theta (Theta in radians).</string>
+ </map>
+ <key>llSitTarget</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Rotation</key>
+ <map>
+ <key>type</key>
+ <string>rotation</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Set the sit location for this object. If offset == ZERO_VECTOR, clears the sit target.</string>
+ </map>
+ <key>llSleep</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Time</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Put script to sleep for Time seconds.</string>
+ </map>
+ <key>llSound</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Volume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Queue</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Loop</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Deprecated: Use llPlaySound instead.\nPlays Sound at Volume and specifies whether the sound should loop and/or be enqueued.</string>
+ </map>
+ <key>llSoundPreload</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Deprecated: Use llPreloadSound instead.\nPreloads a sound on viewers within range.</string>
+ </map>
+ <key>llSqrt</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Value</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the square root of Value.\nTriggers a math runtime error for imaginary results (if Value &lt; 0.0).</string>
+ </map>
+ <key>llStartAnimation</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Animation</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This function plays the specified animation from playing on the avatar who received the script's most recent permissions request.\nAnimation may be an animation in task inventory or a built-in animation.\nRequires PERMISSION_TRIGGER_ANIMATION.</string>
+ </map>
+ <key>llStopAnimation</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Animation</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This function stops the specified animation on the avatar who received the script's most recent permissions request.\nAnimation may be an animation in task inventory, a built-in animation, or the uuid of an animation.\nRequires PERMISSION_TRIGGER_ANIMATION.</string>
+ </map>
+ <key>llStopHover</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Stop hovering to a height (due to llSetHoverHeight()).</string>
+ </map>
+ <key>llStopLookAt</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Stop causing object to point at a target (due to llLookAt() or llRotLookAt()).</string>
+ </map>
+ <key>llStopMoveToTarget</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Stops critically damped motion (due to llMoveToTarget()).</string>
+ </map>
+ <key>llStopSound</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Stops playback of the currently attached sound.</string>
+ </map>
+ <key>llStringLength</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns an integer that is the number of characters in Text (not counting the null).</string>
+ </map>
+ <key>llStringToBase64</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the string Base64 representation of the input string.</string>
+ </map>
+ <key>llStringTrim</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>String to trim</string>
+ </map>
+ </map>
+ <map>
+ <key>TrimType</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>STRING_TRIM_HEAD, STRING_TRIM_TAIL, or STRING_TRIM.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Outputs a string, eliminating white-space from the start and/or end of the input string Text.\nValid options for TrimType:\nSTRING_TRIM_HEAD: trim all leading spaces in Text\nSTRING_TRIM_TAIL: trim all trailing spaces in Text\nSTRING_TRIM: trim all leading and trailing spaces in Text.</string>
+ </map>
+ <key>llSubStringIndex</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Sequence</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns an integer that is the index in Text where string pattern Sequence first appears. Returns -1 if not found.</string>
+ </map>
+ <key>llTakeCamera</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Deprecated: Use llSetCameraParams instead.</string>
+ </map>
+ <key>llTakeControls</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Controls</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Bit-field of CONTROL_* flags.</string>
+ </map>
+ </map>
+ <map>
+ <key>Accept</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, determines whether control events are generated.</string>
+ </map>
+ </map>
+ <map>
+ <key>PassOn</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>Boolean, determines whether controls are disabled.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Take controls from the agent the script has permissions for.\nIf (Accept == (Controls &amp; input)), send input to the script. PassOn determines whether Controls also perform their normal functions.\nRequires the PERMISSION_TAKE_CONTROLS permission to run.</string>
+ </map>
+ <key>llTan</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Theta</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the tangent of Theta (Theta in radians).</string>
+ </map>
+ <key>llTarget</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>integer</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Range</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>This function is to have the script know when it has reached a position.\nIt registers a Position with a Range that triggers at_target and not_at_target events continuously until unregistered.</string>
+ </map>
+ <key>llTargetOmega</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Axis</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>SpinRate</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Gain</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Attempt to spin at SpinRate with strength Gain on Axis.\nA spin rate of 0.0 cancels the spin. This function always works in object-local coordinates.</string>
+ </map>
+ <key>llTargetRemove</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Target</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Removes positional target Handle registered with llTarget.</string>
+ </map>
+ <key>llTeleportAgent</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>UUID of avatar.</string>
+ </map>
+ </map>
+ <map>
+ <key>LandmarkName</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string>Name of landmark (in object contents), or empty string, to use.</string>
+ </map>
+ </map>
+ <map>
+ <key>Position</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>If no landmark was provided, the position within the current region to teleport the avatar to.</string>
+ </map>
+ </map>
+ <map>
+ <key>LookAtPoint</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>The position within the target region that the avatar should be turned to face upon arrival.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Requests a teleport of avatar to a landmark stored in the object's inventory. If no landmark is provided (an empty string), the avatar is teleported to the location position in the current region. In either case, the avatar is turned to face the position given by look_at in local coordinates.\nRequires the PERMISSION_TELEPORT permission. This function can only teleport the owner of the object.</string>
+ </map>
+ <key>llTeleportAgentGlobalCoords</key>
+ <map>
+ <key>energy</key>
+ <real>0</real>
+ <key>sleep</key>
+ <real>0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string>UUID of avatar.</string>
+ </map>
+ </map>
+ <map>
+ <key>GlobalPosition</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Global coordinates of the destination region. Can be retrieved by using llRequestSimulatorData(region_name, DATA_SIM_POS).</string>
+ </map>
+ </map>
+ <map>
+ <key>RegionPosition</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>The position within the target region to teleport the avatar to, if no landmark was provided.</string>
+ </map>
+ </map>
+ <map>
+ <key>LookAtPoint</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>The position within the target region that the avatar should be turned to face upon arrival.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Teleports an agent to the RegionPosition local coordinates within a region which is specified by the GlobalPosition global coordinates. The agent lands facing the position defined by LookAtPoint local coordinates.\nRequires the PERMISSION_TELEPORT permission. This function can only teleport the owner of the object.</string>
+ </map>
+ <key>llTeleportAgentHome</key>
+ <map>
+ <key>energy</key>
+ <real>100.0</real>
+ <key>sleep</key>
+ <real>5.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Teleport agent over the owner's land to agent's home location.</string>
+ </map>
+ <key>llTextBox</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>1.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Channel</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Opens a dialog for the specified avatar with message Text, which contains a text box for input. Any text that is entered is said on the specified Channel (as if by the avatar) when the "OK" button is clicked.</string>
+ </map>
+ <key>llToLower</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a string that is Text with all lower-case characters.</string>
+ </map>
+ <key>llToUpper</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns a string that is Text with all upper-case characters.</string>
+ </map>
+ <key>llTransferLindenDollars</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>key</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Amount</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Transfer Amount of linden dollars (L$) from script owner to AvatarID. Returns a key to a corresponding transaction_result event for the success of the transfer.\nAttempts to send the amount of money to the specified avatar, and trigger a transaction_result event identified by the returned key.</string>
+ </map>
+ <key>llTriggerSound</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Volume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Plays Sound at Volume (0.0 - 1.0), centered at but not attached to object.\nThere is no limit to the number of triggered sounds which can be generated by an object, and calling llTriggerSound does not affect the attached sounds created by llPlaySound and llLoopSound. This is very useful for things like collision noises, explosions, etc. There is no way to stop or alter the volume of a sound triggered by this function.</string>
+ </map>
+ <key>llTriggerSoundLimited</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Sound</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Volume</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>TNE</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>BSW</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Plays Sound at Volume (0.0 - 1.0), centered at but not attached to object, limited to axis-aligned bounding box defined by vectors top-north-east (TNE) and bottom-south-west (BSW).\nThere is no limit to the number of triggered sounds which can be generated by an object, and calling llTriggerSound does not affect the attached sounds created by llPlaySound and llLoopSound. This is very useful for things like collision noises, explosions, etc. There is no way to stop or alter the volume of a sound triggered by this function.</string>
+ </map>
+ <key>llUnescapeURL</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>URL</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the string that is the URL unescaped, replacing "%20" with spaces, etc., version of URL.\nThis function can output raw UTF-8 strings.</string>
+ </map>
+ <key>llUnSit</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>AvatarID</key>
+ <map>
+ <key>type</key>
+ <string>key</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If agent identified by AvatarID is sitting on the object the script is attached to or is over land owned by the objects owner, the agent is forced to stand up.</string>
+ </map>
+ <key>llUpdateCharacter</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>Character configuration options. Takes the same constants as llCreateCharacter().</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Updates settings for a pathfinding character.</string>
+ </map>
+ <key>llVecDist</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Location1</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Location2</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the distance between Location1 and Location2.</string>
+ </map>
+ <key>llVecMag</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Vector</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the magnitude of the vector.</string>
+ </map>
+ <key>llVecNorm</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Vector</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns normalized vector.</string>
+ </map>
+ <key>llVolumeDetect</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>DetectEnabled</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string>TRUE enables, FALSE disables.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>If DetectEnabled = TRUE, object becomes phantom but triggers collision_start and collision_end events when other objects start and stop interpenetrating.\nIf another object (including avatars) interpenetrates it, it will get a collision_start event.\nWhen an object stops interpenetrating, a collision_end event is generated. While the other is inter-penetrating, collision events are NOT generated.</string>
+ </map>
+ <key>llWanderWithin</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Origin</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Central point to wander about.</string>
+ </map>
+ </map>
+ <map>
+ <key>Area</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string>Half-extents of an area the character may wander within. (i.e., it can wander from the specified origin by up to +/-Distance.x in x, +/-Distance.y in y, etc.)</string>
+ </map>
+ </map>
+ <map>
+ <key>Options</key>
+ <map>
+ <key>type</key>
+ <string>list</string>
+ <key>tooltip</key>
+ <string>No options available at this time.</string>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Wander within a specified volume.\nSets a character to wander about a central spot within a specified area.</string>
+ </map>
+ <key>llWater</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the water height below the object position + Offset.</string>
+ </map>
+ <key>llWhisper</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>void</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Channel</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Whispers Text on Channel.\nThis chat method has a range of 10m radius.\nPUBLIC_CHANNEL is the public chat channel that all avatars see as chat text. DEBUG_CHANNEL is the script debug channel, and is also visible to nearby avatars. All other channels are are not sent to avatars, but may be used to communicate with scripts.</string>
+ </map>
+ <key>llWind</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>vector</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Offset</key>
+ <map>
+ <key>type</key>
+ <string>vector</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Returns the wind velocity at the object position + Offset.</string>
+ </map>
+ <key>llXorBase64</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text1</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text2</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Performs an exclusive OR on two Base64 strings and returns a Base64 string. Text2 repeats if it is shorter than Text1.</string>
+ </map>
+ <key>llXorBase64Strings</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.3</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text1</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text2</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Deprecated: Please use llXorBase64 instead.\nIncorrectly performs an exclusive OR on two Base64 strings and returns a Base64 string. Text2 repeats if it is shorter than Text1.\nRetained for backwards compatibility.</string>
+ </map>
+ <key>llXorBase64StringsCorrect</key>
+ <map>
+ <key>deprecated</key>
+ <boolean>true</boolean>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>string</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Text1</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ <map>
+ <key>Text2</key>
+ <map>
+ <key>type</key>
+ <string>string</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Deprecated: Please use llXorBase64 instead.\nCorrectly (unless nulls are present) performs an exclusive OR on two Base64 strings and returns a Base64 string.\nText2 repeats if it is shorter than Text1.</string>
+ </map>
+ <key>llGetMinScaleFactor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the smallest multiplicative uniform scale factor that can be successfully applied (via llScaleByFactor()) to the object without violating prim size or linkability rules.</string>
+ </map>
+ <key>llGetMaxScaleFactor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <undef/>
+ <key>tooltip</key>
+ <string>Returns the largest multiplicative uniform scale factor that can be successfully applied (via llScaleByFactor()) to the object without violating prim size or linkability rules.</string>
+ </map>
+ <key>llScaleByFactor</key>
+ <map>
+ <key>energy</key>
+ <real>10.0</real>
+ <key>sleep</key>
+ <real>0.0</real>
+ <key>return</key>
+ <string>float</string>
+ <key>arguments</key>
+ <array>
+ <map>
+ <key>Factor</key>
+ <map>
+ <key>type</key>
+ <string>float</string>
+ <key>tooltip</key>
+ <string/>
+ </map>
+ </map>
+ </array>
+ <key>tooltip</key>
+ <string>Tries to uniformly scale the object by a multiplicative factor. Returns TRUE on success or FALSE on failure.</string>
+ </map>
+ </map>
+ <key>llsd-lsl-syntax-version</key>
+ <integer>2</integer>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/llsd-lsl-syntax.rng b/indra/newview/app_settings/llsd-lsl-syntax.rng
new file mode 100755
index 0000000000..aa92364ec1
--- /dev/null
+++ b/indra/newview/app_settings/llsd-lsl-syntax.rng
@@ -0,0 +1,390 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar
+ xmlns="http://relaxng.org/ns/structure/1.0"
+ xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+ <start>
+ <element name="llsd">
+ <element name="map">
+ <group>
+ <element name="key">
+ <value>constants</value>
+ </element>
+ <element name="map">
+ <oneOrMore>
+ <group>
+ <ref name="keyString"/>
+ <element name="map">
+ <ref name="Deprecated" />
+ <ref name="constantTypeValue" />
+ <ref name="Tooltip" />
+ </element>
+ </group>
+ </oneOrMore>
+ </element>
+ </group>
+
+ <group>
+ <element name="key">
+ <value>controls</value>
+ </element>
+ <element name="map">
+ <oneOrMore>
+ <group>
+ <ref name="keyString"/>
+ <ref name="mapTooltip"/>
+ </group>
+ </oneOrMore>
+ </element>
+ </group>
+
+ <group>
+ <element name="key">
+ <value>events</value>
+ </element>
+ <element name="map">
+ <oneOrMore>
+ <group>
+ <ref name="keyString"/>
+ <element name="map">
+ <ref name="Deprecated" />
+ <ref name="Arguments"/>
+ <ref name="Tooltip"/>
+ </element>
+ </group>
+ </oneOrMore>
+ </element>
+ </group>
+
+ <group>
+ <element name="key">
+ <value>functions</value>
+ </element>
+ <element name="map">
+ <oneOrMore>
+ <group>
+ <ref name="keyString"/>
+ <element name="map">
+ <ref name="Arguments"/>
+ <ref name="Deprecated" />
+ <element name="key">
+ <value>energy</value>
+ </element>
+ <ref name="float"/>
+ <optional>
+ <group>
+ <element name="key">
+ <value>god-mode</value>
+ </element>
+ <element name="boolean">
+ <data type="boolean"/>
+ </element>
+ </group>
+ </optional>
+ <ref name="Return"/>
+ <element name="key">
+ <value>sleep</value>
+ </element>
+ <ref name="float"/>
+ <ref name="Tooltip"/>
+ </element>
+ </group>
+ </oneOrMore>
+ </element>
+ </group>
+
+ <group>
+ <element name="key">
+ <value>llsd-lsl-syntax-version</value>
+ </element>
+ <element name="integer">
+ <data type="integer" />
+ </element>
+ </group>
+
+ <group>
+ <element name="key">
+ <value>types</value>
+ </element>
+ <element name="map">
+ <oneOrMore>
+ <group>
+ <ref name="keyString"/>
+ <ref name="mapTooltip"/>
+ </group>
+ </oneOrMore>
+ </element>
+ </group>
+ </element>
+ </element>
+ </start>
+
+ <define name="Deprecated">
+ <optional>
+ <group>
+ <element name="key">
+ <value>deprecated</value>
+ </element>
+ <element name="boolean">
+ <data type="boolean"/>
+ </element>
+ </group>
+ </optional>
+ </define>
+
+ <define name="keyName">
+ <element name="key"><value>name</value></element>
+ <element name="string"><data type="string" /></element>
+ </define>
+
+
+ <define name="keyString">
+ <element name="key"><data type="string"/></element>
+ </define>
+
+ <define name="keyType">
+ <element name="key"><value>type</value></element>
+ </define>
+
+ <define name="typeList">
+ <ref name="keyType" />
+ <element name="string">
+ <choice>
+ <value>float</value>
+ <value>integer</value>
+ <value>key</value>
+ <value>list</value>
+ <value>rotation</value>
+ <value>string</value>
+ <value>vector</value>
+ </choice>
+ </element>
+ </define>
+
+ <define name="keyValue">
+ <element name="key"><value>value</value></element>
+ </define>
+
+ <define name="constantTypeValue">
+ <choice>
+ <group>
+ <ref name="keyType"/>
+ <element name="string"><value>float</value></element>
+ <ref name="keyValue"/>
+ <element name="real"><data type="float"/></element>
+ </group>
+ <group>
+ <ref name="keyType"/>
+ <element name="string"><value>integer</value></element>
+ <ref name="keyValue"/>
+ <choice>
+ <element name="integer"><data type="integer"/></element>
+ <element name="integer"><data type="string"><param name="pattern">0x[0-9A-Fa-f]+</param></data></element>
+ </choice>
+ </group>
+ <group>
+ <ref name="keyType"/>
+ <element name="string"><value>key</value></element>
+ <ref name="keyValue"/>
+ <element name="uuid"><data type="string"><param name="pattern">[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}</param></data></element>
+ </group>
+ <group>
+ <ref name="keyType"/>
+ <element name="string"><value>rotation</value></element>
+ <ref name="keyValue"/>
+ <element name="array">
+ <element name="map">
+ <element name="key">
+ <value>x</value>
+ </element>
+ <ref name="realFromMinusOneToOne"/>
+ </element>
+ <element name="map">
+ <element name="key">
+ <value>y</value>
+ </element>
+ <ref name="realFromMinusOneToOne"/>
+ </element>
+ <element name="map">
+ <element name="key">
+ <value>z</value>
+ </element>
+ <ref name="realFromMinusOneToOne"/>
+ </element>
+ <element name="map">
+ <element name="key"><value>w</value></element>
+ <ref name="realFromMinusOneToOne"/>
+ </element>
+ </element>
+ </group>
+ <group>
+ <ref name="keyType"/>
+ <element name="string"><value>string</value></element>
+ <ref name="keyValue"/>
+ <element name="string">
+ <data type="string"/>
+ </element>
+ </group>
+ <group>
+ <ref name="keyType"/>
+ <element name="string">
+ <value>vector</value>
+ </element>
+ <ref name="keyValue"/>
+ <element name="array">
+ <ref name="vector"/>
+ </element>
+ </group>
+ </choice>
+ </define>
+
+ <define name="nameType">
+ <ref name="keyName" />
+ <ref name="keyType" />
+ </define>
+
+ <define name="realFromMinusOneToOne">
+ <element name="real">
+ <data type="float">
+ <param name="pattern">([\-+]|)(1|0)\.\d+</param>
+ </data>
+ </element>
+ </define>
+
+ <define name="float">
+ <choice>
+ <element name="real">
+ <data type="float"/>
+ </element>
+ <element name="real">
+ <empty/>
+ </element>
+ </choice>
+ </define>
+
+ <define name="vector">
+ <element name="map">
+ <element name="key">
+ <value>x</value>
+ </element>
+ <ref name="realFromMinusOneToOne"/>
+ </element>
+ <element name="map">
+ <element name="key">
+ <value>y</value>
+ </element>
+ <ref name="realFromMinusOneToOne"/>
+ </element>
+ <element name="map">
+ <element name="key">
+ <value>z</value>
+ </element>
+ <ref name="realFromMinusOneToOne"/>
+ </element>
+ </define>
+
+ <define name="mapTooltip">
+ <element name="map">
+ <ref name="Tooltip" />
+ </element>
+ </define>
+
+ <define name="Tooltip">
+ <element name="key">
+ <value>tooltip</value>
+ </element>
+ <element name="string">
+ <data type="string" />
+ </element>
+ </define>
+
+ <define name="Arguments">
+ <element name="key"><value>arguments</value></element>
+ <choice>
+ <element name="array">
+ <oneOrMore>
+ <element name="map">
+ <element name="key"><data type="string"><param name="pattern">[A-Z][A-Za-z0-9_]*|[a-z]</param></data></element>
+ <element name="map">
+ <!--ref name="keyName" /-->
+ <ref name="Tooltip" />
+ <ref name="typeList" />
+ </element>
+ </element>
+ </oneOrMore>
+ <!--choice>
+ <oneOrMore>
+ <element name="map">
+ <ref name="Argument"/>
+ </element>
+ </oneOrMore>
+ <element name="undef">
+ <empty/>
+ </element>
+ </choice-->
+ </element>
+ <element name="undef"><empty/></element>
+ </choice>
+ </define>
+
+ <define name="Argument">
+ <ref name="keyType"/>
+ <choice>
+ <element name="string">
+ <value>float</value>
+ </element>
+ <element name="string">
+ <value>integer</value>
+ </element>
+ <element name="string">
+ <value>key</value>
+ </element>
+ <element name="string">
+ <value>list</value>
+ </element>
+ <element name="string">
+ <value>rotation</value>
+ </element>
+ <element name="string">
+ <value>string</value>
+ </element>
+ <element name="string">
+ <value>vector</value>
+ </element>
+ </choice>
+ <ref name="Tooltip"/>
+ </define>
+
+ <define name="Return">
+ <element name="key">
+ <value>return</value>
+ </element>
+ <choice>
+ <element name="string">
+ <value>float</value>
+ </element>
+ <element name="string">
+ <value>integer</value>
+ </element>
+ <element name="string">
+ <value>key</value>
+ </element>
+ <element name="string">
+ <value>list</value>
+ </element>
+ <element name="string">
+ <value>rotation</value>
+ </element>
+ <element name="string">
+ <value>string</value>
+ </element>
+ <element name="string">
+ <value>vector</value>
+ </element>
+ <element name="string">
+ <value>void</value>
+ </element>
+ </choice>
+ </define>
+
+</grammar> \ No newline at end of file
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 4175aac89a..410473c54f 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3554,17 +3554,6 @@
<key>Value</key>
<string>http://events.secondlife.com/viewer/embed/event/</string>
</map>
- <key>EveryoneCopy</key>
- <map>
- <key>Comment</key>
- <string>Everyone can copy the newly created objects</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>FastCacheFetchEnabled</key>
<map>
<key>Comment</key>
@@ -6140,16 +6129,16 @@
<integer>0</integer>
</map>
<key>MemoryLogFrequency</key>
- <map>
- <key>Comment</key>
- <string>Seconds between display of Memory in log (0 for never)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>600.0</real>
- </map>
+ <map>
+ <key>Comment</key>
+ <string>Seconds between display of Memory in log (0 for never)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>30.0</real>
+ </map>
<key>MemoryPrivatePoolEnabled</key>
<map>
<key>Comment</key>
@@ -6491,39 +6480,6 @@
<key>Value</key>
<real>2.0</real>
</map>
- <key>NextOwnerCopy</key>
- <map>
- <key>Comment</key>
- <string>Newly created objects can be copied by next owner</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>NextOwnerModify</key>
- <map>
- <key>Comment</key>
- <string>Newly created objects can be modified by next owner</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>NextOwnerTransfer</key>
- <map>
- <key>Comment</key>
- <string>Newly created objects can be resold or given away by next owner</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>NewCacheLocation</key>
<map>
<key>Comment</key>
@@ -8078,6 +8034,18 @@
<integer>128</integer>
</map>
+ <key>OctreeMinimumNodeSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Minimum size of any octree node</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.01</real>
+ </map>
+
<key>OctreeStaticObjectSizeFactor</key>
<map>
<key>Comment</key>
@@ -9004,7 +8972,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>384</real>
+ <real>368.0</real>
</map>
<key>RenderDeferred</key>
@@ -10527,17 +10495,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShareWithGroup</key>
- <map>
- <key>Comment</key>
- <string>Newly created objects are shared with the currently active group</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>ShowAdvancedGraphicsSettings</key>
<map>
<key>Comment</key>
@@ -14756,6 +14713,347 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ObjectsNextOwnerCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created objects can be copied by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ObjectsNextOwnerModify</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created objects can be modified by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ObjectsNextOwnerTransfer</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created objects can be resold or given away by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ObjectsEveryoneCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Everyone can copy the newly created object</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ObjectsShareWithGroup</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created objects are shared with the currently active group</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UploadsNextOwnerCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly uploaded items can be copied by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UploadsNextOwnerModify</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly uploaded items can be modified by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UploadsNextOwnerTransfer</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly uploaded items can be resold or given away by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>UploadsEveryoneCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Everyone can copy the newly uploaded item</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UploadsShareWithGroup</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly uploaded items are shared with the currently active group</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ScriptsNextOwnerCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created scripts can be copied by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ScriptsNextOwnerModify</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created scripts can be modified by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ScriptsNextOwnerTransfer</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created scripts can be resold or given away by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ScriptsEveryoneCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Everyone can copy the newly created script</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ScriptsShareWithGroup</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created scripts are shared with the currently active group</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NotecardsNextOwnerCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created notecards can be copied by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>NotecardsNextOwnerModify</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created notecards can be modified by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>NotecardsNextOwnerTransfer</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created notecards can be resold or given away by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>NotecardsEveryoneCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Everyone can copy the newly created notecard</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NotecardsShareWithGroup</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created notecards are shared with the currently active group</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>GesturesNextOwnerCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created gestures can be copied by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>GesturesNextOwnerModify</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created gestures can be modified by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>GesturesNextOwnerTransfer</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created gestures can be resold or given away by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>GesturesEveryoneCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Everyone can copy the newly created gesture</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>GesturesShareWithGroup</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created gestures are shared with the currently active group</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>WearablesNextOwnerCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created clothing or body part can be copied by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>WearablesNextOwnerModify</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created clothing or body part can be modified by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>WearablesNextOwnerTransfer</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created clothing or body part can be resold or given away by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WearablesEveryoneCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Everyone can copy the newly created clothing or body part</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>WearablesShareWithGroup</key>
+ <map>
+ <key>Comment</key>
+ <string>Newly created clothing or body part is shared with the currently active group</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DefaultUploadPermissionsConverted</key>
+ <map>
+ <key>Comment</key>
+ <string>Default upload permissions have been converted to default creation permissions</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>PathfindingRetrieveNeighboringRegion</key>
<map>
<key>Comment</key>
@@ -15142,6 +15440,17 @@
<key>Value</key>
<integer>7000</integer>
</map>
+ <key>DisablePrecacheDelayAfterTeleporting</key>
+ <map>
+ <key>Comment</key>
+ <string>Disables the artificial delay in the viewer that precaches some incoming assets</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>VersionChannelName</key>
<map>
<key>Comment</key>
@@ -15153,6 +15462,62 @@
<key>Value</key>
<string />
</map>
+ <key>EveryoneCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>(obsolete) Everyone can copy the newly created objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NextOwnerCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>(obsolete) Newly created objects can be copied by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NextOwnerModify</key>
+ <map>
+ <key>Comment</key>
+ <string>(obsolete) Newly created objects can be modified by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NextOwnerTransfer</key>
+ <map>
+ <key>Comment</key>
+ <string>(obsolete) Newly created objects can be resold or given away by next owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShareWithGroup</key>
+ <map>
+ <key>Comment</key>
+ <string>(obsolete) Newly created objects are shared with the currently active group</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
</map>
</llsd>
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index a2d68eb550..628a96e988 100755
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 36
+version 37
// The version number above should be implemented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
@@ -60,7 +60,7 @@ WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
-RenderTextureMemoryMultiple 1 0.5
+RenderTextureMemoryMultiple 1 1
RenderCompressTextures 1 1
RenderShaderLightingMaxLevel 1 3
RenderDeferred 1 1
@@ -522,7 +522,7 @@ list ATI_Mobility_Radeon_9600
Disregard96DefaultDrawDistance 1 0
list NVIDIA_GeForce_8600
-RenderTextureMemoryMultiple 1 0.375
+RenderTextureMemoryMultiple 1 1
RenderUseImpostors 0 0
UseOcclusion 0 0
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index ad5ab22640..65581a6781 100755
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -117,11 +117,14 @@ Var DO_UNINSTALL_V2 ; If non-null, path to a previous Viewer 2 installation
!include "FileFunc.nsh" ; For GetParameters, GetOptions
!insertmacro GetParameters
!insertmacro GetOptions
+!include WinVer.nsh ; For OS and SP detection
+!include x64.nsh ; For 64bit OS detection
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; After install completes, launch app
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function .onInstSuccess
+Call CheckWindowsServPack ; Warn if not on the latest SP before asking to launch.
Push $R0 # Option value, unused
StrCmp $SKIP_AUTORUN "true" +2;
# Assumes SetOutPath $INSTDIR
@@ -138,26 +141,67 @@ Function dirPre
FunctionEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Make sure we're not on Windows 98 / ME
+; Make sure this computer meets the minimum system requirements.
+; Currently: Windows 32bit XP SP3, 64bit XP SP2 and Server 2003 SP2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function CheckWindowsVersion
- DetailPrint "Checking Windows version..."
- Call GetWindowsVersion
- Pop $R0
- ; Just get first two characters, ignore 4.0 part of "NT 4.0"
- StrCpy $R0 $R0 2
- ; Blacklist certain OS versions
- StrCmp $R0 "95" win_ver_bad
- StrCmp $R0 "98" win_ver_bad
- StrCmp $R0 "ME" win_ver_bad
- StrCmp $R0 "NT" win_ver_bad
- Return
-win_ver_bad:
- StrCmp $SKIP_DIALOGS "true" +2 ; If skip_dialogs is set just install
- MessageBox MB_YESNO $(CheckWindowsVersionMB) IDNO win_ver_abort
- Return
-win_ver_abort:
- Quit
+ ${If} ${AtMostWin2000}
+ MessageBox MB_OK $(CheckWindowsVersionMB)
+ Quit
+ ${EndIf}
+
+ ${If} ${IsWinXP}
+ ${AndIfNot} ${RunningX64}
+ ${AndIfNot} ${IsServicePack} 3
+ MessageBox MB_OK $(CheckWindowsVersionMB)
+ Quit
+ ${EndIf}
+
+ ${If} ${IsWinXP}
+ ${AndIf} ${RunningX64}
+ ${AndIfNot} ${IsServicePack} 2
+ MessageBox MB_OK $(CheckWindowsVersionMB)
+ Quit
+ ${EndIf}
+
+ ${If} ${IsWin2003}
+ ${AndIfNot} ${IsServicePack} 2
+ MessageBox MB_OK $(CheckWindowsVersionMB)
+ Quit
+ ${EndIf}
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;Recommend Upgrading Service Pack
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckWindowsServPack
+ ${If} ${IsWinVista}
+ ${AndIfNot} ${IsServicePack} 2
+ MessageBox MB_OK $(CheckWindowsServPackMB)
+ DetailPrint $(UseLatestServPackDP)
+ Return
+ ${EndIf}
+
+ ${If} ${IsWin2008}
+ ${AndIfNot} ${IsServicePack} 2
+ MessageBox MB_OK $(CheckWindowsServPackMB)
+ DetailPrint $(UseLatestServPackDP)
+ Return
+ ${EndIf}
+
+ ${If} ${IsWin7}
+ ${AndIfNot} ${IsServicePack} 1
+ MessageBox MB_OK $(CheckWindowsServPackMB)
+ DetailPrint $(UseLatestServPackDP)
+ Return
+ ${EndIf}
+
+ ${If} ${IsWin2008R2}
+ ${AndIfNot} ${IsServicePack} 1
+ MessageBox MB_OK $(CheckWindowsServPackMB)
+ DetailPrint $(UseLatestServPackDP)
+ Return
+ ${EndIf}
FunctionEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -208,17 +252,13 @@ FunctionEnd
; Checks for CPU valid (must have SSE2 support)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function CheckCPUFlags
- Call GetWindowsVersion
- Pop $R0
- StrCmp $R0 "2000" OK_SSE ; sse check not available on win2k.
-
Push $1
System::Call 'kernel32::IsProcessorFeaturePresent(i) i(10) .r1'
- IntCmp $1 1 OK_SSE
- MessageBox MB_OKCANCEL $(MissingSSE2) /SD IDOK IDOK OK_SSE
+ IntCmp $1 1 OK_SSE2
+ MessageBox MB_OKCANCEL $(MissingSSE2) /SD IDOK IDOK OK_SSE2
Quit
- OK_SSE:
+ OK_SSE2:
Pop $1
Return
FunctionEnd
@@ -754,103 +794,13 @@ Call un.ProgramFiles
SectionEnd ; end of uninstall section
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; (From the NSIS documentation, JC)
-; GetWindowsVersion
-;
-; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
-; Updated by Joost Verburg
-;
-; Returns on top of stack
-;
-; Windows Version (95, 98, ME, NT x.x, 2000, XP, 2003)
-; or
-; '' (Unknown Windows Version)
-;
-; Usage:
-; Call GetWindowsVersion
-; Pop $R0
-; ; at this point $R0 is "NT 4.0" or whatnot
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function GetWindowsVersion
-
- Push $R0
- Push $R1
-
- ReadRegStr $R0 HKLM \
- "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
-
- IfErrors 0 lbl_winnt
-
- ; we are not NT
- ReadRegStr $R0 HKLM \
- "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber
-
- StrCpy $R1 $R0 1
- StrCmp $R1 '4' 0 lbl_error
-
- StrCpy $R1 $R0 3
-
- StrCmp $R1 '4.0' lbl_win32_95
- StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98
-
- lbl_win32_95:
- StrCpy $R0 '95'
- Goto lbl_done
-
- lbl_win32_98:
- StrCpy $R0 '98'
- Goto lbl_done
-
- lbl_win32_ME:
- StrCpy $R0 'ME'
- Goto lbl_done
-
- lbl_winnt:
-
- StrCpy $R1 $R0 1
-
- StrCmp $R1 '3' lbl_winnt_x
- StrCmp $R1 '4' lbl_winnt_x
-
- StrCpy $R1 $R0 3
-
- StrCmp $R1 '5.0' lbl_winnt_2000
- StrCmp $R1 '5.1' lbl_winnt_XP
- StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error
-
- lbl_winnt_x:
- StrCpy $R0 "NT $R0" 6
- Goto lbl_done
-
- lbl_winnt_2000:
- Strcpy $R0 '2000'
- Goto lbl_done
-
- lbl_winnt_XP:
- Strcpy $R0 'XP'
- Goto lbl_done
-
- lbl_winnt_2003:
- Strcpy $R0 '2003'
- Goto lbl_done
-
- lbl_error:
- Strcpy $R0 ''
- lbl_done:
-
- Pop $R1
- Exch $R0
-
-FunctionEnd
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Note: to add new languages, add a language file include to the list
;; at the top of this file, add an entry to the menu and then add an
;; entry to the language ID selector below
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function .onInit
+Call CheckWindowsVersion ; Don't install On unsupported systems
Push $0
${GetParameters} $COMMANDLINE ; get our command line
@@ -924,13 +874,12 @@ StrCpy $INSTPROG "${INSTNAME}"
StrCpy $INSTEXE "${INSTEXE}"
StrCpy $INSTSHORTCUT "${SHORTCUT}"
-Call CheckWindowsVersion ; warn if on Windows 98/ME
-Call CheckCPUFlags ; Make sure we have SSE2 support
+Call CheckCPUFlags ; Make sure we have SSE2 support
Call CheckIfAdministrator ; Make sure the user can install/uninstall
Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version
Call CloseSecondLife ; Make sure we're not running
Call CheckNetworkConnection ; ping secondlife.com
-Call CheckWillUninstallV2 ; See if a V2 install exists and will be removed.
+Call CheckWillUninstallV2 ; See if a V2 install exists and will be removed.
Call CheckOldExeName ; Clean up a previous version of the exe
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/indra/newview/installers/windows/lang_da.nsi b/indra/newview/installers/windows/lang_da.nsi
index 0c832e8ba9..2352649b4b 100755
--- a/indra/newview/installers/windows/lang_da.nsi
+++ b/indra/newview/installers/windows/lang_da.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi
index b717a4d3a5..397262afe1 100755
--- a/indra/newview/installers/windows/lang_de.nsi
+++ b/indra/newview/installers/windows/lang_de.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi
index da0d7f54d2..df0d55d9e0 100755
--- a/indra/newview/installers/windows/lang_en-us.nsi
+++ b/indra/newview/installers/windows/lang_en-us.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_es.nsi b/indra/newview/installers/windows/lang_es.nsi
index c6a7f38f3f..32967a0dfa 100755
--- a/indra/newview/installers/windows/lang_es.nsi
+++ b/indra/newview/installers/windows/lang_es.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_fr.nsi b/indra/newview/installers/windows/lang_fr.nsi
index 008c240ed7..7c75e25360 100755
--- a/indra/newview/installers/windows/lang_fr.nsi
+++ b/indra/newview/installers/windows/lang_fr.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_it.nsi b/indra/newview/installers/windows/lang_it.nsi
index eccd965a92..ce66b61f9f 100755
--- a/indra/newview/installers/windows/lang_it.nsi
+++ b/indra/newview/installers/windows/lang_it.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi
index f564291f7d..e68830123a 100755
--- a/indra/newview/installers/windows/lang_ja.nsi
+++ b/indra/newview/installers/windows/lang_ja.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_pl.nsi b/indra/newview/installers/windows/lang_pl.nsi
index 191bae4755..7883819190 100755
--- a/indra/newview/installers/windows/lang_pl.nsi
+++ b/indra/newview/installers/windows/lang_pl.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_pt-br.nsi b/indra/newview/installers/windows/lang_pt-br.nsi
index da56a3c336..eb3fb2386c 100755
--- a/indra/newview/installers/windows/lang_pt-br.nsi
+++ b/indra/newview/installers/windows/lang_pt-br.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_ru.nsi b/indra/newview/installers/windows/lang_ru.nsi
index de7affe08a..3b0042fbf5 100755
--- a/indra/newview/installers/windows/lang_ru.nsi
+++ b/indra/newview/installers/windows/lang_ru.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_tr.nsi b/indra/newview/installers/windows/lang_tr.nsi
index 5e7e3d797b..b9be1eab08 100755
--- a/indra/newview/installers/windows/lang_tr.nsi
+++ b/indra/newview/installers/windows/lang_tr.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi
index ecf1185fbb..3c6f6fd289 100755
--- a/indra/newview/installers/windows/lang_zh.nsi
+++ b/indra/newview/installers/windows/lang_zh.nsi
Binary files differ
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index aa8e0bad76..bd6025feea 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -47,6 +47,7 @@
#include "llfirstuse.h"
#include "llfloatercamera.h"
#include "llfloaterimcontainer.h"
+#include "llfloaterperms.h"
#include "llfloaterreg.h"
#include "llfloatertools.h"
#include "llgroupactions.h"
@@ -826,12 +827,9 @@ boost::signals2::connection LLAgent::addParcelChangedCallback(parcel_changed_cal
//-----------------------------------------------------------------------------
void LLAgent::setRegion(LLViewerRegion *regionp)
{
- bool notifyRegionChange;
-
llassert(regionp);
if (mRegionp != regionp)
{
- notifyRegionChange = true;
std::string ip = regionp->getHost().getString();
LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName()
@@ -884,10 +882,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
// Pass new region along to metrics components that care about this level of detail.
LLAppViewer::metricsUpdateRegion(regionp->getHandle());
}
- else
- {
- notifyRegionChange = false;
- }
+
mRegionp = regionp;
// TODO - most of what follows probably should be moved into callbacks
@@ -910,11 +905,8 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
LLFloaterMove::sUpdateFlyingStatus();
- if (notifyRegionChange)
- {
- LL_DEBUGS("AgentLocation") << "Calling RegionChanged callbacks" << LL_ENDL;
- mRegionChangedSignal();
- }
+ LL_DEBUGS("AgentLocation") << "Calling RegionChanged callbacks" << LL_ENDL;
+ mRegionChangedSignal();
}
@@ -1429,6 +1421,7 @@ void LLAgent::setDoNotDisturb(bool pIsDoNotDisturb)
{
LLDoNotDisturbNotificationStorage::getInstance()->updateNotifications();
}
+ gIMMgr->updateDNDMessageStatus();
}
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index d1dfbe3315..7b0496ea45 100755
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -913,6 +913,8 @@ void LLAgentCamera::cameraZoomIn(const F32 fraction)
F32 max_distance = llmin(mDrawDistance - DIST_FUDGE,
LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
+ max_distance = llmin(max_distance, current_distance * 4.f); //Scaled max relative to current distance. MAINT-3154
+
if (new_distance > max_distance)
{
new_distance = max_distance;
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 26626ad894..890fc9a8d9 100755
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -49,6 +49,7 @@
#include "llvoavatarself.h"
#include "llviewerwearable.h"
#include "llwearablelist.h"
+#include "llfloaterperms.h"
#include <boost/scoped_ptr.hpp>
@@ -65,6 +66,19 @@ void wear_and_edit_cb(const LLUUID& inv_item)
{
if (inv_item.isNull()) return;
+ LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+ if (!item) return;
+
+ LLPermissions perm = item->getPermissions();
+ perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables"));
+ perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables"));
+ perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables"));
+ item->setPermissions(perm);
+
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
+
// Request editing the item after it gets worn.
gAgentWearables.requestEditingWearable(inv_item);
@@ -72,6 +86,26 @@ void wear_and_edit_cb(const LLUUID& inv_item)
LLAppearanceMgr::instance().wearItemOnAvatar(inv_item,true);
}
+void wear_cb(const LLUUID& inv_item)
+{
+ if (!inv_item.isNull())
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+ if (item)
+ {
+ LLPermissions perm = item->getPermissions();
+ perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables"));
+ perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables"));
+ perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables"));
+ item->setPermissions(perm);
+
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
+ }
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////
// HACK: For EXT-3923: Pants item shows in inventory with skin icon and messes with "current look"
@@ -183,7 +217,7 @@ void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar)
*
* Would like to pass the agent in here, but we can't safely
* count on it being around later. Just use gAgent directly.
- * @param cb callback to execute on completion (??? unused ???)
+ * @param cb callback to execute on completion (? unused ?)
* @param type Type for the wearable in the agent
* @param wearable The wearable data.
* @param todo Bitmask of actions to take on completion.
@@ -355,6 +389,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type,
LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(
old_wearable,
trunc_name);
+
LLPointer<LLInventoryCallback> cb =
new AddWearableToAgentInventoryCallback(
LLPointer<LLRefCount>(NULL),
@@ -1465,7 +1500,16 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con
LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp);
LLAssetType::EType asset_type = wearable->getAssetType();
LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE;
- LLPointer<LLInventoryCallback> cb = wear ? new LLBoostFuncInventoryCallback(wear_and_edit_cb) : NULL;
+ LLPointer<LLInventoryCallback> cb;
+ if(wear)
+ {
+ cb = new LLBoostFuncInventoryCallback(wear_and_edit_cb);
+ }
+ else
+ {
+ cb = new LLBoostFuncInventoryCallback(wear_cb);
+ }
+
LLUUID folder_id;
if (parent_id.notNull())
@@ -1478,10 +1522,15 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con
folder_id = gInventory.findCategoryUUIDForType(folder_type);
}
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
- folder_id, wearable->getTransactionID(), wearable->getName(),
- wearable->getDescription(), asset_type, inv_type, wearable->getType(),
- wearable->getPermissions().getMaskNextOwner(),
+ create_inventory_item(gAgent.getID(),
+ gAgent.getSessionID(),
+ folder_id,
+ wearable->getTransactionID(),
+ wearable->getName(),
+ wearable->getDescription(),
+ asset_type, inv_type,
+ wearable->getType(),
+ LLFloaterPerms::getNextOwnerPerms("Wearables"),
cb);
}
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index a4c430bada..9451a30341 100755
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1341,15 +1341,15 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear,
LLNotificationsUtil::add("CannotWearTrash");
return false;
}
- else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), LLAppearanceMgr::instance().getCOF())) // EXT-84911
+ else if (isLinkedInCOF(item_to_wear->getUUID())) // EXT-84911
{
return false;
}
switch (item_to_wear->getType())
{
- case LLAssetType::AT_CLOTHING:
- if (gAgentWearables.areWearablesLoaded())
+ case LLAssetType::AT_CLOTHING:
+ if (gAgentWearables.areWearablesLoaded())
{
if (!cb && do_update)
{
@@ -1367,7 +1367,8 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear,
addCOFItemLink(item_to_wear, cb);
}
break;
- case LLAssetType::AT_BODYPART:
+
+ case LLAssetType::AT_BODYPART:
// TODO: investigate wearables may not be loaded at this point EXT-8231
// Remove the existing wearables of the same type.
@@ -1379,10 +1380,12 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear,
}
addCOFItemLink(item_to_wear, cb);
break;
- case LLAssetType::AT_OBJECT:
+
+ case LLAssetType::AT_OBJECT:
rez_attachment(item_to_wear, NULL, replace);
break;
- default: return false;;
+
+ default: return false;;
}
return true;
@@ -1480,6 +1483,18 @@ void LLAppearanceMgr::takeOffOutfit(const LLUUID& cat_id)
uuids_to_remove.push_back(item->getUUID());
}
removeItemsFromAvatar(uuids_to_remove);
+
+ // deactivate all gestures in the outfit folder
+ LLInventoryModel::item_array_t gest_items;
+ getDescendentsOfAssetType(cat_id, gest_items, LLAssetType::AT_GESTURE);
+ for(S32 i = 0; i < gest_items.size(); ++i)
+ {
+ LLViewerInventoryItem *gest_item = gest_items[i];
+ if ( LLGestureMgr::instance().isGestureActive( gest_item->getLinkedUUID()) )
+ {
+ LLGestureMgr::instance().deactivateGesture( gest_item->getLinkedUUID() );
+ }
+ }
}
// Create a copy of src_id + contents as a subfolder of dst_id.
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f52e6625c1..24150daea4 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -100,6 +100,7 @@
#include "llspellcheck.h"
#include "llscenemonitor.h"
#include "llavatarrenderinfoaccountant.h"
+#include "lllocalbitmaps.h"
// Linden library includes
#include "llavatarnamecache.h"
@@ -1758,7 +1759,9 @@ bool LLAppViewer::cleanup()
#if 0 // this seems to get us stuck in an infinite loop...
gTransferManager.cleanup();
#endif
-
+
+ LLLocalBitmapMgr::cleanupClass();
+
// Note: this is where gWorldMap used to be deleted.
// Note: this is where gHUDManager used to be deleted.
@@ -3190,7 +3193,8 @@ bool LLAppViewer::initWindow()
#ifdef LL_DARWIN
//Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later)
if (getOSInfo().mMajorVer == 10 && getOSInfo().mMinorVer < 7)
- gViewerWindow->getWindow()->setOldResize(true);
+ if ( getOSInfo().mMinorVer == 6 && getOSInfo().mBuild < 8 )
+ gViewerWindow->getWindow()->setOldResize(true);
#endif
if (gSavedSettings.getBOOL("WindowMaximized"))
@@ -3378,6 +3382,10 @@ LLSD LLAppViewer::getViewerInfo() const
{
info["SERVER_RELEASE_NOTES_URL"] = LLTrans::getString("RetrievingData");
}
+ else
+ {
+ info["SERVER_RELEASE_NOTES_URL"] = LLTrans::getString("NotConnected");
+ }
}
else if (LLStringUtil::startsWith(mServerReleaseNotesURL, "http")) // it's an URL
{
@@ -4833,7 +4841,7 @@ void LLAppViewer::idle()
static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD);
// Update session stats every large chunk of time
- // *FIX: (???) SAMANTHA
+ // *FIX: (?) SAMANTHA
if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD && !gDisconnected)
{
LL_INFOS() << "Transmitting sessions stats" << LL_ENDL;
diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h
index df907567ab..380fdccfa3 100755
--- a/indra/newview/llcolorswatch.h
+++ b/indra/newview/llcolorswatch.h
@@ -56,6 +56,7 @@ public:
Optional<LLUIImage*> alpha_background_image;
Optional<commit_callback_t> cancel_callback;
Optional<commit_callback_t> select_callback;
+ Optional<commit_callback_t> preview_callback;
Optional<LLUIColor> border_color;
Optional<S32> label_width;
Optional<S32> label_height;
@@ -84,6 +85,7 @@ public:
void setCanApplyImmediately(BOOL apply) { mCanApplyImmediately = apply; }
void setOnCancelCallback(commit_callback_t cb) { mOnCancelCallback = cb; }
void setOnSelectCallback(commit_callback_t cb) { mOnSelectCallback = cb; }
+ void setPreviewCallback(commit_callback_t cb) { mPreviewCallback = cb; }
void setFallbackImage(LLPointer<LLUIImage> image) { mFallbackImage = image; }
void showPicker(BOOL take_focus);
@@ -109,6 +111,7 @@ protected:
bool mCanApplyImmediately;
commit_callback_t mOnCancelCallback,
mOnSelectCallback;
+ commit_callback_t mPreviewCallback;
S32 mLabelWidth,
mLabelHeight;
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index 74b77f760d..6e32ce60ec 100755
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -51,6 +51,7 @@ LLConversationItem::LLConversationItem(std::string display_name, const LLUUID& u
mConvType(CONV_UNKNOWN),
mLastActiveTime(0.0),
mDisplayModeratorOptions(false),
+ mDisplayGroupBanOptions(false),
mAvatarNameCacheConnection()
{
}
@@ -63,6 +64,7 @@ LLConversationItem::LLConversationItem(const LLUUID& uuid, LLFolderViewModelInte
mConvType(CONV_UNKNOWN),
mLastActiveTime(0.0),
mDisplayModeratorOptions(false),
+ mDisplayGroupBanOptions(false),
mAvatarNameCacheConnection()
{
}
@@ -75,6 +77,7 @@ LLConversationItem::LLConversationItem(LLFolderViewModelInterface& root_view_mod
mConvType(CONV_UNKNOWN),
mLastActiveTime(0.0),
mDisplayModeratorOptions(false),
+ mDisplayGroupBanOptions(false),
mAvatarNameCacheConnection()
{
}
@@ -159,6 +162,12 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32
items.push_back(std::string("ModerateVoiceMute"));
items.push_back(std::string("ModerateVoiceUnmute"));
}
+
+ if ((getType() != CONV_SESSION_1_ON_1) && mDisplayGroupBanOptions)
+ {
+ items.push_back(std::string("Group Ban Separator"));
+ items.push_back(std::string("BanMember"));
+ }
}
}
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index dc74506c53..56e1a26709 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -143,6 +143,7 @@ protected:
bool mNeedsRefresh; // Flag signaling to the view that something changed for this item
F64 mLastActiveTime;
bool mDisplayModeratorOptions;
+ bool mDisplayGroupBanOptions;
boost::signals2::connection mAvatarNameCacheConnection;
};
@@ -206,6 +207,7 @@ public:
void dumpDebugData();
void setModeratorOptionsVisible(bool visible) { mDisplayModeratorOptions = visible; }
void setDisplayModeratorRole(bool displayRole);
+ void setGroupBanVisible(bool visible) { mDisplayGroupBanOptions = visible; }
private:
void onAvatarNameCache(const LLAvatarName& av_name); // callback used by fetchAvatarName
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 211a96b32d..67d1642639 100755
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -155,7 +155,7 @@ void LLStandardBumpmap::addstandard()
LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id));
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLGLTexture::LOCAL) ;
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL );
- gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->forceToSaveRawImage(0) ;
+ gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->forceToSaveRawImage(0, 30.f) ;
LLStandardBumpmap::sStandardBumpmapCount++;
}
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 15b94034bb..66149a4367 100755
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -143,7 +143,8 @@ BOOL LLFloaterAbout::postBuild()
}
else // not logged in
{
- setSupportText(LLStringUtil::null);
+ LL_DEBUGS("ViewerInfo") << "cannot display region info when not connected" << LL_ENDL;
+ setSupportText(LLTrans::getString("NotConnected"));
}
support_widget->blockUndo();
@@ -262,11 +263,10 @@ void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)
LLViewerTextEditor *support_widget =
getChild<LLViewerTextEditor>("support_editor", true);
+ LLUIColor about_color = LLUIColorTable::instance().getColor("TextFgReadOnlyColor");
support_widget->clear();
support_widget->appendText(LLAppViewer::instance()->getViewerInfoString(),
- FALSE,
- LLStyle::Params()
- .color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
+ FALSE, LLStyle::Params() .color(about_color));
}
///----------------------------------------------------------------------------
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index 3e032d0e4a..513c33e60d 100755
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -796,7 +796,7 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled()
{
bool ret_val = visibleItemsSelected();
- if ( ret_val && mOkButtonValidateSignal.num_slots() )
+ if ( ret_val )
{
std::string acvtive_panel_name;
LLScrollListCtrl* list = NULL;
@@ -827,7 +827,7 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled()
getSelectedAvatarData(list, avatar_ids, avatar_names);
if (avatar_ids.size() >= 1)
{
- ret_val = mOkButtonValidateSignal(avatar_ids);
+ ret_val = mOkButtonValidateSignal.num_slots()?mOkButtonValidateSignal(avatar_ids):true;
}
else
{
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index a22f5770bf..669ffa7c59 100755
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -1002,7 +1002,7 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
0,
LLFolderType::FT_NONE,
LLInventoryType::IT_ANIMATION,
- LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
+ LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
name,
callback, expected_upload_cost, userdata);
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 9425f5645e..0c59ba9a6d 100755
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -342,6 +342,11 @@ void LLFloaterColorPicker::setCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn )
curG = curGIn;
curB = curBIn;
+ if (mApplyImmediateCheck->get())
+ {
+ LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE );
+ }
+
// update corresponding HSL values and
LLColor3(curRIn, curGIn, curBIn).calcHSL(&curH, &curS, &curL);
@@ -369,6 +374,11 @@ void LLFloaterColorPicker::setCurHsl ( F32 curHIn, F32 curSIn, F32 curLIn )
// update corresponding RGB values and
hslToRgb ( curH, curS, curL, curR, curG, curB );
+
+ if (mApplyImmediateCheck->get())
+ {
+ LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE );
+ }
}
//////////////////////////////////////////////////////////////////////////////
@@ -458,10 +468,6 @@ void LLFloaterColorPicker::onImmediateCheck( LLUICtrl* ctrl, void* data)
void LLFloaterColorPicker::onColorSelect( const LLTextureEntry& te )
{
setCurRgb(te.getColor().mV[VRED], te.getColor().mV[VGREEN], te.getColor().mV[VBLUE]);
- if (mApplyImmediateCheck->get())
- {
- LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE );
- }
}
void LLFloaterColorPicker::onMouseCaptureLost()
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 9797b5c062..7da65a9a7c 100755
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -48,6 +48,7 @@
#include "llviewermenu.h"
#include "llviewerinventory.h"
#include "llviewercontrol.h"
+#include "llfloaterperms.h"
BOOL item_name_precedes( LLInventoryItem* a, LLInventoryItem* b )
{
@@ -74,6 +75,17 @@ public:
void fire(const LLUUID &inv_item)
{
LLPreviewGesture::show(inv_item, LLUUID::null);
+
+ LLInventoryItem* item = gInventory.getItem(inv_item);
+ if (item)
+ {
+ LLPermissions perm = item->getPermissions();
+ perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Gestures"));
+ perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Gestures"));
+ perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Gestures"));
+ item->setPermissions(perm);
+ item->updateServer(FALSE);
+ }
}
};
@@ -449,9 +461,17 @@ void LLFloaterGesture::onClickPlay()
void LLFloaterGesture::onClickNew()
{
LLPointer<LLInventoryCallback> cb = new GestureShowCallback();
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
- LLUUID::null, LLTransactionID::tnull, "New Gesture", "", LLAssetType::AT_GESTURE,
- LLInventoryType::IT_GESTURE, NOT_WEARABLE, PERM_MOVE | PERM_TRANSFER, cb);
+ create_inventory_item(gAgent.getID(),
+ gAgent.getSessionID(),
+ LLUUID::null,
+ LLTransactionID::tnull,
+ "New Gesture",
+ "",
+ LLAssetType::AT_GESTURE,
+ LLInventoryType::IT_GESTURE,
+ NOT_WEARABLE,
+ PERM_MOVE | LLFloaterPerms::getNextOwnerPerms("Gestures"),
+ cb);
}
void LLFloaterGesture::onActivateBtnClick()
diff --git a/indra/newview/llfloatergotoline.cpp b/indra/newview/llfloatergotoline.cpp
index d66e418926..3b34f03532 100644
--- a/indra/newview/llfloatergotoline.cpp
+++ b/indra/newview/llfloatergotoline.cpp
@@ -30,7 +30,7 @@
#include "llpreviewscript.h"
#include "llfloaterreg.h"
#include "lllineeditor.h"
-#include "llviewertexteditor.h"
+#include "llscripteditor.h"
#include "llviewerwindow.h"
LLFloaterGotoLine* LLFloaterGotoLine::sInstance = NULL;
diff --git a/indra/newview/llfloatergroupbulkban.cpp b/indra/newview/llfloatergroupbulkban.cpp
new file mode 100644
index 0000000000..54a2283b13
--- /dev/null
+++ b/indra/newview/llfloatergroupbulkban.cpp
@@ -0,0 +1,134 @@
+/**
+* @file llfloatergroupbulkban.cpp
+* @brief Floater to ban Residents from a group.
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatergroupbulkban.h"
+#include "llpanelgroupbulkban.h"
+#include "lltrans.h"
+#include "lldraghandle.h"
+
+
+class LLFloaterGroupBulkBan::impl
+{
+public:
+ impl(const LLUUID& group_id) : mGroupID(group_id), mBulkBanPanelp(NULL) {}
+ ~impl() {}
+
+ static void closeFloater(void* data);
+
+public:
+ LLUUID mGroupID;
+ LLPanelGroupBulkBan* mBulkBanPanelp;
+
+ static std::map<LLUUID, LLFloaterGroupBulkBan*> sInstances;
+};
+
+//
+// Globals
+//
+std::map<LLUUID, LLFloaterGroupBulkBan*> LLFloaterGroupBulkBan::impl::sInstances;
+
+void LLFloaterGroupBulkBan::impl::closeFloater(void* data)
+{
+ LLFloaterGroupBulkBan* floaterp = (LLFloaterGroupBulkBan*)data;
+ if(floaterp)
+ floaterp->closeFloater();
+}
+
+//-----------------------------------------------------------------------------
+// Implementation
+//-----------------------------------------------------------------------------
+LLFloaterGroupBulkBan::LLFloaterGroupBulkBan(const LLUUID& group_id/*=LLUUID::null*/)
+ : LLFloater(group_id)
+{
+ S32 floater_header_size = getHeaderHeight();
+ LLRect contents;
+
+ mImpl = new impl(group_id);
+ mImpl->mBulkBanPanelp = new LLPanelGroupBulkBan(group_id);
+
+ contents = mImpl->mBulkBanPanelp->getRect();
+ contents.mTop -= floater_header_size;
+
+ setTitle(mImpl->mBulkBanPanelp->getString("GroupBulkBan"));
+ mImpl->mBulkBanPanelp->setCloseCallback(impl::closeFloater, this);
+ mImpl->mBulkBanPanelp->setRect(contents);
+
+ addChild(mImpl->mBulkBanPanelp);
+}
+
+LLFloaterGroupBulkBan::~LLFloaterGroupBulkBan()
+{
+ if(mImpl->mGroupID.notNull())
+ {
+ impl::sInstances.erase(mImpl->mGroupID);
+ }
+
+ delete mImpl->mBulkBanPanelp;
+ delete mImpl;
+}
+
+void LLFloaterGroupBulkBan::showForGroup(const LLUUID& group_id, uuid_vec_t* agent_ids)
+{
+ const LLFloater::Params& floater_params = LLFloater::getDefaultParams();
+ S32 floater_header_size = floater_params.header_height;
+ LLRect contents;
+
+ // Make sure group_id isn't null
+ if (group_id.isNull())
+ {
+ llwarns << "LLFloaterGroupInvite::showForGroup with null group_id!" << llendl;
+ return;
+ }
+
+ // If we don't have a floater for this group, create one.
+ LLFloaterGroupBulkBan* fgb = get_if_there(impl::sInstances,
+ group_id,
+ (LLFloaterGroupBulkBan*)NULL);
+ if (!fgb)
+ {
+ fgb = new LLFloaterGroupBulkBan(group_id);
+ contents = fgb->mImpl->mBulkBanPanelp->getRect();
+ contents.mTop += floater_header_size;
+ fgb->setRect(contents);
+ fgb->getDragHandle()->setRect(contents);
+ fgb->getDragHandle()->setTitle(fgb->mImpl->mBulkBanPanelp->getString("GroupBulkBan"));
+
+ impl::sInstances[group_id] = fgb;
+
+ fgb->mImpl->mBulkBanPanelp->clear();
+ }
+
+ if (agent_ids != NULL)
+ {
+ fgb->mImpl->mBulkBanPanelp->addUsers(*agent_ids);
+ }
+
+ fgb->center();
+ fgb->openFloater();
+ fgb->mImpl->mBulkBanPanelp->update();
+}
diff --git a/indra/newview/llfloatergroupbulkban.h b/indra/newview/llfloatergroupbulkban.h
new file mode 100644
index 0000000000..5b680a1ba4
--- /dev/null
+++ b/indra/newview/llfloatergroupbulkban.h
@@ -0,0 +1,48 @@
+/**
+* @file llfloatergroupbulkban.h
+* @brief This floater is a wrapper for LLPanelGroupBulkBan, which
+* is used to ban Residents from a specific group.
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLFLOATERGROUPBULKBAN_H
+#define LL_LLFLOATERGROUPBULKBAN_H
+
+#include "llfloater.h"
+#include "lluuid.h"
+
+class LLFloaterGroupBulkBan : public LLFloater
+{
+public:
+ virtual ~LLFloaterGroupBulkBan();
+
+ static void showForGroup(const LLUUID& group_id, uuid_vec_t* agent_ids = NULL);
+
+protected:
+ LLFloaterGroupBulkBan(const LLUUID& group_id = LLUUID::null);
+
+ class impl;
+ impl* mImpl;
+};
+
+#endif // LL_LLFLOATERGROUPBULKBAN_H
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index ebb44561da..be8195b5ee 100755
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -532,6 +532,7 @@ void LLFloaterIMContainer::draw()
{
LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
participant_model->setModeratorOptionsVisible(isGroupModerator() && participant_model->getUUID() != gAgentID);
+ participant_model->setGroupBanVisible(haveAbilityToBan() && participant_model->getUUID() != gAgentID);
current_participant_model++;
}
@@ -1150,6 +1151,10 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec
{
toggleAllowTextChat(userID);
}
+ else if ("ban_member" == command)
+ {
+ banSelectedMember(userID);
+ }
}
else if (selectedIDS.size() > 1)
{
@@ -1271,6 +1276,22 @@ bool LLFloaterIMContainer::enableContextMenuItem(const LLSD& userdata)
uuid_vec_t uuids;
getParticipantUUIDs(uuids);
+
+ //If there is group or ad-hoc chat in multiselection, everything needs to be disabled
+ if(uuids.size() > 1)
+ {
+ const std::set<LLFolderViewItem*> selectedItems = mConversationsRoot->getSelectionList();
+ LLConversationItem * conversationItem;
+ for(std::set<LLFolderViewItem*>::const_iterator it = selectedItems.begin(); it != selectedItems.end(); ++it)
+ {
+ conversationItem = static_cast<LLConversationItem *>((*it)->getViewModelItem());
+ if((conversationItem->getType() == LLConversationItem::CONV_SESSION_GROUP) || (conversationItem->getType() == LLConversationItem::CONV_SESSION_AD_HOC))
+ {
+ return false;
+ }
+ }
+ }
+
if ("conversation_log" == item)
{
return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0;
@@ -1376,6 +1397,10 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
{
return LLAvatarActions::canCall();
}
+ else if ("can_open_voice_conversation" == item)
+ {
+ return is_single_select && LLAvatarActions::canCall();
+ }
else if ("can_zoom_in" == item)
{
return is_single_select && gObjectList.findObject(single_id);
@@ -1388,6 +1413,10 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
{
return LLAvatarActions::canOfferTeleport(uuids);
}
+ else if ("can_ban_member" == item)
+ {
+ return canBanSelectedMember(single_id);
+ }
else if (("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item))
{
// *TODO : get that out of here...
@@ -1810,6 +1839,95 @@ bool LLFloaterIMContainer::isGroupModerator()
return false;
}
+bool LLFloaterIMContainer::haveAbilityToBan()
+{
+ LLSpeakerMgr * speaker_manager = getSpeakerMgrForSelectedParticipant();
+ if (NULL == speaker_manager)
+ {
+ LL_WARNS() << "Speaker manager is missing" << LL_ENDL;
+ return false;
+ }
+ LLUUID group_uuid = speaker_manager->getSessionID();
+
+ return gAgent.isInGroup(group_uuid) && gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS);
+}
+
+bool LLFloaterIMContainer::canBanSelectedMember(const LLUUID& participant_uuid)
+{
+ LLSpeakerMgr * speaker_manager = getSpeakerMgrForSelectedParticipant();
+ if (NULL == speaker_manager)
+ {
+ LL_WARNS() << "Speaker manager is missing" << LL_ENDL;
+ return false;
+ }
+ LLUUID group_uuid = speaker_manager->getSessionID();
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
+ if(!gdatap)
+ {
+ LL_WARNS("Groups") << "Unable to get group data for group " << group_uuid << LL_ENDL;
+ return false;
+ }
+
+ if (!gdatap->mMembers.size())
+ {
+ return false;
+ }
+
+ LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find((participant_uuid));
+ if (mi == gdatap->mMembers.end())
+ {
+ return false;
+ }
+
+ LLGroupMemberData* member_data = (*mi).second;
+ // Is the member an owner?
+ if ( member_data && member_data->isInRole(gdatap->mOwnerRole) )
+ {
+ return false;
+ }
+
+ if( gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER) &&
+ gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS) )
+ {
+ return true;
+ }
+
+ return false;
+}
+
+void LLFloaterIMContainer::banSelectedMember(const LLUUID& participant_uuid)
+{
+ LLSpeakerMgr * speaker_manager = getSpeakerMgrForSelectedParticipant();
+ if (NULL == speaker_manager)
+ {
+ LL_WARNS() << "Speaker manager is missing" << LL_ENDL;
+ return;
+ }
+
+ LLUUID group_uuid = speaker_manager->getSessionID();
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
+ if(!gdatap)
+ {
+ LL_WARNS("Groups") << "Unable to get group data for group " << group_uuid << LL_ENDL;
+ return;
+ }
+ std::vector<LLUUID> ids;
+ ids.push_back(participant_uuid);
+
+ LLGroupBanData ban_data;
+ gdatap->createBanEntry(participant_uuid, ban_data);
+ LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, group_uuid, LLGroupMgr::BAN_CREATE, ids);
+ LLGroupMgr::getInstance()->sendGroupMemberEjects(group_uuid, ids);
+ LLGroupMgr::getInstance()->sendGroupMembersRequest(group_uuid);
+ LLSD args;
+ std::string name;
+ gCacheName->getFullName(participant_uuid, name);
+ args["AVATAR_NAME"] = name;
+ args["GROUP_NAME"] = gdatap->mName;
+ LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args));
+
+}
+
void LLFloaterIMContainer::moderateVoice(const std::string& command, const LLUUID& userID)
{
if (!gAgent.getRegion()) return;
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index f6d973b9b3..5ea9fd399b 100755
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -167,12 +167,16 @@ private:
LLSpeaker * getSpeakerOfSelectedParticipant(LLSpeakerMgr * speaker_managerp);
LLSpeakerMgr * getSpeakerMgrForSelectedParticipant();
bool isGroupModerator();
+ bool haveAbilityToBan();
+ bool canBanSelectedMember(const LLUUID& participant_uuid);
+ LLUUID getGroupUIIDForSelectedParticipant();
bool isMuted(const LLUUID& avatar_id);
void moderateVoice(const std::string& command, const LLUUID& userID);
void moderateVoiceAllParticipants(bool unmute);
void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
void toggleAllowTextChat(const LLUUID& participant_uuid);
void toggleMute(const LLUUID& participant_id, U32 flags);
+ void banSelectedMember(const LLUUID& participant_uuid);
void openNearbyChat();
bool isParticipantListExpanded();
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index 27b1c3b9cd..ee7f413a59 100755
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -45,6 +45,7 @@
#include "lluictrlfactory.h"
#include "llstring.h"
#include "lleconomy.h"
+#include "llpermissions.h"
// linden includes
#include "llassetstorage.h"
@@ -167,11 +168,14 @@ void LLFloaterNameDesc::onBtnOK( )
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
void *nruserdata = NULL;
std::string display_name = LLStringUtil::null;
+
upload_new_resource(mFilenameAndPath, // file
getChild<LLUICtrl>("name_form")->getValue().asString(),
getChild<LLUICtrl>("description_form")->getValue().asString(),
0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
+ LLFloaterPerms::getNextOwnerPerms("Uploads"),
+ LLFloaterPerms::getGroupPerms("Uploads"),
+ LLFloaterPerms::getEveryonePerms("Uploads"),
display_name, callback, expected_upload_cost, nruserdata);
closeFloater(false);
}
diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp
index 80b55c3cbb..0880a5f35a 100755
--- a/indra/newview/llfloaterperms.cpp
+++ b/indra/newview/llfloaterperms.cpp
@@ -1,7 +1,7 @@
/**
* @file llfloaterperms.cpp
* @brief Asset creation permission preferences.
- * @author Coco
+ * @author Jonathan Yap
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -32,101 +32,230 @@
#include "llviewerwindow.h"
#include "lluictrlfactory.h"
#include "llpermissions.h"
-
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llnotificationsutil.h"
LLFloaterPerms::LLFloaterPerms(const LLSD& seed)
: LLFloater(seed)
{
- mCommitCallbackRegistrar.add("Perms.Copy", boost::bind(&LLFloaterPerms::onCommitCopy, this));
- mCommitCallbackRegistrar.add("Perms.OK", boost::bind(&LLFloaterPerms::onClickOK, this));
- mCommitCallbackRegistrar.add("Perms.Cancel", boost::bind(&LLFloaterPerms::onClickCancel, this));
-
}
BOOL LLFloaterPerms::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLFloaterPerms::cancel, this));
-
+ return TRUE;
+}
+
+//static
+U32 LLFloaterPerms::getGroupPerms(std::string prefix)
+{
+ return gSavedSettings.getBOOL(prefix+"ShareWithGroup") ? PERM_COPY | PERM_MOVE | PERM_MODIFY : PERM_NONE;
+}
+
+//static
+U32 LLFloaterPerms::getEveryonePerms(std::string prefix)
+{
+ return gSavedSettings.getBOOL(prefix+"EveryoneCopy") ? PERM_COPY : PERM_NONE;
+}
+
+//static
+U32 LLFloaterPerms::getNextOwnerPerms(std::string prefix)
+{
+ U32 flags = PERM_MOVE;
+ if ( gSavedSettings.getBOOL(prefix+"NextOwnerCopy") )
+ {
+ flags |= PERM_COPY;
+ }
+ if ( gSavedSettings.getBOOL(prefix+"NextOwnerModify") )
+ {
+ flags |= PERM_MODIFY;
+ }
+ if ( gSavedSettings.getBOOL(prefix+"NextOwnerTransfer") )
+ {
+ flags |= PERM_TRANSFER;
+ }
+ return flags;
+}
+
+//static
+U32 LLFloaterPerms::getNextOwnerPermsInverted(std::string prefix)
+{
+ // Sets bits for permissions that are off
+ U32 flags = PERM_MOVE;
+ if ( !gSavedSettings.getBOOL(prefix+"NextOwnerCopy") )
+ {
+ flags |= PERM_COPY;
+ }
+ if ( !gSavedSettings.getBOOL(prefix+"NextOwnerModify") )
+ {
+ flags |= PERM_MODIFY;
+ }
+ if ( !gSavedSettings.getBOOL(prefix+"NextOwnerTransfer") )
+ {
+ flags |= PERM_TRANSFER;
+ }
+ return flags;
+}
+
+static bool mCapSent = false;
+
+LLFloaterPermsDefault::LLFloaterPermsDefault(const LLSD& seed)
+ : LLFloater(seed)
+{
+ mCommitCallbackRegistrar.add("PermsDefault.Copy", boost::bind(&LLFloaterPermsDefault::onCommitCopy, this, _2));
+ mCommitCallbackRegistrar.add("PermsDefault.OK", boost::bind(&LLFloaterPermsDefault::onClickOK, this));
+ mCommitCallbackRegistrar.add("PermsDefault.Cancel", boost::bind(&LLFloaterPermsDefault::onClickCancel, this));
+}
+
+
+// String equivalents of enum Categories - initialization order must match enum order!
+const std::string LLFloaterPermsDefault::sCategoryNames[CAT_LAST] =
+{
+ "Objects",
+ "Uploads",
+ "Scripts",
+ "Notecards",
+ "Gestures",
+ "Wearables"
+};
+
+BOOL LLFloaterPermsDefault::postBuild()
+{
+ if(!gSavedSettings.getBOOL("DefaultUploadPermissionsConverted"))
+ {
+ gSavedSettings.setBOOL("UploadsEveryoneCopy", gSavedSettings.getBOOL("EveryoneCopy"));
+ gSavedSettings.setBOOL("UploadsNextOwnerCopy", gSavedSettings.getBOOL("NextOwnerCopy"));
+ gSavedSettings.setBOOL("UploadsNextOwnerModify", gSavedSettings.getBOOL("NextOwnerModify"));
+ gSavedSettings.setBOOL("UploadsNextOwnerTransfer", gSavedSettings.getBOOL("NextOwnerTransfer"));
+ gSavedSettings.setBOOL("UploadsShareWithGroup", gSavedSettings.getBOOL("ShareWithGroup"));
+ gSavedSettings.setBOOL("DefaultUploadPermissionsConverted", true);
+ }
+
+ mCloseSignal.connect(boost::bind(&LLFloaterPermsDefault::cancel, this));
+
refresh();
- return TRUE;
+ return true;
}
-void LLFloaterPerms::onClickOK()
+void LLFloaterPermsDefault::onClickOK()
{
ok();
closeFloater();
}
-void LLFloaterPerms::onClickCancel()
+void LLFloaterPermsDefault::onClickCancel()
{
cancel();
closeFloater();
}
-void LLFloaterPerms::onCommitCopy()
+void LLFloaterPermsDefault::onCommitCopy(const LLSD& user_data)
{
// Implements fair use
- BOOL copyable = gSavedSettings.getBOOL("NextOwnerCopy");
+ std::string prefix = user_data.asString();
+
+ BOOL copyable = gSavedSettings.getBOOL(prefix+"NextOwnerCopy");
if(!copyable)
{
- gSavedSettings.setBOOL("NextOwnerTransfer", TRUE);
+ gSavedSettings.setBOOL(prefix+"NextOwnerTransfer", TRUE);
}
- LLCheckBoxCtrl* xfer = getChild<LLCheckBoxCtrl>("next_owner_transfer");
+ LLCheckBoxCtrl* xfer = getChild<LLCheckBoxCtrl>(prefix+"_transfer");
xfer->setEnabled(copyable);
}
-void LLFloaterPerms::ok()
+class LLFloaterPermsResponder : public LLHTTPClient::Responder
{
- refresh(); // Changes were already applied to saved settings. Refreshing internal values makes it official.
-}
+public:
+ LLFloaterPermsResponder(): LLHTTPClient::Responder() {}
+private:
+ static std::string sPreviousReason;
+
+ void error(U32 status, const std::string& reason)
+ {
+ // Do not display the same error more than once in a row
+ if (reason != sPreviousReason)
+ {
+ sPreviousReason = reason;
+ LLSD args;
+ args["REASON"] = reason;
+ LLNotificationsUtil::add("DefaultObjectPermissions", args);
+ }
+ }
+ void result(const LLSD& content)
+ {
+ // Since we have had a successful POST call be sure to display the next error message
+ // even if it is the same as a previous one.
+ sPreviousReason = "";
+ LLFloaterPermsDefault::setCapSent(true);
+ LL_INFOS("FloaterPermsResponder") << "Sent default permissions to simulator" << LL_ENDL;
+ }
+};
+
+ std::string LLFloaterPermsResponder::sPreviousReason;
-void LLFloaterPerms::cancel()
+void LLFloaterPermsDefault::sendInitialPerms()
{
- gSavedSettings.setBOOL("ShareWithGroup", mShareWithGroup);
- gSavedSettings.setBOOL("EveryoneCopy", mEveryoneCopy);
- gSavedSettings.setBOOL("NextOwnerCopy", mNextOwnerCopy);
- gSavedSettings.setBOOL("NextOwnerModify", mNextOwnerModify);
- gSavedSettings.setBOOL("NextOwnerTransfer", mNextOwnerTransfer);
+ if(!mCapSent)
+ {
+ updateCap();
+ }
}
-void LLFloaterPerms::refresh()
+void LLFloaterPermsDefault::updateCap()
{
- mShareWithGroup = gSavedSettings.getBOOL("ShareWithGroup");
- mEveryoneCopy = gSavedSettings.getBOOL("EveryoneCopy");
- mNextOwnerCopy = gSavedSettings.getBOOL("NextOwnerCopy");
- mNextOwnerModify = gSavedSettings.getBOOL("NextOwnerModify");
- mNextOwnerTransfer = gSavedSettings.getBOOL("NextOwnerTransfer");
+ std::string object_url = gAgent.getRegion()->getCapability("AgentPreferences");
+
+ if(!object_url.empty())
+ {
+ LLSD report = LLSD::emptyMap();
+ report["default_object_perm_masks"]["Group"] =
+ (LLSD::Integer)LLFloaterPerms::getGroupPerms(sCategoryNames[CAT_OBJECTS]);
+ report["default_object_perm_masks"]["Everyone"] =
+ (LLSD::Integer)LLFloaterPerms::getEveryonePerms(sCategoryNames[CAT_OBJECTS]);
+ report["default_object_perm_masks"]["NextOwner"] =
+ (LLSD::Integer)LLFloaterPerms::getNextOwnerPerms(sCategoryNames[CAT_OBJECTS]);
+
+ LLHTTPClient::post(object_url, report, new LLFloaterPermsResponder());
+ }
}
-//static
-U32 LLFloaterPerms::getGroupPerms(std::string prefix)
-{
- return gSavedSettings.getBOOL(prefix+"ShareWithGroup") ? PERM_COPY : PERM_NONE;
+void LLFloaterPermsDefault::setCapSent(bool cap_sent)
+{
+ mCapSent = cap_sent;
}
-//static
-U32 LLFloaterPerms::getEveryonePerms(std::string prefix)
+void LLFloaterPermsDefault::ok()
{
- return gSavedSettings.getBOOL(prefix+"EveryoneCopy") ? PERM_COPY : PERM_NONE;
+// Changes were already applied automatically to saved settings.
+// Refreshing internal values makes it official.
+ refresh();
+
+// We know some setting has changed but not which one. Just in case it was a setting for
+// object permissions tell the server what the values are.
+ updateCap();
}
-//static
-U32 LLFloaterPerms::getNextOwnerPerms(std::string prefix)
+void LLFloaterPermsDefault::cancel()
{
- U32 flags = PERM_MOVE;
- if ( gSavedSettings.getBOOL(prefix+"NextOwnerCopy") )
+ for (U32 iter = CAT_OBJECTS; iter < CAT_LAST; iter++)
{
- flags |= PERM_COPY;
- }
- if ( gSavedSettings.getBOOL(prefix+"NextOwnerModify") )
- {
- flags |= PERM_MODIFY;
+ gSavedSettings.setBOOL(sCategoryNames[iter]+"NextOwnerCopy", mNextOwnerCopy[iter]);
+ gSavedSettings.setBOOL(sCategoryNames[iter]+"NextOwnerModify", mNextOwnerModify[iter]);
+ gSavedSettings.setBOOL(sCategoryNames[iter]+"NextOwnerTransfer", mNextOwnerTransfer[iter]);
+ gSavedSettings.setBOOL(sCategoryNames[iter]+"ShareWithGroup", mShareWithGroup[iter]);
+ gSavedSettings.setBOOL(sCategoryNames[iter]+"EveryoneCopy", mEveryoneCopy[iter]);
}
- if ( gSavedSettings.getBOOL(prefix+"NextOwnerTransfer") )
+}
+
+void LLFloaterPermsDefault::refresh()
+{
+ for (U32 iter = CAT_OBJECTS; iter < CAT_LAST; iter++)
{
- flags |= PERM_TRANSFER;
+ mShareWithGroup[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"ShareWithGroup");
+ mEveryoneCopy[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"EveryoneCopy");
+ mNextOwnerCopy[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"NextOwnerCopy");
+ mNextOwnerModify[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"NextOwnerModify");
+ mNextOwnerTransfer[iter] = gSavedSettings.getBOOL(sCategoryNames[iter]+"NextOwnerTransfer");
}
- return flags;
}
-
diff --git a/indra/newview/llfloaterperms.h b/indra/newview/llfloaterperms.h
index 6b65f4b0cd..2bb0a19dc1 100755
--- a/indra/newview/llfloaterperms.h
+++ b/indra/newview/llfloaterperms.h
@@ -1,7 +1,7 @@
/**
* @file llfloaterperms.h
* @brief Asset creation permission preferences.
- * @author Coco
+ * @author Jonathan Yap
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -36,26 +36,57 @@ class LLFloaterPerms : public LLFloater
public:
/*virtual*/ BOOL postBuild();
- void ok();
- void cancel();
- void onClickOK();
- void onClickCancel();
- void onCommitCopy();
+
// Convenience methods to get current permission preference bitfields from saved settings:
static U32 getEveryonePerms(std::string prefix=""); // prefix + "EveryoneCopy"
static U32 getGroupPerms(std::string prefix=""); // prefix + "ShareWithGroup"
static U32 getNextOwnerPerms(std::string prefix=""); // bitfield for prefix + "NextOwner" + "Copy", "Modify", and "Transfer"
+ static U32 getNextOwnerPermsInverted(std::string prefix="");
private:
LLFloaterPerms(const LLSD& seed);
+
+};
+
+class LLFloaterPermsDefault : public LLFloater
+{
+ friend class LLFloaterReg;
+
+public:
+ /*virtual*/ BOOL postBuild();
+ void ok();
+ void cancel();
+ void onClickOK();
+ void onClickCancel();
+ void onCommitCopy(const LLSD& user_data);
+ static void sendInitialPerms();
+ static void updateCap();
+ static void setCapSent(bool cap_sent);
+
+// Update instantiation of sCategoryNames in the .cpp file to match if you change this!
+enum Categories
+{
+ CAT_OBJECTS,
+ CAT_UPLOADS,
+ CAT_SCRIPTS,
+ CAT_NOTECARDS,
+ CAT_GESTURES,
+ CAT_WEARABLES,
+ CAT_LAST
+};
+
+private:
+ LLFloaterPermsDefault(const LLSD& seed);
void refresh();
- BOOL // cached values only for implementing cancel.
- mShareWithGroup,
- mEveryoneCopy,
- mNextOwnerCopy,
- mNextOwnerModify,
- mNextOwnerTransfer;
+ static const std::string sCategoryNames[CAT_LAST];
+
+ // cached values only for implementing cancel.
+ bool mShareWithGroup[CAT_LAST];
+ bool mEveryoneCopy[CAT_LAST];
+ bool mNextOwnerCopy[CAT_LAST];
+ bool mNextOwnerModify[CAT_LAST];
+ bool mNextOwnerTransfer[CAT_LAST];
};
#endif
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index c6b92d20bb..6e47cbb09f 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -350,6 +350,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.Proxy", boost::bind(&LLFloaterPreference::onClickProxySettings, this));
mCommitCallbackRegistrar.add("Pref.TranslationSettings", boost::bind(&LLFloaterPreference::onClickTranslationSettings, this));
mCommitCallbackRegistrar.add("Pref.AutoReplace", boost::bind(&LLFloaterPreference::onClickAutoReplace, this));
+ mCommitCallbackRegistrar.add("Pref.PermsDefault", boost::bind(&LLFloaterPreference::onClickPermsDefault, this));
mCommitCallbackRegistrar.add("Pref.SpellChecker", boost::bind(&LLFloaterPreference::onClickSpellChecker, this));
sSkin = gSavedSettings.getString("SkinCurrent");
@@ -1191,6 +1192,9 @@ void LLFloaterPreference::refreshEnabledState()
disableUnavailableSettings();
getChildView("block_list")->setEnabled(LLLoginInstance::getInstance()->authSuccess());
+
+ // Cannot have floater active until caps have been received
+ getChild<LLButton>("default_creation_permissions")->setEnabled(LLStartUp::getStartupState() < STATE_STARTED ? false : true);
}
void LLFloaterPreference::disableUnavailableSettings()
@@ -1686,6 +1690,11 @@ void LLFloaterPreference::onClickActionChange()
mClickActionDirty = true;
}
+void LLFloaterPreference::onClickPermsDefault()
+{
+ LLFloaterReg::showInstance("perms_default");
+}
+
void LLFloaterPreference::onDeleteTranscripts()
{
LLSD args;
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index cb180f6f1e..e287631b1a 100755
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -164,6 +164,7 @@ public:
void onClickBlockList();
void onClickProxySettings();
void onClickTranslationSettings();
+ void onClickPermsDefault();
void onClickAutoReplace();
void onClickSpellChecker();
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
diff --git a/indra/newview/llfloaterscriptedprefs.cpp b/indra/newview/llfloaterscriptedprefs.cpp
new file mode 100644
index 0000000000..2484a08626
--- /dev/null
+++ b/indra/newview/llfloaterscriptedprefs.cpp
@@ -0,0 +1,65 @@
+/**
+ * @file llfloaterscriptedprefs.cpp
+ * @brief Color controls for the script editor
+ * @author Cinder Roxley
+ *
+ * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloaterscriptedprefs.h"
+
+#include "llcolorswatch.h"
+#include "llscripteditor.h"
+
+
+LLFloaterScriptEdPrefs::LLFloaterScriptEdPrefs(const LLSD& key)
+: LLFloater(key)
+, mEditor(NULL)
+{
+ mCommitCallbackRegistrar.add("ScriptPref.applyUIColor", boost::bind(&LLFloaterScriptEdPrefs::applyUIColor, this ,_1, _2));
+ mCommitCallbackRegistrar.add("ScriptPref.getUIColor", boost::bind(&LLFloaterScriptEdPrefs::getUIColor, this ,_1, _2));
+}
+
+BOOL LLFloaterScriptEdPrefs::postBuild()
+{
+ mEditor = getChild<LLScriptEditor>("Script Preview");
+ if (mEditor)
+ {
+ mEditor->initKeywords();
+ mEditor->loadKeywords();
+ }
+ return TRUE;
+}
+
+void LLFloaterScriptEdPrefs::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
+{
+ LLUIColorTable::instance().setColor(param.asString(), LLColor4(ctrl->getValue()));
+ mEditor->initKeywords();
+ mEditor->loadKeywords();
+}
+
+void LLFloaterScriptEdPrefs::getUIColor(LLUICtrl* ctrl, const LLSD& param)
+{
+ LLColorSwatchCtrl* color_swatch = dynamic_cast<LLColorSwatchCtrl*>(ctrl);
+ color_swatch->setOriginal(LLUIColorTable::instance().getColor(param.asString()));
+}
diff --git a/indra/newview/llfloaterscriptedprefs.h b/indra/newview/llfloaterscriptedprefs.h
new file mode 100644
index 0000000000..31df897aac
--- /dev/null
+++ b/indra/newview/llfloaterscriptedprefs.h
@@ -0,0 +1,51 @@
+/**
+ * @file llfloaterscriptedprefs.h
+ * @brief Color controls for the script editor
+ * @author Cinder Roxley
+ *
+ * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2014, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FLOATERSCRIPTEDPREFS_H
+#define LL_FLOATERSCRIPTEDPREFS_H
+
+#include "llfloater.h"
+
+class LLScriptEditor;
+class LLUICtrl;
+
+class LLFloaterScriptEdPrefs : public LLFloater
+{
+public:
+ LLFloaterScriptEdPrefs(const LLSD& key);
+ BOOL postBuild();
+
+private:
+ ~LLFloaterScriptEdPrefs() {};
+
+ void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
+ void getUIColor(LLUICtrl* ctrl, const LLSD& param);
+
+ LLScriptEditor* mEditor;
+};
+
+#endif // LL_FLOATERSCRIPTEDPREFS_H
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index afbd7ba5e2..bd5d2207b4 100755
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -1069,9 +1069,9 @@ void LLFloaterTools::setGridMode(S32 mode)
void LLFloaterTools::onClickGridOptions()
{
- LLFloaterReg::showInstance("build_options");
- // RN: this makes grid options dependent on build tools window
- //floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);
+ LLFloater* floaterp = LLFloaterReg::showInstance("build_options");
+ // position floater next to build tools, not over
+ floaterp->setRect(gFloaterView->findNeighboringPosition(this, floaterp));
}
// static
diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp
index bbfd855bc8..7f599073d5 100755
--- a/indra/newview/llfloaterwebcontent.cpp
+++ b/indra/newview/llfloaterwebcontent.cpp
@@ -74,8 +74,7 @@ LLFloaterWebContent::LLFloaterWebContent( const Params& params )
mShowPageTitle(params.show_page_title),
mAllowNavigation(true),
mCurrentURL(""),
- mDisplayURL(""),
- mSecureURL(false)
+ mDisplayURL("")
{
mCommitCallbackRegistrar.add( "WebContent.Back", boost::bind( &LLFloaterWebContent::onClickBack, this ));
mCommitCallbackRegistrar.add( "WebContent.Forward", boost::bind( &LLFloaterWebContent::onClickForward, this ));
@@ -331,9 +330,6 @@ void LLFloaterWebContent::draw()
mBtnBack->setEnabled( mWebBrowser->canNavigateBack() && mAllowNavigation);
mBtnForward->setEnabled( mWebBrowser->canNavigateForward() && mAllowNavigation);
- // Show/hide the lock icon
- mSecureLockIcon->setVisible(mSecureURL && !mAddressCombo->hasFocus());
-
LLFloater::draw();
}
@@ -378,8 +374,6 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
// we populate the status bar with URLs as they change so clear it now we're done
const std::string end_str = "";
mStatusBarText->setText( end_str );
- mAddressCombo->setLeftTextPadding(22);
- mAddressCombo->setLeftTextPadding(2);
}
else if(event == MEDIA_EVENT_CLOSE_REQUEST)
{
@@ -446,10 +440,10 @@ void LLFloaterWebContent::set_current_url(const std::string& url)
static const std::string secure_prefix = std::string("https://");
std::string prefix = mCurrentURL.substr(0, secure_prefix.length());
LLStringUtil::toLower(prefix);
- mSecureURL = (prefix == secure_prefix);
-
- // Hack : we move the text a bit to make space for the lock icon in the secure URL case
- mDisplayURL = (mSecureURL ? " " + mCurrentURL : mCurrentURL);
+ bool secure_url = (prefix == secure_prefix);
+ mSecureLockIcon->setVisible(secure_url);
+ mAddressCombo->setLeftTextPadding(secure_url ? 22 : 2);
+ mDisplayURL = mCurrentURL;
// Clean up browsing list (prevent dupes) and add/select the new URL to it
mAddressCombo->remove(mCurrentURL);
diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h
index f5faa39e3d..4291fd9f2c 100755
--- a/indra/newview/llfloaterwebcontent.h
+++ b/indra/newview/llfloaterwebcontent.h
@@ -113,7 +113,6 @@ protected:
std::string mUUID;
bool mShowPageTitle;
bool mAllowNavigation;
- bool mSecureURL; // true when the current url is prefixed "https://"
};
#endif // LL_LLFLOATERWEBCONTENT_H
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index f514729aa1..913efd6434 100755
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -149,7 +149,7 @@ public:
void changed(LLGroupChange gc)
{
- if (gc == GC_MEMBER_DATA && !mRequestProcessed)
+ if (gc == GC_PROPERTIES && !mRequestProcessed)
{
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupId);
if (!gdatap)
@@ -159,9 +159,6 @@ public:
else if (!gdatap->isMemberDataComplete())
{
LL_WARNS() << "LLGroupMgr::getInstance()->getGroupData()->isMemberDataComplete() was FALSE" << LL_ENDL;
- }
- else
- {
processGroupData();
mRequestProcessed = true;
}
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index d5b817ce76..56e671d902 100755
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -234,11 +234,11 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) :
mMemberCount(0),
mRoleCount(0),
mReceivedRoleMemberPairs(0),
- mMemberDataComplete(FALSE),
- mRoleDataComplete(FALSE),
- mRoleMemberDataComplete(FALSE),
- mGroupPropertiesDataComplete(FALSE),
- mPendingRoleMemberRequest(FALSE),
+ mMemberDataComplete(false),
+ mRoleDataComplete(false),
+ mRoleMemberDataComplete(false),
+ mGroupPropertiesDataComplete(false),
+ mPendingRoleMemberRequest(false),
mAccessTime(0.0f)
{
mMemberVersion.generate();
@@ -427,7 +427,7 @@ void LLGroupMgrGroupData::removeMemberData()
delete mi->second;
}
mMembers.clear();
- mMemberDataComplete = FALSE;
+ mMemberDataComplete = false;
mMemberVersion.generate();
}
@@ -449,8 +449,8 @@ void LLGroupMgrGroupData::removeRoleData()
}
mRoles.clear();
mReceivedRoleMemberPairs = 0;
- mRoleDataComplete = FALSE;
- mRoleMemberDataComplete = FALSE;
+ mRoleDataComplete = false;
+ mRoleMemberDataComplete= false;
}
void LLGroupMgrGroupData::removeRoleMemberData()
@@ -474,7 +474,7 @@ void LLGroupMgrGroupData::removeRoleMemberData()
}
mReceivedRoleMemberPairs = 0;
- mRoleMemberDataComplete = FALSE;
+ mRoleMemberDataComplete= false;
}
LLGroupMgrGroupData::~LLGroupMgrGroupData()
@@ -750,6 +750,20 @@ void LLGroupMgrGroupData::cancelRoleChanges()
// Clear out all changes!
mRoleChanges.clear();
}
+
+void LLGroupMgrGroupData::createBanEntry(const LLUUID& ban_id, const LLGroupBanData& ban_data)
+{
+ mBanList[ban_id] = ban_data;
+}
+
+void LLGroupMgrGroupData::removeBanEntry(const LLUUID& ban_id)
+{
+ mBanList.erase(ban_id);
+}
+
+
+
+
//
// LLGroupMgr
//
@@ -959,12 +973,12 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
if (group_datap->mMembers.size() == (U32)group_datap->mMemberCount)
{
- group_datap->mMemberDataComplete = TRUE;
+ group_datap->mMemberDataComplete = true;
group_datap->mMemberRequestID.setNull();
// We don't want to make role-member data requests until we have all the members
if (group_datap->mPendingRoleMemberRequest)
{
- group_datap->mPendingRoleMemberRequest = FALSE;
+ group_datap->mPendingRoleMemberRequest = false;
LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_datap->mID);
}
}
@@ -1034,7 +1048,7 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
group_datap->mMemberCount = num_group_members;
group_datap->mRoleCount = num_group_roles + 1; // Add the everyone role.
- group_datap->mGroupPropertiesDataComplete = TRUE;
+ group_datap->mGroupPropertiesDataComplete = true;
group_datap->mChanged = TRUE;
LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES);
@@ -1111,12 +1125,12 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
if (group_datap->mRoles.size() == (U32)group_datap->mRoleCount)
{
- group_datap->mRoleDataComplete = TRUE;
+ group_datap->mRoleDataComplete = true;
group_datap->mRoleDataRequestID.setNull();
// We don't want to make role-member data requests until we have all the role data
if (group_datap->mPendingRoleMemberRequest)
{
- group_datap->mPendingRoleMemberRequest = FALSE;
+ group_datap->mPendingRoleMemberRequest = false;
LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_datap->mID);
}
}
@@ -1225,7 +1239,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
}
}
- group_datap->mRoleMemberDataComplete = TRUE;
+ group_datap->mRoleMemberDataComplete= true;
group_datap->mRoleMembersRequestID.setNull();
}
@@ -1849,6 +1863,138 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
// Responder class for capability group management
+class GroupBanDataResponder : public LLHTTPClient::Responder
+{
+public:
+ GroupBanDataResponder(const LLUUID& gropup_id, BOOL force_refresh=false);
+ virtual ~GroupBanDataResponder() {}
+ virtual void httpSuccess();
+ virtual void httpFailure();
+private:
+ LLUUID mGroupID;
+ BOOL mForceRefresh;
+};
+
+GroupBanDataResponder::GroupBanDataResponder(const LLUUID& gropup_id, BOOL force_refresh) :
+ mGroupID(gropup_id),
+ mForceRefresh(force_refresh)
+{}
+
+void GroupBanDataResponder::httpFailure()
+{
+ LL_WARNS("GrpMgr") << "Error receiving group member data [status:"
+ << mStatus << "]: " << mContent << LL_ENDL;
+}
+
+void GroupBanDataResponder::httpSuccess()
+{
+ if (mContent.has("ban_list"))
+ {
+ // group ban data received
+ LLGroupMgr::processGroupBanRequest(mContent);
+ }
+ else if (mForceRefresh)
+ {
+ // no ban data received, refreshing data after successful operation
+ LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID);
+ }
+}
+
+void LLGroupMgr::sendGroupBanRequest( EBanRequestType request_type,
+ const LLUUID& group_id,
+ U32 ban_action, /* = BAN_NO_ACTION */
+ const std::vector<LLUUID> ban_list) /* = std::vector<LLUUID>() */
+{
+ LLViewerRegion* currentRegion = gAgent.getRegion();
+ if(!currentRegion)
+ {
+ LL_WARNS("GrpMgr") << "Agent does not have a current region. Uh-oh!" << LL_ENDL;
+ return;
+ }
+
+ // Check to make sure we have our capabilities
+ if(!currentRegion->capabilitiesReceived())
+ {
+ LL_WARNS("GrpMgr") << " Capabilities not received!" << LL_ENDL;
+ return;
+ }
+
+ // Get our capability
+ std::string cap_url = currentRegion->getCapability("GroupAPIv1");
+ if(cap_url.empty())
+ {
+ return;
+ }
+ cap_url += "?group_id=" + group_id.asString();
+
+ LLSD body = LLSD::emptyMap();
+ body["ban_action"] = (LLSD::Integer)(ban_action & ~BAN_UPDATE);
+ // Add our list of potential banned residents to the list
+ body["ban_ids"] = LLSD::emptyArray();
+ LLSD ban_entry;
+
+ uuid_vec_t::const_iterator iter = ban_list.begin();
+ for(;iter != ban_list.end(); ++iter)
+ {
+ ban_entry = (*iter);
+ body["ban_ids"].append(ban_entry);
+ }
+
+ LLHTTPClient::ResponderPtr grp_ban_responder = new GroupBanDataResponder(group_id, ban_action & BAN_UPDATE);
+ switch(request_type)
+ {
+ case REQUEST_GET:
+ LLHTTPClient::get(cap_url, grp_ban_responder);
+ break;
+ case REQUEST_POST:
+ LLHTTPClient::post(cap_url, body, grp_ban_responder);
+ break;
+ case REQUEST_PUT:
+ case REQUEST_DEL:
+ break;
+ }
+}
+
+
+void LLGroupMgr::processGroupBanRequest(const LLSD& content)
+{
+ // Did we get anything in content?
+ if(!content.size())
+ {
+ LL_WARNS("GrpMgr") << "No group member data received." << LL_ENDL;
+ return;
+ }
+
+ LLUUID group_id = content["group_id"].asUUID();
+
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_id);
+ if (!gdatap)
+ return;
+
+ LLSD::map_const_iterator i = content["ban_list"].beginMap();
+ LLSD::map_const_iterator iEnd = content["ban_list"].endMap();
+ for(;i != iEnd; ++i)
+ {
+ const LLUUID ban_id(i->first);
+ LLSD ban_entry(i->second);
+
+ LLGroupBanData ban_data;
+ if(ban_entry.has("ban_date"))
+ {
+ ban_data.mBanDate = ban_entry["ban_date"].asDate();
+ // TODO: Ban Reason
+ }
+
+ gdatap->createBanEntry(ban_id, ban_data);
+ }
+
+ gdatap->mChanged = TRUE;
+ LLGroupMgr::getInstance()->notifyObservers(GC_BANLIST);
+}
+
+
+
+// Responder class for capability group management
class GroupMemberDataResponder : public LLHTTPClient::Responder
{
LOG_CLASS(GroupMemberDataResponder);
@@ -1941,7 +2087,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
if(num_members < 1)
return;
- LLUUID group_id = content["group_id"].asUUID();
+ LLUUID group_id = content["group_id"].asUUID();
LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
if(!group_datap)
@@ -2008,6 +2154,22 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
online_status,
is_owner);
+ LLGroupMemberData* member_old = group_datap->mMembers[member_id];
+ if (member_old && group_datap->mRoleMemberDataComplete)
+ {
+ LLGroupMemberData::role_list_t::iterator rit = member_old->roleBegin();
+ LLGroupMemberData::role_list_t::iterator end = member_old->roleEnd();
+
+ for ( ; rit != end; ++rit)
+ {
+ data->addRole((*rit).first,(*rit).second);
+ }
+ }
+ else
+ {
+ group_datap->mRoleMemberDataComplete = false;
+ }
+
group_datap->mMembers[member_id] = data;
}
@@ -2024,12 +2186,12 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_id);
- group_datap->mMemberDataComplete = TRUE;
+ group_datap->mMemberDataComplete = true;
group_datap->mMemberRequestID.setNull();
// Make the role-member data request
- if (group_datap->mPendingRoleMemberRequest)
+ if (group_datap->mPendingRoleMemberRequest || !group_datap->mRoleMemberDataComplete)
{
- group_datap->mPendingRoleMemberRequest = FALSE;
+ group_datap->mPendingRoleMemberRequest = false;
LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_id);
}
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index 9b62ecac48..2e94e8d9a0 100755
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -33,8 +33,10 @@
#include <string>
#include <map>
+// Forward Declarations
class LLMessageSystem;
-
+class LLGroupRoleData;
+class LLGroupMgr;
enum LLGroupChange
{
@@ -43,9 +45,12 @@ enum LLGroupChange
GC_ROLE_DATA,
GC_ROLE_MEMBER_DATA,
GC_TITLES,
+ GC_BANLIST,
GC_ALL
};
+const U32 GB_MAX_BANNED_AGENTS = 500;
+
class LLGroupMgrObserver
{
public:
@@ -65,8 +70,6 @@ public:
virtual void changed(const LLUUID& group_id, LLGroupChange gc) = 0;
};
-class LLGroupRoleData;
-
class LLGroupMemberData
{
friend class LLGroupMgrGroupData;
@@ -201,6 +204,17 @@ struct lluuid_pair_less
}
};
+
+struct LLGroupBanData
+{
+ LLGroupBanData(): mBanDate() {}
+ ~LLGroupBanData() {}
+
+ LLDate mBanDate;
+ // TODO: std:string ban_reason;
+};
+
+
struct LLGroupTitle
{
std::string mTitle;
@@ -208,8 +222,6 @@ struct LLGroupTitle
BOOL mSelected;
};
-class LLGroupMgr;
-
class LLGroupMgrGroupData
{
friend class LLGroupMgr;
@@ -239,11 +251,11 @@ public:
void recalcAllAgentPowers();
void recalcAgentPowers(const LLUUID& agent_id);
- BOOL isMemberDataComplete() { return mMemberDataComplete; }
- BOOL isRoleDataComplete() { return mRoleDataComplete; }
- BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }
- BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; }
-
+ bool isMemberDataComplete() { return mMemberDataComplete; }
+ bool isRoleDataComplete() { return mRoleDataComplete; }
+ bool isRoleMemberDataComplete() { return mRoleMemberDataComplete; }
+ bool isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; }
+
bool isSingleMemberNotOwner();
F32 getAccessTime() const { return mAccessTime; }
@@ -251,17 +263,26 @@ public:
const LLUUID& getMemberVersion() const { return mMemberVersion; }
+ void clearBanList() { mBanList.clear(); }
+ void getBanList(const LLUUID& group_id, LLGroupBanData& ban_data);
+ const LLGroupBanData& getBanEntry(const LLUUID& ban_id) { return mBanList[ban_id]; }
+
+ void createBanEntry(const LLUUID& ban_id, const LLGroupBanData& ban_data = LLGroupBanData());
+ void removeBanEntry(const LLUUID& ban_id);
+
+
public:
typedef std::map<LLUUID,LLGroupMemberData*> member_list_t;
typedef std::map<LLUUID,LLGroupRoleData*> role_list_t;
typedef std::map<lluuid_pair,LLRoleMemberChange,lluuid_pair_less> change_map_t;
typedef std::map<LLUUID,LLRoleData> role_data_map_t;
+ typedef std::map<LLUUID,LLGroupBanData> ban_list_t;
+
member_list_t mMembers;
role_list_t mRoles;
-
-
change_map_t mRoleMemberChanges;
role_data_map_t mRoleChanges;
+ ban_list_t mBanList;
std::vector<LLGroupTitle> mTitles;
@@ -292,12 +313,12 @@ private:
LLUUID mTitlesRequestID;
U32 mReceivedRoleMemberPairs;
- BOOL mMemberDataComplete;
- BOOL mRoleDataComplete;
- BOOL mRoleMemberDataComplete;
- BOOL mGroupPropertiesDataComplete;
+ bool mMemberDataComplete;
+ bool mRoleDataComplete;
+ bool mRoleMemberDataComplete;
+ bool mGroupPropertiesDataComplete;
- BOOL mPendingRoleMemberRequest;
+ bool mPendingRoleMemberRequest;
F32 mAccessTime;
// Generate a new ID every time mMembers
@@ -325,6 +346,23 @@ class LLGroupMgr : public LLSingleton<LLGroupMgr>
LOG_CLASS(LLGroupMgr);
public:
+ enum EBanRequestType
+ {
+ REQUEST_GET = 0,
+ REQUEST_POST,
+ REQUEST_PUT,
+ REQUEST_DEL
+ };
+
+ enum EBanRequestAction
+ {
+ BAN_NO_ACTION = 0,
+ BAN_CREATE = 1,
+ BAN_DELETE = 2,
+ BAN_UPDATE = 4
+ };
+
+public:
LLGroupMgr();
~LLGroupMgr();
@@ -357,8 +395,14 @@ public:
static void sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID,LLUUID>& role_member_pairs);
static void sendGroupMemberEjects(const LLUUID& group_id,
uuid_vec_t& member_ids);
+
+ static void sendGroupBanRequest(EBanRequestType request_type,
+ const LLUUID& group_id,
+ U32 ban_action = BAN_NO_ACTION,
+ const uuid_vec_t ban_list = uuid_vec_t());
+
+ static void processGroupBanRequest(const LLSD& content);
- // BAKER
void sendCapGroupMembersRequest(const LLUUID& group_id);
static void processCapGroupMembersRequest(const LLSD& content);
@@ -403,4 +447,3 @@ private:
#endif
-
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 8917c07759..8d8239611c 100755
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -410,6 +410,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
mOtherParticipantIsAvatar(true),
mStartCallOnInitialize(false),
mStartedAsIMCall(voice),
+ mIsDNDsend(false),
mAvatarNameCacheConnection()
{
// set P2P type by default
@@ -1353,7 +1354,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
// IM_SESSION_INVITE means that this is an Ad-hoc incoming chat
// (it can be also Group chat but it is checked above)
// In this case mInitialTargetIDs contains Ad-hoc session ID and it should not be added
- // to Recent People to prevent showing of an item with (???)(???). See EXT-8246.
+ // to Recent People to prevent showing of an item with (?? ?)(?? ?), sans the spaces. See EXT-8246.
// Concrete participants will be added into this list once they sent message in chat.
if (IM_SESSION_INVITE == dialog) return;
@@ -3315,6 +3316,38 @@ bool LLIMMgr::isVoiceCall(const LLUUID& session_id)
return im_session->mStartedAsIMCall;
}
+void LLIMMgr::updateDNDMessageStatus()
+{
+ if (LLIMModel::getInstance()->mId2SessionMap.empty()) return;
+
+ std::map<LLUUID, LLIMModel::LLIMSession*>::const_iterator it = LLIMModel::getInstance()->mId2SessionMap.begin();
+ for (; it != LLIMModel::getInstance()->mId2SessionMap.end(); ++it)
+ {
+ LLIMModel::LLIMSession* session = (*it).second;
+
+ if (session->isP2P())
+ {
+ setDNDMessageSent(session->mSessionID,false);
+ }
+ }
+}
+
+bool LLIMMgr::isDNDMessageSend(const LLUUID& session_id)
+{
+ LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (!im_session) return false;
+
+ return im_session->mIsDNDsend;
+}
+
+void LLIMMgr::setDNDMessageSent(const LLUUID& session_id, bool is_send)
+{
+ LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (!im_session) return;
+
+ im_session->mIsDNDsend = is_send;
+}
+
void LLIMMgr::addNotifiedNonFriendSessionID(const LLUUID& session_id)
{
mNotifiedNonFriendSessions.insert(session_id);
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 1426bada95..f92eff4845 100755
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -138,6 +138,8 @@ public:
bool mHasOfflineMessage;
+ bool mIsDNDsend;
+
private:
void onAdHocNameCache(const LLAvatarName& av_name);
@@ -441,6 +443,12 @@ public:
bool isVoiceCall(const LLUUID& session_id);
+ void updateDNDMessageStatus();
+
+ bool isDNDMessageSend(const LLUUID& session_id);
+
+ void setDNDMessageSent(const LLUUID& session_id, bool is_send);
+
void addNotifiedNonFriendSessionID(const LLUUID& session_id);
bool isNonFriendSessionNotified(const LLUUID& session_id);
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 5df28ccb73..87335cd5e6 100755
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -4593,6 +4593,10 @@ public:
virtual void changed(U32 mask)
{
mBridgep->refreshFolderViewItem();
+ if (mask & LLFriendObserver::ONLINE)
+ {
+ mBridgep->checkSearchBySuffixChanges();
+ }
}
protected:
LLCallingCardBridge* mBridgep;
@@ -4627,6 +4631,44 @@ void LLCallingCardBridge::refreshFolderViewItem()
}
}
+void LLCallingCardBridge::checkSearchBySuffixChanges()
+{
+ if (!mDisplayName.empty())
+ {
+ // changes in mDisplayName are processed by rename function and here it will be always same
+ // suffixes are also of fixed length, and we are processing change of one at a time,
+ // so it should be safe to use length (note: mSearchableName is capitalized)
+ S32 old_length = mSearchableName.length();
+ S32 new_length = mDisplayName.length() + getLabelSuffix().length();
+ if (old_length == new_length)
+ {
+ return;
+ }
+ mSearchableName.assign(mDisplayName);
+ mSearchableName.append(getLabelSuffix());
+ LLStringUtil::toUpper(mSearchableName);
+ if (new_length<old_length)
+ {
+ LLInventoryFilter* filter = getInventoryFilter();
+ if (filter && mPassedFilter && mSearchableName.find(filter->getFilterSubString()) == std::string::npos)
+ {
+ // string no longer contains substring
+ // we either have to update all parents manually or restart filter.
+ // dirtyFilter will not work here due to obsolete descendants' generations
+ getInventoryFilter()->setModified(LLFolderViewFilter::FILTER_MORE_RESTRICTIVE);
+ }
+ }
+ else
+ {
+ if (getInventoryFilter())
+ {
+ // mSearchableName became longer, we gained additional suffix and need to repeat filter check.
+ dirtyFilter();
+ }
+ }
+ }
+}
+
// virtual
void LLCallingCardBridge::performAction(LLInventoryModel* model, std::string action)
{
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 02134c7cc5..7dac830098 100755
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -421,6 +421,7 @@ public:
void* cargo_data,
std::string& tooltip_msg);
void refreshFolderViewItem();
+ void checkSearchBySuffixChanges();
protected:
LLCallingCardObserver* mObserver;
};
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index e74e58015a..a4a85e2e8d 100755
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -547,6 +547,14 @@ void LLInventoryPanel::modelChanged(U32 mask)
// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
view_item->addToFolder(new_parent);
addItemID(viewmodel_item->getUUID(), view_item);
+ if (mInventory)
+ {
+ const LLUUID trash_id = mInventory->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if (trash_id != model_item->getParentUUID() && (mask & LLInventoryObserver::INTERNAL) && new_parent->isOpen())
+ {
+ setSelection(item_id, FALSE);
+ }
+ }
}
else
{
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index 8e4950f5c2..b91e37d596 100755
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -190,7 +190,7 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
{
// decode is successful, we can safely proceed.
LLUUID old_id = LLUUID::null;
- if (!(optional_firstupdate == UT_FIRSTUSE) && !mWorldID.isNull())
+ if ((optional_firstupdate != UT_FIRSTUSE) && !mWorldID.isNull())
{
old_id = mWorldID;
}
@@ -206,15 +206,18 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
gTextureList.addImage(texture);
- if (!optional_firstupdate == UT_FIRSTUSE)
+ if (optional_firstupdate != UT_FIRSTUSE)
{
// seek out everything old_id uses and replace it with mWorldID
replaceIDs(old_id, mWorldID);
// remove old_id from gimagelist
LLViewerFetchedTexture* image = gTextureList.findImage(old_id);
- gTextureList.deleteImage(image);
- image->unref();
+ if (image != NULL)
+ {
+ gTextureList.deleteImage(image);
+ image->unref();
+ }
}
mUpdateRetries = LL_LOCAL_UPDATE_RETRIES;
@@ -824,6 +827,12 @@ LLLocalBitmapMgr::~LLLocalBitmapMgr()
{
}
+void LLLocalBitmapMgr::cleanupClass()
+{
+ std::for_each(sBitmapList.begin(), sBitmapList.end(), DeletePointer());
+ sBitmapList.clear();
+}
+
bool LLLocalBitmapMgr::addUnit()
{
bool add_successful = false;
diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h
index 47c077dcab..a15ea10801 100755
--- a/indra/newview/lllocalbitmaps.h
+++ b/indra/newview/lllocalbitmaps.h
@@ -117,6 +117,7 @@ class LLLocalBitmapMgr
~LLLocalBitmapMgr();
public:
+ static void cleanupClass();
static bool addUnit();
static void delUnit(LLUUID tracking_id);
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 8185cbb1a3..7861573908 100755
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -61,6 +61,7 @@
#include "llglheaders.h"
#include "lltrans.h"
#include "llvoavatarself.h"
+#include "llhudrender.h"
const F32 RADIUS_PIXELS = 100.f; // size in screen space
const F32 SQ_RADIUS = RADIUS_PIXELS * RADIUS_PIXELS;
@@ -452,6 +453,9 @@ BOOL LLManipRotate::handleMouseDownOnPart( S32 x, S32 y, MASK mask )
// Route future Mouse messages here preemptively. (Release on mouse up.)
setMouseCapture( TRUE );
LLSelectMgr::getInstance()->enableSilhouette(FALSE);
+
+ mHelpTextTimer.reset();
+ sNumTimesHelpTextShown++;
return TRUE;
}
@@ -1111,6 +1115,31 @@ void LLManipRotate::renderSnapGuides()
}
}
}
+
+
+ // render help text
+ if (mObjectSelection->getSelectType() != SELECT_TYPE_HUD)
+ {
+ if (mHelpTextTimer.getElapsedTimeF32() < sHelpTextVisibleTime + sHelpTextFadeTime && sNumTimesHelpTextShown < sMaxTimesShowHelpText)
+ {
+ LLVector3 selection_center_start = LLSelectMgr::getInstance()->getSavedBBoxOfSelection().getCenterAgent();
+
+ LLVector3 offset_dir = LLViewerCamera::getInstance()->getUpAxis();
+
+ F32 line_alpha = gSavedSettings.getF32("GridOpacity");
+
+ LLVector3 help_text_pos = selection_center_start + (mRadiusMeters * 3.f * offset_dir);
+ const LLFontGL* big_fontp = LLFontGL::getFontSansSerif();
+
+ std::string help_text = LLTrans::getString("manip_hint1");
+ LLColor4 help_text_color = LLColor4::white;
+ help_text_color.mV[VALPHA] = clamp_rescale(mHelpTextTimer.getElapsedTimeF32(), sHelpTextVisibleTime, sHelpTextVisibleTime + sHelpTextFadeTime, line_alpha, 0.f);
+ hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, false);
+ help_text = LLTrans::getString("manip_hint2");
+ help_text_pos -= offset_dir * mRadiusMeters * 0.4f;
+ hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, false);
+ }
+ }
}
// Returns TRUE if center of sphere is visible. Also sets a bunch of member variables that are used later (e.g. mCenterToCam)
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 8c531e476d..2810941d83 100755
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -59,16 +59,15 @@
#include "v2math.h"
#include "llvoavatar.h"
#include "llmeshrepository.h"
-
+#include "lltrans.h"
const F32 MAX_MANIP_SELECT_DISTANCE_SQUARED = 11.f * 11.f;
const F32 SNAP_GUIDE_SCREEN_OFFSET = 0.05f;
const F32 SNAP_GUIDE_SCREEN_LENGTH = 0.7f;
const F32 SELECTED_MANIPULATOR_SCALE = 1.2f;
const F32 MANIPULATOR_SCALE_HALF_LIFE = 0.07f;
-const S32 NUM_MANIPULATORS = 14;
-const LLManip::EManipPart MANIPULATOR_IDS[NUM_MANIPULATORS] =
+const LLManip::EManipPart MANIPULATOR_IDS[LLManipScale::NUM_MANIPULATORS] =
{
LLManip::LL_CORNER_NNN,
LLManip::LL_CORNER_NNP,
@@ -87,7 +86,7 @@ const LLManip::EManipPart MANIPULATOR_IDS[NUM_MANIPULATORS] =
};
-F32 get_default_max_prim_scale(bool is_flora)
+F32 get_default_max_prim_scale(bool is_flora)
{
// a bit of a hack, but if it's foilage, we don't want to use the
// new larger scale which would result in giant trees and grass
@@ -97,7 +96,7 @@ F32 get_default_max_prim_scale(bool is_flora)
return DEFAULT_MAX_PRIM_SCALE;
}
else
- {
+ {
return DEFAULT_MAX_PRIM_SCALE_NO_MESH;
}
}
@@ -143,18 +142,16 @@ inline void LLManipScale::conditionalHighlight( U32 part, const LLColor4* highli
LLColor4 default_highlight( 1.f, 1.f, 1.f, 1.f );
LLColor4 default_normal( 0.7f, 0.7f, 0.7f, 0.6f );
LLColor4 invisible(0.f, 0.f, 0.f, 0.f);
- F32 manipulator_scale = 1.f;
for (S32 i = 0; i < NUM_MANIPULATORS; i++)
{
if((U32)MANIPULATOR_IDS[i] == part)
{
- manipulator_scale = mManipulatorScales[i];
+ mScaledBoxHandleSize = mManipulatorScales[i] * mBoxHandleSize[i];
break;
}
}
- mScaledBoxHandleSize = mBoxHandleSize * manipulator_scale;
if (mManipPart != (S32)LL_NO_PART && mManipPart != (S32)part)
{
gGL.color4fv( invisible.mV );
@@ -179,9 +176,8 @@ void LLManipScale::handleSelect()
}
LLManipScale::LLManipScale( LLToolComposite* composite )
- :
+ :
LLManip( std::string("Scale"), composite ),
- mBoxHandleSize( 1.f ),
mScaledBoxHandleSize( 1.f ),
mLastMouseX( -1 ),
mLastMouseY( -1 ),
@@ -190,21 +186,22 @@ LLManipScale::LLManipScale( LLToolComposite* composite )
mScaleSnapUnit1(1.f),
mScaleSnapUnit2(1.f),
mSnapRegimeOffset(0.f),
+ mTickPixelSpacing1(0.f),
+ mTickPixelSpacing2(0.f),
mSnapGuideLength(0.f),
- mInSnapRegime(FALSE),
- mScaleSnapValue(0.f)
-{
- mManipulatorScales = new F32[NUM_MANIPULATORS];
+ mSnapRegime(SNAP_REGIME_NONE),
+ mScaleSnappedValue(0.f)
+{
for (S32 i = 0; i < NUM_MANIPULATORS; i++)
{
mManipulatorScales[i] = 1.f;
+ mBoxHandleSize[i] = 1.f;
}
}
LLManipScale::~LLManipScale()
{
for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
- delete[] mManipulatorScales;
}
void LLManipScale::render()
@@ -214,7 +211,8 @@ void LLManipScale::render()
LLGLDepthTest gls_depth(GL_TRUE);
LLGLEnable gl_blend(GL_BLEND);
LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
-
+ LLBBox bbox = LLSelectMgr::getInstance()->getBBoxOfSelection();
+
if( canAffectSelection() )
{
gGL.matrixMode(LLRender::MM_MODELVIEW);
@@ -226,51 +224,57 @@ void LLManipScale::render()
}
////////////////////////////////////////////////////////////////////////
- // Calculate size of drag handles
+ // Calculate size of drag handles
const F32 BOX_HANDLE_BASE_SIZE = 50.0f; // box size in pixels = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR
const F32 BOX_HANDLE_BASE_FACTOR = 0.2f;
-
+
LLVector3 center_agent = gAgent.getPosAgentFromGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal());
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
- mBoxHandleSize /= gAgentCamera.mHUDCurZoom;
+ for (S32 i = 0; i < NUM_MANIPULATORS; i++)
+ {
+ mBoxHandleSize[i] = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
+ mBoxHandleSize[i] /= gAgentCamera.mHUDCurZoom;
+ }
}
else
{
- F32 range_squared = dist_vec_squared(gAgentCamera.getCameraPositionAgent(), center_agent);
- F32 range_from_agent_squared = dist_vec_squared(gAgent.getPositionAgent(), center_agent);
-
- // Don't draw manip if object too far away
- if (gSavedSettings.getBOOL("LimitSelectDistance"))
+ for (S32 i = 0; i < NUM_MANIPULATORS; i++)
{
- F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance");
- if (range_from_agent_squared > max_select_distance * max_select_distance)
+ LLVector3 manipulator_pos = bbox.localToAgent(unitVectorToLocalBBoxExtent(partToUnitVector(MANIPULATOR_IDS[i]), bbox));
+ F32 range_squared = dist_vec_squared(gAgentCamera.getCameraPositionAgent(), manipulator_pos);
+ F32 range_from_agent_squared = dist_vec_squared(gAgent.getPositionAgent(), manipulator_pos);
+
+ // Don't draw manip if object too far away
+ if (gSavedSettings.getBOOL("LimitSelectDistance"))
{
- return;
+ F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance");
+ if (range_from_agent_squared > max_select_distance * max_select_distance)
+ {
+ return;
+ }
}
- }
- if (range_squared > 0.001f * 0.001f)
- {
- // range != zero
- F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
- F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians
- mBoxHandleSize = (F32) sqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR;
- }
- else
- {
- // range == zero
- mBoxHandleSize = BOX_HANDLE_BASE_FACTOR;
+ if (range_squared > 0.001f * 0.001f)
+ {
+ // range != zero
+ F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
+ F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians
+ mBoxHandleSize[i] = (F32) sqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR;
+ }
+ else
+ {
+ // range == zero
+ mBoxHandleSize[i] = BOX_HANDLE_BASE_FACTOR;
+ }
}
}
////////////////////////////////////////////////////////////////////////
// Draw bounding box
- LLBBox bbox = LLSelectMgr::getInstance()->getBBoxOfSelection();
LLVector3 pos_agent = bbox.getPositionAgent();
LLQuaternion rot = bbox.getRotation();
@@ -283,7 +287,7 @@ void LLManipScale::render()
rot.getAngleAxis(&angle_radians, &x, &y, &z);
gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
-
+
{
LLGLEnable poly_offset(GL_POLYGON_OFFSET_FILL);
glPolygonOffset( -2.f, -2.f);
@@ -345,7 +349,7 @@ BOOL LLManipScale::handleMouseDownOnPart( S32 x, S32 y, MASK mask )
LLBBox bbox = LLSelectMgr::getInstance()->getBBoxOfSelection();
LLVector3 box_center_agent = bbox.getCenterAgent();
LLVector3 box_corner_agent = bbox.localToAgent( unitVectorToLocalBBoxExtent( partToUnitVector( mManipPart ), bbox ) );
-
+
updateSnapGuides(bbox);
mDragStartPointGlobal = gAgent.getPosGlobalFromAgent(box_corner_agent);
@@ -372,27 +376,27 @@ BOOL LLManipScale::handleMouseUp(S32 x, S32 y, MASK mask)
if( hasMouseCapture() )
{
- if( (LL_FACE_MIN <= (S32)mManipPart)
+ if( (LL_FACE_MIN <= (S32)mManipPart)
&& ((S32)mManipPart <= LL_FACE_MAX) )
{
sendUpdates(TRUE,TRUE,FALSE);
}
else
- if( (LL_CORNER_MIN <= (S32)mManipPart)
+ if( (LL_CORNER_MIN <= (S32)mManipPart)
&& ((S32)mManipPart <= LL_CORNER_MAX) )
{
sendUpdates(TRUE,TRUE,TRUE);
}
-
+
//send texture update
LLSelectMgr::getInstance()->adjustTexturesByScale(TRUE, getStretchTextures());
-
+
LLSelectMgr::getInstance()->enableSilhouette(TRUE);
mManipPart = LL_NO_PART;
// Might have missed last update due to UPDATE_DELAY timing
LLSelectMgr::getInstance()->sendMultipleUpdate( mLastUpdateFlags );
-
+
//gAgent.setObjectTracking(gSavedSettings.getBOOL("TrackFocusObject"));
LLSelectMgr::getInstance()->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
}
@@ -417,11 +421,11 @@ BOOL LLManipScale::handleHover(S32 x, S32 y, MASK mask)
}
else
{
- mInSnapRegime = FALSE;
+ mSnapRegime = SNAP_REGIME_NONE;
// not dragging...
highlightManipulators(x, y);
}
-
+
// Patch up textures, if possible.
LLSelectMgr::getInstance()->adjustTexturesByScale(FALSE, getStretchTextures());
@@ -458,7 +462,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
LLMatrix4 projMatrix = LLViewerCamera::getInstance()->getProjection();
LLMatrix4 modelView = LLViewerCamera::getInstance()->getModelview();
transform.initAll(LLVector3(1.f, 1.f, 1.f), bbox.getRotation(), bbox.getPositionAgent());
-
+
transform *= modelView;
transform *= projMatrix;
}
@@ -477,7 +481,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
mManipulatorVertices[numManips++] = LLVector4(max.mV[VX], min.mV[VY], max.mV[VZ], 1.f);
mManipulatorVertices[numManips++] = LLVector4(max.mV[VX], max.mV[VY], min.mV[VZ], 1.f);
mManipulatorVertices[numManips++] = LLVector4(max.mV[VX], max.mV[VY], max.mV[VZ], 1.f);
-
+
// 1-D highlights are applicable iff one object is selected
if( mObjectSelection->getObjectCount() == 1 )
{
@@ -492,13 +496,13 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
mProjectedManipulators.clear();
-
+
for (S32 i = 0; i < numManips; i++)
{
LLVector4 projectedVertex = mManipulatorVertices[i] * transform;
projectedVertex = projectedVertex * (1.f / projectedVertex.mV[VW]);
- ManipulatorHandle* projManipulator = new ManipulatorHandle(LLVector3(projectedVertex.mV[VX], projectedVertex.mV[VY],
+ ManipulatorHandle* projManipulator = new ManipulatorHandle(LLVector3(projectedVertex.mV[VX], projectedVertex.mV[VY],
projectedVertex.mV[VZ]), MANIPULATOR_IDS[i], (i < 7) ? SCALE_MANIP_CORNER : SCALE_MANIP_FACE);
mProjectedManipulators.insert(projManipulator);
}
@@ -512,15 +516,15 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
mHighlightedPart = LL_NO_PART;
- for (minpulator_list_t::iterator iter = mProjectedManipulators.begin();
+ for (manipulator_list_t::iterator iter = mProjectedManipulators.begin();
iter != mProjectedManipulators.end(); ++iter)
{
ManipulatorHandle* manipulator = *iter;
{
- manip2d.setVec(manipulator->mPosition.mV[VX] * half_width, manipulator->mPosition.mV[VY] * half_height);
-
+ manip2d.set(manipulator->mPosition.mV[VX] * half_width, manipulator->mPosition.mV[VY] * half_height);
+
delta = manip2d - mousePos;
- if (delta.magVecSquared() < MAX_MANIP_SELECT_DISTANCE_SQUARED)
+ if (delta.lengthSquared() < MAX_MANIP_SELECT_DISTANCE_SQUARED)
{
mHighlightedPart = manipulator->mManipID;
@@ -549,36 +553,36 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
void LLManipScale::renderFaces( const LLBBox& bbox )
{
- // Don't bother to render the drag handles for 1-D scaling if
+ // Don't bother to render the drag handles for 1-D scaling if
// more than one object is selected or if it is an attachment
if ( mObjectSelection->getObjectCount() > 1 )
{
return;
}
- // This is a flattened representation of the box as render here
- // .
- // (+++) (++-) /|\t
- // +------------+ | (texture coordinates)
- // | | |
- // | 1 | (*) --->s
- // | +X |
+ // This is a flattened representation of the box as render here
+ // .
+ // (+++) (++-) /|\t
+ // +------------+ | (texture coordinates)
+ // | | |
+ // | 1 | (*) --->s
+ // | +X |
+ // | |
+ // (+++) (+-+)| |(+--) (++-) (+++)
+ // +------------+------------+------------+------------+
+ // |0 3|3 7|7 4|4 0|
+ // | 0 | 4 | 5 | 2 |
+ // | +Z | -Y | -Z | +Y |
+ // | | | | |
+ // |1 2|2 6|6 5|5 1|
+ // +------------+------------+------------+------------+
+ // (-++) (--+)| |(---) (-+-) (-++)
+ // | 3 |
+ // | -X |
// | |
- // (+++) (+-+)| |(+--) (++-) (+++)
- // +------------+------------+------------+------------+
- // |0 3|3 7|7 4|4 0|
- // | 0 | 4 | 5 | 2 |
- // | +Z | -Y | -Z | +Y |
- // | | | | |
- // |1 2|2 6|6 5|5 1|
- // +------------+------------+------------+------------+
- // (-++) (--+)| |(---) (-+-) (-++)
- // | 3 |
- // | -X |
- // | |
- // | |
- // +------------+
- // (-++) (-+-)
+ // | |
+ // +------------+
+ // (-++) (-+-)
LLColor4 highlight_color( 1.f, 1.f, 1.f, 0.5f);
LLColor4 normal_color( 1.f, 1.f, 1.f, 0.3f);
@@ -602,7 +606,7 @@ void LLManipScale::renderFaces( const LLBBox& bbox )
{
gGL.color4fv( default_normal_color.mV );
LLGLDepthTest gls_depth(GL_FALSE);
- gGL.begin(LLRender::QUADS);
+ gGL.begin(LLRender::QUADS);
{
// Face 0
gGL.vertex3f(min.mV[VX], max.mV[VY], max.mV[VZ]);
@@ -645,9 +649,9 @@ void LLManipScale::renderFaces( const LLBBox& bbox )
// Find nearest vertex
LLVector3 orientWRTHead = bbox.agentToLocalBasis( bbox.getCenterAgent() - gAgentCamera.getCameraPositionAgent() );
- U32 nearest =
- (orientWRTHead.mV[0] < 0.0f ? 1 : 0) +
- (orientWRTHead.mV[1] < 0.0f ? 2 : 0) +
+ U32 nearest =
+ (orientWRTHead.mV[0] < 0.0f ? 1 : 0) +
+ (orientWRTHead.mV[1] < 0.0f ? 2 : 0) +
(orientWRTHead.mV[2] < 0.0f ? 4 : 0);
// opposite faces on Linden cubes:
@@ -656,7 +660,7 @@ void LLManipScale::renderFaces( const LLBBox& bbox )
// 2 & 4
// Table of order to draw faces, based on nearest vertex
- static U32 face_list[8][6] = {
+ static U32 face_list[8][6] = {
{ 2,0,1, 4,5,3 }, // v6 F201 F453
{ 2,0,3, 4,5,1 }, // v7 F203 F451
{ 4,0,1, 2,5,3 }, // v5 F401 F253
@@ -677,32 +681,32 @@ void LLManipScale::renderFaces( const LLBBox& bbox )
{
case 0:
conditionalHighlight( LL_FACE_POSZ, &z_highlight_color, &z_normal_color );
- renderAxisHandle( ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], max.mV[VZ] ) );
+ renderAxisHandle( LL_FACE_POSZ, ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], max.mV[VZ] ) );
break;
case 1:
conditionalHighlight( LL_FACE_POSX, &x_highlight_color, &x_normal_color );
- renderAxisHandle( ctr, LLVector3( max.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) );
+ renderAxisHandle( LL_FACE_POSX, ctr, LLVector3( max.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) );
break;
case 2:
conditionalHighlight( LL_FACE_POSY, &y_highlight_color, &y_normal_color );
- renderAxisHandle( ctr, LLVector3( ctr.mV[VX], max.mV[VY], ctr.mV[VZ] ) );
+ renderAxisHandle( LL_FACE_POSY, ctr, LLVector3( ctr.mV[VX], max.mV[VY], ctr.mV[VZ] ) );
break;
case 3:
conditionalHighlight( LL_FACE_NEGX, &x_highlight_color, &x_normal_color );
- renderAxisHandle( ctr, LLVector3( min.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) );
+ renderAxisHandle( LL_FACE_NEGX, ctr, LLVector3( min.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) );
break;
case 4:
conditionalHighlight( LL_FACE_NEGY, &y_highlight_color, &y_normal_color );
- renderAxisHandle( ctr, LLVector3( ctr.mV[VX], min.mV[VY], ctr.mV[VZ] ) );
+ renderAxisHandle( LL_FACE_NEGY, ctr, LLVector3( ctr.mV[VX], min.mV[VY], ctr.mV[VZ] ) );
break;
case 5:
conditionalHighlight( LL_FACE_NEGZ, &z_highlight_color, &z_normal_color );
- renderAxisHandle( ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], min.mV[VZ] ) );
+ renderAxisHandle( LL_FACE_NEGZ, ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], min.mV[VZ] ) );
break;
}
}
@@ -712,10 +716,10 @@ void LLManipScale::renderFaces( const LLBBox& bbox )
void LLManipScale::renderEdges( const LLBBox& bbox )
{
LLVector3 extent = bbox.getExtentLocal();
- F32 edge_width = mBoxHandleSize * .6f;
for( U32 part = LL_EDGE_MIN; part <= LL_EDGE_MAX; part++ )
{
+ F32 edge_width = mBoxHandleSize[part] * .6f;
LLVector3 direction = edgeToUnitVector( part );
LLVector3 center_to_edge = unitVectorToLocalBBoxExtent( direction, bbox );
@@ -723,7 +727,7 @@ void LLManipScale::renderEdges( const LLBBox& bbox )
{
gGL.translatef( center_to_edge.mV[0], center_to_edge.mV[1], center_to_edge.mV[2] );
conditionalHighlight( part );
- gGL.scalef(
+ gGL.scalef(
direction.mV[0] ? edge_width : extent.mV[VX],
direction.mV[1] ? edge_width : extent.mV[VY],
direction.mV[2] ? edge_width : extent.mV[VZ] );
@@ -757,7 +761,7 @@ void LLManipScale::renderCorners( const LLBBox& bbox )
y_offset = bbox.getMaxLocal().mV[VY];
}
x_offset = bbox.getMaxLocal().mV[VX];
- }
+ }
}
@@ -776,14 +780,14 @@ void LLManipScale::renderBoxHandle( F32 x, F32 y, F32 z )
}
-void LLManipScale::renderAxisHandle( const LLVector3& start, const LLVector3& end )
+void LLManipScale::renderAxisHandle( U32 part, const LLVector3& start, const LLVector3& end )
{
if( getShowAxes() )
{
// Draws a single "jacks" style handle: a long, retangular box from start to end.
LLVector3 offset_start = end - start;
- offset_start.normVec();
- offset_start = start + mBoxHandleSize * offset_start;
+ offset_start.normalize();
+ offset_start = start + mBoxHandleSize[part] * offset_start;
LLVector3 delta = end - offset_start;
LLVector3 pos = offset_start + 0.5f * delta;
@@ -791,10 +795,10 @@ void LLManipScale::renderAxisHandle( const LLVector3& start, const LLVector3& en
gGL.pushMatrix();
{
gGL.translatef( pos.mV[VX], pos.mV[VY], pos.mV[VZ] );
- gGL.scalef(
- mBoxHandleSize + llabs(delta.mV[VX]),
- mBoxHandleSize + llabs(delta.mV[VY]),
- mBoxHandleSize + llabs(delta.mV[VZ]));
+ gGL.scalef(
+ mBoxHandleSize[part] + llabs(delta.mV[VX]),
+ mBoxHandleSize[part] + llabs(delta.mV[VY]),
+ mBoxHandleSize[part] + llabs(delta.mV[VZ]));
gBox.render();
}
gGL.popMatrix();
@@ -805,21 +809,20 @@ void LLManipScale::renderAxisHandle( const LLVector3& start, const LLVector3& en
}
}
-
+// General scale call
void LLManipScale::drag( S32 x, S32 y )
{
- if( (LL_FACE_MIN <= (S32)mManipPart)
+ if( (LL_FACE_MIN <= (S32)mManipPart)
&& ((S32)mManipPart <= LL_FACE_MAX) )
{
dragFace( x, y );
}
- else
- if( (LL_CORNER_MIN <= (S32)mManipPart)
+ else if( (LL_CORNER_MIN <= (S32)mManipPart)
&& ((S32)mManipPart <= LL_CORNER_MAX) )
{
dragCorner( x, y );
}
-
+
// store changes to override updates
for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin();
iter != LLSelectMgr::getInstance()->getSelection()->end(); iter++)
@@ -834,13 +837,13 @@ void LLManipScale::drag( S32 x, S32 y )
selectNode->mLastScale = cur->getScale();
selectNode->mLastPositionLocal = cur->getPosition();
}
- }
+ }
LLSelectMgr::getInstance()->updateSelectionCenter();
- gAgentCamera.clearFocusObject();
+ gAgentCamera.clearFocusObject();
}
-// Scale around the
+// Scale on three axis simultaneously
void LLManipScale::dragCorner( S32 x, S32 y )
{
// Suppress scale if mouse hasn't moved.
@@ -855,11 +858,11 @@ void LLManipScale::dragCorner( S32 x, S32 y )
LLVector3 drag_start_center_agent = gAgent.getPosAgentFromGlobal(mDragStartCenterGlobal);
LLVector3d drag_start_dir_d;
- drag_start_dir_d.setVec(mDragStartPointGlobal - mDragStartCenterGlobal);
+ drag_start_dir_d.set(mDragStartPointGlobal - mDragStartCenterGlobal);
F32 s = 0;
F32 t = 0;
- nearestPointOnLineFromMouse(x, y,
+ nearestPointOnLineFromMouse(x, y,
drag_start_center_agent,
drag_start_point_agent,
s, t );
@@ -888,22 +891,20 @@ void LLManipScale::dragCorner( S32 x, S32 y )
LLVector3 projected_drag_pos1 = inverse_projected_vec(mScaleDir, orthogonal_component(mouse_on_plane1, mSnapGuideDir1));
LLVector3 projected_drag_pos2 = inverse_projected_vec(mScaleDir, orthogonal_component(mouse_on_plane2, mSnapGuideDir2));
- LLVector3 mouse_offset_from_scale_line_1 = orthogonal_component(mouse_on_plane1, mScaleDir);
- LLVector3 mouse_offset_from_scale_line_2 = orthogonal_component(mouse_on_plane2, mScaleDir);
-
BOOL snap_enabled = gSavedSettings.getBOOL("SnapEnabled");
if (snap_enabled && (mouse_on_plane1 - projected_drag_pos1) * mSnapGuideDir1 > mSnapRegimeOffset)
{
- F32 drag_dist = projected_drag_pos1.length();
+ F32 drag_dist = mScaleDir * projected_drag_pos1; // Projecting the drag position allows for negative results, vs using the length which will result in a "reverse scaling" bug.
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(projected_drag_pos1, mScaleDir, mScaleSnapUnit1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos1, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
F32 snap_dist = mScaleSnapUnit1 / (2.f * cur_subdivisions);
F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions);
- mScaleSnapValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale);
+ mScaleSnappedValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale);
+ scale_factor = mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent);
+ mScaleSnappedValue /= mScaleSnapUnit1 * 2.f;
+ mSnapRegime = SNAP_REGIME_UPPER;
- mInSnapRegime = TRUE;
- scale_factor = mScaleSnapValue / dist_vec(drag_start_point_agent, drag_start_center_agent);
if (!uniform)
{
scale_factor *= 0.5f;
@@ -911,24 +912,25 @@ void LLManipScale::dragCorner( S32 x, S32 y )
}
else if (snap_enabled && (mouse_on_plane2 - projected_drag_pos2) * mSnapGuideDir2 > mSnapRegimeOffset )
{
- F32 drag_dist = projected_drag_pos2.length();
+ F32 drag_dist = mScaleDir * projected_drag_pos2; // Projecting the drag position allows for negative results, vs using the length which will result in a "reverse scaling" bug.
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(projected_drag_pos2, mScaleDir, mScaleSnapUnit2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + projected_drag_pos2, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
F32 snap_dist = mScaleSnapUnit2 / (2.f * cur_subdivisions);
F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit2 / cur_subdivisions);
- mScaleSnapValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale);
+ mScaleSnappedValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale);
+ scale_factor = mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent);
+ mScaleSnappedValue /= mScaleSnapUnit2 * 2.f;
+ mSnapRegime = SNAP_REGIME_LOWER;
- mInSnapRegime = TRUE;
- scale_factor = mScaleSnapValue / dist_vec(drag_start_point_agent, drag_start_center_agent);
if (!uniform)
{
scale_factor *= 0.5f;
}
}
- else
+ else
{
- mInSnapRegime = FALSE;
+ mSnapRegime = SNAP_REGIME_NONE;
scale_factor = t;
if (!uniform)
{
@@ -978,7 +980,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
const LLVector3& scale = selectNode->mSavedScale;
cur->setScale( scale_factor * scale );
-
+
LLVector3 delta_pos;
LLVector3 original_pos = cur->getPositionEdit();
LLVector3d new_pos_global = drag_global + (selectNode->mSavedPositionGlobal - drag_global) * scale_factor;
@@ -988,7 +990,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )
}
cur->setPositionAbsoluteGlobal( new_pos_global );
rebuild(cur);
-
+
delta_pos = cur->getPositionEdit() - original_pos;
if (selectNode->mIndividualSelection)
@@ -1029,7 +1031,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
const LLVector3& scale = selectNode->mSavedScale;
cur->setScale( scale_factor * scale, FALSE );
-
+
if (!selectNode->mIndividualSelection)
{
cur->setPosition(selectNode->mSavedPositionLocal * scale_factor);
@@ -1038,16 +1040,14 @@ void LLManipScale::dragCorner( S32 x, S32 y )
rebuild(cur);
}
}
-
}
-
+// Scale on a single axis
void LLManipScale::dragFace( S32 x, S32 y )
{
// Suppress scale if mouse hasn't moved.
if (x == mLastMouseX && y == mLastMouseY)
{
- // sendUpdates(TRUE,TRUE,FALSE);
return;
}
@@ -1060,9 +1060,9 @@ void LLManipScale::dragFace( S32 x, S32 y )
LLVector3 drag_start_center_agent = gAgent.getPosAgentFromGlobal(drag_start_center_global);
LLVector3d drag_start_dir_d;
- drag_start_dir_d.setVec(drag_start_point_global - drag_start_center_global);
+ drag_start_dir_d.set(drag_start_point_global - drag_start_center_global);
LLVector3 drag_start_dir_f;
- drag_start_dir_f.setVec(drag_start_dir_d);
+ drag_start_dir_f.set(drag_start_dir_d);
LLBBox bbox = LLSelectMgr::getInstance()->getBBoxOfSelection();
@@ -1106,26 +1106,26 @@ void LLManipScale::dragFace( S32 x, S32 y )
if (snap_enabled && dist_from_scale_line > mSnapRegimeOffset)
{
- mInSnapRegime = TRUE;
+ mSnapRegime = static_cast<ESnapRegimes>(SNAP_REGIME_UPPER | SNAP_REGIME_LOWER); // A face drag doesn't have split regimes.
- if (dist_along_scale_line > max_drag_dist)
+ if (dist_along_scale_line > max_drag_dist)
{
- mScaleSnapValue = max_drag_dist;
+ mScaleSnappedValue = max_drag_dist;
LLVector3 clamp_point = mScaleCenter + max_drag_dist * mScaleDir;
- drag_delta.setVec(clamp_point - drag_start_point_agent);
+ drag_delta.set(clamp_point - drag_start_point_agent);
}
else if (dist_along_scale_line < min_drag_dist)
{
- mScaleSnapValue = min_drag_dist;
+ mScaleSnappedValue = min_drag_dist;
LLVector3 clamp_point = mScaleCenter + min_drag_dist * mScaleDir;
- drag_delta.setVec(clamp_point - drag_start_point_agent);
+ drag_delta.set(clamp_point - drag_start_point_agent);
}
else
{
F32 drag_dist = scale_center_to_mouse * mScaleDir;
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + mScaleDir * drag_dist, mScaleDir, mScaleSnapUnit1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ F32 cur_subdivisions = llclamp(getSubdivisionLevel(mScaleCenter + mScaleDir * drag_dist, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
F32 snap_dist = mScaleSnapUnit1 / (2.f * cur_subdivisions);
F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions);
relative_snap_dist -= snap_dist;
@@ -1139,7 +1139,7 @@ void LLManipScale::dragFace( S32 x, S32 y )
drag_dist - max_drag_dist,
drag_dist - min_drag_dist);
- mScaleSnapValue = drag_dist - relative_snap_dist;
+ mScaleSnappedValue = (drag_dist - relative_snap_dist) / (mScaleSnapUnit1 * 2.f);
if (llabs(relative_snap_dist) < snap_dist)
{
@@ -1153,9 +1153,9 @@ void LLManipScale::dragFace( S32 x, S32 y )
}
}
}
- else
+ else
{
- mInSnapRegime = FALSE;
+ mSnapRegime = SNAP_REGIME_NONE;
}
LLVector3 dir_agent;
@@ -1171,7 +1171,7 @@ void LLManipScale::dragFace( S32 x, S32 y )
{
dir_agent = bbox.localToAgentBasis( LLVector3::z_axis );
}
- stretchFace(
+ stretchFace(
projected_vec(drag_start_dir_f, dir_agent) + drag_start_center_agent,
projected_vec(drag_delta, dir_agent));
@@ -1190,7 +1190,7 @@ void LLManipScale::sendUpdates( BOOL send_position_update, BOOL send_scale_updat
U32 update_flags = UPD_NONE;
if (send_position_update) update_flags |= UPD_POSITION;
if (send_scale_update) update_flags |= UPD_SCALE;
-
+
// BOOL send_type = SEND_INDIVIDUALS;
if (corner)
{
@@ -1238,7 +1238,7 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto
S32 axis_index = axis.mV[0] ? 0 : (axis.mV[1] ? 1 : 2 );
LLVector3 delta_local = end_local - start_local;
- F32 delta_local_mag = delta_local.magVec();
+ F32 delta_local_mag = delta_local.length();
LLVector3 dir_local;
if (delta_local_mag == 0.f)
{
@@ -1258,13 +1258,13 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto
LLVector3 scale = cur->getScale();
scale.mV[axis_index] = desired_scale;
cur->setScale(scale, FALSE);
- rebuild(cur);
+ rebuild(cur);
LLVector3 delta_pos;
if( !getUniform() )
{
LLVector3 delta_pos_local = axis * (0.5f * desired_delta_size);
LLVector3d delta_pos_global;
- delta_pos_global.setVec(cur_bbox.localToAgent( delta_pos_local ) - cur_bbox.getCenterAgent());
+ delta_pos_global.set(cur_bbox.localToAgent( delta_pos_local ) - cur_bbox.getCenterAgent());
LLVector3 cur_pos = cur->getPositionEdit();
if (cur->isRootEdit() && !cur->isAttachment())
@@ -1313,7 +1313,7 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto
void LLManipScale::renderGuidelinesPart( const LLBBox& bbox )
{
LLVector3 guideline_start = bbox.getCenterLocal();
-
+
LLVector3 guideline_end = unitVectorToLocalBBoxExtent( partToUnitVector( mManipPart ), bbox );
if (!getUniform())
@@ -1322,7 +1322,7 @@ void LLManipScale::renderGuidelinesPart( const LLBBox& bbox )
}
guideline_end -= guideline_start;
- guideline_end.normVec();
+ guideline_end.normalize();
guideline_end *= LLWorld::getInstance()->getRegionWidthInMeters();
guideline_end += guideline_start;
@@ -1343,26 +1343,27 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
LLQuaternion grid_rotation;
LLSelectMgr::getInstance()->getGrid(grid_origin, grid_rotation, grid_scale);
+ bool uniform = LLManipScale::getUniform();
+
LLVector3 box_corner_agent = bbox.localToAgent(unitVectorToLocalBBoxExtent( partToUnitVector( mManipPart ), bbox ));
- mScaleCenter = getUniform() ? bbox.getCenterAgent() : bbox.localToAgent(unitVectorToLocalBBoxExtent( -1.f * partToUnitVector( mManipPart ), bbox ));
+ mScaleCenter = uniform ? bbox.getCenterAgent() : bbox.localToAgent(unitVectorToLocalBBoxExtent( -1.f * partToUnitVector( mManipPart ), bbox ));
mScaleDir = box_corner_agent - mScaleCenter;
- mScaleDir.normVec();
+ mScaleDir.normalize();
if(mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
mSnapRegimeOffset = SNAP_GUIDE_SCREEN_OFFSET / gAgentCamera.mHUDCurZoom;
-
}
else
{
- F32 object_distance = dist_vec(mScaleCenter, LLViewerCamera::getInstance()->getOrigin());
+ F32 object_distance = dist_vec(box_corner_agent, LLViewerCamera::getInstance()->getOrigin());
mSnapRegimeOffset = (SNAP_GUIDE_SCREEN_OFFSET * gViewerWindow->getWorldViewWidthRaw() * object_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
}
LLVector3 cam_at_axis;
F32 snap_guide_length;
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- cam_at_axis.setVec(1.f, 0.f, 0.f);
+ cam_at_axis.set(1.f, 0.f, 0.f);
snap_guide_length = SNAP_GUIDE_SCREEN_LENGTH / gAgentCamera.mHUDCurZoom;
}
else
@@ -1371,22 +1372,21 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
F32 manipulator_distance = dist_vec(box_corner_agent, LLViewerCamera::getInstance()->getOrigin());
snap_guide_length = (SNAP_GUIDE_SCREEN_LENGTH * gViewerWindow->getWorldViewWidthRaw() * manipulator_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
}
-
+
mSnapGuideLength = snap_guide_length / llmax(0.1f, (llmin(mSnapGuideDir1 * cam_at_axis, mSnapGuideDir2 * cam_at_axis)));
LLVector3 off_axis_dir = mScaleDir % cam_at_axis;
- off_axis_dir.normVec();
+ off_axis_dir.normalize();
if( (LL_FACE_MIN <= (S32)mManipPart) && ((S32)mManipPart <= LL_FACE_MAX) )
{
- LLVector3 object_scale = bbox.getMaxLocal();
- object_scale.scaleVec(off_axis_dir * ~bbox.getRotation());
- object_scale.abs();
- if (object_scale.mV[VX] > object_scale.mV[VY] && object_scale.mV[VX] > object_scale.mV[VZ])
+ LLVector3 bbox_relative_cam_dir = off_axis_dir * ~bbox.getRotation();
+ bbox_relative_cam_dir.abs();
+ if (bbox_relative_cam_dir.mV[VX] > bbox_relative_cam_dir.mV[VY] && bbox_relative_cam_dir.mV[VX] > bbox_relative_cam_dir.mV[VZ])
{
mSnapGuideDir1 = LLVector3::x_axis * bbox.getRotation();
}
- else if (object_scale.mV[VY] > object_scale.mV[VZ])
+ else if (bbox_relative_cam_dir.mV[VY] > bbox_relative_cam_dir.mV[VZ])
{
mSnapGuideDir1 = LLVector3::y_axis * bbox.getRotation();
}
@@ -1396,7 +1396,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
}
LLVector3 scale_snap = grid_scale;
- mScaleSnapUnit1 = scale_snap.scaleVec(partToUnitVector( mManipPart )).magVec();
+ mScaleSnapUnit1 = scale_snap.scaleVec(partToUnitVector( mManipPart )).length();
mScaleSnapUnit2 = mScaleSnapUnit1;
mSnapGuideDir1 *= mSnapGuideDir1 * LLViewerCamera::getInstance()->getUpAxis() > 0.f ? 1.f : -1.f;
mSnapGuideDir2 = mSnapGuideDir1 * -1.f;
@@ -1405,7 +1405,6 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
}
else if( (LL_CORNER_MIN <= (S32)mManipPart) && ((S32)mManipPart <= LL_CORNER_MAX) )
{
- LLVector3 local_scale_dir = partToUnitVector( mManipPart );
LLVector3 local_camera_dir;
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
@@ -1413,74 +1412,133 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
}
else
{
- local_camera_dir = (LLViewerCamera::getInstance()->getOrigin() - bbox.getCenterAgent()) * ~bbox.getRotation();
- local_camera_dir.normVec();
- }
- local_scale_dir -= projected_vec(local_scale_dir, local_camera_dir);
- local_scale_dir.normVec();
- LLVector3 x_axis_proj_camera = LLVector3::x_axis - projected_vec(LLVector3::x_axis, local_camera_dir);
- x_axis_proj_camera.normVec();
- LLVector3 y_axis_proj_camera = LLVector3::y_axis - projected_vec(LLVector3::y_axis, local_camera_dir);
- y_axis_proj_camera.normVec();
- LLVector3 z_axis_proj_camera = LLVector3::z_axis - projected_vec(LLVector3::z_axis, local_camera_dir);
- z_axis_proj_camera.normVec();
- F32 x_axis_proj = llabs(local_scale_dir * x_axis_proj_camera);
- F32 y_axis_proj = llabs(local_scale_dir * y_axis_proj_camera);
- F32 z_axis_proj = llabs(local_scale_dir * z_axis_proj_camera);
-
- if (x_axis_proj > y_axis_proj && x_axis_proj > z_axis_proj)
- {
- mSnapGuideDir1 = LLVector3::y_axis;
- mScaleSnapUnit2 = grid_scale.mV[VY];
- mSnapGuideDir2 = LLVector3::z_axis;
- mScaleSnapUnit1 = grid_scale.mV[VZ];
- }
- else if (y_axis_proj > z_axis_proj)
- {
- mSnapGuideDir1 = LLVector3::x_axis;
- mScaleSnapUnit2 = grid_scale.mV[VX];
- mSnapGuideDir2 = LLVector3::z_axis;
- mScaleSnapUnit1 = grid_scale.mV[VZ];
- }
- else
- {
- mSnapGuideDir1 = LLVector3::x_axis;
- mScaleSnapUnit2 = grid_scale.mV[VX];
- mSnapGuideDir2 = LLVector3::y_axis;
- mScaleSnapUnit1 = grid_scale.mV[VY];
+ local_camera_dir = (LLViewerCamera::getInstance()->getOrigin() - box_corner_agent) * ~bbox.getRotation();
+ local_camera_dir.normalize();
}
- LLVector3 snap_guide_flip(1.f, 1.f, 1.f);
+ LLVector3 axis_flip;
switch (mManipPart)
{
case LL_CORNER_NNN:
+ axis_flip.set(1.f, 1.f, 1.f);
break;
case LL_CORNER_NNP:
- snap_guide_flip.setVec(1.f, 1.f, -1.f);
+ axis_flip.set(1.f, 1.f, -1.f);
break;
case LL_CORNER_NPN:
- snap_guide_flip.setVec(1.f, -1.f, 1.f);
+ axis_flip.set(1.f, -1.f, 1.f);
break;
case LL_CORNER_NPP:
- snap_guide_flip.setVec(1.f, -1.f, -1.f);
+ axis_flip.set(1.f, -1.f, -1.f);
break;
case LL_CORNER_PNN:
- snap_guide_flip.setVec(-1.f, 1.f, 1.f);
+ axis_flip.set(-1.f, 1.f, 1.f);
break;
case LL_CORNER_PNP:
- snap_guide_flip.setVec(-1.f, 1.f, -1.f);
+ axis_flip.set(-1.f, 1.f, -1.f);
break;
case LL_CORNER_PPN:
- snap_guide_flip.setVec(-1.f, -1.f, 1.f);
+ axis_flip.set(-1.f, -1.f, 1.f);
break;
case LL_CORNER_PPP:
- snap_guide_flip.setVec(-1.f, -1.f, -1.f);
+ axis_flip.set(-1.f, -1.f, -1.f);
+ break;
+ default:
+ break;
+ }
+
+ // account for which side of the object the camera is located and negate appropriate axes
+ local_camera_dir.scaleVec(axis_flip);
+
+ // normalize to object scale
+ LLVector3 bbox_extent = bbox.getExtentLocal();
+ local_camera_dir.scaleVec(LLVector3(1.f / bbox_extent.mV[VX], 1.f / bbox_extent.mV[VY], 1.f / bbox_extent.mV[VZ]));
+
+ S32 scale_face = -1;
+
+ if ((local_camera_dir.mV[VX] > 0.f) == (local_camera_dir.mV[VY] > 0.f))
+ {
+ if ((local_camera_dir.mV[VZ] > 0.f) == (local_camera_dir.mV[VY] > 0.f))
+ {
+ LLVector3 local_camera_dir_abs = local_camera_dir;
+ local_camera_dir_abs.abs();
+ // all neighboring faces of bbox are pointing towards camera or away from camera
+ // use largest magnitude face for snap guides
+ if (local_camera_dir_abs.mV[VX] > local_camera_dir_abs.mV[VY])
+ {
+ if (local_camera_dir_abs.mV[VX] > local_camera_dir_abs.mV[VZ])
+ {
+ scale_face = VX;
+ }
+ else
+ {
+ scale_face = VZ;
+ }
+ }
+ else // y > x
+ {
+ if (local_camera_dir_abs.mV[VY] > local_camera_dir_abs.mV[VZ])
+ {
+ scale_face = VY;
+ }
+ else
+ {
+ scale_face = VZ;
+ }
+ }
+ }
+ else
+ {
+ // z axis facing opposite direction from x and y relative to camera, use x and y for snap guides
+ scale_face = VZ;
+ }
+ }
+ else // x and y axes are facing in opposite directions relative to camera
+ {
+ if ((local_camera_dir.mV[VZ] > 0.f) == (local_camera_dir.mV[VY] > 0.f))
+ {
+ // x axis facing opposite direction from y and z relative to camera, use y and z for snap guides
+ scale_face = VX;
+ }
+ else
+ {
+ // y axis facing opposite direction from x and z relative to camera, use x and z for snap guides
+ scale_face = VY;
+ }
+ }
+
+ switch(scale_face)
+ {
+ case VX:
+ // x axis face being scaled, use y and z for snap guides
+ mSnapGuideDir1 = LLVector3::y_axis.scaledVec(axis_flip);
+ mScaleSnapUnit1 = grid_scale.mV[VZ];
+ mSnapGuideDir2 = LLVector3::z_axis.scaledVec(axis_flip);
+ mScaleSnapUnit2 = grid_scale.mV[VY];
+ break;
+ case VY:
+ // y axis facing being scaled, use x and z for snap guides
+ mSnapGuideDir1 = LLVector3::x_axis.scaledVec(axis_flip);
+ mScaleSnapUnit1 = grid_scale.mV[VZ];
+ mSnapGuideDir2 = LLVector3::z_axis.scaledVec(axis_flip);
+ mScaleSnapUnit2 = grid_scale.mV[VX];
+ break;
+ case VZ:
+ // z axis facing being scaled, use x and y for snap guides
+ mSnapGuideDir1 = LLVector3::x_axis.scaledVec(axis_flip);
+ mScaleSnapUnit1 = grid_scale.mV[VY];
+ mSnapGuideDir2 = LLVector3::y_axis.scaledVec(axis_flip);
+ mScaleSnapUnit2 = grid_scale.mV[VX];
break;
default:
+ mSnapGuideDir1.setZero();
+ mScaleSnapUnit1 = 0.f;
+
+ mSnapGuideDir2.setZero();
+ mScaleSnapUnit2 = 0.f;
break;
}
- mSnapGuideDir1.scaleVec(snap_guide_flip);
- mSnapGuideDir2.scaleVec(snap_guide_flip);
+
mSnapGuideDir1.rotVec(bbox.getRotation());
mSnapGuideDir2.rotVec(bbox.getRotation());
mSnapDir1 = -1.f * mSnapGuideDir2;
@@ -1488,13 +1546,22 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
}
mScalePlaneNormal1 = mSnapGuideDir1 % mScaleDir;
- mScalePlaneNormal1.normVec();
+ mScalePlaneNormal1.normalize();
mScalePlaneNormal2 = mSnapGuideDir2 % mScaleDir;
- mScalePlaneNormal2.normVec();
+ mScalePlaneNormal2.normalize();
mScaleSnapUnit1 = mScaleSnapUnit1 / (mSnapDir1 * mScaleDir);
mScaleSnapUnit2 = mScaleSnapUnit2 / (mSnapDir2 * mScaleDir);
+
+ mTickPixelSpacing1 = llround((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir1).length());
+ mTickPixelSpacing2 = llround((F32)MIN_DIVISION_PIXEL_WIDTH / (mScaleDir % mSnapGuideDir2).length());
+
+ if (uniform)
+ {
+ mScaleSnapUnit1 *= 0.5f;
+ mScaleSnapUnit2 *= 0.5f;
+ }
}
void LLManipScale::renderSnapGuides(const LLBBox& bbox)
@@ -1504,7 +1571,6 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
return;
}
- F32 max_subdivisions = sGridMaxSubdivisionLevel;
F32 grid_alpha = gSavedSettings.getF32("GridOpacity");
F32 max_point_on_scale_line = partToMaxScale(mManipPart, bbox);
@@ -1518,10 +1584,10 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
LLColor4 tick_color = setupSnapGuideRenderPass(pass);
gGL.begin(LLRender::LINES);
- LLVector3 line_mid = mScaleCenter + (mScaleSnapValue * mScaleDir) + (mSnapGuideDir1 * mSnapRegimeOffset);
- LLVector3 line_start = line_mid - (mScaleDir * (llmin(mScaleSnapValue, mSnapGuideLength * 0.5f)));
- LLVector3 line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnapValue, mSnapGuideLength * 0.5f));
-
+ LLVector3 line_mid = mScaleCenter + (mScaleSnappedValue * mScaleDir) + (mSnapGuideDir1 * mSnapRegimeOffset);
+ LLVector3 line_start = line_mid - (mScaleDir * (llmin(mScaleSnappedValue, mSnapGuideLength * 0.5f)));
+ LLVector3 line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnappedValue, mSnapGuideLength * 0.5f));
+
gGL.color4f(tick_color.mV[VRED], tick_color.mV[VGREEN], tick_color.mV[VBLUE], tick_color.mV[VALPHA] * 0.1f);
gGL.vertex3fv(line_start.mV);
gGL.color4fv(tick_color.mV);
@@ -1530,9 +1596,9 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
gGL.color4f(tick_color.mV[VRED], tick_color.mV[VGREEN], tick_color.mV[VBLUE], tick_color.mV[VALPHA] * 0.1f);
gGL.vertex3fv(line_end.mV);
- line_mid = mScaleCenter + (mScaleSnapValue * mScaleDir) + (mSnapGuideDir2 * mSnapRegimeOffset);
- line_start = line_mid - (mScaleDir * (llmin(mScaleSnapValue, mSnapGuideLength * 0.5f)));
- line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnapValue, mSnapGuideLength * 0.5f));
+ line_mid = mScaleCenter + (mScaleSnappedValue * mScaleDir) + (mSnapGuideDir2 * mSnapRegimeOffset);
+ line_start = line_mid - (mScaleDir * (llmin(mScaleSnappedValue, mSnapGuideLength * 0.5f)));
+ line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnappedValue, mSnapGuideLength * 0.5f));
gGL.vertex3fv(line_start.mV);
gGL.color4fv(tick_color.mV);
gGL.vertex3fv(line_mid.mV);
@@ -1545,31 +1611,38 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
{
LLGLDepthTest gls_depth(GL_FALSE);
- F32 dist_grid_axis = (drag_point - mScaleCenter) * mScaleDir;
+ F32 dist_grid_axis = llmax(0.f, (drag_point - mScaleCenter) * mScaleDir);
+
+ F32 smallest_subdivision1 = mScaleSnapUnit1 / sGridMaxSubdivisionLevel;
+ F32 smallest_subdivision2 = mScaleSnapUnit2 / sGridMaxSubdivisionLevel;
+
+ F32 dist_scale_units_1 = dist_grid_axis / smallest_subdivision1;
+ F32 dist_scale_units_2 = dist_grid_axis / smallest_subdivision2;
+
// find distance to nearest smallest grid unit
- F32 grid_offset1 = fmodf(dist_grid_axis, mScaleSnapUnit1 / max_subdivisions);
- F32 grid_offset2 = fmodf(dist_grid_axis, mScaleSnapUnit2 / max_subdivisions);
+ F32 grid_multiple1 = llfloor(dist_scale_units_1);
+ F32 grid_multiple2 = llfloor(dist_scale_units_2);
+ F32 grid_offset1 = fmodf(dist_grid_axis, smallest_subdivision1);
+ F32 grid_offset2 = fmodf(dist_grid_axis, smallest_subdivision2);
// how many smallest grid units are we away from largest grid scale?
- S32 sub_div_offset_1 = llround(fmod(dist_grid_axis - grid_offset1, mScaleSnapUnit1 / sGridMinSubdivisionLevel) / (mScaleSnapUnit1 / max_subdivisions));
- S32 sub_div_offset_2 = llround(fmod(dist_grid_axis - grid_offset2, mScaleSnapUnit2 / sGridMinSubdivisionLevel) / (mScaleSnapUnit2 / max_subdivisions));
+ S32 sub_div_offset_1 = llround(fmod(dist_grid_axis - grid_offset1, mScaleSnapUnit1 / sGridMinSubdivisionLevel) / smallest_subdivision1);
+ S32 sub_div_offset_2 = llround(fmod(dist_grid_axis - grid_offset2, mScaleSnapUnit2 / sGridMinSubdivisionLevel) / smallest_subdivision2);
- S32 num_ticks_per_side1 = llmax(1, lltrunc(0.5f * mSnapGuideLength / (mScaleSnapUnit1 / max_subdivisions)));
- S32 num_ticks_per_side2 = llmax(1, lltrunc(0.5f * mSnapGuideLength / (mScaleSnapUnit2 / max_subdivisions)));
- F32 dist_scale_units_1 = dist_grid_axis / (mScaleSnapUnit1 / max_subdivisions);
- F32 dist_scale_units_2 = dist_grid_axis / (mScaleSnapUnit2 / max_subdivisions);
+ S32 num_ticks_per_side1 = llmax(1, lltrunc(0.5f * mSnapGuideLength / smallest_subdivision1));
+ S32 num_ticks_per_side2 = llmax(1, lltrunc(0.5f * mSnapGuideLength / smallest_subdivision2));
S32 ticks_from_scale_center_1 = lltrunc(dist_scale_units_1);
S32 ticks_from_scale_center_2 = lltrunc(dist_scale_units_2);
- S32 max_ticks1 = llceil(max_point_on_scale_line / (mScaleSnapUnit1 / max_subdivisions) - dist_scale_units_1);
- S32 max_ticks2 = llceil(max_point_on_scale_line / (mScaleSnapUnit2 / max_subdivisions) - dist_scale_units_2);
+ S32 max_ticks1 = llceil(max_point_on_scale_line / smallest_subdivision1 - dist_scale_units_1);
+ S32 max_ticks2 = llceil(max_point_on_scale_line / smallest_subdivision2 - dist_scale_units_2);
S32 start_tick = 0;
S32 stop_tick = 0;
- if (mInSnapRegime)
+ if (mSnapRegime != SNAP_REGIME_NONE)
{
// draw snap guide line
gGL.begin(LLRender::LINES);
- LLVector3 snap_line_center = mScaleCenter + (mScaleSnapValue * mScaleDir);
+ LLVector3 snap_line_center = bbox.localToAgent(unitVectorToLocalBBoxExtent( partToUnitVector( mManipPart ), bbox ));
LLVector3 snap_line_start = snap_line_center + (mSnapGuideDir1 * mSnapRegimeOffset);
LLVector3 snap_line_end = snap_line_center + (mSnapGuideDir2 * mSnapRegimeOffset);
@@ -1591,22 +1664,22 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
LLVector3 arrow_span = mScaleDir;
arrow_dir = snap_line_start - snap_line_center;
- arrow_dir.normVec();
- gGL.vertex3fv((snap_line_start + arrow_dir * mBoxHandleSize).mV);
- gGL.vertex3fv((snap_line_start + arrow_span * mBoxHandleSize).mV);
- gGL.vertex3fv((snap_line_start - arrow_span * mBoxHandleSize).mV);
+ arrow_dir.normalize();
+ gGL.vertex3fv((snap_line_start + arrow_dir * mSnapRegimeOffset * 0.1f).mV);
+ gGL.vertex3fv((snap_line_start + arrow_span * mSnapRegimeOffset * 0.1f).mV);
+ gGL.vertex3fv((snap_line_start - arrow_span * mSnapRegimeOffset * 0.1f).mV);
arrow_dir = snap_line_end - snap_line_center;
- arrow_dir.normVec();
- gGL.vertex3fv((snap_line_end + arrow_dir * mBoxHandleSize).mV);
- gGL.vertex3fv((snap_line_end + arrow_span * mBoxHandleSize).mV);
- gGL.vertex3fv((snap_line_end - arrow_span * mBoxHandleSize).mV);
+ arrow_dir.normalize();
+ gGL.vertex3fv((snap_line_end + arrow_dir * mSnapRegimeOffset * 0.1f).mV);
+ gGL.vertex3fv((snap_line_end + arrow_span * mSnapRegimeOffset * 0.1f).mV);
+ gGL.vertex3fv((snap_line_end - arrow_span * mSnapRegimeOffset * 0.1f).mV);
}
gGL.end();
}
-
+
LLVector2 screen_translate_axis(llabs(mScaleDir * LLViewerCamera::getInstance()->getLeftAxis()), llabs(mScaleDir * LLViewerCamera::getInstance()->getUpAxis()));
- screen_translate_axis.normVec();
+ screen_translate_axis.normalize();
S32 tick_label_spacing = llround(screen_translate_axis * sTickLabelSpacing);
@@ -1622,17 +1695,17 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
for (S32 i = start_tick; i <= stop_tick; i++)
{
F32 alpha = (1.f - (1.f * ((F32)llabs(i) / (F32)num_ticks_per_side1)));
- LLVector3 tick_pos = drag_point + (mScaleDir * (mScaleSnapUnit1 / max_subdivisions * (F32)i - grid_offset1));
+ LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple1 + i) * smallest_subdivision1);
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, mTickPixelSpacing1), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
- if (fmodf((F32)(i + sub_div_offset_1), (max_subdivisions / cur_subdivisions)) != 0.f)
+ if (fmodf((F32)(i + sub_div_offset_1), (sGridMaxSubdivisionLevel / cur_subdivisions)) != 0.f)
{
continue;
}
F32 tick_scale = 1.f;
- for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
+ for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
{
if (fmodf((F32)(i + sub_div_offset_1), division_level) == 0.f)
{
@@ -1655,17 +1728,17 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
for (S32 i = start_tick; i <= stop_tick; i++)
{
F32 alpha = (1.f - (1.f * ((F32)llabs(i) / (F32)num_ticks_per_side2)));
- LLVector3 tick_pos = drag_point + (mScaleDir * (mScaleSnapUnit2 / max_subdivisions * (F32)i - grid_offset2));
-
- F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
+ LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple2 + i) * smallest_subdivision2);
+
+ F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, mTickPixelSpacing2), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel);
- if (fmodf((F32)(i + sub_div_offset_2), (max_subdivisions / cur_subdivisions)) != 0.f)
+ if (fmodf((F32)(i + sub_div_offset_2), (sGridMaxSubdivisionLevel / cur_subdivisions)) != 0.f)
{
continue;
}
F32 tick_scale = 1.f;
- for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
+ for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
{
if (fmodf((F32)(i + sub_div_offset_2), division_level) == 0.f)
{
@@ -1683,21 +1756,21 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
gGL.end();
}
- // render tick labels
+ // render upper tick labels
start_tick = -(llmin(ticks_from_scale_center_1, num_ticks_per_side1));
stop_tick = llmin(max_ticks1, num_ticks_per_side1);
F32 grid_resolution = mObjectSelection->getSelectType() == SELECT_TYPE_HUD ? 0.25f : llmax(gSavedSettings.getF32("GridResolution"), 0.001f);
- S32 label_sub_div_offset_1 = llround(fmod(dist_grid_axis - grid_offset1, mScaleSnapUnit1 * 32.f) / (mScaleSnapUnit1 / max_subdivisions));
- S32 label_sub_div_offset_2 = llround(fmod(dist_grid_axis - grid_offset2, mScaleSnapUnit2 * 32.f) / (mScaleSnapUnit2 / max_subdivisions));
+ S32 label_sub_div_offset_1 = llround(fmod(dist_grid_axis - grid_offset1, mScaleSnapUnit1 * 32.f) / smallest_subdivision1);
+ S32 label_sub_div_offset_2 = llround(fmod(dist_grid_axis - grid_offset2, mScaleSnapUnit2 * 32.f) / smallest_subdivision2);
for (S32 i = start_tick; i <= stop_tick; i++)
{
F32 tick_scale = 1.f;
F32 alpha = grid_alpha * (1.f - (0.5f * ((F32)llabs(i) / (F32)num_ticks_per_side1)));
- LLVector3 tick_pos = drag_point + (mScaleDir * (mScaleSnapUnit1 / max_subdivisions * (F32)i - grid_offset1));
+ LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple1 + i) * smallest_subdivision1);
- for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
+ for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
{
if (fmodf((F32)(i + label_sub_div_offset_1), division_level) == 0.f)
{
@@ -1706,39 +1779,34 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
tick_scale *= 0.7f;
}
- if (fmodf((F32)(i + label_sub_div_offset_1), (max_subdivisions / llmin(sGridMaxSubdivisionLevel, getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, tick_label_spacing)))) == 0.f)
+ if (fmodf((F32)(i + label_sub_div_offset_1), (sGridMaxSubdivisionLevel / llmin(sGridMaxSubdivisionLevel, getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit1, tick_label_spacing)))) == 0.f)
{
- LLVector3 text_origin = tick_pos +
- (mSnapGuideDir1 * mSnapRegimeOffset * (1.f + tick_scale));
-
+ LLVector3 text_origin = tick_pos + (mSnapGuideDir1 * mSnapRegimeOffset * (1.f + tick_scale));
+
EGridMode grid_mode = LLSelectMgr::getInstance()->getGridMode();
- F32 tick_val;
+ F32 tick_value;
if (grid_mode == GRID_MODE_WORLD)
{
- tick_val = (tick_pos - mScaleCenter) * mScaleDir / (mScaleSnapUnit1 / grid_resolution);
+ tick_value = (grid_multiple1 + i) / (sGridMaxSubdivisionLevel / grid_resolution);
}
else
{
- tick_val = (tick_pos - mScaleCenter) * mScaleDir / (mScaleSnapUnit1 * 2.f);
- }
-
- if (getUniform())
- {
- tick_val *= 2.f;
+ tick_value = (grid_multiple1 + i) / (2.f * sGridMaxSubdivisionLevel);
}
F32 text_highlight = 0.8f;
- if (is_approx_equal(tick_val, mScaleSnapValue) && mInSnapRegime)
+ // Highlight this text if the tick value matches the snapped to value, and if either the second set of ticks isn't going to be shown or cursor is in the first snap regime.
+ if (is_approx_equal(tick_value, mScaleSnappedValue) && (mScaleSnapUnit2 == mScaleSnapUnit1 || (mSnapRegime & SNAP_REGIME_UPPER)))
{
text_highlight = 1.f;
}
- renderTickValue(text_origin, tick_val, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha));
+ renderTickValue(text_origin, tick_value, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha));
}
}
- // label ticks on opposite side
+ // label ticks on opposite side, only can happen in scaling modes that effect more than one axis and when the object's axis don't have the same scale. A differing scale indicates both conditions.
if (mScaleSnapUnit2 != mScaleSnapUnit1)
{
start_tick = -(llmin(ticks_from_scale_center_2, num_ticks_per_side2));
@@ -1747,9 +1815,9 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
{
F32 tick_scale = 1.f;
F32 alpha = grid_alpha * (1.f - (0.5f * ((F32)llabs(i) / (F32)num_ticks_per_side2)));
- LLVector3 tick_pos = drag_point + (mScaleDir * (mScaleSnapUnit2 / max_subdivisions * (F32)i - grid_offset2));
+ LLVector3 tick_pos = mScaleCenter + (mScaleDir * (grid_multiple2 + i) * smallest_subdivision2);
- for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
+ for (F32 division_level = sGridMaxSubdivisionLevel; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f)
{
if (fmodf((F32)(i + label_sub_div_offset_2), division_level) == 0.f)
{
@@ -1758,35 +1826,29 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
tick_scale *= 0.7f;
}
- if (fmodf((F32)(i + label_sub_div_offset_2), (max_subdivisions / llmin(max_subdivisions, getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, tick_label_spacing)))) == 0.f)
+ if (fmodf((F32)(i + label_sub_div_offset_2), (sGridMaxSubdivisionLevel / llmin(sGridMaxSubdivisionLevel, getSubdivisionLevel(tick_pos, mScaleDir, mScaleSnapUnit2, tick_label_spacing)))) == 0.f)
{
- LLVector3 text_origin = tick_pos +
- (mSnapGuideDir2 * mSnapRegimeOffset * (1.f + tick_scale));
+ LLVector3 text_origin = tick_pos + (mSnapGuideDir2 * mSnapRegimeOffset * (1.f + tick_scale));
EGridMode grid_mode = LLSelectMgr::getInstance()->getGridMode();
- F32 tick_val;
+ F32 tick_value;
if (grid_mode == GRID_MODE_WORLD)
{
- tick_val = (tick_pos - mScaleCenter) * mScaleDir / (mScaleSnapUnit2 / grid_resolution);
+ tick_value = (grid_multiple2 + i) / (sGridMaxSubdivisionLevel / grid_resolution);
}
else
{
- tick_val = (tick_pos - mScaleCenter) * mScaleDir / (mScaleSnapUnit2 * 2.f);
- }
-
- if (getUniform())
- {
- tick_val *= 2.f;
+ tick_value = (grid_multiple2 + i) / (2.f * sGridMaxSubdivisionLevel);
}
F32 text_highlight = 0.8f;
- if (is_approx_equal(tick_val, mScaleSnapValue) && mInSnapRegime)
+ if (is_approx_equal(tick_value, mScaleSnappedValue) && (mSnapRegime & SNAP_REGIME_LOWER))
{
text_highlight = 1.f;
}
- renderTickValue(text_origin, tick_val, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha));
+ renderTickValue(text_origin, tick_value, grid_mode == GRID_MODE_WORLD ? std::string("m") : std::string("x"), LLColor4(text_highlight, text_highlight, text_highlight, alpha));
}
}
}
@@ -1812,13 +1874,13 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
LLVector3 help_text_pos = selection_center_start + (mSnapRegimeOffset * 5.f * offset_dir);
const LLFontGL* big_fontp = LLFontGL::getFontSansSerif();
- std::string help_text = "Move mouse cursor over ruler";
+ std::string help_text = LLTrans::getString("manip_hint1");
LLColor4 help_text_color = LLColor4::white;
help_text_color.mV[VALPHA] = clamp_rescale(mHelpTextTimer.getElapsedTimeF32(), sHelpTextVisibleTime, sHelpTextVisibleTime + sHelpTextFadeTime, grid_alpha, 0.f);
- hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD);
- help_text = "to snap to grid";
+ hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, false);
+ help_text = LLTrans::getString("manip_hint2");
help_text_pos -= LLViewerCamera::getInstance()->getUpAxis() * mSnapRegimeOffset * 0.4f;
- hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD);
+ hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, false);
}
}
}
@@ -1827,17 +1889,15 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
// Returns unit vector in direction of part of an origin-centered cube
LLVector3 LLManipScale::partToUnitVector( S32 part ) const
{
- if( (LL_FACE_MIN <= part) && (part <= LL_FACE_MAX) )
+ if ( (LL_FACE_MIN <= part) && (part <= LL_FACE_MAX) )
{
return faceToUnitVector( part );
}
- else
- if( (LL_CORNER_MIN <= part) && (part <= LL_CORNER_MAX) )
+ else if ( (LL_CORNER_MIN <= part) && (part <= LL_CORNER_MAX) )
{
return cornerToUnitVector( part );
}
- else
- if( (LL_EDGE_MIN <= part) && (part <= LL_EDGE_MAX ) )
+ else if ( (LL_EDGE_MIN <= part) && (part <= LL_EDGE_MAX ) )
{
return edgeToUnitVector( part );
}
@@ -1849,27 +1909,32 @@ LLVector3 LLManipScale::partToUnitVector( S32 part ) const
LLVector3 LLManipScale::faceToUnitVector( S32 part ) const
{
llassert( (LL_FACE_MIN <= part) && (part <= LL_FACE_MAX) );
+ LLVector3 vec;
switch( part )
{
case LL_FACE_POSX:
- return LLVector3( 1.f, 0.f, 0.f );
-
+ vec.set( 1.f, 0.f, 0.f );
+ break;
case LL_FACE_NEGX:
- return LLVector3( -1.f, 0.f, 0.f );
-
+ vec.set( -1.f, 0.f, 0.f );
+ break;
case LL_FACE_POSY:
- return LLVector3( 0.f, 1.f, 0.f );
-
+ vec.set( 0.f, 1.f, 0.f );
+ break;
case LL_FACE_NEGY:
- return LLVector3( 0.f, -1.f, 0.f );
-
+ vec.set( 0.f, -1.f, 0.f );
+ break;
case LL_FACE_POSZ:
- return LLVector3( 0.f, 0.f, 1.f );
-
+ vec.set( 0.f, 0.f, 1.f );
+ break;
case LL_FACE_NEGZ:
- return LLVector3( 0.f, 0.f, -1.f );
+ vec.set( 0.f, 0.f, -1.f );
+ break;
+ default:
+ vec.clear();
}
- return LLVector3();
+
+ return vec;
}
@@ -1881,31 +1946,31 @@ LLVector3 LLManipScale::cornerToUnitVector( S32 part ) const
switch(part)
{
case LL_CORNER_NNN:
- vec.setVec(-F_SQRT3, -F_SQRT3, -F_SQRT3);
+ vec.set(-OO_SQRT3, -OO_SQRT3, -OO_SQRT3);
break;
- case LL_CORNER_NNP:
- vec.setVec(-F_SQRT3, -F_SQRT3, F_SQRT3);
+ case LL_CORNER_NNP:
+ vec.set(-OO_SQRT3, -OO_SQRT3, OO_SQRT3);
break;
case LL_CORNER_NPN:
- vec.setVec(-F_SQRT3, F_SQRT3, -F_SQRT3);
+ vec.set(-OO_SQRT3, OO_SQRT3, -OO_SQRT3);
break;
case LL_CORNER_NPP:
- vec.setVec(-F_SQRT3, F_SQRT3, F_SQRT3);
+ vec.set(-OO_SQRT3, OO_SQRT3, OO_SQRT3);
break;
case LL_CORNER_PNN:
- vec.setVec(F_SQRT3, -F_SQRT3, -F_SQRT3);
+ vec.set(OO_SQRT3, -OO_SQRT3, -OO_SQRT3);
break;
case LL_CORNER_PNP:
- vec.setVec(F_SQRT3, -F_SQRT3, F_SQRT3);
+ vec.set(OO_SQRT3, -OO_SQRT3, OO_SQRT3);
break;
case LL_CORNER_PPN:
- vec.setVec(F_SQRT3, F_SQRT3, -F_SQRT3);
+ vec.set(OO_SQRT3, OO_SQRT3, -OO_SQRT3);
break;
case LL_CORNER_PPP:
- vec.setVec(F_SQRT3, F_SQRT3, F_SQRT3);
+ vec.set(OO_SQRT3, OO_SQRT3, OO_SQRT3);
break;
default:
- vec.clearVec();
+ vec.clear();
}
return vec;
@@ -1932,8 +1997,8 @@ LLVector3 LLManipScale::unitVectorToLocalBBoxExtent( const LLVector3& v, const L
LLVector3 ctr = bbox.getCenterLocal();
return LLVector3(
- v.mV[0] ? (v.mV[0]>0 ? max.mV[0] : min.mV[0] ) : ctr.mV[0],
- v.mV[1] ? (v.mV[1]>0 ? max.mV[1] : min.mV[1] ) : ctr.mV[1],
+ v.mV[0] ? (v.mV[0]>0 ? max.mV[0] : min.mV[0] ) : ctr.mV[0],
+ v.mV[1] ? (v.mV[1]>0 ? max.mV[1] : min.mV[1] ) : ctr.mV[1],
v.mV[2] ? (v.mV[2]>0 ? max.mV[2] : min.mV[2] ) : ctr.mV[2] );
}
@@ -1951,7 +2016,7 @@ F32 LLManipScale::partToMaxScale( S32 part, const LLBBox &bbox ) const
max_extent = bbox_extents.mV[i];
}
}
- max_scale_factor = bbox_extents.magVec() * get_default_max_prim_scale() / max_extent;
+ max_scale_factor = bbox_extents.length() * get_default_max_prim_scale() / max_extent;
if (getUniform())
{
@@ -1974,7 +2039,7 @@ F32 LLManipScale::partToMinScale( S32 part, const LLBBox &bbox ) const
min_extent = bbox_extents.mV[i];
}
}
- F32 min_scale_factor = bbox_extents.magVec() * MIN_PRIM_SCALE / min_extent;
+ F32 min_scale_factor = bbox_extents.length() * MIN_PRIM_SCALE / min_extent;
if (getUniform())
{
@@ -2025,7 +2090,7 @@ LLVector3 LLManipScale::nearestAxis( const LLVector3& v ) const
// virtual
BOOL LLManipScale::canAffectSelection()
{
- // An selection is scalable if you are allowed to both edit and move
+ // An selection is scalable if you are allowed to both edit and move
// everything in it, and it does not have any sitting agents
BOOL can_scale = mObjectSelection->getObjectCount() != 0;
if (can_scale)
diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h
index 5cb8898fd0..7cc3c99810 100755
--- a/indra/newview/llmanipscale.h
+++ b/indra/newview/llmanipscale.h
@@ -51,6 +51,13 @@ typedef enum e_scale_manipulator_type
SCALE_MANIP_FACE
} EScaleManipulatorType;
+typedef enum e_snap_regimes
+{
+ SNAP_REGIME_NONE = 0, //!< The cursor is not in either of the snap regimes.
+ SNAP_REGIME_UPPER = 0x1, //!< The cursor is, non-exclusively, in the first of the snap regimes. Prefer to treat as bitmask.
+ SNAP_REGIME_LOWER = 0x2 //!< The cursor is, non-exclusively, in the second of the snap regimes. Prefer to treat as bitmask.
+} ESnapRegimes;
+
class LLManipScale : public LLManip
{
@@ -64,7 +71,7 @@ public:
ManipulatorHandle(LLVector3 pos, EManipPart id, EScaleManipulatorType type):mPosition(pos), mManipID(id), mType(type){}
};
-
+ static const S32 NUM_MANIPULATORS = 14;
LLManipScale( LLToolComposite* composite );
~LLManipScale();
@@ -91,12 +98,12 @@ private:
void renderFaces( const LLBBox& local_bbox );
void renderEdges( const LLBBox& local_bbox );
void renderBoxHandle( F32 x, F32 y, F32 z );
- void renderAxisHandle( const LLVector3& start, const LLVector3& end );
+ void renderAxisHandle( U32 part, const LLVector3& start, const LLVector3& end );
void renderGuidelinesPart( const LLBBox& local_bbox );
void renderSnapGuides( const LLBBox& local_bbox );
void revert();
-
+
inline void conditionalHighlight( U32 part, const LLColor4* highlight = NULL, const LLColor4* normal = NULL );
void drag( S32 x, S32 y );
@@ -135,34 +142,36 @@ private:
};
- F32 mBoxHandleSize; // The size of the handles at the corners of the bounding box
- F32 mScaledBoxHandleSize; // handle size after scaling for selection feedback
+ F32 mScaledBoxHandleSize; //!< Handle size after scaling for selection feedback.
LLVector3d mDragStartPointGlobal;
- LLVector3d mDragStartCenterGlobal; // The center of the bounding box of all selected objects at time of drag start
+ LLVector3d mDragStartCenterGlobal; //!< The center of the bounding box of all selected objects at time of drag start.
LLVector3d mDragPointGlobal;
LLVector3d mDragFarHitGlobal;
S32 mLastMouseX;
S32 mLastMouseY;
BOOL mSendUpdateOnMouseUp;
U32 mLastUpdateFlags;
- typedef std::set<ManipulatorHandle*, compare_manipulators> minpulator_list_t;
- minpulator_list_t mProjectedManipulators;
+ typedef std::set<ManipulatorHandle*, compare_manipulators> manipulator_list_t;
+ manipulator_list_t mProjectedManipulators;
LLVector4 mManipulatorVertices[14];
- F32 mScaleSnapUnit1; // size of snap multiples for axis 1
- F32 mScaleSnapUnit2; // size of snap multiples for axis 2
- LLVector3 mScalePlaneNormal1; // normal of plane in which scale occurs that most faces camera
- LLVector3 mScalePlaneNormal2; // normal of plane in which scale occurs that most faces camera
- LLVector3 mSnapGuideDir1;
- LLVector3 mSnapGuideDir2;
- LLVector3 mSnapDir1;
- LLVector3 mSnapDir2;
- F32 mSnapRegimeOffset;
+ F32 mScaleSnapUnit1; //!< Size of snap multiples for the upper scale.
+ F32 mScaleSnapUnit2; //!< Size of snap multiples for the lower scale.
+ LLVector3 mScalePlaneNormal1; //!< Normal of plane in which scale occurs that most faces camera.
+ LLVector3 mScalePlaneNormal2; //!< Normal of plane in which scale occurs that most faces camera.
+ LLVector3 mSnapGuideDir1; //!< The direction in which the upper snap guide tick marks face.
+ LLVector3 mSnapGuideDir2; //!< The direction in which the lower snap guide tick marks face.
+ LLVector3 mSnapDir1; //!< The direction in which the upper snap guides face.
+ LLVector3 mSnapDir2; //!< The direction in which the lower snap guides face.
+ F32 mSnapRegimeOffset; //!< How far off the scale axis centerline the mouse can be before it exits/enters the snap regime.
+ F32 mTickPixelSpacing1; //!< The pixel spacing between snap guide tick marks for the upper scale.
+ F32 mTickPixelSpacing2; //!< The pixel spacing between snap guide tick marks for the lower scale.
F32 mSnapGuideLength;
- LLVector3 mScaleCenter;
- LLVector3 mScaleDir;
- F32 mScaleSnapValue;
- BOOL mInSnapRegime;
- F32* mManipulatorScales;
+ LLVector3 mScaleCenter; //!< The location of the origin of the scaling operation.
+ LLVector3 mScaleDir; //!< The direction of the scaling action. In face-dragging this is aligned with one of the cardinal axis relative to the prim, but in corner-dragging this is along the diagonal.
+ F32 mScaleSnappedValue; //!< The distance of the current position nearest the mouse location, measured along mScaleDir. Is measured either from the center or from the far face/corner depending upon whether uniform scaling is true or false respectively.
+ ESnapRegimes mSnapRegime; //<! Which, if any, snap regime the cursor is currently residing in.
+ F32 mManipulatorScales[NUM_MANIPULATORS];
+ F32 mBoxHandleSize[NUM_MANIPULATORS]; // The size of the handles at the corners of the bounding box
};
#endif // LL_MANIPSCALE_H
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index da8235ee5f..8a89131c43 100755
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -61,6 +61,7 @@
#include "llui.h"
#include "pipeline.h"
#include "llviewershadermgr.h"
+#include "lltrans.h"
const S32 NUM_AXES = 3;
const S32 MOUSE_DRAG_SLOP = 2; // pixels
@@ -111,7 +112,6 @@ LLManipTranslate::LLManipTranslate( LLToolComposite* composite )
: LLManip( std::string("Move"), composite ),
mLastHoverMouseX(-1),
mLastHoverMouseY(-1),
- mSendUpdateOnMouseUp(FALSE),
mMouseOutsideSlop(FALSE),
mCopyMadeThisDrag(FALSE),
mMouseDownX(-1),
@@ -125,7 +125,6 @@ LLManipTranslate::LLManipTranslate( LLToolComposite* composite )
mSnapOffsetMeters(0.f),
mSubdivisions(10.f),
mInSnapRegime(FALSE),
- mSnapped(FALSE),
mArrowScales(1.f, 1.f, 1.f),
mPlaneScales(1.f, 1.f, 1.f),
mPlaneManipPositions(1.f, 1.f, 1.f, 1.f)
@@ -1247,7 +1246,7 @@ void LLManipTranslate::renderSnapGuides()
// find distance to nearest smallest grid unit
F32 offset_nearest_grid_unit = fmodf(dist_grid_axis, smallest_grid_unit_scale);
// how many smallest grid units are we away from largest grid scale?
- S32 sub_div_offset = llround(fmod(dist_grid_axis - offset_nearest_grid_unit, getMinGridScale() / sGridMinSubdivisionLevel) / smallest_grid_unit_scale);
+ S32 sub_div_offset = llround(fmodf(dist_grid_axis - offset_nearest_grid_unit, getMinGridScale() / sGridMinSubdivisionLevel) / smallest_grid_unit_scale);
S32 num_ticks_per_side = llmax(1, llfloor(0.5f * guide_size_meters / smallest_grid_unit_scale));
LLGLDepthTest gls_depth(GL_FALSE);
@@ -1441,13 +1440,13 @@ void LLManipTranslate::renderSnapGuides()
LLVector3 help_text_pos = selection_center_start + (snap_offset_meters_up * 3.f * mSnapOffsetAxis);
const LLFontGL* big_fontp = LLFontGL::getFontSansSerif();
- std::string help_text = "Move mouse cursor over ruler";
+ std::string help_text = LLTrans::getString("manip_hint1");
LLColor4 help_text_color = LLColor4::white;
help_text_color.mV[VALPHA] = clamp_rescale(mHelpTextTimer.getElapsedTimeF32(), sHelpTextVisibleTime, sHelpTextVisibleTime + sHelpTextFadeTime, line_alpha, 0.f);
- hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD);
- help_text = "to snap to grid";
+ hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, false);
+ help_text = LLTrans::getString("manip_hint2");
help_text_pos -= LLViewerCamera::getInstance()->getUpAxis() * mSnapOffsetMeters * 0.2f;
- hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD);
+ hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, false);
}
}
}
diff --git a/indra/newview/llmaniptranslate.h b/indra/newview/llmaniptranslate.h
index 37567c7bd1..3c37bbd698 100755
--- a/indra/newview/llmaniptranslate.h
+++ b/indra/newview/llmaniptranslate.h
@@ -85,7 +85,6 @@ protected:
private:
S32 mLastHoverMouseX;
S32 mLastHoverMouseY;
- BOOL mSendUpdateOnMouseUp;
BOOL mMouseOutsideSlop; // true after mouse goes outside slop region
BOOL mCopyMadeThisDrag;
S32 mMouseDownX;
@@ -107,7 +106,6 @@ private:
LLVector3 mGridScale;
F32 mSubdivisions;
BOOL mInSnapRegime;
- BOOL mSnapped;
LLVector3 mArrowScales;
LLVector3 mPlaneScales;
LLVector4 mPlaneManipPositions;
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 74eb6015f2..fc69ecfae9 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -2004,9 +2004,9 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
result["asset_type"] = "mesh";
result["inventory_type"] = "object";
result["description"] = "(No Description)";
- result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms());
- result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms());
- result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms());
+ result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms("Uploads"));
+ result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms("Uploads"));
+ result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms("Uploads"));
res["mesh_list"] = LLSD::emptyArray();
res["texture_list"] = LLSD::emptyArray();
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index b2a3a9f645..54e4c6c1da 100755
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -65,7 +65,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
mNameColumn(p.name_column.column_name),
mAllowCallingCardDrop(p.allow_calling_card_drop),
mShortNames(p.short_names),
- mAvatarNameCacheConnection()
+ mPendingLookupsRemaining(0)
{}
// public
@@ -328,13 +328,27 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
else
{
// ...schedule a callback
- // This is not correct and will likely lead to partially populated lists in cases where avatar names are not cached.
- // *TODO : Change this to have 2 callbacks : one callback per list item and one for the whole list.
- if (mAvatarNameCacheConnection.connected())
+ avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(id);
+ if (it != mAvatarNameCacheConnections.end())
{
- mAvatarNameCacheConnection.disconnect();
+ if (it->second.connected())
+ {
+ it->second.disconnect();
+ }
+ mAvatarNameCacheConnections.erase(it);
}
- mAvatarNameCacheConnection = LLAvatarNameCache::get(id,boost::bind(&LLNameListCtrl::onAvatarNameCache,this, _1, _2, item->getHandle()));
+ mAvatarNameCacheConnections[id] = LLAvatarNameCache::get(id,boost::bind(&LLNameListCtrl::onAvatarNameCache,this, _1, _2, suffix, item->getHandle()));
+
+ if(mPendingLookupsRemaining <= 0)
+ {
+ // BAKER TODO:
+ // We might get into a state where mPendingLookupsRemaining might
+ // go negative. So just reset it right now and figure out if it's
+ // possible later :)
+ mPendingLookupsRemaining = 0;
+ mNameListCompleteSignal(false);
+ }
+ mPendingLookupsRemaining++;
}
break;
}
@@ -386,14 +400,25 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)
{
selectNthItem(idx); // not sure whether this is needed, taken from previous implementation
deleteSingleItem(idx);
+
+ mPendingLookupsRemaining--;
}
}
void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
const LLAvatarName& av_name,
+ std::string suffix,
LLHandle<LLNameListItem> item)
{
- mAvatarNameCacheConnection.disconnect();
+ avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(agent_id);
+ if (it != mAvatarNameCacheConnections.end())
+ {
+ if (it->second.connected())
+ {
+ it->second.disconnect();
+ }
+ mAvatarNameCacheConnections.erase(it);
+ }
std::string name;
if (mShortNames)
@@ -401,6 +426,12 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
else
name = av_name.getCompleteName();
+ // Append optional suffix.
+ if (!suffix.empty())
+ {
+ name.append(suffix);
+ }
+
LLNameListItem* list_item = item.get();
if (list_item && list_item->getUUID() == agent_id)
{
@@ -412,6 +443,23 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
}
}
+ //////////////////////////////////////////////////////////////////////////
+ // BAKER - FIX NameListCtrl
+ //if (mPendingLookupsRemaining <= 0)
+ {
+ // We might get into a state where mPendingLookupsRemaining might
+ // go negative. So just reset it right now and figure out if it's
+ // possible later :)
+ //mPendingLookupsRemaining = 0;
+
+ mNameListCompleteSignal(true);
+ }
+ //else
+ {
+ // mPendingLookupsRemaining--;
+ }
+ //////////////////////////////////////////////////////////////////////////
+
dirtyColumns();
}
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 92e82b672d..2c40eeaaca 100755
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -67,6 +67,7 @@ class LLNameListCtrl
: public LLScrollListCtrl, public LLInstanceTracker<LLNameListCtrl>
{
public:
+ typedef boost::signals2::signal<void(bool)> namelist_complete_signal_t;
typedef enum e_name_type
{
@@ -114,10 +115,14 @@ protected:
LLNameListCtrl(const Params&);
virtual ~LLNameListCtrl()
{
- if (mAvatarNameCacheConnection.connected())
+ for (avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.begin(); it != mAvatarNameCacheConnections.end(); ++it)
{
- mAvatarNameCacheConnection.disconnect();
+ if (it->second.connected())
+ {
+ it->second.disconnect();
+ }
}
+ mAvatarNameCacheConnections.clear();
}
friend class LLUICtrlFactory;
public:
@@ -152,17 +157,28 @@ public:
/*virtual*/ void updateColumns(bool force_update);
- /*virtual*/ void mouseOverHighlightNthItem( S32 index );
+ /*virtual*/ void mouseOverHighlightNthItem( S32 index );
private:
void showInspector(const LLUUID& avatar_id, bool is_group);
- void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, LLHandle<LLNameListItem> item);
+ void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, LLHandle<LLNameListItem> item);
private:
S32 mNameColumnIndex;
std::string mNameColumn;
BOOL mAllowCallingCardDrop;
bool mShortNames; // display name only, no SLID
- boost::signals2::connection mAvatarNameCacheConnection;
+ typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t;
+ avatar_name_cache_connection_map_t mAvatarNameCacheConnections;
+
+ S32 mPendingLookupsRemaining;
+ namelist_complete_signal_t mNameListCompleteSignal;
+
+public:
+ boost::signals2::connection setOnNameListCompleteCallback(boost::function<void(bool)> onNameListCompleteCallback)
+ {
+ return mNameListCompleteSignal.connect(onNameListCompleteCallback);
+ }
+
};
diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp
index 1a427338e5..89a9e0dc16 100755
--- a/indra/newview/llpanelcontents.cpp
+++ b/indra/newview/llpanelcontents.cpp
@@ -59,6 +59,7 @@
#include "llviewerregion.h"
#include "llviewerwindow.h"
#include "llworld.h"
+#include "llfloaterperms.h"
//
// Imported globals
@@ -156,12 +157,14 @@ void LLPanelContents::onClickNewScript(void *userdata)
{
LLPermissions perm;
perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+
+ // Parameters are base, owner, everyone, group, next
perm.initMasks(
PERM_ALL,
PERM_ALL,
- PERM_NONE,
- PERM_NONE,
- PERM_MOVE | PERM_TRANSFER);
+ LLFloaterPerms::getEveryonePerms("Scripts"),
+ LLFloaterPerms::getGroupPerms("Scripts"),
+ PERM_MOVE | LLFloaterPerms::getNextOwnerPerms("Scripts"));
std::string desc;
LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc);
LLPointer<LLViewerInventoryItem> new_item =
@@ -179,6 +182,8 @@ void LLPanelContents::onClickNewScript(void *userdata)
time_corrected());
object->saveScript(new_item, TRUE, true);
+ std::string name = new_item->getName();
+
// *NOTE: In order to resolve SL-22177, we needed to create
// the script first, and then you have to click it in
// inventory to edit it.
diff --git a/indra/newview/llpanelgroupbulk.cpp b/indra/newview/llpanelgroupbulk.cpp
new file mode 100644
index 0000000000..1eafc5bd64
--- /dev/null
+++ b/indra/newview/llpanelgroupbulk.cpp
@@ -0,0 +1,421 @@
+/**
+* @file llpanelgroupbulk.cpp
+* @brief Implementation of llpanelgroupbulk
+* @author Baker@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelgroupbulk.h"
+#include "llpanelgroupbulkimpl.h"
+
+#include "llagent.h"
+#include "llavatarnamecache.h"
+#include "llfloateravatarpicker.h"
+#include "llbutton.h"
+#include "llcallingcard.h"
+#include "llcombobox.h"
+#include "llgroupactions.h"
+#include "llgroupmgr.h"
+#include "llnamelistctrl.h"
+#include "llnotificationsutil.h"
+#include "llscrolllistitem.h"
+#include "llspinctrl.h"
+#include "lltextbox.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "lluictrlfactory.h"
+#include "llviewerwindow.h"
+
+
+//////////////////////////////////////////////////////////////////////////
+// Implementation of llpanelgroupbulkimpl.h functions
+//////////////////////////////////////////////////////////////////////////
+LLPanelGroupBulkImpl::LLPanelGroupBulkImpl(const LLUUID& group_id) :
+ mGroupID(group_id),
+ mBulkAgentList(NULL),
+ mOKButton(NULL),
+ mRemoveButton(NULL),
+ mGroupName(NULL),
+ mLoadingText(),
+ mTooManySelected(),
+ mCloseCallback(NULL),
+ mCloseCallbackUserData(NULL),
+ mAvatarNameCacheConnection(),
+ mRoleNames(NULL),
+ mOwnerWarning(),
+ mAlreadyInGroup(),
+ mConfirmedOwnerInvite(false),
+ mListFullNotificationSent(false)
+{}
+
+LLPanelGroupBulkImpl::~LLPanelGroupBulkImpl()
+{
+ if(mAvatarNameCacheConnection.connected())
+ {
+ mAvatarNameCacheConnection.disconnect();
+ }
+}
+
+void LLPanelGroupBulkImpl::callbackClickAdd(void* userdata)
+{
+ LLPanelGroupBulk* panelp = (LLPanelGroupBulk*)userdata;
+
+ if(panelp)
+ {
+ //Right now this is hard coded with some knowledge that it is part
+ //of a floater since the avatar picker needs to be added as a dependent
+ //floater to the parent floater.
+ //Soon the avatar picker will be embedded into this panel
+ //instead of being it's own separate floater. But that is next week.
+ //This will do for now. -jwolk May 10, 2006
+ LLView* button = panelp->findChild<LLButton>("add_button");
+ LLFloater* root_floater = gFloaterView->getParentFloater(panelp);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
+ boost::bind(callbackAddUsers, _1, panelp->mImplementation), TRUE, FALSE, FALSE, root_floater->getName(), button);
+ if(picker)
+ {
+ root_floater->addDependentFloater(picker);
+ }
+ }
+}
+
+void LLPanelGroupBulkImpl::callbackClickRemove(void* userdata)
+{
+ LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata;
+ if (selfp)
+ selfp->handleRemove();
+}
+
+void LLPanelGroupBulkImpl::callbackClickCancel(void* userdata)
+{
+ LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata;
+ if(selfp)
+ (*(selfp->mCloseCallback))(selfp->mCloseCallbackUserData);
+}
+
+void LLPanelGroupBulkImpl::callbackSelect(LLUICtrl* ctrl, void* userdata)
+{
+ LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*)userdata;
+ if (selfp)
+ selfp->handleSelection();
+}
+
+void LLPanelGroupBulkImpl::callbackAddUsers(const uuid_vec_t& agent_ids, void* user_data)
+{
+ std::vector<std::string> names;
+ for (S32 i = 0; i < (S32)agent_ids.size(); i++)
+ {
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(agent_ids[i], &av_name))
+ {
+ onAvatarNameCache(agent_ids[i], av_name, user_data);
+ }
+ else
+ {
+ LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*) user_data;
+ if (selfp)
+ {
+ if (selfp->mAvatarNameCacheConnection.connected())
+ {
+ selfp->mAvatarNameCacheConnection.disconnect();
+ }
+ // *TODO : Add a callback per avatar name being fetched.
+ selfp->mAvatarNameCacheConnection = LLAvatarNameCache::get(agent_ids[i],boost::bind(onAvatarNameCache, _1, _2, user_data));
+ }
+ }
+ }
+}
+
+void LLPanelGroupBulkImpl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, void* user_data)
+{
+ LLPanelGroupBulkImpl* selfp = (LLPanelGroupBulkImpl*) user_data;
+
+ if (selfp)
+ {
+ if (selfp->mAvatarNameCacheConnection.connected())
+ {
+ selfp->mAvatarNameCacheConnection.disconnect();
+ }
+ std::vector<std::string> names;
+ uuid_vec_t agent_ids;
+ agent_ids.push_back(agent_id);
+ names.push_back(av_name.getCompleteName());
+
+ selfp->addUsers(names, agent_ids);
+ }
+}
+
+void LLPanelGroupBulkImpl::handleRemove()
+{
+ std::vector<LLScrollListItem*> selection = mBulkAgentList->getAllSelected();
+ if (selection.empty())
+ return;
+
+ std::vector<LLScrollListItem*>::iterator iter;
+ for(iter = selection.begin(); iter != selection.end(); ++iter)
+ {
+ mInviteeIDs.erase((*iter)->getUUID());
+ }
+
+ mBulkAgentList->deleteSelectedItems();
+ mRemoveButton->setEnabled(FALSE);
+
+ if( mOKButton && mOKButton->getEnabled() &&
+ mBulkAgentList->isEmpty())
+ {
+ mOKButton->setEnabled(FALSE);
+ }
+}
+
+void LLPanelGroupBulkImpl::handleSelection()
+{
+ std::vector<LLScrollListItem*> selection = mBulkAgentList->getAllSelected();
+ if (selection.empty())
+ mRemoveButton->setEnabled(FALSE);
+ else
+ mRemoveButton->setEnabled(TRUE);
+}
+
+void LLPanelGroupBulkImpl::addUsers(const std::vector<std::string>& names, const uuid_vec_t& agent_ids)
+{
+ std::string name;
+ LLUUID id;
+
+ if(mListFullNotificationSent)
+ {
+ return;
+ }
+
+ if( !mListFullNotificationSent &&
+ (names.size() + mInviteeIDs.size() > MAX_GROUP_INVITES))
+ {
+ mListFullNotificationSent = true;
+
+ // Fail! Show a warning and don't add any names.
+ LLSD msg;
+ msg["MESSAGE"] = mTooManySelected;
+ LLNotificationsUtil::add("GenericAlert", msg);
+ return;
+ }
+
+ for (S32 i = 0; i < (S32)names.size(); ++i)
+ {
+ name = names[i];
+ id = agent_ids[i];
+
+ if(mInviteeIDs.find(id) != mInviteeIDs.end())
+ {
+ continue;
+ }
+
+ //add the name to the names list
+ LLSD row;
+ row["id"] = id;
+ row["columns"][0]["value"] = name;
+
+ mBulkAgentList->addElement(row);
+ mInviteeIDs.insert(id);
+
+ // We've successfully added someone to the list.
+ if(mOKButton && !mOKButton->getEnabled())
+ mOKButton->setEnabled(TRUE);
+ }
+}
+
+void LLPanelGroupBulkImpl::setGroupName(std::string name)
+{
+ if(mGroupName)
+ mGroupName->setText(name);
+}
+
+
+LLPanelGroupBulk::LLPanelGroupBulk(const LLUUID& group_id) :
+ LLPanel(),
+ mImplementation(new LLPanelGroupBulkImpl(group_id)),
+ mPendingGroupPropertiesUpdate(false),
+ mPendingRoleDataUpdate(false),
+ mPendingMemberDataUpdate(false)
+{}
+
+LLPanelGroupBulk::~LLPanelGroupBulk()
+{
+ delete mImplementation;
+}
+
+void LLPanelGroupBulk::clear()
+{
+ mImplementation->mInviteeIDs.clear();
+
+ if(mImplementation->mBulkAgentList)
+ mImplementation->mBulkAgentList->deleteAllItems();
+
+ if(mImplementation->mOKButton)
+ mImplementation->mOKButton->setEnabled(FALSE);
+}
+
+void LLPanelGroupBulk::update()
+{
+ updateGroupName();
+ updateGroupData();
+}
+
+void LLPanelGroupBulk::draw()
+{
+ LLPanel::draw();
+ update();
+}
+
+void LLPanelGroupBulk::updateGroupName()
+{
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mImplementation->mGroupID);
+
+ if( gdatap &&
+ gdatap->isGroupPropertiesDataComplete())
+ {
+ // Only do work if the current group name differs
+ if(mImplementation->mGroupName->getText().compare(gdatap->mName) != 0)
+ mImplementation->setGroupName(gdatap->mName);
+ }
+ else
+ {
+ mImplementation->setGroupName(mImplementation->mLoadingText);
+ }
+}
+
+void LLPanelGroupBulk::updateGroupData()
+{
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mImplementation->mGroupID);
+ if(gdatap && gdatap->isGroupPropertiesDataComplete())
+ {
+ mPendingGroupPropertiesUpdate = false;
+ }
+ else
+ {
+ if(!mPendingGroupPropertiesUpdate)
+ {
+ mPendingGroupPropertiesUpdate = true;
+ LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID);
+ }
+ }
+
+ if(gdatap && gdatap->isRoleDataComplete())
+ {
+ mPendingRoleDataUpdate = false;
+ }
+ else
+ {
+ if(!mPendingRoleDataUpdate)
+ {
+ mPendingRoleDataUpdate = true;
+ LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID);
+ }
+ }
+
+ if(gdatap && gdatap->isMemberDataComplete())
+ {
+ mPendingMemberDataUpdate = false;
+ }
+ else
+ {
+ if(!mPendingMemberDataUpdate)
+ {
+ mPendingMemberDataUpdate = true;
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID);
+ }
+ }
+}
+
+void LLPanelGroupBulk::addUserCallback(const LLUUID& id, const LLAvatarName& av_name)
+{
+ std::vector<std::string> names;
+ uuid_vec_t agent_ids;
+ agent_ids.push_back(id);
+ names.push_back(av_name.getAccountName());
+
+ mImplementation->addUsers(names, agent_ids);
+}
+
+void LLPanelGroupBulk::setCloseCallback(void (*close_callback)(void*), void* data)
+{
+ mImplementation->mCloseCallback = close_callback;
+ mImplementation->mCloseCallbackUserData = data;
+}
+
+void LLPanelGroupBulk::addUsers(uuid_vec_t& agent_ids)
+{
+ std::vector<std::string> names;
+ for (S32 i = 0; i < (S32)agent_ids.size(); i++)
+ {
+ std::string fullname;
+ LLUUID agent_id = agent_ids[i];
+ LLViewerObject* dest = gObjectList.findObject(agent_id);
+ if(dest && dest->isAvatar())
+ {
+ LLNameValue* nvfirst = dest->getNVPair("FirstName");
+ LLNameValue* nvlast = dest->getNVPair("LastName");
+ if(nvfirst && nvlast)
+ {
+ fullname = LLCacheName::buildFullName(
+ nvfirst->getString(), nvlast->getString());
+
+ }
+ if (!fullname.empty())
+ {
+ names.push_back(fullname);
+ }
+ else
+ {
+ llwarns << "llPanelGroupBulk: Selected avatar has no name: " << dest->getID() << llendl;
+ names.push_back("(Unknown)");
+ }
+ }
+ else
+ {
+ //looks like user try to invite offline friend
+ //for offline avatar_id gObjectList.findObject() will return null
+ //so we need to do this additional search in avatar tracker, see EXT-4732
+ if (LLAvatarTracker::instance().isBuddy(agent_id))
+ {
+ LLAvatarName av_name;
+ if (!LLAvatarNameCache::get(agent_id, &av_name))
+ {
+ // actually it should happen, just in case
+ LLAvatarNameCache::get(LLUUID(agent_id), boost::bind(&LLPanelGroupBulk::addUserCallback, this, _1, _2));
+ // for this special case!
+ //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
+ // removed id will be added in callback
+ agent_ids.erase(agent_ids.begin() + i);
+ }
+ else
+ {
+ names.push_back(av_name.getAccountName());
+ }
+ }
+ }
+ }
+ mImplementation->mListFullNotificationSent = false;
+ mImplementation->addUsers(names, agent_ids);
+}
+
diff --git a/indra/newview/llpanelgroupbulk.h b/indra/newview/llpanelgroupbulk.h
new file mode 100644
index 0000000000..25ae71ab86
--- /dev/null
+++ b/indra/newview/llpanelgroupbulk.h
@@ -0,0 +1,74 @@
+/**
+* @file llpanelgroupbulk.h
+* @brief Header file for llpanelgroupbulk
+* @author Baker@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLPANELGROUPBULK_H
+#define LL_LLPANELGROUPBULK_H
+
+#include "llpanel.h"
+#include "lluuid.h"
+
+class LLAvatarName;
+class LLGroupMgrGroupData;
+class LLPanelGroupBulkImpl;
+
+// Base panel class for bulk group invite / ban floaters
+class LLPanelGroupBulk : public LLPanel
+{
+public:
+ LLPanelGroupBulk(const LLUUID& group_id);
+ /*virtual*/ ~LLPanelGroupBulk();
+
+public:
+ static void callbackClickSubmit(void* userdata) {}
+ virtual void submit() = 0;
+
+public:
+ virtual void clear();
+ virtual void update();
+ virtual void draw();
+
+protected:
+ virtual void updateGroupName();
+ virtual void updateGroupData();
+
+public:
+ // this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers().
+ virtual void addUserCallback(const LLUUID& id, const LLAvatarName& av_name);
+ virtual void setCloseCallback(void (*close_callback)(void*), void* data);
+
+ virtual void addUsers(uuid_vec_t& agent_ids);
+
+public:
+ LLPanelGroupBulkImpl* mImplementation;
+
+protected:
+ bool mPendingGroupPropertiesUpdate;
+ bool mPendingRoleDataUpdate;
+ bool mPendingMemberDataUpdate;
+};
+
+#endif // LL_LLPANELGROUPBULK_H
+
diff --git a/indra/newview/llpanelgroupbulkban.cpp b/indra/newview/llpanelgroupbulkban.cpp
new file mode 100644
index 0000000000..cf1f0bc32f
--- /dev/null
+++ b/indra/newview/llpanelgroupbulkban.cpp
@@ -0,0 +1,259 @@
+/**
+* @file llpanelgroupbulkban.cpp
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelgroupbulkban.h"
+#include "llpanelgroupbulk.h"
+#include "llpanelgroupbulkimpl.h"
+
+#include "llagent.h"
+#include "llavatarnamecache.h"
+#include "llavataractions.h"
+#include "llfloateravatarpicker.h"
+#include "llbutton.h"
+#include "llcallingcard.h"
+#include "llcombobox.h"
+#include "llgroupactions.h"
+#include "llgroupmgr.h"
+#include "llnamelistctrl.h"
+#include "llnotificationsutil.h"
+#include "llscrolllistitem.h"
+#include "llslurl.h"
+#include "llspinctrl.h"
+#include "lltextbox.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "lluictrlfactory.h"
+#include "llviewerwindow.h"
+
+#include <boost/foreach.hpp>
+
+LLPanelGroupBulkBan::LLPanelGroupBulkBan(const LLUUID& group_id) : LLPanelGroupBulk(group_id)
+{
+ // Pass on construction of this panel to the control factory.
+ buildFromFile( "panel_group_bulk_ban.xml");
+}
+
+BOOL LLPanelGroupBulkBan::postBuild()
+{
+ BOOL recurse = TRUE;
+
+ mImplementation->mLoadingText = getString("loading");
+ mImplementation->mGroupName = getChild<LLTextBox>("group_name_text", recurse);
+ mImplementation->mBulkAgentList = getChild<LLNameListCtrl>("banned_agent_list", recurse);
+ if ( mImplementation->mBulkAgentList )
+ {
+ mImplementation->mBulkAgentList->setCommitOnSelectionChange(TRUE);
+ mImplementation->mBulkAgentList->setCommitCallback(LLPanelGroupBulkImpl::callbackSelect, mImplementation);
+ }
+
+ LLButton* button = getChild<LLButton>("add_button", recurse);
+ if ( button )
+ {
+ // default to opening avatarpicker automatically
+ // (*impl::callbackClickAdd)((void*)this);
+ button->setClickedCallback(LLPanelGroupBulkImpl::callbackClickAdd, this);
+ }
+
+ mImplementation->mRemoveButton =
+ getChild<LLButton>("remove_button", recurse);
+ if ( mImplementation->mRemoveButton )
+ {
+ mImplementation->mRemoveButton->setClickedCallback(LLPanelGroupBulkImpl::callbackClickRemove, mImplementation);
+ mImplementation->mRemoveButton->setEnabled(FALSE);
+ }
+
+ mImplementation->mOKButton =
+ getChild<LLButton>("ban_button", recurse);
+ if ( mImplementation->mOKButton )
+ {
+ mImplementation->mOKButton->setClickedCallback(LLPanelGroupBulkBan::callbackClickSubmit, this);
+ mImplementation->mOKButton->setEnabled(FALSE);
+ }
+
+ button = getChild<LLButton>("cancel_button", recurse);
+ if ( button )
+ {
+ button->setClickedCallback(LLPanelGroupBulkImpl::callbackClickCancel, mImplementation);
+ }
+
+ mImplementation->mTooManySelected = getString("ban_selection_too_large");
+ mImplementation->mBanNotPermitted = getString("ban_not_permitted");
+ mImplementation->mBanLimitFail = getString("ban_limit_fail");
+ mImplementation->mCannotBanYourself = getString("cant_ban_yourself");
+
+ update();
+ return TRUE;
+}
+
+// TODO: Refactor the shitty callback functions with void* -- just use boost::bind to call submit() instead.
+void LLPanelGroupBulkBan::callbackClickSubmit(void* userdata)
+{
+ LLPanelGroupBulkBan* selfp = (LLPanelGroupBulkBan*)userdata;
+
+ if(selfp)
+ selfp->submit();
+}
+
+
+void LLPanelGroupBulkBan::submit()
+{
+ if (!gAgent.hasPowerInGroup(mImplementation->mGroupID, GP_GROUP_BAN_ACCESS))
+ {
+ // Fail! Agent no longer have ban rights. Permissions could have changed after button was pressed.
+ LLSD msg;
+ msg["MESSAGE"] = mImplementation->mBanNotPermitted;
+ LLNotificationsUtil::add("GenericAlert", msg);
+ (*(mImplementation->mCloseCallback))(mImplementation->mCloseCallbackUserData);
+ return;
+ }
+ LLGroupMgrGroupData * group_datap = LLGroupMgr::getInstance()->getGroupData(mImplementation->mGroupID);
+ if (group_datap && group_datap->mBanList.size() >= GB_MAX_BANNED_AGENTS)
+ {
+ // Fail! Size limit exceeded. List could have updated after button was pressed.
+ LLSD msg;
+ msg["MESSAGE"] = mImplementation->mBanLimitFail;
+ LLNotificationsUtil::add("GenericAlert", msg);
+ (*(mImplementation->mCloseCallback))(mImplementation->mCloseCallbackUserData);
+ return;
+ }
+ std::vector<LLUUID> banned_agent_list;
+ std::vector<LLScrollListItem*> agents = mImplementation->mBulkAgentList->getAllData();
+ std::vector<LLScrollListItem*>::iterator iter = agents.begin();
+ for(;iter != agents.end(); ++iter)
+ {
+ LLScrollListItem* agent = *iter;
+ banned_agent_list.push_back(agent->getUUID());
+ }
+
+ const S32 MAX_BANS_PER_REQUEST = 100; // Max bans per request. 100 to match server cap.
+ if (banned_agent_list.size() > MAX_BANS_PER_REQUEST)
+ {
+ // Fail!
+ LLSD msg;
+ msg["MESSAGE"] = mImplementation->mTooManySelected;
+ LLNotificationsUtil::add("GenericAlert", msg);
+ (*(mImplementation->mCloseCallback))(mImplementation->mCloseCallbackUserData);
+ return;
+ }
+
+ // remove already banned users and yourself from request.
+ std::vector<LLAvatarName> banned_avatar_names;
+ std::vector<LLAvatarName> out_of_limit_names;
+ bool banning_self = FALSE;
+ std::vector<LLUUID>::iterator conflict = std::find(banned_agent_list.begin(), banned_agent_list.end(), gAgent.getID());
+ if (conflict != banned_agent_list.end())
+ {
+ banned_agent_list.erase(conflict);
+ banning_self = TRUE;
+ }
+ if (group_datap)
+ {
+ BOOST_FOREACH(const LLGroupMgrGroupData::ban_list_t::value_type& group_ban_pair, group_datap->mBanList)
+ {
+ const LLUUID& group_ban_agent_id = group_ban_pair.first;
+ std::vector<LLUUID>::iterator conflict = std::find(banned_agent_list.begin(), banned_agent_list.end(), group_ban_agent_id);
+ if (conflict != banned_agent_list.end())
+ {
+ LLAvatarName av_name;
+ LLAvatarNameCache::get(group_ban_agent_id, &av_name);
+ banned_avatar_names.push_back(av_name);
+
+ banned_agent_list.erase(conflict);
+ if (banned_agent_list.size() == 0)
+ {
+ break;
+ }
+ }
+ }
+ // this check should always be the last one before we send the request.
+ // Otherwise we have a possibility of cutting more then we need to.
+ if (banned_agent_list.size() > GB_MAX_BANNED_AGENTS - group_datap->mBanList.size())
+ {
+ std::vector<LLUUID>::iterator exeedes_limit = banned_agent_list.begin() + GB_MAX_BANNED_AGENTS - group_datap->mBanList.size();
+ for (std::vector<LLUUID>::iterator itor = exeedes_limit ;
+ itor != banned_agent_list.end(); ++itor)
+ {
+ LLAvatarName av_name;
+ LLAvatarNameCache::get(*itor, &av_name);
+ out_of_limit_names.push_back(av_name);
+ }
+ banned_agent_list.erase(exeedes_limit,banned_agent_list.end());
+ }
+ }
+
+ // sending request and ejecting members
+ if (banned_agent_list.size() != 0)
+ {
+ LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mImplementation->mGroupID, LLGroupMgr::BAN_CREATE | LLGroupMgr::BAN_UPDATE, banned_agent_list);
+ LLGroupMgr::getInstance()->sendGroupMemberEjects(mImplementation->mGroupID, banned_agent_list);
+ }
+
+ // building notification
+ if (banned_avatar_names.size() > 0 || banning_self || out_of_limit_names.size() > 0)
+ {
+ std::string reasons;
+ if(banned_avatar_names.size() > 0)
+ {
+ reasons = "\n " + buildResidentsArgument(banned_avatar_names, "residents_already_banned");
+ }
+
+ if(banning_self)
+ {
+ reasons += "\n " + mImplementation->mCannotBanYourself;
+ }
+
+ if(out_of_limit_names.size() > 0)
+ {
+ reasons += "\n " + buildResidentsArgument(out_of_limit_names, "ban_limit_reached");
+ }
+
+ LLStringUtil::format_map_t msg_args;
+ msg_args["[REASONS]"] = reasons;
+ LLSD msg;
+ if (banned_agent_list.size() == 0)
+ {
+ msg["MESSAGE"] = getString("ban_failed", msg_args);
+ }
+ else
+ {
+ msg["MESSAGE"] = getString("partial_ban", msg_args);
+ }
+ LLNotificationsUtil::add("GenericAlert", msg);
+ }
+
+ //then close
+ (*(mImplementation->mCloseCallback))(mImplementation->mCloseCallbackUserData);
+}
+
+std::string LLPanelGroupBulkBan::buildResidentsArgument(std::vector<LLAvatarName> avatar_names, const std::string &format)
+{
+ std::string names_string;
+ LLAvatarActions::buildResidentsString(avatar_names, names_string);
+ LLStringUtil::format_map_t args;
+ args["[RESIDENTS]"] = names_string;
+ return getString(format, args);
+}
diff --git a/indra/newview/llpanelgroupbulkban.h b/indra/newview/llpanelgroupbulkban.h
new file mode 100644
index 0000000000..9060d275f9
--- /dev/null
+++ b/indra/newview/llpanelgroupbulkban.h
@@ -0,0 +1,49 @@
+/**
+* @file llpanelgroupbulkban.h
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLPANELGROUPBULKBAN_H
+#define LL_LLPANELGROUPBULKBAN_H
+
+#include "llpanel.h"
+#include "lluuid.h"
+#include "llpanelgroupbulk.h"
+
+class LLAvatarName;
+
+class LLPanelGroupBulkBan : public LLPanelGroupBulk
+{
+public:
+ LLPanelGroupBulkBan(const LLUUID& group_id);
+ ~LLPanelGroupBulkBan() {}
+
+ virtual BOOL postBuild();
+
+ static void callbackClickSubmit(void* userdata);
+ virtual void submit();
+private:
+ std::string buildResidentsArgument(std::vector<LLAvatarName> avatar_names, const std::string &format);
+};
+
+#endif // LL_LLPANELGROUPBULKBAN_H
diff --git a/indra/newview/llpanelgroupbulkimpl.h b/indra/newview/llpanelgroupbulkimpl.h
new file mode 100644
index 0000000000..d3a48e5a9a
--- /dev/null
+++ b/indra/newview/llpanelgroupbulkimpl.h
@@ -0,0 +1,99 @@
+/**
+* @file llpanelgroupbulkimpl.h
+* @brief Class definition for implementation class of LLPanelGroupBulk
+* @author Baker@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLPANELGROUPBULKIMPL_H
+#define LL_LLPANELGROUPBULKIMPL_H
+
+#include "llpanel.h"
+#include "lluuid.h"
+
+class LLAvatarName;
+class LLNameListCtrl;
+class LLTextBox;
+class LLComboBox;
+
+//////////////////////////////////////////////////////////////////////////
+// Implementation found in llpanelgroupbulk.cpp
+//////////////////////////////////////////////////////////////////////////
+class LLPanelGroupBulkImpl
+{
+public:
+ LLPanelGroupBulkImpl(const LLUUID& group_id);
+ ~LLPanelGroupBulkImpl();
+
+ static void callbackClickAdd(void* userdata);
+ static void callbackClickRemove(void* userdata);
+
+ static void callbackClickCancel(void* userdata);
+
+ static void callbackSelect(LLUICtrl* ctrl, void* userdata);
+ static void callbackAddUsers(const uuid_vec_t& agent_ids, void* user_data);
+
+ static void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, void* user_data);
+
+ void handleRemove();
+ void handleSelection();
+
+ void addUsers(const std::vector<std::string>& names, const uuid_vec_t& agent_ids);
+ void setGroupName(std::string name);
+
+
+public:
+ static const S32 MAX_GROUP_INVITES = 100; // Max invites per request. 100 to match server cap.
+
+
+ LLUUID mGroupID;
+
+ LLNameListCtrl* mBulkAgentList;
+ LLButton* mOKButton;
+ LLButton* mRemoveButton;
+ LLTextBox* mGroupName;
+
+ std::string mLoadingText;
+ std::string mTooManySelected;
+ std::string mBanNotPermitted;
+ std::string mBanLimitFail;
+ std::string mCannotBanYourself;
+
+ std::set<LLUUID> mInviteeIDs;
+
+ void (*mCloseCallback)(void* data);
+ void* mCloseCallbackUserData;
+ boost::signals2::connection mAvatarNameCacheConnection;
+
+ // The following are for the LLPanelGroupInvite subclass only.
+ // These aren't needed for LLPanelGroupBulkBan, but if we have to add another
+ // group bulk floater for some reason, we'll have these objects too.
+public:
+ LLComboBox* mRoleNames;
+ std::string mOwnerWarning;
+ std::string mAlreadyInGroup;
+ bool mConfirmedOwnerInvite;
+ bool mListFullNotificationSent;
+};
+
+#endif // LL_LLPANELGROUPBULKIMPL_H
+
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index dd13e8abf4..236ad861a5 100755
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -260,7 +260,7 @@ void LLPanelGroupInvite::impl::addRoleNames(LLGroupMgrGroupData* gdatap)
//else if they have the limited add to roles power
//we add every role the user is in
//else we just add to everyone
- bool is_owner = member_data->isInRole(gdatap->mOwnerRole);
+ bool is_owner = member_data->isOwner();
bool can_assign_any = gAgent.hasPowerInGroup(mGroupID,
GP_ROLE_ASSIGN_MEMBER);
bool can_assign_limited = gAgent.hasPowerInGroup(mGroupID,
@@ -492,7 +492,7 @@ void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids)
}
else
{
- LL_WARNS() << "llPanelGroupInvite: Selected avatar has no name: " << dest->getID() << LL_ENDL;
+ llwarns << "llPanelGroupInvite: Selected avatar has no name: " << dest->getID() << llendl;
names.push_back("(Unknown)");
}
}
@@ -579,7 +579,7 @@ void LLPanelGroupInvite::updateLists()
{
waiting = true;
}
- if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete())
+ if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete() && gdatap->isRoleMemberDataComplete())
{
if ( mImplementation->mRoleNames )
{
@@ -607,6 +607,7 @@ void LLPanelGroupInvite::updateLists()
{
LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID);
LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID);
+ LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mImplementation->mGroupID);
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID);
}
mPendingUpdate = TRUE;
@@ -654,7 +655,7 @@ BOOL LLPanelGroupInvite::postBuild()
}
mImplementation->mOKButton =
- getChild<LLButton>("ok_button", recurse);
+ getChild<LLButton>("invite_button", recurse);
if ( mImplementation->mOKButton )
{
mImplementation->mOKButton->setClickedCallback(impl::callbackClickOK, mImplementation);
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index 106f6c25f1..375c54479d 100755
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -421,27 +421,14 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
msg->getUUID("QueryData", "OwnerID", owner_id, 0);
msg->getUUID("TransactionData", "TransactionID", trans_id);
+ S32 total_contribution = 0;
if(owner_id.isNull())
{
// special block which has total contribution
++first_block;
-
- S32 total_contribution;
+
msg->getS32("QueryData", "ActualArea", total_contribution, 0);
mPanel.getChild<LLUICtrl>("total_contributed_land_value")->setTextArg("[AREA]", llformat("%d", total_contribution));
-
- S32 committed;
- msg->getS32("QueryData", "BillableArea", committed, 0);
- mPanel.getChild<LLUICtrl>("total_land_in_use_value")->setTextArg("[AREA]", llformat("%d", committed));
-
- S32 available = total_contribution - committed;
- mPanel.getChild<LLUICtrl>("land_available_value")->setTextArg("[AREA]", llformat("%d", available));
-
- if ( mGroupOverLimitTextp && mGroupOverLimitIconp )
- {
- mGroupOverLimitIconp->setVisible(available < 0);
- mGroupOverLimitTextp->setVisible(available < 0);
- }
}
if ( trans_id != mTransID ) return;
@@ -460,7 +447,8 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
std::string sim_name;
std::string land_sku;
std::string land_type;
-
+ S32 committed = 0;
+
for(S32 i = first_block; i < count; ++i)
{
msg->getUUID("QueryData", "OwnerID", owner_id, i);
@@ -489,6 +477,9 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
S32 region_y = llround(global_y) % REGION_WIDTH_UNITS;
std::string location = sim_name + llformat(" (%d, %d)", region_x, region_y);
std::string area;
+ committed+=billable_area;
+
+
if(billable_area == actual_area)
{
area = llformat("%d", billable_area);
@@ -525,6 +516,16 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
mGroupParcelsp->addElement(row);
}
+
+ mPanel.getChild<LLUICtrl>("total_land_in_use_value")->setTextArg("[AREA]", llformat("%d", committed));
+
+ S32 available = total_contribution - committed;
+ mPanel.getChild<LLUICtrl>("land_available_value")->setTextArg("[AREA]", llformat("%d", available));
+ if ( mGroupOverLimitTextp && mGroupOverLimitIconp )
+ {
+ mGroupOverLimitIconp->setVisible(available < 0);
+ mGroupOverLimitTextp->setVisible(available < 0);
+ }
}
}
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 61fa4ea959..1d7ba4d741 100755
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -1,4 +1,4 @@
-/**
+/**
* @file llpanelgrouproles.cpp
* @brief Panel for roles information about a particular group.
*
@@ -32,6 +32,7 @@
#include "llavatarnamecache.h"
#include "llbutton.h"
#include "llfiltereditor.h"
+#include "llfloatergroupbulkban.h"
#include "llfloatergroupinvite.h"
#include "llavataractions.h"
#include "lliconctrl.h"
@@ -109,8 +110,10 @@ bool agentCanAddToRole(const LLUUID& group_id,
return false;
}
-// static
+// LLPanelGroupRoles /////////////////////////////////////////////////////
+
+// static
LLPanelGroupRoles::LLPanelGroupRoles()
: LLPanelGroupTab(),
mCurrentTab(NULL),
@@ -297,7 +300,6 @@ bool LLPanelGroupRoles::onModalClose(const LLSD& notification, const LLSD& respo
return false;
}
-
bool LLPanelGroupRoles::apply(std::string& mesg)
{
// Pass this along to the currently visible sub tab.
@@ -334,7 +336,6 @@ void LLPanelGroupRoles::update(LLGroupChange gc)
{
if (mGroupID.isNull()) return;
-
LLPanelGroupTab* panelp = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
if (panelp)
{
@@ -351,39 +352,33 @@ void LLPanelGroupRoles::activate()
{
// Start requesting member and role data if needed.
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- //if (!gdatap || mFirstUse)
+ if (!gdatap || !gdatap->isMemberDataComplete() )
{
- // Check member data.
-
- if (!gdatap || !gdatap->isMemberDataComplete() )
- {
- LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
- }
-
- // Check role data.
- if (!gdatap || !gdatap->isRoleDataComplete() )
- {
- // Mildly hackish - clear all pending changes
- cancel();
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
+ }
- LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mGroupID);
- }
+ if (!gdatap || !gdatap->isRoleDataComplete() )
+ {
+ // Mildly hackish - clear all pending changes
+ cancel();
- // Check role-member mapping data.
- if (!gdatap || !gdatap->isRoleMemberDataComplete() )
- {
- LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID);
- }
+ LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mGroupID);
+ }
- // Need this to get base group member powers
- if (!gdatap || !gdatap->isGroupPropertiesDataComplete() )
- {
- LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mGroupID);
- }
+ // Check role-member mapping data.
+ if (!gdatap || !gdatap->isRoleMemberDataComplete() )
+ {
+ LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID);
+ }
- mFirstUse = FALSE;
+ // Need this to get base group member powers
+ if (!gdatap || !gdatap->isGroupPropertiesDataComplete() )
+ {
+ LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mGroupID);
}
+ mFirstUse = FALSE;
+
LLPanelGroupTab* panelp = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
if (panelp) panelp->activate();
}
@@ -412,15 +407,38 @@ BOOL LLPanelGroupRoles::hasModal()
return panelp->hasModal();
}
+void LLPanelGroupRoles::setGroupID(const LLUUID& id)
+{
+ LLPanelGroupTab::setGroupID(id);
+
+ LLPanelGroupMembersSubTab* group_members_tab = findChild<LLPanelGroupMembersSubTab>("members_sub_tab");
+ LLPanelGroupRolesSubTab* group_roles_tab = findChild<LLPanelGroupRolesSubTab>("roles_sub_tab");
+ LLPanelGroupActionsSubTab* group_actions_tab = findChild<LLPanelGroupActionsSubTab>("actions_sub_tab");
+ LLPanelGroupBanListSubTab* group_ban_tab = findChild<LLPanelGroupBanListSubTab>("banlist_sub_tab");
+
+ if(group_members_tab) group_members_tab->setGroupID(id);
+ if(group_roles_tab) group_roles_tab->setGroupID(id);
+ if(group_actions_tab) group_actions_tab->setGroupID(id);
+ if(group_ban_tab) group_ban_tab->setGroupID(id);
-////////////////////////////
-// LLPanelGroupSubTab
-////////////////////////////
+ LLButton* button = getChild<LLButton>("member_invite");
+ if ( button )
+ button->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_INVITE));
+
+ if(mSubTabContainer)
+ mSubTabContainer->selectTab(1);
+ group_roles_tab->mFirstOpen = TRUE;
+ activate();
+}
+
+
+// LLPanelGroupSubTab ////////////////////////////////////////////////////
LLPanelGroupSubTab::LLPanelGroupSubTab()
: LLPanelGroupTab(),
mHeader(NULL),
mFooter(NULL),
mActivated(false),
+ mHasGroupBanPower(false),
mSearchEditor(NULL)
{
}
@@ -542,9 +560,10 @@ void LLPanelGroupSubTab::buildActionsList(LLScrollListCtrl* ctrl,
return;
}
+ mHasGroupBanPower = false;
+
std::vector<LLRoleActionSet*>::iterator ras_it = LLGroupMgr::getInstance()->mRoleActionSets.begin();
std::vector<LLRoleActionSet*>::iterator ras_end = LLGroupMgr::getInstance()->mRoleActionSets.end();
-
for ( ; ras_it != ras_end; ++ras_it)
{
buildActionCategory(ctrl,
@@ -674,6 +693,31 @@ void LLPanelGroupSubTab::buildActionCategory(LLScrollListCtrl* ctrl,
row["columns"][column_index]["value"] = (*ra_it)->mDescription;
row["columns"][column_index]["font"] = "SANSSERIF_SMALL";
+ if(mHasGroupBanPower)
+ {
+ // The ban ability is being set. Prevent these abilities from being manipulated
+ if((*ra_it)->mPowerBit == GP_MEMBER_EJECT)
+ {
+ row["enabled"] = false;
+ }
+ else if((*ra_it)->mPowerBit == GP_ROLE_REMOVE_MEMBER)
+ {
+ row["enabled"] = false;
+ }
+ }
+ else
+ {
+ // The ban ability is not set. Allow these abilities to be manipulated
+ if((*ra_it)->mPowerBit == GP_MEMBER_EJECT)
+ {
+ row["enabled"] = true;
+ }
+ else if((*ra_it)->mPowerBit == GP_ROLE_REMOVE_MEMBER)
+ {
+ row["enabled"] = true;
+ }
+ }
+
LLScrollListItem* item = ctrl->addElement(row, ADD_BOTTOM, (*ra_it));
if (-1 != check_box_index)
@@ -709,6 +753,15 @@ void LLPanelGroupSubTab::buildActionCategory(LLScrollListCtrl* ctrl,
check->setTentative(TRUE);
}
}
+
+ // Regardless of whether or not this ability is allowed by all or some, we want to prevent
+ // the group managers from accidentally disabling either of the two additional abilities
+ // tied with GP_GROUP_BAN_ACCESS.
+ if( (allowed_by_all & GP_GROUP_BAN_ACCESS) == GP_GROUP_BAN_ACCESS ||
+ (allowed_by_some & GP_GROUP_BAN_ACCESS) == GP_GROUP_BAN_ACCESS)
+ {
+ mHasGroupBanPower = true;
+ }
}
}
@@ -728,11 +781,8 @@ void LLPanelGroupSubTab::setFooterEnabled(BOOL enable)
}
}
-////////////////////////////
-// LLPanelGroupMembersSubTab
-////////////////////////////
-
+// LLPanelGroupMembersSubTab /////////////////////////////////////////////
static LLPanelInjector<LLPanelGroupMembersSubTab> t_panel_group_members_subtab("panel_group_members_subtab");
LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab()
@@ -743,17 +793,20 @@ LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab()
mChanged(FALSE),
mPendingMemberUpdate(FALSE),
mHasMatch(FALSE),
- mNumOwnerAdditions(0),
- mAvatarNameCacheConnection()
+ mNumOwnerAdditions(0)
{
}
LLPanelGroupMembersSubTab::~LLPanelGroupMembersSubTab()
{
- if (mAvatarNameCacheConnection.connected())
+ for (avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.begin(); it != mAvatarNameCacheConnections.end(); ++it)
{
- mAvatarNameCacheConnection.disconnect();
+ if (it->second.connected())
+ {
+ it->second.disconnect();
+ }
}
+ mAvatarNameCacheConnections.clear();
if (mMembersList)
{
gSavedSettings.setString("GroupMembersSortOrder", mMembersList->getSortColumnName());
@@ -810,6 +863,13 @@ BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
mEjectBtn->setEnabled(FALSE);
}
+ mBanBtn = parent->getChild<LLButton>("member_ban", recurse);
+ if(mBanBtn)
+ {
+ mBanBtn->setClickedCallback(onBanMember, this);
+ mBanBtn->setEnabled(FALSE);
+ }
+
return TRUE;
}
@@ -823,34 +883,6 @@ void LLPanelGroupMembersSubTab::setGroupID(const LLUUID& id)
LLPanelGroupSubTab::setGroupID(id);
}
-void LLPanelGroupRolesSubTab::setGroupID(const LLUUID& id)
-{
- if(mRolesList) mRolesList->deleteAllItems();
- if(mAssignedMembersList) mAssignedMembersList->deleteAllItems();
- if(mAllowedActionsList) mAllowedActionsList->deleteAllItems();
-
- if(mRoleName) mRoleName->clear();
- if(mRoleDescription) mRoleDescription->clear();
- if(mRoleTitle) mRoleTitle->clear();
-
- mHasRoleChange = FALSE;
-
- setFooterEnabled(FALSE);
-
- LLPanelGroupSubTab::setGroupID(id);
-}
-void LLPanelGroupActionsSubTab::setGroupID(const LLUUID& id)
-{
- if(mActionList) mActionList->deleteAllItems();
- if(mActionRoles) mActionRoles->deleteAllItems();
- if(mActionMembers) mActionMembers->deleteAllItems();
-
- if(mActionDescription) mActionDescription->clear();
-
- LLPanelGroupSubTab::setGroupID(id);
-}
-
-
// static
void LLPanelGroupMembersSubTab::onMemberSelect(LLUICtrl* ctrl, void* user_data)
{
@@ -879,7 +911,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
// Build a vector of all selected members, and gather allowed actions.
uuid_vec_t selected_members;
- U64 allowed_by_all = 0xffffffffffffLL;
+ U64 allowed_by_all = GP_ALL_POWERS; //0xFFFFffffFFFFffffLL;
U64 allowed_by_some = 0;
std::vector<LLScrollListItem*>::iterator itor;
@@ -916,8 +948,8 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
LLGroupMgrGroupData::role_list_t::iterator iter = gdatap->mRoles.begin();
LLGroupMgrGroupData::role_list_t::iterator end = gdatap->mRoles.end();
- BOOL can_eject_members = gAgent.hasPowerInGroup(mGroupID,
- GP_MEMBER_EJECT);
+ BOOL can_ban_members = gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS);
+ BOOL can_eject_members = gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_EJECT);
BOOL member_is_owner = FALSE;
for( ; iter != end; ++iter)
@@ -964,6 +996,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
{
// Can't remove other owners.
cb_enable = FALSE;
+ can_ban_members = FALSE;
break;
}
}
@@ -983,14 +1016,14 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
}
// If anyone selected is in any role besides 'Everyone' then they can't be ejected.
- if (role_id.notNull() && (count > 0))
- {
+ if (role_id.notNull() && (count > 0))
+ {
can_eject_members = FALSE;
- if (role_id == gdatap->mOwnerRole)
- {
- member_is_owner = TRUE;
- }
- }
+ if (role_id == gdatap->mOwnerRole)
+ {
+ member_is_owner = TRUE;
+ }
+ }
LLRoleData rd;
if (gdatap->getRoleData(role_id,rd))
@@ -1047,7 +1080,10 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
mAssignedRolesList->setEnabled(TRUE);
if (gAgent.isGodlike())
+ {
can_eject_members = TRUE;
+ // can_ban_members = TRUE;
+ }
if (!can_eject_members && !member_is_owner)
{
@@ -1060,10 +1096,41 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
if ( member_data && member_data->isInRole(gdatap->mOwnerRole) )
{
can_eject_members = TRUE;
+ //can_ban_members = TRUE;
}
}
+
+ }
+
+ // ... or we can eject them because we have all the requisite powers...
+ if( gAgent.hasPowerInGroup(mGroupID, GP_ROLE_REMOVE_MEMBER) &&
+ !member_is_owner)
+ {
+ if( gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_EJECT))
+ {
+ can_eject_members = TRUE;
+ }
+
+ if( gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS))
+ {
+ can_ban_members = TRUE;
+ }
}
+
+ uuid_vec_t::const_iterator member_iter = selected_members.begin();
+ uuid_vec_t::const_iterator member_end = selected_members.end();
+ for ( ; member_iter != member_end; ++member_iter)
+ {
+ // Don't count the agent.
+ if ((*member_iter) == gAgent.getID())
+ {
+ can_eject_members = FALSE;
+ can_ban_members = FALSE;
+ }
+ }
+
+ mBanBtn->setEnabled(can_ban_members);
mEjectBtn->setEnabled(can_eject_members);
}
@@ -1101,61 +1168,26 @@ void LLPanelGroupMembersSubTab::onEjectMembers(void *userdata)
}
void LLPanelGroupMembersSubTab::handleEjectMembers()
-{
+{
+ //send down an eject message
+ uuid_vec_t selected_members;
+
std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
if (selection.empty()) return;
-
- S32 selection_count = selection.size();
- if (selection_count == 1)
- {
- LLSD args;
- LLUUID selected_avatar = mMembersList->getValue().asUUID();
- std::string fullname = LLSLURL("agent", selected_avatar, "inspect").getSLURLString();
- args["AVATAR_NAME"] = fullname;
- LLSD payload;
- LLNotificationsUtil::add("EjectGroupMemberWarning",
- args,
- payload,
- boost::bind(&LLPanelGroupMembersSubTab::handleEjectCallback, this, _1, _2));
- }
- else
- {
- LLSD args;
- args["COUNT"] = llformat("%d", selection_count);
- LLSD payload;
- LLNotificationsUtil::add("EjectGroupMembersWarning",
- args,
- payload,
- boost::bind(&LLPanelGroupMembersSubTab::handleEjectCallback, this, _1, _2));
- }
-}
-bool LLPanelGroupMembersSubTab::handleEjectCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (0 == option) // Eject button
+ std::vector<LLScrollListItem*>::iterator itor;
+ for (itor = selection.begin() ;
+ itor != selection.end(); ++itor)
{
- //send down an eject message
- uuid_vec_t selected_members;
-
- std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
- if (selection.empty()) return false;
-
- std::vector<LLScrollListItem*>::iterator itor;
- for (itor = selection.begin() ;
- itor != selection.end(); ++itor)
- {
- LLUUID member_id = (*itor)->getUUID();
- selected_members.push_back( member_id );
- }
-
- mMembersList->deleteSelectedItems();
-
- sendEjectNotifications(mGroupID, selected_members);
-
- LLGroupMgr::getInstance()->sendGroupMemberEjects(mGroupID, selected_members);
+ LLUUID member_id = (*itor)->getUUID();
+ selected_members.push_back( member_id );
}
- return false;
+
+ mMembersList->deleteSelectedItems();
+
+ sendEjectNotifications(mGroupID, selected_members);
+
+ LLGroupMgr::getInstance()->sendGroupMemberEjects(mGroupID, selected_members);
}
void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const uuid_vec_t& selected_members)
@@ -1183,12 +1215,11 @@ void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,
//add that the user is requesting to change the roles for selected
//members
- U64 powers_all_have = 0xffffffffffffLL;
+ U64 powers_all_have = GP_ALL_POWERS;
U64 powers_some_have = 0;
BOOL is_owner_role = ( gdatap->mOwnerRole == role_id );
LLUUID member_id;
-
std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
if (selection.empty())
@@ -1199,7 +1230,6 @@ void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,
for (std::vector<LLScrollListItem*>::iterator itor = selection.begin() ;
itor != selection.end(); ++itor)
{
-
member_id = (*itor)->getUUID();
//see if we requested a change for this member before
@@ -1265,7 +1295,6 @@ void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,
FALSE);
}
-
// static
void LLPanelGroupMembersSubTab::onRoleCheck(LLUICtrl* ctrl, void* user_data)
{
@@ -1304,6 +1333,15 @@ void LLPanelGroupMembersSubTab::activate()
update(GC_ALL);
mActivated = true;
}
+ else
+ {
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+ // Members can be removed outside of this tab, checking changes
+ if (!gdatap || (gdatap->isMemberDataComplete() && gdatap->mMembers.size() != mMembersList->getItemCount()))
+ {
+ update(GC_MEMBER_DATA);
+ }
+ }
}
void LLPanelGroupMembersSubTab::deactivate()
@@ -1644,9 +1682,17 @@ void LLPanelGroupMembersSubTab::addMemberToList(LLGroupMemberData* data)
mHasMatch = TRUE;
}
-void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name)
+void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name, const LLUUID& av_id)
{
- mAvatarNameCacheConnection.disconnect();
+ avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(av_id);
+ if (it != mAvatarNameCacheConnections.end())
+ {
+ if (it->second.connected())
+ {
+ it->second.disconnect();
+ }
+ mAvatarNameCacheConnections.erase(it);
+ }
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if (!gdatap
@@ -1690,13 +1736,12 @@ void LLPanelGroupMembersSubTab::updateMembers()
return;
}
- //cleanup list only for first iretation
+ //cleanup list only for first iteration
if(mMemberProgress == gdatap->mMembers.begin())
{
mMembersList->deleteAllItems();
}
-
LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
LLTimer update_time;
@@ -1719,12 +1764,16 @@ void LLPanelGroupMembersSubTab::updateMembers()
else
{
// If name is not cached, onNameCache() should be called when it is cached and add this member to list.
- // *TODO : Add one callback per fetched avatar name
- if (mAvatarNameCacheConnection.connected())
+ avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(mMemberProgress->first);
+ if (it != mAvatarNameCacheConnections.end())
{
- mAvatarNameCacheConnection.disconnect();
+ if (it->second.connected())
+ {
+ it->second.disconnect();
+ }
+ mAvatarNameCacheConnections.erase(it);
}
- mAvatarNameCacheConnection = LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupMembersSubTab::onNameCache, this, gdatap->getMemberVersion(), mMemberProgress->second, _2));
+ mAvatarNameCacheConnections[mMemberProgress->first] = LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupMembersSubTab::onNameCache, this, gdatap->getMemberVersion(), mMemberProgress->second, _2, _1));
}
}
@@ -1749,12 +1798,44 @@ void LLPanelGroupMembersSubTab::updateMembers()
handleMemberSelect();
}
+void LLPanelGroupMembersSubTab::onBanMember(void* user_data)
+{
+ LLPanelGroupMembersSubTab* self = static_cast<LLPanelGroupMembersSubTab*>(user_data);
+ self->handleBanMember();
+}
+void LLPanelGroupMembersSubTab::handleBanMember()
+{
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+ if(!gdatap)
+ {
+ LL_WARNS("Groups") << "Unable to get group data for group " << mGroupID << LL_ENDL;
+ return;
+ }
+
+ std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
+ if(selection.empty())
+ {
+ return;
+ }
+
+ uuid_vec_t ban_ids;
+ std::vector<LLScrollListItem*>::iterator itor;
+ for(itor = selection.begin(); itor != selection.end(); ++itor)
+ {
+ LLUUID ban_id = (*itor)->getUUID();
+ ban_ids.push_back(ban_id);
+
+ LLGroupBanData ban_data;
+ gdatap->createBanEntry(ban_id, ban_data);
+ }
+
+ LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mGroupID, LLGroupMgr::BAN_CREATE, ban_ids);
+ handleEjectMembers();
+}
-////////////////////////////
-// LLPanelGroupRolesSubTab
-////////////////////////////
+// LLPanelGroupRolesSubTab ///////////////////////////////////////////////
static LLPanelInjector<LLPanelGroupRolesSubTab> t_panel_group_roles_subtab("panel_group_roles_subtab");
LLPanelGroupRolesSubTab::LLPanelGroupRolesSubTab()
@@ -1768,7 +1849,7 @@ LLPanelGroupRolesSubTab::LLPanelGroupRolesSubTab()
mMemberVisibleCheck(NULL),
mDeleteRoleButton(NULL),
mCreateRoleButton(NULL),
-
+ mFirstOpen(TRUE),
mHasRoleChange(FALSE)
{
}
@@ -1870,6 +1951,7 @@ void LLPanelGroupRolesSubTab::deactivate()
LL_DEBUGS() << "LLPanelGroupRolesSubTab::deactivate()" << LL_ENDL;
LLPanelGroupSubTab::deactivate();
+ mFirstOpen = FALSE;
}
bool LLPanelGroupRolesSubTab::needsApply(std::string& mesg)
@@ -1877,6 +1959,12 @@ bool LLPanelGroupRolesSubTab::needsApply(std::string& mesg)
LL_DEBUGS() << "LLPanelGroupRolesSubTab::needsApply()" << LL_ENDL;
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+ if(!gdatap)
+ {
+ llwarns << "Unable to get group data for group " << mGroupID << llendl;
+ return false;
+ }
+
return (mHasRoleChange // Text changed in current role
|| (gdatap && gdatap->pendingRoleChanges())); // Pending role changes in the group
@@ -1887,7 +1975,7 @@ bool LLPanelGroupRolesSubTab::apply(std::string& mesg)
LL_DEBUGS() << "LLPanelGroupRolesSubTab::apply()" << LL_ENDL;
saveRoleChanges(true);
-
+ mFirstOpen = FALSE;
LLGroupMgr::getInstance()->sendGroupRoleChanges(mGroupID);
notifyObservers();
@@ -2024,14 +2112,17 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc)
}
}
- if (!gdatap || !gdatap->isMemberDataComplete())
- {
- LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
- }
-
- if (!gdatap || !gdatap->isRoleMemberDataComplete())
+ if(!mFirstOpen)
{
- LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID);
+ if (!gdatap || !gdatap->isMemberDataComplete())
+ {
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID);
+ }
+
+ if (!gdatap || !gdatap->isRoleMemberDataComplete())
+ {
+ LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID);
+ }
}
if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc)
@@ -2047,6 +2138,9 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc)
void LLPanelGroupRolesSubTab::onRoleSelect(LLUICtrl* ctrl, void* user_data)
{
LLPanelGroupRolesSubTab* self = static_cast<LLPanelGroupRolesSubTab*>(user_data);
+ if (!self)
+ return;
+
self->handleRoleSelect();
}
@@ -2226,40 +2320,115 @@ void LLPanelGroupRolesSubTab::handleActionCheck(LLUICtrl* ctrl, bool force)
LLRoleAction* rap = (LLRoleAction*)action_item->getUserdata();
U64 power = rap->mPowerBit;
- if (check->get())
+ bool isEnablingAbility = check->get();
+ LLRoleData rd;
+ LLSD args;
+
+ if (isEnablingAbility &&
+ !force &&
+ ((GP_ROLE_ASSIGN_MEMBER == power) || (GP_ROLE_CHANGE_ACTIONS == power) ))
{
- if (!force && ( (GP_ROLE_ASSIGN_MEMBER == power)
- || (GP_ROLE_CHANGE_ACTIONS == power) ))
- {
- // Uncheck the item, for now. It will be
- // checked if they click 'Yes', below.
- check->set(FALSE);
+ // Uncheck the item, for now. It will be
+ // checked if they click 'Yes', below.
+ check->set(FALSE);
- LLRoleData rd;
- LLSD args;
+ LLRoleData rd;
+ LLSD args;
- if ( gdatap->getRoleData(role_id, rd) )
+ if ( gdatap->getRoleData(role_id, rd) )
+ {
+ args["ACTION_NAME"] = rap->mDescription;
+ args["ROLE_NAME"] = rd.mRoleName;
+ mHasModal = TRUE;
+ std::string warning = "AssignDangerousActionWarning";
+ if (GP_ROLE_CHANGE_ACTIONS == power)
{
- args["ACTION_NAME"] = rap->mDescription;
- args["ROLE_NAME"] = rd.mRoleName;
- mHasModal = TRUE;
- std::string warning = "AssignDangerousActionWarning";
- if (GP_ROLE_CHANGE_ACTIONS == power)
- {
- warning = "AssignDangerousAbilityWarning";
- }
- LLNotificationsUtil::add(warning, args, LLSD(), boost::bind(&LLPanelGroupRolesSubTab::addActionCB, this, _1, _2, check));
+ warning = "AssignDangerousAbilityWarning";
}
- else
- {
+ LLNotificationsUtil::add(warning, args, LLSD(), boost::bind(&LLPanelGroupRolesSubTab::addActionCB, this, _1, _2, check));
+ }
+ else
+ {
LL_WARNS() << "Unable to look up role information for role id: "
<< role_id << LL_ENDL;
+ }
+ }
+
+ if(GP_GROUP_BAN_ACCESS == power)
+ {
+ std::string warning = isEnablingAbility ? "AssignBanAbilityWarning" : "RemoveBanAbilityWarning";
+
+ //////////////////////////////////////////////////////////////////////////
+ // Get role data for both GP_ROLE_REMOVE_MEMBER and GP_MEMBER_EJECT
+ // Add description and role name to LLSD
+ // Pop up dialog saying "Yo, you also granted these other abilities when you did this!"
+ if ( gdatap->getRoleData(role_id, rd) )
+ {
+ args["ACTION_NAME"] = rap->mDescription;
+ args["ROLE_NAME"] = rd.mRoleName;
+ mHasModal = TRUE;
+
+ std::vector<LLScrollListItem*> all_data = mAllowedActionsList->getAllData();
+ std::vector<LLScrollListItem*>::iterator ad_it = all_data.begin();
+ std::vector<LLScrollListItem*>::iterator ad_end = all_data.end();
+ LLRoleAction* adp;
+ for( ; ad_it != ad_end; ++ad_it)
+ {
+ adp = (LLRoleAction*)(*ad_it)->getUserdata();
+ if(adp->mPowerBit == GP_MEMBER_EJECT)
+ {
+ args["ACTION_NAME_2"] = adp->mDescription;
+ }
+ else if(adp->mPowerBit == GP_ROLE_REMOVE_MEMBER)
+ {
+ args["ACTION_NAME_3"] = adp->mDescription;
+ }
}
+
+ LLNotificationsUtil::add(warning, args);
+ }
+ else
+ {
+ llwarns << "Unable to look up role information for role id: "
+ << role_id << llendl;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+
+ LLGroupMgrGroupData::role_list_t::iterator rit = gdatap->mRoles.find(role_id);
+ U64 current_role_powers = GP_NO_POWERS;
+ if (rit != gdatap->mRoles.end())
+ {
+ current_role_powers = ((*rit).second->getRoleData().mRolePowers);
+ }
+
+ if(isEnablingAbility)
+ {
+ power |= (GP_ROLE_REMOVE_MEMBER | GP_MEMBER_EJECT);
+ current_role_powers |= power;
}
else
{
- gdatap->addRolePower(role_id,power);
+ current_role_powers &= ~GP_GROUP_BAN_ACCESS;
}
+
+ mAllowedActionsList->deleteAllItems();
+ buildActionsList( mAllowedActionsList,
+ current_role_powers,
+ current_role_powers,
+ boost::bind(&LLPanelGroupRolesSubTab::handleActionCheck, this, _1, false),
+ TRUE,
+ FALSE,
+ FALSE);
+
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Adding non-specific ability to role
+ //////////////////////////////////////////////////////////////////////////
+ if(isEnablingAbility)
+ {
+ gdatap->addRolePower(role_id, power);
}
else
{
@@ -2268,6 +2437,7 @@ void LLPanelGroupRolesSubTab::handleActionCheck(LLUICtrl* ctrl, bool force)
mHasRoleChange = TRUE;
notifyObservers();
+
}
bool LLPanelGroupRolesSubTab::addActionCB(const LLSD& notification, const LLSD& response, LLCheckBoxCtrl* check)
@@ -2287,7 +2457,6 @@ bool LLPanelGroupRolesSubTab::addActionCB(const LLSD& notification, const LLSD&
return false;
}
-
// static
void LLPanelGroupRolesSubTab::onPropertiesKey(LLLineEditor* ctrl, void* user_data)
{
@@ -2465,12 +2634,27 @@ void LLPanelGroupRolesSubTab::saveRoleChanges(bool select_saved_role)
mHasRoleChange = FALSE;
}
}
-////////////////////////////
-// LLPanelGroupActionsSubTab
-////////////////////////////
-static LLPanelInjector<LLPanelGroupActionsSubTab> t_panel_group_actions_subtab("panel_group_actions_subtab");
+void LLPanelGroupRolesSubTab::setGroupID(const LLUUID& id)
+{
+ if(mRolesList) mRolesList->deleteAllItems();
+ if(mAssignedMembersList) mAssignedMembersList->deleteAllItems();
+ if(mAllowedActionsList) mAllowedActionsList->deleteAllItems();
+
+ if(mRoleName) mRoleName->clear();
+ if(mRoleDescription) mRoleDescription->clear();
+ if(mRoleTitle) mRoleTitle->clear();
+
+ mHasRoleChange = FALSE;
+ setFooterEnabled(FALSE);
+
+ LLPanelGroupSubTab::setGroupID(id);
+}
+
+
+// LLPanelGroupActionsSubTab /////////////////////////////////////////////
+static LLPanelInjector<LLPanelGroupActionsSubTab> t_panel_group_actions_subtab("panel_group_actions_subtab");
LLPanelGroupActionsSubTab::LLPanelGroupActionsSubTab()
: LLPanelGroupSubTab()
@@ -2644,26 +2828,298 @@ void LLPanelGroupActionsSubTab::handleActionSelect()
}
}
-void LLPanelGroupRoles::setGroupID(const LLUUID& id)
+void LLPanelGroupActionsSubTab::setGroupID(const LLUUID& id)
{
- LLPanelGroupTab::setGroupID(id);
+ if(mActionList) mActionList->deleteAllItems();
+ if(mActionRoles) mActionRoles->deleteAllItems();
+ if(mActionMembers) mActionMembers->deleteAllItems();
+
+ if(mActionDescription) mActionDescription->clear();
+
+ LLPanelGroupSubTab::setGroupID(id);
+}
+
+
+// LLPanelGroupBanListSubTab /////////////////////////////////////////////
+static LLPanelInjector<LLPanelGroupBanListSubTab> t_panel_group_ban_subtab("panel_group_banlist_subtab");
+
+LLPanelGroupBanListSubTab::LLPanelGroupBanListSubTab()
+ : LLPanelGroupSubTab(),
+ mBanList(NULL),
+ mCreateBanButton(NULL),
+ mDeleteBanButton(NULL)
+{}
+
+BOOL LLPanelGroupBanListSubTab::postBuildSubTab(LLView* root)
+{
+ LLPanelGroupSubTab::postBuildSubTab(root);
+
+ // Upcast parent so we can ask it for sibling controls.
+ LLPanelGroupRoles* parent = (LLPanelGroupRoles*)root;
+
+ // Look recursively from the parent to find all our widgets.
+ bool recurse = true;
- LLPanelGroupMembersSubTab* group_members_tab = findChild<LLPanelGroupMembersSubTab>("members_sub_tab");
- LLPanelGroupRolesSubTab* group_roles_tab = findChild<LLPanelGroupRolesSubTab>("roles_sub_tab");
- LLPanelGroupActionsSubTab* group_actions_tab = findChild<LLPanelGroupActionsSubTab>("actions_sub_tab");
+ mHeader = parent->getChild<LLPanel>("banlist_header", recurse);
+ mFooter = parent->getChild<LLPanel>("banlist_footer", recurse);
+
+ mBanList = parent->getChild<LLNameListCtrl>("ban_list", recurse);
+
+ mCreateBanButton = parent->getChild<LLButton>("ban_create", recurse);
+ mDeleteBanButton = parent->getChild<LLButton>("ban_delete", recurse);
+ mRefreshBanListButton = parent->getChild<LLButton>("ban_refresh", recurse);
+ mBanCountText = parent->getChild<LLTextBase>("ban_count", recurse);
- if(group_members_tab) group_members_tab->setGroupID(id);
- if(group_roles_tab) group_roles_tab->setGroupID(id);
- if(group_actions_tab) group_actions_tab->setGroupID(id);
+ if(!mBanList || !mCreateBanButton || !mDeleteBanButton || !mRefreshBanListButton || !mBanCountText)
+ return FALSE;
- LLButton* button = getChild<LLButton>("member_invite");
- if ( button )
- button->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_INVITE));
+ mBanList->setCommitOnSelectionChange(TRUE);
+ mBanList->setCommitCallback(onBanEntrySelect, this);
- if(mSubTabContainer)
- mSubTabContainer->selectTab(1);
+ mCreateBanButton->setClickedCallback(onCreateBanEntry, this);
+ mCreateBanButton->setEnabled(FALSE);
- activate();
+ mDeleteBanButton->setClickedCallback(onDeleteBanEntry, this);
+ mDeleteBanButton->setEnabled(FALSE);
+
+ mRefreshBanListButton->setClickedCallback(onRefreshBanList, this);
+ mRefreshBanListButton->setEnabled(FALSE);
+
+ setBanCount(0);
+
+ mBanList->setOnNameListCompleteCallback(boost::bind(&LLPanelGroupBanListSubTab::onBanListCompleted, this, _1));
+
+ populateBanList();
+
+ setFooterEnabled(FALSE);
+ return TRUE;
}
+void LLPanelGroupBanListSubTab::activate()
+{
+ LLPanelGroupSubTab::activate();
+
+ mBanList->deselectAllItems();
+ mDeleteBanButton->setEnabled(FALSE);
+ LLGroupMgrGroupData * group_datap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+ if (group_datap)
+ {
+ mCreateBanButton->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS) &&
+ group_datap->mBanList.size() < GB_MAX_BANNED_AGENTS);
+ setBanCount(group_datap->mBanList.size());
+ }
+ else
+ {
+ mCreateBanButton->setEnabled(FALSE);
+ setBanCount(0);
+ }
+
+ // BAKER: Should I really request everytime activate() is called?
+ // Perhaps I should only do it on a force refresh, or if an action on the list happens...
+ // Because it's not going to live-update the list anyway... You'd have to refresh if you
+ // wanted to see someone else's additions anyway...
+ //
+ LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID);
+
+ setFooterEnabled(FALSE);
+ update(GC_ALL);
+}
+
+void LLPanelGroupBanListSubTab::update(LLGroupChange gc)
+{
+ populateBanList();
+}
+
+void LLPanelGroupBanListSubTab::draw()
+{
+ LLPanelGroupSubTab::draw();
+
+ // BAKER: Might be good to put it here instead of update, maybe.. See how often draw gets hit.
+ //if(
+ // populateBanList();
+}
+
+void LLPanelGroupBanListSubTab::onBanEntrySelect(LLUICtrl* ctrl, void* user_data)
+{
+ LLPanelGroupBanListSubTab* self = static_cast<LLPanelGroupBanListSubTab*>(user_data);
+ if (!self)
+ return;
+
+ self->handleBanEntrySelect();
+}
+
+void LLPanelGroupBanListSubTab::handleBanEntrySelect()
+{
+ if (gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS))
+ {
+ mDeleteBanButton->setEnabled(TRUE);
+ }
+}
+
+void LLPanelGroupBanListSubTab::onCreateBanEntry(void* user_data)
+{
+ LLPanelGroupBanListSubTab* self = static_cast<LLPanelGroupBanListSubTab*>(user_data);
+ if (!self)
+ return;
+
+ self->handleCreateBanEntry();
+}
+
+void LLPanelGroupBanListSubTab::handleCreateBanEntry()
+{
+ LLFloaterGroupBulkBan::showForGroup(mGroupID);
+ //populateBanList();
+}
+
+void LLPanelGroupBanListSubTab::onDeleteBanEntry(void* user_data)
+{
+ LLPanelGroupBanListSubTab* self = static_cast<LLPanelGroupBanListSubTab*>(user_data);
+ if (!self)
+ return;
+
+ self->handleDeleteBanEntry();
+}
+
+void LLPanelGroupBanListSubTab::handleDeleteBanEntry()
+{
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+ if(!gdatap)
+ {
+ LL_WARNS("Groups") << "Unable to get group data for group " << mGroupID << LL_ENDL;
+ return;
+ }
+
+ std::vector<LLScrollListItem*> selection = mBanList->getAllSelected();
+ if(selection.empty())
+ {
+ return;
+ }
+
+ bool can_ban_members = false;
+ if (gAgent.isGodlike() ||
+ gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS))
+ {
+ can_ban_members = true;
+ }
+
+ // Owners can ban anyone in the group.
+ LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find(gAgent.getID());
+ if (mi != gdatap->mMembers.end())
+ {
+ LLGroupMemberData* member_data = (*mi).second;
+ if ( member_data && member_data->isInRole(gdatap->mOwnerRole) )
+ {
+ can_ban_members = true;
+ }
+ }
+
+ if(!can_ban_members)
+ return;
+
+ std::vector<LLUUID> ban_ids;
+ std::vector<LLScrollListItem*>::iterator itor;
+ for(itor = selection.begin(); itor != selection.end(); ++itor)
+ {
+ LLUUID ban_id = (*itor)->getUUID();
+ ban_ids.push_back(ban_id);
+
+ gdatap->removeBanEntry(ban_id);
+ mBanList->removeNameItem(ban_id);
+
+ // Removing an item removes the selection, we shouldn't be able to click
+ // the button anymore until we reselect another entry.
+ mDeleteBanButton->setEnabled(FALSE);
+ }
+
+ // update ban-count related elements
+ mCreateBanButton->setEnabled(TRUE);
+ setBanCount(gdatap->mBanList.size());
+
+ LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_POST, mGroupID, LLGroupMgr::BAN_DELETE, ban_ids);
+}
+
+void LLPanelGroupBanListSubTab::onRefreshBanList(void* user_data)
+{
+ LLPanelGroupBanListSubTab* self = static_cast<LLPanelGroupBanListSubTab*>(user_data);
+ if (!self)
+ return;
+
+ self->handleRefreshBanList();
+}
+
+void LLPanelGroupBanListSubTab::handleRefreshBanList()
+{
+ mRefreshBanListButton->setEnabled(FALSE);
+ LLGroupMgr::getInstance()->sendGroupBanRequest(LLGroupMgr::REQUEST_GET, mGroupID);
+}
+
+void LLPanelGroupBanListSubTab::onBanListCompleted(bool isComplete)
+{
+ if(isComplete)
+ {
+ mRefreshBanListButton->setEnabled(TRUE);
+ populateBanList();
+ }
+}
+
+void LLPanelGroupBanListSubTab::setBanCount(U32 ban_count)
+{
+ LLStringUtil::format_map_t args;
+ args["[COUNT]"] = llformat("%d", ban_count);
+ args["[LIMIT]"] = llformat("%d", GB_MAX_BANNED_AGENTS);
+ mBanCountText->setText(getString("ban_count_template", args));
+}
+
+void LLPanelGroupBanListSubTab::populateBanList()
+{
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+ if(!gdatap)
+ {
+ LL_WARNS("Groups") << "Unable to get group data for group " << mGroupID << LL_ENDL;
+ return;
+ }
+
+ mBanList->deleteAllItems();
+ std::map<LLUUID,LLGroupBanData>::const_iterator entry = gdatap->mBanList.begin();
+ for(; entry != gdatap->mBanList.end(); entry++)
+ {
+ LLNameListCtrl::NameItem ban_entry;
+ ban_entry.value = entry->first;
+ LLGroupBanData bd = entry->second;
+
+ ban_entry.columns.add().column("name").font.name("SANSSERIF_SMALL").style("NORMAL");
+
+ // Baker TODO: MAINT-
+ // Check out utc_to_pacific_time()
+
+ std::string ban_date_str = bd.mBanDate.toHTTPDateString("%Y/%m/%d");
+// time_t utc_time;
+// utc_time = time_corrected();
+// LLSD substitution;
+// substitution["datetime"] = (S32) utc_time;
+// LLStringUtil::format (ban_date_str, substitution);
+
+ //LL_INFOS("BAKER") << "[BAKER] BAN_DATE: " << bd.mBanDate.toHTTPDateString("%Y/%m/%d") << LL_ENDL;
+ //LL_INFOS("BAKER") << "[BAKER] BAN_DATE_MODIFIED: " << ban_date_str << LL_ENDL;
+
+ //ban_entry.columns.add().column("ban_date").value(ban_date_str.font.name("SANSSERIF_SMALL").style("NORMAL");
+ ban_entry.columns.add().column("ban_date").value(bd.mBanDate.toHTTPDateString("%Y/%m/%d")).font.name("SANSSERIF_SMALL").style("NORMAL");
+
+ mBanList->addNameItemRow(ban_entry);
+ }
+
+ mRefreshBanListButton->setEnabled(TRUE);
+ mCreateBanButton->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_GROUP_BAN_ACCESS) &&
+ gdatap->mBanList.size() < GB_MAX_BANNED_AGENTS);
+ setBanCount(gdatap->mBanList.size());
+}
+
+void LLPanelGroupBanListSubTab::setGroupID(const LLUUID& id)
+{
+ if(mBanList)
+ mBanList->deleteAllItems();
+
+ setFooterEnabled(FALSE);
+ LLPanelGroupSubTab::setGroupID(id);
+}
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index 0cf272f3ee..540b24ada6 100755
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -39,11 +39,9 @@ class LLScrollListCtrl;
class LLScrollListItem;
class LLTextEditor;
-// Forward declare for friend usage.
-//virtual BOOL LLPanelGroupSubTab::postBuildSubTab(LLView*);
-
typedef std::map<std::string,std::string> icon_map_t;
+
class LLPanelGroupRoles : public LLPanelGroupTab
{
public:
@@ -92,6 +90,7 @@ protected:
std::string mWantApplyMesg;
};
+
class LLPanelGroupSubTab : public LLPanelGroupTab
{
public:
@@ -143,10 +142,14 @@ protected:
icon_map_t mActionIcons;
bool mActivated;
-
+
+ bool mHasGroupBanPower; // Used to communicate between action sets due to the dependency between
+ // GP_GROUP_BAN_ACCESS and GP_EJECT_MEMBER and GP_ROLE_REMOVE_MEMBER
+
void setOthersVisible(BOOL b);
};
+
class LLPanelGroupMembersSubTab : public LLPanelGroupSubTab
{
public:
@@ -173,6 +176,10 @@ public:
void handleRoleCheck(const LLUUID& role_id,
LLRoleMemberChangeType type);
+ static void onBanMember(void* user_data);
+ void handleBanMember();
+
+
void applyMemberChanges();
bool addOwnerCB(const LLSD& notification, const LLSD& response);
@@ -189,7 +196,7 @@ public:
virtual void setGroupID(const LLUUID& id);
void addMemberToList(LLGroupMemberData* data);
- void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name);
+ void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name, const LLUUID& av_id);
protected:
typedef std::map<LLUUID, LLRoleMemberChangeType> role_change_data_map_t;
@@ -206,6 +213,7 @@ protected:
LLScrollListCtrl* mAssignedRolesList;
LLScrollListCtrl* mAllowedActionsList;
LLButton* mEjectBtn;
+ LLButton* mBanBtn;
BOOL mChanged;
BOOL mPendingMemberUpdate;
@@ -215,9 +223,11 @@ protected:
U32 mNumOwnerAdditions;
LLGroupMgrGroupData::member_list_t::iterator mMemberProgress;
- boost::signals2::connection mAvatarNameCacheConnection;
+ typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t;
+ avatar_name_cache_connection_map_t mAvatarNameCacheConnections;
};
+
class LLPanelGroupRolesSubTab : public LLPanelGroupSubTab
{
public:
@@ -240,7 +250,7 @@ public:
static void onActionCheck(LLUICtrl*, void*);
bool addActionCB(const LLSD& notification, const LLSD& response, LLCheckBoxCtrl* check);
-
+
static void onPropertiesKey(LLLineEditor*, void*);
void onDescriptionKeyStroke(LLTextEditor* caller);
@@ -259,6 +269,9 @@ public:
void saveRoleChanges(bool select_saved_role);
virtual void setGroupID(const LLUUID& id);
+
+ BOOL mFirstOpen;
+
protected:
void handleActionCheck(LLUICtrl* ctrl, bool force);
LLSD createRoleItem(const LLUUID& role_id, std::string name, std::string title, S32 members);
@@ -280,6 +293,7 @@ protected:
std::string mRemoveEveryoneTxt;
};
+
class LLPanelGroupActionsSubTab : public LLPanelGroupSubTab
{
public:
@@ -307,4 +321,46 @@ protected:
};
+class LLPanelGroupBanListSubTab : public LLPanelGroupSubTab
+{
+public:
+ LLPanelGroupBanListSubTab();
+ virtual ~LLPanelGroupBanListSubTab() {}
+
+ virtual BOOL postBuildSubTab(LLView* root);
+
+ virtual void activate();
+ virtual void update(LLGroupChange gc);
+ virtual void draw();
+
+ static void onBanEntrySelect(LLUICtrl* ctrl, void* user_data);
+ void handleBanEntrySelect();
+
+ static void onCreateBanEntry(void* user_data);
+ void handleCreateBanEntry();
+
+ static void onDeleteBanEntry(void* user_data);
+ void handleDeleteBanEntry();
+
+ static void onRefreshBanList(void* user_data);
+ void handleRefreshBanList();
+
+ void onBanListCompleted(bool isComplete);
+
+protected:
+ void setBanCount(U32 ban_count);
+ void populateBanList();
+
+public:
+ virtual void setGroupID(const LLUUID& id);
+
+protected:
+ LLNameListCtrl* mBanList;
+ LLButton* mCreateBanButton;
+ LLButton* mDeleteBanButton;
+ LLButton* mRefreshBanListButton;
+ LLTextBase* mBanCountText;
+
+};
+
#endif // LL_LLPANELGROUPROLES_H
diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp
index 9b21fbf6b7..acdb16f432 100755
--- a/indra/newview/llpanelland.cpp
+++ b/indra/newview/llpanelland.cpp
@@ -145,7 +145,7 @@ void LLPanelLandInfo::refresh()
&& ((gAgent.getID() == auth_buyer_id)
|| (auth_buyer_id.isNull())));
- if (is_public)
+ if (is_public && !LLViewerParcelMgr::getInstance()->getParcelSelection()->getMultipleOwners())
{
getChildView("button buy land")->setEnabled(TRUE);
}
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 67cbc91332..75a3584a1e 100755
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -1263,6 +1263,7 @@ bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType carg
break;
}
+ updateVerbs();
return true;
}
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index e501486ecb..ed91d277dd 100755
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -129,6 +129,7 @@ BOOL LLPanelPlaceProfile::postBuild()
mEstateNameText = getChild<LLTextBox>("estate_name");
mEstateRatingText = getChild<LLTextBox>("estate_rating");
+ mEstateRatingIcon = getChild<LLIconCtrl>("estate_rating_icon");
mEstateOwnerText = getChild<LLTextBox>("estate_owner");
mCovenantText = getChild<LLTextEditor>("covenant");
@@ -201,6 +202,7 @@ void LLPanelPlaceProfile::resetLocation()
mEstateNameText->setValue(loading);
mEstateRatingText->setValue(loading);
+ mEstateRatingIcon->setValue(loading);
mEstateOwnerText->setValue(loading);
mCovenantText->setValue(loading);
@@ -348,6 +350,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
mParcelRatingIcon->setValue(icon_m);
mRegionRatingIcon->setValue(icon_m);
+ mEstateRatingIcon->setValue(icon_m);
break;
case SIM_ACCESS_ADULT:
@@ -355,6 +358,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
mParcelRatingIcon->setValue(icon_r);
mRegionRatingIcon->setValue(icon_r);
+ mEstateRatingIcon->setValue(icon_r);
break;
default:
@@ -362,6 +366,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
mParcelRatingIcon->setValue(icon_pg);
mRegionRatingIcon->setValue(icon_pg);
+ mEstateRatingIcon->setValue(icon_pg);
}
std::string rating = LLViewerRegion::accessToString(sim_access);
@@ -483,8 +488,9 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
gCacheName->getGroup(parcel->getGroupID(),
boost::bind(&LLPanelPlaceInfo::onNameCache, mRegionGroupText, _2));
- gCacheName->getGroup(parcel->getGroupID(),
- boost::bind(&LLPanelPlaceInfo::onNameCache, mParcelOwner, _2));
+ std::string owner =
+ LLSLURL("group", parcel->getGroupID(), "inspect").getSLURLString();
+ mParcelOwner->setText(owner);
}
else
{
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
index 01adfd4940..4547e14b2e 100755
--- a/indra/newview/llpanelplaceprofile.h
+++ b/indra/newview/llpanelplaceprofile.h
@@ -103,6 +103,7 @@ private:
LLTextBox* mEstateNameText;
LLTextBox* mEstateRatingText;
+ LLIconCtrl* mEstateRatingIcon;
LLTextBox* mEstateOwnerText;
LLTextEditor* mCovenantText;
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 652d2be6f6..3de9dc2f80 100755
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -45,6 +45,7 @@
#include "llviewermenu.h"
#include "lllandmarkactions.h"
#include "llclipboard.h"
+#include "lltrans.h"
// Maximum number of items that can be added to a list in one pass.
// Used to limit time spent for items list update per frame.
@@ -55,7 +56,8 @@ static const std::string COLLAPSED_BY_USER = "collapsed_by_user";
class LLTeleportHistoryFlatItem : public LLPanel
{
public:
- LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name, const std::string &hl);
+ LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name,
+ LLDate date, const std::string &hl);
virtual ~LLTeleportHistoryFlatItem();
virtual BOOL postBuild();
@@ -66,8 +68,11 @@ public:
void setIndex(S32 index) { mIndex = index; }
const std::string& getRegionName() { return mRegionName;}
void setRegionName(const std::string& name);
+ void setDate(LLDate date);
void setHighlightedText(const std::string& text);
void updateTitle();
+ void updateTimestamp();
+ std::string getTimestamp();
/*virtual*/ void setValue(const LLSD& value);
@@ -84,12 +89,14 @@ private:
LLButton* mProfileBtn;
LLTextBox* mTitle;
+ LLTextBox* mTimeTextBox;
LLTeleportHistoryPanel::ContextMenu *mContextMenu;
S32 mIndex;
std::string mRegionName;
std::string mHighlight;
+ LLDate mDate;
LLRootHandle<LLTeleportHistoryFlatItem> mItemHandle;
};
@@ -121,11 +128,13 @@ private:
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
-LLTeleportHistoryFlatItem::LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name, const std::string &hl)
+LLTeleportHistoryFlatItem::LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name,
+ LLDate date, const std::string &hl)
: LLPanel(),
mIndex(index),
mContextMenu(context_menu),
mRegionName(region_name),
+ mDate(date),
mHighlight(hl)
{
buildFromFile( "panel_teleport_history_item.xml");
@@ -140,11 +149,14 @@ BOOL LLTeleportHistoryFlatItem::postBuild()
{
mTitle = getChild<LLTextBox>("region");
+ mTimeTextBox = getChild<LLTextBox>("timestamp");
+
mProfileBtn = getChild<LLButton>("profile_btn");
mProfileBtn->setClickedCallback(boost::bind(&LLTeleportHistoryFlatItem::onProfileBtnClick, this));
updateTitle();
+ updateTimestamp();
return true;
}
@@ -179,6 +191,38 @@ void LLTeleportHistoryFlatItem::setRegionName(const std::string& name)
mRegionName = name;
}
+void LLTeleportHistoryFlatItem::setDate(LLDate date)
+{
+ mDate = date;
+}
+
+std::string LLTeleportHistoryFlatItem::getTimestamp()
+{
+ const LLDate &date = mDate;
+ std::string timestamp = "";
+
+ LLDate now = LLDate::now();
+ S32 now_year, now_month, now_day, now_hour, now_min, now_sec;
+ now.split(&now_year, &now_month, &now_day, &now_hour, &now_min, &now_sec);
+
+ const S32 seconds_in_day = 24 * 60 * 60;
+ S32 seconds_today = now_hour * 60 * 60 + now_min * 60 + now_sec;
+ S32 time_diff = (S32) now.secondsSinceEpoch() - (S32) date.secondsSinceEpoch();
+
+ // Only show timestamp for today and yesterday
+ if(time_diff < seconds_today + seconds_in_day)
+ {
+ timestamp = "[" + LLTrans::getString("TimeHour12")+"]:["
+ + LLTrans::getString("TimeMin")+"] ["+ LLTrans::getString("TimeAMPM")+"]";
+ LLSD substitution;
+ substitution["datetime"] = (S32) date.secondsSinceEpoch();
+ LLStringUtil::format(timestamp, substitution);
+ }
+
+ return timestamp;
+
+}
+
void LLTeleportHistoryFlatItem::updateTitle()
{
static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", LLColor4U(255, 255, 255));
@@ -190,6 +234,17 @@ void LLTeleportHistoryFlatItem::updateTitle()
mHighlight);
}
+void LLTeleportHistoryFlatItem::updateTimestamp()
+{
+ static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", LLColor4U(255, 255, 255));
+
+ LLTextUtil::textboxSetHighlightedVal(
+ mTimeTextBox,
+ LLStyle::Params().color(sFgColor),
+ getTimestamp(),
+ mHighlight);
+}
+
void LLTeleportHistoryFlatItem::onMouseEnter(S32 x, S32 y, MASK mask)
{
getChildView("hovered_icon")->setVisible( true);
@@ -248,9 +303,11 @@ LLTeleportHistoryFlatItemStorage::getFlatItemForPersistentItem (
{
item->setIndex(cur_item_index);
item->setRegionName(persistent_item.mTitle);
+ item->setDate(persistent_item.mDate);
item->setHighlightedText(hl);
item->setVisible(TRUE);
item->updateTitle();
+ item->updateTimestamp();
}
else
{
@@ -264,6 +321,7 @@ LLTeleportHistoryFlatItemStorage::getFlatItemForPersistentItem (
item = new LLTeleportHistoryFlatItem(cur_item_index,
context_menu,
persistent_item.mTitle,
+ persistent_item.mDate,
hl);
mItems.push_back(item->getItemHandle());
}
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index 6d032ad3d3..398f4e6e42 100755
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -90,6 +90,7 @@ void LLPreview::setObjectID(const LLUUID& object_id)
{
loadAsset();
}
+ refreshFromItem();
}
void LLPreview::setItem( LLInventoryItem* item )
@@ -99,6 +100,7 @@ void LLPreview::setItem( LLInventoryItem* item )
{
loadAsset();
}
+ refreshFromItem();
}
const LLInventoryItem *LLPreview::getItem() const
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index e694045f9a..9411b8265b 100755
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -34,6 +34,7 @@
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "lldir.h"
+#include "llenvmanager.h"
#include "llexternaleditor.h"
#include "llfilepicker.h"
#include "llfloaterreg.h"
@@ -50,11 +51,9 @@
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "llscrolllistcell.h"
+#include "llsdserialize.h"
#include "llslider.h"
#include "lscript_rt_interface.h"
-#include "lscript_library.h"
-#include "lscript_export.h"
-#include "lltextbox.h"
#include "lltooldraganddrop.h"
#include "llvfile.h"
@@ -70,6 +69,7 @@
#include "llkeyboard.h"
#include "llscrollcontainer.h"
#include "llcheckboxctrl.h"
+#include "llscripteditor.h"
#include "llselectmgr.h"
#include "lltooldraganddrop.h"
#include "llscrolllistctrl.h"
@@ -78,7 +78,6 @@
#include "lldir.h"
#include "llcombobox.h"
#include "llviewerstats.h"
-#include "llviewertexteditor.h"
#include "llviewerwindow.h"
#include "lluictrlfactory.h"
#include "llmediactrl.h"
@@ -361,6 +360,7 @@ LLScriptEdCore::LLScriptEdCore(
void (*save_callback)(void*, BOOL),
void (*search_replace_callback) (void* userdata),
void* userdata,
+ bool live,
S32 bottom_pad)
:
LLPanel(),
@@ -375,6 +375,7 @@ LLScriptEdCore::LLScriptEdCore(
mLiveHelpHistorySize(0),
mEnableSave(FALSE),
mLiveFile(NULL),
+ mLive(live),
mContainer(container),
mHasScriptData(FALSE)
{
@@ -398,17 +399,21 @@ LLScriptEdCore::~LLScriptEdCore()
}
delete mLiveFile;
+ if (mSyntaxIDConnection.connected())
+ {
+ mSyntaxIDConnection.disconnect();
+ }
}
BOOL LLScriptEdCore::postBuild()
{
mErrorList = getChild<LLScrollListCtrl>("lsl errors");
- mFunctions = getChild<LLComboBox>( "Insert...");
+ mFunctions = getChild<LLComboBox>("Insert...");
childSetCommitCallback("Insert...", &LLScriptEdCore::onBtnInsertFunction, this);
- mEditor = getChild<LLViewerTextEditor>("Script Editor");
+ mEditor = getChild<LLScriptEditor>("Script Editor");
childSetCommitCallback("lsl errors", &LLScriptEdCore::onErrorList, this);
childSetAction("Save_btn", boost::bind(&LLScriptEdCore::doSave,this,FALSE));
@@ -416,51 +421,30 @@ BOOL LLScriptEdCore::postBuild()
initMenu();
+ mSyntaxIDConnection = LLSyntaxIdLSL::getInstance()->addSyntaxIDCallback(boost::bind(&LLScriptEdCore::processKeywords, this));
- std::vector<std::string> funcs;
- std::vector<std::string> tooltips;
- for (std::vector<LLScriptLibraryFunction>::const_iterator i = gScriptLibrary.mFunctions.begin();
- i != gScriptLibrary.mFunctions.end(); ++i)
- {
- // Make sure this isn't a god only function, or the agent is a god.
- if (!i->mGodOnly || gAgent.isGodlike())
- {
- std::string name = i->mName;
- funcs.push_back(name);
-
- std::string desc_name = "LSLTipText_";
- desc_name += name;
- std::string desc = LLTrans::getString(desc_name);
-
- F32 sleep_time = i->mSleepTime;
- if( sleep_time )
- {
- desc += "\n";
-
- LLStringUtil::format_map_t args;
- args["[SLEEP_TIME]"] = llformat("%.1f", sleep_time );
- desc += LLTrans::getString("LSLTipSleepTime", args);
- }
-
- // A \n linefeed is not part of xml. Let's add one to keep all
- // the tips one-per-line in strings.xml
- LLStringUtil::replaceString( desc, "\\n", "\n" );
-
- tooltips.push_back(desc);
- }
- }
-
- LLColor3 color(0.5f, 0.0f, 0.15f);
- mEditor->loadKeywords(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"keywords.ini"), funcs, tooltips, color);
+ // Intialise keyword highlighting for the current simulator's version of LSL
+ LLSyntaxIdLSL::getInstance()->initialize();
+ processKeywords();
- std::vector<std::string> primary_keywords;
- std::vector<std::string> secondary_keywords;
+ return TRUE;
+}
+
+void LLScriptEdCore::processKeywords()
+{
+ LL_DEBUGS("SyntaxLSL") << "Processing keywords" << LL_ENDL;
+ mEditor->clearSegments();
+ mEditor->initKeywords();
+ mEditor->loadKeywords();
+
+ string_vec_t primary_keywords;
+ string_vec_t secondary_keywords;
LLKeywordToken *token;
LLKeywords::keyword_iterator_t token_it;
for (token_it = mEditor->keywordsBegin(); token_it != mEditor->keywordsEnd(); ++token_it)
{
token = token_it->second;
- if (token->getColor() == color) // Wow, what a disgusting hack.
+ if (token->getType() == LLKeywordToken::TT_FUNCTION)
{
primary_keywords.push_back( wstring_to_utf8str(token->getToken()) );
}
@@ -469,24 +453,16 @@ BOOL LLScriptEdCore::postBuild()
secondary_keywords.push_back( wstring_to_utf8str(token->getToken()) );
}
}
-
- // Case-insensitive dictionary sort for primary keywords. We don't sort the secondary
- // keywords. They're intelligently grouped in keywords.ini.
- std::stable_sort( primary_keywords.begin(), primary_keywords.end(), LLSECKeywordCompare() );
-
- for (std::vector<std::string>::const_iterator iter= primary_keywords.begin();
- iter!= primary_keywords.end(); ++iter)
+ for (string_vec_t::const_iterator iter = primary_keywords.begin();
+ iter!= primary_keywords.end(); ++iter)
{
mFunctions->add(*iter);
}
-
- for (std::vector<std::string>::const_iterator iter= secondary_keywords.begin();
- iter!= secondary_keywords.end(); ++iter)
+ for (string_vec_t::const_iterator iter = secondary_keywords.begin();
+ iter!= secondary_keywords.end(); ++iter)
{
mFunctions->add(*iter);
}
-
- return TRUE;
}
void LLScriptEdCore::initMenu()
@@ -692,7 +668,7 @@ void LLScriptEdCore::updateDynamicHelp(BOOL immediate)
std::vector<LLTextSegmentPtr>::iterator segment_iter;
for (segment_iter = selected_segments.begin(); segment_iter != selected_segments.end(); ++segment_iter)
{
- if((*segment_iter)->getToken() && (*segment_iter)->getToken()->getType() == LLKeywordToken::WORD)
+ if((*segment_iter)->getToken() && (*segment_iter)->getToken()->getType() == LLKeywordToken::TT_WORD)
{
segment = *segment_iter;
break;
@@ -703,7 +679,7 @@ void LLScriptEdCore::updateDynamicHelp(BOOL immediate)
if (!segment)
{
const LLTextSegmentPtr test_segment = mEditor->getPreviousSegment();
- if(test_segment->getToken() && test_segment->getToken()->getType() == LLKeywordToken::WORD)
+ if(test_segment->getToken() && test_segment->getToken()->getType() == LLKeywordToken::TT_WORD)
{
segment = test_segment;
}
@@ -1227,8 +1203,8 @@ bool LLScriptEdCore::enableLoadFromFileMenu(void* userdata)
/// LLScriptEdContainer
/// ---------------------------------------------------------------------------
-LLScriptEdContainer::LLScriptEdContainer(const LLSD& key)
-: LLPreview(key)
+LLScriptEdContainer::LLScriptEdContainer(const LLSD& key) :
+ LLPreview(key)
, mScriptEd(NULL)
{
}
@@ -1290,8 +1266,8 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata)
LLPreviewLSL::onSave,
LLPreviewLSL::onSearchReplace,
self,
+ false,
0);
-
return self->mScriptEd;
}
@@ -1306,7 +1282,7 @@ LLPreviewLSL::LLPreviewLSL(const LLSD& key )
// virtual
BOOL LLPreviewLSL::postBuild()
{
- const LLInventoryItem* item = getItem();
+ const LLInventoryItem* item = getItem();
llassert(item);
if (item)
@@ -1736,7 +1712,6 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset
//static
void* LLLiveLSLEditor::createScriptEdPanel(void* userdata)
{
-
LLLiveLSLEditor *self = (LLLiveLSLEditor*)userdata;
self->mScriptEd = new LLScriptEdCore(
@@ -1747,8 +1722,8 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata)
&LLLiveLSLEditor::onSave,
&LLLiveLSLEditor::onSearchReplace,
self,
+ true,
0);
-
return self->mScriptEd;
}
@@ -1876,7 +1851,7 @@ void LLLiveLSLEditor::loadAsset()
mIsModifiable = item && gAgent.allowOperation(PERM_MODIFY,
item->getPermissions(),
GP_OBJECT_MANIPULATE);
- refreshFromItem();
+
// This is commented out, because we don't completely
// handle script exports yet.
/*
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index cb53d1df07..9ea191e928 100755
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -34,10 +34,11 @@
#include "lliconctrl.h"
#include "llframetimer.h"
#include "llfloatergotoline.h"
+#include "llsyntaxid.h"
class LLLiveLSLFile;
class LLMessageSystem;
-class LLTextEditor;
+class LLScriptEditor;
class LLButton;
class LLCheckBoxCtrl;
class LLScrollListCtrl;
@@ -71,11 +72,15 @@ protected:
void (*save_callback)(void* userdata, BOOL close_after_save),
void (*search_replace_callback)(void* userdata),
void* userdata,
+ bool live,
S32 bottom_pad = 0); // pad below bottom row of buttons
public:
~LLScriptEdCore();
+ void initializeKeywords();
void initMenu();
+ void processKeywords();
+ void processLoaded();
virtual void draw();
/*virtual*/ BOOL postBuild();
@@ -129,9 +134,11 @@ protected:
void addHelpItemToHistory(const std::string& help_string);
static void onErrorList(LLUICtrl*, void* user_data);
+ bool mLive;
+
private:
std::string mSampleText;
- LLTextEditor* mEditor;
+ LLScriptEditor* mEditor;
void (*mLoadCallback)(void* userdata);
void (*mSaveCallback)(void* userdata, BOOL close_after_save);
void (*mSearchReplaceCallback) (void* userdata);
@@ -150,6 +157,10 @@ private:
LLLiveLSLFile* mLiveFile;
LLScriptEdContainer* mContainer; // parent view
+
+public:
+ boost::signals2::connection mSyntaxIDConnection;
+
};
class LLScriptEdContainer : public LLPreview
@@ -158,6 +169,7 @@ class LLScriptEdContainer : public LLPreview
public:
LLScriptEdContainer(const LLSD& key);
+ LLScriptEdContainer(const LLSD& key, const bool live);
protected:
std::string getTmpFileName();
@@ -167,7 +179,7 @@ protected:
LLScriptEdCore* mScriptEd;
};
-// Used to view and edit a LSL from your inventory.
+// Used to view and edit an LSL script from your inventory.
class LLPreviewLSL : public LLScriptEdContainer
{
public:
@@ -212,7 +224,7 @@ protected:
};
-// Used to view and edit an LSL that is attached to an object.
+// Used to view and edit an LSL script that is attached to an object.
class LLLiveLSLEditor : public LLScriptEdContainer
{
friend class LLLiveLSLFile;
diff --git a/indra/newview/llscripteditor.cpp b/indra/newview/llscripteditor.cpp
new file mode 100644
index 0000000000..81920562a7
--- /dev/null
+++ b/indra/newview/llscripteditor.cpp
@@ -0,0 +1,289 @@
+/**
+ * @file llscripteditor.cpp
+ * @author Cinder Roxley
+ * @brief Text editor widget used for viewing and editing scripts
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llscripteditor.h"
+
+#include "llsyntaxid.h"
+#include "lllocalcliprect.h"
+
+const S32 UI_TEXTEDITOR_LINE_NUMBER_MARGIN = 32;
+const S32 UI_TEXTEDITOR_LINE_NUMBER_DIGITS = 4;
+
+static LLDefaultChildRegistry::Register<LLScriptEditor> r("script_editor");
+
+LLScriptEditor::Params::Params()
+: show_line_numbers("show_line_numbers", true)
+{}
+
+
+LLScriptEditor::LLScriptEditor(const Params& p)
+: LLTextEditor(p)
+, mShowLineNumbers(p.show_line_numbers)
+{
+ if (mShowLineNumbers)
+ {
+ mHPad += UI_TEXTEDITOR_LINE_NUMBER_MARGIN;
+ updateRects();
+ }
+}
+
+void LLScriptEditor::draw()
+{
+ {
+ // pad clipping rectangle so that cursor can draw at full width
+ // when at left edge of mVisibleTextRect
+ LLRect clip_rect(mVisibleTextRect);
+ clip_rect.stretch(1);
+ LLLocalClipRect clip(clip_rect);
+ }
+
+ LLTextBase::draw();
+ drawLineNumbers();
+
+ drawPreeditMarker();
+
+ //RN: the decision was made to always show the orange border for keyboard focus but do not put an insertion caret
+ // when in readonly mode
+ mBorder->setKeyboardFocusHighlight( hasFocus() );// && !mReadOnly);
+}
+
+void LLScriptEditor::drawLineNumbers()
+{
+ LLGLSUIDefault gls_ui;
+ LLRect scrolled_view_rect = getVisibleDocumentRect();
+ LLRect content_rect = getVisibleTextRect();
+ LLLocalClipRect clip(content_rect);
+ S32 first_line = getFirstVisibleLine();
+ S32 num_lines = getLineCount();
+ if (first_line >= num_lines)
+ {
+ return;
+ }
+
+ S32 cursor_line = mLineInfoList[getLineNumFromDocIndex(mCursorPos)].mLineNum;
+
+ if (mShowLineNumbers)
+ {
+ S32 left = 0;
+ S32 top = getRect().getHeight();
+ S32 bottom = 0;
+
+ gl_rect_2d(left, top, UI_TEXTEDITOR_LINE_NUMBER_MARGIN, bottom, mReadOnlyBgColor.get() ); // line number area always read-only
+ gl_rect_2d(UI_TEXTEDITOR_LINE_NUMBER_MARGIN, top, UI_TEXTEDITOR_LINE_NUMBER_MARGIN-1, bottom, LLColor4::grey3); // separator
+
+ S32 last_line_num = -1;
+
+ for (S32 cur_line = first_line; cur_line < num_lines; cur_line++)
+ {
+ line_info& line = mLineInfoList[cur_line];
+
+ if ((line.mRect.mTop - scrolled_view_rect.mBottom) < mVisibleTextRect.mBottom)
+ {
+ break;
+ }
+
+ S32 line_bottom = line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom;
+ // draw the line numbers
+ if(line.mLineNum != last_line_num && line.mRect.mTop <= scrolled_view_rect.mTop)
+ {
+ const LLFontGL *num_font = LLFontGL::getFontMonospace();
+ const LLWString ltext = utf8str_to_wstring(llformat("%d", line.mLineNum ));
+ BOOL is_cur_line = cursor_line == line.mLineNum;
+ const U8 style = is_cur_line ? LLFontGL::BOLD : LLFontGL::NORMAL;
+ const LLColor4 fg_color = is_cur_line ? mCursorColor : mReadOnlyFgColor;
+ num_font->render(
+ ltext, // string to draw
+ 0, // begin offset
+ UI_TEXTEDITOR_LINE_NUMBER_MARGIN - 2, // x
+ line_bottom, // y
+ fg_color,
+ LLFontGL::RIGHT, // horizontal alignment
+ LLFontGL::BOTTOM, // vertical alignment
+ style,
+ LLFontGL::NO_SHADOW,
+ S32_MAX, // max chars
+ UI_TEXTEDITOR_LINE_NUMBER_MARGIN - 2); // max pixels
+ last_line_num = line.mLineNum;
+ }
+ }
+ }
+}
+
+void LLScriptEditor::initKeywords()
+{
+ mKeywords.initialize(LLSyntaxIdLSL::getInstance()->getKeywordsXML());
+}
+
+LLTrace::BlockTimerStatHandle FTM_SYNTAX_HIGHLIGHTING("Syntax Highlighting");
+
+void LLScriptEditor::loadKeywords()
+{
+ LL_RECORD_BLOCK_TIME(FTM_SYNTAX_HIGHLIGHTING);
+ mKeywords.processTokens();
+
+ segment_vec_t segment_list;
+ mKeywords.findSegments(&segment_list, getWText(), mDefaultColor.get(), *this);
+
+ mSegments.clear();
+ segment_set_t::iterator insert_it = mSegments.begin();
+ for (segment_vec_t::iterator list_it = segment_list.begin(); list_it != segment_list.end(); ++list_it)
+ {
+ insert_it = mSegments.insert(insert_it, *list_it);
+ }
+}
+
+void LLScriptEditor::updateSegments()
+{
+ if (mReflowIndex < S32_MAX && mKeywords.isLoaded() && mParseOnTheFly)
+ {
+ LL_RECORD_BLOCK_TIME(FTM_SYNTAX_HIGHLIGHTING);
+ // HACK: No non-ascii keywords for now
+ segment_vec_t segment_list;
+ mKeywords.findSegments(&segment_list, getWText(), mDefaultColor.get(), *this);
+
+ clearSegments();
+ for (segment_vec_t::iterator list_it = segment_list.begin(); list_it != segment_list.end(); ++list_it)
+ {
+ insertSegment(*list_it);
+ }
+ }
+
+ LLTextBase::updateSegments();
+}
+
+void LLScriptEditor::clearSegments()
+{
+ if (!mSegments.empty())
+ {
+ mSegments.clear();
+ }
+}
+
+// Most of this is shamelessly copied from LLTextBase
+void LLScriptEditor::drawSelectionBackground()
+{
+ // Draw selection even if we don't have keyboard focus for search/replace
+ if( hasSelection() && !mLineInfoList.empty())
+ {
+ std::vector<LLRect> selection_rects;
+
+ S32 selection_left = llmin( mSelectionStart, mSelectionEnd );
+ S32 selection_right = llmax( mSelectionStart, mSelectionEnd );
+
+ // Skip through the lines we aren't drawing.
+ LLRect content_display_rect = getVisibleDocumentRect();
+
+ // binary search for line that starts before top of visible buffer
+ line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mTop, LLTextBase::compare_bottom());
+ line_list_t::const_iterator end_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, LLTextBase::compare_top());
+
+ bool done = false;
+
+ // Find the coordinates of the selected area
+ for (;line_iter != end_iter && !done; ++line_iter)
+ {
+ // is selection visible on this line?
+ if (line_iter->mDocIndexEnd > selection_left && line_iter->mDocIndexStart < selection_right)
+ {
+ segment_set_t::iterator segment_iter;
+ S32 segment_offset;
+ getSegmentAndOffset(line_iter->mDocIndexStart, &segment_iter, &segment_offset);
+
+ LLRect selection_rect;
+ selection_rect.mLeft = line_iter->mRect.mLeft;
+ selection_rect.mRight = line_iter->mRect.mLeft;
+ selection_rect.mBottom = line_iter->mRect.mBottom;
+ selection_rect.mTop = line_iter->mRect.mTop;
+
+ for(;segment_iter != mSegments.end(); ++segment_iter, segment_offset = 0)
+ {
+ LLTextSegmentPtr segmentp = *segment_iter;
+
+ S32 segment_line_start = segmentp->getStart() + segment_offset;
+ S32 segment_line_end = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd);
+
+ if (segment_line_start > segment_line_end) break;
+
+ S32 segment_width = 0;
+ S32 segment_height = 0;
+
+ // if selection after beginning of segment
+ if(selection_left >= segment_line_start)
+ {
+ S32 num_chars = llmin(selection_left, segment_line_end) - segment_line_start;
+ segmentp->getDimensions(segment_offset, num_chars, segment_width, segment_height);
+ selection_rect.mLeft += segment_width;
+ }
+
+ // if selection_right == segment_line_end then that means we are the first character of the next segment
+ // or first character of the next line, in either case we want to add the length of the current segment
+ // to the selection rectangle and continue.
+ // if selection right > segment_line_end then selection spans end of current segment...
+ if (selection_right >= segment_line_end)
+ {
+ // extend selection slightly beyond end of line
+ // to indicate selection of newline character (use "n" character to determine width)
+ S32 num_chars = segment_line_end - segment_line_start;
+ segmentp->getDimensions(segment_offset, num_chars, segment_width, segment_height);
+ selection_rect.mRight += segment_width;
+ }
+ // else if selection ends on current segment...
+ else
+ {
+ S32 num_chars = selection_right - segment_line_start;
+ segmentp->getDimensions(segment_offset, num_chars, segment_width, segment_height);
+ selection_rect.mRight += segment_width;
+
+ break;
+ }
+ }
+ selection_rects.push_back(selection_rect);
+ }
+ }
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ const LLColor4& color = mReadOnly ? mReadOnlyFgColor : mFgColor;
+ F32 alpha = hasFocus() ? 0.7f : 0.3f;
+ alpha *= getDrawContext().mAlpha;
+ // We want to shift the color to something readable but distinct
+ LLColor4 selection_color((1.f + color.mV[VRED]) * 0.5f,
+ (1.f + color.mV[VGREEN]) * 0.5f,
+ (1.f + color.mV[VBLUE]) * 0.5f,
+ alpha);
+
+ for (std::vector<LLRect>::iterator rect_it = selection_rects.begin();
+ rect_it != selection_rects.end();
+ ++rect_it)
+ {
+ LLRect selection_rect = *rect_it;
+ selection_rect = *rect_it;
+ selection_rect.translate(mVisibleTextRect.mLeft - content_display_rect.mLeft, mVisibleTextRect.mBottom - content_display_rect.mBottom);
+ gl_rect_2d(selection_rect, selection_color);
+ }
+ }
+}
diff --git a/indra/newview/llscripteditor.h b/indra/newview/llscripteditor.h
new file mode 100644
index 0000000000..f458203a39
--- /dev/null
+++ b/indra/newview/llscripteditor.h
@@ -0,0 +1,70 @@
+/**
+ * @file llscripteditor.h
+ * @author Cinder Roxley
+ * @brief Text editor widget used for viewing and editing scripts
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SCRIPTEDITOR_H
+#define LL_SCRIPTEDITOR_H
+
+#include "lltexteditor.h"
+
+class LLScriptEditor : public LLTextEditor
+{
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLTextEditor::Params>
+ {
+ Optional<bool> show_line_numbers;
+
+ Params();
+ };
+
+ virtual ~LLScriptEditor() {};
+
+ // LLView override
+ virtual void draw();
+
+ void initKeywords();
+ void loadKeywords();
+ /* virtual */ void clearSegments();
+ LLKeywords::keyword_iterator_t keywordsBegin() { return mKeywords.begin(); }
+ LLKeywords::keyword_iterator_t keywordsEnd() { return mKeywords.end(); }
+
+protected:
+ friend class LLUICtrlFactory;
+ LLScriptEditor(const Params& p);
+
+private:
+ void drawLineNumbers();
+ /* virtual */ void updateSegments();
+ /* virtual */ void drawSelectionBackground();
+ void loadKeywords(const std::string& filename_keywords,
+ const std::string& filename_colors);
+
+ LLKeywords mKeywords;
+ bool mShowLineNumbers;
+};
+
+#endif // LL_SCRIPTEDITOR_H
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 2556714792..4970eec636 100755
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -257,12 +257,9 @@ void LLSidepanelInventory::updateInbox()
//
// Track inbox folder changes
//
-
- const bool do_not_create_folder = false;
-
- const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, do_not_create_folder);
+ const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, true);
- // Set up observer to listen for creation of inbox if at least one of them doesn't exist
+ // Set up observer to listen for creation of inbox if it doesn't exist
if (inbox_id.isNull())
{
observeInboxCreation();
@@ -270,6 +267,11 @@ void LLSidepanelInventory::updateInbox()
// Set up observer for inbox changes, if we have an inbox already
else
{
+ // Consolidate Received items
+ // We shouldn't have to do that but with a client/server system relying on a "well known folder" convention,
+ // things can get messy and conventions broken. This call puts everything back together in its right place.
+ gInventory.consolidateForType(inbox_id, LLFolderType::FT_INBOX);
+
// Enable the display of the inbox if it exists
enableInbox(true);
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index a1965af4a5..f61db77169 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -996,8 +996,8 @@ void LLSnapshotLivePreview::saveTexture()
LLFolderType::FT_SNAPSHOT_CATEGORY,
LLInventoryType::IT_SNAPSHOT,
PERM_ALL, // Note: Snapshots to inventory is a special case of content upload
- LLFloaterPerms::getGroupPerms(), // that is more permissive than other uploads
- LLFloaterPerms::getEveryonePerms(),
+ LLFloaterPerms::getGroupPerms("Uploads"), // that is more permissive than other uploads
+ LLFloaterPerms::getEveryonePerms("Uploads"),
"Snapshot : " + pos_string,
callback, expected_upload_cost, userdata);
gViewerWindow->playSnapshotAnimAndSound();
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 7b894d8d98..0a8257f42b 100755
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -62,6 +62,7 @@ static U32 sZombieGroups = 0;
U32 LLSpatialGroup::sNodeCount = 0;
U32 gOctreeMaxCapacity;
+F32 gOctreeMinSize;
BOOL LLSpatialGroup::sNoDelete = FALSE;
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 56fac3b092..0c282a19a5 100755
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2833,6 +2833,7 @@ void LLStartUp::initNameCache()
// capabilities for display name lookup
LLAvatarNameCache::initClass(false,gSavedSettings.getBOOL("UsePeopleAPI"));
LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames"));
+ LLAvatarNameCache::setUseUsernames(gSavedSettings.getBOOL("NameTagShowUsernames"));
}
void LLStartUp::cleanupNameCache()
diff --git a/indra/newview/llsyntaxid.cpp b/indra/newview/llsyntaxid.cpp
new file mode 100644
index 0000000000..b1194dcd1b
--- /dev/null
+++ b/indra/newview/llsyntaxid.cpp
@@ -0,0 +1,330 @@
+/**
+ * @file LLSyntaxId
+ * @brief Handles downloading, saving, and checking of LSL keyword/syntax files
+ * for each region.
+ * @author Ima Mechanique, Cinder Roxley
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2013, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llsyntaxid.h"
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llhttpclient.h"
+#include "llsdserialize.h"
+#include "llviewerregion.h"
+
+//-----------------------------------------------------------------------------
+// fetchKeywordsFileResponder
+//-----------------------------------------------------------------------------
+class fetchKeywordsFileResponder : public LLHTTPClient::Responder
+{
+public:
+ fetchKeywordsFileResponder(const std::string& filespec)
+ : mFileSpec(filespec)
+ {
+ LL_DEBUGS("SyntaxLSL") << "Instantiating with file saving to: '" << filespec << "'" << LL_ENDL;
+ }
+
+ virtual void errorWithContent(U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ LL_WARNS("SyntaxLSL") << "failed to fetch syntax file [status:" << status << "]: " << content << LL_ENDL;
+ }
+
+ virtual void result(const LLSD& content_ref)
+ {
+ // Continue only if a valid LLSD object was returned.
+ if (content_ref.isMap())
+ {
+ if (LLSyntaxIdLSL::getInstance()->isSupportedVersion(content_ref))
+ {
+ LLSyntaxIdLSL::getInstance()->setKeywordsXml(content_ref);
+
+ cacheFile(content_ref);
+ LLSyntaxIdLSL::getInstance()->handleFileFetched(mFileSpec);
+ }
+ else
+ {
+ LL_WARNS("SyntaxLSL") << "Unknown or unsupported version of syntax file." << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("SyntaxLSL") << "Syntax file '" << mFileSpec << "' contains invalid LLSD." << LL_ENDL;
+ }
+ }
+
+ void cacheFile(const LLSD& content_ref)
+ {
+ std::stringstream str;
+ LLSDSerialize::toXML(content_ref, str);
+ const std::string xml = str.str();
+
+ // save the str to disk, usually to the cache.
+ llofstream file(mFileSpec, std::ios_base::out);
+ file.write(xml.c_str(), str.str().size());
+ file.close();
+
+ LL_DEBUGS("SyntaxLSL") << "Syntax file received, saving as: '" << mFileSpec << "'" << LL_ENDL;
+ }
+
+private:
+ std::string mFileSpec;
+};
+
+//-----------------------------------------------------------------------------
+// LLSyntaxIdLSL
+//-----------------------------------------------------------------------------
+const std::string SYNTAX_ID_CAPABILITY_NAME = "LSLSyntax";
+const std::string SYNTAX_ID_SIMULATOR_FEATURE = "LSLSyntaxId";
+const std::string FILENAME_DEFAULT = "keywords_lsl_default.xml";
+
+/**
+ * @brief LLSyntaxIdLSL constructor
+ */
+LLSyntaxIdLSL::LLSyntaxIdLSL()
+: mKeywordsXml(LLSD())
+, mCapabilityURL(std::string())
+, mFilePath(LL_PATH_APP_SETTINGS)
+, mSyntaxId(LLUUID())
+{
+ loadDefaultKeywordsIntoLLSD();
+ mRegionChangedCallback = gAgent.addRegionChangedCallback(boost::bind(&LLSyntaxIdLSL::handleRegionChanged, this));
+ handleRegionChanged(); // Kick off an initial caps query and fetch
+}
+
+void LLSyntaxIdLSL::buildFullFileSpec()
+{
+ ELLPath path = mSyntaxId.isNull() ? LL_PATH_APP_SETTINGS : LL_PATH_CACHE;
+ const std::string filename = mSyntaxId.isNull() ? FILENAME_DEFAULT : "keywords_lsl_" + mSyntaxId.asString() + ".llsd.xml";
+ mFullFileSpec = gDirUtilp->getExpandedFilename(path, filename);
+}
+
+//-----------------------------------------------------------------------------
+// syntaxIdChange()
+//-----------------------------------------------------------------------------
+bool LLSyntaxIdLSL::syntaxIdChanged()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+
+ if (region)
+ {
+ if (region->capabilitiesReceived())
+ {
+ LLSD sim_features;
+ region->getSimulatorFeatures(sim_features);
+
+ if (sim_features.has(SYNTAX_ID_SIMULATOR_FEATURE))
+ {
+ // get and check the hash
+ LLUUID new_syntax_id = sim_features[SYNTAX_ID_SIMULATOR_FEATURE].asUUID();
+ mCapabilityURL = region->getCapability(SYNTAX_ID_CAPABILITY_NAME);
+ LL_DEBUGS("SyntaxLSL") << SYNTAX_ID_SIMULATOR_FEATURE << " capability URL: " << mCapabilityURL << LL_ENDL;
+ if (new_syntax_id != mSyntaxId)
+ {
+ LL_DEBUGS("SyntaxLSL") << "New SyntaxID '" << new_syntax_id << "' found." << LL_ENDL;
+ mSyntaxId = new_syntax_id;
+ return true;
+ }
+ else
+ LL_DEBUGS("SyntaxLSL") << "SyntaxID matches what we have." << LL_ENDL;
+ }
+ }
+ else
+ {
+ region->setCapabilitiesReceivedCallback(boost::bind(&LLSyntaxIdLSL::handleCapsReceived, this, _1));
+ LL_DEBUGS("SyntaxLSL") << "Region has not received capabilities. Waiting for caps..." << LL_ENDL;
+ }
+ }
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// fetchKeywordsFile
+//-----------------------------------------------------------------------------
+void LLSyntaxIdLSL::fetchKeywordsFile(const std::string& filespec)
+{
+ mInflightFetches.push_back(filespec);
+ LLHTTPClient::get(mCapabilityURL,
+ new fetchKeywordsFileResponder(filespec),
+ LLSD(), 30.f);
+ LL_DEBUGS("SyntaxLSL") << "LSLSyntaxId capability URL is: " << mCapabilityURL << ". Filename to use is: '" << filespec << "'." << LL_ENDL;
+}
+
+
+//-----------------------------------------------------------------------------
+// initialize
+//-----------------------------------------------------------------------------
+void LLSyntaxIdLSL::initialize()
+{
+ if (mSyntaxId.isNull())
+ {
+ loadDefaultKeywordsIntoLLSD();
+ }
+ else if (!mCapabilityURL.empty())
+ {
+ LL_DEBUGS("SyntaxLSL") << "LSL version has changed, getting appropriate file." << LL_ENDL;
+
+ // Need a full spec regardless of file source, so build it now.
+ buildFullFileSpec();
+ if (mSyntaxId.notNull())
+ {
+ if (!gDirUtilp->fileExists(mFullFileSpec))
+ { // Does not exist, so fetch it from the capability
+ LL_DEBUGS("SyntaxLSL") << "LSL syntax not cached, attempting download." << LL_ENDL;
+ fetchKeywordsFile(mFullFileSpec);
+ }
+ else
+ {
+ LL_DEBUGS("SyntaxLSL") << "Found cached Syntax file: " << mFullFileSpec << " Loading keywords." << LL_ENDL;
+ loadKeywordsIntoLLSD();
+ }
+ }
+ else
+ {
+ LL_DEBUGS("SyntaxLSL") << "LSLSyntaxId is null. Loading default values" << LL_ENDL;
+ loadDefaultKeywordsIntoLLSD();
+ }
+ }
+ else
+ {
+ LL_DEBUGS("SyntaxLSL") << "LSLSyntaxId capability URL is empty." << LL_ENDL;
+ loadDefaultKeywordsIntoLLSD();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// isSupportedVersion
+//-----------------------------------------------------------------------------
+const U32 LLSD_SYNTAX_LSL_VERSION_EXPECTED = 2;
+const std::string LLSD_SYNTAX_LSL_VERSION_KEY("llsd-lsl-syntax-version");
+
+bool LLSyntaxIdLSL::isSupportedVersion(const LLSD& content)
+{
+ bool is_valid = false;
+ /*
+ * If the schema used to store LSL keywords and hints changes, this value is incremented
+ * Note that it should _not_ be changed if the keywords and hints _content_ changes.
+ */
+
+ if (content.has(LLSD_SYNTAX_LSL_VERSION_KEY))
+ {
+ LL_DEBUGS("SyntaxLSL") << "LSL syntax version: " << content[LLSD_SYNTAX_LSL_VERSION_KEY].asString() << LL_ENDL;
+
+ if (content[LLSD_SYNTAX_LSL_VERSION_KEY].asInteger() == LLSD_SYNTAX_LSL_VERSION_EXPECTED)
+ {
+ is_valid = true;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("SyntaxLSL") << "Missing LSL syntax version key." << LL_ENDL;
+ }
+
+ return is_valid;
+}
+
+//-----------------------------------------------------------------------------
+// loadDefaultKeywordsIntoLLSD()
+//-----------------------------------------------------------------------------
+void LLSyntaxIdLSL::loadDefaultKeywordsIntoLLSD()
+{
+ mSyntaxId.setNull();
+ buildFullFileSpec();
+ loadKeywordsIntoLLSD();
+}
+
+//-----------------------------------------------------------------------------
+// loadKeywordsFileIntoLLSD
+//-----------------------------------------------------------------------------
+/**
+ * @brief Load xml serialised LLSD
+ * @desc Opens the specified filespec and attempts to deserialise the
+ * contained data to the specified LLSD object. indicate success/failure with
+ * sLoaded/sLoadFailed members.
+ */
+void LLSyntaxIdLSL::loadKeywordsIntoLLSD()
+{
+ LLSD content;
+ llifstream file;
+ file.open(mFullFileSpec);
+ if (file.is_open())
+ {
+ if (LLSDSerialize::fromXML(content, file) != LLSDParser::PARSE_FAILURE)
+ {
+ if (isSupportedVersion(content))
+ {
+ LL_DEBUGS("SyntaxLSL") << "Deserialised: " << mFullFileSpec << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("SyntaxLSL") << "Unknown or unsupported version of syntax file." << LL_ENDL;
+ }
+ }
+ }
+ else
+ {
+ LL_WARNS("SyntaxLSL") << "Failed to open: " << mFullFileSpec << LL_ENDL;
+ }
+ mKeywordsXml = content;
+ mSyntaxIDChangedSignal();
+}
+
+bool LLSyntaxIdLSL::keywordFetchInProgress()
+{
+ return !mInflightFetches.empty();
+}
+
+void LLSyntaxIdLSL::handleRegionChanged()
+{
+ if (syntaxIdChanged())
+ {
+ buildFullFileSpec();
+ fetchKeywordsFile(mFullFileSpec);
+ }
+}
+
+void LLSyntaxIdLSL::handleCapsReceived(const LLUUID& region_uuid)
+{
+ LLViewerRegion* current_region = gAgent.getRegion();
+
+ if (region_uuid.notNull()
+ && current_region->getRegionID() == region_uuid)
+ {
+ syntaxIdChanged();
+ }
+}
+
+void LLSyntaxIdLSL::handleFileFetched(const std::string& filepath)
+{
+ mInflightFetches.remove(filepath);
+ loadKeywordsIntoLLSD();
+}
+
+boost::signals2::connection LLSyntaxIdLSL::addSyntaxIDCallback(const syntax_id_changed_signal_t::slot_type& cb)
+{
+ return mSyntaxIDChangedSignal.connect(cb);
+}
diff --git a/indra/newview/llsyntaxid.h b/indra/newview/llsyntaxid.h
new file mode 100644
index 0000000000..504fb0997e
--- /dev/null
+++ b/indra/newview/llsyntaxid.h
@@ -0,0 +1,73 @@
+/**
+ * @file llsyntaxid.h
+ * @brief Contains methods to access the LSLSyntaxId feature and LSLSyntax capability
+ * to use the appropriate syntax file for the current region's LSL version.
+ * @author Ima Mechanique, Cinder Roxley
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2013, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+#ifndef LL_SYNTAXID_H
+#define LL_SYNTAXID_H
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llsingleton.h"
+
+class fetchKeywordsFileResponder;
+
+class LLSyntaxIdLSL : public LLSingleton<LLSyntaxIdLSL>
+{
+ friend class LLSingleton<LLSyntaxIdLSL>;
+ friend class fetchKeywordsFileResponder;
+
+private:
+ std::list<std::string> mInflightFetches;
+ typedef boost::signals2::signal<void()> syntax_id_changed_signal_t;
+ syntax_id_changed_signal_t mSyntaxIDChangedSignal;
+ boost::signals2::connection mRegionChangedCallback;
+
+ bool syntaxIdChanged();
+ bool isSupportedVersion(const LLSD& content);
+ void handleRegionChanged();
+ void handleCapsReceived(const LLUUID& region_uuid);
+ void handleFileFetched(const std::string& filepath);
+ void setKeywordsXml(const LLSD& content) { mKeywordsXml = content; };
+ void buildFullFileSpec();
+ void fetchKeywordsFile(const std::string& filespec);
+ void loadDefaultKeywordsIntoLLSD();
+ void loadKeywordsIntoLLSD();
+
+ std::string mCapabilityURL;
+ std::string mFullFileSpec;
+ ELLPath mFilePath;
+ LLUUID mSyntaxId;
+ LLSD mKeywordsXml;
+
+public:
+ LLSyntaxIdLSL();
+ void initialize();
+ bool keywordFetchInProgress();
+ LLSD getKeywordsXML() const { return mKeywordsXml; };
+ boost::signals2::connection addSyntaxIDCallback(const syntax_id_changed_signal_t::slot_type& cb);
+};
+
+#endif // LLSYNTAXID_H
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index ecaf5f8d06..ab7df02100 100755
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -2676,7 +2676,9 @@ bool LLTextureFetch::createRequest(FTType f_type, const std::string& url, const
worker->setImagePriority(priority);
worker->setDesiredDiscard(desired_discard, desired_size);
worker->setCanUseHTTP(can_use_http);
- worker->setUrl(url);
+
+ //MAINT-4184 url is always empty. Do not set with it.
+
if (!worker->haveWork())
{
worker->setState(LLTextureFetchWorker::INIT);
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 907baf0661..602c701a33 100755
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -46,7 +46,7 @@
const S32 BOTTOM_PAD = VPAD * 3;
const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
S32 BUTTON_WIDTH = 90;
-// *TODO: magic numbers(???) - copied from llnotify.cpp(250)
+// *TODO: magic numbers(?) - copied from llnotify.cpp(250)
const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE;
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index d307a31843..eabf6f0497 100755
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1584,13 +1584,22 @@ static void give_inventory_cb(const LLSD& notification, const LLSD& response)
const LLUUID& session_id = payload["session_id"];
const LLUUID& agent_id = payload["agent_id"];
LLViewerInventoryItem * inv_item = gInventory.getItem(payload["item_id"]);
- if (NULL == inv_item)
+ LLViewerInventoryCategory * inv_cat = gInventory.getCategory(payload["item_id"]);
+ if (NULL == inv_item && NULL == inv_cat)
{
- llassert(NULL != inv_item);
+ llassert( FALSE );
return;
}
-
- if (LLGiveInventory::doGiveInventoryItem(agent_id, inv_item, session_id))
+ bool successfully_shared;
+ if (inv_item)
+ {
+ successfully_shared = LLGiveInventory::doGiveInventoryItem(agent_id, inv_item, session_id);
+ }
+ else
+ {
+ successfully_shared = LLGiveInventory::doGiveInventoryCategory(agent_id, inv_cat, session_id);
+ }
+ if (successfully_shared)
{
if ("avatarpicker" == payload["d&d_dest"].asString())
{
@@ -1600,8 +1609,8 @@ static void give_inventory_cb(const LLSD& notification, const LLSD& response)
}
}
-static void show_item_sharing_confirmation(const std::string name,
- LLViewerInventoryItem* inv_item,
+static void show_object_sharing_confirmation(const std::string name,
+ LLInventoryObject* inv_item,
const LLSD& dest,
const LLUUID& dest_agent,
const LLUUID& session_id = LLUUID::null)
@@ -1611,32 +1620,28 @@ static void show_item_sharing_confirmation(const std::string name,
llassert(NULL != inv_item);
return;
}
- if(gInventory.getItem(inv_item->getUUID())
- && LLGiveInventory::isInventoryGiveAcceptable(inv_item))
- {
- LLSD substitutions;
- substitutions["RESIDENTS"] = name;
- substitutions["ITEMS"] = inv_item->getName();
- LLSD payload;
- payload["agent_id"] = dest_agent;
- payload["item_id"] = inv_item->getUUID();
- payload["session_id"] = session_id;
- payload["d&d_dest"] = dest.asString();
- LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb);
- }
+ LLSD substitutions;
+ substitutions["RESIDENTS"] = name;
+ substitutions["ITEMS"] = inv_item->getName();
+ LLSD payload;
+ payload["agent_id"] = dest_agent;
+ payload["item_id"] = inv_item->getUUID();
+ payload["session_id"] = session_id;
+ payload["d&d_dest"] = dest.asString();
+ LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb);
}
static void get_name_cb(const LLUUID& id,
const std::string& full_name,
- LLViewerInventoryItem* inv_item,
+ LLInventoryObject* inv_obj,
const LLSD& dest,
const LLUUID& dest_agent)
{
- show_item_sharing_confirmation(full_name,
- inv_item,
- dest,
- id,
- LLUUID::null);
+ show_object_sharing_confirmation(full_name,
+ inv_obj,
+ dest,
+ id,
+ LLUUID::null);
}
// function used as drag-and-drop handler for simple agent give inventory requests
@@ -1662,10 +1667,11 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
case DAD_GESTURE:
case DAD_CALLINGCARD:
case DAD_MESH:
+ case DAD_CATEGORY:
{
- LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
- if(gInventory.getItem(inv_item->getUUID())
- && LLGiveInventory::isInventoryGiveAcceptable(inv_item))
+ LLInventoryObject* inv_obj = (LLInventoryObject*)cargo_data;
+ if(gInventory.getCategory(inv_obj->getUUID()) || (gInventory.getItem(inv_obj->getUUID())
+ && LLGiveInventory::isInventoryGiveAcceptable(dynamic_cast<LLInventoryItem*>(inv_obj))))
{
// *TODO: get multiple object transfers working
*accept = ACCEPT_YES_COPY_SINGLE;
@@ -1682,40 +1688,18 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
// Otherwise set up a callback to show the dialog when the name arrives.
if (gCacheName->getFullName(dest_agent, fullname))
{
- show_item_sharing_confirmation(fullname, inv_item, dest, dest_agent, LLUUID::null);
+ show_object_sharing_confirmation(fullname, inv_obj, dest, dest_agent, LLUUID::null);
}
else
{
- gCacheName->get(dest_agent, false, boost::bind(&get_name_cb, _1, _2, inv_item, dest, dest_agent));
+ gCacheName->get(dest_agent, false, boost::bind(&get_name_cb, _1, _2, inv_obj, dest, dest_agent));
}
return true;
}
// If an IM session with destination agent is found item offer will be logged in this session.
- show_item_sharing_confirmation(session->mName, inv_item, dest, dest_agent, session_id);
- }
- }
- else
- {
- // It's not in the user's inventory (it's probably
- // in an object's contents), so disallow dragging
- // it here. You can't give something you don't
- // yet have.
- *accept = ACCEPT_NO;
- }
- break;
- }
- case DAD_CATEGORY:
- {
- LLViewerInventoryCategory* inv_cat = (LLViewerInventoryCategory*)cargo_data;
- if( gInventory.getCategory( inv_cat->getUUID() ) )
- {
- // *TODO: get multiple object transfers working
- *accept = ACCEPT_YES_COPY_SINGLE;
- if(drop)
- {
- LLGiveInventory::doGiveInventoryCategory(dest_agent, inv_cat, session_id);
+ show_object_sharing_confirmation(session->mName, inv_obj, dest, dest_agent, session_id);
}
}
else
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 558159775f..6881ec4563 100755
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1672,17 +1672,7 @@ BOOL LLToolPie::handleRightClickPick()
{
name = node->mName;
}
- std::string mute_msg;
- if (LLMuteList::getInstance()->isMuted(object->getID(), name))
- {
- mute_msg = LLTrans::getString("UnmuteObject");
- }
- else
- {
- mute_msg = LLTrans::getString("MuteObject2");
- }
-
- gMenuHolder->getChild<LLUICtrl>("Object Mute")->setValue(mute_msg);
+
gMenuObject->show(x, y);
showVisualContextMenuEffect();
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 70d3fc9462..5020518454 100755
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -368,6 +368,7 @@ static bool handleRepartition(const LLSD&)
if (gPipeline.isInit())
{
gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
+ gOctreeMinSize = gSavedSettings.getF32("OctreeMinimumNodeSize");
gObjectList.repartitionObjects();
}
return true;
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 9b3f9195e3..4e491f257d 100755
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -101,6 +101,7 @@
#include "llfloaterreporter.h"
#include "llfloatersceneloadstats.h"
#include "llfloaterscriptdebug.h"
+#include "llfloaterscriptedprefs.h"
#include "llfloaterscriptlimits.h"
#include "llfloatersearch.h"
#include "llfloatersellland.h"
@@ -264,6 +265,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("pathfinding_linksets", "floater_pathfinding_linksets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingLinksets>);
LLFloaterReg::add("pathfinding_console", "floater_pathfinding_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingConsole>);
LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
+ LLFloaterReg::add("perms_default", "floater_perms_default.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPermsDefault>);
LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);
@@ -272,7 +274,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTranslationSettings>);
LLFloaterReg::add("prefs_spellchecker", "floater_spellcheck.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSpellCheckerSettings>);
LLFloaterReg::add("prefs_autoreplace", "floater_autoreplace.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAutoReplaceSettings>);
- LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>);
LLFloaterReg::add("picks", "floater_picks.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>);
LLFloaterReg::add("preview_anim", "floater_preview_animation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewAnim>, "preview");
@@ -285,6 +286,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("preview_texture", "floater_preview_texture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewTexture>, "preview");
LLFloaterReg::add("properties", "floater_inventory_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProperties>);
LLFloaterReg::add("publish_classified", "floater_publish_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPublishClassifiedFloater>);
+ LLFloaterReg::add("script_colors", "floater_script_ed_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptEdPrefs>);
LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>);
LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml", &LLFloaterReg::build<LLFloaterTestInspectors>);
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index 2c196ece51..0401de7e69 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -136,7 +136,7 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()
addEntry(LLFolderType::FT_MESH, new ViewerFolderEntry("Meshes", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
bool boxes_invisible = !gSavedSettings.getBOOL("InventoryOutboxMakeVisible");
- addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "Inv_SysOpen", "Inv_SysClosed", FALSE, boxes_invisible));
+ addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Received Items", "Inv_SysOpen", "Inv_SysClosed", FALSE, boxes_invisible));
addEntry(LLFolderType::FT_OUTBOX, new ViewerFolderEntry("Merchant Outbox", "Inv_SysOpen", "Inv_SysClosed", FALSE, boxes_invisible));
addEntry(LLFolderType::FT_BASIC_ROOT, new ViewerFolderEntry("Basic Root", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index b236bba3b7..4e4c3471be 100755
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -66,6 +66,7 @@
#include "llavataractions.h"
#include "lllogininstance.h"
#include "llfavoritesbar.h"
+#include "llfloaterperms.h"
#include "llclipboard.h"
#include "llhttpretrypolicy.h"
@@ -989,24 +990,73 @@ void activate_gesture_cb(const LLUUID& inv_item)
LLGestureMgr::instance().activateGesture(inv_item);
}
-void create_gesture_cb(const LLUUID& inv_item)
+void create_script_cb(const LLUUID& inv_item)
{
- if (inv_item.isNull())
- return;
+ if (!inv_item.isNull())
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+ if (item)
+ {
+ LLPermissions perm = item->getPermissions();
+ perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Scripts"));
+ perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Scripts"));
- LLGestureMgr::instance().activateGesture(inv_item);
+ item->setPermissions(perm);
+
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
+ }
+ }
+}
+
+void create_gesture_cb(const LLUUID& inv_item)
+{
+ if (!inv_item.isNull())
+ {
+ LLGestureMgr::instance().activateGesture(inv_item);
- LLViewerInventoryItem* item = gInventory.getItem(inv_item);
- if (!item) return;
- gInventory.updateItem(item);
- gInventory.notifyObservers();
+ LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+ if (item)
+ {
+ LLPermissions perm = item->getPermissions();
+ perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Gestures"));
+ perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Gestures"));
+
+ item->setPermissions(perm);
+
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
- LLPreviewGesture* preview = LLPreviewGesture::show(inv_item, LLUUID::null);
- // Force to be entirely onscreen.
- gFloaterView->adjustToFitScreen(preview, FALSE);
+ LLPreviewGesture* preview = LLPreviewGesture::show(inv_item, LLUUID::null);
+ // Force to be entirely onscreen.
+ gFloaterView->adjustToFitScreen(preview, FALSE);
+ }
+ }
}
+void create_notecard_cb(const LLUUID& inv_item)
+{
+ if (!inv_item.isNull())
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+ if (item)
+ {
+ LLPermissions perm = item->getPermissions();
+ perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Notecards"));
+ perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Notecards"));
+
+ item->setPermissions(perm);
+
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
+ }
+ }
+}
+
LLInventoryCallbackManager gInventoryCallbacks;
void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
@@ -1719,22 +1769,45 @@ void create_new_item(const std::string& name,
LLViewerAssetType::generateDescriptionFor(asset_type, desc);
next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER;
-
- if (inv_type == LLInventoryType::IT_GESTURE)
- {
- LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(create_gesture_cb);
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
- parent_id, LLTransactionID::tnull, name, desc, asset_type, inv_type,
- NOT_WEARABLE, next_owner_perm, cb);
- }
- else
+ LLPointer<LLInventoryCallback> cb = NULL;
+
+ switch (inv_type)
{
- LLPointer<LLInventoryCallback> cb = NULL;
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
- parent_id, LLTransactionID::tnull, name, desc, asset_type, inv_type,
- NOT_WEARABLE, next_owner_perm, cb);
+ case LLInventoryType::IT_LSL:
+ {
+ cb = new LLBoostFuncInventoryCallback(create_script_cb);
+ next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Scripts");
+ break;
+ }
+
+ case LLInventoryType::IT_GESTURE:
+ {
+ cb = new LLBoostFuncInventoryCallback(create_gesture_cb);
+ next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Gestures");
+ break;
+ }
+
+ case LLInventoryType::IT_NOTECARD:
+ {
+ cb = new LLBoostFuncInventoryCallback(create_notecard_cb);
+ next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Notecards");
+ break;
+ }
+ default:
+ break;
}
-
+
+ create_inventory_item(gAgent.getID(),
+ gAgent.getSessionID(),
+ parent_id,
+ LLTransactionID::tnull,
+ name,
+ desc,
+ asset_type,
+ inv_type,
+ NOT_WEARABLE,
+ next_owner_perm,
+ cb);
}
void slam_inventory_folder(const LLUUID& folder_id,
@@ -1822,7 +1895,7 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLFolderBridge *bridge,
parent_id,
LLAssetType::AT_LSL_TEXT,
LLInventoryType::IT_LSL,
- PERM_MOVE | PERM_TRANSFER);
+ PERM_MOVE | PERM_TRANSFER); // overridden in create_new_item
}
else if ("notecard" == type_name)
{
@@ -1831,7 +1904,7 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLFolderBridge *bridge,
parent_id,
LLAssetType::AT_NOTECARD,
LLInventoryType::IT_NOTECARD,
- PERM_ALL);
+ PERM_ALL); // overridden in create_new_item
}
else if ("gesture" == type_name)
{
@@ -1840,7 +1913,7 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLFolderBridge *bridge,
parent_id,
LLAssetType::AT_GESTURE,
LLInventoryType::IT_GESTURE,
- PERM_ALL);
+ PERM_ALL); // overridden in create_new_item
}
else
{
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index c284c703d4..d345c49cfb 100755
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -252,7 +252,9 @@ void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachme
void activate_gesture_cb(const LLUUID& inv_item);
+void create_script_cb(const LLUUID& inv_item);
void create_gesture_cb(const LLUUID& inv_item);
+void create_notecard_cb(const LLUUID& inv_item);
class AddFavoriteLandmarkCallback : public LLInventoryCallback
{
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index bdda37cc5f..8499012cfc 100755
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -196,7 +196,7 @@ private:
// 500 means "Internal Server error" but we decided it's okay to
// accept this and go past it in the MIME type probe
// 302 means the resource can be found temporarily in a different place - added this for join.secondlife.com
- // 499 is a code specifc to join.secondlife.com (????) apparently safe to ignore
+ // 499 is a code specifc to join.secondlife.com (?) apparently safe to ignore
// if( ((status >= 200) && (status < 300)) ||
// ((status >= 400) && (status < 499)) ||
// (status == 500) ||
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index b23e23f32e..8c9429c05d 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -7815,7 +7815,7 @@ void handle_report_bug(const LLSD& param)
replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getViewerInfoString());
LLSLURL location_url;
LLAgentUI::buildSLURL(location_url);
- replace["[LOCATION]"] = location_url.getSLURLString();
+ replace["[LOCATION]"] = LLURI::escape(location_url.getSLURLString());
LLUIString file_bug_url = gSavedSettings.getString("ReportBugURL");
file_bug_url.setArgs(replace);
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 9199e7fd97..80f47ecab2 100755
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -443,9 +443,9 @@ class LLFileUploadBulk : public view_listener_t
0,
LLFolderType::FT_NONE,
LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getEveryonePerms(),
+ LLFloaterPerms::getNextOwnerPerms("Uploads"),
+ LLFloaterPerms::getGroupPerms("Uploads"),
+ LLFloaterPerms::getEveryonePerms("Uploads"),
display_name,
callback,
expected_upload_cost,
@@ -1007,9 +1007,9 @@ void upload_done_callback(
0,
LLFolderType::FT_NONE,
LLInventoryType::IT_NONE,
- PERM_NONE,
- PERM_NONE,
- PERM_NONE,
+ LLFloaterPerms::getNextOwnerPerms("Uploads"),
+ LLFloaterPerms::getGroupPerms("Uploads"),
+ LLFloaterPerms::getEveryonePerms("Uploads"),
display_name,
callback,
expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 0d1ffd2b51..9d5c3c4d4a 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -651,25 +651,57 @@ void send_sound_trigger(const LLUUID& sound_id, F32 gain)
gAgent.sendMessage();
}
+static LLSD sSavedGroupInvite;
+static LLSD sSavedResponse;
+
bool join_group_response(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+// A bit of variable saving and restoring is used to deal with the case where your group list is full and you
+// receive an invitation to another group. The data from that invitation is stored in the sSaved
+// variables. If you then drop a group and click on the Join button the stored data is restored and used
+// to join the group.
+ LLSD notification_adjusted = notification;
+ LLSD response_adjusted = response;
+
+ std::string action = notification["name"];
+
+// Storing all the information by group id allows for the rare case of being at your maximum
+// group count and receiving more than one invitation.
+ std::string id = notification_adjusted["payload"]["group_id"].asString();
+
+ if ("JoinGroup" == action || "JoinGroupCanAfford" == action)
+ {
+ sSavedGroupInvite[id] = notification;
+ sSavedResponse[id] = response;
+ }
+ else if ("JoinedTooManyGroupsMember" == action)
+ {
+ S32 opt = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == opt) // Join button pressed
+ {
+ notification_adjusted = sSavedGroupInvite[id];
+ response_adjusted = sSavedResponse[id];
+ }
+ }
+
+ S32 option = LLNotificationsUtil::getSelectedOption(notification_adjusted, response_adjusted);
bool accept_invite = false;
- LLUUID group_id = notification["payload"]["group_id"].asUUID();
- LLUUID transaction_id = notification["payload"]["transaction_id"].asUUID();
- std::string name = notification["payload"]["name"].asString();
- std::string message = notification["payload"]["message"].asString();
- S32 fee = notification["payload"]["fee"].asInteger();
+ LLUUID group_id = notification_adjusted["payload"]["group_id"].asUUID();
+ LLUUID transaction_id = notification_adjusted["payload"]["transaction_id"].asUUID();
+ std::string name = notification_adjusted["payload"]["name"].asString();
+ std::string message = notification_adjusted["payload"]["message"].asString();
+ S32 fee = notification_adjusted["payload"]["fee"].asInteger();
if (option == 2 && !group_id.isNull())
{
LLGroupActions::show(group_id);
LLSD args;
args["MESSAGE"] = message;
- LLNotificationsUtil::add("JoinGroup", args, notification["payload"]);
+ LLNotificationsUtil::add("JoinGroup", args, notification_adjusted["payload"]);
return false;
}
+
if(option == 0 && !group_id.isNull())
{
// check for promotion or demotion.
@@ -684,7 +716,8 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
{
LLSD args;
args["NAME"] = name;
- LLNotificationsUtil::add("JoinedTooManyGroupsMember", args, notification["payload"]);
+ LLNotificationsUtil::add("JoinedTooManyGroupsMember", args, notification_adjusted["payload"]);
+ return false;
}
}
@@ -698,7 +731,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
args["COST"] = llformat("%d", fee);
// Set the fee for next time to 0, so that we don't keep
// asking about a fee.
- LLSD next_payload = notification["payload"];
+ LLSD next_payload = notification_adjusted["payload"];
next_payload["fee"] = 0;
LLNotificationsUtil::add("JoinGroupCanAfford",
args,
@@ -724,6 +757,9 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
transaction_id);
}
+ sSavedGroupInvite[id] = LLSD::emptyMap();
+ sSavedResponse[id] = LLSD::emptyMap();
+
return false;
}
@@ -1891,6 +1927,7 @@ void inventory_offer_handler(LLOfferInfo* info)
return;
}
+ bool bAutoAccept(false);
// Avoid the Accept/Discard dialog if the user so desires. JC
if (gSavedSettings.getBOOL("AutoAcceptNewInventory")
&& (info->mType == LLAssetType::AT_NOTECARD
@@ -1899,8 +1936,7 @@ void inventory_offer_handler(LLOfferInfo* info)
{
// For certain types, just accept the items into the inventory,
// and possibly open them on receipt depending upon "ShowNewInventory".
- info->forceResponse(IOR_ACCEPT);
- return;
+ bAutoAccept = true;
}
// Strip any SLURL from the message display. (DEV-2754)
@@ -1968,7 +2004,7 @@ void inventory_offer_handler(LLOfferInfo* info)
LLNotification::Params p;
// Object -> Agent Inventory Offer
- if (info->mFromObject)
+ if (info->mFromObject && !bAutoAccept)
{
// Inventory Slurls don't currently work for non agent transfers, so only display the object name.
args["ITEM_SLURL"] = msg;
@@ -2014,11 +2050,12 @@ void inventory_offer_handler(LLOfferInfo* info)
send_do_not_disturb_message(gMessageSystem, info->mFromID);
}
- // Inform user that there is a script floater via toast system
+ if( !bAutoAccept ) // if we auto accept, do not pester the user
{
+ // Inform user that there is a script floater via toast system
payload["give_inventory_notification"] = TRUE;
- p.payload = payload;
- LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, false);
+ p.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, false);
}
}
@@ -2424,10 +2461,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
&& from_id.notNull() //not a system message
&& to_id.notNull()) //not global message
{
- // return a standard "do not disturb" message, but only do it to online IM
- // (i.e. not other auto responses and not store-and-forward IM)
-
- send_do_not_disturb_message(msg, from_id, session_id);
// now store incoming IM in chat history
@@ -2448,6 +2481,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
region_id,
position,
true);
+
+ if (!gIMMgr->isDNDMessageSend(session_id))
+ {
+ // return a standard "do not disturb" message, but only do it to online IM
+ // (i.e. not other auto responses and not store-and-forward IM)
+ send_do_not_disturb_message(msg, from_id, session_id);
+ gIMMgr->setDNDMessageSent(session_id, true);
+ }
+
}
else if (from_id.isNull())
{
@@ -5892,7 +5934,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
}
}
- send_sound_trigger(LLUUID(gSavedSettings.getString("UISndRestart")), 1.0f);
+ make_ui_sound("UISndRestart");
}
LLNotificationsUtil::add(notificationID, llsdBlock);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 7c60be7046..80592f01ce 100755
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -100,6 +100,7 @@
#include "lltrans.h"
#include "llsdutil.h"
#include "llmediaentry.h"
+#include "llfloaterperms.h"
#include "llvocache.h"
//#define DEBUG_UPDATE_TYPE
@@ -2726,6 +2727,7 @@ void LLViewerObject::saveScript(
* interaction with doUpdateInventory() called below.
*/
LL_DEBUGS() << "LLViewerObject::saveScript() " << item->getUUID() << " " << item->getAssetUUID() << LL_ENDL;
+
LLPointer<LLViewerInventoryItem> task_item =
new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
item->getAssetUUID(), item->getType(),
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 7f5d2ac125..7c36b30dd1 100755
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -68,7 +68,7 @@
#include "u64.h"
#include "llviewertexturelist.h"
#include "lldatapacker.h"
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
#include <zlib.h>
#else
#include "zlib/zlib.h"
@@ -76,6 +76,7 @@
#include "object_flags.h"
#include "llappviewer.h"
+#include "llfloaterperms.h"
#include "llvocache.h"
extern F32 gMinObjectDistance;
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index be0f28df44..cd5f64b9ca 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -72,6 +72,7 @@
#include "stringize.h"
#include "llviewercontrol.h"
#include "llsdserialize.h"
+#include "llfloaterperms.h"
#include "llvieweroctree.h"
#include "llviewerdisplay.h"
#include "llviewerwindow.h"
@@ -2570,40 +2571,69 @@ void LLViewerRegion::unpackRegionHandshake()
{
LLUUID tmp_id;
+ bool changed = false;
+
+ // Get the 4 textures for land
msg->getUUID("RegionInfo", "TerrainDetail0", tmp_id);
+ changed |= (tmp_id != compp->getDetailTextureID(0));
compp->setDetailTextureID(0, tmp_id);
+
msg->getUUID("RegionInfo", "TerrainDetail1", tmp_id);
+ changed |= (tmp_id != compp->getDetailTextureID(1));
compp->setDetailTextureID(1, tmp_id);
+
msg->getUUID("RegionInfo", "TerrainDetail2", tmp_id);
+ changed |= (tmp_id != compp->getDetailTextureID(2));
compp->setDetailTextureID(2, tmp_id);
+
msg->getUUID("RegionInfo", "TerrainDetail3", tmp_id);
+ changed |= (tmp_id != compp->getDetailTextureID(3));
compp->setDetailTextureID(3, tmp_id);
+ // Get the start altitude and range values for land textures
F32 tmp_f32;
msg->getF32("RegionInfo", "TerrainStartHeight00", tmp_f32);
+ changed |= (tmp_f32 != compp->getStartHeight(0));
compp->setStartHeight(0, tmp_f32);
+
msg->getF32("RegionInfo", "TerrainStartHeight01", tmp_f32);
+ changed |= (tmp_f32 != compp->getStartHeight(1));
compp->setStartHeight(1, tmp_f32);
+
msg->getF32("RegionInfo", "TerrainStartHeight10", tmp_f32);
+ changed |= (tmp_f32 != compp->getStartHeight(2));
compp->setStartHeight(2, tmp_f32);
+
msg->getF32("RegionInfo", "TerrainStartHeight11", tmp_f32);
+ changed |= (tmp_f32 != compp->getStartHeight(3));
compp->setStartHeight(3, tmp_f32);
+
msg->getF32("RegionInfo", "TerrainHeightRange00", tmp_f32);
+ changed |= (tmp_f32 != compp->getHeightRange(0));
compp->setHeightRange(0, tmp_f32);
+
msg->getF32("RegionInfo", "TerrainHeightRange01", tmp_f32);
+ changed |= (tmp_f32 != compp->getHeightRange(1));
compp->setHeightRange(1, tmp_f32);
+
msg->getF32("RegionInfo", "TerrainHeightRange10", tmp_f32);
+ changed |= (tmp_f32 != compp->getHeightRange(2));
compp->setHeightRange(2, tmp_f32);
+
msg->getF32("RegionInfo", "TerrainHeightRange11", tmp_f32);
+ changed |= (tmp_f32 != compp->getHeightRange(3));
compp->setHeightRange(3, tmp_f32);
// If this is an UPDATE (params already ready, we need to regenerate
// all of our terrain stuff, by
if (compp->getParamsReady())
{
- //this line creates frame stalls on region crossing and removing it appears to have no effect
- //getLand().dirtyAllPatches();
+ // Update if the land changed
+ if (changed)
+ {
+ getLand().dirtyAllPatches();
+ }
}
else
{
@@ -2645,6 +2675,7 @@ void LLViewerRegion::unpackRegionHandshake()
void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
{
+ capabilityNames.append("AgentPreferences");
capabilityNames.append("AgentState");
capabilityNames.append("AttachmentResources");
capabilityNames.append("AvatarPickerSearch");
@@ -2677,10 +2708,12 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("GetObjectCost");
capabilityNames.append("GetObjectPhysicsData");
capabilityNames.append("GetTexture");
+ capabilityNames.append("GroupAPIv1");
capabilityNames.append("GroupMemberData");
capabilityNames.append("GroupProposalBallot");
capabilityNames.append("HomeLocation");
capabilityNames.append("LandResources");
+ capabilityNames.append("LSLSyntax");
capabilityNames.append("MapLayer");
capabilityNames.append("MapLayerGod");
capabilityNames.append("MeshUploadFlag");
@@ -2949,6 +2982,8 @@ void LLViewerRegion::setCapabilitiesReceived(bool received)
{
mCapabilitiesReceivedSignal(getRegionID());
+ LLFloaterPermsDefault::sendInitialPerms();
+
// This is a single-shot signal. Forget callbacks to save resources.
mCapabilitiesReceivedSignal.disconnect_all_slots();
}
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index d052906bee..4d263c118b 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1075,7 +1075,7 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK
// *HACK: this should be rolled into the composite tool logic, not
// hardcoded at the top level.
- if (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgentCamera.getCameraMode() && LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance())
+ if (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgentCamera.getCameraMode() && LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance() && gAgent.isInitialized())
{
// If the current tool didn't process the click, we should show
// the pie menu. This can be done by passing the event to the pie
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 9937a1c42a..54b4119331 100755
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -35,7 +35,7 @@
#include "llbufferstream.h"
#include "llfile.h"
#include "llmenugl.h"
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
# include "expat.h"
#else
# include "expat/expat.h"
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index c325d72ba6..5e876fa2ef 100755
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -38,7 +38,7 @@ class LLVivoxProtocolParser;
#include "llviewerregion.h"
#include "llcallingcard.h" // for LLFriendObserver
-#ifdef LL_STANDALONE
+#ifdef LL_USESYSTEMLIBS
# include "expat.h"
#else
# include "expat/expat.h"
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 945d3711f0..a83e2e020e 100755
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1287,9 +1287,9 @@ BOOL LLVOVolume::calcLOD()
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO) &&
mDrawable->getFace(0))
{
- //setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
+ //setDebugText(llformat("%.2f:%.2f, %d", mDrawable->mDistanceWRTCamera, radius, cur_detail));
- //setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex()));
+ setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex()));
}
if (cur_detail != mLOD)
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 21ccec5c0a..3dfe1e5992 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -492,6 +492,7 @@ void LLPipeline::init()
refreshCachedSettings();
gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
+ gOctreeMinSize = gSavedSettings.getF32("OctreeMinimumNodeSize");
sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
@@ -1355,49 +1356,10 @@ void LLPipeline::createLUTBuffers()
{
if (!mLightFunc)
{
- /*U32 lightResX = gSavedSettings.getU32("RenderSpecularResX");
- U32 lightResY = gSavedSettings.getU32("RenderSpecularResY");
- U8* ls = new U8[lightResX*lightResY];
- F32 specExp = gSavedSettings.getF32("RenderSpecularExponent");
- // Calculate the (normalized) Blinn-Phong specular lookup texture.
- for (U32 y = 0; y < lightResY; ++y)
- {
- for (U32 x = 0; x < lightResX; ++x)
- {
- ls[y*lightResX+x] = 0;
- F32 sa = (F32) x/(lightResX-1);
- F32 spec = (F32) y/(lightResY-1);
- F32 n = spec * spec * specExp;
-
- // Nothing special here. Just your typical blinn-phong term.
- spec = powf(sa, n);
-
- // Apply our normalization function.
- // Note: This is the full equation that applies the full normalization curve, not an approximation.
- // This is fine, given we only need to create our LUT once per buffer initialization.
- // The only trade off is we have a really low dynamic range.
- // This means we have to account for things not being able to exceed 0 to 1 in our shaders.
- spec *= (((n + 2) * (n + 4)) / (8 * F_PI * (powf(2, -n/2) + n)));
-
- // Always sample at a 1.0/2.2 curve.
- // This "Gamma corrects" our specular term, boosting our lower exponent reflections.
- spec = powf(spec, 1.f/2.2f);
-
- // Easy fix for our dynamic range problem: divide by 6 here, multiply by 6 in our shaders.
- // This allows for our specular term to exceed a value of 1 in our shaders.
- // This is something that can be important for energy conserving specular models where higher exponents can result in highlights that exceed a range of 0 to 1.
- // Technically, we could just use an R16F texture, but driver support for R16F textures can be somewhat spotty at times.
- // This works remarkably well for higher specular exponents, though banding can sometimes be seen on lower exponents.
- // Combined with a bit of noise and trilinear filtering, the banding is hardly noticable.
- ls[y*lightResX+x] = (U8)(llclamp(spec * (1.f / 6), 0.f, 1.f) * 255);
- }
- }*/
-
-
U32 lightResX = gSavedSettings.getU32("RenderSpecularResX");
U32 lightResY = gSavedSettings.getU32("RenderSpecularResY");
F32* ls = new F32[lightResX*lightResY];
- //F32 specExp = gSavedSettings.getF32("RenderSpecularExponent"); // Note: only use this when creating new specular lighting functions.
+ F32 specExp = gSavedSettings.getF32("RenderSpecularExponent");
// Calculate the (normalized) blinn-phong specular lookup texture. (with a few tweaks)
for (U32 y = 0; y < lightResY; ++y)
{
@@ -1406,7 +1368,7 @@ void LLPipeline::createLUTBuffers()
ls[y*lightResX+x] = 0;
F32 sa = (F32) x/(lightResX-1);
F32 spec = (F32) y/(lightResY-1);
- F32 n = spec * spec * 368;
+ F32 n = spec * spec * specExp;
// Nothing special here. Just your typical blinn-phong term.
spec = powf(sa, n);
@@ -1419,23 +1381,6 @@ void LLPipeline::createLUTBuffers()
// Since we use R16F, we no longer have a dynamic range issue we need to work around here.
// Though some older drivers may not like this, newer drivers shouldn't have this problem.
ls[y*lightResX+x] = spec;
-
-
- //beckmann distribution
- /*F32 alpha = acosf((F32) x/(lightResX-1));
- F32 m = 1.f - (F32) y/(lightResY-1);
-
- F32 cos4_alpha = cosf(alpha);
- cos4_alpha *= cos4_alpha;
- cos4_alpha *= cos4_alpha;
-
- F32 tan_alpha = tanf(alpha);
- F32 tan2_alpha = tan_alpha*tan_alpha;
-
- F32 k = expf(-(tan2_alpha)/(m*m)) /
- (3.14159f*m*m*cos4_alpha);
-
- ls[y*lightResX+x] = k;*/
}
}
@@ -1448,7 +1393,6 @@ void LLPipeline::createLUTBuffers()
LLImageGL::generateTextures(1, &mLightFunc);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, pix_format, lightResX, lightResY, GL_RED, GL_FLOAT, ls, false);
- //LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_UNSIGNED_BYTE, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, ls, false);
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
diff --git a/indra/newview/roles_constants.h b/indra/newview/roles_constants.h
index effd15ea72..8fd7978fa1 100755..100644
--- a/indra/newview/roles_constants.h
+++ b/indra/newview/roles_constants.h
@@ -53,98 +53,100 @@ enum LLRoleChangeType
// KNOWN HOLES: use these for any single bit powers you need
// bit 0x1 << 46
-// bit 0x1 << 49 and above
+// bit 0x1 << 52 and above
// These powers were removed to make group roles simpler
// bit 0x1 << 41 (GP_ACCOUNTING_VIEW)
// bit 0x1 << 46 (GP_PROPOSAL_VIEW)
const U64 GP_NO_POWERS = 0x0;
-const U64 GP_ALL_POWERS = 0xFFFFFFFFFFFFFFFFLL;
+const U64 GP_ALL_POWERS = 0xFFFFffffFFFFffffLL;
// Membership
-const U64 GP_MEMBER_INVITE = 0x1 << 1; // Invite member
-const U64 GP_MEMBER_EJECT = 0x1 << 2; // Eject member from group
-const U64 GP_MEMBER_OPTIONS = 0x1 << 3; // Toggle "Open enrollment" and change "Signup Fee"
-const U64 GP_MEMBER_VISIBLE_IN_DIR = 0x1LL << 47;
+const U64 GP_MEMBER_INVITE = 0x1LL << 1; // Invite member
+const U64 GP_MEMBER_EJECT = 0x1LL << 2; // Eject member from group
+const U64 GP_MEMBER_OPTIONS = 0x1LL << 3; // Toggle "Open enrollment" and change "Signup Fee"
+const U64 GP_MEMBER_VISIBLE_IN_DIR = 0x1LL << 47;
// Roles
-const U64 GP_ROLE_CREATE = 0x1 << 4; // Create new roles
-const U64 GP_ROLE_DELETE = 0x1 << 5; // Delete roles
-const U64 GP_ROLE_PROPERTIES = 0x1 << 6; // Change Role Names, Titles, and Descriptions (Of roles the user is in, only, or any role in group?)
-const U64 GP_ROLE_ASSIGN_MEMBER_LIMITED = 0x1 << 7; // Assign Member to a Role that the assigner is in
-const U64 GP_ROLE_ASSIGN_MEMBER = 0x1 << 8; // Assign Member to Role
-const U64 GP_ROLE_REMOVE_MEMBER = 0x1 << 9; // Remove Member from Role
-const U64 GP_ROLE_CHANGE_ACTIONS = 0x1 << 10; // Change actions a role can perform
+const U64 GP_ROLE_CREATE = 0x1LL << 4; // Create new roles
+const U64 GP_ROLE_DELETE = 0x1LL << 5; // Delete roles
+const U64 GP_ROLE_PROPERTIES = 0x1LL << 6; // Change Role Names, Titles, and Descriptions (Of roles the user is in, only, or any role in group?)
+const U64 GP_ROLE_ASSIGN_MEMBER_LIMITED = 0x1LL << 7; // Assign Member to a Role that the assigner is in
+const U64 GP_ROLE_ASSIGN_MEMBER = 0x1LL << 8; // Assign Member to Role
+const U64 GP_ROLE_REMOVE_MEMBER = 0x1LL << 9; // Remove Member from Role
+const U64 GP_ROLE_CHANGE_ACTIONS = 0x1LL << 10; // Change actions a role can perform
// Group Identity
-const U64 GP_GROUP_CHANGE_IDENTITY = 0x1 << 11; // Charter, insignia, 'Show In Group List', 'Publish on the web', 'Mature', all 'Show Member In Group Profile' checkboxes
+const U64 GP_GROUP_CHANGE_IDENTITY = 0x1LL << 11; // Charter, insignia, 'Show In Group List', 'Publish on the web', 'Mature', all 'Show Member In Group Profile' checkboxes
// Parcel Management
-const U64 GP_LAND_DEED = 0x1 << 12; // Deed Land and Buy Land for Group
-const U64 GP_LAND_RELEASE = 0x1 << 13; // Release Land (to Gov. Linden)
-const U64 GP_LAND_SET_SALE_INFO = 0x1 << 14; // Set for sale info (Toggle "For Sale", Set Price, Set Target, Toggle "Sell objects with the land")
-const U64 GP_LAND_DIVIDE_JOIN = 0x1 << 15; // Divide and Join Parcels
+const U64 GP_LAND_DEED = 0x1LL << 12; // Deed Land and Buy Land for Group
+const U64 GP_LAND_RELEASE = 0x1LL << 13; // Release Land (to Gov. Linden)
+const U64 GP_LAND_SET_SALE_INFO = 0x1LL << 14; // Set for sale info (Toggle "For Sale", Set Price, Set Target, Toggle "Sell objects with the land")
+const U64 GP_LAND_DIVIDE_JOIN = 0x1LL << 15; // Divide and Join Parcels
// Parcel Identity
-const U64 GP_LAND_FIND_PLACES = 0x1 << 17; // Toggle "Show in Find Places" and Set Category.
-const U64 GP_LAND_CHANGE_IDENTITY = 0x1 << 18; // Change Parcel Identity: Parcel Name, Parcel Description, Snapshot, 'Publish on the web', and 'Mature' checkbox
-const U64 GP_LAND_SET_LANDING_POINT = 0x1 << 19; // Set Landing Point
+const U64 GP_LAND_FIND_PLACES = 0x1LL << 17; // Toggle "Show in Find Places" and Set Category.
+const U64 GP_LAND_CHANGE_IDENTITY = 0x1LL << 18; // Change Parcel Identity: Parcel Name, Parcel Description, Snapshot, 'Publish on the web', and 'Mature' checkbox
+const U64 GP_LAND_SET_LANDING_POINT = 0x1LL << 19; // Set Landing Point
// Parcel Settings
-const U64 GP_LAND_CHANGE_MEDIA = 0x1 << 20; // Change Media Settings
-const U64 GP_LAND_EDIT = 0x1 << 21; // Toggle Edit Land
-const U64 GP_LAND_OPTIONS = 0x1 << 22; // Toggle Set Home Point, Fly, Outside Scripts, Create/Edit Objects, Landmark, and Damage checkboxes
+const U64 GP_LAND_CHANGE_MEDIA = 0x1LL << 20; // Change Media Settings
+const U64 GP_LAND_EDIT = 0x1LL << 21; // Toggle Edit Land
+const U64 GP_LAND_OPTIONS = 0x1LL << 22; // Toggle Set Home Point, Fly, Outside Scripts, Create/Edit Objects, Landmark, and Damage checkboxes
// Parcel Powers
-const U64 GP_LAND_ALLOW_EDIT_LAND = 0x1 << 23; // Bypass Edit Land Restriction
-const U64 GP_LAND_ALLOW_FLY = 0x1 << 24; // Bypass Fly Restriction
-const U64 GP_LAND_ALLOW_CREATE = 0x1 << 25; // Bypass Create/Edit Objects Restriction
-const U64 GP_LAND_ALLOW_LANDMARK = 0x1 << 26; // Bypass Landmark Restriction
-const U64 GP_LAND_ALLOW_SET_HOME = 0x1 << 28; // Bypass Set Home Point Restriction
-const U64 GP_LAND_ALLOW_HOLD_EVENT = 0x1LL << 41; // Allowed to hold events on group-owned land
-
+const U64 GP_LAND_ALLOW_EDIT_LAND = 0x1LL << 23; // Bypass Edit Land Restriction
+const U64 GP_LAND_ALLOW_FLY = 0x1LL << 24; // Bypass Fly Restriction
+const U64 GP_LAND_ALLOW_CREATE = 0x1LL << 25; // Bypass Create/Edit Objects Restriction
+const U64 GP_LAND_ALLOW_LANDMARK = 0x1LL << 26; // Bypass Landmark Restriction
+const U64 GP_LAND_ALLOW_SET_HOME = 0x1LL << 28; // Bypass Set Home Point Restriction
+const U64 GP_LAND_ALLOW_HOLD_EVENT = 0x1LL << 41; // Allowed to hold events on group-owned land
// Parcel Access
-const U64 GP_LAND_MANAGE_ALLOWED = 0x1 << 29; // Manage Allowed List
-const U64 GP_LAND_MANAGE_BANNED = 0x1 << 30; // Manage Banned List
-const U64 GP_LAND_MANAGE_PASSES = 0x1LL << 31; // Change Sell Pass Settings
-const U64 GP_LAND_ADMIN = 0x1LL << 32; // Eject and Freeze Users on the land
+const U64 GP_LAND_MANAGE_ALLOWED = 0x1LL << 29; // Manage Allowed List
+const U64 GP_LAND_MANAGE_BANNED = 0x1LL << 30; // Manage Banned List
+const U64 GP_LAND_MANAGE_PASSES = 0x1LL << 31; // Change Sell Pass Settings
+const U64 GP_LAND_ADMIN = 0x1LL << 32; // Eject and Freeze Users on the land
// Parcel Content
-const U64 GP_LAND_RETURN_GROUP_SET = 0x1LL << 33; // Return objects on parcel that are set to group
-const U64 GP_LAND_RETURN_NON_GROUP = 0x1LL << 34; // Return objects on parcel that are not set to group
-const U64 GP_LAND_RETURN_GROUP_OWNED= 0x1LL << 48; // Return objects on parcel that are owned by the group
+const U64 GP_LAND_RETURN_GROUP_SET = 0x1LL << 33; // Return objects on parcel that are set to group
+const U64 GP_LAND_RETURN_NON_GROUP = 0x1LL << 34; // Return objects on parcel that are not set to group
+const U64 GP_LAND_RETURN_GROUP_OWNED = 0x1LL << 48; // Return objects on parcel that are owned by the group
// Select a power-bit based on an object's relationship to a parcel.
const U64 GP_LAND_RETURN = GP_LAND_RETURN_GROUP_OWNED
| GP_LAND_RETURN_GROUP_SET
| GP_LAND_RETURN_NON_GROUP;
-const U64 GP_LAND_GARDENING = 0x1LL << 35; // Parcel Gardening - plant and move linden trees
+const U64 GP_LAND_GARDENING = 0x1LL << 35; // Parcel Gardening - plant and move linden trees
// Object Management
-const U64 GP_OBJECT_DEED = 0x1LL << 36; // Deed Object
-const U64 GP_OBJECT_MANIPULATE = 0x1LL << 38; // Manipulate Group Owned Objects (Move, Copy, Mod)
-const U64 GP_OBJECT_SET_SALE = 0x1LL << 39; // Set Group Owned Object for Sale
+const U64 GP_OBJECT_DEED = 0x1LL << 36; // Deed Object
+const U64 GP_OBJECT_MANIPULATE = 0x1LL << 38; // Manipulate Group Owned Objects (Move, Copy, Mod)
+const U64 GP_OBJECT_SET_SALE = 0x1LL << 39; // Set Group Owned Object for Sale
// Accounting
-const U64 GP_ACCOUNTING_ACCOUNTABLE = 0x1LL << 40; // Pay Group Liabilities and Receive Group Dividends
+const U64 GP_ACCOUNTING_ACCOUNTABLE = 0x1LL << 40; // Pay Group Liabilities and Receive Group Dividends
// Notices
-const U64 GP_NOTICES_SEND = 0x1LL << 42; // Send Notices
-const U64 GP_NOTICES_RECEIVE = 0x1LL << 43; // Receive Notices and View Notice History
+const U64 GP_NOTICES_SEND = 0x1LL << 42; // Send Notices
+const U64 GP_NOTICES_RECEIVE = 0x1LL << 43; // Receive Notices and View Notice History
// Proposals
// TODO: _DEPRECATED suffix as part of vote removal - DEV-24856:
-const U64 GP_PROPOSAL_START = 0x1LL << 44; // Start Proposal
+const U64 GP_PROPOSAL_START = 0x1LL << 44; // Start Proposal
// TODO: _DEPRECATED suffix as part of vote removal - DEV-24856:
-const U64 GP_PROPOSAL_VOTE = 0x1LL << 45; // Vote on Proposal
+const U64 GP_PROPOSAL_VOTE = 0x1LL << 45; // Vote on Proposal
// Group chat moderation related
-const U64 GP_SESSION_JOIN = 0x1LL << 16; //can join session
-const U64 GP_SESSION_VOICE = 0x1LL << 27; //can hear/talk
-const U64 GP_SESSION_MODERATOR = 0x1LL << 37; //can mute people's session
+const U64 GP_SESSION_JOIN = 0x1LL << 16; //can join session
+const U64 GP_SESSION_VOICE = 0x1LL << 27; //can hear/talk
+const U64 GP_SESSION_MODERATOR = 0x1LL << 37; //can mute people's session
+
+// Group Banning
+const U64 GP_GROUP_BAN_ACCESS = 0x1LL << 51; // Allows access to ban / un-ban agents from a group.
const U64 GP_DEFAULT_MEMBER = GP_ACCOUNTING_ACCOUNTABLE
| GP_LAND_ALLOW_SET_HOME
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 3ebb64e3fa..bdc884885f 100755
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -56,7 +56,7 @@
<color
name="Black"
value="0 0 0 1" />
- <colork
+ <color
name="Black_10"
value="0 0 0 0.1" />
<color
@@ -904,5 +904,45 @@
<color
name="ResizebarBody"
value="0.208 0.208 0.208 1"/>
-
+
+ <!-- syntax highlighting (LSL Scripts) -->
+ <color
+ name="ScriptText"
+ reference="Black" />
+ <color
+ name="ScriptBackground"
+ reference="White" />
+ <color
+ name="ScriptCursorColor"
+ reference="Black" />
+ <color
+ name="SyntaxLslComment"
+ value="0 0.5 0 1" />
+ <color
+ name="SyntaxLslConstant"
+ value="0 0.6 0.6 1" />
+ <color
+ name="SyntaxLslControlFlow"
+ value="0.4 0 0.8 1" />
+ <color
+ name="SyntaxLslControlLabel"
+ value="0 0 0.8 1" />
+ <color
+ name="SyntaxLslDataType"
+ value="0.8 0.4 0 1" />
+ <color
+ name="SyntaxLslDeprecated"
+ value="0.9 0.0 0.66, 1" />
+ <color
+ name="SyntaxLslEvent"
+ value="0 0.3 0.5 1" />
+ <color
+ name="SyntaxLslFunction"
+ value="0.3 0 0.5 1" />
+ <color
+ name="SyntaxLslGodMode"
+ value="0.7 .2 .35 1" />
+ <color
+ name="SyntaxLslStringLiteral"
+ value="1 0.14 0 1" />
</colors>
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index ec733c1e8b..46698b3949 100755
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -245,7 +245,7 @@ with the same filename but different name
<texture name="Icon_Dock_Foreground" file_name="windows/Icon_Dock_Foreground.png" preload="true" />
<texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" />
- <texture name="Icon_For_Sale" file_name="icons/Icon_For_sale.png" preload="false" />
+ <texture name="Icon_For_Sale" file_name="icons/Icon_For_Sale.png" preload="false" />
<texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" />
<texture name="Icon_Gear_Foreground" file_name="windows/Icon_Gear_Foreground.png" preload="false" />
@@ -346,8 +346,8 @@ with the same filename but different name
<texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/>
<texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/>
- <texture name="MouseLook_View_Off" file_name="bottomtray/MouseLook_view_off.png" preload="false" />
- <texture name="MouseLook_View_On" file_name="bottomtray/MouseLook_view_on.png" preload="false" />
+ <texture name="MouseLook_View_Off" file_name="bottomtray/Mouselook_View_Off.png" preload="false" />
+ <texture name="MouseLook_View_On" file_name="bottomtray/Mouselook_View_On.png" preload="false" />
<texture name="Move_Fly_Off" file_name="bottomtray/Move_Fly_Off.png" preload="false" />
<texture name="Move_Run_Off" file_name="bottomtray/Move_Run_Off.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
index 0df330b016..6d48180707 100755
--- a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(Lokationer, billeder, web, søge historik)
</text>
- <check_box label="Vis dig selv i søgeresultater" name="online_searchresults"/>
+ <check_box label="Vis min profil info i søgeresultater" name="online_searchresults"/>
<check_box label="Kun venner og grupper ved jeg er online" name="online_visibility"/>
<check_box label="Kun venner og grupper kan sende besked til mig" name="voice_call_friends_only_check"/>
<check_box label="Slå mikrofon fra når opkald slutter" name="auto_disengage_mic_check"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index e21bed6bb5..afde50b981 100755
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(Standorte, Bilder, Web, Suchverlauf)
</text>
- <check_box label="In Suchergebnissen anzeigen" name="online_searchresults"/>
+ <check_box label="Zeigen Sie mein Profil Informationen in Suchergebnisse" name="online_searchresults"/>
<check_box label="Nur Freunde und Gruppen wissen, dass ich online bin" name="online_visibility"/>
<check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/>
<check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 9668cfa526..ef2f158a86 100755
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -72,7 +72,7 @@ Second Life is brought to you by the Lindens:
top_pad="10"
width="435"
word_wrap="true">
-Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
+Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase, Baker
</text_editor>
<text
follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_object.xml b/indra/newview/skins/default/xui/en/floater_buy_object.xml
index 5fdd4aa49d..49be4290c7 100755
--- a/indra/newview/skins/default/xui/en/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_object.xml
@@ -47,7 +47,7 @@
width="16" />
<scroll_list.columns
name="text"
- width="234" />
+ relative_width="1" />
</scroll_list>
<text
type="string"
@@ -77,7 +77,7 @@
width="16" />
<scroll_list.columns
name="text"
- width="234" />
+ relative_width="1" />
</scroll_list>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
deleted file mode 100755
index ff454e3ebf..0000000000
--- a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="180"
- layout="topleft"
- name="perm prefs"
- help_topic="perm_prefs"
- save_rect="true"
- title="DEFAULT UPLOAD PERMISSIONS"
- width="315">
- <panel
- follows="left|top|right|bottom"
- height="120"
- label="Permissions"
- layout="topleft"
- left="10"
- name="permissions"
- top="20"
- width="315">
- <check_box
- control_name="ShareWithGroup"
- height="16"
- label="Share with group"
- layout="topleft"
- left="10"
- name="share_with_group"
- top="5"
- width="150" />
- <check_box
- control_name="EveryoneCopy"
- height="16"
- label="Allow anyone to copy"
- layout="topleft"
- left_delta="0"
- name="everyone_copy"
- top_pad="5"
- width="150" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="0"
- name="NextOwnerLabel"
- top_pad="5"
- width="200">
- Next owner can:
- </text>
- <check_box
- control_name="NextOwnerModify"
- height="16"
- label="Modify"
- layout="topleft"
- left_delta="0"
- name="next_owner_modify"
- top_pad="5"
- width="150" />
- <check_box
- control_name="NextOwnerCopy"
- height="16"
- label="Copy"
- layout="topleft"
- left_delta="0"
- name="next_owner_copy"
- top_pad="5"
- width="150" >
- <check_box.commit_callback
- function="Perms.Copy" />
- </check_box>
- <check_box
- enabled_control="NextOwnerCopy"
- control_name="NextOwnerTransfer"
- enabled="false"
- height="16"
- initial_value="true"
- label="Resell/Give away"
- layout="topleft"
- left_delta="0"
- name="next_owner_transfer"
- top_pad="5"
- width="150" />
- </panel>
- <button
- height="20"
- label="OK"
- label_selected="OK"
- layout="topleft"
- left="90"
- name="ok"
- top="150"
- width="100">
- <button.commit_callback
- function="Perms.OK" />
- </button>
- <button
- height="20"
- label="Cancel"
- label_selected="Cancel"
- layout="topleft"
- left_pad="5"
- name="cancel"
- top_delta="0"
- width="100">
- <button.commit_callback
- function="Perms.Cancel" />
- </button>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_perms_default.xml b/indra/newview/skins/default/xui/en/floater_perms_default.xml
new file mode 100644
index 0000000000..ceb260fffb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_perms_default.xml
@@ -0,0 +1,503 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="250"
+ layout="topleft"
+ name="perms default"
+ help_topic="perms_default"
+ save_rect="true"
+ title="DEFAULT CREATION PERMISSIONS"
+ width="700">
+ <panel
+ follows="left|top|right|bottom"
+ height="200"
+ label="Default Permissions"
+ layout="topleft"
+ left="10"
+ name="default permissions"
+ top="20"
+ width="690">
+ <view_border
+ bevel_style="none"
+ height="18"
+ top="8"
+ left="0"
+ width="430" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ halign="right"
+ layout="topleft"
+ left="0"
+ top="10"
+ width="115">
+ Next owner:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ halign="center"
+ layout="topleft"
+ left_pad="5"
+ top="10"
+ width="100">
+ Copy
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ halign="center"
+ layout="topleft"
+ left_pad="5"
+ top="10"
+ width="100">
+ Modify
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ halign="center"
+ layout="topleft"
+ left_pad="5"
+ top="10"
+ width="100">
+ Transfer
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="32"
+ halign="center"
+ layout="topleft"
+ left_pad="5"
+ top="10"
+ word_wrap="true"
+ width="100">
+ Share with group
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="32"
+ halign="center"
+ layout="topleft"
+ left_pad="5"
+ top="10"
+ word_wrap="true"
+ width="120">
+ Allow anyone to copy
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="0"
+ top_pad="10"
+ tool_tip="Set default permissions for when Objects are created"
+ width="100">
+ Objects
+ </text>
+ <icon
+ follows="left|top"
+ height="16"
+ image_name="Inv_Object"
+ layout="topleft"
+ left_pad="2"
+ width="18"/>
+ <check_box
+ control_name="ObjectsNextOwnerCopy"
+ height="16"
+ layout="topleft"
+ name="objects_c"
+ left_pad="45"
+ top_delta="0"
+ width="100">
+ <check_box.commit_callback
+ function="PermsDefault.Copy"
+ parameter="Objects" />
+ </check_box>
+ <check_box
+ control_name="ObjectsNextOwnerModify"
+ height="16"
+ layout="topleft"
+ name="objects_m"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ enabled_control="ObjectsNextOwnerCopy"
+ control_name="ObjectsNextOwnerTransfer"
+ height="16"
+ layout="topleft"
+ name="objects_t"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ control_name="ObjectsShareWithGroup"
+ height="16"
+ layout="topleft"
+ name="objects_s"
+ left_pad="0"
+ top_delta="0"
+ width="120" />
+ <check_box
+ control_name="ObjectsEveryoneCopy"
+ height="16"
+ layout="topleft"
+ name="objects_e"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="0"
+ tool_tip="Set default permissions for uploaded items"
+ width="100">
+ Uploads
+ </text>
+ <icon
+ follows="left|top"
+ height="16"
+ image_name="Inv_Texture"
+ layout="topleft"
+ left_pad="2"
+ width="18"/>
+ <check_box
+ control_name="UploadsNextOwnerCopy"
+ height="16"
+ layout="topleft"
+ name="uploads_c"
+ left_pad="45"
+ top_delta="0"
+ width="100">
+ <check_box.commit_callback
+ function="PermsDefault.Copy"
+ parameter="Uploads" />
+ </check_box>
+ <check_box
+ control_name="UploadsNextOwnerModify"
+ height="16"
+ layout="topleft"
+ name="uploads_m"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ enabled_control="UploadsNextOwnerCopy"
+ control_name="UploadsNextOwnerTransfer"
+ height="16"
+ layout="topleft"
+ name="uploads_t"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ control_name="UploadsShareWithGroup"
+ height="16"
+ layout="topleft"
+ name="uploads_s"
+ left_pad="0"
+ top_delta="0"
+ width="120" />
+ <check_box
+ control_name="UploadsEveryoneCopy"
+ height="16"
+ layout="topleft"
+ name="uploads_e"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="0"
+ tool_tip="Set default permissions for when Scripts are created"
+ width="100">
+ Scripts
+ </text>
+ <icon
+ follows="left|top"
+ height="16"
+ image_name="Inv_Script"
+ layout="topleft"
+ left_pad="2"
+ width="18"/>
+ <check_box
+ control_name="ScriptsNextOwnerCopy"
+ height="16"
+ layout="topleft"
+ name="scripts_c"
+ left_pad="45"
+ top_delta="0"
+ width="100">
+ <check_box.commit_callback
+ function="PermsDefault.Copy"
+ parameter="Scripts" />
+ </check_box>
+ <check_box
+ control_name="ScriptsNextOwnerModify"
+ height="16"
+ layout="topleft"
+ name="scripts_m"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ enabled_control="ScriptsNextOwnerCopy"
+ control_name="ScriptsNextOwnerTransfer"
+ height="16"
+ layout="topleft"
+ name="scripts_t"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ control_name="ScriptsShareWithGroup"
+ height="16"
+ layout="topleft"
+ name="scripts_s"
+ left_pad="0"
+ top_delta="0"
+ width="120" />
+ <check_box
+ control_name="ScriptsEveryoneCopy"
+ height="16"
+ layout="topleft"
+ name="scripts_e"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="0"
+ tool_tip="Set default permissions for when Notecards are created"
+ width="100">
+ Notecards
+ </text>
+ <icon
+ follows="left|top"
+ height="16"
+ image_name="Inv_Notecard"
+ layout="topleft"
+ left_pad="2"
+ width="18"/>
+ <check_box
+ control_name="NotecardsNextOwnerCopy"
+ height="16"
+ layout="topleft"
+ name="notecards_c"
+ left_pad="45"
+ top_delta="0"
+ width="100">
+ <check_box.commit_callback
+ function="PermsDefault.Copy"
+ parameter="Notecards" />
+ </check_box>
+ <check_box
+ control_name="NotecardsNextOwnerModify"
+ height="16"
+ layout="topleft"
+ name="notecards_m"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ enabled_control="NotecardsNextOwnerCopy"
+ control_name="NotecardsNextOwnerTransfer"
+ height="16"
+ layout="topleft"
+ name="notecards_t"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ control_name="NotecardsShareWithGroup"
+ height="16"
+ layout="topleft"
+ name="notecards_s"
+ left_pad="0"
+ top_delta="0"
+ width="120" />
+ <check_box
+ control_name="NotecardsEveryoneCopy"
+ height="16"
+ layout="topleft"
+ name="notecards_e"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="0"
+ tool_tip="Set default permissions for when Gestures are created"
+ width="100">
+ Gestures
+ </text>
+ <icon
+ follows="left|top"
+ height="16"
+ image_name="Inv_Gesture"
+ layout="topleft"
+ left_pad="2"
+ width="18"/>
+ <check_box
+ control_name="GesturesNextOwnerCopy"
+ height="16"
+ layout="topleft"
+ name="gestures_c"
+ left_pad="45"
+ top_delta="0"
+ width="100">
+ <check_box.commit_callback
+ function="PermsDefault.Copy"
+ parameter="Gestures" />
+ </check_box>
+ <check_box
+ control_name="GesturesNextOwnerModify"
+ height="16"
+ layout="topleft"
+ name="gestures_m"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ enabled_control="GesturesNextOwnerCopy"
+ control_name="GesturesNextOwnerTransfer"
+ height="16"
+ layout="topleft"
+ name="gestures_t"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ control_name="GesturesShareWithGroup"
+ height="16"
+ layout="topleft"
+ name="gestures_s"
+ left_pad="0"
+ top_delta="0"
+ width="120" />
+ <check_box
+ control_name="GesturesEveryoneCopy"
+ height="16"
+ layout="topleft"
+ name="gestures_a"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="0"
+ tool_tip="Set default permissions for when Clothing or Body Parts are created"
+ width="100">
+ Wearables
+ </text>
+ <icon
+ follows="left|top"
+ height="16"
+ image_name="Inv_BodyShape"
+ layout="topleft"
+ left_pad="2"
+ width="18"/>
+ <check_box
+ control_name="WearablesNextOwnerCopy"
+ height="16"
+ layout="topleft"
+ name="wearables_c"
+ left_pad="45"
+ top_delta="0"
+ width="100">
+ <check_box.commit_callback
+ function="PermsDefault.Copy"
+ parameter="Wearables" />
+ </check_box>
+ <check_box
+ control_name="WearablesNextOwnerModify"
+ height="16"
+ layout="topleft"
+ name="wearables_m"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ enabled_control="WearablesNextOwnerCopy"
+ control_name="WearablesNextOwnerTransfer"
+ height="16"
+ layout="topleft"
+ name="wearables_t"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ <check_box
+ control_name="WearablesShareWithGroup"
+ height="16"
+ layout="topleft"
+ name="wearables_s"
+ left_pad="0"
+ top_delta="0"
+ width="120" />
+ <check_box
+ control_name="WearablesEveryoneCopy"
+ height="16"
+ layout="topleft"
+ name="wearables_e"
+ left_pad="0"
+ top_delta="0"
+ width="100" />
+ </panel>
+ <button
+ height="20"
+ label="OK"
+ label_selected="OK"
+ layout="topleft"
+ name="ok"
+ left="475"
+ width="100">
+ <button.commit_callback
+ function="PermsDefault.OK" />
+ </button>
+ <button
+ height="20"
+ label="Cancel"
+ label_selected="Cancel"
+ layout="topleft"
+ left_pad="5"
+ name="cancel"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="PermsDefault.Cancel" />
+ </button>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
index 99b812a880..11172d8a3e 100755
--- a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
@@ -21,7 +21,6 @@
layout="topleft"
max_length="65536"
name="region_debug_console_output"
- show_line_numbers="false"
word_wrap="true"
track_end="true"
read_only="true">
diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
index 9561f67941..c50c8c02fe 100755
--- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
@@ -203,47 +203,15 @@
<combo_box.item
label="Age &gt; Age play"
name="Age__Age_play"
- value="31" />
+ value="31" />
<combo_box.item
- label="Age &gt; Adult Resident on Teen Second Life"
- name="Age__Adult_resident_on_Teen_Second_Life"
- value="32" />
- <combo_box.item
- label="Age &gt; Underage Resident outside of Teen Second Life"
- name="Age__Underage_resident_outside_of_Teen_Second_Life"
- value="33" />
- <combo_box.item
- label="Assault &gt; Combat sandbox / unsafe area"
- name="Assault__Combat_sandbox___unsafe_area"
- value="34" />
- <combo_box.item
- label="Assault &gt; Safe area"
+ label="Assault &gt; Shooting, pushing, or shoving another Resident in a Safe Area"
name="Assault__Safe_area"
- value="35" />
- <combo_box.item
- label="Assault &gt; Weapons testing sandbox"
- name="Assault__Weapons_testing_sandbox"
- value="36" />
- <combo_box.item
- label="Commerce &gt; Failure to deliver product or service"
- name="Commerce__Failure_to_deliver_product_or_service"
- value="38" />
+ value="35" />
<combo_box.item
label="Disclosure &gt; Real world information"
name="Disclosure__Real_world_information"
- value="39" />
- <combo_box.item
- label="Disclosure &gt; Remotely monitoring chat"
- name="Disclosure__Remotely_monitoring chat"
- value="40" />
- <combo_box.item
- label="Disclosure &gt; Second Life information/chat/IMs"
- name="Disclosure__Second_Life_information_chat_IMs"
- value="41" />
- <combo_box.item
- label="Disturbing the peace &gt; Unfair use of region resources"
- name="Disturbing_the_peace__Unfair_use_of_region_resources"
- value="42" />
+ value="39" />
<combo_box.item
label="Disturbing the peace &gt; Excessive scripted objects"
name="Disturbing_the_peace__Excessive_scripted_objects"
@@ -255,51 +223,15 @@
<combo_box.item
label="Disturbing the peace &gt; Repetitive spam"
name="Disturbing_the_peace__Repetitive_spam"
- value="45" />
- <combo_box.item
- label="Disturbing the peace &gt; Unwanted advert spam"
- name="Disturbing_the_peace__Unwanted_advert_spam"
- value="46" />
- <combo_box.item
- label="Fraud &gt; L$"
- name="Fraud__L$"
- value="47" />
- <combo_box.item
- label="Fraud &gt; Land"
- name="Fraud__Land"
- value="48" />
- <combo_box.item
- label="Fraud &gt; Pyramid scheme or chain letter"
- name="Fraud__Pyramid_scheme_or_chain_letter"
- value="49" />
+ value="45" />
<combo_box.item
- label="Fraud &gt; US$"
+ label="Fraud &gt; L$ or USD $"
name="Fraud__US$"
- value="50" />
+ value="50" />
<combo_box.item
- label="Harassment &gt; Advert farms / visual spam"
- name="Harassment__Advert_farms___visual_spam"
- value="51" />
- <combo_box.item
- label="Harassment &gt; Defaming individuals or groups"
- name="Harassment__Defaming_individuals_or_groups"
- value="52" />
- <combo_box.item
- label="Harassment &gt; Impeding movement"
- name="Harassment__Impeding_movement"
- value="53" />
- <combo_box.item
- label="Harassment &gt; Sexual harassment"
- name="Harassment__Sexual_harassment"
- value="54" />
- <combo_box.item
- label="Harassment &gt; Solicting/inciting others to violate ToS"
+ label="Harassment &gt; Targeted behavior intended to disrupt"
name="Harassment__Solicting_inciting_others_to_violate_ToS"
- value="55" />
- <combo_box.item
- label="Harassment &gt; Verbal abuse"
- name="Harassment__Verbal_abuse"
- value="56" />
+ value="55" />
<combo_box.item
label="Indecency &gt; Broadly offensive content or conduct"
name="Indecency__Broadly_offensive_content_or_conduct"
@@ -309,49 +241,21 @@
name="Indecency__Inappropriate_avatar_name"
value="59" />
<combo_box.item
- label="Indecency &gt; Inappropriate content or conduct in a PG region"
+ label="Indecency &gt; Inappropriate content or conduct for Region Rating"
name="Indecency__Mature_content_in_PG_region"
- value="60" />
- <combo_box.item
- label="Indecency &gt; Inappropriate content or conduct in a Moderate region"
- name="Indecency__Inappropriate_content_in_Mature_region"
- value="69" />
- <combo_box.item
- label="Intellectual property infringement &gt; Content Removal"
- name="Intellectual_property_infringement_Content_Removal"
- value="66" />
- <combo_box.item
- label="Intellectual property infringement &gt; CopyBot or Permissions Exploit"
- name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"
- value="37" />
+ value="60" />
<combo_box.item
label="Intolerance"
name="Intolerance"
- value="61" />
- <combo_box.item
- label="Land &gt; Abuse of sandbox resources"
- name="Land__Abuse_of_sandbox_resources"
- value="62" />
+ value="61" />
<combo_box.item
- label="Land &gt; Encroachment &gt; Objects/textures"
+ label="Land &gt; Encroachment &gt; Objects or textures"
name="Land__Encroachment__Objects_textures"
- value="63" />
+ value="63" />
<combo_box.item
- label="Land &gt; Encroachment &gt; Particles"
- name="Land__Encroachment__Particles"
- value="64" />
- <combo_box.item
- label="Land &gt; Encroachment &gt; Trees/plants"
- name="Land__Encroachment__Trees_plants"
- value="65" />
- <combo_box.item
- label="Wagering/gambling"
+ label="Wagering or Gambling"
name="Wagering_gambling"
- value="67" />
- <combo_box.item
- label="Other"
- name="Other"
- value="68" />
+ value="67" />
</combo_box>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_script_ed_prefs.xml b/indra/newview/skins/default/xui/en/floater_script_ed_prefs.xml
new file mode 100644
index 0000000000..8e4bcb3eb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_script_ed_prefs.xml
@@ -0,0 +1,359 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="false"
+ height="354"
+ layout="topleft"
+ name="floater_script_colors"
+ help_topic="script_colors"
+ save_rect="true"
+ title="SCRIPT COLORS"
+ width="320">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="12"
+ name="color_pickers_label"
+ top="30"
+ width="200">
+ Choose desired colors:
+ </text>
+
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="15"
+ name="text"
+ top="45"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="ScriptText" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="ScriptText" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_label"
+ top_delta="5"
+ width="100">
+ Text
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="15"
+ name="cursor"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="ScriptCursorColor" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="ScriptCursorColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="cursor_label"
+ top_delta="5"
+ width="100">
+ Cursor
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="15"
+ name="background"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="ScriptBackground" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="ScriptBackground" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="background_label"
+ top_delta="5"
+ width="100">
+ Background
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="15"
+ name="datatype"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="SyntaxLslDataType" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="SyntaxLslDataType" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="datatype_label"
+ top_delta="5"
+ width="100">
+ Data Types
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="15"
+ name="event"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="SyntaxLslEvent" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="SyntaxLslEvent" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="event_label"
+ top_delta="5"
+ width="100">
+ Events
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="190"
+ name="string_literal"
+ top="45"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="SyntaxLslStringLiteral" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="SyntaxLslStringLiteral" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="string_literal_label"
+ top_delta="5"
+ width="100">
+ String Literals
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="190"
+ name="constant"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="SyntaxLslConstant" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="SyntaxLslConstant" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="constant_label"
+ top_delta="5"
+ width="100">
+ Constant
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="190"
+ name="flow_control"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="SyntaxLslControlFlow" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="SyntaxLslControlFlow" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="flow_control_label"
+ top_delta="5"
+ width="100">
+ Flow Control
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="190"
+ name="function"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="SyntaxLslFunction" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="SyntaxLslFunction" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="function_label"
+ top_delta="5"
+ width="100">
+ Function
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="190"
+ name="comment"
+ top_pad="10"
+ width="44" >
+ <color_swatch.init_callback
+ function="ScriptPref.getUIColor"
+ parameter="SyntaxLslComment" />
+ <color_swatch.commit_callback
+ function="ScriptPref.applyUIColor"
+ parameter="SyntaxLslComment" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="comment_label"
+ top_delta="5"
+ width="100">
+ Comment
+ </text>
+
+ <script_editor
+ left="8"
+ right="-8"
+ top="176"
+ bottom="-8"
+ type="string"
+ length="1"
+ follows="left|top|right|bottom"
+ font="Monospace"
+ height="100"
+ ignore_tab="false"
+ layout="topleft"
+ max_length="300"
+ name="Script Preview"
+ text_color="ScriptText"
+ default_color="ScriptText"
+ bg_writeable_color="ScriptBackground"
+ bg_focus_color="ScriptBackground"
+ text_readonly_color="ScriptText"
+ bg_readonly_color="ScriptBackground"
+ bg_selected_color="ScriptSelectedColor"
+ cursor_color="ScriptCursorColor"
+ enable_tooltip_paste="true"
+ word_wrap="true">
+/* A sample script */
+default
+{
+ state_entry()
+ {
+ // Comment
+ string greeting = "Hello";
+ llSay(PUBLIC_CHANNEL, greeting);
+ }
+}
+ </script_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 8b9733df17..3c28233875 100755
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -150,7 +150,7 @@
parameter="Land" />
</button>
<text
- height="30"
+ height="20"
word_wrap="true"
use_ellipses="true"
type="string"
@@ -294,24 +294,14 @@
<check_box
control_name="ScaleUniform"
height="19"
- label=""
+ label="Stretch Both Sides"
layout="topleft"
left="143"
name="checkbox uniform"
top="48"
- width="20" />
- <text
- height="19"
- label="Stretch Both Sides"
- left_delta="20"
- name="checkbox uniform label"
- top_delta="2"
- width="120"
- layout="topleft"
- follows="top|left"
- wrap="true">
- Stretch Both Sides
- </text>
+ label_text.wrap="true"
+ label_text.width="100"
+ width="134" />
<check_box
control_name="ScaleStretchTextures"
height="19"
diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml
index 31b1d091ee..ed362b36e5 100755
--- a/indra/newview/skins/default/xui/en/menu_conversation.xml
+++ b/indra/newview/skins/default/xui/en/menu_conversation.xml
@@ -17,6 +17,7 @@
layout="topleft"
name="open_voice_conversation">
<on_click function="Avatar.DoToSelected" parameter="open_voice_conversation"/>
+ <on_enable function="Avatar.EnableItem" parameter="can_open_voice_conversation"/>
</menu_item_call>
<menu_item_call
label="Disconnect from voice"
@@ -213,4 +214,12 @@
<on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" />
</menu_item_call>
</context_menu>
+ <menu_item_separator layout="topleft" name="Group Ban Separator"/>
+ <menu_item_call
+ label="Ban member"
+ layout="topleft"
+ name="BanMember">
+ <on_click function="Avatar.DoToSelected" parameter="ban_member" />
+ <on_enable function="Avatar.EnableItem" parameter="can_ban_member" />
+ </menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
index 29720a680b..afeb1bf226 100755
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -63,13 +63,6 @@
function="File.UploadBulk"
parameter="" />
</menu_item_call>
- <menu_item_call
- label="Set Default Upload Permissions"
- name="perm prefs">
- <menu_item_call.on_click
- function="Floater.Toggle"
- parameter="perm_prefs" />
- </menu_item_call>
</menu>
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index 52ab7da515..5c98a98d3d 100755
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -130,17 +130,24 @@
function="Object.ReportAbuse" />
<menu_item_call.on_enable
function="Object.EnableReportAbuse" />
- </menu_item_call>
+ </menu_item_call>
<menu_item_call
- enabled="false"
- label="Block"
- name="Object Mute">
- <menu_item_call.on_click
+ label="Block"
+ name="Object Mute">
+ <menu_item_call.on_click
function="Object.Mute" />
- <menu_item_call.on_enable
+ <menu_item_call.on_visible
function="Object.EnableMute" />
</menu_item_call>
<menu_item_call
+ label="Unblock"
+ name="Object Unmute">
+ <menu_item_call.on_click
+ function="Object.Mute" />
+ <menu_item_call.on_visible
+ function="Object.EnableUnmute" />
+ </menu_item_call>
+ <menu_item_call
enabled="false"
label="Return"
name="Return...">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 65b80ff622..c8fcda9858 100755
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1216,8 +1216,9 @@
<menu_item_call.on_enable
function="SomethingSelected" />
</menu_item_call>
+ <menu_item_separator/>
<menu_item_call
- label="Grid Options"
+ label="Grid Options..."
name="Grid Options"
shortcut="control|shift|B">
<menu_item_call.on_click
@@ -1226,6 +1227,13 @@
<menu_item_call.on_enable
function="Tools.EnableToolNotPie" />
</menu_item_call>
+ <menu_item_call
+ label="Set Default Permissions..."
+ name="Set default permissions">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="perms_default" />
+ </menu_item_call>
</menu>
<menu
create_jump_keys="true"
@@ -1293,13 +1301,6 @@
function="File.UploadBulk"
parameter="" />
</menu_item_call>
- <menu_item_call
- label="Set Default Upload Permissions"
- name="perm prefs">
- <menu_item_call.on_click
- function="Floater.Toggle"
- parameter="perm_prefs" />
- </menu_item_call>
</menu>
<menu_item_separator/>
<menu_item_call
@@ -2607,6 +2608,16 @@
parameter="lights" />
</menu_item_check>
<menu_item_check
+ label="Particles"
+ name="Particles">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="particles" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="particles" />
+ </menu_item_check>
+ <menu_item_check
label="Collision Skeleton"
name="Collision Skeleton">
<menu_item_check.on_check
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index bea291da91..772d81c448 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -506,7 +506,35 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
notext="No"
yestext="Yes"/>
</notification>
-
+
+ <notification
+ icon="alertmodal.tga"
+ name="AssignBanAbilityWarning"
+ type="alertmodal">
+You are about to add the Ability &apos;[ACTION_NAME]&apos; to the Role &apos;[ROLE_NAME]&apos;.
+
+ *WARNING*
+Any Member in a Role with this Ability will also be granted the Abilities &apos;[ACTION_NAME_2]&apos; and &apos;[ACTION_NAME_3]&apos;
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RemoveBanAbilityWarning"
+ type="alertmodal">
+You are removing the Ability &apos;[ACTION_NAME]&apos; to the Role &apos;[ROLE_NAME]&apos;.
+
+ *WARNING*
+Removing this ability will NOT remove the Abilities &apos;[ACTION_NAME_2]&apos; and &apos;[ACTION_NAME_3]&apos;.
+
+If you no longer wish to have these abilities granted to this role, disable them immediately!
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
<notification
icon="alertmodal.tga"
name="EjectGroupMemberWarning"
@@ -3747,6 +3775,28 @@ Leave Group?
</notification>
<notification
+ icon="aler.tga"
+ name="GroupDepartError"
+ type="alert">
+Unable to leave group: [reason].
+ <tag>reason</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alert.tga"
+ name="GroupDepart"
+ type="alert">
+You have left the group [group_name].
+ <tag>group_name</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
icon="alert.tga"
name="ConfirmKick"
type="alert">
@@ -10250,6 +10300,17 @@ Cannot create large prims that intersect other players. Please re-try when othe
name="okignore"
yestext="OK"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="DefaultObjectPermissions"
+ type="alert">
+ There was a problem saving the default permissions due to the following reason: [REASON]. Please try setting the default permissions later.
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
<notification
icon="alert.tga"
diff --git a/indra/newview/skins/default/xui/en/panel_group_bulk_ban.xml b/indra/newview/skins/default/xui/en/panel_group_bulk_ban.xml
new file mode 100644
index 0000000000..509dcf354e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_group_bulk_ban.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="330"
+ label="Ban Residents"
+ layout="topleft"
+ left="0"
+ name="bulk_ban_panel"
+ top="330"
+ width="210">
+ <panel.string
+ name="loading">
+ (loading...)
+ </panel.string>
+ <panel.string
+ name="ban_selection_too_large">
+ Group bans not sent: too many Residents selected. Group bans are limited to 100 per request.
+ </panel.string>
+ <panel.string
+ name="ban_not_permitted">
+ Group ban not sent: you do not have 'Manage ban list' ability.
+ </panel.string>
+ <panel.string
+ name="ban_limit_fail">
+ Group ban not sent: your group have reached limit of allowed ban records.
+ </panel.string>
+ <panel.string
+ name="partial_ban">
+ Some group bans were not sent:
+[REASONS]
+ </panel.string>
+ <panel.string
+ name="ban_failed">
+ Group bans were not sent:
+[REASONS]
+ </panel.string>
+ <panel.string
+ name="residents_already_banned">
+ - The following resident(s) are already banned: [RESIDENTS].
+ </panel.string>
+ <panel.string
+ name="ban_limit_reached">
+ - Ban limit reached, following agents not banned: [RESIDENTS].
+ </panel.string>
+ <panel.string
+ name="cant_ban_yourself">
+ - You cannot ban yourself from a group.
+ </panel.string>
+ <text
+ type="string"
+ length="1"
+ height="54"
+ layout="topleft"
+ left="7"
+ name="help_text"
+ top="28"
+ word_wrap="true"
+ width="200">
+ You can select multiple Residents to ban from your group. Click &apos;Open Resident Chooser&apos; to start.
+ </text>
+ <button
+ height="20"
+ label="Open Resident Chooser"
+ layout="topleft"
+ left_delta="-2"
+ name="add_button"
+ top_delta="44"
+ width="200" />
+ <name_list
+ allow_calling_card_drop="true"
+ column_padding="0"
+ height="174"
+ layout="topleft"
+ left_delta="0"
+ multi_select="true"
+ name="banned_agent_list"
+ tool_tip="Hold the Ctrl key and click Resident names to multi-select"
+ top_pad="4"
+ width="200" />
+ <button
+ height="20"
+ label="Remove Selected from List"
+ layout="topleft"
+ left_delta="0"
+ name="remove_button"
+ tool_tip="Removes the Residents selected above from the ban list"
+ top_pad="4"
+ width="200" />
+ <button
+ height="20"
+ label="Ban Residents"
+ layout="topleft"
+ left="4"
+ name="ban_button"
+ top_delta="30"
+ width="135" />
+ <button
+ height="20"
+ label="Cancel"
+ layout="topleft"
+ left_pad="2"
+ name="cancel_button"
+ top_delta="0"
+ width="65" />
+ <string
+ name="GroupBulkBan">
+ Group Ban
+ </string>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_invite.xml b/indra/newview/skins/default/xui/en/panel_group_invite.xml
index 124c0596c3..ebb460deb0 100755
--- a/indra/newview/skins/default/xui/en/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml
@@ -76,7 +76,7 @@
Choose what Role to assign them to:
</text>
<combo_box
- height="16"
+ height="20"
layout="topleft"
left_delta="0"
name="role_name"
@@ -88,7 +88,7 @@
label="Send Invitations"
layout="topleft"
left="4"
- name="ok_button"
+ name="invite_button"
top="356"
width="135" />
<button
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 9ac5b8800e..dac4371a38 100755
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -118,6 +118,13 @@ clicking on their names.
left_pad="10"
name="member_eject"
width="100" />
+ <button
+ height="23"
+ label="Ban Member(s)"
+ follows="top|left"
+ left_pad="10"
+ name="member_ban"
+ width="100" />
</panel>
<panel
border="false"
@@ -138,454 +145,535 @@ clicking on their names.
right="-5"
name="show_all_button"
width="100" />-->
- <panel.string
- name="help_text">
- Roles have a title and an allowed list of Abilities
-that Members can perform. Members can belong to
-one or more Roles. A group can have up to 10 Roles,
-including the Everyone and Owner Roles.
- </panel.string>
- <panel.string
- name="cant_delete_role">
- The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
- </panel.string>
- <panel.string
- name="power_folder_icon" translate="false">
- Inv_FolderClosed
- </panel.string>
- <panel.string
- name="power_all_have_icon" translate="false">
- Checkbox_On
- </panel.string>
- <panel.string
- name="power_partial_icon" translate="false">
- Checkbox_Off
- </panel.string>
- <filter_editor
- layout="topleft"
- top="5"
- left="5"
- right="-5"
- height="22"
- search_button_visible="false"
- follows="left|top|right"
- label="Filter Roles"
- name="filter_input" />
- <scroll_list
- column_padding="0"
- draw_heading="true"
- draw_stripes="false"
- heading_height="23"
- height="132"
- layout="topleft"
- search_column="1"
- left="0"
- follows="left|top|right"
- right="-1"
- name="role_list"
- top_pad="2"
- width="310">
- <scroll_list.columns
- label="Role"
- name="name"
- relative_width="0.45" />
- <scroll_list.columns
- label="Title"
- name="title"
- relative_width="0.45" />
- <scroll_list.columns
- label="#"
- name="members"
- relative_width="0.15" />
- </scroll_list>
- <button
- follows="top|left"
- height="23"
- label="New Role"
- layout="topleft"
- left="0"
- name="role_create"
- width="120" />
- <button
- height="23"
- follows="top|left"
- label="Delete Role"
- layout="topleft"
- left_pad="10"
- name="role_delete"
- width="120" />
- </panel>
- <panel
- border="false"
- height="303"
- label="ABILITIES"
- layout="topleft"
- left="0"
- right="-1"
- help_topic="roles_actions_tab"
- name="actions_sub_tab"
- class="panel_group_actions_subtab"
- tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability."
- width="310">
- <panel.string
- name="help_text">
- Abilities allow Members in Roles to do specific
-things in this group. There&apos;s a broad variety of Abilities.
- </panel.string>
- <panel.string
- name="power_folder_icon" translate="false">
- Inv_FolderClosed
- </panel.string>
- <panel.string
- name="power_all_have_icon" translate="false">
- Checkbox_On
- </panel.string>
- <panel.string
- name="power_partial_icon" translate="false">
- Checkbox_Off
- </panel.string>
- <filter_editor
- layout="topleft"
- top="5"
- left="5"
- right="-5"
- height="22"
- search_button_visible="false"
- follows="left|top|right"
- label="Filter Abilities"
- name="filter_input" />
- <scroll_list
- column_padding="0"
- draw_stripes="true"
- height="200"
- follows="left|top|right"
- layout="topleft"
- left="0"
- right="-1"
- name="action_list"
- search_column="2"
- tool_tip="Select an Ability to view more details"
- top_pad="5"
- width="300">
- <scroll_list.columns
- label=""
- name="icon"
- width="2" />
- <scroll_list.columns
- label=""
- name="checkbox"
- width="20" />
- <scroll_list.columns
- label=""
- name="action"
- width="270" />
- </scroll_list>
- </panel>
- </tab_container>
+ <panel.string
+ name="help_text">
+ Roles have a title and an allowed list of Abilities
+ that Members can perform. Members can belong to
+ one or more Roles. A group can have up to 10 Roles,
+ including the Everyone and Owner Roles.
+ </panel.string>
+ <panel.string
+ name="cant_delete_role">
+ The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
+ </panel.string>
+ <panel.string
+ name="power_folder_icon" translate="false">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string
+ name="power_all_have_icon" translate="false">
+ Checkbox_On
+ </panel.string>
+ <panel.string
+ name="power_partial_icon" translate="false">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor
+ layout="topleft"
+ top="5"
+ left="5"
+ right="-5"
+ height="22"
+ search_button_visible="false"
+ follows="left|top|right"
+ label="Filter Roles"
+ name="filter_input" />
+ <scroll_list
+ column_padding="0"
+ draw_heading="true"
+ draw_stripes="false"
+ heading_height="23"
+ height="132"
+ layout="topleft"
+ search_column="1"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ name="role_list"
+ top_pad="2"
+ width="310">
+ <scroll_list.columns
+ label="Role"
+ name="name"
+ relative_width="0.45" />
+ <scroll_list.columns
+ label="Title"
+ name="title"
+ relative_width="0.45" />
+ <scroll_list.columns
+ label="#"
+ name="members"
+ relative_width="0.15" />
+ </scroll_list>
+ <button
+ follows="top|left"
+ height="23"
+ label="New Role"
+ layout="topleft"
+ left="0"
+ name="role_create"
+ width="120" />
+ <button
+ height="23"
+ follows="top|left"
+ label="Delete Role"
+ layout="topleft"
+ left_pad="10"
+ name="role_delete"
+ width="120" />
+ </panel>
<panel
- height="350"
- background_visible="false"
- bg_alpha_color="FloaterUnfocusBorderColor"
+ border="false"
+ height="303"
+ label="ABILITIES"
layout="topleft"
- follows="top|left|right"
left="0"
right="-1"
- width="313"
- mouse_opaque="false"
- name="members_footer"
- top="325"
- visible="false">
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- top="8"
- text_color="EmphasisColor"
- name="static"
- width="300">
- Assigned Roles
- </text>
- <scroll_list
- draw_stripes="true"
- follows="left|top|right"
- height="150"
- layout="topleft"
- left="0"
- right="-1"
- name="member_assigned_roles"
- top_pad="0">
- <scroll_list.columns
- label=""
- name="checkbox"
- width="20" />
- <scroll_list.columns
- label=""
- name="role"
- width="270" />
- </scroll_list>
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- top_pad="5"
- text_color="EmphasisColor"
- name="static2"
- width="285">
- Allowed Abilities
- </text>
- <scroll_list
- draw_stripes="true"
- follows="left|top|right"
- height="150"
- layout="topleft"
- left="0"
- right="-1"
- name="member_allowed_actions"
- search_column="2"
- tool_tip="For details of each allowed ability see the abilities tab"
- top_pad="0">
- <scroll_list.columns
- label=""
- name="icon"
- width="2" />
- <scroll_list.columns
- label=""
- name="checkbox"
- width="20" />
- <scroll_list.columns
- label=""
- name="action"
- width="270" />
- </scroll_list>
+ help_topic="roles_actions_tab"
+ name="actions_sub_tab"
+ class="panel_group_actions_subtab"
+ tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability."
+ width="310">
+ <panel.string
+ name="help_text">
+ Abilities allow Members in Roles to do specific
+ things in this group. There&apos;s a broad variety of Abilities.
+ </panel.string>
+ <panel.string
+ name="power_folder_icon" translate="false">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string
+ name="power_all_have_icon" translate="false">
+ Checkbox_On
+ </panel.string>
+ <panel.string
+ name="power_partial_icon" translate="false">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor
+ layout="topleft"
+ top="5"
+ left="5"
+ right="-5"
+ height="22"
+ search_button_visible="false"
+ follows="left|top|right"
+ label="Filter Abilities"
+ name="filter_input" />
+ <scroll_list
+ column_padding="0"
+ draw_stripes="true"
+ height="200"
+ follows="left|top|right"
+ layout="topleft"
+ left="0"
+ right="-1"
+ name="action_list"
+ search_column="2"
+ tool_tip="Select an Ability to view more details"
+ top_pad="5"
+ width="300">
+ <scroll_list.columns
+ label=""
+ name="icon"
+ width="2" />
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
+ <scroll_list.columns
+ label=""
+ name="action"
+ width="270" />
+ </scroll_list>
</panel>
<panel
- height="550"
- background_visible="false"
- bg_alpha_color="FloaterUnfocusBorderColor"
+ border="false"
+ height="303"
+ label="BANNED RESIDENTS"
layout="topleft"
- follows="top|left|right"
left="0"
right="-1"
- width="313"
- mouse_opaque="false"
- name="roles_footer"
- top_delta="0"
- top="209"
- visible="false">
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- top="5"
- name="static"
- width="300">
- Role Name
- </text>
- <line_editor
- type="string"
- height="20"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- max_length_bytes="20"
- name="role_name"
- top_pad="0"
- width="300">
- </line_editor>
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- name="static3"
- top_pad="5"
- width="300">
- Role Title
- </text>
- <line_editor
- type="string"
- height="20"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- max_length_bytes="20"
- name="role_title"
- top_pad="0"
- width="300">
- </line_editor>
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- name="static2"
- top_pad="5"
- width="200">
- Description
- </text>
- <text_editor
- type="string"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- max_length="295"
- height="35"
- name="role_description"
- top_pad="0"
- width="300"
- word_wrap="true">
- </text_editor>
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- text_color="EmphasisColor"
- name="static4"
- top_pad="5"
- width="300">
- Assigned Members
- </text>
- <name_list
- draw_stripes="true"
- height="128"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- name="role_assigned_members"
- top_pad="0"
- width="300" />
- <check_box
- height="15"
- label="Reveal members"
- left="5"
- layout="topleft"
- name="role_visible_in_list"
- tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."
- top_pad="4"
- width="300" />
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- text_color="EmphasisColor"
- name="static5"
- top_pad="2"
- width="300">
- Allowed Abilities
- </text>
- <scroll_list
- draw_stripes="true"
- height="140"
- layout="topleft"
- left="0"
- follows="left|top|right"
- right="-1"
- name="role_allowed_actions"
- search_column="2"
- tool_tip="For details of each allowed ability see the abilities tab"
- top_pad="0"
- width="300">
- <scroll_list.columns
- label=""
- name="icon"
- width="2" />
- <scroll_list.columns
- label=""
- name="checkbox"
- width="20" />
- <scroll_list.columns
- label=""
- name="action"
- width="270" />
- </scroll_list>
+ help_topic="roles_banlist_tab"
+ name="banlist_sub_tab"
+ class="panel_group_banlist_subtab"
+ tool_tip="View the banned residents from this group."
+ width="310">
+ <panel.string
+ name="help_text">
+ Any resident on the ban list will be unable to join the group.
+ </panel.string>
+ <panel.string
+ name="ban_count_template">
+ Ban count: [COUNT]/[LIMIT]
+ </panel.string>
+ <name_list
+ column_padding="0"
+ draw_heading="true"
+ height="400"
+ follows="left|top|right"
+ layout="topleft"
+ left="0"
+ right="-1"
+ multi_select="true"
+ name="ban_list"
+ short_names="false"
+ top_pad="5">
+ <name_list.columns
+ label="Resident"
+ name="name"
+ font.name="SANSSERIF_SMALL"
+ font.style="NORMAL"
+ relative_width="0.7" />
+ <name_list.columns
+ label="Date Banned"
+ name="ban_date"
+ relative_width="0.3" />
+ </name_list>
+ <button
+ follows="top|left"
+ height="23"
+ label="Ban Resident(s)"
+ layout="topleft"
+ left="3"
+ name="ban_create"
+ tool_tip="Ban residents from your group"
+ width="120" />
+ <button
+ follows="top|left"
+ height="23"
+ label="Remove Ban(s)"
+ layout="topleft"
+ left_pad="5"
+ name="ban_delete"
+ tool_tip="Unban selected residents from your group"
+ width="120" />
+ <button
+ follows="top|left"
+ height="23"
+ width="23"
+ image_overlay="Refresh_Off"
+ layout="topleft"
+ left_pad="5"
+ name="ban_refresh"
+ tool_tip="Refresh the ban list"
+ />
+ <text
+ type="string"
+ height="18"
+ left_pad="5"
+ follows="top|left"
+ layout="topleft"
+ name="ban_count"
+ width="100">
+ </text>
</panel>
- <panel
- height="424"
- background_visible="false"
- bg_alpha_color="FloaterUnfocusBorderColor"
+ </tab_container>
+ <panel
+ height="350"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
+ layout="topleft"
+ follows="top|left|right"
+ left="0"
+ right="-1"
+ width="313"
+ mouse_opaque="false"
+ name="members_footer"
+ top="325"
+ visible="false">
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ top="8"
+ text_color="EmphasisColor"
+ name="static"
+ width="300">
+ Assigned Roles
+ </text>
+ <scroll_list
+ draw_stripes="true"
+ follows="left|top|right"
+ height="150"
layout="topleft"
- follows="top|left|right"
left="0"
right="-1"
- width="313"
- mouse_opaque="false"
- name="actions_footer"
- top_delta="0"
- top="255"
- visible="false">
- <text_editor
- bg_readonly_color="Transparent"
- text_readonly_color="EmphasisColor"
- font="SansSerifSmall"
- type="string"
- enabled="false"
- halign="left"
- layout="topleft"
+ name="member_assigned_roles"
+ top_pad="0">
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
+ <scroll_list.columns
+ label=""
+ name="role"
+ width="270" />
+ </scroll_list>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ top_pad="5"
+ text_color="EmphasisColor"
+ name="static2"
+ width="285">
+ Allowed Abilities
+ </text>
+ <scroll_list
+ draw_stripes="true"
follows="left|top|right"
- left="0"
- right="-1"
- height="90"
- max_length="512"
- name="action_description"
- top="0"
- word_wrap="true">
- This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
- </text_editor>
- <text
+ height="150"
+ layout="topleft"
+ left="0"
+ right="-1"
+ name="member_allowed_actions"
+ search_column="2"
+ tool_tip="For details of each allowed ability see the abilities tab"
+ top_pad="0">
+ <scroll_list.columns
+ label=""
+ name="icon"
+ width="2" />
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
+ <scroll_list.columns
+ label=""
+ name="action"
+ width="270" />
+ </scroll_list>
+ </panel>
+ <panel
+ height="550"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
+ layout="topleft"
+ follows="top|left|right"
+ left="0"
+ right="-1"
+ width="313"
+ mouse_opaque="false"
+ name="roles_footer"
+ top_delta="0"
+ top="209"
+ visible="false">
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ top="5"
+ name="static"
+ width="300">
+ Role Name
+ </text>
+ <line_editor
+ type="string"
+ height="20"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ max_length_bytes="20"
+ name="role_name"
+ top_pad="0"
+ width="300">
+ </line_editor>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ name="static3"
+ top_pad="5"
+ width="300">
+ Role Title
+ </text>
+ <line_editor
+ type="string"
+ height="20"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ max_length_bytes="20"
+ name="role_title"
+ top_pad="0"
+ width="300">
+ </line_editor>
+ <text
type="string"
height="16"
layout="topleft"
follows="left|top"
left="5"
name="static2"
- top_pad="1"
- width="300">
- Roles with this ability
- </text>
- <scroll_list
- height="172"
- layout="topleft"
- follows="left|top|right"
- left="5"
- right="-1"
- name="action_roles"
- top_pad="0"
- width="300" />
- <text
- type="string"
- height="16"
- layout="topleft"
- follows="left|top"
- left="5"
- name="static3"
top_pad="5"
- width="300">
- Members with this ability
- </text>
- <name_list
- height="122"
- follows="left|top|right"
- layout="topleft"
- left="5"
- right="-1"
- name="action_members"
- top_pad="0"
- width="300" />
- </panel>
+ width="200">
+ Description
+ </text>
+ <text_editor
+ type="string"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ max_length="295"
+ height="35"
+ name="role_description"
+ top_pad="0"
+ width="300"
+ word_wrap="true">
+ </text_editor>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ text_color="EmphasisColor"
+ name="static4"
+ top_pad="5"
+ width="300">
+ Assigned Members
+ </text>
+ <name_list
+ draw_stripes="true"
+ height="128"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ name="role_assigned_members"
+ top_pad="0"
+ width="300" />
+ <check_box
+ height="15"
+ label="Reveal members"
+ left="5"
+ layout="topleft"
+ name="role_visible_in_list"
+ tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."
+ top_pad="4"
+ width="300" />
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ text_color="EmphasisColor"
+ name="static5"
+ top_pad="2"
+ width="300">
+ Allowed Abilities
+ </text>
+ <scroll_list
+ draw_stripes="true"
+ height="140"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ right="-1"
+ name="role_allowed_actions"
+ search_column="2"
+ tool_tip="For details of each allowed ability see the abilities tab"
+ top_pad="0"
+ width="300">
+ <scroll_list.columns
+ label=""
+ name="icon"
+ width="2" />
+ <scroll_list.columns
+ label=""
+ name="checkbox"
+ width="20" />
+ <scroll_list.columns
+ label=""
+ name="action"
+ width="270" />
+ </scroll_list>
+ </panel>
+ <panel
+ height="424"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
+ layout="topleft"
+ follows="top|left|right"
+ left="0"
+ right="-1"
+ width="313"
+ mouse_opaque="false"
+ name="actions_footer"
+ top_delta="0"
+ top="255"
+ visible="false">
+ <text_editor
+ bg_readonly_color="Transparent"
+ text_readonly_color="EmphasisColor"
+ font="SansSerifSmall"
+ type="string"
+ enabled="false"
+ halign="left"
+ layout="topleft"
+ follows="left|top|right"
+ left="0"
+ right="-1"
+ height="90"
+ max_length="512"
+ name="action_description"
+ top="0"
+ word_wrap="true">
+ This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
+ </text_editor>
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ name="static2"
+ top_pad="1"
+ width="300">
+ Roles with this ability
+ </text>
+ <scroll_list
+ height="172"
+ layout="topleft"
+ follows="left|top|right"
+ left="5"
+ right="-1"
+ name="action_roles"
+ top_pad="0"
+ width="300" />
+ <text
+ type="string"
+ height="16"
+ layout="topleft"
+ follows="left|top"
+ left="5"
+ name="static3"
+ top_pad="5"
+ width="300">
+ Members with this ability
+ </text>
+ <name_list
+ height="122"
+ follows="left|top|right"
+ layout="topleft"
+ left="5"
+ right="-1"
+ name="action_members"
+ top_pad="0"
+ width="300" />
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index 308acf0c0c..30239d6d01 100755
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -220,7 +220,7 @@
<layout_stack
border_size="0"
clip="false"
- follows="left|top|right"
+ follows="left|top"
height="50"
layout="topleft"
mouse_opaque="false"
@@ -251,10 +251,10 @@
</layout_panel>
<layout_panel
follows="left|right"
- height="60"
+ height="50"
layout="topleft"
min_height="50"
- min_width="60"
+ min_width="50"
mouse_opaque="false"
name="for_sale_panel"
top="0"
@@ -264,7 +264,7 @@
height="50"
image_name="ForSale_Badge"
layout="topleft"
- left="10"
+ left="0"
name="icon_for_sale"
top="0"
width="50" />
@@ -762,11 +762,19 @@
top_pad="5"
value="Rating:"
width="80" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_PG_Dark"
+ layout="topleft"
+ left_pad="0"
+ name="estate_rating_icon"
+ width="18" />
<text
follows="left|top|right"
height="15"
layout="topleft"
- left_pad="0"
+ left_pad="10"
name="estate_rating"
top_delta="0"
width="187" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 50fd57494f..2e778014c5 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -222,4 +222,15 @@
name="show_develop_menu_check"
top_pad="5"
width="237"/>
+ <button
+ height="20"
+ label="Default Creation Permissions"
+ layout="topleft"
+ name="default_creation_permissions"
+ left="30"
+ top_pad = "20"
+ width="250">
+ <button.commit_callback
+ function="Pref.PermsDefault" />
+ </button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 78743d26bb..d7ffb73dda 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -47,7 +47,7 @@
<check_box
height="16"
enabled="false"
- label="Show me in Search results"
+ label="Show my profile info in Search results"
layout="topleft"
left="30"
name="online_searchresults"
diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml
index bcdef96138..eb1b954e61 100755
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -70,6 +70,16 @@
label="Save to file..."
layout="topleft"
name="SaveToFile" />
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Colors..."
+ layout="topleft"
+ name="Colors">
+ <menu_item_call.on_click
+ function="Floater.Toggle"
+ parameter="script_colors"/>
+ </menu_item_call>
</menu>
<menu
top="0"
@@ -148,8 +158,8 @@
name="Keyword Help..." />
</menu>
</menu_bar>
- <text_editor
- left="0"
+ <script_editor
+ left="0"
type="string"
length="1"
follows="left|top|right|bottom"
@@ -157,15 +167,21 @@
height="376"
ignore_tab="false"
layout="topleft"
- max_length="65536"
+ max_length="262144"
name="Script Editor"
- text_readonly_color="DkGray"
width="487"
- show_line_numbers="true"
+ text_color="ScriptText"
+ default_color="ScriptText"
+ bg_writeable_color="ScriptBackground"
+ bg_focus_color="ScriptBackground"
+ text_readonly_color="ScriptText"
+ bg_readonly_color="ScriptBackground"
+ cursor_color="ScriptCursorColor"
enable_tooltip_paste="true"
- word_wrap="true">
+ word_wrap="true"
+ show_context_menu="true">
Loading...
- </text_editor>
+ </script_editor>
<scroll_list
top_pad="10"
left="0"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
index c5b0be0616..26cac06648 100755
--- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
@@ -47,7 +47,20 @@
text_color="White"
top="4"
value="..."
- width="330" />
+ width="290" />
+ <text
+ follows="right"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ right="-20"
+ parse_urls="false"
+ use_ellipses="true"
+ name="timestamp"
+ text_color="White"
+ top="4"
+ value="..."
+ width="45" />
<button
follows="right"
height="20"
diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml
index 0eeccbeac5..1044cbfd2e 100755
--- a/indra/newview/skins/default/xui/en/role_actions.xml
+++ b/indra/newview/skins/default/xui/en/role_actions.xml
@@ -9,7 +9,10 @@
<action description="Eject Members from this Group"
longdescription="Eject Members from this Group using the &apos;Eject&apos; button in the Roles section &gt; Members tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability."
name="member eject" value="2" />
- <action
+ <action description="Manage ban list"
+ longdescription="Allows the group member to ban / un-ban Residents from this group."
+ name="allow ban" value="51" />
+ <action
description="Toggle &apos;Open Enrollment&apos; and change &apos;Enrollment fee&apos;"
longdescription="Toggle &apos;Open Enrollment&apos; to let new Members join without an invitation, and change the &apos;Enrollment fee&apos; in the General section."
name="member options" value="3" />
diff --git a/indra/newview/skins/default/xui/en/script_editor.xml b/indra/newview/skins/default/xui/en/script_editor.xml
new file mode 100644
index 0000000000..f1c6161711
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/script_editor.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<script_editor
+ name="script_editor"
+ parse_urls="false"
+ show_context_menu="true"
+ show_line_numbers="true"
+ text_color="ScriptText"
+ default_color="ScriptText"
+ bg_writeable_color="ScriptBackground"
+ bg_focus_color="ScriptBackground">
+</script_editor>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index fca4a5cddc..5fbc539a06 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -444,6 +444,8 @@ Please try logging in again in a minute.</string>
<string name="multiple_textures">Multiple</string>
<string name="use_texture">Use texture</string>
+ <string name="manip_hint1">Move mouse cursor over ruler</string>
+ <string name="manip_hint2">to snap to grid</string>
<!-- world map -->
<string name="texture_loading">Loading...</string>
@@ -3773,6 +3775,7 @@ Abuse Report</string>
<string name="LocalEstimateUSD">US$ [AMOUNT]</string>
<!-- Group Profile roles and powers -->
+ <string name="Group Ban">Group Ban</string>
<string name="Membership">Membership</string>
<string name="Roles">Roles</string>
<string name="Group Identity">Group Identity</string>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
index c162130af6..fe312e3587 100755
--- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(Localizaciones, imágenes, web, historial de búsqueda)
</text>
- <check_box label="Mostrarme en los resultados de la búsqueda" name="online_searchresults"/>
+ <check_box label="Mostrarme información de perfil en los resultados de la búsqueda" name="online_searchresults"/>
<check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>
<check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>
<check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
index cf1a374da6..a89676d119 100755
--- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
@@ -7,13 +7,13 @@
<text name="cache_size_label_l">
(endroits, images, web, historique des recherches)
</text>
- <check_box label="M&apos;afficher dans les résultats de recherche" name="online_searchresults"/>
+ <check_box label="Afficher mon profil d&apos;infos dans les résultats de recherche" name="online_searchresults"/>
<check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/>
<check_box label="Seuls mes amis et groupes peuvent m&apos;appeler ou m&apos;envoyer un IM" name="voice_call_friends_only_check"/>
<check_box label="Fermer le micro à la fin d&apos;un appel" name="auto_disengage_mic_check"/>
<check_box label="Afficher mes repères favoris à la connexion (liste déroulante Lieu de départ)" name="favorites_on_login_check"/>
<text name="Logs:">
- Journaux de chat :
+ Journaux de chat :
</text>
<check_box label="Sauvegarder les chats près de moi sur mon ordinateur" name="log_nearby_chat"/>
<check_box label="Sauvegarder les IM sur mon ordinateur" name="log_instant_messages"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
index 41e7a59139..241ed8f162 100755
--- a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(Luoghi, immagini, web, cronologia ricerche)
</text>
- <check_box label="Mostrami nei risultati della ricerca" name="online_searchresults"/>
+ <check_box label="Mostra il mio profilo info nei risultati di ricerca" name="online_searchresults"/>
<check_box label="Solo amici e gruppi mi vedono online" name="online_visibility"/>
<check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/>
<check_box label="Spegnere il microfono alla chiusura delle chiamate" name="auto_disengage_mic_check"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
index 420bbed572..3787f390e4 100755
--- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(位置、画像、web、検索履歴)
</text>
- <check_box label="検索結果に表示" name="online_searchresults"/>
+ <check_box label="検索結果に自分のプロフィール情報を表示する" name="online_searchresults"/>
<check_box label="私のオンライン状態を確認できるのは、フレンドとグループだけ" name="online_visibility"/>
<check_box label="フレンドとグループ以外からはコールと IM を受信しない" name="voice_call_friends_only_check"/>
<check_box label="コールが終了したら自動的にマイクのスイッチを切る" name="auto_disengage_mic_check"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
index 5af2fed142..30b64bc977 100755
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(Miejsca, obrazy, przeglądarka internetowa, wyszukiwarka historii)
</text>
- <check_box label="Pokaż mój profil w wynikach wyszukiwarki" name="online_searchresults"/>
+ <check_box label="Pokaż mój informacje profilu w wynikach wyszukiwania" name="online_searchresults"/>
<check_box label="Mój status online jest dostępny tylko dla znajomych i grup do których należę" name="online_visibility"/>
<check_box label="Możliwość wysyłania wiadomości prywatnej (IM) oraz rozmowy głosowej tylko dla &#10;znajomych i grup do których należę" name="voice_call_friends_only_check" top_pad="15"/>
<check_box label="Wyłącz mikrofon po zakończeniu rozmowy głosowej" name="auto_disengage_mic_check"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
index d7fb585e35..8ca05c948a 100755
--- a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(Locações, imagens, web, histórico de busca)
</text>
- <check_box label="Mostrar nos resultados de busca" name="online_searchresults"/>
+ <check_box label="Mostrar meu perfil info em resultados de busca" name="online_searchresults"/>
<check_box label="Apenas amigos e grupos sabem que estou online" name="online_visibility"/>
<check_box label="Apenas amigos e grupos podem me chamar ou enviar MI" name="voice_call_friends_only_check"/>
<check_box label="Desligar o microfone quando terminar chamadas" name="auto_disengage_mic_check"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml
index 20bb839eed..ed6bed439c 100755
--- a/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(Места, картинки, страницы, журнал поиска)
</text>
- <check_box label="Показывать меня в результатах поиска" name="online_searchresults"/>
+ <check_box label="Показывать информацию моего профиля в результатах поиска" name="online_searchresults"/>
<check_box label="Только друзья и группы видят, когда я на связи" name="online_visibility"/>
<check_box label="Только друзья и группы могут звонить мне и отправлять IM" name="voice_call_friends_only_check"/>
<check_box label="Отключать микрофон по окончании разговора" name="auto_disengage_mic_check"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
index 9111594979..285670a6ac 100755
--- a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(Konumlar, görüntüler, web, arama geçmişi)
</text>
- <check_box label="Arama sonuçlarında beni göster" name="online_searchresults"/>
+ <check_box label="Arama sonuçlarında profil bilgilerini göster" name="online_searchresults"/>
<check_box label="Çevrimiçi olduğumu sadece arkadaşlar ve gruplar bilsin" name="online_visibility"/>
<check_box label="Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin" name="voice_call_friends_only_check"/>
<check_box label="Aramaları sonlandırırken mikrofonu kapat" name="auto_disengage_mic_check"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
index 07fdfd87e3..d768cacb94 100755
--- a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
@@ -7,7 +7,7 @@
<text name="cache_size_label_l">
(位置、圖像、網頁、搜尋的歷史紀錄)
</text>
- <check_box label="將我顯示在搜尋的結果中" name="online_searchresults"/>
+ <check_box label="顯示在搜索結果我的個人資料信息" name="online_searchresults"/>
<check_box label="只有我的朋友和群組知道我上線" name="online_visibility"/>
<check_box label="只有我的朋友和群組可以 IM 或與我通話。" name="voice_call_friends_only_check"/>
<check_box label="當通話結束時關閉麥克風" name="auto_disengage_mic_check"/>
diff --git a/indra/test/llsdmessagebuilder_tut.cpp b/indra/test/llsdmessagebuilder_tut.cpp
index be0692557a..b7283f53a6 100755
--- a/indra/test/llsdmessagebuilder_tut.cpp
+++ b/indra/test/llsdmessagebuilder_tut.cpp
@@ -649,7 +649,7 @@ namespace tut
template<> template<>
void LLSDMessageBuilderTestObject::test<37>()
{
- LLQuaternion data(1,2,3,0);
+ LLQuaternion data(0.3713907f, 0.5570861f, 0.7427813f,0.0f);
//we send a quaternion packed into a vec3 (w is infered) - so sizeof(vec) == 12 bytes not 16.
LLVector3 vec = data.packToVector3();
diff --git a/indra/test/lltemplatemessagebuilder_tut.cpp b/indra/test/lltemplatemessagebuilder_tut.cpp
index 01765974ea..7b4b6a8b70 100755
--- a/indra/test/lltemplatemessagebuilder_tut.cpp
+++ b/indra/test/lltemplatemessagebuilder_tut.cpp
@@ -319,7 +319,7 @@ namespace tut
{
LLMessageTemplate messageTemplate = defaultTemplate();
messageTemplate.addBlock(defaultBlock(MVT_LLQuaternion, 12));
- LLQuaternion outValue, inValue = LLQuaternion(1,2,3,0);
+ LLQuaternion outValue, inValue = LLQuaternion(0.3713907f, 0.5570861f, 0.7427813f,0.0f);
LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
builder->addQuat(_PREHASH_Test0, inValue);
LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
@@ -786,7 +786,7 @@ namespace tut
{
LLMessageTemplate messageTemplate = defaultTemplate();
messageTemplate.addBlock(defaultBlock(MVT_LLQuaternion, 12));
- LLQuaternion outValue, inValue = LLQuaternion(1,2,3,0);
+ LLQuaternion outValue, inValue = LLQuaternion(0.3713907f, 0.5570861f, 0.7427813f,0.0f);
LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
builder->addQuat(_PREHASH_Test0, inValue);
LLTemplateMessageReader* reader = setReader(