Skip to content
Snippets Groups Projects
Commit 8c782b37 authored by Rye Mutt's avatar Rye Mutt :bread:
Browse files

Allow runtime toggle of RLVa

parent 6d47f6e8
No related branches found
No related tags found
2 merge requests!3Update to main branch,!2Rebase onto current main branch
......@@ -172,8 +172,9 @@ void RlvSettings::onChangedSettingMain(const LLSD& sdValue)
args["[STATE]"] = LLTrans::getString( (sdValue.asBoolean()) ? "RLVaToggleEnabled" : "RLVaToggleDisabled");
// As long as RLVa hasn't been enabled but >can< be enabled all toggles are instant (everything else will require a restart)
bool fQuickToggle = (!RlvHandler::isEnabled()) && (RlvHandler::canEnable());
LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", LLTrans::getString((fQuickToggle) ? "RLVaToggleMessageLogin" : "RLVaToggleMessageRestart", args)));
LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", LLTrans::getString("RLVaToggleMessageLogin", args)));
RlvHandler::setEnabled(sdValue.asBoolean());
}
void RlvSettings::initCompatibilityMode(std::string strCompatList)
......
......@@ -82,6 +82,7 @@ extern BOOL gDoDisconnect;
//
bool RlvHandler::m_fEnabled = false;
bool RlvHandler::m_fInitialized = false;
rlv_handler_t gRlvHandler;
......@@ -145,8 +146,6 @@ static bool rlvParseGetStatusOption(const std::string& strOption, std::string& s
// Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.0.1d
RlvHandler::RlvHandler() : m_fCanCancelTp(true), m_posSitSource(), m_pGCTimer(NULL)
{
gAgent.addListener(this, "new group");
// Array auto-initialization to 0 is still not supported in VS2013
memset(m_Behaviours, 0, sizeof(S16) * RLV_BHVR_COUNT);
}
......@@ -159,7 +158,7 @@ RlvHandler::~RlvHandler()
void RlvHandler::cleanup()
{
// Nothing to clean if we're not enabled (or already cleaned up)
if (!m_fEnabled)
if (!m_fInitialized)
return;
//
......@@ -197,12 +196,9 @@ void RlvHandler::cleanup()
m_PendingGroupChange = std::make_pair(LLUUID::null, LLStringUtil::null);
}
for (RlvExtCommandHandler* pCmdHandler : m_CommandHandlers)
{
delete pCmdHandler;
}
m_CommandHandlers.clear();
m_fInitialized = false;
m_fEnabled = false;
}
......@@ -400,39 +396,45 @@ void RlvHandler::getAttachmentResourcesCoro(const std::string strUrl)
//
// Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f
void RlvHandler::addCommandHandler(RlvExtCommandHandler* pCmdHandler)
void RlvHandler::addCommandHandler(std::unique_ptr<RlvExtCommandHandler> pCmdHandler)
{
if ( (pCmdHandler) && (std::find(m_CommandHandlers.begin(), m_CommandHandlers.end(), pCmdHandler) == m_CommandHandlers.end()) )
m_CommandHandlers.push_back(pCmdHandler);
m_CommandHandlers.push_back(std::move(pCmdHandler));
}
// Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f
void RlvHandler::removeCommandHandler(RlvExtCommandHandler* pCmdHandler)
{
if (pCmdHandler)
m_CommandHandlers.remove(pCmdHandler);
{
for (auto it = m_CommandHandlers.begin(); it != m_CommandHandlers.end(); )
{
if (pCmdHandler == it->get())
{
m_CommandHandlers.erase(it);
break;
}
else
++it;
}
}
}
// Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0a
void RlvHandler::clearCommandHandlers()
{
std::list<RlvExtCommandHandler*>::const_iterator itHandler = m_CommandHandlers.begin();
while (itHandler != m_CommandHandlers.end())
{
delete *itHandler;
++itHandler;
}
m_CommandHandlers.clear();
}
// Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f
bool RlvHandler::notifyCommandHandlers(rlvExtCommandHandler f, const RlvCommand& rlvCmd, ERlvCmdRet& eRet, bool fNotifyAll) const
{
std::list<RlvExtCommandHandler*>::const_iterator itHandler = m_CommandHandlers.begin(); bool fContinue = true; eRet = RLV_RET_UNKNOWN;
auto itHandler = m_CommandHandlers.begin(); bool fContinue = true; eRet = RLV_RET_UNKNOWN;
while ( (itHandler != m_CommandHandlers.end()) && ((fContinue) || (fNotifyAll)) )
{
ERlvCmdRet eCmdRet = RLV_RET_UNKNOWN;
if ((fContinue = !((*itHandler)->*f)(rlvCmd, eCmdRet)) == false)
if ((fContinue = !(itHandler->get()->*f)(rlvCmd, eCmdRet)) == false)
eRet = eCmdRet;
++itHandler;
}
......@@ -1533,17 +1535,21 @@ bool RlvHandler::setEnabled(bool fEnable)
if (m_fEnabled == fEnable)
return fEnable;
if ( (fEnable) && (canEnable()) )
m_fEnabled = fEnable;
if (m_fEnabled && !m_fInitialized)
{
m_fInitialized = true;
RLV_INFOS << "Enabling Restrained Love API support - " << RlvStrings::getVersionAbout() << RLV_ENDL;
m_fEnabled = true;
gAgent.addListener(RlvHandler::getInstance(), "new group");
// Initialize static classes
RlvSettings::initClass();
RlvStrings::initClass();
RlvHandler::instance().addCommandHandler(new RlvEnvironment());
RlvHandler::instance().addCommandHandler(new RlvExtGetSet());
RlvHandler::instance().addCommandHandler(std::make_unique<RlvEnvironment>());
RlvHandler::instance().addCommandHandler(std::make_unique<RlvExtGetSet>());
// Make sure we get notified when login is successful
if (LLStartUp::getStartupState() < STATE_STARTED)
......@@ -1559,7 +1565,10 @@ bool RlvHandler::setEnabled(bool fEnable)
gSavedSettings.set<bool>(RlvSettingNames::ShowAssertionFail, TRUE);
// Set up camera debug controls
static bool controls_init = false;
if(!controls_init)
{
controls_init = true;
LLControlVariable* pCameraOffsetRLVaView = gSavedSettings.declareVec3("CameraOffsetRLVaView", LLVector3::zero, "Declared in code", LLControlVariable::PERSIST_NO);
pCameraOffsetRLVaView->setHiddenFromSettingsEditor(true);
LLControlVariable* pCameraOffsetScaleRLVa = gSavedSettings.declareF32("CameraOffsetScaleRLVa", 0.0f, "Declared in code", LLControlVariable::PERSIST_NO);
......@@ -1568,6 +1577,12 @@ bool RlvHandler::setEnabled(bool fEnable)
pFocusOffsetRLVaView->setHiddenFromSettingsEditor(true);
}
}
else if (!m_fEnabled)
{
RlvHandler::instance().cleanup();
}
rlvMenuToggleVisible();
return m_fEnabled;
}
......
......@@ -161,7 +161,7 @@ class RlvHandler : public LLOldEvents::LLSimpleListener, public LLParticularGrou
typedef boost::signals2::signal<void (const RlvCommand&, ERlvCmdRet, bool)> rlv_command_signal_t;
boost::signals2::connection setCommandCallback(const rlv_command_signal_t::slot_type& cb ) { return m_OnCommand.connect(cb); }
void addCommandHandler(RlvExtCommandHandler* pHandler);
void addCommandHandler(std::unique_ptr<RlvExtCommandHandler> pHandler);
void removeCommandHandler(RlvExtCommandHandler* pHandler);
protected:
void clearCommandHandlers();
......@@ -258,12 +258,13 @@ class RlvHandler : public LLOldEvents::LLSimpleListener, public LLParticularGrou
rlv_behaviour_signal_t m_OnBehaviour;
rlv_behaviour_signal_t m_OnBehaviourToggle;
rlv_command_signal_t m_OnCommand;
mutable std::list<RlvExtCommandHandler*> m_CommandHandlers;
mutable std::list<std::unique_ptr<RlvExtCommandHandler>> m_CommandHandlers;
boost::signals2::scoped_connection m_ExperienceEventConn;
boost::signals2::scoped_connection m_TeleportFailedConn;
boost::signals2::scoped_connection m_TeleportFinishedConn;
static bool m_fEnabled; // Use setEnabled() to toggle this
static bool m_fInitialized; // Use setEnabled() to toggle this
bool m_fCanCancelTp; // @accepttp=n and @tpto=force
mutable LLVector3d m_posSitSource; // @standtp=n (mutable because onForceXXX handles are all declared as const)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment