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 |
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 |