diff options
author | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2007-09-23 12:55:09 +0000 |
---|---|---|
committer | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2007-09-23 12:55:09 +0000 |
commit | 5618f4890df5eb9ea91eb73a7a7dd7df745863a6 (patch) | |
tree | 07873952b5f3f7efae06b3045692e2d90bd45a58 /src/game-server/gamehandler.cpp | |
parent | 203ed8e40105c17d300b12ee461327cb4416acf2 (diff) | |
download | manaserv-5618f4890df5eb9ea91eb73a7a7dd7df745863a6.tar.gz manaserv-5618f4890df5eb9ea91eb73a7a7dd7df745863a6.tar.bz2 manaserv-5618f4890df5eb9ea91eb73a7a7dd7df745863a6.tar.xz manaserv-5618f4890df5eb9ea91eb73a7a7dd7df745863a6.zip |
Robustified code with respect to insertion failures.
Diffstat (limited to 'src/game-server/gamehandler.cpp')
-rw-r--r-- | src/game-server/gamehandler.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/game-server/gamehandler.cpp b/src/game-server/gamehandler.cpp index 63a34689..8901a49e 100644 --- a/src/game-server/gamehandler.cpp +++ b/src/game-server/gamehandler.cpp @@ -251,7 +251,12 @@ void GameHandler::processMessage(NetComputer *comp, MessageIn &message) Item *item = new Item(ic, amount - nb); item->setMap(computer.character->getMap()); item->setPosition(computer.character->getPosition()); - GameState::insert(item); + if (!GameState::insert(item)) + { + // The map is full. Put back into inventory. + inv.insert(ic->getDatabaseID(), amount - nb); + delete item; + } } } break; @@ -510,11 +515,19 @@ GameHandler::tokenMatched(GameClient* computer, Character* character) character->setClient(computer); MessageOut result(GPMSG_CONNECT_RESPONSE); + + if (!GameState::insert(character)) + { + result.writeByte(ERRMSG_SERVER_FULL); + kill(character); + delete character; + computer->disconnect(result); + return; + } + result.writeByte(ERRMSG_OK); computer->send(result); - GameState::insert(character); - // Force sending the whole character to the client. Inventory(character).sendFull(); for (int i = 0; i < NB_CHARACTER_ATTRIBUTES; ++i) @@ -529,7 +542,8 @@ GameHandler::deletePendingClient(GameClient* computer) // Something might have changed since it was inserted if (computer->status != CLIENT_QUEUED) return; - MessageOut msg(GPMSG_CONNECTION_TIMEDOUT); + MessageOut msg(GPMSG_CONNECT_RESPONSE); + msg.writeByte(ERRMSG_TIME_OUT); // The computer will be deleted when the disconnect event is processed computer->disconnect(msg); |