src/Network/Client.cc
branchnew_graphics
changeset 420 278020dcd9b7
parent 419 9cd4e54693b6
child 431 c6d7272a164b
equal deleted inserted replaced
419:9cd4e54693b6 420:278020dcd9b7
    11  * NetworkClientConnect
    11  * NetworkClientConnect
    12  */
    12  */
    13 NetworkClientConnect::NetworkClientConnect (Engine &engine, const NetworkEndpoint &connect_to) :
    13 NetworkClientConnect::NetworkClientConnect (Engine &engine, const NetworkEndpoint &connect_to) :
    14     engine(engine), netsession(NETWORK_MAGIC_ID)
    14     engine(engine), netsession(NETWORK_MAGIC_ID)
    15 {
    15 {
       
    16     Engine::log(INFO, "net.client") << "Connecting to server: " << connect_to;
       
    17 
    16     // connect NetworkSession to get server node (this is still blocking)
    18     // connect NetworkSession to get server node (this is still blocking)
    17     server = netsession.connect(connect_to);
    19     server = netsession.connect(connect_to);
       
    20 
       
    21     Engine::log(INFO, "net.client") << "Connected, receiving game data";
    18     
    22     
    19     // connect slots
    23     // connect slots
    20     slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClientConnect::on_terrain_array);
    24     slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClientConnect::on_terrain_array);
    21     slots.connect(server->sig_disconnected(), this, &NetworkClientConnect::on_disconnected);
    25     slots.connect(server->sig_disconnected(), this, &NetworkClientConnect::on_disconnected);
    22     
    26     
    57 
    61 
    58 void NetworkClientConnect::connectDone (Terrain *terrain) {
    62 void NetworkClientConnect::connectDone (Terrain *terrain) {
    59     // pass Terrain to engine to create game
    63     // pass Terrain to engine to create game
    60     GameState &gs = engine.onNetworkClientConnected(terrain);
    64     GameState &gs = engine.onNetworkClientConnected(terrain);
    61 
    65 
       
    66     Engine::log(INFO, "net.client") << "Got game data, creating player";
       
    67 
    62     // create our new NetworkClient object
    68     // create our new NetworkClient object
    63     client = new NetworkClient(engine, gs, netsession, server);
    69     client = new NetworkClient(engine, gs, netsession, server);
    64 }
    70 }
    65  
    71  
    66 /*
    72 /*
   114         
   120         
   115 void NetworkClientController::on_server_hello (NetworkObjectID obj_id, NetworkPacketInput &pkt) {
   121 void NetworkClientController::on_server_hello (NetworkObjectID obj_id, NetworkPacketInput &pkt) {
   116     // read the packet
   122     // read the packet
   117     Vector position = pkt.read_vector();
   123     Vector position = pkt.read_vector();
   118     
   124     
   119     Engine::log(INFO, "client.on_server_hello") << this << ": pos=" << position;
   125     Engine::log(DEBUG, "client.on_server_hello") << this << ": pos=" << position;
   120 
   126 
   121     // create the LocalPlayer object
   127     // create the LocalPlayer object
   122     NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(client, obj_id, position);
   128     NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(client, obj_id, position);
   123 
   129 
   124     // pass it on to engine
   130     // pass it on to engine
   125     client.engine.onNetworkClientPlayer(player);
   131     client.engine.onNetworkClientPlayer(player);
       
   132 
       
   133     Engine::log(INFO, "net.client") << "Joined server: " << player;
   126 }
   134 }
   127         
   135         
   128 void NetworkClientController::on_player_info (NetworkObjectID obj_id, NetworkPacketInput &pkt) {
   136 void NetworkClientController::on_player_info (NetworkObjectID obj_id, NetworkPacketInput &pkt) {
   129     // read the packet
   137     // read the packet
   130     Vector position = pkt.read_vector();
   138     Vector position = pkt.read_vector();
   131     
   139     
   132     Engine::log(INFO, "client.on_player_info") << this << ": pos=" << position;
   140     Engine::log(DEBUG, "client.on_player_info") << this << ": pos=" << position;
   133 
   141 
   134     // create the LocalPlayer object
   142     // create the LocalPlayer object
   135     new NetworkClientRemotePlayer(client, obj_id, position);
   143     new NetworkClientRemotePlayer(client, obj_id, position);
   136 }
   144 }
   137         
   145         
   138 void NetworkClientController::on_player_join (NetworkObjectID obj_id, NetworkPacketInput &pkt) {
   146 void NetworkClientController::on_player_join (NetworkObjectID obj_id, NetworkPacketInput &pkt) {
   139     // read the packet
   147     // read the packet
   140     Vector position = pkt.read_vector();
   148     Vector position = pkt.read_vector();
   141     
   149     
   142     Engine::log(INFO, "client.on_player_join") << this << ": pos=" << position;
   150     Engine::log(DEBUG, "client.on_player_join") << this << ": pos=" << position;
   143     
   151     
   144     // create the RemotePlayer object
   152     // create the RemotePlayer object
   145     new NetworkClientRemotePlayer(client, obj_id, position);
   153     NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(client, obj_id, position);
       
   154 
       
   155     Engine::log(INFO, "net.client") << "Player joined: " << player;
   146 }
   156 }
   147         
   157         
   148 void NetworkClientController::on_projectile_player_fired (NetworkObjectID obj_id, NetworkPacketInput &pkt) {
   158 void NetworkClientController::on_projectile_player_fired (NetworkObjectID obj_id, NetworkPacketInput &pkt) {
   149     // read the packet
   159     // read the packet
   150     NetworkObject *player_obj = client.controller.read_object(pkt);
   160     NetworkObject *player_obj = client.controller.read_object(pkt);
   165     // try and get the weapon
   175     // try and get the weapon
   166     if ((weapon = player->getWeapon(weapon_id)) == NULL) {
   176     if ((weapon = player->getWeapon(weapon_id)) == NULL) {
   167         Engine::log(ERROR, "client.on_projectile_player_fired") << this << ": Unknown weapon id: player=" << player << ", weapon_id=" << weapon_id;
   177         Engine::log(ERROR, "client.on_projectile_player_fired") << this << ": Unknown weapon id: player=" << player << ", weapon_id=" << weapon_id;
   168     }
   178     }
   169 
   179 
   170     Engine::log(INFO, "client.on_projectile_create") << this << ": player=" << player << ", pos=" << position << ", velocity=" << velocity << ", weapon=" << weapon;
   180     Engine::log(DEBUG, "client.on_projectile_create") << this << ": player=" << player << ", pos=" << position << ", velocity=" << velocity << ", weapon=" << weapon;
   171 
   181 
   172     // create the NetworkClientPorjectile object
   182     // create the NetworkClientPorjectile object
   173     new NetworkClientProjectile(client, obj_id, player, position, velocity, weapon);
   183     new NetworkClientProjectile(client, obj_id, player, position, velocity, weapon);
   174 }
   184 }
   175 
   185 
   222     Vector position = pkt.read_vector();
   232     Vector position = pkt.read_vector();
   223     Vector velocity = pkt.read_vector();
   233     Vector velocity = pkt.read_vector();
   224     int flags = pkt.read_uint8();
   234     int flags = pkt.read_uint8();
   225     float aim = pkt.read_float32();
   235     float aim = pkt.read_float32();
   226 
   236 
   227 //    Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity << ", aim=" << aim << ", [" << flags << "]";
   237 //    Engine::log(DEBUG, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity << ", aim=" << aim << ", [" << flags << "]";
   228     
   238     
   229     // just update... 
   239     // just update... 
   230     updatePhysics(position, velocity, 
   240     updatePhysics(position, velocity, 
   231             flags & NETWORK_PHYSICS_INAIR, 
   241             flags & NETWORK_PHYSICS_INAIR, 
   232             flags & NETWORK_PHYSICS_FACE_RIGHT ? FACING_RIGHT : FACING_LEFT, 
   242             flags & NETWORK_PHYSICS_FACE_RIGHT ? FACING_RIGHT : FACING_LEFT, 
   236 
   246 
   237 void NetworkClientPlayerBase::on_dig (NetworkPacketInput &pkt) {
   247 void NetworkClientPlayerBase::on_dig (NetworkPacketInput &pkt) {
   238     Vector position = pkt.read_vector();
   248     Vector position = pkt.read_vector();
   239     float radius = pkt.read_float32();
   249     float radius = pkt.read_float32();
   240 
   250 
   241     Engine::log(INFO, "client_player.on_dig") << this << ": position=" << position << ", radius=" << radius;
   251     Engine::log(DEBUG, "client_player.on_dig") << this << ": position=" << position << ", radius=" << radius;
   242     
   252     
   243     // just update... 
   253     // just update... 
   244     handleDig(position, radius);
   254     handleDig(position, radius);
   245 }
   255 }
   246         
   256         
   247 void NetworkClientPlayerBase::on_weapon_change (NetworkPacketInput &pkt) {
   257 void NetworkClientPlayerBase::on_weapon_change (NetworkPacketInput &pkt) {
   248     uint8_t weapon_index = pkt.read_uint8();
   258     uint8_t weapon_index = pkt.read_uint8();
   249 
   259 
   250     Engine::log(INFO, "client_player.on_weapon_change") << this << ": weapon_index=" << weapon_index;
   260     Engine::log(DEBUG, "client_player.on_weapon_change") << this << ": weapon_index=" << weapon_index;
   251 
   261 
   252     handleChangeWeapon(weapon_index);
   262     handleChangeWeapon(weapon_index);
   253 }
   263 }
   254 
   264 
   255 void NetworkClientPlayerBase::on_rope_throw (NetworkPacketInput &pkt) {
   265 void NetworkClientPlayerBase::on_rope_throw (NetworkPacketInput &pkt) {
   256     Vector position = pkt.read_vector();
   266     Vector position = pkt.read_vector();
   257     Vector velocity = pkt.read_vector();
   267     Vector velocity = pkt.read_vector();
   258     float length = pkt.read_float32();
   268     float length = pkt.read_float32();
   259 
   269 
   260     Engine::log(INFO, "client_player.on_rope_throw") << this << ": position=" << position << ", velocity=" << velocity << ", length=" << length;
   270     Engine::log(DEBUG, "client_player.on_rope_throw") << this << ": position=" << position << ", velocity=" << velocity << ", length=" << length;
   261 
   271 
   262     rope.updateState(ROPE_FLYING, position, velocity, length, NULL);
   272     rope.updateState(ROPE_FLYING, position, velocity, length, NULL);
   263 }
   273 }
   264 
   274 
   265 void NetworkClientPlayerBase::on_rope_fixed (NetworkPacketInput &pkt) {
   275 void NetworkClientPlayerBase::on_rope_fixed (NetworkPacketInput &pkt) {
   272     if (player_obj != NULL && (player = dynamic_cast<NetworkClientPlayerBase*>(player_obj)) == NULL) {
   282     if (player_obj != NULL && (player = dynamic_cast<NetworkClientPlayerBase*>(player_obj)) == NULL) {
   273         Engine::log(ERROR, "client.on_rope_fixed") << this << ": Unknown player object";
   283         Engine::log(ERROR, "client.on_rope_fixed") << this << ": Unknown player object";
   274         return;
   284         return;
   275     }
   285     }
   276     
   286     
   277     Engine::log(INFO, "client_player.on_rope_fixed") << this << ": position=" << position << ", length=" << length 
   287     Engine::log(DEBUG, "client_player.on_rope_fixed") << this << ": position=" << position << ", length=" << length 
   278         << ", player=" << player;
   288         << ", player=" << player;
   279 
   289 
   280     rope.updateState(ROPE_FIXED, position, Vector(0, 0), length, player);
   290     rope.updateState(ROPE_FIXED, position, Vector(0, 0), length, player);
   281 }
   291 }
   282 
   292 
   283 void NetworkClientPlayerBase::on_rope_released (NetworkPacketInput &pkt) {
   293 void NetworkClientPlayerBase::on_rope_released (NetworkPacketInput &pkt) {
   284     (void) pkt;
   294     (void) pkt;
   285 
   295 
   286     Engine::log(INFO, "client_player.on_rope_released") << this;
   296     Engine::log(DEBUG, "client_player.on_rope_released") << this;
   287     
   297     
   288     // use rope.getPosition() instead of e.g. Vector(0, 0) because it will collide there...
   298     // use rope.getPosition() instead of e.g. Vector(0, 0) because it will collide there...
   289     rope.updateState(ROPE_FOLDED, rope.getPosition(), Vector(0, 0), 0, NULL);
   299     rope.updateState(ROPE_FOLDED, rope.getPosition(), Vector(0, 0), 0, NULL);
   290 }
   300 }
   291 
   301 
   292 void NetworkClientPlayerBase::on_rope_length (NetworkPacketInput &pkt) {
   302 void NetworkClientPlayerBase::on_rope_length (NetworkPacketInput &pkt) {
   293     float length = pkt.read_float32();
   303     float length = pkt.read_float32();
   294     
   304     
   295     Engine::log(INFO, "client_player.on_rope_length") << this << ": length=" << length;
   305     Engine::log(DEBUG, "client_player.on_rope_length") << this << ": length=" << length;
   296 
   306 
   297     rope.updateLength(length);
   307     rope.updateLength(length);
   298 }
   308 }
   299         
   309         
   300 void NetworkClientPlayerBase::on_spawn (NetworkPacketInput &pkt) {
   310 void NetworkClientPlayerBase::on_spawn (NetworkPacketInput &pkt) {
   301     // read packet
   311     // read packet
   302     Vector position = pkt.read_vector();
   312     Vector position = pkt.read_vector();
   303 
   313 
   304     Engine::log(INFO, "client_player.on_spawn") << this << ": position=" << position;
   314     Engine::log(DEBUG, "client_player.on_spawn") << this << ": position=" << position;
   305     
   315     
   306     // super
   316     // super
   307     Player::spawn(position);
   317     Player::spawn(position);
   308 }
   318 }
   309         
   319         
   310 void NetworkClientPlayerBase::on_die (NetworkPacketInput &pkt) {
   320 void NetworkClientPlayerBase::on_die (NetworkPacketInput &pkt) {
   311     (void) pkt;
   321     (void) pkt;
   312 
   322 
   313     Engine::log(INFO, "client_player.on_die") << this;
   323     Engine::log(DEBUG, "client_player.on_die") << this;
   314 
   324 
   315     // super, but don't start the respawn_timer
   325     // super, but don't start the respawn_timer
   316     Player::die(false);
   326     Player::die(false);
   317 }
   327 }
   318 
   328 
   351 
   361 
   352 void NetworkClientRemotePlayer::on_quit (NetworkPacketInput &pkt) {
   362 void NetworkClientRemotePlayer::on_quit (NetworkPacketInput &pkt) {
   353     // pkt is empty
   363     // pkt is empty
   354     (void) pkt;
   364     (void) pkt;
   355 
   365 
   356     Engine::log(INFO, "client_player.on_quit") << this;
   366     Engine::log(INFO, "net.client") << "Player quit: " << this;
   357 
   367 
   358     client.player_quit(this);
   368     client.player_quit(this);
   359 
   369 
   360     // delete
   370     // delete
   361     // XXX: leak because deleting the slot while it's being called breaks ClanLib
   371     // XXX: leak because deleting the slot while it's being called breaks ClanLib
   392 
   402 
   393 void NetworkClientProjectile::on_destroy (NetworkPacketInput &pkt) {
   403 void NetworkClientProjectile::on_destroy (NetworkPacketInput &pkt) {
   394     Vector position = pkt.read_vector();
   404     Vector position = pkt.read_vector();
   395     uint8_t flags = pkt.read_uint8();
   405     uint8_t flags = pkt.read_uint8();
   396 
   406 
   397     Engine::log(INFO, "client_projectile.on_destroy") << this << ": position=" << position << ", flags=" << flags;
   407     Engine::log(DEBUG, "client_projectile.on_destroy") << this << ": position=" << position << ", flags=" << flags;
   398     
   408     
   399     // pass on to super
   409     // pass on to super
   400     Projectile::onDestroy(position, flags & NETWORK_PROJECTILE_REMOVE_GROUND);
   410     Projectile::onDestroy(position, flags & NETWORK_PROJECTILE_REMOVE_GROUND);
   401 }
   411 }
   402 
   412 
   410     if ((player = dynamic_cast<NetworkClientPlayerBase*>(player_obj)) == NULL) {
   420     if ((player = dynamic_cast<NetworkClientPlayerBase*>(player_obj)) == NULL) {
   411         Engine::log(ERROR, "client.on_hit_player") << this << ": Unknown player object";
   421         Engine::log(ERROR, "client.on_hit_player") << this << ": Unknown player object";
   412         return;
   422         return;
   413     }
   423     }
   414     
   424     
   415     Engine::log(INFO, "client_projectile.hit_player") << this << ": player=" << player;
   425     Engine::log(DEBUG, "client_projectile.hit_player") << this << ": player=" << player;
   416     
   426     
   417     // pass on to super
   427     // pass on to super
   418     Projectile::onHitPlayer(player);
   428     Projectile::onHitPlayer(player);
   419 }
   429 }
   420 
   430