From 8f10444e4ce4a4e25455f0a3857edc7ca74631e8 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Tue, 26 Apr 2011 21:56:11 +0300 Subject: Impliment 3 attack lists. (priority, attack, ignore) --- src/gui/popupmenu.cpp | 136 ++++++++++++++++++++++++++++++++------ src/gui/popupmenu.h | 2 +- src/gui/socialwindow.cpp | 43 ++++++++++-- src/gui/viewport.cpp | 4 +- src/gui/viewport.h | 2 +- src/gui/widgets/avatarlistbox.cpp | 65 +++++++++--------- 6 files changed, 193 insertions(+), 59 deletions(-) (limited to 'src/gui') diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp index 7b0688587..ad0cb275f 100644 --- a/src/gui/popupmenu.cpp +++ b/src/gui/popupmenu.cpp @@ -254,18 +254,18 @@ void PopupMenu::showPopup(int x, int y, Being *being) if (config.getBoolValue("enableAttackFilter")) { mBrowserBox->addRow("##3---"); - if (player_node->isInAttackList(name)) + if (player_node->isInAttackList(name) + || player_node->isInIgnoreAttackList(name) + || player_node->isInPriorityAttackList(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 priority|Add " + "to priority attack list@@")); mBrowserBox->addRow( _("@@add attack|Add to attack list@@")); mBrowserBox->addRow( @@ -1165,6 +1165,15 @@ void PopupMenu::handleLink(const std::string &link, socialWindow->updateAttackFilter(); } } + else if (link == "add attack priority" && being) + { + if (player_node && being->getType() == Being::MONSTER) + { + player_node->addPriorityAttackMob(being->getName()); + if (socialWindow) + socialWindow->updateAttackFilter(); + } + } else if (link == "add attack ignore" && being) { if (player_node && being->getType() == Being::MONSTER) @@ -1203,6 +1212,36 @@ void PopupMenu::handleLink(const std::string &link, } } } + else if (link == "priority moveup") + { + if (player_node) + { + int idx = player_node->getPriorityAttackMobIndex(mNick); + if (idx > 0) + { + std::list mobs + = player_node->getPriorityAttackMobs(); + 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->setPriorityAttackMobs(mobs); + player_node->rebuildPriorityAttackMobs(); + break; + } + ++ it; + ++ it2; + } + + if (socialWindow) + socialWindow->updateAttackFilter(); + } + } + } else if (link == "attack movedown") { if (player_node) @@ -1236,6 +1275,40 @@ void PopupMenu::handleLink(const std::string &link, } } } + else if (link == "priority movedown") + { + if (player_node) + { + int idx = player_node->getPriorityAttackMobIndex(mNick); + int size = player_node->getPriorityAttackMobsSize(); + if (idx + 1 < size) + { + std::list mobs + = player_node->getPriorityAttackMobs(); + 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->setPriorityAttackMobs(mobs); + player_node->rebuildPriorityAttackMobs(); + break; + } + ++ it; + ++ it2; + } + + if (socialWindow) + socialWindow->updateAttackFilter(); + } + } + } else if (link == "attack remove") { if (player_node) @@ -1606,7 +1679,7 @@ void PopupMenu::showPopup(int x, int y, ProgressBar *b) } void PopupMenu::showAttackMonsterPopup(int x, int y, std::string name, - bool isAttack) + int type) { if (!player_node) return; @@ -1619,27 +1692,48 @@ void PopupMenu::showAttackMonsterPopup(int x, int y, std::string name, mBrowserBox->addRow(_("(default)")); else mBrowserBox->addRow(name); - if (isAttack) + switch (type) { - int idx = player_node->getAttackMobIndex(name); - int size = player_node->getAttackMobsSize(); - if (idx > 0) + case MapItem::ATTACK: { + 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 moveup|%s@@", _("Move up"))); + "@@attack remove|%s@@", _("Remove"))); + break; } - if (idx + 1 < size) + case MapItem::PRIORITY: { + int idx = player_node->getPriorityAttackMobIndex(name); + int size = player_node->getPriorityAttackMobsSize(); + if (idx > 0) + { + mBrowserBox->addRow(strprintf( + "@@priority moveup|%s@@", _("Move up"))); + } + if (idx + 1 < size) + { + mBrowserBox->addRow(strprintf( + "@@priority movedown|%s@@", _("Move down"))); + } mBrowserBox->addRow(strprintf( - "@@attack movedown|%s@@", _("Move down"))); + "@@attack remove|%s@@", _("Remove"))); + break; } - mBrowserBox->addRow(strprintf( - "@@attack remove|%s@@", _("Remove"))); - } - else - { - mBrowserBox->addRow(strprintf( - "@@attack remove|%s@@", _("Remove"))); + case MapItem::IGNORE: + mBrowserBox->addRow(strprintf( + "@@attack remove|%s@@", _("Remove"))); + break; } mBrowserBox->addRow("##3---"); diff --git a/src/gui/popupmenu.h b/src/gui/popupmenu.h index 61720d417..208652083 100644 --- a/src/gui/popupmenu.h +++ b/src/gui/popupmenu.h @@ -118,7 +118,7 @@ class PopupMenu : public Popup, public LinkHandler void showSpellPopup(int x, int y, TextCommand *cmd); void showAttackMonsterPopup(int x, int y, std::string name, - bool isAttack); + int type); /** * Shows the related popup menu when right click on the chat diff --git a/src/gui/socialwindow.cpp b/src/gui/socialwindow.cpp index c6ec12cd8..d25ca209d 100644 --- a/src/gui/socialwindow.cpp +++ b/src/gui/socialwindow.cpp @@ -808,7 +808,7 @@ public: std::vector *avatars = mBeings->getMembers(); - std::list mobs = player_node->getAttackMobs(); + std::list mobs = player_node->getPriorityAttackMobs(); std::list::iterator i = mobs.begin(); std::vector::iterator ia = avatars->begin(); @@ -820,7 +820,7 @@ public: } avatars->clear(); - Avatar *ava = new Avatar(_("Selected mobs")); + Avatar *ava = new Avatar(_("Priority mobs")); ava->setOnline(false); ava->setLevel(-1); ava->setType(MapItem::SEPARATOR); @@ -844,7 +844,42 @@ public: Avatar *ava = new Avatar(name); ava->setOnline(true); ava->setLevel(level); - ava->setType(MapItem::MONSTER); + ava->setType(MapItem::PRIORITY); + ava->setX(0); + ava->setY(0); + avatars->push_back(ava); + + ++ i; + } + + 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); + + mobs = player_node->getAttackMobs(); + i = mobs.begin(); + + while (i != mobs.end()) + { + std::string name; + int level = -1; + if (*i == "") + { + name = _("(default)"); + level = 0; + } + else + { + name = *i; + } + Avatar *ava = new Avatar(name); + ava->setOnline(true); + ava->setLevel(level); + ava->setType(MapItem::ATTACK); ava->setX(0); ava->setY(0); avatars->push_back(ava); @@ -879,7 +914,7 @@ public: Avatar *ava = new Avatar(name); ava->setOnline(false); ava->setLevel(level); - ava->setType(MapItem::MONSTER); + ava->setType(MapItem::IGNORE); ava->setX(0); ava->setY(0); avatars->push_back(ava); diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index 9688c818a..478059f53 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -625,10 +625,10 @@ void Viewport::showPopup(int x, int y, ProgressBar *bar) mPopupMenu->showPopup(x, y, bar); } -void Viewport::showAttackMonsterPopup(std::string name, bool isAttack) +void Viewport::showAttackMonsterPopup(std::string name, int type) { mPopupMenu->showAttackMonsterPopup(getMouseX(), getMouseY(), - name, isAttack); + name, type); } void Viewport::closePopupMenu() diff --git a/src/gui/viewport.h b/src/gui/viewport.h index 59db38e4c..d3a3bfe4b 100644 --- a/src/gui/viewport.h +++ b/src/gui/viewport.h @@ -160,7 +160,7 @@ class Viewport : public WindowContainer, public gcn::MouseListener, void showSpellPopup(TextCommand *cmd); - void showAttackMonsterPopup(std::string name, bool isAttack); + void showAttackMonsterPopup(std::string name, int type); /** * Shows the related popup menu when right click on the chat diff --git a/src/gui/widgets/avatarlistbox.cpp b/src/gui/widgets/avatarlistbox.cpp index f3bdb6a45..d16388837 100644 --- a/src/gui/widgets/avatarlistbox.cpp +++ b/src/gui/widgets/avatarlistbox.cpp @@ -308,42 +308,47 @@ void AvatarListBox::mousePressed(gcn::MouseEvent &event) } else if (event.getButton() == gcn::MouseEvent::RIGHT) { - if (ava->getType() == AVATAR_PLAYER) + switch (ava->getType()) { - Being* being = actorSpriteManager->findBeingByName( - model->getAvatarAt(selected)->getName(), Being::PLAYER); - if (being) - { - viewport->showPopup(event.getX(), event.getY(), being); - } - else + case AVATAR_PLAYER: { - viewport->showPlayerPopup( - model->getAvatarAt(selected)->getName()); - } - } - else if (ava->getType() == MapItem::MONSTER) - { - if (model->getAvatarAt(selected)->getLevel() == 0) - { - viewport->showAttackMonsterPopup("", - model->getAvatarAt(selected)->getOnline()); + Being* being = actorSpriteManager->findBeingByName( + model->getAvatarAt(selected)->getName(), Being::PLAYER); + if (being) + { + viewport->showPopup(event.getX(), event.getY(), being); + } + else + { + viewport->showPlayerPopup( + model->getAvatarAt(selected)->getName()); + } + break; } - else + case MapItem::ATTACK: + case MapItem::PRIORITY: + case MapItem::IGNORE: { - viewport->showAttackMonsterPopup( - model->getAvatarAt(selected)->getName(), - model->getAvatarAt(selected)->getOnline()); + std::string name; + if (model->getAvatarAt(selected)->getLevel() == 0) + name = ""; + else + name = model->getAvatarAt(selected)->getName(); + + viewport->showAttackMonsterPopup(name, + model->getAvatarAt(selected)->getType()); + break; } - } - else - { - Map *map = viewport->getMap(); - Avatar *ava = model->getAvatarAt(selected); - if (map && ava) + default: { - MapItem *mapItem = map->findPortalXY(ava->getX(), ava->getY()); - viewport->showPopup(mapItem); + Map *map = viewport->getMap(); + Avatar *ava = model->getAvatarAt(selected); + if (map && ava) + { + MapItem *mapItem = map->findPortalXY(ava->getX(), ava->getY()); + viewport->showPopup(mapItem); + } + break; } } } -- cgit v1.2.3-70-g09d2