summaryrefslogtreecommitdiff
path: root/src/net/eathena
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/eathena')
-rw-r--r--src/net/eathena/playerhandler.cpp65
-rw-r--r--src/net/eathena/playerhandler.h2
2 files changed, 67 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
diff --git a/src/net/eathena/playerhandler.h b/src/net/eathena/playerhandler.h
index 5207b4ce7..32ab731e3 100644
--- a/src/net/eathena/playerhandler.h
+++ b/src/net/eathena/playerhandler.h
@@ -112,6 +112,8 @@ class PlayerHandler final : public MessageHandler, public Ea::PlayerHandler
static void processPlayerRankPoints(Net::MessageIn &msg);
static void processPlayerClientCommand(Net::MessageIn &msg);
+
+ static void processOnlineList(Net::MessageIn &msg);
};
} // namespace EAthena