src/proto2/NetworkServer.cc
branchno-netsession
changeset 35 e21cfda0edde
parent 26 5685602aeb9c
child 36 785d220fc6b7
equal deleted inserted replaced
34:1ea6554d703e 35:e21cfda0edde
    46     // delete
    46     // delete
    47     delete player;
    47     delete player;
    48 }
    48 }
    49         
    49         
    50 NetworkServerPlayer::NetworkServerPlayer (NetworkServer &server, CL_NetComputer &computer, uint16_t pid) : 
    50 NetworkServerPlayer::NetworkServerPlayer (NetworkServer &server, CL_NetComputer &computer, uint16_t pid) : 
    51     RemotePlayer(server.state, Coordinate(100, 100), true), server(server), computer(computer), obj(&server.netobjs), pid(pid) {
    51     RemotePlayer(server.state, Vector(PLAYER_INITIAL_X, PLAYER_INITIAL_Y), true), server(server), computer(computer), obj(&server.netobjs), pid(pid) {
    52     
    52     
    53     // log
    53     // log
    54     Engine::log(INFO, "server_player.connected") << "computer=" << computer << ", obj=" << obj;
    54     Engine::log(INFO, "server_player.connected") << "computer=" << computer << ", obj=" << obj;
    55 
    55 
    56     // messages
    56     // messages
    57     slots.connect(obj.sig_received_message(NETMSG_CLIENT_MOVE), this, &NetworkServerPlayer::on_move);   
    57     slots.connect(obj.sig_received_message(NETMSG_CLIENT_MOVE), this, &NetworkServerPlayer::on_move);   
    58 
    58 
    59     // the initial NETMSG_PLAYER_HELLO
    59     // the initial NETMSG_PLAYER_HELLO
    60     CL_NetPacket hello_pkt;
    60     CL_NetPacket hello_pkt;
    61     hello_pkt.output.write_uint32(position.x);
    61     writeVector(hello_pkt, position);
    62     hello_pkt.output.write_uint32(position.y);
       
    63 
    62 
    64     obj.send(computer, NETMSG_SERVER_HELLO, hello_pkt, true);
    63     obj.send(computer, NETMSG_SERVER_HELLO, hello_pkt, true);
    65 
    64 
    66     // send other player objects
    65     // send other player objects
    67     for (std::map<CL_NetComputer, NetworkServerPlayer*>::iterator it = server.players.begin(); it != server.players.end(); it++) {
    66     for (std::map<CL_NetComputer, NetworkServerPlayer*>::iterator it = server.players.begin(); it != server.players.end(); it++) {
    69         CL_NetPacket player_pkt;
    68         CL_NetPacket player_pkt;
    70         
    69         
    71         // player is not in players list yet
    70         // player is not in players list yet
    72         assert(player != this);
    71         assert(player != this);
    73 
    72 
    74         player_pkt.output.write_uint32(player->position.x);
    73         writeVector(player_pkt, player->position);
    75         player_pkt.output.write_uint32(player->position.y);
       
    76 
    74 
    77         player->obj.send(computer, NETMSG_PLAYER_INFO, player_pkt, true);
    75         player->obj.send(computer, NETMSG_PLAYER_INFO, player_pkt, true);
    78     }
    76     }
    79 
    77 
    80 
    78 
    93 void NetworkServerPlayer::on_move (CL_NetComputer &from, CL_NetPacket &pkt) {
    91 void NetworkServerPlayer::on_move (CL_NetComputer &from, CL_NetPacket &pkt) {
    94     // sanity-check
    92     // sanity-check
    95     if (!(from == computer))
    93     if (!(from == computer))
    96         return;
    94         return;
    97     
    95     
    98     // read packet
    96     Vector impulse_force = readVector(pkt);    
    99     int32_t dx = pkt.input.read_int32();
    97     uint16_t impulse_ms = pkt.input.read_uint16();
   100     int32_t dy = pkt.input.read_int32();
       
   101 
    98 
   102     // movement delta
    99     Engine::log(INFO, "server_player.on_move") << "obj=" << obj << ", old_pos=" << position << ", impulse=" << impulse_force << "@" << impulse_ms << "ms";
   103     PositionDelta delta(dx, dy);
   100     
   104 
   101     // apply force
   105     Engine::log(INFO, "server_player.on_move") << "obj=" << obj << ", old_pos=" << position << ", delta=" << delta;
   102     applyForce(impulse_force, impulse_ms);
   106 
       
   107     // apply movement
       
   108     position += delta;
       
   109 
   103 
   110     // send position update
   104     // send position update
   111     send_position_update();
   105     send_position_update();
   112 }
   106 }
   113         
   107         
   114 void NetworkServerPlayer::send_position_update (void) {
   108 void NetworkServerPlayer::send_position_update (void) {
   115     CL_NetPacket pkt;
   109     CL_NetPacket pkt;
   116     pkt.output.write_uint32(position.x);
   110     writeVector(pkt, position);
   117     pkt.output.write_uint32(position.y);
   111     writeVector(pkt, velocity);
   118 
   112 
   119     Engine::log(INFO, "server_player.send_position_update") << "obj=" << obj << " -> " << position;
   113     Engine::log(INFO, "server_player.send_position_update") << "obj=" << obj << " -> " << position << "+" << velocity;
   120 
   114 
   121     obj.send(server.netsession.get_all(), NETMSG_PLAYER_POSITION, pkt, false);
   115     obj.send(server.netsession.get_all(), NETMSG_PLAYER_POSITION, pkt, false);
   122 }
   116 }
   123 
   117