diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-09-07 19:05:04 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-09-07 19:05:04 +0300 |
commit | d3cdfdb52f031d6974d72e61914a073cb2995d34 (patch) | |
tree | e865e27b44abdfddd3e950c6a32f7e1cfb86efdb /src/net/eathena/partyhandler.cpp | |
parent | b73aec167532701db9ab645ef5d75e5dff1fa963 (diff) | |
download | manaplus-d3cdfdb52f031d6974d72e61914a073cb2995d34.tar.gz manaplus-d3cdfdb52f031d6974d72e61914a073cb2995d34.tar.bz2 manaplus-d3cdfdb52f031d6974d72e61914a073cb2995d34.tar.xz manaplus-d3cdfdb52f031d6974d72e61914a073cb2995d34.zip |
Move processPartyInfo from ea namespace into eathena and tmwa.
Diffstat (limited to 'src/net/eathena/partyhandler.cpp')
-rw-r--r-- | src/net/eathena/partyhandler.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/net/eathena/partyhandler.cpp b/src/net/eathena/partyhandler.cpp index 99a9e86bd..2a91722ef 100644 --- a/src/net/eathena/partyhandler.cpp +++ b/src/net/eathena/partyhandler.cpp @@ -29,6 +29,7 @@ #include "being/localplayer.h" #include "gui/windows/chatwindow.h" +#include "gui/windows/socialwindow.h" #include "net/ea/gui/partytab.h" @@ -271,4 +272,108 @@ void PartyHandler::processPartySettings(Net::MessageIn &msg) processPartySettingsContinue(exp, item); } +void PartyHandler::processPartyInfo(Net::MessageIn &msg) const +{ + bool isOldParty = false; + std::set<std::string> names; + std::set<std::string> onlineNames; + if (!Ea::taParty) + { + logger->log1("error: party empty in SMSG_PARTY_INFO"); + Ea::taParty = Party::getParty(1); + } + if (Ea::taParty) + { + if (Ea::taParty->getNumberOfElements() > 1) + { + isOldParty = true; + Ea::taParty->getNamesSet(names); + const Party::MemberList *const members = Ea::taParty->getMembers(); + FOR_EACHP (Party::MemberList::const_iterator, it, members) + { + if ((*it)->getOnline()) + onlineNames.insert((*it)->getName()); + } + if (localPlayer) + onlineNames.insert(localPlayer->getName()); + } + } + + if (!localPlayer) + logger->log1("error: localPlayer==0 in SMSG_PARTY_INFO"); + + if (Ea::taParty) + Ea::taParty->clearMembers(); + + const int length = msg.readInt16(); + if (Ea::taParty) + Ea::taParty->setName(msg.readString(24)); + + const int count = (length - 28) / 46; + if (localPlayer && Ea::taParty) + { + localPlayer->setParty(Ea::taParty); + localPlayer->setPartyName(Ea::taParty->getName()); + } + + for (int i = 0; i < count; i++) + { + const int id = msg.readInt32(); + std::string nick = msg.readString(24); + std::string map = msg.readString(16); + const bool leader = msg.readUInt8() == 0U; + const bool online = msg.readUInt8() == 0U; + + if (Ea::taParty) + { + bool joined(false); + + if (isOldParty) + { + if (names.find(nick) == names.end()) + { + NotifyManager::notify(NotifyTypes::PARTY_USER_JOINED, + nick); + joined = true; + } + } + PartyMember *const member = Ea::taParty->addMember(id, nick); + if (member) + { + if (!joined && Ea::partyTab) + { + if (!names.empty() && ((onlineNames.find(nick) + == onlineNames.end() && online) + || (onlineNames.find(nick) != onlineNames.end() + && !online))) + { + Ea::partyTab->showOnline(nick, online); + } + + member->setLeader(leader); + member->setOnline(online); + member->setMap(map); + } + else + { + member->setLeader(leader); + member->setOnline(online); + member->setMap(map); + } + } + } + } + + if (Ea::taParty) + Ea::taParty->sort(); + + if (localPlayer && Ea::taParty) + { + localPlayer->setParty(Ea::taParty); + localPlayer->setPartyName(Ea::taParty->getName()); + if (socialWindow) + socialWindow->updateParty(); + } +} + } // namespace EAthena |