src/Network/Server.cc
branchnew_graphics
changeset 420 278020dcd9b7
parent 417 c503e0c6a740
child 428 712b943195a6
equal deleted inserted replaced
419:9cd4e54693b6 420:278020dcd9b7
    14     slots.connect(netsession.sig_node_connected(), this, &NetworkServer::on_node_connected);
    14     slots.connect(netsession.sig_node_connected(), this, &NetworkServer::on_node_connected);
    15     
    15     
    16     // and then we listen
    16     // and then we listen
    17     netsession.listen(listen_addr);
    17     netsession.listen(listen_addr);
    18 
    18 
    19     Engine::log(INFO, "server") << "running, listen_addr=" << listen_addr;
    19     Engine::log(INFO, "net.server") << "Listening on interface: " << listen_addr;
    20 }
    20 }
    21 
    21 
    22 void NetworkServer::on_node_connected (NetworkNode *node) {
    22 void NetworkServer::on_node_connected (NetworkNode *node) {
       
    23     Engine::log(INFO, "net.server") << "Client connected, sending terrain data: " << node->getRemoteAddress();
       
    24 
    23     // send the terrain data
    25     // send the terrain data
    24     send_terrain_data(node);
    26     send_terrain_data(node);
    25 
    27 
    26     // create the player object (it logs it)
    28     // create the player object (it logs it)
    27     NetworkServerPlayer *player = new NetworkServerPlayer(*this, node);
    29     NetworkServerPlayer *player = new NetworkServerPlayer(*this, node);
    28 
    30 
    29     // add to players
    31     // add to players
    30     players.push_back(player);
    32     players.push_back(player);
    31 
       
    32 }
    33 }
    33  
    34  
    34 void NetworkServer::send_terrain_data (NetworkNode *node) {
    35 void NetworkServer::send_terrain_data (NetworkNode *node) {
    35     Terrain &terrain = state.world.terrain;
    36     Terrain &terrain = state.world.terrain;
    36     
    37     
    88  * NetworkServerPlayer
    89  * NetworkServerPlayer
    89  */
    90  */
    90 NetworkServerPlayer::NetworkServerPlayer (NetworkServer &server, NetworkNode *node) : 
    91 NetworkServerPlayer::NetworkServerPlayer (NetworkServer &server, NetworkNode *node) : 
    91     Player(server.state, Vector(PLAYER_INITIAL_X, PLAYER_INITIAL_Y), true), NetworkServerObject(server), node(node) 
    92     Player(server.state, Vector(PLAYER_INITIAL_X, PLAYER_INITIAL_Y), true), NetworkServerObject(server), node(node) 
    92 {
    93 {
    93     // log
       
    94     Engine::log(INFO, "server_player.connected") << this << ": node=" << node;
       
    95 
       
    96     // messages
    94     // messages
    97     slots.connect(node->sig_disconnected(), this, &NetworkServerPlayer::on_disconnected);
    95     slots.connect(node->sig_disconnected(), this, &NetworkServerPlayer::on_disconnected);
    98     slots.connect(this->sig_message(NETMSG_CLIENT_INPUT), this, &NetworkServerPlayer::on_input);
    96     slots.connect(this->sig_message(NETMSG_CLIENT_INPUT), this, &NetworkServerPlayer::on_input);
    99 
    97 
   100     // the initial NETMSG_PLAYER_HELLO
    98     // the initial NETMSG_PLAYER_HELLO
   121 
   119 
   122     // XXX: send projectiles? Or let the client handle the events that the unknown projectiles generate?
   120     // XXX: send projectiles? Or let the client handle the events that the unknown projectiles generate?
   123 
   121 
   124     // broadcast NETMSG_PLAYER_JOIN to all clients except current
   122     // broadcast NETMSG_PLAYER_JOIN to all clients except current
   125     this->send_all_except(NETMSG_PLAYER_JOIN, hello_pkt, node, true);
   123     this->send_all_except(NETMSG_PLAYER_JOIN, hello_pkt, node, true);
       
   124 
       
   125     Engine::log(INFO, "net.server") << "Player joined: " << this << " from " << node->getRemoteAddress();
   126 }
   126 }
   127 
   127 
   128 void NetworkServerPlayer::handleDig (Vector position, float radius) {
   128 void NetworkServerPlayer::handleDig (Vector position, float radius) {
   129     NetworkPacket pkt;
   129     NetworkPacket pkt;
   130 
   130 
   131     pkt.write_vector(position);
   131     pkt.write_vector(position);
   132     pkt.write_float32(radius);
   132     pkt.write_float32(radius);
   133 
   133 
   134     Engine::log(INFO, "server_player.handle_dig") << "position=" << position << ", radius=" << radius;
   134     Engine::log(DEBUG, "server_player.handle_dig") << "position=" << position << ", radius=" << radius;
   135     
   135     
   136     // tell everyone... make this reliable... 
   136     // tell everyone... make this reliable... 
   137     this->send_all(NETMSG_PLAYER_DIG, pkt, true);
   137     this->send_all(NETMSG_PLAYER_DIG, pkt, true);
   138 
   138 
   139     // and carry out the actual dig on the server as well
   139     // and carry out the actual dig on the server as well
   140     Player::handleDig(position, radius);
   140     Player::handleDig(position, radius);
   141 }
   141 }
   142 
   142 
   143 void NetworkServerPlayer::handleFireWeapon (Weapon *weapon, Vector position, Vector velocity) {
   143 void NetworkServerPlayer::handleFireWeapon (Weapon *weapon, Vector position, Vector velocity) {
   144     Engine::log(INFO, "server_player.fire_weapon") << "weapon='" << weapon->getName() << "', position=" << position << ", velocity=" << velocity;
   144     Engine::log(DEBUG, "server_player.fire_weapon") << "weapon='" << weapon->getName() << "', position=" << position << ", velocity=" << velocity;
   145 
   145 
   146     // create new NetworkServerProjectile object
   146     // create new NetworkServerProjectile object
   147     new NetworkServerProjectile(server, this, position, velocity, weapon);
   147     new NetworkServerProjectile(server, this, position, velocity, weapon);
   148 
   148 
   149     // as handleFireWeapon does
   149     // as handleFireWeapon does
   151 }
   151 }
   152 
   152 
   153 void NetworkServerPlayer::handleChangeWeapon (unsigned int weaponIndex) {
   153 void NetworkServerPlayer::handleChangeWeapon (unsigned int weaponIndex) {
   154     NetworkPacket pkt;
   154     NetworkPacket pkt;
   155 
   155 
   156     Engine::log(INFO, "server_player.change_weapon") << "weaponIndex=" << weaponIndex;
   156     Engine::log(DEBUG, "server_player.change_weapon") << "weaponIndex=" << weaponIndex;
   157     
   157     
   158     // write packet
   158     // write packet
   159     pkt.write_uint8(weaponIndex);
   159     pkt.write_uint8(weaponIndex);
   160     
   160     
   161     // XXX: only tell the client itself?
   161     // XXX: only tell the client itself?
   166 }
   166 }
   167         
   167         
   168 void NetworkServerPlayer::handleRopeState (RopeState state) {
   168 void NetworkServerPlayer::handleRopeState (RopeState state) {
   169     NetworkPacket pkt; 
   169     NetworkPacket pkt; 
   170 
   170 
   171     Engine::log(INFO, "server_player.rope_state") << "state=" << rope.getState() << ", position=" << rope.getPosition() << ", velocity=" << rope.getVelocity() << ", length=" << rope.getLength() << ", pivotPlayer=" << rope.getPivotPlayer();
   171     Engine::log(DEBUG, "server_player.rope_state") << "state=" << rope.getState() << ", position=" << rope.getPosition() << ", velocity=" << rope.getVelocity() << ", length=" << rope.getLength() << ", pivotPlayer=" << rope.getPivotPlayer();
   172 
   172 
   173     switch (state) {
   173     switch (state) {
   174     case ROPE_FLYING:
   174     case ROPE_FLYING:
   175         pkt.write_vector(rope.getPosition());
   175         pkt.write_vector(rope.getPosition());
   176         pkt.write_vector(rope.getVelocity());
   176         pkt.write_vector(rope.getVelocity());
   214     NetworkPacket pkt;
   214     NetworkPacket pkt;
   215     
   215     
   216     // write packet
   216     // write packet
   217     pkt.write_vector(position);
   217     pkt.write_vector(position);
   218 
   218 
   219     Engine::log(INFO, "server_player.spawn") << this << ": position=" << position;
   219     Engine::log(DEBUG, "server_player.spawn") << this << ": position=" << position;
   220     
   220     
   221     // send
   221     // send
   222     send_all(NETMSG_PLAYER_SPAWN, pkt, true);
   222     send_all(NETMSG_PLAYER_SPAWN, pkt, true);
   223     
   223     
   224     // super
   224     // super
   226 }
   226 }
   227         
   227         
   228 void NetworkServerPlayer::die (bool start_timer) {
   228 void NetworkServerPlayer::die (bool start_timer) {
   229     NetworkPacket pkt;
   229     NetworkPacket pkt;
   230 
   230 
   231     Engine::log(INFO, "server_player.die") << this;
   231     Engine::log(DEBUG, "server_player.die") << this;
   232     
   232     
   233     // send
   233     // send
   234     send_all(NETMSG_PLAYER_DIE, pkt, true);
   234     send_all(NETMSG_PLAYER_DIE, pkt, true);
   235 
   235 
   236     // super
   236     // super
   238 }
   238 }
   239 
   239 
   240 void NetworkServerPlayer::on_disconnected (void) {
   240 void NetworkServerPlayer::on_disconnected (void) {
   241     NetworkPacket pkt;
   241     NetworkPacket pkt;
   242     
   242     
   243     Engine::log(INFO, "server_player.disconnected") << this << ": node=" << node;
   243     Engine::log(INFO, "net.server") << "Player disconnected: " << this;
   244     
   244     
   245     // remove from server
   245     // remove from server
   246     server.handle_disconnect(this);
   246     server.handle_disconnect(this);
   247     
   247     
   248     // tell other clients
   248     // tell other clients
   307 }
   307 }
   308 
   308 
   309 void NetworkServerProjectile::onDestroy (Vector position, bool removeGround) {
   309 void NetworkServerProjectile::onDestroy (Vector position, bool removeGround) {
   310     NetworkPacket pkt;
   310     NetworkPacket pkt;
   311 
   311 
   312     Engine::log(INFO, "server_projectile.destroy") << this << "position=" << position << ", removeGround=" << removeGround;
   312     Engine::log(DEBUG, "server_projectile.destroy") << this << "position=" << position << ", removeGround=" << removeGround;
   313     
   313     
   314     pkt.write_vector(position);
   314     pkt.write_vector(position);
   315     pkt.write_uint8(removeGround ? NETWORK_PROJECTILE_REMOVE_GROUND : 0);
   315     pkt.write_uint8(removeGround ? NETWORK_PROJECTILE_REMOVE_GROUND : 0);
   316 
   316 
   317     send_all(NETMSG_PROJECTILE_DESTROY, pkt, true);
   317     send_all(NETMSG_PROJECTILE_DESTROY, pkt, true);
   327     NetworkServerPlayer *player = dynamic_cast<NetworkServerPlayer*>(player_ptr);
   327     NetworkServerPlayer *player = dynamic_cast<NetworkServerPlayer*>(player_ptr);
   328 
   328 
   329     if (player == NULL) 
   329     if (player == NULL) 
   330         throw Error("NetworkServerProjectile::onHitPlayer called with non-NetworkServerPlayer player");
   330         throw Error("NetworkServerProjectile::onHitPlayer called with non-NetworkServerPlayer player");
   331     
   331     
   332     Engine::log(INFO, "server_projectile.hit_player") << this << ": player=" << player;
   332     Engine::log(DEBUG, "server_projectile.hit_player") << this << ": player=" << player;
   333     
   333     
   334     // write packet
   334     // write packet
   335     controller.write_object(pkt, player);
   335     controller.write_object(pkt, player);
   336 
   336 
   337     // send
   337     // send