diff options
author | Erik Schilling <ablu.erikschilling@googlemail.com> | 2012-03-21 21:01:53 +0100 |
---|---|---|
committer | Erik Schilling <ablu.erikschilling@googlemail.com> | 2012-04-19 19:10:50 +0200 |
commit | 67a608b1d13780d19271fedec004bf49b2b2b908 (patch) | |
tree | a5b90dc8f650ebe99185650629bddf3f6c424a19 /src/chat-server/guildmanager.cpp | |
parent | a8d65824ea87d5c52ad662530b699650195e83ce (diff) | |
download | manaserv-67a608b1d13780d19271fedec004bf49b2b2b908.tar.gz manaserv-67a608b1d13780d19271fedec004bf49b2b2b908.tar.xz manaserv-67a608b1d13780d19271fedec004bf49b2b2b908.zip |
Fixed guild support
List of things fixed:
- fixed having multiple guild support everywhere
- implemented kick code (untested due to missing kick possiblity in client)
- fixed giving owner rights to next member when owner leaves guild
- fixed potentional segmention fault when trying to access deleted guild after all members left
- fixed saving right changes to database
- made searching for guilds faster a bit (at least when having many guilds)
TODO:
+ Fix conflict between guild and normal channels
+ Fix being able to leave guild channel without leaving guild itself
+ Add kick possiblity to client
Reviewed-by: bjorn.
Diffstat (limited to 'src/chat-server/guildmanager.cpp')
-rw-r--r-- | src/chat-server/guildmanager.cpp | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/src/chat-server/guildmanager.cpp b/src/chat-server/guildmanager.cpp index 5125486..39b0bdb 100644 --- a/src/chat-server/guildmanager.cpp +++ b/src/chat-server/guildmanager.cpp @@ -24,6 +24,7 @@ #include "common/manaserv_protocol.h" #include "account-server/storage.h" #include "chat-server/chatclient.h" +#include "chat-server/chatchannelmanager.h" #include "chat-server/chathandler.h" using namespace ManaServ; @@ -49,9 +50,8 @@ Guild* GuildManager::createGuild(const std::string &name, int playerId) // Add guild to db storage->addGuild(guild); - // Add guild, and add owner + // Add guild mGuilds[guild->getId()] = guild; - mOwners.push_back(playerId); // put the owner in the guild addGuildMember(guild, playerId); @@ -67,7 +67,6 @@ Guild* GuildManager::createGuild(const std::string &name, int playerId) void GuildManager::removeGuild(Guild *guild) { storage->removeGuild(guild); - mOwners.remove(guild->getOwner()); mGuilds.erase(guild->getId()); delete guild; } @@ -78,17 +77,37 @@ void GuildManager::addGuildMember(Guild *guild, int playerId) guild->addMember(playerId); } -void GuildManager::removeGuildMember(Guild *guild, int playerId) +void GuildManager::removeGuildMember(Guild *guild, int playerId, + const std::string &characterName, + ChatClient *client) { // remove the user from the guild storage->removeGuildMember(guild->getId(), playerId); guild->removeMember(playerId); + chatHandler->sendGuildListUpdate(guild, characterName, + GUILD_EVENT_LEAVING_PLAYER); + // if theres no more members left delete the guild if (guild->memberCount() == 0) + { + chatChannelManager->removeChannel( + chatChannelManager->getChannelId(guild->getName())); removeGuild(guild); + } - mOwners.remove(playerId); + if (client) + { + for (std::vector<Guild *>::iterator it = client->guilds.begin(), + it_end = client->guilds.end(); it != it_end; ++it) + { + if (*it == guild) + { + client->guilds.erase(it); + break; + } + } + } } Guild *GuildManager::findById(short id) const @@ -115,29 +134,26 @@ bool GuildManager::doesExist(const std::string &name) const return findByName(name) != 0; } -std::vector<Guild*> GuildManager::getGuildsForPlayer(int playerId) const +std::vector<Guild *> GuildManager::getGuildsForPlayer(int playerId) const { - std::vector<Guild*> guildList; - + std::vector<Guild *> guilds; for (std::map<int, Guild*>::const_iterator it = mGuilds.begin(); it != mGuilds.end(); ++it) { if (it->second->checkInGuild(playerId)) { - guildList.push_back(it->second); + guilds.push_back(it->second); } } - return guildList; + return guilds; } void GuildManager::disconnectPlayer(ChatClient *player) { - std::vector<Guild*> guildList = getGuildsForPlayer(player->characterId); - - for (std::vector<Guild*>::const_iterator it = guildList.begin(); - it != guildList.end(); ++it) + for (std::vector<Guild *>::iterator it = player->guilds.begin(), + it_end = player->guilds.end(); it != it_end; ++it) { - chatHandler->sendGuildListUpdate((*it)->getName(), + chatHandler->sendGuildListUpdate(*it, player->characterName, GUILD_EVENT_OFFLINE_PLAYER); } @@ -146,7 +162,7 @@ void GuildManager::disconnectPlayer(ChatClient *player) int GuildManager::changeMemberLevel(ChatClient *player, Guild *guild, int playerId, int level) { - if (guild->checkInGuild(player->characterId) && guild->checkInGuild(playerId)) + if (guild->checkInGuild(playerId)) { int playerLevel = guild->getUserPermissions(player->characterId); @@ -161,21 +177,6 @@ int GuildManager::changeMemberLevel(ChatClient *player, Guild *guild, return -1; } -bool GuildManager::alreadyOwner(int playerId) const -{ - std::list<int>::const_iterator it = mOwners.begin(); - std::list<int>::const_iterator it_end = mOwners.end(); - - while (it != it_end) - { - if (*it == playerId) - return true; - ++it; - } - - return false; -} - void GuildManager::setUserRights(Guild *guild, int playerId, int rights) { // Set and save the member rights |