summaryrefslogtreecommitdiff
path: root/indra/newview/llviewermessage.cpp
diff options
context:
space:
mode:
authorErik Kundiman <erik@megapahit.org>2026-09-01 18:35:23 +0800
committerErik Kundiman <erik@megapahit.org>2026-09-04 21:58:53 +0800
commit00bb3bb6f07660bd914d29a1389342bb3060d254 (patch)
tree431f574922494d2201718f13085f17bc6bd7fb42 /indra/newview/llviewermessage.cpp
parenta8636720129952c10cf49ab80da21bf8b340b96c (diff)
parent4ef9f8f14b35ed388c294d53767a0dca0e890924 (diff)
Merge remote-tracking branch 'secondlife/release/26.4' into 26.4
Diffstat (limited to 'indra/newview/llviewermessage.cpp')
-rw-r--r--indra/newview/llviewermessage.cpp36
1 files changed, 27 insertions, 9 deletions
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 26d40436e9..dde4897ab7 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -421,7 +421,26 @@ void send_complete_agent_movement(const LLHost& sim_host)
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->addU32Fast(_PREHASH_CircuitCode, msg->mOurCircuitCode);
- msg->sendReliable(sim_host);
+
+ // build a lambda to be used as callback on ACK or timeout
+ void (*complete_agent_movement_callback)(void**, S32) = [](void**, S32 result)
+ {
+ if(LLApp::isExiting()) return;
+ if (result != LL_ERR_NOERR)
+ {
+ LL_WARNS("Messaging") << "CompleteAgentMovement failed with err=" << result << LL_ENDL;
+ }
+ };
+
+ // We use same retry strategy as UseCircuitCode because this is a crucial message
+ // that MUST arrive else we'll suffer a failed login/teleport/region-cross
+ msg->sendReliable(
+ sim_host,
+ gSavedSettings.getS32("UseCircuitCodeMaxRetries"),
+ false,
+ (F32Seconds)gSavedSettings.getF32("UseCircuitCodeTimeout"),
+ complete_agent_movement_callback,
+ NULL);
}
void process_logout_reply(LLMessageSystem* msg, void**)
@@ -2442,6 +2461,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
color.setVec(1.f,1.f,1.f,1.f);
msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg);
+ // Preserve tabs from scripts by expanding them to spaces before any sanitization/formatting.
+ LLStringUtil::replaceTabsWithSpaces(mesg, 4);
bool ircstyle = false;
@@ -3759,9 +3780,7 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
{
if (!gAudiop)
{
-#if !LL_LINUX
LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
-#endif
return;
}
@@ -3833,9 +3852,7 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)
{
if (!gAudiop)
{
-#if !LL_LINUX
LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
-#endif
return;
}
@@ -4184,11 +4201,12 @@ void process_avatar_appearance(LLMessageSystem *mesgsys, void **user_data)
if (avatarp)
{
avatarp->processAvatarAppearance( mesgsys );
+ return;
}
- else
- {
- LL_WARNS("Messaging") << "avatar_appearance sent for unknown avatar " << uuid << LL_ENDL;
- }
+ // The avatar object doesn't exist yet.
+ // We will re-request its appearance data after it is created.
+ LLVOAvatar::registerEarlyAppearance(uuid);
+ LL_WARNS("Messaging") << "AvatarAppearance received for avatar " << uuid << " before object created" << LL_ENDL;
}
void process_camera_constraint(LLMessageSystem *mesgsys, void **user_data)