summaryrefslogtreecommitdiff
path: root/src/net/ea
diff options
context:
space:
mode:
authorJared Adams <jaxad0127@gmail.com>2010-04-12 14:46:06 -0600
committerJared Adams <jaxad0127@gmail.com>2010-04-12 15:15:37 -0600
commit612c842f32fec68ece4244ac672a1b889cf2eb18 (patch)
tree8682f225a4681e281505bd0f4c501be701228a9e /src/net/ea
parentf30f3e6a51fc20bded8a3a04cd3a0f328a064469 (diff)
downloadmana-612c842f32fec68ece4244ac672a1b889cf2eb18.tar.gz
mana-612c842f32fec68ece4244ac672a1b889cf2eb18.tar.bz2
mana-612c842f32fec68ece4244ac672a1b889cf2eb18.tar.xz
mana-612c842f32fec68ece4244ac672a1b889cf2eb18.zip
Add support for map-server switching under eAthena
Also do some cleanup that's been needed for a while. Reviewed-by: Bertram
Diffstat (limited to 'src/net/ea')
-rw-r--r--src/net/ea/charserverhandler.cpp25
-rw-r--r--src/net/ea/gamehandler.cpp21
-rw-r--r--src/net/ea/gamehandler.h6
-rw-r--r--src/net/ea/generalhandler.cpp5
-rw-r--r--src/net/ea/generalhandler.h2
-rw-r--r--src/net/ea/protocol.h1
6 files changed, 53 insertions, 7 deletions
diff --git a/src/net/ea/charserverhandler.cpp b/src/net/ea/charserverhandler.cpp
index f0a13f43..64e1d427 100644
--- a/src/net/ea/charserverhandler.cpp
+++ b/src/net/ea/charserverhandler.cpp
@@ -33,6 +33,7 @@
#include "net/messageout.h"
#include "net/net.h"
+#include "net/ea/gamehandler.h"
#include "net/ea/loginhandler.h"
#include "net/ea/network.h"
#include "net/ea/protocol.h"
@@ -60,6 +61,7 @@ CharServerHandler::CharServerHandler()
SMSG_CHAR_DELETE_SUCCEEDED,
SMSG_CHAR_DELETE_FAILED,
SMSG_CHAR_MAP_INFO,
+ SMSG_CHANGE_MAP_SERVER,
0
};
handledMessages = _messages;
@@ -153,8 +155,10 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg)
break;
case SMSG_CHAR_MAP_INFO:
+ {
msg.skip(4); // CharID, must be the same as player_node->charID
- map_path = msg.readString(16);
+ GameHandler *gh = static_cast<GameHandler*>(Net::getGameHandler());
+ gh->setMap(msg.readString(16));
mapServer.hostname = ipToString(msg.readInt32());
mapServer.port = msg.readInt16();
@@ -168,7 +172,24 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg)
mNetwork->disconnect();
Client::setState(STATE_CONNECT_GAME);
- break;
+ }
+ break;
+
+ case SMSG_CHANGE_MAP_SERVER:
+ {
+ GameHandler *gh = static_cast<GameHandler*>(Net::getGameHandler());
+ gh->setMap(msg.readString(16));
+ int x = msg.readInt16();
+ int y = msg.readInt16();
+ mapServer.hostname = ipToString(msg.readInt32());
+ mapServer.port = msg.readInt16();
+
+ mNetwork->disconnect();
+ Client::setState(STATE_CHANGE_MAP);
+ player_node->setTileCoords(x, y);
+ player_node->setMap(0);
+ }
+ break;
}
}
diff --git a/src/net/ea/gamehandler.cpp b/src/net/ea/gamehandler.cpp
index 3625b9ab..cabaf763 100644
--- a/src/net/ea/gamehandler.cpp
+++ b/src/net/ea/gamehandler.cpp
@@ -22,6 +22,7 @@
#include "net/ea/gamehandler.h"
#include "client.h"
+#include "game.h"
#include "localplayer.h"
#include "log.h"
@@ -110,17 +111,22 @@ void GameHandler::connect()
const Token &token =
static_cast<LoginHandler*>(Net::getLoginHandler())->getToken();
+
+ if (Client::getState() == STATE_CONNECT_GAME)
+ {
+ mCharID = player_node->getId();
+ // Change the player's ID to the account ID to match what eAthena uses
+ player_node->setId(token.account_ID);
+ }
+
// Send login infos
MessageOut outMsg(CMSG_MAP_SERVER_CONNECT);
outMsg.writeInt32(token.account_ID);
- outMsg.writeInt32(player_node->getId());
+ outMsg.writeInt32(mCharID);
outMsg.writeInt32(token.session_ID1);
outMsg.writeInt32(token.session_ID2);
outMsg.writeInt8((token.sex == GENDER_MALE) ? 1 : 0);
- // Change the player's ID to the account ID to match what eAthena uses
- player_node->setId(token.account_ID);
-
// We get 4 useless bytes before the real answer comes in (what are these?)
mNetwork->skip(4);
}
@@ -137,7 +143,7 @@ void GameHandler::disconnect()
void GameHandler::inGame()
{
- // TODO
+ Game::instance()->changeMap(mMap);
}
void GameHandler::mapLoaded(const std::string &mapName)
@@ -160,4 +166,9 @@ void GameHandler::ping(int tick)
msg.writeInt32(tick);
}
+void GameHandler::setMap(const std::string map)
+{
+ mMap = map.substr(0, map.rfind("."));
+}
+
} // namespace EAthena
diff --git a/src/net/ea/gamehandler.h b/src/net/ea/gamehandler.h
index a6340bad..b8b6626d 100644
--- a/src/net/ea/gamehandler.h
+++ b/src/net/ea/gamehandler.h
@@ -57,6 +57,12 @@ class GameHandler : public MessageHandler, public Net::GameHandler
bool removeDeadBeings() const { return true; }
void clear();
+
+ void setMap(const std::string map);
+
+ private:
+ std::string mMap;
+ int mCharID; /// < Saved for map-server switching
};
} // namespace EAthena
diff --git a/src/net/ea/generalhandler.cpp b/src/net/ea/generalhandler.cpp
index 6ff4accd..047aee63 100644
--- a/src/net/ea/generalhandler.cpp
+++ b/src/net/ea/generalhandler.cpp
@@ -247,4 +247,9 @@ void GeneralHandler::clearHandlers()
mNetwork->clearHandlers();
}
+void GeneralHandler::stateChanged(State oldState, State newState)
+{
+ //
+}
+
} // namespace EAthena
diff --git a/src/net/ea/generalhandler.h b/src/net/ea/generalhandler.h
index 464f8bc8..f0857abe 100644
--- a/src/net/ea/generalhandler.h
+++ b/src/net/ea/generalhandler.h
@@ -53,6 +53,8 @@ class GeneralHandler : public MessageHandler, public Net::GeneralHandler
void clearHandlers();
+ void stateChanged(State oldState, State newState);
+
protected:
MessageHandlerPtr mAdminHandler;
MessageHandlerPtr mBeingHandler;
diff --git a/src/net/ea/protocol.h b/src/net/ea/protocol.h
index 24fe5ba5..2d9c13c3 100644
--- a/src/net/ea/protocol.h
+++ b/src/net/ea/protocol.h
@@ -83,6 +83,7 @@ static const int STORAGE_OFFSET = 1;
#define SMSG_CHAR_PASSWORD_RESPONSE 0x0062 /**< Custom packet reply to password change request */
#define SMSG_CHAR_SWITCH_RESPONSE 0x00b3
+#define SMSG_CHANGE_MAP_SERVER 0x0092
#define SMSG_MAP_LOGIN_SUCCESS 0x0073 /**< Contains starting location */
#define SMSG_MAP_QUIT_RESPONSE 0x018b