From 3831d3a8dc9ce85e6128d5943df781c4ef9e0157 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Sat, 28 Jun 2025 20:28:41 +0800 Subject: Basic scaffolding to support force commands --- indra/newview/rlvhandler.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 6c4b439105..63914064cf 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -109,6 +109,7 @@ ECmdRet RlvHandler::processCommand(std::reference_wrapper rlvC switch (rlvCmd.get().getParamType()) { case EParamType::Reply: + case EParamType::Force: eRet = rlvCmd.get().processCommand(); break; case EParamType::Unknown: @@ -222,4 +223,11 @@ ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd return ECmdRet::Succeeded; } +// Force + +ECmdRet CommandHandlerBaseImpl::processCommand(const RlvCommand& rlvCmd, ForceHandlerFunc* pHandler) +{ + return (*pHandler)(rlvCmd); +} + // ============================================================================ -- cgit v1.2.3 From 70732b62c9fcdb57b36492945dd63ee072fbb7ab Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Sat, 28 Jun 2025 20:31:50 +0800 Subject: Minimal @sit:=force command implementation --- indra/newview/rlvhandler.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 63914064cf..52448d8495 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -30,6 +30,7 @@ #include "llstartup.h" #include "llviewercontrol.h" #include "llviewerobject.h" +#include "llviewermenu.h" #include "rlvcommon.h" #include "rlvhandler.h" @@ -230,4 +231,11 @@ ECmdRet CommandHandlerBaseImpl::processCommand(const RlvComma return (*pHandler)(rlvCmd); } +template<> template<> +ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) +{ + handle_object_sit(LLUUID{rlvCmd.getOption()}); + return ECmdRet::Succeeded; +} + // ============================================================================ -- cgit v1.2.3 From e87685aacfd2873f6b41b8036ee63a9ed67e2be2 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Sun, 29 Jun 2025 09:43:05 +0800 Subject: Minimal @unsit=force command implementation --- indra/newview/rlvhandler.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 52448d8495..3394362c93 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -238,4 +238,11 @@ ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) return ECmdRet::Succeeded; } +template<> template<> +ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) +{ + gAgent.standUp(); + return ECmdRet::Succeeded; +} + // ============================================================================ -- cgit v1.2.3 From 6ad39e2c3b3df0ebc54f1056f4659b1a51b62f1e Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 30 Jun 2025 09:32:20 +0800 Subject: Basic scaffolding to support add/remove commands plus reorder header inclusions alphabetically. --- indra/newview/rlvhandler.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 3394362c93..869ada40ab 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -29,8 +29,8 @@ #include "llagent.h" #include "llstartup.h" #include "llviewercontrol.h" -#include "llviewerobject.h" #include "llviewermenu.h" +#include "llviewerobject.h" #include "rlvcommon.h" #include "rlvhandler.h" @@ -111,6 +111,8 @@ ECmdRet RlvHandler::processCommand(std::reference_wrapper rlvC { case EParamType::Reply: case EParamType::Force: + case EParamType::Remove: + case EParamType::Add: eRet = rlvCmd.get().processCommand(); break; case EParamType::Unknown: @@ -245,4 +247,17 @@ ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) return ECmdRet::Succeeded; } +// AddRem + +ECmdRet CommandHandlerBaseImpl::processCommand(const RlvCommand& rlvCmd, BhvrHandlerFunc* pHandler, BhvrToggleHandlerFunc* pToggleHandler) +{ + auto param = rlvCmd.getParam(); + bool toggle = false; + if (param == "y") + toggle = true; + else if (param != "n") + return ECmdRet::FailedParam; + return (*pHandler)(rlvCmd, toggle); +} + // ============================================================================ -- cgit v1.2.3 From d6e7979612be80b24441fa84678adb476fda8405 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 30 Jun 2025 14:20:07 +0800 Subject: Minimal @sitground=force command implementation Untested cause I couldn't find any force ground sit command on the attachment I got access to. --- indra/newview/rlvhandler.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 869ada40ab..49b89c8cdf 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -240,6 +240,13 @@ ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) return ECmdRet::Succeeded; } +template<> template<> +ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) +{ + gAgent.sitDown(); + return ECmdRet::Succeeded; +} + template<> template<> ECmdRet ForceHandler::onCommand(const RlvCommand& rlvCmd) { -- cgit v1.2.3 From d0e3c7a40395ea5ad7f7a9982ce4dbf464e24caa Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 30 Jun 2025 18:09:32 +0800 Subject: Minimal @unsit= command implementation Hides the Stand up button too, but doesn't prevent teleporting yet. --- indra/newview/rlvhandler.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 49b89c8cdf..01f5d28ced 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -28,6 +28,7 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" #include "llstartup.h" +#include "llmoveview.h" #include "llviewercontrol.h" #include "llviewermenu.h" #include "llviewerobject.h" @@ -267,4 +268,14 @@ ECmdRet CommandHandlerBaseImpl::processCommand(const RlvComm return (*pHandler)(rlvCmd, toggle); } +template<> template<> +ECmdRet BehaviourToggleHandler::onCommand(const RlvCommand& rlvCmd, bool& toggle) +{ + gAgent.setAllowedToStand(toggle); + if (gAgent.isSitting()) + LLPanelStandStopFlying::getInstance()->setVisibleStandButton(toggle); + return ECmdRet::Succeeded; +} + +template<> template<> // ============================================================================ -- cgit v1.2.3 From 2ed42e44bd6bc78b93c0a38abc2c073a10263c9b Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 30 Jun 2025 19:34:07 +0800 Subject: Minimal @sit= command implementation --- indra/newview/rlvhandler.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 01f5d28ced..dce1471100 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -268,6 +268,13 @@ ECmdRet CommandHandlerBaseImpl::processCommand(const RlvComm return (*pHandler)(rlvCmd, toggle); } +template<> template<> +ECmdRet BehaviourToggleHandler::onCommand(const RlvCommand& rlvCmd, bool& toggle) +{ + gAgent.setAllowedToSit(toggle); + return ECmdRet::Succeeded; +} + template<> template<> ECmdRet BehaviourToggleHandler::onCommand(const RlvCommand& rlvCmd, bool& toggle) { -- cgit v1.2.3 From 90117b89f6eef8785a1701ed79527f8175c55752 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 30 Jun 2025 22:33:00 +0800 Subject: Minimal @getsitid= implementation --- indra/newview/rlvhandler.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index dce1471100..cdde43debf 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -227,6 +227,16 @@ ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd return ECmdRet::Succeeded; } +template<> template<> +ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + if (gAgent.isSitting()) + gAgent.getSitObjectID().toString(strReply); + else + strReply = "00000000-0000-0000-0000-000000000000"; + return ECmdRet::Succeeded; +} + // Force ECmdRet CommandHandlerBaseImpl::processCommand(const RlvCommand& rlvCmd, ForceHandlerFunc* pHandler) -- cgit v1.2.3 From 71c8547184458fb5b2a79cec28787a6999cad4a6 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 1 Jul 2025 11:21:45 +0800 Subject: Fix commit d0e3c7a40395ea5ad7f7a9982ce4dbf464e24caa Accidentally git added a line that wasn't meant to be staged yet. --- indra/newview/rlvhandler.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index cdde43debf..122a87ec43 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -294,5 +294,4 @@ ECmdRet BehaviourToggleHandler::onCommand(const RlvCommand& r return ECmdRet::Succeeded; } -template<> template<> // ============================================================================ -- cgit v1.2.3 From 40de4208328bcac51782302e7028ec2dd057224e Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Thu, 3 Jul 2025 10:31:01 +0800 Subject: Partial @detach= command implementation Only greying out the detach option on the contextual menu popped up by right clicking the attachment in the 3D view/world, and not yet preventing detachment from the inventory/wearing panels. --- indra/newview/rlvhandler.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'indra/newview/rlvhandler.cpp') diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 122a87ec43..67739ec72f 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -32,6 +32,7 @@ #include "llviewercontrol.h" #include "llviewermenu.h" #include "llviewerobject.h" +#include "llviewerobjectlist.h" #include "rlvcommon.h" #include "rlvhandler.h" @@ -294,4 +295,11 @@ ECmdRet BehaviourToggleHandler::onCommand(const RlvCommand& r return ECmdRet::Succeeded; } +template<> template<> +ECmdRet BehaviourToggleHandler::onCommand(const RlvCommand& rlvCmd, bool& toggle) +{ + gObjectList.findObject(rlvCmd.getObjectID())->setLocked(!toggle); + return ECmdRet::Succeeded; +} + // ============================================================================ -- cgit v1.2.3 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