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/actorspritemanager.cpp | 166 +++++++++++++++++++++++++-- src/actorspritemanager.h | 78 +++++++------ src/defaults.cpp | 1 + src/flooritem.h | 3 + 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 ++ src/localplayer.cpp | 7 +- src/maplayer.h | 4 +- 14 files changed, 531 insertions(+), 193 deletions(-) (limited to 'src') diff --git a/src/actorspritemanager.cpp b/src/actorspritemanager.cpp index 9dcae629c..97d559ffc 100644 --- a/src/actorspritemanager.cpp +++ b/src/actorspritemanager.cpp @@ -40,6 +40,8 @@ #include "utils/gettext.h" #include "utils/stringutils.h" +#include "resources/iteminfo.h" + #include "net/net.h" #include "net/playerhandler.h" @@ -221,6 +223,8 @@ void ActorSpriteManager::setPlayer(LocalPlayer *player) mActors.insert(player); if (socialWindow) socialWindow->updateAttackFilter(); + if (socialWindow) + socialWindow->updatePickupFilter(); } Being *ActorSpriteManager::createBeing(int id, ActorSprite::Type type, @@ -239,6 +243,8 @@ FloorItem *ActorSpriteManager::createItem(int id, int itemId, int x, int y, FloorItem *floorItem = new FloorItem(id, itemId, x, y, mMap, amount, color, subX, subY); + if (!checkForPickup(floorItem)) + floorItem->disableHightlight(); mActors.insert(floorItem); return floorItem; } @@ -500,6 +506,7 @@ bool ActorSpriteManager::pickUpAll(int x1, int y1, int x2, int y2, return false; bool finded(false); + bool allowAll = mPickupItemsSet.find("") != mPickupItemsSet.end(); if (!serverBuggy) { for_actors @@ -511,8 +518,30 @@ bool ActorSpriteManager::pickUpAll(int x1, int y1, int x2, int y2, && ((*it)->getTileX() >= x1 && (*it)->getTileX() <= x2) && ((*it)->getTileY() >= y1 && (*it)->getTileY() <= y2)) { - if (player_node->pickUp(static_cast(*it))) - finded = true; + FloorItem *item = static_cast(*it); + const ItemInfo &info = item->getInfo(); + std::string name; + if (serverVersion > 0) + name = info.getName(item->getColor()); + else + name = info.getName(); + if (allowAll) + { + if (mIgnorePickupItemsSet.find(name) + == mIgnorePickupItemsSet.end()) + { + if (player_node->pickUp(item)) + finded = true; + } + } + else + { + if (mPickupItemsSet.find(name) != mPickupItemsSet.end()) + { + if (player_node->pickUp(item)) + finded = true; + } + } } } } @@ -532,13 +561,41 @@ bool ActorSpriteManager::pickUpAll(int x1, int y1, int x2, int y2, FloorItem *tempItem = static_cast(*it); if (tempItem->getPickupCount() < cnt) { - item = tempItem; - cnt = item->getPickupCount(); - if (cnt == 0) + const ItemInfo &info = tempItem->getInfo(); + std::string name; + if (serverVersion > 0) + name = info.getName(tempItem->getColor()); + else + name = info.getName(); + if (allowAll) { - item->incrementPickup(); - player_node->pickUp(item); - return true; + if (mIgnorePickupItemsSet.find(name) + == mIgnorePickupItemsSet.end()) + { + item = tempItem; + cnt = item->getPickupCount(); + if (cnt == 0) + { + item->incrementPickup(); + player_node->pickUp(item); + return true; + } + } + } + else + { + if (mPickupItemsSet.find(name) + != mPickupItemsSet.end()) + { + item = tempItem; + cnt = item->getPickupCount(); + if (cnt == 0) + { + item->incrementPickup(); + player_node->pickUp(item); + return true; + } + } } } } @@ -557,6 +614,7 @@ bool ActorSpriteManager::pickUpNearest(int x, int y, int maxdist) maxdist = maxdist * maxdist; FloorItem *closestItem = nullptr; int dist = 0; + bool allowAll = mPickupItemsSet.find("") != mPickupItemsSet.end(); for_actors { @@ -574,8 +632,29 @@ bool ActorSpriteManager::pickUpNearest(int x, int y, int maxdist) || player_node->isReachable(item->getTileX(), item->getTileY()))) { - dist = d; - closestItem = item; + const ItemInfo &info = item->getInfo(); + std::string name; + if (serverVersion > 0) + name = info.getName(item->getColor()); + else + name = info.getName(); + if (allowAll) + { + if (mIgnorePickupItemsSet.find(name) + == mIgnorePickupItemsSet.end()) + { + dist = d; + closestItem = item; + } + } + else + { + if (mPickupItemsSet.find(name) != mPickupItemsSet.end()) + { + dist = d; + closestItem = item; + } + } } } } @@ -1378,6 +1457,15 @@ void ActorSpriteManager::removeAttackMob(const std::string &name) rebuildPriorityAttackMobs(); } +void ActorSpriteManager::removePickupItem(const std::string &name) +{ + mPickupItems.remove(name); + mPickupItemsSet.erase(name); + mIgnorePickupItems.remove(name); + mIgnorePickupItemsSet.erase(name); + rebuildPickupItems(); +} + #define addMobToList(name, mob) \ {\ int size = get##mob##sSize();\ @@ -1435,6 +1523,19 @@ void ActorSpriteManager::addIgnoreAttackMob(std::string name) rebuildPriorityAttackMobs(); } +void ActorSpriteManager::addPickupItem(std::string name) +{ + addMobToList(name, PickupItem); + rebuildPickupItems(); +} + +void ActorSpriteManager::addIgnorePickupItem(std::string name) +{ + mIgnorePickupItems.push_back(name); + mIgnorePickupItemsSet.insert(name); + rebuildPickupItems(); +} + void ActorSpriteManager::rebuildPriorityAttackMobs() { rebuildMobsList(PriorityAttackMob); @@ -1445,6 +1546,11 @@ void ActorSpriteManager::rebuildAttackMobs() rebuildMobsList(AttackMob); } +void ActorSpriteManager::rebuildPickupItems() +{ + rebuildMobsList(PickupItem); +} + int ActorSpriteManager::getIndexByName(std::string name, std::map &map) { @@ -1466,6 +1572,11 @@ int ActorSpriteManager::getAttackMobIndex(std::string name) return getIndexByName(name, mAttackMobsMap); } +int ActorSpriteManager::getPickupItemIndex(std::string name) +{ + return getIndexByName(name, mPickupItemsMap); +} + #define loadList(key, mob) \ {\ list = unpackList(serverConfig.getValue(key, ""));\ @@ -1491,15 +1602,24 @@ void ActorSpriteManager::loadAttackList() loadList("attackPriorityMobs", PriorityAttackMob); loadList("attackMobs", AttackMob); loadList("ignoreAttackMobs", IgnoreAttackMob); - if (!empty) { mAttackMobs.push_back(""); mAttackMobsSet.insert(""); + empty = false; + } + + loadList("pickupItems", PickupItem); + loadList("ignorePickupItems", IgnorePickupItem); + if (!empty) + { + mPickupItems.push_back(""); + mPickupItemsSet.insert(""); } rebuildAttackMobs(); rebuildPriorityAttackMobs(); + rebuildPickupItems(); } void ActorSpriteManager::storeAttackList() @@ -1507,4 +1627,28 @@ void ActorSpriteManager::storeAttackList() serverConfig.setValue("attackPriorityMobs", packList(mPriorityAttackMobs)); serverConfig.setValue("attackMobs", packList(mAttackMobs)); serverConfig.setValue("ignoreAttackMobs", packList(mIgnoreAttackMobs)); + + serverConfig.setValue("pickupItems", packList(mPickupItems)); + serverConfig.setValue("ignorePickupItems", packList(mIgnorePickupItems)); +} + +bool ActorSpriteManager::checkForPickup(FloorItem *item) +{ + const ItemInfo &info = item->getInfo(); + std::string name; + if (serverVersion > 0) + name = info.getName(item->getColor()); + else + name = info.getName(); + + if (mPickupItemsSet.find("") != mPickupItemsSet.end()) + { + if (mIgnorePickupItemsSet.find(name) == mIgnorePickupItemsSet.end()) + return true; + } + else if (mPickupItemsSet.find(name) != mPickupItemsSet.end()) + { + return true; + } + return false; } diff --git a/src/actorspritemanager.h b/src/actorspritemanager.h index 9605b9ccd..7ce00dd68 100644 --- a/src/actorspritemanager.h +++ b/src/actorspritemanager.h @@ -226,17 +226,17 @@ class ActorSpriteManager: public ConfigListener void removeAttackMob(const std::string &name); + void removePickupItem(const std::string &name); + void addPriorityAttackMob(std::string name); void addAttackMob(std::string name); void addIgnoreAttackMob(std::string name); - std::list getPriorityAttackMobs() const - { return mPriorityAttackMobs; } + void addPickupItem(std::string name); - std::list getAttackMobs() const - { return mAttackMobs; } + void addIgnorePickupItem(std::string name); void setPriorityAttackMobs(std::list mobs) { mPriorityAttackMobs = mobs; } @@ -250,36 +250,23 @@ class ActorSpriteManager: public ConfigListener int getAttackMobsSize() const { return static_cast(mAttackMobs.size()); } - std::list getIgnoreAttackMobs() const - { return mIgnoreAttackMobs; } - - std::set getAttackMobsSet() const - { return mAttackMobsSet; } - - std::set getPriorityAttackMobsSet() const - { return mPriorityAttackMobsSet; } - - std::set getIgnoreAttackMobsSet() const - { return mIgnoreAttackMobsSet; } - - void rebuildPriorityAttackMobs(); + int getPickupItemsSize() const + { return static_cast(mPickupItems.size()); } - void rebuildAttackMobs(); +#define defList(list1, mob) \ + bool isIn##list1##List(const std::string &name) const\ + { return m##list1##mob##Set.find(name) != m##list1##mob##Set.end(); }\ + void rebuild##list1##mob();\ + std::set get##list1##mob##Set() const\ + { return m##list1##mob##Set; }\ + std::list get##list1##mob() const\ + { return m##list1##mob; } - bool isInAttackList(const std::string &name) const - { return mAttackMobsSet.find(name) != mAttackMobsSet.end(); } - - bool isInPriorityAttackList(const std::string &name) - { - return mPriorityAttackMobsSet.find(name) - != mPriorityAttackMobsSet.end(); - } - - bool isInIgnoreAttackList(const std::string &name) - { - return mIgnoreAttackMobsSet.find(name) - != mIgnoreAttackMobsSet.end(); - } + defList(Attack, Mobs) + defList(PriorityAttack, Mobs) + defList(IgnoreAttack, Mobs) + defList(Pickup, Items) + defList(IgnorePickup, Items) std::map getAttackMobsMap() const { return mAttackMobsMap; } @@ -291,8 +278,12 @@ class ActorSpriteManager: public ConfigListener int getPriorityAttackMobIndex(std::string name); + int getPickupItemIndex(std::string name); + int getIndexByName(std::string name, std::map &map); + bool checkForPickup(FloorItem *item); + protected: bool validateBeing(Being *aroundBeing, Being* being, Being::Type type, Being* excluded = nullptr, @@ -317,14 +308,21 @@ class ActorSpriteManager: public ConfigListener bool mCycleMonsters; bool mExtMouseTargeting; - std::list mPriorityAttackMobs; - std::list mAttackMobs; - std::list mIgnoreAttackMobs; - std::set mPriorityAttackMobsSet; - std::set mAttackMobsSet; - std::set mIgnoreAttackMobsSet; - std::map mPriorityAttackMobsMap; - std::map mAttackMobsMap; +#define defVarsP(mob) \ + std::list mPriority##mob;\ + std::set mPriority##mob##Set;\ + std::map mPriority##mob##Map; + +#define defVars(mob) \ + std::list m##mob;\ + std::set m##mob##Set;\ + std::map m##mob##Map;\ + std::list mIgnore##mob;\ + std::set mIgnore##mob##Set; + + defVarsP(AttackMobs) + defVars(AttackMobs) + defVars(PickupItems) }; extern ActorSpriteManager *actorSpriteManager; diff --git a/src/defaults.cpp b/src/defaults.cpp index d65e722de..a5f8083c1 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -199,6 +199,7 @@ DefaultsData* getConfigDefaults() AddDEF(configData, "showExtMinimaps", false); AddDEF(configData, "hideChatInput", true); AddDEF(configData, "enableAttackFilter", true); + AddDEF(configData, "enablePickupFilter", true); AddDEF(configData, "securetrades", true); AddDEF(configData, "unsecureChars", "IO0@#$"); AddDEF(configData, "currentTip", 0); diff --git a/src/flooritem.h b/src/flooritem.h index 1f3126078..791b125f1 100644 --- a/src/flooritem.h +++ b/src/flooritem.h @@ -87,6 +87,9 @@ class FloorItem : public ActorSprite void setShowMsg(bool n) { mShowMsg = n; } + void disableHightlight() + { mHighlight = false; } + private: int mItemId; int mX, mY; 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(); diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 6cf02bf4a..ade74edc1 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -937,8 +937,11 @@ bool LocalPlayer::pickUp(FloorItem *item) if (dx * dx + dy * dy < dist) { - Net::getPlayerHandler()->pickUp(item); - mPickUpTarget = nullptr; + if (actorSpriteManager->checkForPickup(item)) + { + Net::getPlayerHandler()->pickUp(item); + mPickUpTarget = nullptr; + } } else if (mPickUpType >= 4 && mPickUpType <= 6) { diff --git a/src/maplayer.h b/src/maplayer.h index 861ef1318..327a6baa0 100644 --- a/src/maplayer.h +++ b/src/maplayer.h @@ -231,7 +231,9 @@ class MapItem ATTACK = 10, PRIORITY = 11, IGNORE_ = 12, - SEPARATOR = 13 + PICKUP = 13, + NOPICKUP = 14, + SEPARATOR = 15 }; MapItem(); -- cgit v1.2.3-60-g2f50