From cf09e00ee0affdc23c084222961408487cca4c30 Mon Sep 17 00:00:00 2001 From: McCabe Maxsted Date: Sat, 10 Jul 2010 05:30:16 -0700 Subject: Changes that should make the 'Ban' button in the radar work for EMs as well as parcel mgrs --- linden/indra/newview/panelradar.cpp | 372 ++++++++++----------- linden/indra/newview/panelradar.h | 44 ++- .../skins/default/xui/en-us/panel_radar.xml | 8 +- 3 files changed, 194 insertions(+), 230 deletions(-) diff --git a/linden/indra/newview/panelradar.cpp b/linden/indra/newview/panelradar.cpp index 9b4c5b4..c5fc3db 100644 --- a/linden/indra/newview/panelradar.cpp +++ b/linden/indra/newview/panelradar.cpp @@ -90,7 +90,8 @@ BOOL PanelRadar::postBuild() childSetAction("unmute_btn", onClickUnmute, this); childSetAction("ar_btn", onClickAR, this); //childSetAction("estate_eject_btn", onClickEjectFromEstate, this); - childSetAction("estate_ban_btn", onClickBanFromEstate, this); + //childSetAction("estate_ban_btn", onClickBanFromEstate, this); + childSetAction("ban_btn", onClickBan, this); setDefaultBtn("im_btn"); @@ -435,10 +436,11 @@ void PanelRadar::updateButtonStates() childSetEnabled("cam_btn", enable_cam); childSetEnabled("freeze_btn", enable_estate); childSetEnabled("eject_btn", enable_estate); + childSetEnabled("ban_btn", enable_estate); childSetEnabled("mute_btn", enable); childSetEnabled("ar_btn", enable); //childSetEnabled("estate_eject_btn", enable_estate); - childSetEnabled("estate_ban_btn", enable_estate); + //childSetEnabled("estate_ban_btn", enable_estate); if (enable_unmute) { @@ -486,7 +488,7 @@ void PanelRadar::updateButtonStates() } -bool PanelRadar::isKickable(const LLUUID &agent_id) +bool PanelRadar::isKickable(const LLUUID& agent_id) { if (agent_id.notNull()) { @@ -498,23 +500,28 @@ bool PanelRadar::isKickable(const LLUUID &agent_id) if (region) { const LLVector3& pos = avatar->getPositionRegion(); + + if (region->isOwnedSelf(pos) || + region->canManageEstate()) + { + return true; + } + const LLVector3d& pos_global = avatar->getPositionGlobal(); if (LLWorld::getInstance()->positionRegionValidGlobal(pos_global)) { LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel(); LLViewerParcelMgr::getInstance()->deselectLand(); - - bool new_value = (region != NULL); - - if (new_value) + + if (parcel) { - new_value = region->isOwnedSelf(pos); - if (!new_value || region->isOwnedGroup(pos)) + if (region->isOwnedGroup(pos) && + (LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN) || + LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_MANAGE_BANNED))) { - new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN); + return true; } } - return new_value; } } } @@ -546,7 +553,7 @@ LLUUID PanelRadar::getSelected() } -std::string PanelRadar::getSelectedName(const LLUUID &agent_id) +std::string PanelRadar::getSelectedName(const LLUUID& agent_id) { std::string agent_name; if(!(gCacheName->getFullName(agent_id, agent_name) && agent_name != " ")) @@ -556,7 +563,7 @@ std::string PanelRadar::getSelectedName(const LLUUID &agent_id) return agent_name; } -void PanelRadar::sendAvatarPropertiesRequest(const LLUUID &agent_id) +void PanelRadar::sendAvatarPropertiesRequest(const LLUUID& agent_id) { LL_DEBUGS("Radar") << "PanelRadar::sendAvatarPropertiesRequest()" << LL_ENDL; LLMessageSystem *msg = gMessageSystem; @@ -614,10 +621,10 @@ void PanelRadar::onClickOfferTeleport(void* user_data) } //static -void PanelRadar::onClickTeleport(void* userdata) +void PanelRadar::onClickTeleport(void* user_data) { - PanelRadar *self = (PanelRadar*)userdata; - LLScrollListItem *item = self->mRadarList->getFirstSelected(); + PanelRadar* self = (PanelRadar*)user_data; + LLScrollListItem *item = self->mRadarList->getFirstSelected(); if (item) { @@ -680,7 +687,7 @@ void PanelRadar::onClickInvite(void* user_data) } // static -void PanelRadar::callback_invite_to_group(LLUUID group_id, void *user_data) +void PanelRadar::callback_invite_to_group(LLUUID group_id, void* user_data) { std::vector agent_ids; agent_ids.push_back(*(LLUUID *)user_data); @@ -710,7 +717,7 @@ void PanelRadar::onClickAddFriend(void* user_data) // static void PanelRadar::onClickCam(void* user_data) { - PanelRadar *self = (PanelRadar*)user_data; + PanelRadar* self = (PanelRadar*)user_data; self->lookAtAvatar(self->getSelected()); } @@ -730,55 +737,96 @@ void PanelRadar::lookAtAvatar(const LLUUID& agent_id) } //static -bool PanelRadar::callbackFreeze(const LLSD& notification, const LLSD& response, PanelRadar *self) +bool PanelRadar::callbackFreeze(const LLSD& notification, const LLSD& response) { S32 option = LLNotification::getSelectedOption(notification, response); if (option == 0) { - sendFreeze(self->mSelectedAvatar, true); + sendFreeze(notification["payload"]["avatar_id"].asUUID(), true); } else if (option == 1) { - sendFreeze(self->mSelectedAvatar, false); + sendFreeze(notification["payload"]["avatar_id"].asUUID(), false); } return false; } //static -bool PanelRadar::callbackEject(const LLSD& notification, const LLSD& response, PanelRadar *self) +bool PanelRadar::callbackEjectBan(const LLSD& notification, const LLSD& response) { S32 option = LLNotification::getSelectedOption(notification, response); - if (option == 0) + if (2 == option) { - sendEject(self->mSelectedAvatar, false); + // Cancel button. + return false; } - else if (option == 1) + LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); + bool ban_enabled = notification["payload"]["ban_enabled"].asBoolean(); + + if (0 == option) + { + // Eject button + LLMessageSystem* msg = gMessageSystem; + LLViewerObject* avatar = gObjectList.findObject(avatar_id); + + if (avatar) + { + U32 flags = 0x0; + msg->newMessage("EjectUser"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID() ); + msg->addUUID("SessionID", gAgent.getSessionID() ); + msg->nextBlock("Data"); + msg->addUUID("TargetID", avatar_id ); + msg->addU32("Flags", flags ); + msg->sendReliable( avatar->getRegion()->getHost() ); + } + } + else if (ban_enabled) { - sendEject(self->mSelectedAvatar, true); + // This is tricky. It is similar to say if it is not an 'Eject' button, + // and it is also not an 'Cancle' button, and ban_enabled==ture, + // it should be the 'Eject and Ban' button. + LLMessageSystem* msg = gMessageSystem; + LLViewerObject* avatar = gObjectList.findObject(avatar_id); + + if (avatar) + { + U32 flags = 0x1; + msg->newMessage("EjectUser"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID() ); + msg->addUUID("SessionID", gAgent.getSessionID() ); + msg->nextBlock("Data"); + msg->addUUID("TargetID", avatar_id ); + msg->addU32("Flags", flags ); + msg->sendReliable( avatar->getRegion()->getHost() ); + } } return false; } //static -//bool PanelRadar::callbackEjectFromEstate(const LLSD& notification, const LLSD& response, PanelRadar *self) +// Don't use until the UI can be worked out +//bool PanelRadar::callbackEjectFromEstate(const LLSD& notification, const LLSD& response) //{ // S32 option = LLNotification::getSelectedOption(notification, response); // if (option == 0) // { // strings_t strings; -// strings.push_back(self->getSelected().asString()); +// strings.push_back(notification["payload"]["avatar_id"].asString()); // sendEstateOwnerMessage(gMessageSystem, "kickestate", LLFloaterRegionInfo::getLastInvoice(), strings); // } // return false; //} // static -bool PanelRadar::callbackBanFromEstate(const LLSD& notification, const LLSD& response, PanelRadar *self) +bool PanelRadar::callbackBanFromEstate(const LLSD& notification, const LLSD& response) { S32 option = LLNotification::getSelectedOption(notification, response); if (option == 0) { - LLPanelEstateInfo::sendEstateAccessDelta(ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE | ESTATE_ACCESS_NO_REPLY, self->getSelected()); + LLPanelEstateInfo::sendEstateAccessDelta(ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE | ESTATE_ACCESS_NO_REPLY, notification["payload"]["avatar_id"].asUUID()); } else if (option == 1) { @@ -794,39 +842,42 @@ bool PanelRadar::callbackBanFromEstate(const LLSD& notification, const LLSD& res { flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES; } - LLPanelEstateInfo::sendEstateAccessDelta(flags, self->getSelected()); + LLPanelEstateInfo::sendEstateAccessDelta(flags, notification["payload"]["avatar_id"].asUUID()); } } return false; } // static -void PanelRadar::onClickFreeze(void *user_data) +void PanelRadar::onClickFreeze(void* user_data) { - PanelRadar *self = (PanelRadar*)user_data; + PanelRadar* self = (PanelRadar*)user_data; + LLSD payload; + payload["avatar_id"] = self->getSelected(); LLSD args; - args["AVATAR_NAME"] = self->getSelectedName(self->mSelectedAvatar); + args["AVATAR_NAME"] = self->getSelectedName(self->getSelected()); LLNotifications::instance().add("FreezeAvatarFullname", args, - LLSD(), - boost::bind(&callbackFreeze, _1, _2, self)); + payload, + callbackFreeze); } // static -void PanelRadar::onClickUnfreeze(void *user_data) +void PanelRadar::onClickUnfreeze(void* user_data) { - PanelRadar *self = (PanelRadar*)user_data; + PanelRadar* self = (PanelRadar*)user_data; sendFreeze(self->getSelected(), false); } //static -//void PanelRadar::onClickEjectFromEstate(void *user_data) +// Don't use until we can work out the UI +//void PanelRadar::onClickEjectFromEstate(void* user_data) //{ -// PanelRadar *self = (PanelRadar*)user_data; +// PanelRadar* self = (PanelRadar*)user_data; // LLSD args; -// args["AVATAR_NAME"] = self->getSelectedName(self->mSelectedAvatar); +// args["AVATAR_NAME"] = self->getSelectedName(self->getSelected()); // LLNotifications::instance().add("EjectAvatarFullnameNoBan", // args, // LLSD(), @@ -835,9 +886,9 @@ void PanelRadar::onClickUnfreeze(void *user_data) //static -void PanelRadar::onClickMute(void *user_data) +void PanelRadar::onClickMute(void* user_data) { - PanelRadar *self = (PanelRadar*)user_data; + PanelRadar* self = (PanelRadar*)user_data; LLScrollListItem *item = self->mRadarList->getFirstSelected(); if (item != NULL) { @@ -859,9 +910,9 @@ void PanelRadar::onClickMute(void *user_data) //static -void PanelRadar::onClickUnmute(void *user_data) +void PanelRadar::onClickUnmute(void* user_data) { - PanelRadar *self = (PanelRadar*)user_data; + PanelRadar* self = (PanelRadar*)user_data; LLScrollListItem *item = self->mRadarList->getFirstSelected(); if (item != NULL) { @@ -883,23 +934,77 @@ void PanelRadar::onClickUnmute(void *user_data) //static -void PanelRadar::onClickEject(void *user_data) +void PanelRadar::onClickEject(void* user_data) { - PanelRadar *self = (PanelRadar*)user_data; - LLSD args; - args["EVIL_USER"] = self->getSelectedName(self->mSelectedAvatar); - LLNotifications::instance().add("EstateKickUser", - args, - LLSD(), - boost::bind(&callbackEject, _1, _2, self)); + PanelRadar* self = (PanelRadar*)user_data; + LLSD payload; + payload["avatar_id"] = self->getSelected(); + payload["ban_enabled"] = false; + std::string fullname = self->getSelectedName(self->getSelected()); + + if (!fullname.empty()) + { + LLSD args; + args["AVATAR_NAME"] = fullname; + LLNotifications::instance().add("EjectAvatarFullnameNoBan", + args, + payload, + callbackEjectBan); + } + else + { + LLNotifications::instance().add("EjectAvatarNoBan", + LLSD(), + payload, + callbackEjectBan); + } } //static -void PanelRadar::onClickAR(void *user_data) +void PanelRadar::onClickBan(void* user_data) { - PanelRadar *self = (PanelRadar*)user_data; - LLUUID agent_id = self->mSelectedAvatar; + // Ban for EMs + PanelRadar* self = (PanelRadar*)user_data; + LLSD payload; + payload["avatar_id"] = self->getSelected(); + + if (gAgent.canManageEstate()) + { + LLSD args; + args["ALL_ESTATES"] = "all estates"; + LLNotifications::instance().add("EstateBannedAgentAdd", args, payload, callbackBanFromEstate); + } + else // Ban for parcel owners + { + payload["ban_enabled"] = true; + std::string fullname = self->getSelectedName(self->getSelected()); + + if (!fullname.empty()) + { + LLSD args; + args["AVATAR_NAME"] = fullname; + LLNotifications::instance().add("EjectAvatarFullname", + args, + payload, + callbackEjectBan); + } + else + { + LLNotifications::instance().add("EjectAvatarFullname", + LLSD(), + payload, + callbackEjectBan); + } + } +} + + +//static +void PanelRadar::onClickAR(void* user_data) +{ + PanelRadar* self = (PanelRadar*)user_data; + LLUUID agent_id = self->getSelected(); if (agent_id.notNull()) { @@ -909,28 +1014,17 @@ void PanelRadar::onClickAR(void *user_data) //static -void PanelRadar::onClickBanFromEstate(void *user_data) +/* Don't use until the UI can be worked out +void PanelRadar::onClickBanFromEstate(void* user_data) { - PanelRadar *self = (PanelRadar*)user_data; + PanelRadar* self = (PanelRadar*)user_data; + LLSD payload; + payload["avatar_id"] = self->getSelected(); LLSD args; args["ALL_ESTATES"] = "all estates"; - LLNotifications::instance().add("EstateBannedAgentAdd", args, LLSD(), boost::bind(&callbackBanFromEstate, _1, _2, self)); -} - - -// static -void PanelRadar::cmdEstateEject(const LLUUID &avatar) -{ - sendEstateMessage("teleporthomeuser", avatar); -} - - -// static -void PanelRadar::cmdEstateBan(const LLUUID &avatar) -{ - sendEstateMessage("teleporthomeuser", avatar); // Kick first, just to be sure - sendEstateBan(avatar); + LLNotifications::instance().add("EstateBannedAgentAdd", args, payload, callbackBanFromEstate); } +*/ // static @@ -958,133 +1052,3 @@ void PanelRadar::sendFreeze(const LLUUID& avatar_id, bool freeze) msg->sendReliable( avatar->getRegion()->getHost() ); } } - - -// static -void PanelRadar::sendEject(const LLUUID& avatar_id, bool ban) -{ - LLMessageSystem* msg = gMessageSystem; - LLViewerObject* avatar = gObjectList.findObject(avatar_id); - - if (avatar) - { - U32 flags = 0x0; - if ( ban ) - { - // eject and add to ban list - flags |= 0x1; - } - - msg->newMessage("EjectUser"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID() ); - msg->addUUID("SessionID", gAgent.getSessionID() ); - msg->nextBlock("Data"); - msg->addUUID("TargetID", avatar_id ); - msg->addU32("Flags", flags ); - msg->sendReliable( avatar->getRegion()->getHost() ); - } -} - - -// static -void PanelRadar::sendEstateMessage(const char* request, const LLUUID &target) -{ - - LLMessageSystem* msg = gMessageSystem; - LLUUID invoice; - - // This seems to provide an ID so that the sim can say which request it's - // replying to. I think this can be ignored for now. - invoice.generate(); - - llinfos << "Sending estate request '" << request << "'" << llendl; - msg->newMessage("EstateOwnerMessage"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - msg->nextBlock("MethodData"); - msg->addString("Method", request); - msg->addUUID("Invoice", invoice); - - // Agent id - msg->nextBlock("ParamList"); - msg->addString("Parameter", gAgent.getID().asString().c_str()); - - // Target - msg->nextBlock("ParamList"); - msg->addString("Parameter", target.asString().c_str()); - - msg->sendReliable(gAgent.getRegion()->getHost()); -} - - -// static -void PanelRadar::sendEstateBan(const LLUUID& agent) -{ - LLUUID invoice; - U32 flags = ESTATE_ACCESS_BANNED_AGENT_ADD; - - invoice.generate(); - - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("EstateOwnerMessage"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - - msg->nextBlock("MethodData"); - msg->addString("Method", "estateaccessdelta"); - msg->addUUID("Invoice", invoice); - - char buf[MAX_STRING]; /* Flawfinder: ignore*/ - gAgent.getID().toString(buf); - msg->nextBlock("ParamList"); - msg->addString("Parameter", buf); - - snprintf(buf, MAX_STRING, "%u", flags); /* Flawfinder: ignore */ - msg->nextBlock("ParamList"); - msg->addString("Parameter", buf); - - agent.toString(buf); - msg->nextBlock("ParamList"); - msg->addString("Parameter", buf); - - gAgent.sendReliableMessage(); -} - -//typedef std::vector strings_t; -//static void sendEstateOwnerMessage( -// LLMessageSystem* msg, -// const std::string& request, -// const LLUUID& invoice, -// const strings_t& strings) -//{ -// llinfos << "Sending estate request '" << request << "'" << llendl; -// msg->newMessage("EstateOwnerMessage"); -// msg->nextBlockFast(_PREHASH_AgentData); -// msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -// msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -// msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used -// msg->nextBlock("MethodData"); -// msg->addString("Method", request); -// msg->addUUID("Invoice", invoice); -// if(strings.empty()) -// { -// msg->nextBlock("ParamList"); -// msg->addString("Parameter", NULL); -// } -// else -// { -// strings_t::const_iterator it = strings.begin(); -// strings_t::const_iterator end = strings.end(); -// for(; it != end; ++it) -// { -// msg->nextBlock("ParamList"); -// msg->addString("Parameter", *it); -// } -// } -// msg->sendReliable(gAgent.getRegion()->getHost()); -//} diff --git a/linden/indra/newview/panelradar.h b/linden/indra/newview/panelradar.h index c86a0ce..59e6aff 100644 --- a/linden/indra/newview/panelradar.h +++ b/linden/indra/newview/panelradar.h @@ -79,12 +79,12 @@ private: F32 mSelectedDistance; bool visibleItemsSelected() const; - bool isKickable(const LLUUID &agent_id); + bool isKickable(const LLUUID& agent_id); - std::string getSelectedName(const LLUUID &agent_id); + std::string getSelectedName(const LLUUID& agent_id); F32 getSelectedDistance() { return mSelectedDistance; } - void sendAvatarPropertiesRequest(const LLUUID &agent_id); + void sendAvatarPropertiesRequest(const LLUUID& agent_id); static void onUseRadarList(LLUICtrl* ctrl, void* user_data); static void onRangeChange(LLFocusableElement* focus, void* user_data); @@ -93,33 +93,29 @@ private: static void onClickIM(void* user_data); static void onClickAddFriend(void* user_data); static void onClickOfferTeleport(void* user_data); - static void onClickTeleport(void *userdata); + static void onClickTeleport(void* user_data); static void onClickTrack(void* user_data); static void onClickInvite(void* user_data); - static void callback_invite_to_group(LLUUID group_id, void *user_data); + static void callback_invite_to_group(LLUUID group_id, void* user_data); static void onClickCam(void* user_data); - static void onClickFreeze(void *user_data); - static void onClickUnfreeze(void *user_data); - static void onClickEject(void *user_data); - static void onClickMute(void *user_data); - static void onClickUnmute(void *user_data); - static void onClickAR(void *user_data); - //static void onClickEjectFromEstate(void *user_data); Not working yet - static void onClickBanFromEstate(void *user_data); - - static void callbackAR(void *user_data); - static bool callbackFreeze(const LLSD& notification, const LLSD& response, PanelRadar *self); - static bool callbackEject(const LLSD& notification, const LLSD& response, PanelRadar *self); - //static bool callbackEjectFromEstate(const LLSD& notification, const LLSD& response, PanelRadar *self); - static bool callbackBanFromEstate(const LLSD& notification, const LLSD& response, PanelRadar *self); + static void onClickFreeze(void* user_data); + static void onClickUnfreeze(void* user_data); + static void onClickEject(void* user_data); + static void onClickBan(void* user_data); + static void onClickMute(void* user_data); + static void onClickUnmute(void* user_data); + static void onClickAR(void* user_data); + //static void onClickEjectFromEstate(void* user_data); Not working yet + //static void onClickBanFromEstate(void* user_data); + + static void callbackAR(void* user_data); + static bool callbackFreeze(const LLSD& notification, const LLSD& response); + static bool callbackEjectBan(const LLSD& notification, const LLSD& response); + //static bool callbackEjectFromEstate(const LLSD& notification, const LLSD& response); + static bool callbackBanFromEstate(const LLSD& notification, const LLSD& response); static void sendFreeze(const LLUUID& avatar, bool freeze); - static void sendEject(const LLUUID& avatar, bool ban); - static void cmdEstateEject(const LLUUID &avatar); - static void cmdEstateBan(const LLUUID &avatar); - static void sendEstateBan(const LLUUID& agent); - static void sendEstateMessage(const char* request, const LLUUID &target); }; diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml index 452474f..603f2d8 100644 --- a/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml +++ b/linden/indra/newview/skins/default/xui/en-us/panel_radar.xml @@ -118,6 +118,10 @@ bottom_delta="-22" left_delta="0" height="20" width="80" follows="top|right" tool_tip="" /> +