diff --git a/indra/newview/alchatcommand.cpp b/indra/newview/alchatcommand.cpp index 14bd8f41777d2eea299626735c4ae7fd5632f93b..e26f839035b8d1102265bc2d0588cbb63ba8303a 100644 --- a/indra/newview/alchatcommand.cpp +++ b/indra/newview/alchatcommand.cpp @@ -34,14 +34,18 @@ // viewer includes #include "llagent.h" #include "llagentcamera.h" +#include "llagentui.h" #include "llcommandhandler.h" -#include "llfloaterreg.h" #include "llfloaterimnearbychat.h" +#include "llfloaterreg.h" +#include "llfloaterregioninfo.h" #include "llnotificationsutil.h" +#include "llregioninfomodel.h" #include "llstartup.h" #include "lltrans.h" #include "llviewercontrol.h" #include "llviewermessage.h" +#include "llviewerobjectlist.h" #include "llviewerregion.h" #include "llvoavatarself.h" #include "llvolume.h" @@ -68,6 +72,8 @@ bool ALChatCommand::parseCommand(std::string data) static LLCachedControl<std::string> sCalcCommand(gSavedSettings, "AlchemyChatCommandCalc", "/calc"); static LLCachedControl<std::string> sMaptoCommand(gSavedSettings, "AlchemyChatCommandMapto", "/mapto"); static LLCachedControl<std::string> sClearCommand(gSavedSettings, "AlchemyChatCommandClearNearby", "/clr"); + static LLCachedControl<std::string> sRegionMsgCommand(gSavedSettings, "AlchemyChatCommandRegionMessage", "/regionmsg"); + static LLCachedControl<std::string> sResyncAnimCommand(gSavedSettings, "AlchemyChatCommandResyncAnim", "/resync"); if (cmd == utf8str_tolower(sDrawDistanceCommand)) // dd { @@ -216,6 +222,44 @@ bool ALChatCommand::parseCommand(std::string data) LLNotificationsUtil::add("ChatCommandDiceRoll", args); return true; } + else if (cmd == utf8str_tolower(sRegionMsgCommand)) // Region Message / Dialog + { + if (data.length() > cmd.length() + 1) + { + std::string notification_message = data.substr(cmd.length() + 1); + std::vector<std::string> strings(5, "-1"); + // [0] grid_x, unused here + // [1] grid_y, unused here + strings[2] = gAgentID.asString(); // [2] agent_id of sender + // [3] senter name + std::string name; + LLAgentUI::buildFullname(name); + strings[3] = name; + strings[4] = notification_message; // [4] message + LLRegionInfoModel::sendEstateOwnerMessage(gMessageSystem, "simulatormessage", LLFloaterRegionInfo::getLastInvoice(), strings); + return true; + } + } + else if (cmd == utf8str_tolower(sResyncAnimCommand)) // Resync Animations + { + for (S32 i = 0; i < gObjectList.getNumObjects(); i++) + { + LLViewerObject* object = gObjectList.getObject(i); + if (object && object->isAvatar()) + { + LLVOAvatar* avatarp = (LLVOAvatar*)object; + if (avatarp) + { + for (const auto& keyvalue : avatarp->mPlayingAnimations) + { + avatarp->stopMotion(keyvalue.first, TRUE); + avatarp->startMotion(keyvalue.first); + } + } + } + } + return true; + } } return false; } diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml index 0ca164016626737fd975989265bb2fdead57b041..551e21d7711c21871d0b3e25fd2add17aac8f757 100644 --- a/indra/newview/app_settings/settings_alchemy.xml +++ b/indra/newview/app_settings/settings_alchemy.xml @@ -134,6 +134,28 @@ <key>Value</key> <string>/pos</string> </map> + <key>AlchemyChatCommandRegionMessage</key> + <map> + <key>Comment</key> + <string>Command to send a region message</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>/regionmsg</string> + </map> + <key>AlchemyChatCommandResyncAnim</key> + <map> + <key>Comment</key> + <string>Command to stop/start in order to resync animations</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>/resync</string> + </map> <key>AlchemyChatCommandRezPlat</key> <map> <key>Comment</key> diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 5b8c6687b5bb9c9fa29ec066c0db4981cea9b7d5..c0fbf99360c571772cdb0cadc053da2d01fceef5 100755 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -640,6 +640,24 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg) LLNotifications::instance().add("RevokedModifyRights",args, payload); } } + // <Alchemy> + if ((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MAP_LOCATION) + { + LLSD args; + args["NAME"] = LLSLURL("agent", agent_id, "displayname").getSLURLString(); + + LLSD payload; + payload["from_id"] = agent_id; + if (LLRelationship::GRANT_MAP_LOCATION & new_rights) + { + LLNotifications::instance().add("GrantedMapRights", args, payload); + } + else + { + LLNotifications::instance().add("RevokedMapRights", args, payload); + } + } + // </Alchemy> (mBuddyInfo[agent_id])->setRightsFrom(new_rights); } } diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h index d22a0de4635bfd14abd5e7f862aeb86073fd26aa..b12e5ba6861f56b118fad5788f550b6077365a4c 100755 --- a/indra/newview/llregioninfomodel.h +++ b/indra/newview/llregioninfomodel.h @@ -86,6 +86,7 @@ protected: private: void reset(); +public: // <Alchemy /> // *FIXME: Duplicated code from LLPanelRegionInfo static void sendEstateOwnerMessage( LLMessageSystem* msg, @@ -93,6 +94,7 @@ private: const LLUUID& invoice, const std::vector<std::string>& strings); +private: // <Alchemy /> update_signal_t mUpdateSignal; }; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index caf0a5feb4669234a3494e07cdfdf9fc390e3179..88a05ba472e9168faeae9c659044199a4637c9cb 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3157,15 +3157,16 @@ class LLSyncAnimations : public view_listener_t for (S32 i = 0; i < gObjectList.getNumObjects(); ++i) { LLViewerObject* object = gObjectList.getObject(i); - if (object && object->isAvatar()) + if (object && + object->isAvatar()) { LLVOAvatar* avatarp = static_cast<LLVOAvatar*>(object); if (avatarp) { - for (const auto& anim_it : avatarp->mPlayingAnimations) + for (const auto& keyvalue : avatarp->mPlayingAnimations) { - avatarp->stopMotion(anim_it.first, TRUE); - avatarp->startMotion(anim_it.first); + avatarp->stopMotion(keyvalue.first, TRUE); + avatarp->startMotion(keyvalue.first); } } } diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index a5b2f9ecc5cbe7f2b2c2c571e8d004c29f47facd..ab8022132f3530824f94ce6323e263a82b976ccb 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -10375,4 +10375,20 @@ the region "[REGION]"? text="Cancel"/> </form> </notification> + <notification + icon="alertmodal.tga" + name="RevokedMapRights" + persist="true" + log_to_im="true" + type="notify"> + Your privilege to find [NAME]'s map location has been revoked. + </notification> + <notification + icon="alertmodal.tga" + name="GrantedMapRights" + persist="true" + log_to_im="true" + type="notify"> + [NAME] has given you permission to find their location on the map. + </notification> </notifications>