summaryrefslogtreecommitdiff
path: root/src/guild.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/guild.cpp')
-rw-r--r--src/guild.cpp296
1 files changed, 296 insertions, 0 deletions
diff --git a/src/guild.cpp b/src/guild.cpp
new file mode 100644
index 000000000..c79c574b9
--- /dev/null
+++ b/src/guild.cpp
@@ -0,0 +1,296 @@
+/*
+ * The Mana Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "guild.h"
+
+#include "actorspritemanager.h"
+
+class SortGuildFunctor
+{
+ public:
+ bool operator() (GuildMember* m1, GuildMember* m2)
+ {
+ if (!m1 || !m2)
+ return false;
+ if (m1->getPos() != m2->getPos())
+ return m1->getPos() < m2->getPos();
+
+ return m1->getName() < m2->getName();
+ }
+} guildSorter;
+
+GuildMember::GuildMember(Guild *guild, int accountId, int charId,
+ const std::string &name):
+ Avatar(name), mGuild(guild), mPos(0)
+{
+ mId = accountId;
+ mCharId = charId;
+}
+
+GuildMember::GuildMember(Guild *guild, const std::string &name):
+ Avatar(name), mGuild(guild), mPos(0)
+{
+}
+
+std::string GuildMember::getAdditionString() const
+{
+ if (!mGuild)
+ return "";
+
+ return " - " + mGuild->getPos(mPos);
+}
+
+Guild::GuildMap Guild::guilds;
+
+Guild::Guild(short id):
+ mId(id),
+ mCanInviteUsers(false),
+ mEmblemId(0)
+{
+ guilds[id] = this;
+}
+
+GuildMember *Guild::addMember(int accountId, int charId,
+ const std::string &name)
+{
+ GuildMember *m;
+ if ((m = getMember(accountId, charId)))
+ return m;
+
+ m = new GuildMember(this, accountId, charId, name);
+
+ mMembers.push_back(m);
+
+ return m;
+}
+
+GuildMember *Guild::addMember(const std::string &name)
+{
+ GuildMember *m;
+ if ((m = getMember(name)))
+ return m;
+
+ m = new GuildMember(this, name);
+
+ mMembers.push_back(m);
+
+ return m;
+}
+
+GuildMember *Guild::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;
+}
+
+GuildMember *Guild::getMember(int accountId, int charId) const
+{
+ MemberList::const_iterator itr = mMembers.begin(),
+ itr_end = mMembers.end();
+ while (itr != itr_end)
+ {
+ if ((*itr)->mId == accountId && (*itr)->mCharId == charId)
+ return (*itr);
+ ++itr;
+ }
+
+ return NULL;
+}
+
+GuildMember *Guild::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 Guild::removeMember(GuildMember *member)
+{
+ MemberList::iterator itr = mMembers.begin(),
+ itr_end = mMembers.end();
+ while (itr != itr_end)
+ {
+ if ((*itr)->mId == member->mId &&
+ (*itr)->mCharId == member->mCharId &&
+ (*itr)->getName() == member->getName())
+ {
+ mMembers.erase(itr);
+ delete *itr;
+ }
+ ++itr;
+ }
+}
+
+void Guild::removeMember(int id)
+{
+ MemberList::iterator itr = mMembers.begin(),
+ itr_end = mMembers.end();
+ while (itr != itr_end)
+ {
+ if ((*itr)->mId == id)
+ mMembers.erase(itr);
+ ++itr;
+ }
+}
+
+void Guild::removeMember(const std::string &name)
+{
+ MemberList::iterator itr = mMembers.begin(),
+ itr_end = mMembers.end();
+ while (itr != itr_end)
+ {
+ if ((*itr)->getName() == name)
+ mMembers.erase(itr);
+ ++itr;
+ }
+}
+
+void Guild::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->removeGuild(getId());
+ ++itr;
+ }
+}
+
+Avatar *Guild::getAvatarAt(int index)
+{
+ return mMembers[index];
+}
+
+void Guild::setRights(short rights)
+{
+ // to invite, rights must be greater than 0
+ if (rights > 0)
+ mCanInviteUsers = true;
+}
+
+bool Guild::isMember(GuildMember *member) const
+{
+ if (member->mGuild > 0 && member->mGuild != 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 Guild::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 Guild::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 Guild::getNames(std::vector<std::string> &names) const
+{
+ names.clear();
+ MemberList::const_iterator it = mMembers.begin(),
+ it_end = mMembers.end();
+
+ while (it != it_end)
+ {
+ names.push_back((*it)->getName());
+ ++it;
+ }
+}
+
+void Guild::addPos(int id, std::string name)
+{
+ mPositions[id] = name;
+}
+
+Guild *Guild::getGuild(short id)
+{
+ GuildMap::iterator it = guilds.find(id);
+ if (it != guilds.end())
+ return it->second;
+
+ return new Guild(id);
+}
+
+std::string Guild::getPos(int id) const
+{
+ PositionsMap::const_iterator it = mPositions.find(id);
+ if (it == mPositions.end())
+ return "";
+ else
+ return it->second;
+}
+
+void Guild::sort()
+{
+ std::sort(mMembers.begin(), mMembers.end(), guildSorter);
+} \ No newline at end of file