From 3eeae12c498d1a4dbe969462d2ba841f77ee3ccb Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 2 Jan 2011 01:48:38 +0200 Subject: Initial commit. This code based on mana client http://www.gitorious.org/mana/mana and my private repository. --- src/party.cpp | 258 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 src/party.cpp (limited to 'src/party.cpp') diff --git a/src/party.cpp b/src/party.cpp new file mode 100644 index 000000000..3ed7e08aa --- /dev/null +++ b/src/party.cpp @@ -0,0 +1,258 @@ +/* + * The Mana Client + * Copyright (C) 2010 The Mana Developers + * + * This file is part of The Mana Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "party.h" + +#include "actorspritemanager.h" + +class SortPartyFunctor +{ + public: + bool operator() (PartyMember* p1, PartyMember* p2) + { + if (!p1 || !p2) + return false; + if (p1->getLeader()) + return true; + if (p2->getLeader()) + return false; + + return p1->getName() < p2->getName(); + } +} partySorter; + +PartyMember::PartyMember(Party *party, int id, const std::string &name): + Avatar(name), mParty(party), mLeader(false) +{ + mId = id; +} + +Party::PartyMap Party::parties; + +Party::Party(short id): + mCanInviteUsers(false) +{ + mId = id; + parties[id] = this; +} + +Party::~Party() +{ + clearMembers(); +} + +PartyMember *Party::addMember(int id, const std::string &name) +{ + PartyMember *m; + if ((m = getMember(id))) + return m; + + m = new PartyMember(this, id, name); + + mMembers.push_back(m); + + return m; +} + +PartyMember *Party::getMember(int id) const +{ + MemberList::const_iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->mId == id) + return (*itr); + ++itr; + } + + return NULL; +} + +PartyMember *Party::getMember(const std::string &name) const +{ + MemberList::const_iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->getName() == name) + return (*itr); + + ++itr; + } + + return NULL; +} + +void Party::removeMember(PartyMember *member) +{ + if (!member) + return; + + MemberList::iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->mId == member->mId && + (*itr)->getName() == member->getName()) + { + PartyMember *member = (*itr); + mMembers.erase(itr); + delete member; + } + ++itr; + } +} + +void Party::removeMember(int id) +{ + MemberList::iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->mId == id) + { + PartyMember *member = (*itr); + mMembers.erase(itr); + delete member; + } + ++itr; + } +} + +void Party::removeMember(const std::string &name) +{ + MemberList::iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->getName() == name) + { + PartyMember *member = (*itr); + mMembers.erase(itr); + delete member; + } + ++itr; + } +} + +void Party::removeFromMembers() +{ + if (!actorSpriteManager) + return; + + MemberList::iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + Being *b = actorSpriteManager->findBeing((*itr)->getID()); + if (b) + b->setParty(0); + ++itr; + } +} + +Avatar *Party::getAvatarAt(int index) +{ + return mMembers[index]; +} + +void Party::setRights(short rights) +{ + // to invite, rights must be greater than 0 + if (rights > 0) + mCanInviteUsers = true; +} + +bool Party::isMember(PartyMember *member) const +{ + if (!member) + return false; + + if (member->mParty > 0 && member->mParty != this) + return false; + + MemberList::const_iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->mId == member->mId && + (*itr)->getName() == member->getName()) + { + return true; + } + ++itr; + } + + return false; +} + +bool Party::isMember(int id) const +{ + MemberList::const_iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->mId == id) + return true; + ++itr; + } + + return false; +} + +bool Party::isMember(const std::string &name) const +{ + MemberList::const_iterator itr = mMembers.begin(), + itr_end = mMembers.end(); + while (itr != itr_end) + { + if ((*itr)->getName() == name) + return true; + ++itr; + } + + return false; +} + +void Party::getNames(std::vector &names) const +{ + names.clear(); + MemberList::const_iterator it = mMembers.begin(), + it_end = mMembers.end(); + while (it != it_end) + { + names.push_back((*it)->getName()); + ++it; + } +} + +Party *Party::getParty(short id) +{ + PartyMap::iterator it = parties.find(id); + if (it != parties.end()) + return it->second; + + return new Party(id); +} + +void Party::sort() +{ + std::sort(mMembers.begin(), mMembers.end(), partySorter); +} \ No newline at end of file -- cgit v1.2.3-70-g09d2