From 6acc366b35b99049010dde076b46e5a7206c1332 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Fri, 3 Apr 2020 23:48:36 -0400
Subject: [PATCH] Add options to disable point at beam and spiral effects

---
 .../newview/app_settings/settings_alchemy.xml | 22 ++++++++
 indra/newview/llagentcamera.cpp               | 16 ++++--
 indra/newview/llappviewer.cpp                 | 13 +++--
 indra/newview/llgiveinventory.cpp             | 26 ++++++----
 indra/newview/llselectmgr.cpp                 | 17 +++---
 indra/newview/llstartup.cpp                   |  2 +-
 indra/newview/lltooldraganddrop.cpp           | 52 ++++++++++++-------
 indra/newview/lltoolpie.cpp                   |  5 ++
 indra/newview/lltoolplacer.cpp                | 15 +++---
 indra/newview/lltoolselect.cpp                |  3 +-
 indra/newview/llviewermenu.cpp                | 11 ++--
 indra/newview/llviewermessage.cpp             | 22 +++++---
 indra/newview/llvoavatarself.cpp              |  3 +-
 13 files changed, 139 insertions(+), 68 deletions(-)

diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index ecf73234be6..612c2bab8c6 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -211,6 +211,17 @@
       <key>Value</key>
       <string>/tp2cam</string>
     </map>
+    <key>AlchemyDisableEffectSpiral</key>
+    <map>
+      <key>Comment</key>
+      <string>Disable spiral effects</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>AlchemyLookAtShow</key>
     <map>
       <key>Comment</key>
@@ -288,6 +299,17 @@
       <key>Value</key>
       <real>380.0</real>
     </map>
+    <key>AlchemyPointAtPrivate</key>
+    <map>
+      <key>Comment</key>
+      <string>Disable setting current point at target</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>AlchemyRainbowEffects</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 1c600f5875f..bb83e303acf 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -2777,13 +2777,11 @@ BOOL LLAgentCamera::setLookAt(ELookAtType target_type, LLViewerObject *object, L
 	static LLCachedControl<bool> isPrivate(gSavedSettings, "AlchemyLookAtPrivate", false);
 	if (isPrivate)
 	{
-		if(!mLookAt || mLookAt->isDead())
-			return FALSE;
-
+		target_type = LOOKAT_TARGET_CLEAR;
+		object = nullptr;
 		position.clearVec();
-		return mLookAt->setLookAt(LOOKAT_TARGET_NONE, gAgentAvatarp, position);
 	}
-	if(object && object->isAttachment())
+	else if(object && object->isAttachment())
 	{
 		LLViewerObject* parent = object;
 		while(parent)
@@ -2900,6 +2898,14 @@ BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object,
 	{
 		return FALSE;
 	}
+
+	static LLCachedControl<bool> disablePointAt(gSavedSettings, "AlchemyPointAtPrivate", false);
+	if (disablePointAt)
+	{
+		target_type = POINTAT_TARGET_CLEAR;
+		object = nullptr;
+		position.clear();
+	}
 	if (!mPointAt || mPointAt->isDead())
 	{
 		mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 7ed74a70c6e..5f420d2b8d3 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -4014,11 +4014,14 @@ void LLAppViewer::requestQuit()
 		gAgentAvatarp->updateAvatarRezMetrics(true); // force a last packet to be sent.
 	}
 
-	LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
-	effectp->setPositionGlobal(gAgent.getPositionGlobal());
-	effectp->setColor(LLColor4U(gAgent.getEffectColor()));
-	LLHUDManager::getInstance()->sendEffects();
-	effectp->markDead() ;//remove it.
+	if (!gSavedSettings.getBOOL("AlchemyDisableEffectSpiral"))
+	{
+		LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
+		effectp->setPositionGlobal(gAgent.getPositionGlobal());
+		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+		LLHUDManager::getInstance()->sendEffects();
+		effectp->markDead();//remove it.
+	}
 
 	// Attempt to close all floaters that might be
 	// editing things.
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index ca0054375a0..9534f724707 100644
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -437,11 +437,14 @@ void LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent,
 	gAgent.sendReliableMessage();
 
 	// VEFFECT: giveInventory
-	LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
-	effectp->setSourceObject(gAgentAvatarp);
-	effectp->setTargetObject(gObjectList.findObject(to_agent));
-	effectp->setDuration(LL_HUD_DUR_SHORT);
-	effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+	if (!gSavedSettings.getBOOL("AlchemyPointAtPrivate"))
+	{
+		LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+		effectp->setSourceObject(gAgentAvatarp);
+		effectp->setTargetObject(gObjectList.findObject(to_agent));
+		effectp->setDuration(LL_HUD_DUR_SHORT);
+		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+	}
 	gFloaterTools->dirty();
 
 	LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY);
@@ -611,11 +614,14 @@ bool LLGiveInventory::commitGiveInventoryCategory(const LLUUID& to_agent,
 		delete[] bucket;
 
 		// VEFFECT: giveInventoryCategory
-		LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
-		effectp->setSourceObject(gAgentAvatarp);
-		effectp->setTargetObject(gObjectList.findObject(to_agent));
-		effectp->setDuration(LL_HUD_DUR_SHORT);
-		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+		if (!gSavedSettings.getBOOL("AlchemyPointAtPrivate"))
+		{
+			LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+			effectp->setSourceObject(gAgentAvatarp);
+			effectp->setTargetObject(gObjectList.findObject(to_agent));
+			effectp->setDuration(LL_HUD_DUR_SHORT);
+			effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+		}
 		gFloaterTools->dirty();
 
 		LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY);
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index acd039e411b..fe45467b8a4 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -1752,12 +1752,15 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
 			if (!mItem)
 			{
 				object->sendTEUpdate();
-				// 1 particle effect per object				
-				LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
-				effectp->setSourceObject(gAgentAvatarp);
-				effectp->setTargetObject(object);
-				effectp->setDuration(LL_HUD_DUR_SHORT);
-				effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+				if (!gSavedSettings.getBOOL("AlchemyPointAtPrivate"))
+				{
+					// 1 particle effect per object				
+					LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+					effectp->setSourceObject(gAgentAvatarp);
+					effectp->setTargetObject(object);
+					effectp->setDuration(LL_HUD_DUR_SHORT);
+					effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+				}
 			}
 			return true;
 		}
@@ -3737,7 +3740,7 @@ bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response,
                                                           (void*) &info,
                                                           SEND_ONLY_ROOTS);
 			// VEFFECT: Delete Object - one effect for all deletes
-			if (LLSelectMgr::getInstance()->mSelectedObjects->mSelectType != SELECT_TYPE_HUD)
+			if (!gSavedSettings.getBOOL("AlchemyDisableEffectSpiral") && (LLSelectMgr::getInstance()->mSelectedObjects->mSelectType != SELECT_TYPE_HUD))
 			{
 				LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
 				effectp->setPositionGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal() );
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 1664587fd81..a38679f3121 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1596,7 +1596,7 @@ bool idle_startup()
 
 		// Create login effect
 		// But not on first login, because you can't see your avatar then
-		if (!gAgent.isFirstLogin())
+		if (!gAgent.isFirstLogin()&& !gSavedSettings.getBOOL("AlchemyDisableEffectSpiral"))
 		{
 			LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
 			effectp->setPositionGlobal(gAgent.getPositionGlobal());
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 7044a1827e9..ce323e22445 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1221,11 +1221,14 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj,
 		gFloaterTools->dirty();
 
 		// VEFFECT: SetScript
-		LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
-		effectp->setSourceObject(gAgentAvatarp);
-		effectp->setTargetObject(hit_obj);
-		effectp->setDuration(LL_HUD_DUR_SHORT);
-		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+		if (!gSavedSettings.getBOOL("AlchemyPointAtPrivate"))
+		{
+			LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+			effectp->setSourceObject(gAgentAvatarp);
+			effectp->setTargetObject(hit_obj);
+			effectp->setDuration(LL_HUD_DUR_SHORT);
+			effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+		}
 	}
 }
 
@@ -1390,11 +1393,14 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
 	}
 
 	// VEFFECT: DropObject
-	LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
-	effectp->setSourceObject(gAgentAvatarp);
-	effectp->setPositionGlobal(mLastHitPos);
-	effectp->setDuration(LL_HUD_DUR_SHORT);
-	effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+	if (!gSavedSettings.getBOOL("AlchemyPointAtPrivate"))
+	{
+		LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+		effectp->setSourceObject(gAgentAvatarp);
+		effectp->setPositionGlobal(mLastHitPos);
+		effectp->setDuration(LL_HUD_DUR_SHORT);
+		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+	}
 
 	add(LLStatViewer::OBJECT_REZ, 1);
 }
@@ -1453,11 +1459,14 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj,
 	}
 
 	// VEFFECT: AddToInventory
-	LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
-	effectp->setSourceObject(gAgentAvatarp);
-	effectp->setTargetObject(hit_obj);
-	effectp->setDuration(LL_HUD_DUR_SHORT);
-	effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+	if (!gSavedSettings.getBOOL("AlchemyPointAtPrivate"))
+	{
+		LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+		effectp->setSourceObject(gAgentAvatarp);
+		effectp->setTargetObject(hit_obj);
+		effectp->setDuration(LL_HUD_DUR_SHORT);
+		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+	}
 	gFloaterTools->dirty();
 }
 
@@ -2057,11 +2066,14 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
 		}
 		
 		// VEFFECT: SetTexture
-		LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
-		effectp->setSourceObject(gAgentAvatarp);
-		effectp->setTargetObject(obj);
-		effectp->setDuration(LL_HUD_DUR_SHORT);
-		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+		if (!gSavedSettings.getBOOL("AlchemyPointAtPrivate"))
+		{
+			LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+			effectp->setSourceObject(gAgentAvatarp);
+			effectp->setTargetObject(obj);
+			effectp->setDuration(LL_HUD_DUR_SHORT);
+			effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+		}
 	}
 
 	// enable multi-drop, although last texture will win
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index aedf03219e2..a1a063b1110 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1999,6 +1999,11 @@ BOOL LLToolPie::handleRightClickPick()
 
 void LLToolPie::showVisualContextMenuEffect()
 {
+	if (gSavedSettings.getBOOL("AlchemyDisableEffectSpiral"))
+	{
+		return;
+	}
+
 	// VEFFECT: ShowPie
 	LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
 	effectp->setPositionGlobal(mPick.mPosGlobal);
diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp
index 864d0d77b02..a3d13ed8435 100644
--- a/indra/newview/lltoolplacer.cpp
+++ b/indra/newview/lltoolplacer.cpp
@@ -443,12 +443,15 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )
 		gViewerWindow->getWindow()->incBusyCount();
 	}
 
-	// VEFFECT: AddObject
-	LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
-	effectp->setSourceObject((LLViewerObject*)gAgentAvatarp);
-	effectp->setPositionGlobal(regionp->getPosGlobalFromRegion(ray_end_region));
-	effectp->setDuration(LL_HUD_DUR_SHORT);
-	effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+	if (!gSavedSettings.getBOOL("AlchemyPointAtPrivate"))
+	{
+		// VEFFECT: AddObject
+		LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+		effectp->setSourceObject((LLViewerObject*)gAgentAvatarp);
+		effectp->setPositionGlobal(regionp->getPosGlobalFromRegion(ray_end_region));
+		effectp->setDuration(LL_HUD_DUR_SHORT);
+		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+	}
 
 	add(LLStatViewer::OBJECT_CREATE, 1);
 
diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp
index 3a956aaa91d..aa9e2b17881 100644
--- a/indra/newview/lltoolselect.cpp
+++ b/indra/newview/lltoolselect.cpp
@@ -224,7 +224,8 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi
 			LLSelectMgr::getInstance()->setAgentHUDZoom(target_zoom, current_zoom);
 		}
 
-		if (!gAgentCamera.getFocusOnAvatar() &&										// if camera not glued to avatar
+		static LLCachedControl<bool> disablePointAt(gSavedSettings, "AlchemyPointAtPrivate", false);
+		if (!disablePointAt && !gAgentCamera.getFocusOnAvatar() &&										// if camera not glued to avatar
 			LLVOAvatar::findAvatarFromAttachment(object) != gAgentAvatarp &&	// and it's not one of your attachments
 			object != gAgentAvatarp)									// and it's not you
 		{
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index b3eea482c09..85fac2db26b 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -4633,10 +4633,13 @@ static void derez_objects(
 				LLViewerObject* object = objectsp->at(object_index++);
 				msg->nextBlockFast(_PREHASH_ObjectData);
 				msg->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID());
-				// VEFFECT: DerezObject
-				LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
-				effectp->setPositionGlobal(object->getPositionGlobal());
-				effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+				if (!gSavedSettings.getBOOL("AlchemyDisableEffectSpiral"))
+				{
+					// VEFFECT: DerezObject
+					LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
+					effectp->setPositionGlobal(object->getPositionGlobal());
+					effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+				}
 			}
 			msg->sendReliable(first_region->getHost());
 		}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 4da3f9531fc..3e98d8ff900 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3187,10 +3187,13 @@ void process_teleport_finish(LLMessageSystem* msg, void**)
 
 	// Do teleport effect for where you're leaving
 	// VEFFECT: TeleportStart
-	LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
-	effectp->setPositionGlobal(gAgent.getPositionGlobal());
-	effectp->setColor(LLColor4U(gAgent.getEffectColor()));
-	LLHUDManager::getInstance()->sendEffects();
+	if (!gSavedSettings.getBOOL("AlchemyDisableEffectSpiral"))
+	{
+		LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
+		effectp->setPositionGlobal(gAgent.getPositionGlobal());
+		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+		LLHUDManager::getInstance()->sendEffects();
+	}
 
 	U32 location_id;
 	U32 sim_ip;
@@ -3274,11 +3277,14 @@ void process_teleport_finish(LLMessageSystem* msg, void**)
 
 	// Now do teleport effect for where you're going.
 	// VEFFECT: TeleportEnd
-	effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
-	effectp->setPositionGlobal(gAgent.getPositionGlobal());
+	if (!gSavedSettings.getBOOL("AlchemyDisableEffectSpiral"))
+	{
+		auto effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
+		effectp->setPositionGlobal(gAgent.getPositionGlobal());
 
-	effectp->setColor(LLColor4U(gAgent.getEffectColor()));
-	LLHUDManager::getInstance()->sendEffects();
+		effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+		LLHUDManager::getInstance()->sendEffects();
+	}
 
 //	gTeleportDisplay = TRUE;
 //	gTeleportDisplayTimer.reset();
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 61ad196f3ba..0ccf7f5bf15 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -982,8 +982,9 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
 //virtual
 void LLVOAvatarSelf::idleUpdateTractorBeam()
 {
+	static LLCachedControl<bool> pointAtDisable(gSavedSettings, "AlchemyPointAtPrivate");
 	// This is only done for yourself (maybe it should be in the agent?)
-	if (!needsRenderBeam() || !isBuilt())
+	if (pointAtDisable || !needsRenderBeam() || !isBuilt())
 	{
 		mBeam = NULL;
 	}
-- 
GitLab