diff --git a/indra/newview/fsareasearch.cpp b/indra/newview/fsareasearch.cpp index 6410fe237a..b5e3fc6d10 100644 --- a/indra/newview/fsareasearch.cpp +++ b/indra/newview/fsareasearch.cpp @@ -1659,6 +1659,80 @@ bool FSPanelAreaSearchList::onContextMenuItemEnable(const LLSD& userdata) } } +bool FSPanelAreaSearchList::onContextMenuItemVisibleRLV(const LLSD& userdata) +{ + if (!RlvActions::isRlvEnabled()) + { + return true; + } + + if (RlvActions::hasBehaviour(RLV_BHVR_INTERACT)) + { + return false; + } + + const std::string& parameter = userdata.asStringRef(); + std::vector behavs; + LLStringUtil::getTokens(parameter, behavs, "|"); + + if (std::find(behavs.begin(), behavs.end(), "delete") != behavs.end()) + { + if (!rlvCanDeleteOrReturn()) + { + return false; + } + } + + std::vector selected = mResultList->getAllSelected(); + for (const auto item : selected) + { + const LLUUID& object_id = item->getUUID(); + LLViewerObject* objectp = gObjectList.findObject(object_id); + if (!objectp) + { + return false; + } + + if ( + std::find(behavs.begin(), behavs.end(), "touch") != behavs.end() + && !RlvActions::canTouch(objectp) + ) + { + return false; + } + else if ( + std::find(behavs.begin(), behavs.end(), "edit") != behavs.end() + && !RlvActions::canEdit(objectp) + ) + { + return false; + } + else if ( + std::find(behavs.begin(), behavs.end(), "sit") != behavs.end() + && !RlvActions::canSit(objectp) + ) + { + return false; + } + else if ( + std::find(behavs.begin(), behavs.end(), "buy") != behavs.end() + && !RlvActions::canBuyObject(object_id) + ) + { + return false; + } + else if ( + std::find(behavs.begin(), behavs.end(), "teleport") != behavs.end() + && !RlvActions::canTeleportToLocal(objectp->getPositionGlobal()) + ) + { + return false; + } + } + + return true; +} + bool FSPanelAreaSearchList::onContextMenuItemClick(const LLSD& userdata) { const std::string& action = userdata.asStringRef(); @@ -1942,6 +2016,10 @@ bool FSPanelAreaSearchList::onContextMenuItemClick(const LLSD& userdata) handle_object_delete(); break; case 'r': // return + if (RlvActions::isRlvEnabled() && !rlvCanDeleteOrReturn()) + { + break; + } handle_object_return(); break; default: diff --git a/indra/newview/fsareasearch.h b/indra/newview/fsareasearch.h index 2d5f5615e1..78d40454dc 100644 --- a/indra/newview/fsareasearch.h +++ b/indra/newview/fsareasearch.h @@ -305,6 +305,7 @@ private: bool onContextMenuItemClick(const LLSD& userdata); bool onContextMenuItemEnable(const LLSD& userdata); + bool onContextMenuItemVisibleRLV(const LLSD& userdata); void onColumnVisibilityChecked(const LLSD& userdata); bool onEnableColumnVisibilityChecked(const LLSD& userdata); diff --git a/indra/newview/fsareasearchmenu.cpp b/indra/newview/fsareasearchmenu.cpp index bbef3c73ed..c5fd1b6eaf 100644 --- a/indra/newview/fsareasearchmenu.cpp +++ b/indra/newview/fsareasearchmenu.cpp @@ -41,6 +41,7 @@ LLContextMenu* FSAreaSearchMenu::createMenu() registrar.add("AreaSearch.Action", boost::bind(&FSAreaSearchMenu::onContextMenuItemClick, this, _2)); enable_registrar.add("AreaSearch.Enable", boost::bind(&FSAreaSearchMenu::onContextMenuItemEnable, this, _2)); + enable_registrar.add("AreaSearch.RLV", boost::bind(&FSAreaSearchMenu::onContextMenuItemVisibleRLV, this, _2)); return createFromFile("menu_fs_area_search.xml"); } @@ -63,3 +64,13 @@ bool FSAreaSearchMenu::onContextMenuItemEnable(const LLSD& userdata) } return false; } + +bool FSAreaSearchMenu::onContextMenuItemVisibleRLV(const LLSD& userdata) +{ + FSAreaSearch* search = LLFloaterReg::findTypedInstance("area_search"); + if (search && search->getPanelList()) + { + return search->getPanelList()->onContextMenuItemVisibleRLV(userdata); + } + return false; +} diff --git a/indra/newview/fsareasearchmenu.h b/indra/newview/fsareasearchmenu.h index 2853c015f7..480b90428e 100644 --- a/indra/newview/fsareasearchmenu.h +++ b/indra/newview/fsareasearchmenu.h @@ -37,6 +37,7 @@ public: private: void onContextMenuItemClick(const LLSD& userdata); bool onContextMenuItemEnable(const LLSD& userdata); + bool onContextMenuItemVisibleRLV(const LLSD& userdata); }; extern FSAreaSearchMenu gFSAreaSearchMenu; diff --git a/indra/newview/llfloaterpathfindinglinksets.cpp b/indra/newview/llfloaterpathfindinglinksets.cpp index 7ed64383f0..9c1b1f6ddd 100644 --- a/indra/newview/llfloaterpathfindinglinksets.cpp +++ b/indra/newview/llfloaterpathfindinglinksets.cpp @@ -54,6 +54,9 @@ #include "v3math.h" #include "v4color.h" +#include "rlvactions.h" // Respect RLVa restrictions +#include "rlvcommon.h" // Respect RLVa restrictions + #define XUI_LINKSET_USE_NONE 0 #define XUI_LINKSET_USE_WALKABLE 1 #define XUI_LINKSET_USE_STATIC_OBSTACLE 2 @@ -556,6 +559,29 @@ void LLFloaterPathfindingLinksets::updateStateOnEditFields() int numSelectedItems = getNumSelectedObjects(); bool isEditEnabled = (numSelectedItems > 0); + // Respect RLVa restrictions + if (RlvActions::isRlvEnabled()) + { + if ( + !rlvCanDeleteOrReturn() + || RlvActions::hasBehaviour(RLV_BHVR_FARTOUCH) + || RlvActions::hasBehaviour(RLV_BHVR_TOUCHALL) + || RlvActions::hasBehaviour(RLV_BHVR_TOUCHWORLD) + || RlvActions::hasBehaviour(RLV_BHVR_TOUCHME) + || RlvActions::hasBehaviour(RLV_BHVR_TOUCHTHIS) + || RlvActions::hasBehaviour(RLV_BHVR_INTERACT) + ) + { + isEditEnabled = false; + } + + if (RlvActions::hasBehaviour(RLV_BHVR_TPLOCAL)) + { + numSelectedItems = 0; + } + } + // + mEditLinksetUse->setEnabled(isEditEnabled); mLabelWalkabilityCoefficients->setEnabled(isEditEnabled); diff --git a/indra/newview/llfloaterpathfindingobjects.cpp b/indra/newview/llfloaterpathfindingobjects.cpp index 402da273c8..e63c157546 100644 --- a/indra/newview/llfloaterpathfindingobjects.cpp +++ b/indra/newview/llfloaterpathfindingobjects.cpp @@ -64,6 +64,9 @@ #include "v3math.h" #include "v4color.h" +#include "rlvactions.h" // Respect RLVa restrictions +#include "rlvcommon.h" // Respect RLVa restrictions + #define DEFAULT_BEACON_WIDTH 6 //--------------------------------------------------------------------------- @@ -819,6 +822,29 @@ void LLFloaterPathfindingObjects::updateStateOnActionControls() int numSelectedItems = mObjectsScrollList->getNumSelected(); bool isEditEnabled = (numSelectedItems > 0); + // Respect RLVa restrictions + if (RlvActions::isRlvEnabled()) + { + if ( + !rlvCanDeleteOrReturn() + || RlvActions::hasBehaviour(RLV_BHVR_FARTOUCH) + || RlvActions::hasBehaviour(RLV_BHVR_TOUCHALL) + || RlvActions::hasBehaviour(RLV_BHVR_TOUCHWORLD) + || RlvActions::hasBehaviour(RLV_BHVR_TOUCHME) + || RlvActions::hasBehaviour(RLV_BHVR_TOUCHTHIS) + || RlvActions::hasBehaviour(RLV_BHVR_INTERACT) + ) + { + isEditEnabled = false; + } + + if (RlvActions::hasBehaviour(RLV_BHVR_TPLOCAL)) + { + numSelectedItems = 0; + } + } + // + mShowBeaconCheckBox->setEnabled(isEditEnabled); mTakeButton->setEnabled(isEditEnabled && visible_take_object()); mTakeCopyButton->setEnabled(isEditEnabled && enable_object_take_copy()); diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index 46200539a3..b13e5e1fb4 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -987,7 +987,7 @@ LLTerrainPartition::LLTerrainPartition(LLViewerRegion* regionp) } // Do not add vertices; honor strict vertex count specified by strider_vertex_count -void gen_terrain_tangents(U16 strider_vertex_count, +void gen_terrain_tangents(U32 strider_vertex_count, // [FIRE-34363] Fix implicit cast from U32->U16 that can cause a crash U32 strider_index_count, LLStrider &verticesp, LLStrider &normalsp, @@ -1003,7 +1003,7 @@ void gen_terrain_tangents(U16 strider_vertex_count, std::vector texcoords(strider_vertex_count); std::vector indices(strider_index_count); - for (U16 v = 0; v < strider_vertex_count; ++v) + for (U32 v = 0; v < strider_vertex_count; ++v) // [FIRE-34363] Fix implicit cast from U32->U16 that can cause a crash { F32 *vert = verticesp[v].mV; vertices[v] = LLVector4a(vert[0], vert[1], vert[2], 1.f); @@ -1019,7 +1019,7 @@ void gen_terrain_tangents(U16 strider_vertex_count, LLCalculateTangentArray(strider_vertex_count, vertices, normals, texcoords.data(), strider_index_count / 3, indices.data(), tangents); - for (U16 v = 0; v < strider_vertex_count; ++v) + for (U32 v = 0; v < strider_vertex_count; ++v) // [FIRE-34363] Fix implicit cast from U32->U16 that can cause a crash { tangentsp[v] = tangents[v]; } diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp index 1057907f00..cb424887c8 100644 --- a/indra/newview/rlvcommon.cpp +++ b/indra/newview/rlvcommon.cpp @@ -787,16 +787,16 @@ bool rlvMenuEnableIfNot(const LLSD& sdParam) // Checked: 2011-05-28 (RLVa-1.4.6) | Modified: RLVa-1.4.0 bool rlvCanDeleteOrReturn(const LLViewerObject* pObj) { - // Block if: @rez=n restricted and owned by us or a group *or* @unsit=n restricted and being sat on by us + // Block if: @rez=n or @edit=n restricted and owned/editable by us or a group *or* @unsit=n restricted and being sat on by us return - ( (!gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) || ((!pObj->permYouOwner()) && (!pObj->permGroupOwner())) ) && + ( (!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT) && !gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) || ((!pObj->permYouOwner()) && (!pObj->permModify()) && (!pObj->permGroupOwner())) ) && ( (!gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (!isAgentAvatarValid()) || (!pObj->getRootEdit()->isChild(gAgentAvatarp)) ); } // Checked: 2011-05-28 (RLVa-1.4.6) | Modified: RLVa-1.4.0 bool rlvCanDeleteOrReturn() { - if ( (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) || (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) ) + if ( (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) || (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) ) { struct RlvCanDeleteOrReturn : public LLSelectedObjectFunctor { diff --git a/indra/newview/skins/default/xui/en/menu_fs_area_search.xml b/indra/newview/skins/default/xui/en/menu_fs_area_search.xml index 2215bfece5..fba0cd2a29 100644 --- a/indra/newview/skins/default/xui/en/menu_fs_area_search.xml +++ b/indra/newview/skins/default/xui/en/menu_fs_area_search.xml @@ -12,6 +12,9 @@ + + + + + + + + + + @@ -106,6 +136,9 @@ +