From 651df17f2c76b60b52c56a7cc35787a8ea87b246 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Wed, 9 Jul 2025 22:11:47 +0800 Subject: Partial @getinv= command implementation Returns an empty string if #RLV folder doesn't contain any folder. Listing sub-folders (folders under any folder under #RLV, listed on the options) isn't implemented yet in this commit. --- indra/newview/rlvhandler.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 67739ec72f..57275af54a 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -28,6 +28,8 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" #include "llstartup.h" +#include "llappearancemgr.h" +#include "llinventorymodel.h" #include "llmoveview.h" #include "llviewercontrol.h" #include "llviewermenu.h" @@ -238,6 +240,29 @@ ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd, return ECmdRet::Succeeded; } +template<> template<> +ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + auto rlvFolderID = findDescendentCategoryIDByName(gInventory.getRootFolderID(), "#RLV"); + if (rlvFolderID == LLUUID::null) + return ECmdRet::FailedNoSharedRoot; + strReply = ""; + gInventory.getDirectDescendentsOf(rlvFolderID, cats, items); + auto iter = cats->begin(); + for(; cats->end() != iter; ++iter) + { + auto name = (*iter)->getName(); + if (name.front() == '.') + continue; + if (iter != cats->begin()) + strReply.append(","); + strReply.append(name); + } + return ECmdRet::Succeeded; +} + // Force ECmdRet CommandHandlerBaseImpl::processCommand(const RlvCommand& rlvCmd, ForceHandlerFunc* pHandler) -- cgit v1.2.3 From af6a85ef15a3de2d4051a012b4f06c0df510a858 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Thu, 10 Jul 2025 18:16:05 +0800 Subject: @getinv[:folder1/...]= implementation The collar I happen to have issued @getinv:.outfits/=98745923, so I just assume ignoring folders beginning with a dot only applies to the answer, not the command. --- indra/newview/rlvhandler.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 57275af54a..413d3758e4 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -243,13 +243,26 @@ ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd, template<> template<> ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd, std::string& strReply) { - LLInventoryModel::cat_array_t* cats; - LLInventoryModel::item_array_t* items; - auto rlvFolderID = findDescendentCategoryIDByName(gInventory.getRootFolderID(), "#RLV"); - if (rlvFolderID == LLUUID::null) + auto folderID = findDescendentCategoryIDByName(gInventory.getRootFolderID(), "#RLV"); + if (folderID == LLUUID::null) return ECmdRet::FailedNoSharedRoot; strReply = ""; - gInventory.getDirectDescendentsOf(rlvFolderID, cats, items); + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + std::vector optionList; + auto option = rlvCmd.getOption(); + if (!option.empty()) + { + Util::parseStringList(option, optionList, "/"); + auto optIter = optionList.begin(); + for(; optionList.end() != optIter; ++optIter) + { + auto name = *optIter; + if (!name.empty()) + folderID = findDescendentCategoryIDByName(folderID, name); + } + } + gInventory.getDirectDescendentsOf(folderID, cats, items); auto iter = cats->begin(); for(; cats->end() != iter; ++iter) { -- cgit v1.2.3 From f4e04a3e7bac42a8cb18e9c70b67bf97ce020d8c Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Thu, 10 Jul 2025 21:48:27 +0800 Subject: @attach:=force implementation A minimal one. It would still work even when the path leading to the right name of the end folder is wrong, but since scripts would likely be trying to get path components from issuing @getinv commands beforehand instead of inserting random names, we'll perfect this implementation later. --- indra/newview/rlvhandler.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 413d3758e4..f3306b0f21 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -304,6 +304,33 @@ ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) return ECmdRet::Succeeded; } +template<> template<> +ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) +{ + auto rlvFolderID = findDescendentCategoryIDByName(gInventory.getRootFolderID(), "#RLV"); + if (rlvFolderID == LLUUID::null) + return ECmdRet::FailedNoSharedRoot; + std::vector optionList; + auto option = rlvCmd.getOption(); + if (!option.empty()) + { + auto folderID = findDescendentCategoryIDByName(rlvFolderID, option); + if (folderID == LLUUID::null) + { + Util::parseStringList(option, optionList, "/"); + auto iter = optionList.begin(); + for(; optionList.end() != iter; ++iter) + { + auto name = *iter; + if (!name.empty()) + folderID = findDescendentCategoryIDByName(folderID, name); + } + } + LLAppearanceMgr::instance().replaceCurrentOutfit(folderID); + } + return ECmdRet::Succeeded; +} + // AddRem ECmdRet CommandHandlerBaseImpl::processCommand(const RlvCommand& rlvCmd, BhvrHandlerFunc* pHandler, BhvrToggleHandlerFunc* pToggleHandler) -- cgit v1.2.3 From b1d2961edb593393da5ae88e275be7bb2568969b Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Fri, 11 Jul 2025 14:31:55 +0800 Subject: @attachover:=force implementation See f4e04a3e7bac42a8cb18e9c70b67bf97ce020d8c --- indra/newview/rlvhandler.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index f3306b0f21..066543987f 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -331,6 +331,33 @@ ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) return ECmdRet::Succeeded; } +template<> template<> +ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) +{ + auto rlvFolderID = findDescendentCategoryIDByName(gInventory.getRootFolderID(), "#RLV"); + if (rlvFolderID == LLUUID::null) + return ECmdRet::FailedNoSharedRoot; + std::vector optionList; + auto option = rlvCmd.getOption(); + if (!option.empty()) + { + auto folderID = findDescendentCategoryIDByName(rlvFolderID, option); + if (folderID == LLUUID::null) + { + Util::parseStringList(option, optionList, "/"); + auto iter = optionList.begin(); + for(; optionList.end() != iter; ++iter) + { + auto name = *iter; + if (!name.empty()) + folderID = findDescendentCategoryIDByName(folderID, name); + } + } + LLAppearanceMgr::instance().addCategoryToCurrentOutfit(folderID); + } + return ECmdRet::Succeeded; +} + // AddRem ECmdRet CommandHandlerBaseImpl::processCommand(const RlvCommand& rlvCmd, BhvrHandlerFunc* pHandler, BhvrToggleHandlerFunc* pToggleHandler) -- cgit v1.2.3