summaryrefslogtreecommitdiff
path: root/src/net/eathena/playerhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/eathena/playerhandler.cpp')
-rw-r--r--src/net/eathena/playerhandler.cpp65
1 files changed, 65 insertions, 0 deletions
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<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 ++;
+
+ 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<const char*>(buf),
+ status, level, gender, ver));
+ buf += strlen(buf) + 1;
+ }
+
+ if (whoIsOnline)
+ whoIsOnline->loadList(arr);
+ delete [] start;
+ BLOCK_END("PlayerHandler::processOnlineList")
+}
+
} // namespace EAthena