diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 22b1a3bfe..66ba02320 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -136,7 +136,9 @@
#include "llappviewer.h"
#include "llviewerjoystick.h"
#include "llfollowcam.h"
-
+//
+#include "llworldmapmessage.h"
+//
using namespace LLVOAvatarDefines;
extern LLMenuBarGL* gMenuBarView;
@@ -222,7 +224,6 @@ LLAgent gAgent;
//
// For MapBlockReply funk 'cause I dunno what I'm doing
-/* not *quite* there yet, and I don't want to break head.
BOOL LLAgent::lure_show = FALSE;
std::string LLAgent::lure_name;
LLVector3d LLAgent::lure_posglobal;
@@ -232,7 +233,7 @@ int LLAgent::lure_x;
int LLAgent::lure_y;
int LLAgent::lure_z;
std::string LLAgent::lure_maturity;
-*/
+
//
const F32 LLAgent::TYPING_TIMEOUT_SECS = 5.f;
@@ -8019,5 +8020,60 @@ std::string LLAgent::getCapability(const std::string& name) const
}
return iter->second;
}
+//
+
+void LLAgent::showLureDestination(const std::string fromname, const int global_x, const int global_y, const int x, const int y, const int z, const std::string maturity)
+{
+ const LLVector3d posglobal = LLVector3d(F64(global_x), F64(global_y), F64(0));
+ LLSimInfo* siminfo;
+ siminfo = LLWorldMap::getInstance()->simInfoFromPosGlobal(posglobal);
+ if(siminfo)
+ {
+ llinfos << fromname << "'s teleport lure is to " << siminfo->getName() << " (" << maturity << ")" << llendl;
+ std::string url = LLURLDispatcher::buildSLURL(siminfo->getName(), S32(x), S32(y), S32(z));
+ std::string msg;
+ msg = llformat("%s's teleport lure is to %s", fromname.c_str(), url.c_str());
+ if(maturity != "")
+ msg.append(llformat(" (%s)", maturity.c_str()));
+ LLChat chat(msg);
+ LLFloaterChat::addChat(chat);
+ }
+ else
+ {
+ LLAgent::lure_show = TRUE;
+ LLAgent::lure_name = fromname;
+ LLAgent::lure_posglobal = posglobal;
+ LLAgent::lure_global_x = U16(global_x / 256);
+ LLAgent::lure_global_y = U16(global_y / 256);
+ LLAgent::lure_x = x;
+ LLAgent::lure_y = y;
+ LLAgent::lure_z = z;
+ LLAgent::lure_maturity = maturity;
+ LLWorldMapMessage::getInstance()->sendMapBlockRequest(lure_global_x, lure_global_y, lure_global_x, lure_global_y, true);
+ }
+}
+
+void LLAgent::onFoundLureDestination()
+{
+ LLAgent::lure_show = FALSE;
+ LLSimInfo* siminfo;
+ siminfo = LLWorldMap::getInstance()->simInfoFromPosGlobal(LLAgent::lure_posglobal);
+ if(siminfo)
+ {
+ llinfos << LLAgent::lure_name << "'s teleport lure is to " << siminfo->getName() << " (" << LLAgent::lure_maturity << ")" << llendl;
+ std::string url = LLURLDispatcher::buildSLURL(siminfo->getName(), S32(LLAgent::lure_x), S32(LLAgent::lure_y), S32(LLAgent::lure_z));
+ std::string msg;
+ msg = llformat("%s's teleport lure is to %s", LLAgent::lure_name.c_str(), url.c_str());
+ if(LLAgent::lure_maturity != "")
+ msg.append(llformat(" (%s)", LLAgent::lure_maturity.c_str()));
+ LLChat chat(msg);
+ LLFloaterChat::addChat(chat);
+ }
+ else
+ llwarns << "Grand scheme failed" << llendl;
+}
+
+//
+
// EOF
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 14f4a84f2..9eff0a5db 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -775,6 +775,18 @@ public:
BOOL mInitialized;
+ //
+ static BOOL lure_show;
+ static std::string lure_name;
+ static LLVector3d lure_posglobal;
+ static U16 lure_global_x;
+ static U16 lure_global_y;
+ static int lure_x;
+ static int lure_y;
+ static int lure_z;
+ static std::string lure_maturity;
+ //
+
S32 mNumPendingQueries;
S32* mActiveCacheQueries;
@@ -789,6 +801,11 @@ public:
LLFrameTimer mDoubleTapRunTimer;
EDoubleTapRunMode mDoubleTapRunMode;
+
+ //
+ static void showLureDestination(const std::string fromname, const int global_x, const int global_y, const int x, const int y, const int z, const std::string maturity);
+ static void onFoundLureDestination();
+ //
private:
bool mbTeleportKeepsLookAt; // try to keep look-at after teleport is complete
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 2539bc62f..dc96f9d72 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -139,8 +139,8 @@
#include "llviewerdisplay.h"
#include "llkeythrottle.h"
#include "lltranslate.h"
-//
-#include "llviewernetwork.h"
+//
+#include "llviewernetwork.h"
//
#include
@@ -264,10 +264,10 @@ static LLNotificationFunctorRegistration friendship_offer_callback_reg_nm("Offer
void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group,
S32 trx_type, const std::string& desc)
{
- //
- //if(0 == amount || !region) return;
- if(!region) return;
- //
+ //
+ //if(0 == amount || !region) return;
+ if(!region) return;
+ //
amount = abs(amount);
LL_INFOS("Messaging") << "give_money(" << uuid << "," << amount << ")"<< LL_ENDL;
if(can_afford_transaction(amount))
@@ -1204,10 +1204,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
log_message = "You decline " + mDesc + " from " + mFromName + ".";
chat.mText = log_message;
- //
- //if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269
- if( LLMuteList::getInstance()->isMuted(mFromID) ) // muting for SL-42269
- //
+ //
+ //if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269
+ if( LLMuteList::getInstance()->isMuted(mFromID) ) // muting for SL-42269
+ //
{
chat.mMuted = TRUE;
}
@@ -1466,21 +1466,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
msg->getVector3Fast(_PREHASH_MessageBlock, _PREHASH_Position, position);
msg->getBinaryDataFast( _PREHASH_MessageBlock, _PREHASH_BinaryBucket, binary_bucket, 0, 0, MTUBYTES);
binary_bucket_size = msg->getSizeFast(_PREHASH_MessageBlock, _PREHASH_BinaryBucket);
- EInstantMessage dialog = (EInstantMessage)d;
-
- //
- llinfos << "RegionID: " << region_id.asString() << llendl;
- //
+ EInstantMessage dialog = (EInstantMessage)d;
+
+ //
+ llinfos << "RegionID: " << region_id.asString() << llendl;
+ //
BOOL is_busy = gAgent.getBusy();
BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat);
BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
BOOL is_owned_by_me = FALSE;
- //
- //chat.mMuted = is_muted && !is_linden;
- chat.mMuted = is_muted;
- //
+ //
+ //chat.mMuted = is_muted && !is_linden;
+ chat.mMuted = is_muted;
+ //
chat.mFromID = from_id;
chat.mFromName = name;
chat.mSourceType = (from_id.isNull() || (name == std::string(SYSTEM_FROM))) ? CHAT_SOURCE_SYSTEM : CHAT_SOURCE_AGENT;
@@ -2024,6 +2024,64 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
payload["lure_id"] = session_id;
payload["godlike"] = FALSE;
LLNotifications::instance().add("TeleportOffered", args, payload);
+ //
+ if(binary_bucket_size)
+ {
+ char* dest = new char[binary_bucket_size];
+ strncpy(dest, (char*)binary_bucket, binary_bucket_size-1); /* Flawfinder: ignore */
+ dest[binary_bucket_size-1] = '\0';
+
+ llinfos << "IM_LURE_USER binary_bucket " << dest << llendl;
+
+ std::string str(dest);
+ typedef boost::tokenizer > tokenizer;
+ boost::char_separator sep("|","",boost::keep_empty_tokens);
+ tokenizer tokens(str, sep);
+ tokenizer::iterator iter = tokens.begin();
+ std::string global_x_str(*iter++);
+ std::string global_y_str(*iter++);
+ std::string x_str(*iter++);
+ std::string y_str(*iter++);
+ std::string z_str(*iter++);
+ // skip what I think must be LookAt
+ if(iter != tokens.end())
+ iter++; // x
+ if(iter != tokens.end())
+ iter++; // y
+ if(iter != tokens.end())
+ iter++; // z
+ std::string mat_str("");
+ if(iter != tokens.end())
+ mat_str.assign(*iter++);
+ mat_str = utf8str_trim(mat_str);
+
+ llinfos << "IM_LURE_USER tokenized " << global_x_str << "|" << global_y_str << "|" << x_str << "|" << y_str << "|" << z_str << "|" << mat_str << llendl;
+
+ std::istringstream gxstr(global_x_str);
+ int global_x;
+ gxstr >> global_x;
+
+ std::istringstream gystr(global_y_str);
+ int global_y;
+ gystr >> global_y;
+
+ std::istringstream xstr(x_str);
+ int x;
+ xstr >> x;
+
+ std::istringstream ystr(y_str);
+ int y;
+ ystr >> y;
+
+ std::istringstream zstr(z_str);
+ int z;
+ zstr >> z;
+
+ llinfos << "IM_LURE_USER parsed " << global_x << "|" << global_y << "|" << x << "|" << y << "|" << z << "|" << mat_str << llendl;
+
+ gAgent.showLureDestination(name, global_x, global_y, x, y, z, mat_str);
+ }
+ //
}
}
break;
@@ -2347,19 +2405,19 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
msg->getUUID("ChatData", "SourceID", from_id);
chat.mFromID = from_id;
- //
- // this chatter assignment is moved from below
+ //
+ // this chatter assignment is moved from below
chatter = gObjectList.findObject(from_id);
- /*
- if(chatter)
- {
- if(chatter->isAvatar())
- {
- ((LLVOAvatar*)chatter)->resetIdleTime();
- }
+ /*
+ if(chatter)
+ {
+ if(chatter->isAvatar())
+ {
+ ((LLVOAvatar*)chatter)->resetIdleTime();
+ }
}
- */
- //
+ */
+ //
// Object owner for objects
msg->getUUID("ChatData", "OwnerID", owner_id);
@@ -2387,10 +2445,10 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
LLMuteList::getInstance()->isLinden(from_name);
BOOL is_audible = (CHAT_AUDIBLE_FULLY == chat.mAudible);
- //
- // because I moved it to above
- //chatter = gObjectList.findObject(from_id);
- //
+ //
+ // because I moved it to above
+ //chatter = gObjectList.findObject(from_id);
+ //
if (chatter)
{
chat.mPosAgent = chatter->getPositionAgent();
@@ -2560,17 +2618,17 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
// F T T T * No No
// T * * * F Yes Yes
- //
- //chat.mMuted = is_muted && !is_linden;
- chat.mMuted = is_muted;
- //
+ //
+ //chat.mMuted = is_muted && !is_linden;
+ chat.mMuted = is_muted;
+ //
if (!visible_in_chat_bubble
- //
- // && (is_linden || !is_busy || is_owned_by_me))
- && (!is_busy || is_owned_by_me))
- //
+ //
+ // && (is_linden || !is_busy || is_owned_by_me))
+ && (!is_busy || is_owned_by_me))
+ //
{
// show on screen and add to history
check_translate_chat(mesg, chat, FALSE);
@@ -3196,15 +3254,15 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
// If a modifier key is held down, turn off
// LBUTTON and ML_LBUTTON so that using the camera (alt-key) doesn't
// trigger a control event.
- U32 control_flags = gAgent.getControlFlags();
-
- //
- if(gSavedSettings.getBOOL("Nimble"))
- {
- control_flags |= AGENT_CONTROL_FINISH_ANIM;
- }
+ U32 control_flags = gAgent.getControlFlags();
+
+ //
+ if(gSavedSettings.getBOOL("Nimble"))
+ {
+ control_flags |= AGENT_CONTROL_FINISH_ANIM;
+ }
//
-
+
MASK key_mask = gKeyboard->currentMask(TRUE);
if (key_mask & MASK_ALT || key_mask & MASK_CONTROL)
{
@@ -3576,8 +3634,8 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
return;
}
- //
- gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
+ //
+ gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
//gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global, object_id);
//
}
diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp
index 6a074d969..d1d9988e7 100644
--- a/indra/newview/llworldmapmessage.cpp
+++ b/indra/newview/llworldmapmessage.cpp
@@ -228,6 +228,15 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
callback(handle, LLWorldMapMessage::getInstance()->mSLURL, image_id, LLWorldMapMessage::getInstance()->mSLURLTeleport);
}
}
+ //
+ if(LLAgent::lure_show)
+ {
+ if((x_regions == LLAgent::lure_global_x) && (y_regions == LLAgent::lure_global_y))
+ {
+ gAgent.onFoundLureDestination();
+ }
+ }
+ //
}
// Tell the UI to update itself
gFloaterWorldMap->updateSims(found_null_sim);