381 lines
13 KiB
C++
381 lines
13 KiB
C++
/**
|
|
*
|
|
* Copyright (c) 2009-2020, Kitty Barnett
|
|
*
|
|
* The source code in this file is provided to you under the terms of the
|
|
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
* PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt
|
|
* in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt
|
|
*
|
|
* By copying, modifying or distributing this software, you acknowledge that
|
|
* you have read and understood your obligations described above, and agree to
|
|
* abide by those obligations.
|
|
*
|
|
*/
|
|
|
|
#ifndef RLV_ACTIONS_H
|
|
#define RLV_ACTIONS_H
|
|
|
|
#include "llchat.h"
|
|
#include "llviewerobject.h"
|
|
#include "rlvdefines.h"
|
|
|
|
// ============================================================================
|
|
// Forward declarations
|
|
//
|
|
|
|
class LLInventoryCategory;
|
|
class LLInventoryItem;
|
|
class LLViewerObject;
|
|
class LLVOAvatar;
|
|
|
|
// ============================================================================
|
|
// RlvActions class declaration - developer-friendly non-RLVa code facing class, use in lieu of RlvHandler whenever possible
|
|
//
|
|
|
|
enum class ERlvCheckType { All, Some, Nothing };
|
|
|
|
class RlvActions
|
|
{
|
|
// ======
|
|
// Camera
|
|
// ======
|
|
public:
|
|
/*
|
|
* Returns true if the specified object cannot manipulate the camera FOV
|
|
*/
|
|
static bool canChangeCameraFOV(const LLUUID& idRlvObject);
|
|
|
|
/*
|
|
* Returns true if the specified object can manipulate the camera offset and/or focus offset values
|
|
*/
|
|
static bool canChangeCameraPreset(const LLUUID& idRlvObject);
|
|
|
|
/*
|
|
* Returns true if the user can switch to mouselook
|
|
*/
|
|
static bool canChangeToMouselook();
|
|
|
|
/*
|
|
* Returns true if the camera's distance (from either the avatar of the focus) is currently restricted/clamped
|
|
*/
|
|
static bool isCameraDistanceClamped();
|
|
|
|
/*
|
|
* Returns true if the camera's FOV is currently restricted/clamped
|
|
*/
|
|
static bool isCameraFOVClamped();
|
|
|
|
/*
|
|
* Returns true if the camera offset and focus offset are locked (prevents changing the current camera preset)
|
|
*/
|
|
static bool isCameraPresetLocked();
|
|
|
|
/*
|
|
* Retrieves the current (avatar or focus) camera distance limits
|
|
*/
|
|
static bool getCameraAvatarDistanceLimits(float& nDistMin, float& nDistMax);
|
|
static bool getCameraOriginDistanceLimits(float& nDistMin, float& nDistMax);
|
|
|
|
/*
|
|
* Retrieves the current camera FOV limits - returns isCameraFOVClamped()
|
|
*/
|
|
static bool getCameraFOVLimits(float& nFOVMin, float& nFOVMax);
|
|
|
|
// ================================
|
|
// Communication/Avatar interaction
|
|
// ================================
|
|
public:
|
|
/*
|
|
* Returns true if the user is allowed to change their currently active group
|
|
*/
|
|
static bool canChangeActiveGroup(const LLUUID& idRlvObject = LLUUID::null);
|
|
|
|
/*
|
|
* Returns true if the user is allowed to give inventory to at least one (unspecified) avatar (used to blanket ban use of 'Share' if the user cannot give items to *anyone*)
|
|
*/
|
|
static bool canGiveInventory();
|
|
|
|
/*
|
|
* Returns true if the user is allowed to give the specified avatar inventory
|
|
*/
|
|
static bool canGiveInventory(const LLUUID& idAgent);
|
|
|
|
/*
|
|
* Returns true if the user is allowed to receive IMs from the specified sender (can be an avatar or a group)
|
|
*/
|
|
static bool canReceiveIM(const LLUUID& idSender);
|
|
|
|
/*
|
|
* Returns true if the user is allowed to send/play gestures (whether active ones from the chat bar or using the gesture preview floater)
|
|
*/
|
|
static bool canPlayGestures();
|
|
|
|
/*
|
|
* Returns true if the user is allowed to chat on the specified channel
|
|
*/
|
|
static bool canSendChannel(int nChannel);
|
|
|
|
/*
|
|
* Returns true if the user is allowed to send IMs to the specified recipient (can be an avatar or a group)
|
|
*/
|
|
static bool canSendIM(const LLUUID& idRecipient);
|
|
|
|
/*
|
|
* Returns true if the viewer can inform the region about the user's (nearby chat) typing
|
|
*/
|
|
static bool canSendTypingStart();
|
|
|
|
/*
|
|
* 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, bool fIgnoreOpen = false);
|
|
|
|
/*
|
|
* Returns true if an avatar's name should be hidden for the requested operation/context
|
|
* (This is used to hide an avatar name in one case but not a near-identical case - such as teleporting a friend vs a nearby agent -
|
|
* in a way that limits the amount of code that needs to be changed to carry context from one function to another)
|
|
*/
|
|
enum EShowNamesContext { SNC_DEFAULT = 0, SNC_TELEPORTOFFER, SNC_TELEPORTREQUEST, SNC_COUNT };
|
|
static bool canShowName(EShowNamesContext eContext, const LLUUID& idAgent = LLUUID::null);
|
|
static bool canShowNameTag(const LLVOAvatar* pAvatar);
|
|
static void setShowName(EShowNamesContext eContext, bool fCanShowName) { if ( (eContext < SNC_COUNT) && (isRlvEnabled()) ) { s_BlockNamesContexts[eContext] = !fCanShowName; } }
|
|
|
|
/*
|
|
* Returns true if the user is allowed to see the presence of nearby avatars in UI elements (anonymized or otherwise)
|
|
*/
|
|
static bool canShowNearbyAgents();
|
|
|
|
/*
|
|
* Checks if the user is allowed to use the specified volume in (main) chat and returns the appropriate chat volume type
|
|
*/
|
|
static EChatType checkChatVolume(EChatType chatType);
|
|
|
|
protected:
|
|
// Backwards logic so that we can initialize to 0 and it won't block when we forget to/don't check if RLVa is disabled
|
|
static bool s_BlockNamesContexts[SNC_COUNT];
|
|
|
|
// =========
|
|
// Inventory
|
|
// =========
|
|
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 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
|
|
// ========
|
|
public:
|
|
/*
|
|
* Returns true if the user can accept an incoming teleport offer from the specified avatar
|
|
*/
|
|
static bool canAcceptTpOffer(const LLUUID& idSender);
|
|
|
|
/*
|
|
* Returns true if a teleport offer from the specified avatar should be auto-accepted
|
|
* (pass the null UUID to check if all teleport offers should be auto-accepted regardless of sender)
|
|
*/
|
|
static bool autoAcceptTeleportOffer(const LLUUID& idSender);
|
|
|
|
/*
|
|
* Returns true if the user can accept an incoming teleport request from the specified avatar
|
|
*/
|
|
static bool canAcceptTpRequest(const LLUUID& idSender);
|
|
|
|
/*
|
|
* Returns true if a teleport request from the specified avatar should be auto-accepted
|
|
* (pass the null UUID to check if all teleport requests should be auto-accepted regardless of requester)
|
|
*/
|
|
static bool autoAcceptTeleportRequest(const LLUUID& idRequester);
|
|
|
|
/*
|
|
* Returns true if the user can fly
|
|
* (NOTE: the parameter-less overload takes the currently executing command into account)
|
|
*/
|
|
static bool canFly();
|
|
static bool canFly(const LLUUID& idRlvObjExcept);
|
|
|
|
/*
|
|
* Returns true if the user can jump
|
|
*/
|
|
static bool canJump();
|
|
|
|
// ===========
|
|
// Teleporting
|
|
// ===========
|
|
public:
|
|
/*
|
|
* Returns true if the user can teleport locally (short distances)
|
|
*/
|
|
static bool canTeleportToLocal(const LLVector3d& posGlobal);
|
|
|
|
/*
|
|
* Returns true if the user can teleport to a (remote) location
|
|
*/
|
|
static bool canTeleportToLocation();
|
|
|
|
/*
|
|
* Returns true if the teleport is considered local (e.g. double-click tp)
|
|
*/
|
|
static bool isLocalTp(const LLVector3d& posGlobal);
|
|
|
|
// =========
|
|
// WindLight
|
|
// =========
|
|
public:
|
|
/*
|
|
* Returns true if the user can make changes to their WindLight environment
|
|
*/
|
|
static bool canChangeEnvironment(const LLUUID& idRlvObject = LLUUID::null);
|
|
|
|
/*
|
|
* Returns true if a postprocessing shader is currently active
|
|
*/
|
|
static bool hasPostProcess();
|
|
|
|
// =================
|
|
// World interaction
|
|
// =================
|
|
// Terminology:
|
|
// - build : <todo>
|
|
// - edit : ability to get access an object from the build floater, or being able to look at its contents (i.e. open)
|
|
// - interact : ability to interact with an object/avatar in any way or shape (i.e. touch, edit, click, grab, move, ...)
|
|
// - rez : ability to rez new objects (from either inventory or through the create tool)
|
|
// - touch : singularly refers to the ability to either invoke the scripted touch handler, or perform a physical grab
|
|
public:
|
|
/*
|
|
* Returns true if the user can build (= access the build tools)
|
|
*/
|
|
static bool canBuild();
|
|
|
|
/*
|
|
* Returns true if the user can buy an object set for sale
|
|
*/
|
|
static bool canBuyObject(const LLUUID& idObj);
|
|
|
|
/*
|
|
* Returns true if the user can edit all, some, or nothing (used to bail early, or to skip expensive selection checks)
|
|
*/
|
|
static bool canEdit(ERlvCheckType eCheckType);
|
|
|
|
/*
|
|
* Returns true if the user can edit the specified object (with an optional relative offset)
|
|
*/
|
|
static bool canEdit(const LLViewerObject* pObj);
|
|
|
|
/*
|
|
* Returns true if the user can sit on the ground
|
|
*/
|
|
static bool canGroundSit();
|
|
static bool canGroundSit(const LLUUID& idRlvObjExcept);
|
|
|
|
/*
|
|
* Returns true if the user can interact with the specified object (with an optional relative offset)
|
|
* (returns true if pObj == nullptr to not short circuit calling code)
|
|
*/
|
|
static bool canInteract(const LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero);
|
|
|
|
/*
|
|
* Returns true if the user can pay an avatar
|
|
*/
|
|
static bool canPayAvatar(const LLUUID& idAvatar);
|
|
|
|
/*
|
|
* Returns true if the user can pay an object (i.e. vendor)
|
|
*/
|
|
static bool canPayObject(const LLUUID& idObj);
|
|
|
|
/*
|
|
* Returns true if the user can rez new objects (from inventory or through the create tool)
|
|
*/
|
|
static bool canRez();
|
|
|
|
/*
|
|
* Returns true if the user can see the hovertext associated with the specified object
|
|
*/
|
|
static bool canShowHoverText(const LLViewerObject* pObj);
|
|
|
|
/*
|
|
* 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 see their in-world location
|
|
*/
|
|
static bool canShowLocation();
|
|
|
|
/*
|
|
* 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);
|
|
|
|
// ===============
|
|
// World (General)
|
|
// ===============
|
|
public:
|
|
/*
|
|
* Returns true if the user can highlight transparent faces
|
|
*/
|
|
static bool canHighlightTransparent();
|
|
|
|
/*
|
|
* Returns true if the user can switch to wireframe rendering
|
|
*/
|
|
static bool canViewWireframe();
|
|
|
|
// ================
|
|
// Helper functions
|
|
// ================
|
|
public:
|
|
/*
|
|
* Convenience function to get the current/active value of a behaviour modifier
|
|
*/
|
|
template<typename T> static const T& getModifierValue(ERlvBehaviourModifier eBhvrMod);
|
|
|
|
/*
|
|
* Convenience function to check for a behaviour without having to include rlvhandler.h.
|
|
* Do NOT call this function if speed is important (i.e. per-frame)
|
|
*/
|
|
static bool hasBehaviour(ERlvBehaviour eBhvr);
|
|
|
|
/*
|
|
* Returns true if a - P2P or group - IM session is open with the specified UUID
|
|
*/
|
|
static bool hasOpenP2PSession(const LLUUID& idAgent);
|
|
static bool hasOpenGroupSession(const LLUUID& idGroup);
|
|
|
|
/*
|
|
* Convenience function to check if RLVa is enabled without having to include rlvhandler.h
|
|
*/
|
|
static bool isRlvEnabled();
|
|
|
|
/*
|
|
* Shows one of the blocked toast notifications (see rlva_strings.xml)
|
|
*/
|
|
#ifdef CATZNIP_STRINGVIEW
|
|
static void notifyBlocked(const boost::string_view& strNotifcation, const LLSD& sdArgs = LLSD());
|
|
#else
|
|
static void notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs = LLSD());
|
|
#endif // CATZNIP_STRINGVIEW
|
|
};
|
|
|
|
// ============================================================================
|
|
|
|
#endif // RLV_ACTIONS_H
|