Imported from Kokua (originally by ArminW) - disable broadcast your lookat and disable hand movement when editing (not fully working)

The menu options (develop -> avatar-> Privet Look At and Privet Point At) are always checked, regardless of the actual state.
meow-7.2.2
Tank_Master 2011-03-02 01:16:40 -08:00
parent ce475706ca
commit 8ee4482c42
8 changed files with 195 additions and 22 deletions

View File

@ -499,6 +499,28 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>PrivateLookAtTarget</key>
<map>
<key>Comment</key>
<string>If true, viewer shows simulated look-at behavior to others.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PrivatePointAtTarget</key>
<map>
<key>Comment</key>
<string>If true, viewer won't show the editing arm motion.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ArrowKeysAlwaysMove</key>
<map>
<key>Comment</key>

View File

@ -2762,7 +2762,8 @@ void LLAgentCamera::lookAtLastChat()
BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position)
{
// disallow pointing at attachments and avatars
if (object && (object->isAttachment() || object->isAvatar()))
bool private_pointat = gSavedSettings.getBOOL("PrivatePointAtTarget");//this is the editing arm motion
if (object && (object->isAttachment() || object->isAvatar() || private_pointat))
{
return FALSE;
}

View File

@ -76,9 +76,29 @@ LLHUDEffectBeam::~LLHUDEffectBeam()
void LLHUDEffectBeam::packData(LLMessageSystem *mesgsys)
{
if (!mSourceObject)
LLViewerObject* source_object = (LLViewerObject*)mSourceObject;
if (!source_object)
{
markDead();
return;
}
else if (!source_object->isAvatar())
{
llwarns << "Missing source object!" << llendl;
LL_DEBUGS("HUDEffect")<<"Non-Avatar HUDEffectBeam message for ID: "
<< source_object->getID().asString()<< LL_ENDL;
markDead();
return;
}
else
{
LLVOAvatar* source_avatar = (LLVOAvatar*)source_object;
if (!source_avatar->isSelf())
{
LL_DEBUGS("HUDEffect")<<"Non-self HUDEffectBeam message for ID: "
<< source_avatar->getID().asString()<< LL_ENDL;
markDead();
return;
}
}
// Pack the default data

View File

@ -42,7 +42,7 @@
#include "llxmltree.h"
#include "llviewercontrol.h"
BOOL LLHUDEffectLookAt::sDebugLookAt = FALSE;
@ -262,36 +262,70 @@ LLHUDEffectLookAt::~LLHUDEffectLookAt()
//-----------------------------------------------------------------------------
void LLHUDEffectLookAt::packData(LLMessageSystem *mesgsys)
{
// Pack the default data
LLHUDEffect::packData(mesgsys);
// Pack the type-specific data. Uses a fun packed binary format. Whee!
U8 packed_data[PKT_SIZE];
memset(packed_data, 0, PKT_SIZE);
// pack both target object and position
// position interpreted as offset if target object is non-null
ELookAtType target_type = mTargetType;
LLVector3d target_offset_global = mTargetOffsetGlobal;
LLViewerObject* target_object = (LLViewerObject*)mTargetObject;
LLViewerObject* source_object = (LLViewerObject*)mSourceObject;
LLVOAvatar* source_avatar = NULL;
if (!source_object)//kokua TODO: find out why this happens at all and fix there
{
LL_DEBUGS("HUDEffect")<<"NULL-Object HUDEffectLookAt message" << LL_ENDL;
markDead();
return;
}
if (source_object->isAvatar())
{
source_avatar = (LLVOAvatar*)source_object;
}
else //kokua TODO: find out why this happens at all and fix there
{
LL_DEBUGS("HUDEffect")<<"Non-Avatar HUDEffectLookAt message for ID: " << source_object->getID().asString()<< LL_ENDL;
markDead();
return;
}
bool is_self = source_avatar->isSelf();
bool is_private = gSavedSettings.getBOOL("PrivateLookAtTarget");
if (!is_self) //kokua TODO: find out why this happens at all and fix there
{
LL_DEBUGS("HUDEffect")<< "Non-self Avatar HUDEffectLookAt message for ID: " << source_avatar->getID().asString() << LL_ENDL;
markDead();
return;
}
else if (is_private && target_type != LOOKAT_TARGET_AUTO_LISTEN)
{
//this mimicks "do nothing"
target_type = LOOKAT_TARGET_AUTO_LISTEN;
target_offset_global.setVec(2.5, 0.0, 0.0);
target_object = mSourceObject;
}
// Pack the default data
LLHUDEffect::packData(mesgsys);
// Pack the type-specific data. Uses a fun packed binary format. Whee!
U8 packed_data[PKT_SIZE];
memset(packed_data, 0, PKT_SIZE);
if (mSourceObject)
{
htonmemcpy(&(packed_data[SOURCE_AVATAR]), mSourceObject->mID.mData, MVT_LLUUID, 16);
}
else
else //um ... we already returned ... how's that the case?
{
htonmemcpy(&(packed_data[SOURCE_AVATAR]), LLUUID::null.mData, MVT_LLUUID, 16);
}
// pack both target object and position
// position interpreted as offset if target object is non-null
if (mTargetObject)
{
htonmemcpy(&(packed_data[TARGET_OBJECT]), mTargetObject->mID.mData, MVT_LLUUID, 16);
htonmemcpy(&(packed_data[TARGET_OBJECT]), target_object->mID.mData, MVT_LLUUID, 16);
}
else
{
htonmemcpy(&(packed_data[TARGET_OBJECT]), LLUUID::null.mData, MVT_LLUUID, 16);
}
htonmemcpy(&(packed_data[TARGET_POS]), mTargetOffsetGlobal.mdV, MVT_LLVector3d, 24);
htonmemcpy(&(packed_data[TARGET_POS]), target_offset_global.mdV, MVT_LLVector3d, 24);
U8 lookAtTypePacked = (U8)mTargetType;
U8 lookAtTypePacked = (U8)target_type;
htonmemcpy(&(packed_data[LOOKAT_TYPE]), &lookAtTypePacked, MVT_U8, 1);
@ -358,11 +392,17 @@ void LLHUDEffectLookAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
{
//llwarns << "Could not find target object for lookat effect" << llendl;
}
U8 lookAtTypeUnpacked = 0;
htonmemcpy(&lookAtTypeUnpacked, &(packed_data[LOOKAT_TYPE]), MVT_U8, 1);
mTargetType = (ELookAtType)lookAtTypeUnpacked;
if ((U8)LOOKAT_NUM_TARGETS > lookAtTypeUnpacked)
{
mTargetType = (ELookAtType)lookAtTypeUnpacked;
}
else
{
mTargetType = LOOKAT_TARGET_NONE;
LL_DEBUGS("HUDEffect") << "Invalid target type: " << lookAtTypeUnpacked << LL_ENDL;
}
if (mTargetType == LOOKAT_TARGET_NONE)
{
clearLookAtTarget();

View File

@ -98,6 +98,30 @@ LLHUDEffectPointAt::~LLHUDEffectPointAt()
//-----------------------------------------------------------------------------
void LLHUDEffectPointAt::packData(LLMessageSystem *mesgsys)
{
LLViewerObject* source_object = (LLViewerObject*)mSourceObject;
if (!source_object)
{
markDead();
return;
}
else if (!source_object->isAvatar())
{
LL_DEBUGS("HUDEffect")<<"Non-Avatar HUDEffectPointAt message for ID: "
<< source_object->getID().asString()<< LL_ENDL;
markDead();
return;
}
else
{
LLVOAvatar* source_avatar = (LLVOAvatar*)source_object;
if (!source_avatar->isSelf())
{
LL_DEBUGS("HUDEffect")<<"Non-self HUDEffectPointAt message for ID: "
<< source_avatar->getID().asString()<< LL_ENDL;
markDead();
return;
}
}
// Pack the default data
LLHUDEffect::packData(mesgsys);

View File

@ -99,7 +99,8 @@ void LLHUDManager::sendEffects()
msg->nextBlockFast(_PREHASH_Effect);
hep->packData(msg);
hep->setNeedsSendToSim(FALSE);
gAgent.sendMessage();
if (!hep->isDead()) //packData(msg) might have invalidated the effect
gAgent.sendMessage();
}
}
}

View File

@ -1702,6 +1702,49 @@ class LLAdvancedCheckShowPointAt : public view_listener_t
};
/////////////////////
// PRIVATE LOOK AT //
/////////////////////
class LLAdvancedTogglePrivateLookPointAt : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
std::string command = userdata.asString();
if ("Look" == command)
{
bool new_value = !gSavedSettings.getBOOL("PrivateLookAtTarget");
gSavedSettings.setBOOL("PrivateLookAtTarget", new_value);
}
else if ("Point" == command)
{
bool new_value = !gSavedSettings.getBOOL("PrivatePointAtTarget");
gSavedSettings.setBOOL("PrivatePointAtTarget", new_value);
}
return true;
}
};
class LLAdvancedCheckPrivateLookPointAt : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
std::string command = userdata["data"].asString();
if ("Look" == command)
{
bool new_value = gSavedSettings.getBOOL("PrivateLookAtTarget");
std::string control_name = userdata["control"].asString();
gMenuHolder->findControl(control_name)->setValue(new_value);
}
else if ("Point" == command)
{
bool new_value = gSavedSettings.getBOOL("PrivatePointAtTarget");
std::string control_name = userdata["control"].asString();
gMenuHolder->findControl(control_name)->setValue(new_value);
}
return true;
}
};
/////////////////////////
// DEBUG JOINT UPDATES //
@ -8453,6 +8496,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedCheckShowLookAt(), "Advanced.CheckShowLookAt");
view_listener_t::addMenu(new LLAdvancedToggleShowPointAt(), "Advanced.ToggleShowPointAt");
view_listener_t::addMenu(new LLAdvancedCheckShowPointAt(), "Advanced.CheckShowPointAt");
view_listener_t::addMenu(new LLAdvancedTogglePrivateLookPointAt(), "Advanced.TogglePrivateLookPointAt");
view_listener_t::addMenu(new LLAdvancedCheckPrivateLookPointAt(), "Advanced.CheckPrivateLookPointAt");
view_listener_t::addMenu(new LLAdvancedToggleDebugJointUpdates(), "Advanced.ToggleDebugJointUpdates");
view_listener_t::addMenu(new LLAdvancedCheckDebugJointUpdates(), "Advanced.CheckDebugJointUpdates");
view_listener_t::addMenu(new LLAdvancedToggleDisableLOD(), "Advanced.ToggleDisableLOD");

View File

@ -3261,7 +3261,27 @@
<menu_item_check.on_click
function="Advanced.ToggleShowPointAt" />
</menu_item_check>
<menu_item_check
<menu_item_check
label="Private Look At"
name="Private Look At">
<menu_item_check.on_click
function="Advanced.TogglePrivateLookPointAt"
parameter="Look" />
<menu_item_check.on_check
function="Advanced.CheckPrivateLookPointAt"
parameter="Look" />
</menu_item_check>
<menu_item_check
label="Private Point At"
name="Private Point At">
<menu_item_check.on_click
function="Advanced.TogglePrivateLookPointAt"
parameter="Point" />
<menu_item_check.on_check
function="Advanced.CheckPrivateLookPointAt"
parameter="Point" />
</menu_item_check>
<menu_item_check
label="Debug Joint Updates"
name="Debug Joint Updates">
<menu_item_check.on_check