Exemple #1
0
void Mineserver::Watcher_Login::operator()(Mineserver::Game::pointer_t game, Mineserver::Network_Client::pointer_t client, Mineserver::Network_Message::pointer_t message) const
{
  std::cout << "Login watcher called!" << std::endl;
  const Mineserver::Network_Message_Login* msg = reinterpret_cast<Mineserver::Network_Message_Login*>(&(*message));

  Mineserver::Game_Player::pointer_t player(new Mineserver::Game_Player);
  player->setName(msg->username);

  std::cout << "Player login v." << msg->version << ": " << msg->username << std::endl;

  game->addPlayer(player);
  game->associateClient(client, player);

  boost::shared_ptr<Mineserver::Network_Message_Login> loginMessage = boost::make_shared<Mineserver::Network_Message_Login>();
  loginMessage->mid = 0x01;
  loginMessage->version = 1;
  loginMessage->seed = 1;
  loginMessage->mode = 0;
  loginMessage->dimension = 0;
  loginMessage->difficulty = 2;
  loginMessage->worldHeight = 128;
  loginMessage->maxPlayers = 128;
  client->outgoing().push_back(loginMessage);

  for (int x = -5; x <= 5; ++x) {
    for (int z = -5; z <= 5; ++z) {
      boost::shared_ptr<Mineserver::Network_Message_ChunkPrepare> chunkPrepareMessage = boost::make_shared<Mineserver::Network_Message_ChunkPrepare>();
      chunkPrepareMessage->mid = 0x32;
      chunkPrepareMessage->x = x;
      chunkPrepareMessage->z = z;
      chunkPrepareMessage->mode = 1;
      client->outgoing().push_back(chunkPrepareMessage);
    }
  }

  Mineserver::World::pointer_t world = game->getWorld(0);

  for (int x = -5; x <= 5; ++x) {
    for (int z = -5; z <= 5; ++z) {
      boost::shared_ptr<Mineserver::Network_Message_Chunk> chunkMessage = boost::make_shared<Mineserver::Network_Message_Chunk>();
      chunkMessage->mid = 0x33;
      chunkMessage->posX = x;
      chunkMessage->posY = 0;
      chunkMessage->posZ = z;
      chunkMessage->sizeX = 15;
      chunkMessage->sizeY = 127;
      chunkMessage->sizeZ = 15;
      chunkMessage->chunk = world->generateChunk(x, z);
      client->outgoing().push_back(chunkMessage);
    }
  }

  boost::shared_ptr<Mineserver::Network_Message_SpawnPosition> spawnPositionMessage = boost::make_shared<Mineserver::Network_Message_SpawnPosition>();
  spawnPositionMessage->mid = 0x06;
  spawnPositionMessage->x = 0;
  spawnPositionMessage->y = 100;
  spawnPositionMessage->z = 0;
  client->outgoing().push_back(spawnPositionMessage);

  boost::shared_ptr<Mineserver::Network_Message_PositionLook> positionLookMessage = boost::make_shared<Mineserver::Network_Message_PositionLook>();
  positionLookMessage->mid = 0x0D;
  positionLookMessage->x = 0;
  positionLookMessage->y = 100;
  positionLookMessage->z = 0;
  positionLookMessage->stance = 100;
  positionLookMessage->yaw = 0;
  positionLookMessage->pitch = 0;
  positionLookMessage->onGround = 0;
  client->outgoing().push_back(positionLookMessage);
}