diff options
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); |