From d9773c380e06c089cfee85f07a81ab9167af2982 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 20 Jun 2015 19:23:57 +0300 Subject: Move processOnlineList from ea namespace into eathena. --- src/net/eathena/playerhandler.cpp | 65 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'src/net/eathena/playerhandler.cpp') diff --git a/src/net/eathena/playerhandler.cpp b/src/net/eathena/playerhandler.cpp index b7f83ead1..d1c48bfbd 100644 --- a/src/net/eathena/playerhandler.cpp +++ b/src/net/eathena/playerhandler.cpp @@ -22,10 +22,16 @@ #include "net/eathena/playerhandler.h" +#include "configuration.h" + +#include "being/beingflag.h" #include "being/localplayer.h" #include "being/playerinfo.h" +#include "gui/onlineplayer.h" + #include "gui/windows/statuswindow.h" +#include "gui/windows/whoisonline.h" #include "input/inputmanager.h" @@ -664,4 +670,63 @@ void PlayerHandler::processPlayerClientCommand(Net::MessageIn &msg) inputManager.executeChatCommand(cmd, args, nullptr); } +void PlayerHandler::processOnlineList(Net::MessageIn &msg) +{ + if (!whoIsOnline) + return; + + BLOCK_START("PlayerHandler::processOnlineList") + const int size = msg.readInt16("len") - 4; + std::vector arr; + + if (!size) + { + if (whoIsOnline) + whoIsOnline->loadList(arr); + BLOCK_END("PlayerHandler::processOnlineList") + return; + } + + char *const start = reinterpret_cast(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(addVal))) + { + unsigned char status = *buf; + buf ++; + unsigned char level = *buf; + buf ++; + unsigned char ver = *buf; + buf ++; + + GenderT 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(buf), + status, level, gender, ver)); + buf += strlen(buf) + 1; + } + + if (whoIsOnline) + whoIsOnline->loadList(arr); + delete [] start; + BLOCK_END("PlayerHandler::processOnlineList") +} + } // namespace EAthena -- cgit v1.2.3-60-g2f50