Merge Firestorm LGPL
commit
c6ddd7eae2
|
|
@ -5,23 +5,32 @@ set(PYTHONINTERP_FOUND)
|
|||
if (WINDOWS)
|
||||
# On Windows, explicitly avoid Cygwin Python.
|
||||
|
||||
find_program(PYTHON_EXECUTABLE
|
||||
NAMES python25.exe python23.exe python.exe
|
||||
NO_DEFAULT_PATH # added so that cmake does not find cygwin python
|
||||
PATHS
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.8\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.8\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath]
|
||||
)
|
||||
if (DEFINED ENV{VIRTUAL_ENV})
|
||||
find_program(PYTHON_EXECUTABLE
|
||||
NAMES python.exe
|
||||
PATHS
|
||||
"$ENV{VIRTUAL_ENV}\\scripts"
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
else()
|
||||
find_program(PYTHON_EXECUTABLE
|
||||
NAMES python25.exe python23.exe python.exe
|
||||
NO_DEFAULT_PATH # added so that cmake does not find cygwin python
|
||||
PATHS
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.8\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.8\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
|
||||
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath]
|
||||
)
|
||||
endif()
|
||||
elseif (EXISTS /etc/debian_version)
|
||||
# On Debian and Ubuntu, avoid Python 2.4 if possible.
|
||||
|
||||
|
|
|
|||
|
|
@ -3530,6 +3530,14 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::str
|
|||
if (node->hasName("multi_floater"))
|
||||
{
|
||||
LLFloater::setFloaterHost((LLMultiFloater*) this);
|
||||
|
||||
// <FS:Ansariel> MultiFloater without titlebar for hosted floater
|
||||
BOOL show_titlebar;
|
||||
if (node->getAttributeBOOL("hosted_floater_show_titlebar", show_titlebar))
|
||||
{
|
||||
static_cast<LLMultiFloater*>(this)->setHostedFloaterShowtitlebar(show_titlebar);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
LLUICtrlFactory::createChildren(this, node, child_registry_t::instance(), output_node);
|
||||
|
|
|
|||
|
|
@ -37,16 +37,23 @@
|
|||
// LLMultiFloater
|
||||
//
|
||||
|
||||
// <FS> Update torn off status and add title bar
|
||||
static const std::string IM_CONTAINER = "floater_im_box";
|
||||
// <FS:Ansariel> MultiFloater without titlebar for hosted floater
|
||||
//static
|
||||
const LLMultiFloater::Params& LLMultiFloater::getDefaultParams()
|
||||
{
|
||||
return LLUICtrlFactory::getDefaultParams<LLMultiFloater>();
|
||||
}
|
||||
|
||||
LLMultiFloater::LLMultiFloater(const LLSD& key, const LLFloater::Params& params)
|
||||
//LLMultiFloater::LLMultiFloater(const LLSD& key, const LLFloater::Params& params)
|
||||
LLMultiFloater::LLMultiFloater(const LLSD& key, const Params& params)
|
||||
// </FS:Ansariel>
|
||||
: LLFloater(key),
|
||||
mTabContainer(NULL),
|
||||
mTabPos(LLTabContainer::TOP),
|
||||
mAutoResize(TRUE),
|
||||
mOrigMinWidth(params.min_width),
|
||||
mOrigMinHeight(params.min_height)
|
||||
mOrigMinHeight(params.min_height),
|
||||
mHostedFloaterShowtitlebar(params.hosted_floater_show_titlebar) // <FS:Ansariel> MultiFloater without titlebar for hosted floater
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -203,7 +210,7 @@ void LLMultiFloater::addFloater(LLFloater* floaterp, BOOL select_added_floater,
|
|||
floaterp->setBackgroundVisible(FALSE);
|
||||
|
||||
// <FS> Update torn off status and add title bar; Do this AFTER we stored the original rect!
|
||||
if (getName() == IM_CONTAINER)
|
||||
if (!mHostedFloaterShowtitlebar)
|
||||
{
|
||||
floaterp->getDragHandle()->setTitleVisible(FALSE);
|
||||
LLRect rect = floaterp->getRect();
|
||||
|
|
@ -256,7 +263,7 @@ void LLMultiFloater::updateFloaterTitle(LLFloater* floaterp)
|
|||
// <FS:TS> If the tab we're updating is the current tab, then
|
||||
// update the overall title too, since we're showing it
|
||||
// exclusively now.
|
||||
if (getName() == IM_CONTAINER && floaterp == mTabContainer->getCurrentPanel())
|
||||
if (!mHostedFloaterShowtitlebar && floaterp == mTabContainer->getCurrentPanel())
|
||||
{
|
||||
mDragHandle->setTitle(mTitle.getString() + " - " + floaterp->getTitle());
|
||||
}
|
||||
|
|
@ -310,7 +317,7 @@ void LLMultiFloater::removeFloater(LLFloater* floaterp)
|
|||
return;
|
||||
|
||||
// <FS> Update torn off status and add title bar
|
||||
if (getName() == IM_CONTAINER)
|
||||
if (!mHostedFloaterShowtitlebar)
|
||||
{
|
||||
floaterp->getDragHandle()->setTitleVisible(TRUE);
|
||||
LLRect rect = floaterp->getRect();
|
||||
|
|
@ -477,7 +484,7 @@ void LLMultiFloater::onTabSelected()
|
|||
{
|
||||
tabOpen(floaterp, true);
|
||||
// <FS> Update torn off status and add title bar
|
||||
if (getName() == IM_CONTAINER)
|
||||
if (!mHostedFloaterShowtitlebar)
|
||||
{
|
||||
mDragHandle->setTitle(mTitle.getString() + " - " + floaterp->getTitle());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,20 @@
|
|||
class LLMultiFloater : public LLFloater
|
||||
{
|
||||
public:
|
||||
// <FS:Ansariel> MultiFloater without titlebar for hosted floater
|
||||
struct Params
|
||||
: public LLInitParam::Block<Params, LLFloater::Params>
|
||||
{
|
||||
Optional<bool> hosted_floater_show_titlebar;
|
||||
|
||||
Params() :
|
||||
hosted_floater_show_titlebar("hosted_floater_show_titlebar", true)
|
||||
{}
|
||||
};
|
||||
|
||||
static const Params& getDefaultParams();
|
||||
// </FS:Ansariel>
|
||||
|
||||
LLMultiFloater(const LLSD& key, const Params& params = getDefaultParams());
|
||||
virtual ~LLMultiFloater() {};
|
||||
|
||||
|
|
@ -82,6 +96,9 @@ public:
|
|||
// <FS:Ansariel> CTRL-W doesn't work with multifloaters
|
||||
void closeDockedFloater();
|
||||
|
||||
// <FS:Ansariel> MultiFloater without titlebar for hosted floater
|
||||
void setHostedFloaterShowtitlebar(bool show) { mHostedFloaterShowtitlebar = show; }
|
||||
|
||||
protected:
|
||||
struct LLFloaterData
|
||||
{
|
||||
|
|
@ -101,6 +118,9 @@ protected:
|
|||
BOOL mAutoResize;
|
||||
S32 mOrigMinWidth, mOrigMinHeight; // logically const but initialized late
|
||||
|
||||
// <FS:Ansariel> MultiFloater without titlebar for hosted floater
|
||||
bool mHostedFloaterShowtitlebar;
|
||||
|
||||
private:
|
||||
virtual void computeResizeLimits(S32& new_min_width, S32& new_min_height);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2152,14 +2152,22 @@ if (WINDOWS)
|
|||
windows-crash-logger
|
||||
)
|
||||
|
||||
|
||||
if (FMODSTUDIO)
|
||||
list(APPEND COPY_INPUT_DEPENDENCIES
|
||||
if (ADDRESS_SIZE EQUAL 64)
|
||||
list(APPEND COPY_INPUT_DEPENDENCIES
|
||||
${SHARED_LIB_STAGING_DIR}/Release/fmod64.dll
|
||||
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod64.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Debug/fmodL64.dll
|
||||
)
|
||||
else (ADDRESS_SIZE EQUAL 64)
|
||||
list(APPEND COPY_INPUT_DEPENDENCIES
|
||||
${SHARED_LIB_STAGING_DIR}/Release/fmod.dll
|
||||
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod.dll
|
||||
${SHARED_LIB_STAGING_DIR}/Debug/fmodL.dll
|
||||
)
|
||||
endif (ADDRESS_SIZE EQUAL 64)
|
||||
endif (FMODSTUDIO)
|
||||
|
||||
if (FMODEX)
|
||||
list(APPEND COPY_INPUT_DEPENDENCIES
|
||||
${SHARED_LIB_STAGING_DIR}/Release/fmodex.dll
|
||||
|
|
|
|||
|
|
@ -988,7 +988,7 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
|
|||
if ( (pItem) &&
|
||||
( ((LLAssetType::AT_NOTECARD == pItem->getType()) && (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWNOTE))) ||
|
||||
((LLAssetType::AT_LSL_TEXT == pItem->getType()) && (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWSCRIPT))) ||
|
||||
((LLAssetType::AT_TEXTURE == pItem->getType()) && (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWTEXTURE))) ) )
|
||||
((LLAssetType::AT_TEXTURE == pItem->getType()) && (!RlvActions::canPreviewTextures()))))
|
||||
{
|
||||
disabled_items.push_back(std::string("Open"));
|
||||
}
|
||||
|
|
@ -3999,7 +3999,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
|
|||
}
|
||||
|
||||
// [RLVa:KB] - Checked: RLVa-2.1.0
|
||||
if ( ((item) && (!RlvActions::canPaste(item, dest_folder))) || ((cat) && (!RlvActions::canPaste(cat, dest_folder))) )
|
||||
if ( ((item) && (!RlvActions::canPasteInventory(item, dest_folder))) || ((cat) && (!RlvActions::canPasteInventory(cat, dest_folder))) )
|
||||
{
|
||||
RlvActions::notifyBlocked(RLV_STRING_BLOCKED_INVFOLDER);
|
||||
return;
|
||||
|
|
@ -4369,6 +4369,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
|
|||
{
|
||||
disabled_items.push_back(std::string("Delete"));
|
||||
}
|
||||
|
||||
// <FS:Ansariel> FIRE-4595: Paste as Link missing for outfit folders
|
||||
items.push_back(std::string("Paste As Link"));
|
||||
if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
|
||||
{
|
||||
disabled_items.push_back(std::string("Paste As Link"));
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5696,6 +5704,13 @@ bool LLTextureBridge::canSaveTexture(void)
|
|||
return false;
|
||||
}
|
||||
|
||||
// [RLVa:KB] - Checked: RLVa-2.2
|
||||
if (!RlvActions::canPreviewTextures())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
const LLViewerInventoryItem *item = model->getItem(mUUID);
|
||||
if (item)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@
|
|||
#include "llviewerobjectlist.h"
|
||||
#include "llviewermessage.h"
|
||||
// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
|
||||
#include "rlvactions.h"
|
||||
#include "rlvhandler.h"
|
||||
#include "rlvlocks.h"
|
||||
// [/RLVa:KB]
|
||||
|
|
@ -767,7 +768,7 @@ void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
|
|||
bool fLocked = (pAttachObj) ? gRlvAttachmentLocks.isLockedAttachment(pAttachObj->getRootEdit()) : false;
|
||||
if ( ((LLAssetType::AT_NOTECARD == item->getType()) && ((gRlvHandler.hasBehaviour(RLV_BHVR_VIEWNOTE)) || (fLocked))) ||
|
||||
((LLAssetType::AT_LSL_TEXT == item->getType()) && ((gRlvHandler.hasBehaviour(RLV_BHVR_VIEWSCRIPT)) || (fLocked))) ||
|
||||
((LLAssetType::AT_TEXTURE == item->getType()) && (gRlvHandler.hasBehaviour(RLV_BHVR_VIEWTEXTURE))) )
|
||||
((LLAssetType::AT_TEXTURE == item->getType()) && (!RlvActions::canPreviewTextures())))
|
||||
{
|
||||
disabled_items.push_back(std::string("Task Open"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2653,6 +2653,28 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con
|
|||
LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
|
||||
new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos); // Re-fetch in case it got clipped above
|
||||
|
||||
// <FS> FIRE-21915: Fix bogus avatar movement on region crossing
|
||||
// Clip new_pos to current region. Moves across region boundaries should not be extrapolated.
|
||||
// Extrapolation across region boundaries is almost always wrong, and if the region being
|
||||
// entered is slow to respond, very wrong.
|
||||
// Probably don't need edge of world check below any more since we are clipping the predictor to the region.
|
||||
bool clipped; // true if clipped at boundary
|
||||
LLVector3d clip_pos_global_region = LLWorld::getInstance()->clipToRegion(mRegionp,old_pos_global, new_pos_global, clipped);
|
||||
if (clipped)
|
||||
{
|
||||
// Was clipped, so we crossed a region boundary
|
||||
//LL_INFOS() << "Beyond region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global_region)
|
||||
// << " from [" << getPositionRegion() << " .. " << new_pos << "]" << LL_ENDL;
|
||||
new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global_region);
|
||||
// Don't zero out velocity on the server. Telling the server affects scripts and audio.
|
||||
//new_v.clear();
|
||||
//setAcceleration(LLVector3::zero); // stop linear acceleration
|
||||
LLVector3 new_angv;
|
||||
new_angv.clear();
|
||||
setAngularVelocity(new_angv); // stop rotation
|
||||
}
|
||||
// </FS>
|
||||
|
||||
// Clip the positions to known regions
|
||||
LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global);
|
||||
if (clip_pos_global != new_pos_global)
|
||||
|
|
|
|||
|
|
@ -774,10 +774,26 @@ LLVector3d LLWorld::clipToVisibleRegions(const LLVector3d &start_pos, const LLVe
|
|||
}
|
||||
|
||||
LLViewerRegion* regionp = getRegionFromPosGlobal(start_pos);
|
||||
if (!regionp)
|
||||
// <FS> FIRE-21915: Fix bogus avatar movement on region crossing
|
||||
//if (!regionp)
|
||||
//{
|
||||
// return start_pos;
|
||||
//}
|
||||
bool clipped = false; // sink, unused
|
||||
return clipToRegion(regionp, start_pos, end_pos, clipped); // use common fn for clipping to region
|
||||
}
|
||||
|
||||
// Clip to region, using a point along the line start_pos .. end_pos.
|
||||
// If start_pos is outside the region, use start_pos.
|
||||
LLVector3d LLWorld::clipToRegion(const LLViewerRegion* regionp, const LLVector3d &start_pos, const LLVector3d &end_pos, bool &clipped)
|
||||
{
|
||||
clipped = false; // no clipping yet
|
||||
if (!regionp) // no region. We're lost
|
||||
{
|
||||
clipped = true; // very bad
|
||||
return start_pos;
|
||||
}
|
||||
// </FS>
|
||||
|
||||
LLVector3d delta_pos = end_pos - start_pos;
|
||||
LLVector3d delta_pos_abs;
|
||||
|
|
@ -785,8 +801,21 @@ LLVector3d LLWorld::clipToVisibleRegions(const LLVector3d &start_pos, const LLVe
|
|||
delta_pos_abs.abs();
|
||||
|
||||
LLVector3 region_coord = regionp->getPosRegionFromGlobal(end_pos);
|
||||
F64 clip_factor = 1.0;
|
||||
// <FS> FIRE-21915: Fix bogus avatar movement on region crossing
|
||||
//F64 clip_factor = 1.0;
|
||||
LLVector3 region_coord_start = regionp->getPosRegionFromGlobal(start_pos);
|
||||
F64 clip_factor = 0.0; // zero means no cli
|
||||
// </FS>
|
||||
F32 region_width = regionp->getWidth();
|
||||
// <FS> FIRE-21915: Fix bogus avatar movement on region crossing
|
||||
if (region_coord_start.mV[VX] < 0.f || region_coord_start.mV[VX] > region_width
|
||||
|| region_coord_start.mV[VY] < 0.f || region_coord_start.mV[VY] > region_width)
|
||||
{
|
||||
clip_factor = 1.0; // start pos outside region, use start pos
|
||||
}
|
||||
else // clip to region along line from start pos to end po
|
||||
{
|
||||
// </FS>
|
||||
if (region_coord.mV[VX] < 0.f)
|
||||
{
|
||||
if (region_coord.mV[VY] < region_coord.mV[VX])
|
||||
|
|
@ -823,15 +852,38 @@ LLVector3d LLWorld::clipToVisibleRegions(const LLVector3d &start_pos, const LLVe
|
|||
// clip along y +
|
||||
clip_factor = (region_coord.mV[VY] - region_width) / delta_pos_abs.mdV[VY];
|
||||
}
|
||||
// <FS> FIRE-21915: Fix bogus avatar movement on region crossing
|
||||
if (!std::isfinite(clip_factor)) { clip_factor = 0.0; } // avoid NaN problems
|
||||
clip_factor = llclamp(clip_factor, 0.0, 1.0); // avoid overflow problem
|
||||
}
|
||||
// </FS>
|
||||
|
||||
// clamp to within region dimensions
|
||||
// <FS> FIRE-21915: Fix bogus avatar movement on region crossing
|
||||
//// clamp to within region dimensions
|
||||
//LLVector3d final_region_pos = LLVector3d(region_coord) - (delta_pos * clip_factor);
|
||||
//final_region_pos.mdV[VX] = llclamp(final_region_pos.mdV[VX], 0.0,
|
||||
// (F64)(region_width - F_ALMOST_ZERO));
|
||||
//final_region_pos.mdV[VY] = llclamp(final_region_pos.mdV[VY], 0.0,
|
||||
// (F64)(region_width - F_ALMOST_ZERO));
|
||||
//final_region_pos.mdV[VZ] = llclamp(final_region_pos.mdV[VZ], 0.0,
|
||||
// (F64)(LLWorld::getInstance()->getRegionMaxHeight() - F_ALMOST_ZERO));
|
||||
|
||||
// True if clipped. Caller needs to know, because it will kill velocity if there's clipping
|
||||
// Don't do this by comparing floating point numbers for equality. That has roundoff problems.
|
||||
clipped = clip_factor > F_ALMOST_ZERO; // clipped in X or Y
|
||||
LLVector3d final_region_pos = LLVector3d(region_coord) - (delta_pos * clip_factor);
|
||||
final_region_pos.mdV[VX] = llclamp(final_region_pos.mdV[VX], 0.0,
|
||||
(F64)(region_width - F_ALMOST_ZERO));
|
||||
final_region_pos.mdV[VY] = llclamp(final_region_pos.mdV[VY], 0.0,
|
||||
(F64)(region_width - F_ALMOST_ZERO));
|
||||
clipped |= final_region_pos.mdV[VX] < -F_ALMOST_ZERO || final_region_pos.mdV[VX] > (F64)(region_width - F_ALMOST_ZERO);
|
||||
clipped |= final_region_pos.mdV[VY] < -F_ALMOST_ZERO || final_region_pos.mdV[VY] > (F64)(region_width - F_ALMOST_ZERO);
|
||||
clipped |= final_region_pos.mdV[VZ] < -F_ALMOST_ZERO || final_region_pos.mdV[VZ] > (F64)(LLWorld::getInstance()->getRegionMaxHeight() - F_ALMOST_ZERO); // if actually clipping
|
||||
// Final sanity check - don't allow positions more than clamp_range out of region.
|
||||
F64 clamp_range = region_width / 2.0; // half a region width
|
||||
final_region_pos.mdV[VX] = llclamp(final_region_pos.mdV[VX], -clamp_range,
|
||||
(F64)(region_width + clamp_range));
|
||||
final_region_pos.mdV[VY] = llclamp(final_region_pos.mdV[VY], -clamp_range,
|
||||
(F64)(region_width + clamp_range));
|
||||
final_region_pos.mdV[VZ] = llclamp(final_region_pos.mdV[VZ], 0.0,
|
||||
(F64)(LLWorld::getInstance()->getRegionMaxHeight() - F_ALMOST_ZERO));
|
||||
// </FS>
|
||||
return regionp->getPosGlobalFromRegion(LLVector3(final_region_pos));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@ public:
|
|||
LLViewerRegion* getRegionFromID(const LLUUID& region_id);
|
||||
BOOL positionRegionValidGlobal(const LLVector3d& pos); // true if position is in valid region
|
||||
LLVector3d clipToVisibleRegions(const LLVector3d &start_pos, const LLVector3d &end_pos);
|
||||
LLVector3d clipToRegion(const LLViewerRegion* regionp, const LLVector3d &start_pos, const LLVector3d &end_pos, bool &clipped); // clip to specified region // <FS> FIRE-21915: Fix bogus avatar movement on region crossing
|
||||
|
||||
void updateAgentOffset(const LLVector3d &offset);
|
||||
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@ bool RlvActions::canSendIM(const LLUUID& idRecipient)
|
|||
( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDIMTO)) || (!gRlvHandler.isException(RLV_BHVR_SENDIMTO, idRecipient)) ) );
|
||||
}
|
||||
|
||||
bool RlvActions::canStartIM(const LLUUID& idRecipient)
|
||||
bool RlvActions::canStartIM(const LLUUID& idRecipient, bool fIgnoreOpen)
|
||||
{
|
||||
// User can start an IM session with "recipient" (could be an agent or a group) if:
|
||||
// - not generally restricted from starting IM sessions (or the recipient is an exception or inside the exclusion range)
|
||||
|
|
@ -194,7 +194,7 @@ bool RlvActions::canStartIM(const LLUUID& idRecipient)
|
|||
(!isRlvEnabled()) ||
|
||||
( ( (!gRlvHandler.hasBehaviour(RLV_BHVR_STARTIM)) || (gRlvHandler.isException(RLV_BHVR_STARTIM, idRecipient)) || (rlvCheckAvatarIMDistance(idRecipient, RLV_MODIFIER_STARTIMDISTMIN, RLV_MODIFIER_STARTIMDISTMAX)) ) &&
|
||||
( (!gRlvHandler.hasBehaviour(RLV_BHVR_STARTIMTO)) || (!gRlvHandler.isException(RLV_BHVR_STARTIMTO, idRecipient)) ) ) ||
|
||||
( (hasOpenP2PSession(idRecipient)) || (hasOpenGroupSession(idRecipient)) );
|
||||
( (!fIgnoreOpen) && ((hasOpenP2PSession(idRecipient)) || (hasOpenGroupSession(idRecipient))) );
|
||||
}
|
||||
|
||||
bool RlvActions::canShowName(EShowNamesContext eContext, const LLUUID& idAgent)
|
||||
|
|
@ -250,7 +250,7 @@ EChatType RlvActions::checkChatVolume(EChatType chatType)
|
|||
// Inventory
|
||||
//
|
||||
|
||||
bool RlvActions::canPaste(const LLInventoryCategory* pSourceCat, const LLInventoryCategory* pDestCat)
|
||||
bool RlvActions::canPasteInventory(const LLInventoryCategory* pSourceCat, const LLInventoryCategory* pDestCat)
|
||||
{
|
||||
// The user can paste the specified object into the destination if:
|
||||
// - the source and destination are subject to the same lock type (or none at all) => NOTE: this happens to be the same logic we use for moving
|
||||
|
|
@ -258,7 +258,7 @@ bool RlvActions::canPaste(const LLInventoryCategory* pSourceCat, const LLInvento
|
|||
( (pSourceCat) && (pDestCat) && ((!RlvFolderLocks::instance().hasLockedFolder(RLV_LOCK_ANY)) || (RlvFolderLocks::instance().canMoveFolder(pSourceCat->getUUID(), pDestCat->getUUID()))) );
|
||||
}
|
||||
|
||||
bool RlvActions::canPaste(const LLInventoryItem* pSourceItem, const LLInventoryCategory* pDestCat)
|
||||
bool RlvActions::canPasteInventory(const LLInventoryItem* pSourceItem, const LLInventoryCategory* pDestCat)
|
||||
{
|
||||
// The user can paste the specified object into the destination if:
|
||||
// - the source and destination are subject to the same lock type (or none at all) => NOTE: this happens to be the same logic we use for moving
|
||||
|
|
@ -266,6 +266,11 @@ bool RlvActions::canPaste(const LLInventoryItem* pSourceItem, const LLInventoryC
|
|||
( (pSourceItem) && (pDestCat) && ((!RlvFolderLocks::instance().hasLockedFolder(RLV_LOCK_ANY)) || (RlvFolderLocks::instance().canMoveItem(pSourceItem->getUUID(), pDestCat->getUUID()))) );
|
||||
}
|
||||
|
||||
bool RlvActions::canPreviewTextures()
|
||||
{
|
||||
return (!gRlvHandler.hasBehaviour(RLV_BHVR_VIEWTEXTURE));
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Movement
|
||||
//
|
||||
|
|
|
|||
|
|
@ -108,9 +108,9 @@ public:
|
|||
static bool canSendIM(const LLUUID& idRecipient);
|
||||
|
||||
/*
|
||||
* Returns true if the user is allowed to start a - P2P or group - conversation with the specified UUID (or if the session already exists)
|
||||
* Returns true if the user is allowed to start a - P2P or group - conversation with the specified UUID (or if the session already exists, unless 'ignore open' is specified)
|
||||
*/
|
||||
static bool canStartIM(const LLUUID& idRecipient);
|
||||
static bool canStartIM(const LLUUID& idRecipient, bool fIgnoreOpen = false);
|
||||
|
||||
/*
|
||||
* Returns true if an avatar's name should be hidden for the requested operation/context
|
||||
|
|
@ -142,8 +142,13 @@ public:
|
|||
/*
|
||||
* Returns true if the user is allowed to paste the specified inventory object (item/folder) into the specified destination category (within user inventory)
|
||||
*/
|
||||
static bool canPaste(const LLInventoryCategory* pSourceCat, const LLInventoryCategory* pDestCat);
|
||||
static bool canPaste(const LLInventoryItem* pSourceItem, const LLInventoryCategory* pDestCat);
|
||||
static bool canPasteInventory(const LLInventoryCategory* pSourceCat, const LLInventoryCategory* pDestCat);
|
||||
static bool canPasteInventory(const LLInventoryItem* pSourceItem, const LLInventoryCategory* pDestCat);
|
||||
|
||||
/*
|
||||
* Returns true if the user can open the inventory floater for (user/library/notecard/object)inventory based textures
|
||||
*/
|
||||
static bool canPreviewTextures();
|
||||
|
||||
// ========
|
||||
// Movement
|
||||
|
|
@ -232,26 +237,26 @@ public:
|
|||
static bool canShowHoverText(const LLViewerObject* pObj);
|
||||
|
||||
/*
|
||||
* Returns true if the user can touch the specified object (with an optional offset relative to its center)
|
||||
* Returns true if the user can sit on the specified object (see canGroundSit() for sitting on land)
|
||||
*/
|
||||
static bool canTouch(const LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero);
|
||||
static bool canSit(const LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero);
|
||||
|
||||
/*
|
||||
* Returns true if the user can see their in-world location
|
||||
*/
|
||||
static bool canShowLocation();
|
||||
|
||||
/*
|
||||
* Returns true if the user can sit on the specified object (see canGroundSit() for sitting on land)
|
||||
*/
|
||||
static bool canSit(const LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero);
|
||||
|
||||
/*
|
||||
* Returns true if the user can stand up (returns true if the user isn't currently sitting)
|
||||
*/
|
||||
static bool canStand();
|
||||
static bool canStand(const LLUUID& idRlvObjExcept);
|
||||
|
||||
/*
|
||||
* Returns true if the user can touch the specified object (with an optional offset relative to its center)
|
||||
*/
|
||||
static bool canTouch(const LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero);
|
||||
|
||||
// ================
|
||||
// Helper functions
|
||||
// ================
|
||||
|
|
|
|||
|
|
@ -551,14 +551,17 @@ bool RlvUtil::isNearbyRegion(const std::string& strRegion)
|
|||
}
|
||||
|
||||
// Checked: 2011-04-11 (RLVa-1.3.0h) | Modified: RLVa-1.3.0h
|
||||
void RlvUtil::notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs)
|
||||
void RlvUtil::notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs, bool fLogToChat)
|
||||
{
|
||||
std::string strMsg = RlvStrings::getString(strNotifcation);
|
||||
LLStringUtil::format(strMsg, sdArgs);
|
||||
|
||||
LLSD sdNotify;
|
||||
sdNotify["MESSAGE"] = strMsg;
|
||||
LLNotificationsUtil::add("SystemMessageTip", sdNotify);
|
||||
if (!fLogToChat)
|
||||
LLNotificationsUtil::add("SystemMessageTip", sdNotify);
|
||||
else
|
||||
LLNotificationsUtil::add("ChatSystemMessageTip", sdNotify);
|
||||
}
|
||||
|
||||
// Checked: 2010-11-11 (RLVa-1.2.1g) | Added: RLVa-1.2.1g
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ public:
|
|||
static bool isForceTp() { return m_fForceTp; }
|
||||
static void forceTp(const LLVector3d& posDest); // Ignores restrictions that might otherwise prevent tp'ing
|
||||
|
||||
static void notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs = LLSD());
|
||||
static void notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs = LLSD(), bool fLogToChat = false);
|
||||
static void notifyBlockedGeneric() { notifyBlocked(RLV_STRING_BLOCKED_GENERIC); }
|
||||
static void notifyBlockedViewXXX(LLAssetType::EType assetType) { notifyBlocked(RLV_STRING_BLOCKED_VIEWXXX, LLSD().with("[TYPE]", LLTrans::getString(LLAssetType::lookupHumanReadable(assetType)))); }
|
||||
static void notifyFailedAssertion(const std::string& strAssert, const std::string& strFile, int nLine);
|
||||
|
|
|
|||
|
|
@ -482,16 +482,19 @@ bool RlvHandler::processIMQuery(const LLUUID& idSender, const std::string& strMe
|
|||
{
|
||||
if ("@stopim" == strMessage)
|
||||
{
|
||||
// If the user can't start an IM session and one is open terminate it - always notify the sender in this case
|
||||
if ( (!RlvActions::canStartIM(idSender)) && (RlvActions::hasOpenP2PSession(idSender)) )
|
||||
// If the user can't start an IM session terminate it (if one is open) - always notify the sender in this case
|
||||
if (!RlvActions::canStartIM(idSender, true))
|
||||
{
|
||||
RlvUtil::sendBusyMessage(idSender, RlvStrings::getString(RLV_STRING_STOPIM_ENDSESSION_REMOTE));
|
||||
LLAvatarActions::endIM(idSender);
|
||||
RlvUtil::notifyBlocked(RLV_STRING_STOPIM_ENDSESSION_LOCAL, LLSD().with("NAME", LLSLURL("agent", idSender, "about").getSLURLString()));
|
||||
if (RlvActions::hasOpenP2PSession(idSender))
|
||||
{
|
||||
LLAvatarActions::endIM(idSender);
|
||||
RlvUtil::notifyBlocked(RLV_STRING_STOPIM_ENDSESSION_LOCAL, LLSD().with("NAME", LLSLURL("agent", idSender, "about").getSLURLString()), true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// User can start an IM session (or one isn't open) so we do nothing - notify and hide it from the user only if IM queries are enabled
|
||||
// User can start an IM session so we do nothing - notify and hide it from the user only if IM queries are enabled
|
||||
if (!RlvSettings::getEnableIMQuery())
|
||||
return false;
|
||||
RlvUtil::sendBusyMessage(idSender, RlvStrings::getString(RLV_STRING_STOPIM_NOSESSION));
|
||||
|
|
@ -2577,9 +2580,10 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_SIT>::onCommand(const RlvCommand& rlvCmd)
|
|||
LLViewerObject* pObj = NULL;
|
||||
if (idTarget.isNull())
|
||||
{
|
||||
if (!RlvActions::canGroundSit())
|
||||
if ( (!RlvActions::canGroundSit()) || ((isAgentAvatarValid()) && (gAgentAvatarp->isSitting())) )
|
||||
return RLV_RET_FAILED_LOCK;
|
||||
gAgent.sitDown();
|
||||
send_agent_update(TRUE, TRUE);
|
||||
}
|
||||
else if ( ((pObj = gObjectList.findObject(idTarget)) != NULL) && (LL_PCODE_VOLUME == pObj->getPCode()))
|
||||
{
|
||||
|
|
@ -2588,7 +2592,7 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_SIT>::onCommand(const RlvCommand& rlvCmd)
|
|||
|
||||
if ((gRlvHandler.hasBehaviour(RLV_BHVR_STANDTP)) && (isAgentAvatarValid()))
|
||||
{
|
||||
if (gAgentAvatarp->isSitting())
|
||||
if ( (isAgentAvatarValid()) && (gAgentAvatarp->isSitting()) )
|
||||
return RLV_RET_FAILED_LOCK;
|
||||
gRlvHandler.m_posSitSource = gAgent.getPositionGlobal();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
can_minimize="true"
|
||||
can_resize="true"
|
||||
height="390"
|
||||
hosted_floater_show_titlebar="false"
|
||||
layout="topleft"
|
||||
name="floater_im_box"
|
||||
save_rect="true"
|
||||
|
|
|
|||
|
|
@ -6699,6 +6699,14 @@ URL: [AUDIOURL]
|
|||
[MESSAGE]
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="ChatSystemMessageTip"
|
||||
log_to_chat="true"
|
||||
type="notifytip">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="IMSystemMessageTip"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
can_minimize="true"
|
||||
can_resize="true"
|
||||
height="390"
|
||||
hosted_floater_show_titlebar="false"
|
||||
layout="topleft"
|
||||
name="floater_im_box"
|
||||
save_rect="true"
|
||||
|
|
|
|||
Loading…
Reference in New Issue