From 8037d33c9f429d4c0322da383cdda46776c3c14e Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 21 Apr 2011 05:25:01 +0300 Subject: Impliment attack filter. Add tab in social tab. --- src/gui/popupmenu.cpp | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) (limited to 'src/gui/popupmenu.cpp') diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp index 6c43fdfa1..06ee9a9b8 100644 --- a/src/gui/popupmenu.cpp +++ b/src/gui/popupmenu.cpp @@ -246,7 +246,32 @@ void PopupMenu::showPopup(int x, int y, Being *being) mBrowserBox->addRow(_("@@attack|Attack@@")); if (player_node->isGM()) + { + mBrowserBox->addRow("##3---"); mBrowserBox->addRow(_("@@admin-kick|Kick@@")); + } + + if (config.getBoolValue("enableAttackFilter")) + { + mBrowserBox->addRow("##3---"); + if (player_node->isInAttackList(name)) + { + mBrowserBox->addRow( + _("@@remove attack|Remove from attack list@@")); + } + else if (player_node->isInIgnoreAttackList(name)) + { + mBrowserBox->addRow( + _("@@remove attack|Remove from ignore list@@")); + } + else + { + mBrowserBox->addRow( + _("@@add attack|Add to attack list@@")); + mBrowserBox->addRow( + _("@@add attack ignore|Add to ignore list@@")); + } + } } break; @@ -1122,6 +1147,120 @@ void PopupMenu::handleLink(const std::string &link, { mTab->setNoAway(false); } + else if (link == "remove attack" && being) + { + if (player_node && being->getType() == Being::MONSTER) + { + player_node->removeAttackMob(being->getName()); + if (socialWindow) + socialWindow->updateAttackFilter(); + } + } + else if (link == "add attack" && being) + { + if (player_node && being->getType() == Being::MONSTER) + { + player_node->addAttackMob(being->getName()); + if (socialWindow) + socialWindow->updateAttackFilter(); + } + } + else if (link == "add attack ignore" && being) + { + if (player_node && being->getType() == Being::MONSTER) + { + player_node->addIgnoreAttackMob(being->getName()); + if (socialWindow) + socialWindow->updateAttackFilter(); + } + } + else if (link == "attack moveup") + { + if (player_node) + { + int idx = player_node->getAttackMobIndex(mNick); + if (idx > 0) + { + std::list mobs = player_node->getAttackMobs(); + std::list::iterator it = mobs.begin(); + std::list::iterator it2 = mobs.begin(); + while (it != mobs.end()) + { + if (*it == mNick) + { + -- it2; + mobs.splice(it2, mobs, it); + player_node->setAttackMobs(mobs); + player_node->rebuildAttackMobs(); + break; + } + ++ it; + ++ it2; + } + + if (socialWindow) + socialWindow->updateAttackFilter(); + } + } + } + else if (link == "attack movedown") + { + if (player_node) + { + int idx = player_node->getAttackMobIndex(mNick); + int size = player_node->getAttackMobsSize(); + if (idx + 1 < size) + { + std::list mobs = player_node->getAttackMobs(); + std::list::iterator it = mobs.begin(); + std::list::iterator it2 = mobs.begin(); + while (it != mobs.end()) + { + if (*it == mNick) + { + ++ it2; + if (it2 == mobs.end()) + break; + + mobs.splice(it, mobs, it2); + player_node->setAttackMobs(mobs); + player_node->rebuildAttackMobs(); + break; + } + ++ it; + ++ it2; + } + + if (socialWindow) + socialWindow->updateAttackFilter(); + } + } + } + else if (link == "attack remove") + { + if (player_node) + { + if (mNick.empty()) + { + if (player_node->isInAttackList(mNick)) + { + player_node->removeAttackMob(mNick); + player_node->addIgnoreAttackMob(mNick); + } + else + { + player_node->removeAttackMob(mNick); + player_node->addAttackMob(mNick); + } + } + else + { + player_node->removeAttackMob(mNick); + } + if (socialWindow) + socialWindow->updateAttackFilter(); + } + } else if (link == "guild-pos" && !mNick.empty()) { showChangePos(getX(), getY()); @@ -1459,6 +1598,49 @@ void PopupMenu::showPopup(int x, int y, ProgressBar *b) showPopup(x, y); } +void PopupMenu::showAttackMonsterPopup(int x, int y, std::string name, + bool isAttack) +{ + if (!player_node) + return; + + mNick = name; + + mBrowserBox->clearRows(); + + if (name.empty()) + mBrowserBox->addRow(_("(default)")); + else + mBrowserBox->addRow(name); + if (isAttack) + { + int idx = player_node->getAttackMobIndex(name); + int size = player_node->getAttackMobsSize(); + if (idx > 0) + { + mBrowserBox->addRow(strprintf( + "@@attack moveup|%s@@", _("Move up"))); + } + if (idx + 1 < size) + { + mBrowserBox->addRow(strprintf( + "@@attack movedown|%s@@", _("Move down"))); + } + mBrowserBox->addRow(strprintf( + "@@attack remove|%s@@", _("Remove"))); + } + else + { + mBrowserBox->addRow(strprintf( + "@@attack remove|%s@@", _("Remove"))); + } + + mBrowserBox->addRow("##3---"); + mBrowserBox->addRow(strprintf("@@cancel|%s@@", _("Cancel"))); + + showPopup(x, y); +} + void PopupMenu::showPopup(int x, int y) { setContentSize(mBrowserBox->getWidth() + 8, mBrowserBox->getHeight() + 8); -- cgit v1.2.3-70-g09d2