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 |