9 |
9 |
10 NetworkClient::NetworkClient (GameState &state, const NetworkAddress &connect_to) : |
10 NetworkClient::NetworkClient (GameState &state, const NetworkAddress &connect_to) : |
11 state(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)), netobjs(netsession, NETCHAN_CORE, server) { |
11 state(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)), netobjs(netsession, NETCHAN_CORE, server) { |
12 |
12 |
13 // connect slots |
13 // connect slots |
14 slots.connect(netobjs.sig_create(), this, &NetworkClient::on_create); |
14 slots.connect(netobjs.sig_create(NETMSG_SERVER_HELLO), this, &NetworkClient::on_server_hello); |
|
15 slots.connect(netobjs.sig_create(NETMSG_PLAYER_INFO), this, &NetworkClient::on_player_info); |
|
16 slots.connect(netobjs.sig_create(NETMSG_PLAYER_JOIN), this, &NetworkClient::on_player_join); |
|
17 slots.connect(netobjs.sig_create(NETMSG_PROJECTILE_CREATE), this, &NetworkClient::on_projectile_create); |
|
18 |
15 slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClient::on_terrain_array); |
19 slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClient::on_terrain_array); |
16 |
20 |
17 // XXX: sig_disconnected |
21 // XXX: sig_disconnected |
18 } |
|
19 |
|
20 void NetworkClient::on_create (NetworkObject_Client *obj, NetworkMessageID msg_id, NetworkPacketInput &pkt) { |
|
21 switch (msg_id) { |
|
22 case NETMSG_SERVER_HELLO: |
|
23 on_server_hello(obj, pkt); |
|
24 |
|
25 break; |
|
26 |
|
27 case NETMSG_PLAYER_INFO: |
|
28 on_player_info(obj, pkt); |
|
29 |
|
30 break; |
|
31 |
|
32 case NETMSG_PLAYER_JOIN: |
|
33 on_player_join(obj, pkt); |
|
34 |
|
35 break; |
|
36 |
|
37 default: |
|
38 Engine::log(WARN, "client.on_create_object") << "unknown msg_id=" << msg_id << " for obj=" << obj; |
|
39 } |
|
40 } |
22 } |
41 |
23 |
42 void NetworkClient::on_server_hello (NetworkObject_Client *obj, NetworkPacketInput &pkt) { |
24 void NetworkClient::on_server_hello (NetworkObject_Client *obj, NetworkPacketInput &pkt) { |
43 // read the packet |
25 // read the packet |
44 Vector position = pkt.read_vector(); |
26 Vector position = pkt.read_vector(); |
77 |
59 |
78 // inform state |
60 // inform state |
79 state.newPlayer(player); |
61 state.newPlayer(player); |
80 } |
62 } |
81 |
63 |
|
64 void NetworkClient::on_projectile_create (NetworkObject_Client *obj, NetworkPacketInput &pkt) { |
|
65 // read the packet |
|
66 Vector position = pkt.read_vector(); |
|
67 Vector velocity = pkt.read_vector(); |
|
68 float explosionRadius = pkt.read_float32(); |
|
69 |
|
70 Engine::log(INFO, "client.on_projectile_create") << "obj=" << obj << ", pos=" << position << ", velocity=" << velocity; |
|
71 |
|
72 // create the NetworkClientPorjectile object |
|
73 new NetworkClientProjectile(*this, obj, position, velocity, explosionRadius); |
|
74 } |
|
75 |
82 void NetworkClient::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) { |
76 void NetworkClient::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) { |
83 // ignore if not from server |
77 // ignore if not from server |
84 if (node != server) |
78 if (node != server) |
85 return; |
79 return; |
86 |
80 |
108 // delete |
102 // delete |
109 // XXX: leak because deleting the slot while it's being called breaks ClanLib |
103 // XXX: leak because deleting the slot while it's being called breaks ClanLib |
110 // delete player; |
104 // delete player; |
111 } |
105 } |
112 |
106 |
|
107 /* |
|
108 * NetworkClientObjectHelper |
|
109 */ |
|
110 NetworkClientObjectHelper::NetworkClientObjectHelper (NetworkClient &client, NetworkObject_Client *obj) : |
|
111 client(client), obj(obj) |
|
112 { |
|
113 |
|
114 } |
|
115 |
|
116 /* |
|
117 * NetworkClientPlayerHelper |
|
118 */ |
113 NetworkClientPlayerHelper::NetworkClientPlayerHelper (NetworkClient &client, Vector position, NetworkObject_Client *obj) : |
119 NetworkClientPlayerHelper::NetworkClientPlayerHelper (NetworkClient &client, Vector position, NetworkObject_Client *obj) : |
114 Player(client.state, position, true), client(client), obj(obj) { |
120 NetworkClientObjectHelper(client, obj), Player(client.state, position, true) |
115 |
121 { |
116 // receive position updates |
122 // receive position updates |
117 slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientPlayerHelper::on_position); |
123 slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientPlayerHelper::on_position); |
118 slots.connect(obj->sig_message(NETMSG_PLAYER_DIG), this, &NetworkClientPlayerHelper::on_dig); |
124 slots.connect(obj->sig_message(NETMSG_PLAYER_DIG), this, &NetworkClientPlayerHelper::on_dig); |
119 } |
125 } |
120 |
126 |
148 void NetworkClientLocalPlayer::handleInput (PlayerInput input) { |
154 void NetworkClientLocalPlayer::handleInput (PlayerInput input) { |
149 // always send move, in all cases |
155 // always send move, in all cases |
150 NetworkPacket pkt; |
156 NetworkPacket pkt; |
151 pkt.write_uint16(input); |
157 pkt.write_uint16(input); |
152 |
158 |
153 obj->send(NETMSG_CLIENT_MOVE, pkt, false); |
159 obj->send(NETMSG_CLIENT_INPUT, pkt, false); |
154 |
160 |
155 // do not handle locally |
161 // do not handle locally |
156 } |
162 } |
157 |
163 |
158 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) : |
164 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) : |
169 Engine::log(INFO, "client_player.on_quit") << "obj=" << obj; |
175 Engine::log(INFO, "client_player.on_quit") << "obj=" << obj; |
170 |
176 |
171 client.player_quit(this); |
177 client.player_quit(this); |
172 } |
178 } |
173 |
179 |
|
180 NetworkClientProjectile::NetworkClientProjectile (NetworkClient &client, NetworkObject_Client *obj, Vector position, |
|
181 Vector velocity, float explosionRadius) : |
|
182 NetworkClientObjectHelper(client, obj), Projectile(client.state, position, velocity, true, explosionRadius) |
|
183 { |
|
184 // XXX: register messages |
|
185 } |
174 |
186 |