From 7c6621108b54fd66fbb7aa87be067a34abcc3ced Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 30 Nov 2011 18:13:03 +0300 Subject: Add server side online players list support. --- src/net/tmwa/network.cpp | 2 +- src/net/tmwa/playerhandler.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/net/tmwa/playerhandler.h | 2 ++ src/net/tmwa/protocol.h | 2 ++ 4 files changed, 46 insertions(+), 1 deletion(-) (limited to 'src/net/tmwa') diff --git a/src/net/tmwa/network.cpp b/src/net/tmwa/network.cpp index 3181ec898..db006c5c0 100644 --- a/src/net/tmwa/network.cpp +++ b/src/net/tmwa/network.cpp @@ -83,7 +83,7 @@ short packet_lengths[] = -1, -1, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56, -1, 4, 5, 10, // #0x0200 26, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 19, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; diff --git a/src/net/tmwa/playerhandler.cpp b/src/net/tmwa/playerhandler.cpp index c34c661e8..20156d8cb 100644 --- a/src/net/tmwa/playerhandler.cpp +++ b/src/net/tmwa/playerhandler.cpp @@ -30,6 +30,8 @@ #include "net/tmwa/npchandler.h" #include "net/tmwa/inventoryhandler.h" +#include "gui/whoisonline.h" + #include "debug.h" extern Net::PlayerHandler *playerHandler; @@ -50,6 +52,7 @@ PlayerHandler::PlayerHandler() SMSG_PLAYER_STAT_UPDATE_5, SMSG_PLAYER_STAT_UPDATE_6, SMSG_PLAYER_ARROW_MESSAGE, + SMSG_ONLINE_LIST, 0 }; handledMessages = _messages; @@ -97,6 +100,9 @@ void PlayerHandler::handleMessage(Net::MessageIn &msg) processPlayerArrowMessage(msg); break; + case SMSG_ONLINE_LIST: + processOnlineList(msg); + default: break; } @@ -201,4 +207,39 @@ void PlayerHandler::respawn() outMsg.writeInt8(0); } +void PlayerHandler::requestOnlineList() +{ + MessageOut outMsg(CMSG_ONLINE_LIST); +} + +void PlayerHandler::processOnlineList(Net::MessageIn &msg) +{ + if (!whoIsOnline) + return; + + int size = msg.readInt16() - 4; + std::vector arr; + + if (!size) + { + if (whoIsOnline) + whoIsOnline->loadList(arr); + return; + } + + const char *start = msg.readBytes(size); + const char *buf = start; + + while (buf - start + 1 < size && *(buf + 1)) + { + char status = *buf; // now unused + buf ++; + arr.push_back(buf); + buf += strlen(buf) + 1; + } + + if (whoIsOnline) + whoIsOnline->loadList(arr); +} + } // namespace TmwAthena diff --git a/src/net/tmwa/playerhandler.h b/src/net/tmwa/playerhandler.h index bf8e861ff..898bdae3d 100644 --- a/src/net/tmwa/playerhandler.h +++ b/src/net/tmwa/playerhandler.h @@ -51,6 +51,8 @@ class PlayerHandler : public MessageHandler, public Ea::PlayerHandler void setDirection(char direction); void setDestination(int x, int y, int direction = -1); void changeAction(Being::Action action); + void processOnlineList(Net::MessageIn &msg); + void requestOnlineList(); void respawn(); }; diff --git a/src/net/tmwa/protocol.h b/src/net/tmwa/protocol.h index caf3c8e53..37f036ca8 100644 --- a/src/net/tmwa/protocol.h +++ b/src/net/tmwa/protocol.h @@ -333,5 +333,7 @@ enum #define SMSG_PVP_SET 0x019a #define CMSG_IGNORE_ALL 0x00d0 #define SMSG_IGNORE_ALL_RESPONSE 0x00d2 +#define CMSG_ONLINE_LIST 0x0210 +#define SMSG_ONLINE_LIST 0x0211 #endif -- cgit v1.2.3-70-g09d2