summaryrefslogtreecommitdiff
path: root/src/net/ea/playerhandler.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-02-20 15:35:36 +0300
committerAndrei Karas <akaras@inbox.ru>2015-02-20 15:35:36 +0300
commit130ad803401e9d582a2118d9bc92b984222b00f1 (patch)
tree007c13fcabe6754c3fb50265fa665f6bd616e938 /src/net/ea/playerhandler.cpp
parent16121e499c734c00c714abd0998c24f4845329c3 (diff)
downloadplus-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.cpp63
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