diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-02-20 15:35:36 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-02-20 15:35:36 +0300 |
commit | 130ad803401e9d582a2118d9bc92b984222b00f1 (patch) | |
tree | 007c13fcabe6754c3fb50265fa665f6bd616e938 /src/net/ea/playerhandler.cpp | |
parent | 16121e499c734c00c714abd0998c24f4845329c3 (diff) | |
download | plus-130ad803401e9d582a2118d9bc92b984222b00f1.tar.gz plus-130ad803401e9d582a2118d9bc92b984222b00f1.tar.bz2 plus-130ad803401e9d582a2118d9bc92b984222b00f1.tar.xz plus-130ad803401e9d582a2118d9bc92b984222b00f1.zip |
eathena: add support for online list packets.
Diffstat (limited to 'src/net/ea/playerhandler.cpp')
-rw-r--r-- | src/net/ea/playerhandler.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/net/ea/playerhandler.cpp b/src/net/ea/playerhandler.cpp index b8210219d..a2833eee3 100644 --- a/src/net/ea/playerhandler.cpp +++ b/src/net/ea/playerhandler.cpp @@ -22,20 +22,24 @@ #include "net/ea/playerhandler.h" +#include "configuration.h" #include "game.h" #include "party.h" #include "notifymanager.h" #include "soundmanager.h" #include "units.h" +#include "being/beingflag.h" #include "being/localplayer.h" #include "enums/being/attributes.h" +#include "gui/onlineplayer.h" #include "gui/viewport.h" #include "gui/windows/skilldialog.h" #include "gui/windows/statuswindow.h" +#include "gui/windows/whoisonline.h" #include "resources/notifytypes.h" @@ -471,4 +475,63 @@ void PlayerHandler::processMapMusic(Net::MessageIn &msg) map->setMusicFile(music); } +void PlayerHandler::processOnlineList(Net::MessageIn &msg) +{ + if (!whoIsOnline) + return; + + BLOCK_START("PlayerHandler::processOnlineList") + const int size = msg.readInt16("len") - 4; + std::vector<OnlinePlayer*> arr; + + if (!size) + { + if (whoIsOnline) + whoIsOnline->loadList(arr); + BLOCK_END("PlayerHandler::processOnlineList") + return; + } + + char *const start = reinterpret_cast<char*>(msg.readBytes(size, "nicks")); + if (!start) + { + BLOCK_END("PlayerHandler::processOnlineList") + return; + } + + const char *buf = start; + + int addVal = 3; + + while (buf - start + 1 < size + && *(buf + static_cast<size_t>(addVal))) + { + unsigned char status = *buf; + buf ++; + unsigned char level = *buf; + buf ++; + unsigned char ver = *buf; + buf ++; + + unsigned char gender = Gender::UNSPECIFIED; + if (config.getBoolValue("showgender")) + { + if (status & BeingFlag::GENDER_MALE) + gender = Gender::MALE; + else if (status & BeingFlag::GENDER_OTHER) + gender = Gender::OTHER; + else + gender = Gender::FEMALE; + } + arr.push_back(new OnlinePlayer(static_cast<const char*>(buf), + status, level, gender, ver)); + buf += strlen(buf) + 1; + } + + if (whoIsOnline) + whoIsOnline->loadList(arr); + delete [] start; + BLOCK_END("PlayerHandler::processOnlineList") +} + } // namespace Ea |