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 |
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()); |
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 |