// Checked: 2010-09-28 (RLVa-1.1.3a) | Added: RLVa-1.2.1c RlvCommandOptionGetPath::RlvCommandOptionGetPath(const RlvCommand& rlvCmd) : m_fValid(true) // Assume the option will be a valid one until we find out otherwise { // @getpath[:<option>]=<channel> => <option> is transformed to a list of inventory item UUIDs to get the path of RlvCommandOptionGeneric rlvCmdOption(rlvCmd.getOption()); if (rlvCmdOption.isWearableType()) // <option> can be a clothing layer { EWearableType wtType = rlvCmdOption.getWearableType(); m_idItems.push_back(gAgent.getWearableItem(wtType)); } else if (rlvCmdOption.isAttachmentPoint()) // ... or it can specify an attachment point { const LLViewerJointAttachment* pAttachPt = rlvCmdOption.getAttachmentPoint(); for (LLViewerJointAttachment::attachedobjs_vec_t::const_iterator itAttachObj = pAttachPt->mAttachedObjects.begin(); itAttachObj != pAttachPt->mAttachedObjects.end(); ++itAttachObj) { m_idItems.push_back((*itAttachObj)->getAttachmentItemID()); } } else if (rlvCmdOption.isEmpty()) // ... or it can be empty (in which case we act on the object that issued the command) { const LLViewerObject* pObj = gObjectList.findObject(rlvCmd.getObjectID()); if ( (pObj) || (pObj->isAttachment()) ) m_idItems.push_back(pObj->getAttachmentItemID()); } else // ... but anything else isn't a valid option { m_fValid = false; } }
// Checked: 2010-11-30 (RLVa-1.3.0b) | Modified: RLVa-1.3.0b RlvCommandOptionGetPath::RlvCommandOptionGetPath(const RlvCommand& rlvCmd) { m_fValid = true; // Assume the option will be a valid one until we find out otherwise // @getpath[:<option>]=<channel> => <option> is transformed to a list of inventory item UUIDs to get the path of RlvCommandOptionGeneric rlvCmdOption(rlvCmd.getOption()); if (rlvCmdOption.isWearableType()) // <option> can be a clothing layer { getItemIDs(rlvCmdOption.getWearableType(), m_idItems, false); } else if (rlvCmdOption.isAttachmentPoint()) // ... or it can specify an attachment point { getItemIDs(rlvCmdOption.getAttachmentPoint(), m_idItems, false); } else if (rlvCmdOption.isEmpty()) // ... or it can be empty (in which case we act on the object that issued the command) { const LLViewerObject* pObj = gObjectList.findObject(rlvCmd.getObjectID()); if ( (pObj) || (pObj->isAttachment()) ) m_idItems.push_back(pObj->getAttachmentItemID()); } else // ... but anything else isn't a valid option { m_fValid = false; } }
bool RlvObject::removeCommand(const RlvCommand& rlvCmd) { RLV_ASSERT(RLV_TYPE_REMOVE == rlvCmd.getParamType()); for (rlv_command_list_t::iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd) { //if (*itCmd == rlvCmd) <- commands will never be equal since one is an add and the other is a remove *rolls eyes* if ( (itCmd->getBehaviour() == rlvCmd.getBehaviour()) && (itCmd->getOption() == rlvCmd.getOption()) && (itCmd->isStrict() == rlvCmd.isStrict() ) ) { m_Commands.erase(itCmd); return true; } } return false; // Command was never added so nothing to remove now }
// Checked: 2011-03-28 (RLVa-1.3.0f) | Added: RLVa-1.3.0f RlvCommandOptionTpTo::RlvCommandOptionTpTo(const RlvCommand &rlvCmd) { std::vector<std::string> cmdTokens; boost::split(cmdTokens, rlvCmd.getOption(), boost::is_any_of(std::string("/"))); m_fValid = (3 == cmdTokens.size()); for (int idxAxis = 0; (idxAxis < 3) && (m_fValid); idxAxis++) m_fValid &= (bool)LLStringUtil::convertToF64(cmdTokens[idxAxis], m_posGlobal[idxAxis]); }
// Checked: 2010-03-03 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a void RlvBehaviourNotifyHandler::onCommand(const RlvCommand& rlvCmd, ERlvCmdRet eRet, bool fInternal) { if (fInternal) return; switch (rlvCmd.getParamType()) { case RLV_TYPE_ADD: case RLV_TYPE_REMOVE: sendNotification(rlvCmd.asString(), "=" + rlvCmd.getParam()); break; case RLV_TYPE_CLEAR: sendNotification(rlvCmd.asString()); break; default: break; } }
bool RlvObject::addCommand(const RlvCommand& rlvCmd) { RLV_ASSERT(RLV_TYPE_ADD == rlvCmd.getParamType()); // Don't add duplicate commands for this object (ie @detach=n followed by another @detach=n later on) for (rlv_command_list_t::iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd) { if ( (itCmd->getBehaviour() == rlvCmd.getBehaviour()) && (itCmd->getOption() == rlvCmd.getOption()) && (itCmd->isStrict() == rlvCmd.isStrict() ) ) { return false; } } // Now that we know it's not a duplicate, add it to the end of the list m_Commands.push_back(rlvCmd); return true; }
// Checked: 2010-03-11 (RLVa-1.2.0a) | Added: RLVa-1.2.0a void RlvFloaterLocks::onRlvCommand(const RlvCommand& rlvCmd, ERlvCmdRet eRet) const { // Refresh on any successful @XXX=y|n command where XXX is any of the attachment or wearable locking behaviours if ( (RLV_RET_SUCCESS == eRet) && ((RLV_TYPE_ADD == rlvCmd.getParamType()) || (RLV_TYPE_REMOVE == rlvCmd.getParamType())) ) { switch (rlvCmd.getBehaviourType()) { case RLV_BHVR_DETACH: case RLV_BHVR_ADDATTACH: case RLV_BHVR_REMATTACH: case RLV_BHVR_ADDOUTFIT: case RLV_BHVR_REMOUTFIT: refreshAll(); break; default: break; } } }
// Checked: 2015-03-30 (RLVa-1.5.0) RlvCommandOptionAdjustHeight::RlvCommandOptionAdjustHeight(const RlvCommand& rlvCmd) : m_nPelvisToFoot(0.0f), m_nPelvisToFootDeltaMult(0.0f), m_nPelvisToFootOffset(0.0f) { std::vector<std::string> cmdTokens; boost::split(cmdTokens, rlvCmd.getOption(), boost::is_any_of(std::string(";"))); if (1 == cmdTokens.size()) { m_fValid = (LLStringUtil::convertToF32(cmdTokens[0], m_nPelvisToFootOffset)); m_nPelvisToFootOffset /= 100; } else if ( (2 <= cmdTokens.size()) && (cmdTokens.size() <= 3) ) { m_fValid = (LLStringUtil::convertToF32(cmdTokens[0], m_nPelvisToFoot)) && (LLStringUtil::convertToF32(cmdTokens[1], m_nPelvisToFootDeltaMult)) && ( (2 == cmdTokens.size()) || (LLStringUtil::convertToF32(cmdTokens[2], m_nPelvisToFootOffset)) ); } }
// Checked: 2009-12-23 (RLVa-1.1.0k) | Modified: RLVa-1.1.0k bool RlvExtGetSet::processCommand(const RlvCommand& rlvCmd, ERlvCmdRet& eRet) { std::string strBehaviour = rlvCmd.getBehaviour(), strGetSet, strSetting; int idxSetting = strBehaviour.find('_'); if ( (strBehaviour.length() >= 6) && (-1 != idxSetting) && ((int)strBehaviour.length() > idxSetting + 1) ) { strSetting = strBehaviour.substr(idxSetting + 1); strBehaviour.erase(idxSetting); // Get rid of "_<setting>" strGetSet = strBehaviour.substr(0, 3); strBehaviour.erase(0, 3); // Get rid of get/set if ("debug" == strBehaviour) { if ( ("get" == strGetSet) && (RLV_TYPE_REPLY == rlvCmd.getParamType()) ) { RlvUtil::sendChatReply(rlvCmd.getParam(), onGetDebug(strSetting)); eRet = RLV_RET_SUCCESS; return true; } else if ( ("set" == strGetSet) && (RLV_TYPE_FORCE == rlvCmd.getParamType()) ) { if (!gRlvHandler.hasBehaviourExcept(RLV_BHVR_SETDEBUG, rlvCmd.getObjectID())) eRet = onSetDebug(strSetting, rlvCmd.getOption()); else eRet = RLV_RET_FAILED_LOCK; return true; } } else if ("env" == strBehaviour) { if ( ("get" == strGetSet) && (RLV_TYPE_REPLY == rlvCmd.getParamType()) ) { RlvUtil::sendChatReply(rlvCmd.getParam(), onGetEnv(strSetting)); eRet = RLV_RET_SUCCESS; return true; } else if ( ("set" == strGetSet) && (RLV_TYPE_FORCE == rlvCmd.getParamType()) ) { if (!gRlvHandler.hasBehaviourExcept(RLV_BHVR_SETENV, rlvCmd.getObjectID())) eRet = onSetEnv(strSetting, rlvCmd.getOption()); else eRet = RLV_RET_FAILED_LOCK; return true; } } } else if ("setrot" == rlvCmd.getBehaviour()) { // NOTE: if <option> is invalid (or missing) altogether then RLV-1.17 will rotate to 0.0 (which is actually PI / 4) F32 nAngle = 0.0f; if (LLStringUtil::convertToF32(rlvCmd.getOption(), nAngle)) { nAngle = RLV_SETROT_OFFSET - nAngle; gAgent.startCameraAnimation(); LLVector3 at(LLVector3::x_axis); at.rotVec(nAngle, LLVector3::z_axis); at.normalize(); gAgent.resetAxes(at); eRet = RLV_RET_SUCCESS; } else { eRet = RLV_RET_FAILED_OPTION; } return true; } return false; }
// Checked: 2011-05-23 (RLVa-1.3.1c) | Modified: RLVa-1.3.1c void RlvFloaterBehaviours::onCommand(const RlvCommand& rlvCmd, ERlvCmdRet eRet) { if ( (RLV_TYPE_ADD == rlvCmd.getParamType()) || (RLV_TYPE_REMOVE == rlvCmd.getParamType()) ) refreshAll(); }