summaryrefslogtreecommitdiff
path: root/src/game-server/gamehandler.cpp
diff options
context:
space:
mode:
authorRogier Polak <rogier.l.a.polak@gmail.com>2007-03-18 18:10:31 +0000
committerRogier Polak <rogier.l.a.polak@gmail.com>2007-03-18 18:10:31 +0000
commita50c2a7b04c3778a9aa5962ef09ec73e12af228b (patch)
tree3ebf72bf6dd9bfd301c04899c4f99c99b8829aec /src/game-server/gamehandler.cpp
parent7e1011ccea542f4bc972c0a9c03eaca4a718566b (diff)
downloadmanaserv-a50c2a7b04c3778a9aa5962ef09ec73e12af228b.tar.gz
manaserv-a50c2a7b04c3778a9aa5962ef09ec73e12af228b.tar.bz2
manaserv-a50c2a7b04c3778a9aa5962ef09ec73e12af228b.tar.xz
manaserv-a50c2a7b04c3778a9aa5962ef09ec73e12af228b.zip
Added a TokenCollector class for matching magic_tokens.
Diffstat (limited to 'src/game-server/gamehandler.cpp')
-rw-r--r--src/game-server/gamehandler.cpp156
1 files changed, 47 insertions, 109 deletions
diff --git a/src/game-server/gamehandler.cpp b/src/game-server/gamehandler.cpp
index 7b82c1a8..b4f9340c 100644
--- a/src/game-server/gamehandler.cpp
+++ b/src/game-server/gamehandler.cpp
@@ -39,78 +39,9 @@
#include "utils/logger.h"
#include "utils/tokendispenser.hpp"
-enum
+GameHandler::GameHandler():
+ mTokenCollector(this)
{
- CLIENT_LOGIN = 0,
- CLIENT_CONNECTED,
- CLIENT_CHANGE_SERVER
-};
-
-struct GameClient: NetComputer
-{
- GameClient(ENetPeer *peer)
- : NetComputer(peer), character(NULL), status(CLIENT_LOGIN) {}
- Character *character;
- int status;
-};
-
-struct GamePendingLogin
-{
- Character *character;
- int timeout;
-};
-
-typedef std::map< std::string, GamePendingLogin > GamePendingLogins;
-typedef std::map< std::string, GameClient * > GamePendingClients;
-
-/**
- * The pending logins represent clients who were given a magic token by the
- * account server but who have not yet logged in to the game server.
- */
-static GamePendingLogins pendingLogins;
-
-/**
- * The pending clients represent clients who tried to login to the game server,
- * but for which no magic token is available yet. This can happen when the
- * communication between the account server and client went faster than the
- * communication between the account server and the game server.
- */
-static GamePendingClients pendingClients;
-
-/**
- * Links a client to a character.
- */
-static void linkCharacter(GameClient *computer, Character *ch)
-{
- computer->character = ch;
- computer->status = CLIENT_CONNECTED;
- ch->setClient(computer);
- MessageOut result(GPMSG_CONNECT_RESPONSE);
- result.writeByte(ERRMSG_OK);
- computer->send(result);
- gameState->insert(ch);
- Inventory(ch).sendFull();
-}
-
-/**
- * Notification that a particular token has been given to allow a certain
- * character to enter the game.
- */
-void registerGameClient(std::string const &token, Character *ch)
-{
- GamePendingClients::iterator i = pendingClients.find(token);
- if (i != pendingClients.end())
- {
- linkCharacter(i->second, ch);
- pendingClients.erase(i);
- }
- else
- {
- GamePendingLogin p;
- p.character = ch;
- p.timeout = 300; // world ticks
- pendingLogins.insert(std::make_pair(token, p));
- }
}
bool GameHandler::startListen(enet_uint16 port)
@@ -124,23 +55,20 @@ NetComputer *GameHandler::computerConnected(ENetPeer *peer)
return new GameClient(peer);
}
-void GameHandler::computerDisconnected(NetComputer *computer)
+void GameHandler::computerDisconnected(NetComputer *comp)
{
- for (GamePendingClients::iterator i = pendingClients.begin(),
- i_end = pendingClients.end(); i != i_end; ++i)
+ GameClient &computer = *static_cast< GameClient * >(comp);
+
+ if (computer.status == CLIENT_QUEQUED)
{
- if (i->second == computer)
- {
- pendingClients.erase(i);
- break;
- }
+ mTokenCollector.deletePendingClient(&computer);
}
- if (Character *ch = static_cast< GameClient * >(computer)->character)
+ else if (Character *ch = computer.character)
{
gameState->remove(ch);
delete ch;
}
- delete computer;
+ delete &computer;
}
void GameHandler::kill(Character *ch)
@@ -184,21 +112,6 @@ void GameHandler::completeServerChange(int id, std::string const &token,
void GameHandler::process()
{
ConnectionHandler::process();
-
- // Removes characters that have been left unconnected for too long.
- GamePendingLogins::iterator i = pendingLogins.begin();
- while (i != pendingLogins.end())
- {
- if (--i->second.timeout <= 0)
- {
- delete i->second.character;
- pendingLogins.erase(i++);
- }
- else
- {
- ++i;
- }
- }
}
void GameHandler::processMessage(NetComputer *comp, MessageIn &message)
@@ -209,20 +122,10 @@ void GameHandler::processMessage(NetComputer *comp, MessageIn &message)
if (computer.status == CLIENT_LOGIN)
{
if (message.getId() != PGMSG_CONNECT) return;
+
std::string magic_token = message.readString(MAGIC_TOKEN_LENGTH);
- GamePendingLogins::iterator i = pendingLogins.find(magic_token);
- if (i == pendingLogins.end())
- {
- for (GamePendingClients::iterator j = pendingClients.begin(),
- j_end = pendingClients.end(); j != j_end; ++j)
- {
- if (j->second == &computer) return;
- }
- pendingClients.insert(std::make_pair(magic_token, &computer));
- return;
- }
- linkCharacter(&computer, i->second.character);
- pendingLogins.erase(i);
+ mTokenCollector.addPendingClient(magic_token, &computer);
+ computer.status == CLIENT_QUEQUED;
return;
}
else if (computer.status != CLIENT_CONNECTED)
@@ -371,3 +274,38 @@ void GameHandler::sendTo(Character *beingPtr, MessageOut &msg)
assert(client && client->status == CLIENT_CONNECTED);
client->send(msg);
}
+
+void
+GameHandler::tokenMatched(GameClient* computer, Character* character)
+{
+ computer->character = character;
+ computer->status = CLIENT_CONNECTED;
+
+ character->setClient(computer);
+
+ MessageOut result(GPMSG_CONNECT_RESPONSE);
+ result.writeByte(ERRMSG_OK);
+ computer->send(result);
+
+ gameState->insert(character);
+
+ Inventory(character).sendFull();
+}
+
+void
+GameHandler::deletePendingClient(GameClient* computer)
+{
+ // Something might have changed since it was inserted
+ if (computer->status != CLIENT_QUEQUED) return;
+
+ MessageOut msg(GPMSG_CONNECTION_TIMEDOUT);
+
+ // The computer will be deleted when the disconnect event is processed
+ computer->disconnect(msg);
+}
+
+void
+GameHandler::deletePendingConnect(Character* character)
+{
+ delete character;
+}