Clear local modifiers when their base restriction is removed (after some feedback)

master
Kitty Barnett 2021-01-10 23:34:01 +01:00
parent f623f1f9b1
commit 36913120e5
7 changed files with 41 additions and 51 deletions

View File

@ -399,6 +399,8 @@ const char* RlvStrings::getStringFromReturnCode(ERlvCmdRet eRet)
return "deprecated and disabled";
case RLV_RET_FAILED_NOBEHAVIOUR:
return "no active behaviours";
case RLV_RET_FAILED_UNHELDBEHAVIOUR:
return "base behaviour not held";
case RLV_RET_FAILED_BLOCKED:
return "blocked object";
case RLV_RET_FAILED_THROTTLED:

View File

@ -335,6 +335,7 @@ enum ERlvCmdRet {
RLV_RET_FAILED_NOSHAREDROOT, // Command failed (missing #RLV)
RLV_RET_FAILED_DEPRECATED, // Command failed (deprecated and no longer supported)
RLV_RET_FAILED_NOBEHAVIOUR, // Command failed (force modifier on an object with no active restrictions)
RLV_RET_FAILED_UNHELDBEHAVIOUR, // Command failed (local modifier on an object that doesn't hold the base behaviour)
RLV_RET_FAILED_BLOCKED, // Command failed (object is blocked)
RLV_RET_FAILED_THROTTLED, // Command failed (throttled)
RLV_RET_NO_PROCESSOR // Command doesn't have a template processor define (legacy code)

View File

@ -42,22 +42,6 @@ RlvOverlayEffect::RlvOverlayEffect(const LLUUID& idRlvObj)
, m_fBlockTouch(false)
, m_Color(LLColor3(c_DefaultColor))
{
if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj))
{
float nAlpha;
if (pRlvObj->getModifierValue<float>(ERlvLocalBhvrModifier::OverlayAlpha, nAlpha))
m_nAlpha = nAlpha;
pRlvObj->getModifierValue<bool>(ERlvLocalBhvrModifier::OverlayTouch, m_fBlockTouch);
LLVector3 vecColor;
if (pRlvObj->getModifierValue<LLVector3>(ERlvLocalBhvrModifier::OverlayTint, vecColor))
m_Color = LLColor3(vecColor.mV);
LLUUID idTexture;
if ( (pRlvObj) && (pRlvObj->getModifierValue<LLUUID>(ERlvLocalBhvrModifier::OverlayTexture, idTexture)) )
setImage(idTexture);
}
}
RlvOverlayEffect::~RlvOverlayEffect()
@ -198,34 +182,6 @@ RlvSphereEffect::RlvSphereEffect(const LLUUID& idRlvObj)
, m_nValueMin(c_SphereDefaultAlpha), m_nValueMax(c_SphereDefaultAlpha)
, m_nTweenDuration(0.f)
{
if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj))
{
int nNumber;
if (pRlvObj->getModifierValue<int>(ERlvLocalBhvrModifier::SphereMode, nNumber))
m_eMode = (ESphereMode)nNumber;
if (pRlvObj->getModifierValue<int>(ERlvLocalBhvrModifier::SphereOrigin, nNumber))
m_eOrigin = (ESphereOrigin)nNumber;
LLVector3 vecColor;
if (pRlvObj->getModifierValue<LLVector3>(ERlvLocalBhvrModifier::SphereColor, vecColor))
m_Params = LLVector4(vecColor.mV[VX], vecColor.mV[VY], vecColor.mV[VZ], 1.0f);
LLVector4 vecParams;
if (pRlvObj->getModifierValue<LLVector4>(ERlvLocalBhvrModifier::SphereParams, vecParams))
m_Params = vecParams;
float nFloat;
if (pRlvObj->getModifierValue<float>(ERlvLocalBhvrModifier::SphereDistMin, nFloat))
m_nDistanceMin = nFloat;
if (pRlvObj->getModifierValue<float>(ERlvLocalBhvrModifier::SphereDistMax, nFloat))
m_nDistanceMax = nFloat;
if (pRlvObj->getModifierValue<int>(ERlvLocalBhvrModifier::SphereDistExtend, nNumber))
m_eDistExtend = (ESphereDistExtend)nNumber;
if (pRlvObj->getModifierValue<float>(ERlvLocalBhvrModifier::SphereValueMin, nFloat))
m_nValueMin = nFloat;
if (pRlvObj->getModifierValue<float>(ERlvLocalBhvrModifier::SphereValueMax, nFloat))
m_nValueMax = nFloat;
}
}
RlvSphereEffect::~RlvSphereEffect()

View File

@ -813,7 +813,7 @@ void RlvFloaterConsole::onInput(LLUICtrl* pCtrl, const LLSD& sdParam)
strCmd.clear(); // Only show feedback on successful commands when there's an informational notice
if (!pstr->empty())
pstr->push_back(',');
pstr->append(", ");
pstr->append(strCmd);
}

View File

@ -1717,6 +1717,8 @@ ERlvCmdRet RlvCommandHandlerBaseImpl<RLV_TYPE_ADDREM>::processCommand(const RlvC
{
if (rlvCmd.isStrict())
gRlvHandler.removeException(rlvCmd.getObjectID(), RLV_BHVR_PERMISSIVE, eBhvr);
if (RlvObject* pRlvObj = gRlvHandler.getObject(rlvCmd.getObjectID()))
pRlvObj->clearModifiers(eBhvr);
gRlvHandler.m_Behaviours[eBhvr]--;
}
@ -2085,7 +2087,7 @@ ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_SETSPHERE>::onCommand(const RlvCommand&
else
LLVfxManager::instance().removeEffect(gRlvHandler.getCurrentObject());
}
return RLV_RET_SUCCESS;
return eRet;
}
// Handles: @sendchannel[:<channel>]=n|y and @sendchannel_except[:<channel>]=n|y

View File

@ -406,6 +406,20 @@ void RlvBehaviourDictionary::clearModifiers(const LLUUID& idRlvObj)
}
}
const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(ERlvBehaviour eBhvr, ERlvParamType eParamType) const
{
const RlvBehaviourInfo* pBhvrInfo = nullptr;
for (auto itBhvrLower = m_Bhvr2InfoMap.lower_bound(eBhvr), itBhvrUpper = m_Bhvr2InfoMap.upper_bound(eBhvr);
std::find_if(itBhvrLower, itBhvrUpper, [eBhvr, eParamType](const rlv_bhvr2info_map_t::value_type& bhvrEntry) { return bhvrEntry.second->getParamTypeMask() == eParamType; }) != itBhvrUpper;
++itBhvrLower)
{
if (pBhvrInfo)
return nullptr;
pBhvrInfo = itBhvrLower->second;
}
return pBhvrInfo;
}
const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict, ERlvLocalBhvrModifier* peBhvrModifier) const
{
size_t idxBhvrLastPart = strBhvr.find_last_of('_');
@ -491,9 +505,9 @@ void RlvBehaviourDictionary::toggleBehaviourFlag(const std::string& strBhvr, ERl
// virtual
ERlvCmdRet RlvBehaviourInfo::processModifier(const RlvCommand& rlvCmd) const
{
// The object should be holding at least one active behaviour
if (!gRlvHandler.hasBehaviour(rlvCmd.getObjectID()))
return RLV_RET_FAILED_NOBEHAVIOUR;
// The object should have the base behaviour set (or else there's nothing to modify)
if (!gRlvHandler.hasBehaviour(rlvCmd.getObjectID(), rlvCmd.getBehaviourType()))
return RLV_RET_FAILED_UNHELDBEHAVIOUR;
auto itBhvrModifier = std::find_if(m_BhvrModifiers.begin(), m_BhvrModifiers.end(), [&rlvCmd](const modifier_lookup_t::value_type& entry) { return std::get<0>(entry.second) == rlvCmd.getBehaviourModifier(); });
if (m_BhvrModifiers.end() == itBhvrModifier)
@ -1147,6 +1161,17 @@ std::string RlvObject::getStatusString(const std::string& strFilter, const std::
return strStatus;
}
void RlvObject::clearModifiers(ERlvBehaviour eBhvr)
{
if (const RlvBehaviourInfo* pBhvrInfo = RlvBehaviourDictionary::instance().getBehaviourInfo(eBhvr, RLV_TYPE_ADDREM))
{
for (const auto& modifierEntry : pBhvrInfo->getModifiers())
{
clearModifierValue(std::get<0>(modifierEntry.second));
}
}
}
void RlvObject::clearModifierValue(ERlvLocalBhvrModifier eBhvrModifier)
{
m_Modifiers.erase(eBhvrModifier);

View File

@ -40,6 +40,8 @@ class RlvBehaviourInfo
{
typedef std::function<ERlvCmdRet(const LLUUID& idRlvObj, const boost::optional<RlvBehaviourModifierValue>)> modifier_handler_func_t;
public:
typedef std::map<std::string, std::tuple<ERlvLocalBhvrModifier, std::type_index, modifier_handler_func_t>> modifier_lookup_t;
enum EBehaviourFlags
{
// General behaviour flags
@ -71,6 +73,7 @@ public:
ERlvBehaviour getBehaviourType() const { return m_eBhvr; }
U32 getBehaviourFlags() const { return m_nBhvrFlags; }
U32 getParamTypeMask() const { return m_maskParamType; }
const modifier_lookup_t& getModifiers() const { return m_BhvrModifiers; }
bool hasStrict() const { return m_nBhvrFlags & BHVR_STRICT; }
bool isBlocked() const { return m_nBhvrFlags & BHVR_BLOCKED; }
bool isExperimental() const { return m_nBhvrFlags & BHVR_EXPERIMENTAL; }
@ -87,7 +90,6 @@ protected:
ERlvBehaviour m_eBhvr;
U32 m_nBhvrFlags;
U32 m_maskParamType;
typedef std::map<std::string, std::tuple<ERlvLocalBhvrModifier, std::type_index, modifier_handler_func_t>> modifier_lookup_t;
modifier_lookup_t m_BhvrModifiers;
};
@ -112,7 +114,8 @@ public:
public:
void clearModifiers(const LLUUID& idRlvObj);
ERlvBehaviour getBehaviourFromString(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const;
const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = nullptr, ERlvLocalBhvrModifier* peBhvrModifier = nullptr) const;
const RlvBehaviourInfo* getBehaviourInfo(ERlvBehaviour eBhvr, ERlvParamType eParamType) const;
const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = nullptr, ERlvLocalBhvrModifier* peBhvrModifier = nullptr) const;
bool getCommands(const std::string& strMatch, ERlvParamType eParamType, std::list<std::string>& cmdList) const;
bool getHasStrict(ERlvBehaviour eBhvr) const;
RlvBehaviourModifier* getModifier(ERlvBehaviourModifier eBhvrMod) const { return (eBhvrMod < RLV_MODIFIER_COUNT) ? m_BehaviourModifiers[eBhvrMod] : nullptr; }
@ -467,6 +470,7 @@ public:
* Local-scope modifiers
*/
public:
void clearModifiers(ERlvBehaviour eBhvr);
void clearModifierValue(ERlvLocalBhvrModifier eBhvrMod);
template<typename T> bool getModifierValue(ERlvLocalBhvrModifier eBhvrModifier, T& value) const;
void setModifierValue(ERlvLocalBhvrModifier eBhvrMod, const RlvBehaviourModifierValue& modValue);