18 |
18 |
19 Engine::log(INFO, "server") << "running, listen_addr=" << listen_addr; |
19 Engine::log(INFO, "server") << "running, listen_addr=" << listen_addr; |
20 } |
20 } |
21 |
21 |
22 void NetworkServer::on_node_connected (NetworkNode *node) { |
22 void NetworkServer::on_node_connected (NetworkNode *node) { |
|
23 // send the terrain data |
|
24 send_terrain_data(node); |
|
25 |
23 // create the player object (it logs it) |
26 // create the player object (it logs it) |
24 NetworkServerPlayer *player = new NetworkServerPlayer(*this, node); |
27 NetworkServerPlayer *player = new NetworkServerPlayer(*this, node); |
25 |
28 |
26 // add to players |
29 // add to players |
27 players.push_back(player); |
30 players.push_back(player); |
28 } |
31 |
29 |
32 } |
|
33 |
|
34 void NetworkServer::send_terrain_data (NetworkNode *node) { |
|
35 Terrain &terrain = state.world.terrain; |
|
36 |
|
37 // dimensions? |
|
38 PixelCoordinate map = terrain.getDimensions(); |
|
39 |
|
40 // translate to a byte array |
|
41 size_t terrain_size = map.x * map.y; |
|
42 |
|
43 // get terrain buffer |
|
44 const uint8_t *terrain_buf = terrain.getTerrainBuffer(); |
|
45 |
|
46 // allocate our packet... |
|
47 BigNetworkPacket pkt ( |
|
48 // NetworkChannel header |
|
49 NETWORK_SESSION_HEADER_SIZE |
|
50 |
|
51 // our own header |
|
52 + 2 * sizeof(uint32_t) |
|
53 |
|
54 // compressed terrain buffer |
|
55 + NetworkPacketOutput::write_compressed_size(terrain_size) |
|
56 ); |
|
57 |
|
58 // write netsession header |
|
59 node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY); |
|
60 |
|
61 // write terrain dimensions |
|
62 pkt.write_uint32(map.x); |
|
63 pkt.write_uint32(map.y); |
|
64 |
|
65 // write compressed terrain data |
|
66 pkt.write_compressed(terrain_buf, terrain_size); |
|
67 |
|
68 // send |
|
69 node->send_raw(pkt, true); |
|
70 } |
|
71 |
|
72 |
30 void NetworkServer::handle_disconnect (NetworkServerPlayer *player) { |
73 void NetworkServer::handle_disconnect (NetworkServerPlayer *player) { |
31 // remove from list |
74 // remove from list |
32 players.remove(player); |
75 players.remove(player); |
33 } |
76 } |
34 |
77 |
78 |
121 |
79 // XXX: send projectiles? Or let the client handle the events that the unknown projectiles generate? |
122 // XXX: send projectiles? Or let the client handle the events that the unknown projectiles generate? |
80 |
123 |
81 // broadcast NETMSG_PLAYER_JOIN to all clients except current |
124 // broadcast NETMSG_PLAYER_JOIN to all clients except current |
82 this->send_all_except(NETMSG_PLAYER_JOIN, hello_pkt, node, true); |
125 this->send_all_except(NETMSG_PLAYER_JOIN, hello_pkt, node, true); |
83 |
|
84 // send terrain data... |
|
85 send_terrain_data(); |
|
86 } |
126 } |
87 |
127 |
88 void NetworkServerPlayer::handleDig (Vector position, float radius) { |
128 void NetworkServerPlayer::handleDig (Vector position, float radius) { |
89 NetworkPacket pkt; |
129 NetworkPacket pkt; |
90 |
130 |
230 |
270 |
231 // send position update |
271 // send position update |
232 send_position_update(); |
272 send_position_update(); |
233 } |
273 } |
234 |
274 |
235 void NetworkServerPlayer::send_terrain_data (void) { |
|
236 Terrain &terrain = server.state.world; |
|
237 |
|
238 // dimensions? |
|
239 PixelCoordinate map = terrain.getDimensions(); |
|
240 |
|
241 // translate to a byte array |
|
242 size_t terrain_size = map.x * map.y; |
|
243 |
|
244 // get terrain buffer |
|
245 const uint8_t *terrain_buf = terrain.getTerrainBuffer(); |
|
246 |
|
247 // allocate our packet... |
|
248 BigNetworkPacket pkt ( |
|
249 // NetworkChannel header |
|
250 NETWORK_SESSION_HEADER_SIZE |
|
251 |
|
252 // our own header |
|
253 + 2 * sizeof(uint32_t) |
|
254 |
|
255 // compressed terrain buffer |
|
256 + NetworkPacketOutput::write_compressed_size(terrain_size) |
|
257 ); |
|
258 |
|
259 // write netsession header |
|
260 node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY); |
|
261 |
|
262 // write terrain dimensions |
|
263 pkt.write_uint32(map.x); |
|
264 pkt.write_uint32(map.y); |
|
265 |
|
266 // write compressed terrain data |
|
267 pkt.write_compressed(terrain_buf, terrain_size); |
|
268 |
|
269 // send |
|
270 node->send_raw(pkt, true); |
|
271 } |
|
272 |
|
273 void NetworkServerPlayer::send_position_update (void) { |
275 void NetworkServerPlayer::send_position_update (void) { |
274 NetworkPacket pkt; |
276 NetworkPacket pkt; |
275 |
277 |
276 int flags = |
278 int flags = |
277 (inAir ? NETWORK_PHYSICS_INAIR : 0) | |
279 (inAir ? NETWORK_PHYSICS_INAIR : 0) | |