From 7ed077a94dd553e5aa7675144ce98fd6e4ce723e Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Fri, 4 May 2012 01:36:53 +0300 Subject: Add pickup ignore list. --- src/gui/popupmenu.cpp | 205 +++++++++++++++++++++++++++++---- src/gui/popupmenu.h | 5 +- src/gui/setup_other.cpp | 3 + src/gui/socialwindow.cpp | 230 +++++++++++++++++++------------------- src/gui/socialwindow.h | 3 + src/gui/viewport.cpp | 5 + src/gui/viewport.h | 2 + src/gui/widgets/avatarlistbox.cpp | 12 ++ 8 files changed, 326 insertions(+), 139 deletions(-) (limited to 'src/gui') diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp index 45cf8b9b2..1bd634c7c 100644 --- a/src/gui/popupmenu.cpp +++ b/src/gui/popupmenu.cpp @@ -534,6 +534,7 @@ void PopupMenu::showPopup(int x, int y, FloorItem *floorItem) mFloorItemId = floorItem->getId(); mX = x; mY = y; + mType = Being::FLOOR_ITEM; const ItemInfo &info = floorItem->getInfo(); mBrowserBox->clearRows(); std::string name; @@ -543,9 +544,35 @@ void PopupMenu::showPopup(int x, int y, FloorItem *floorItem) name = info.getName(floorItem->getColor()); else name = info.getName(); + mNick = name; mBrowserBox->addRow(name); - mBrowserBox->addRow("pickup", _("Pick up")); + + if (config.getBoolValue("enablePickupFilter")) + { + if (actorSpriteManager->isInPickupList(name) + && !actorSpriteManager->isInIgnorePickupList("")) + { + mBrowserBox->addRow("pickup", _("Pick up")); + mBrowserBox->addRow("##3---"); + } + if (actorSpriteManager->isInPickupList(name) + || actorSpriteManager->isInIgnorePickupList(name)) + { + mBrowserBox->addRow("remove pickup", + _("Remove from pickup list")); + } + else + { + mBrowserBox->addRow("add pickup", _("Add to pickup list")); + mBrowserBox->addRow("add pickup ignore", + _("Add to ignore list")); + } + } + else + { + mBrowserBox->addRow("pickup", _("Pick up")); + } mBrowserBox->addRow("chat", _("Add to chat")); mBrowserBox->addRow("##3---"); @@ -1390,18 +1417,6 @@ void PopupMenu::handleLink(const std::string &link, spellManager->save(); } } - else if (link == "load old item shortcuts") - { - if (itemShortcutWindow) - { - int num = itemShortcutWindow->getTabIndex(); - if (num >= 0 && num < SHORTCUT_TABS && itemShortcut[num]) - { - itemShortcut[num]->load(true); - itemShortcut[num]->save(); - } - } - } else if (link == "clear drops") { if (dropShortcut) @@ -1528,6 +1543,33 @@ void PopupMenu::handleLink(const std::string &link, socialWindow->updateAttackFilter(); } } + else if (link == "remove pickup" && !mNick.empty()) + { + if (actorSpriteManager) + { + actorSpriteManager->removePickupItem(mNick); + if (socialWindow) + socialWindow->updatePickupFilter(); + } + } + else if (link == "add pickup" && !mNick.empty()) + { + if (actorSpriteManager) + { + actorSpriteManager->addPickupItem(mNick); + if (socialWindow) + socialWindow->updatePickupFilter(); + } + } + else if (link == "add pickup ignore" && !mNick.empty()) + { + if (actorSpriteManager) + { + actorSpriteManager->addIgnorePickupItem(mNick); + if (socialWindow) + socialWindow->updatePickupFilter(); + } + } else if (link == "attack moveup") { if (actorSpriteManager) @@ -1681,6 +1723,31 @@ void PopupMenu::handleLink(const std::string &link, socialWindow->updateAttackFilter(); } } + else if (link == "pickup remove") + { + if (actorSpriteManager) + { + if (mNick.empty()) + { + if (actorSpriteManager->isInPickupList(mNick)) + { + actorSpriteManager->removePickupItem(mNick); + actorSpriteManager->addIgnorePickupItem(mNick); + } + else + { + actorSpriteManager->removePickupItem(mNick); + actorSpriteManager->addPickupItem(mNick); + } + } + else + { + actorSpriteManager->removePickupItem(mNick); + } + if (socialWindow) + socialWindow->updatePickupFilter(); + } + } else if (link == "reset yellow") { if (player_node) @@ -1814,6 +1881,7 @@ void PopupMenu::showPopup(Window *parent, int x, int y, Item *item, mWindow = parent; mX = x; mY = y; + mNick = ""; mBrowserBox->clearRows(); int cnt = item->getQuantity(); @@ -1884,6 +1952,28 @@ void PopupMenu::showPopup(Window *parent, int x, int y, Item *item, mBrowserBox->addRow("retrieve all", _("Retrieve all")); } } + if (config.getBoolValue("enablePickupFilter")) + { + const ItemInfo &info = item->getInfo(); + std::string name; + + if (serverVersion > 0) + name = info.getName(item->getColor()); + else + name = info.getName(); + mNick = name; + mBrowserBox->addRow("##3---"); + if (actorSpriteManager->isInPickupList(name) + || actorSpriteManager->isInIgnorePickupList(name)) + { + mBrowserBox->addRow("remove pickup", _("Remove from pickup list")); + } + else + { + mBrowserBox->addRow("add pickup", _("Add to pickup list")); + mBrowserBox->addRow("add pickup ignore", _("Add to ignore list")); + } + } mBrowserBox->addRow("chat", _("Add to chat")); mBrowserBox->addRow("##3---"); mBrowserBox->addRow("cancel", _("Cancel")); @@ -1913,9 +2003,6 @@ void PopupMenu::showItemPopup(int x, int y, int itemId, unsigned char color) mBrowserBox->addRow("use", _("Use")); mBrowserBox->addRow("##3---"); - mBrowserBox->addRow("load old item shortcuts", - _("Load old item shortcuts")); - mBrowserBox->addRow("##3---"); mBrowserBox->addRow("cancel", _("Cancel")); showPopup(x, y); @@ -1937,6 +2024,7 @@ void PopupMenu::showItemPopup(int x, int y, Item *item) mItemId = 0; mItemColor = 1; } + mNick = ""; mBrowserBox->clearRows(); if (item) @@ -1969,10 +2057,33 @@ void PopupMenu::showItemPopup(int x, int y, Item *item) if (InventoryWindow::isStorageActive()) mBrowserBox->addRow("store", _("Store")); mBrowserBox->addRow("chat", _("Add to chat")); - mBrowserBox->addRow("##3---"); + + if (config.getBoolValue("enablePickupFilter")) + { + const ItemInfo &info = item->getInfo(); + std::string name; + + if (serverVersion > 0) + name = info.getName(item->getColor()); + else + name = info.getName(); + mNick = name; + + mBrowserBox->addRow("##3---"); + if (actorSpriteManager->isInPickupList(name) + || actorSpriteManager->isInIgnorePickupList(name)) + { + mBrowserBox->addRow("remove pickup", + _("Remove from pickup list")); + } + else + { + mBrowserBox->addRow("add pickup", _("Add to pickup list")); + mBrowserBox->addRow("add pickup ignore", + _("Add to ignore list")); + } + } } - mBrowserBox->addRow("load old item shortcuts", - _("Load old item shortcuts")); mBrowserBox->addRow("##3---"); mBrowserBox->addRow("cancel", _("Cancel")); @@ -1984,6 +2095,7 @@ void PopupMenu::showDropPopup(int x, int y, Item *item) mItem = item; mX = x; mY = y; + mNick = ""; mBrowserBox->clearRows(); if (item) @@ -2016,8 +2128,33 @@ void PopupMenu::showDropPopup(int x, int y, Item *item) if (InventoryWindow::isStorageActive()) mBrowserBox->addRow("store", _("Store")); mBrowserBox->addRow("chat", _("Add to chat")); - mBrowserBox->addRow("##3---"); + if (config.getBoolValue("enablePickupFilter")) + { + const ItemInfo &info = item->getInfo(); + std::string name; + + if (serverVersion > 0) + name = info.getName(item->getColor()); + else + name = info.getName(); + mNick = name; + + mBrowserBox->addRow("##3---"); + if (actorSpriteManager->isInPickupList(name) + || actorSpriteManager->isInIgnorePickupList(name)) + { + mBrowserBox->addRow("remove pickup", + _("Remove from pickup list")); + } + else + { + mBrowserBox->addRow("add pickup", _("Add to pickup list")); + mBrowserBox->addRow("add pickup ignore", + _("Add to ignore list")); + } + } } + mBrowserBox->addRow("##3---"); mBrowserBox->addRow("clear drops", _("Clear drop window")); mBrowserBox->addRow("##3---"); mBrowserBox->addRow("cancel", _("Cancel")); @@ -2130,7 +2267,6 @@ void PopupMenu::showAttackMonsterPopup(int x, int y, std::string name, mBrowserBox->addRow("attack moveup", _("Move up")); if (idx + 1 < size) mBrowserBox->addRow("attack movedown", _("Move down")); - mBrowserBox->addRow("attack remove", _("Remove")); break; } case MapItem::PRIORITY: @@ -2141,16 +2277,39 @@ void PopupMenu::showAttackMonsterPopup(int x, int y, std::string name, mBrowserBox->addRow("priority moveup", _("Move up")); if (idx + 1 < size) mBrowserBox->addRow("priority movedown", _("Move down")); - mBrowserBox->addRow("attack remove", _("Remove")); break; } case MapItem::IGNORE_: - mBrowserBox->addRow("attack remove", _("Remove")); break; default: break; } + mBrowserBox->addRow("attack remove", _("Remove")); + mBrowserBox->addRow("##3---"); + mBrowserBox->addRow("cancel", _("Cancel")); + + showPopup(x, y); +} + +void PopupMenu::showPickupItemPopup(int x, int y, std::string name) +{ + if (!player_node || !actorSpriteManager) + return; + + mNick = name; + mType = Being::FLOOR_ITEM; + mX = x; + mY = y; + + mBrowserBox->clearRows(); + + if (name.empty()) + mBrowserBox->addRow(_("(default)")); + else + mBrowserBox->addRow(name); + + mBrowserBox->addRow("pickup remove", _("Remove")); mBrowserBox->addRow("##3---"); mBrowserBox->addRow("cancel", _("Cancel")); diff --git a/src/gui/popupmenu.h b/src/gui/popupmenu.h index f616e46ee..ac47d406a 100644 --- a/src/gui/popupmenu.h +++ b/src/gui/popupmenu.h @@ -137,8 +137,9 @@ class PopupMenu : public Popup, public LinkHandler void showSpellPopup(int x, int y, TextCommand *cmd); - void showAttackMonsterPopup(int x, int y, std::string name, - int type); + void showAttackMonsterPopup(int x, int y, std::string name, int type); + + void showPickupItemPopup(int x, int y, std::string name); void showUndressPopup(int x, int y, Being *being, Item *item); diff --git a/src/gui/setup_other.cpp b/src/gui/setup_other.cpp index 2f86db8af..aacc5d736 100644 --- a/src/gui/setup_other.cpp +++ b/src/gui/setup_other.cpp @@ -134,6 +134,9 @@ Setup_Other::Setup_Other() new SetupItemCheckBox(_("Enable attack filter"), "", "enableAttackFilter", this, "enableAttackFilterEvent"); + new SetupItemCheckBox(_("Enable pickup filter"), "", + "enablePickupFilter", this, "enablePickupFilterEvent"); + new SetupItemCheckBox(_("Enable advert protocol"), "", "enableAdvert", this, "enableAdvertEvent"); diff --git a/src/gui/socialwindow.cpp b/src/gui/socialwindow.cpp index 74fcfc851..b8c73f448 100644 --- a/src/gui/socialwindow.cpp +++ b/src/gui/socialwindow.cpp @@ -864,6 +864,58 @@ protected: }; +#define addAvatars(mob, str, type) \ +{\ + ava = new Avatar(str);\ + ava->setOnline(false);\ + ava->setLevel(-1);\ + ava->setType(MapItem::SEPARATOR);\ + ava->setX(0);\ + ava->setY(0);\ + avatars->push_back(ava);\ + mobs = actorSpriteManager->get##mob##s();\ + i = mobs.begin();\ + i_end = mobs.end();\ + while (i != i_end)\ + {\ + std::string name;\ + int level = -1;\ + if (*i == "")\ + {\ + name = _("(default)");\ + level = 0;\ + }\ + else\ + {\ + name = *i;\ + }\ + ava = new Avatar(name);\ + ava->setOnline(true);\ + ava->setLevel(level);\ + ava->setType(MapItem::type);\ + ava->setX(0);\ + ava->setY(0);\ + avatars->push_back(ava);\ + ++ i;\ + }\ +} + +#define updateAtkListStart() \ + if (!socialWindow || !player_node || !actorSpriteManager)\ + return;\ + std::vector *avatars = mBeings->getMembers();\ + std::vector::iterator ia = avatars->begin();\ + while (ia != avatars->end())\ + {\ + delete *ia;\ + ++ ia;\ + }\ + avatars->clear();\ + Avatar *ava;\ + std::list mobs;\ + std::list::const_iterator i;\ + std::list::const_iterator i_end; + class SocialAttackTab : public SocialTab { public: @@ -900,130 +952,63 @@ public: void updateList() { - if (!socialWindow || !player_node || !actorSpriteManager) - return; - - std::vector *avatars = mBeings->getMembers(); - - std::list mobs - = actorSpriteManager->getPriorityAttackMobs(); - - std::vector::iterator ia = avatars->begin(); - - while (ia != avatars->end()) - { - delete *ia; - ++ ia; - } - - avatars->clear(); - Avatar *ava = new Avatar(_("Priority mobs")); - ava->setOnline(false); - ava->setLevel(-1); - ava->setType(MapItem::SEPARATOR); - ava->setX(0); - ava->setY(0); - avatars->push_back(ava); - - std::list::const_iterator i = mobs.begin(); - std::list::const_iterator i_end = mobs.end(); + updateAtkListStart(); + addAvatars(PriorityAttackMob, _("Priority mobs"), PRIORITY); + addAvatars(AttackMob, _("Attack mobs"), ATTACK); + addAvatars(IgnoreAttackMob, _("Ignore mobs"), IGNORE_); + } - while (i != i_end) - { - std::string name; - int level = -1; - if (*i == "") - { - name = _("(default)"); - level = 0; - } - else - { - name = *i; - } - ava = new Avatar(name); - ava->setOnline(true); - ava->setLevel(level); - ava->setType(MapItem::PRIORITY); - ava->setX(0); - ava->setY(0); - avatars->push_back(ava); + void updateAvatar(std::string name A_UNUSED) + { + } - ++ i; - } + void resetDamage(std::string name A_UNUSED) + { + } - ava = new Avatar(_("Attack mobs")); - ava->setOnline(false); - ava->setLevel(-1); - ava->setType(MapItem::SEPARATOR); - ava->setX(0); - ava->setY(0); - avatars->push_back(ava); +private: + BeingsListModal *mBeings; +}; - mobs = actorSpriteManager->getAttackMobs(); - i = mobs.begin(); - i_end = mobs.end(); +class SocialPickupTab : public SocialTab +{ +public: + SocialPickupTab() + { + mBeings = new BeingsListModal(); - while (i != i_end) - { - std::string name; - int level = -1; - if (*i == "") - { - name = _("(default)"); - level = 0; - } - else - { - name = *i; - } - ava = new Avatar(name); - ava->setOnline(true); - ava->setLevel(level); - ava->setType(MapItem::ATTACK); - ava->setX(0); - ava->setY(0); - avatars->push_back(ava); + mList = new AvatarListBox(mBeings); + mScroll = new ScrollArea(mList); - ++ i; - } + mScroll->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_AUTO); + mScroll->setVerticalScrollPolicy(gcn::ScrollArea::SHOW_ALWAYS); - ava = new Avatar(_("Ignore mobs")); - ava->setOnline(false); - ava->setLevel(-1); - ava->setType(MapItem::SEPARATOR); - ava->setX(0); - ava->setY(0); - avatars->push_back(ava); + setCaption(_("Pik")); + } - mobs = actorSpriteManager->getIgnoreAttackMobs(); - i = mobs.begin(); - i_end = mobs.end(); + ~SocialPickupTab() + { + delete mList; + mList = nullptr; + delete mScroll; + mScroll = nullptr; + delete mBeings; + mBeings = nullptr; + } - while (i != i_end) - { - std::string name; - int level = -1; - if (*i == "") - { - name = _("(default)"); - level = 0; - } - else - { - name = *i; - } - ava = new Avatar(name); - ava->setOnline(false); - ava->setLevel(level); - ava->setType(MapItem::IGNORE_); - ava->setX(0); - ava->setY(0); - avatars->push_back(ava); + void invite() + { + } - ++ i; - } + void leave() + { + } + void updateList() + { + updateAtkListStart(); + addAvatars(PickupItem, _("Pickup items"), PICKUP); + addAvatars(IgnorePickupItem, _("Ignore items"), NOPICKUP); } void updateAvatar(std::string name A_UNUSED) @@ -1036,7 +1021,6 @@ public: private: BeingsListModal *mBeings; - }; @@ -1250,6 +1234,16 @@ SocialWindow::SocialWindow() : mAttackFilter = nullptr; } + if (config.getBoolValue("enablePickupFilter")) + { + mPickupFilter = new SocialPickupTab(); + mTabs->addTab(mPickupFilter, mPickupFilter->mScroll); + } + else + { + mPickupFilter = nullptr; + } + if (player_node && player_node->getParty()) addTab(player_node->getParty()); @@ -1287,6 +1281,8 @@ SocialWindow::~SocialWindow() mNavigation = nullptr; delete mAttackFilter; mAttackFilter = nullptr; + delete mPickupFilter; + mPickupFilter = nullptr; delete mFriends; mFriends = nullptr; } @@ -1718,6 +1714,12 @@ void SocialWindow::updateAttackFilter() mAttackFilter->updateList(); } +void SocialWindow::updatePickupFilter() +{ + if (mPickupFilter) + mPickupFilter->updateList(); +} + void SocialWindow::widgetResized(const gcn::Event &event) { Window::widgetResized(event); diff --git a/src/gui/socialwindow.h b/src/gui/socialwindow.h index 9da78562b..9536ee3d7 100644 --- a/src/gui/socialwindow.h +++ b/src/gui/socialwindow.h @@ -117,6 +117,8 @@ public: void updateAttackFilter(); + void updatePickupFilter(); + void widgetResized(const gcn::Event &event); protected: @@ -139,6 +141,7 @@ protected: PartyMap mParties; SocialTab *mAttackFilter; + SocialTab *mPickupFilter; SocialTab *mPlayers; SocialTab *mNavigation; SocialTab *mFriends; diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index 65ca8071c..2a69428b4 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -704,6 +704,11 @@ void Viewport::showAttackMonsterPopup(std::string name, int type) name, type); } +void Viewport::showPickupItemPopup(std::string name) +{ + mPopupMenu->showPickupItemPopup(getMouseX(), getMouseY(), name); +} + void Viewport::showUndressPopup(int x, int y, Being *being, Item *item) { mPopupMenu->showUndressPopup(x, y, being, item); diff --git a/src/gui/viewport.h b/src/gui/viewport.h index 3031a181e..fc3db142a 100644 --- a/src/gui/viewport.h +++ b/src/gui/viewport.h @@ -160,6 +160,8 @@ class Viewport : public WindowContainer, public gcn::MouseListener, void showAttackMonsterPopup(std::string name, int type); + void showPickupItemPopup(std::string name); + /** * Shows the related popup menu when right click on the chat * at the specified mouse coordinates. diff --git a/src/gui/widgets/avatarlistbox.cpp b/src/gui/widgets/avatarlistbox.cpp index b4fc4fad0..685be7f4c 100644 --- a/src/gui/widgets/avatarlistbox.cpp +++ b/src/gui/widgets/avatarlistbox.cpp @@ -369,6 +369,18 @@ void AvatarListBox::mousePressed(gcn::MouseEvent &event) model->getAvatarAt(selected)->getType()); break; } + case MapItem::PICKUP: + case MapItem::NOPICKUP: + { + std::string name; + if (model->getAvatarAt(selected)->getLevel() == 0) + name = ""; + else + name = model->getAvatarAt(selected)->getName(); + + viewport->showPickupItemPopup(name); + break; + } default: { Map *map = viewport->getMap(); -- cgit v1.2.3-60-g2f50