summaryrefslogtreecommitdiff
path: root/src/game-server/gamehandler.cpp
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-09-23 12:55:09 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-09-23 12:55:09 +0000
commit5618f4890df5eb9ea91eb73a7a7dd7df745863a6 (patch)
tree07873952b5f3f7efae06b3045692e2d90bd45a58 /src/game-server/gamehandler.cpp
parent203ed8e40105c17d300b12ee461327cb4416acf2 (diff)
downloadmanaserv-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.cpp22
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);