3 #include "Engine.hh" |
3 #include "Engine.hh" |
4 #include "Logger.hh" |
4 #include "Logger.hh" |
5 |
5 |
6 #include <cassert> |
6 #include <cassert> |
7 |
7 |
8 NetworkClient::NetworkClient (GameState &state, const CL_IPAddress &connect_to) : |
8 NetworkClient::NetworkClient (GameState &state, const NetworkAddress &connect_to) : |
9 NetworkCore(state), server(netsession.connect(connect_to)) { |
9 NetworkCore(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)), netobjs(netsession, NETCHAN_CORE, server) { |
10 |
10 |
11 // connect slots |
11 // connect slots |
12 slots.connect(netobjs.sig_create_object(), this, &NetworkClient::on_create_object); |
12 slots.connect(netobjs.sig_create(), this, &NetworkClient::on_create); |
13 |
13 |
14 // XXX: sig_disconnected |
14 // XXX: sig_disconnected |
15 } |
15 } |
16 |
16 |
17 void NetworkClient::on_create_object (CL_NetObject_Client &obj, int msg_type, CL_NetPacket &pkt) { |
17 void NetworkClient::on_create (NetworkObject_Client *obj, NetworkMessageID msg_id, NetworkPacket &pkt) { |
18 switch (msg_type) { |
18 switch (msg_id) { |
19 case NETMSG_SERVER_HELLO: |
19 case NETMSG_SERVER_HELLO: |
20 on_server_hello(obj, pkt); |
20 on_server_hello(obj, pkt); |
21 |
21 |
22 break; |
22 break; |
23 |
23 |
30 on_player_join(obj, pkt); |
30 on_player_join(obj, pkt); |
31 |
31 |
32 break; |
32 break; |
33 |
33 |
34 default: |
34 default: |
35 Engine::log(WARN, "client.on_create_object") << "unknown msg_type=" << msg_type << " for obj=" << obj; |
35 Engine::log(WARN, "client.on_create_object") << "unknown msg_id=" << msg_id << " for obj=" << obj; |
36 } |
36 } |
37 } |
37 } |
38 |
38 |
39 void NetworkClient::on_server_hello (CL_NetObject_Client &obj, CL_NetPacket &pkt) { |
39 void NetworkClient::on_server_hello (NetworkObject_Client *obj, NetworkPacket &pkt) { |
40 // read the packet |
40 // read the packet |
41 Vector position = readVector(pkt); |
41 Vector position = pkt.read_vector(); |
42 |
42 |
43 Engine::log(INFO, "client.on_server_hello") << "obj=" << obj << ", pos=" << position; |
43 Engine::log(INFO, "client.on_server_hello") << "obj=" << obj << ", pos=" << position; |
44 |
44 |
45 // create the LocalPlayer object |
45 // create the LocalPlayer object |
46 NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(*this, obj, position); |
46 NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(*this, obj, position); |
47 |
47 |
48 // inform state |
48 // inform state |
49 state.newLocalPlayer(player); |
49 state.newLocalPlayer(player); |
50 } |
50 } |
51 |
51 |
52 void NetworkClient::on_player_info (CL_NetObject_Client &obj, CL_NetPacket &pkt) { |
52 void NetworkClient::on_player_info (NetworkObject_Client *obj, NetworkPacket &pkt) { |
53 // read the packet |
53 // read the packet |
54 Vector position = readVector(pkt); |
54 Vector position = pkt.read_vector(); |
55 |
55 |
56 Engine::log(INFO, "client.on_player_info") << "obj=" << obj << ", pos=" << position; |
56 Engine::log(INFO, "client.on_player_info") << "obj=" << obj << ", pos=" << position; |
57 |
57 |
58 // create the LocalPlayer object |
58 // create the LocalPlayer object |
59 NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position); |
59 NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position); |
61 // inform state |
61 // inform state |
62 state.newRemotePlayer(player); |
62 state.newRemotePlayer(player); |
63 |
63 |
64 } |
64 } |
65 |
65 |
66 void NetworkClient::on_player_join (CL_NetObject_Client &obj, CL_NetPacket &pkt) { |
66 void NetworkClient::on_player_join (NetworkObject_Client *obj, NetworkPacket &pkt) { |
67 // read the packet |
67 // read the packet |
68 Vector position = readVector(pkt); |
68 Vector position = pkt.read_vector(); |
69 |
69 |
70 Engine::log(INFO, "client.on_player_join") << "obj=" << obj << ", pos=" << position; |
70 Engine::log(INFO, "client.on_player_join") << "obj=" << obj << ", pos=" << position; |
71 |
71 |
72 // create the RemotePlayer object |
72 // create the RemotePlayer object |
73 NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position); |
73 NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position); |
83 // delete |
83 // delete |
84 // XXX: leak because deleting the slot while it's being called breaks ClanLib |
84 // XXX: leak because deleting the slot while it's being called breaks ClanLib |
85 // delete player; |
85 // delete player; |
86 } |
86 } |
87 |
87 |
88 NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, CL_NetObject_Client &obj, Vector position) : |
88 NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) : |
89 LocalPlayer(client.state, position, true), client(client), obj(obj) { |
89 LocalPlayer(client.state, position, true), client(client), obj(obj) { |
90 |
90 |
91 // receive messages |
91 // receive messages |
92 slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position); |
92 slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position); |
93 } |
93 } |
94 |
94 |
95 void NetworkClientLocalPlayer::applyForce (Vector force, uint16_t dt) { |
95 void NetworkClientLocalPlayer::applyForce (Vector force, uint16_t dt) { |
96 // always send move, in all cases |
96 // always send move, in all cases |
97 CL_NetPacket pkt; |
97 NetworkPacket pkt; |
98 writeVector(pkt, force); |
98 pkt.write_vector(force); |
99 pkt.output.write_uint16(dt); |
99 pkt.write_uint16(dt); |
100 |
100 |
101 obj.send(NETMSG_CLIENT_MOVE, pkt, false); |
101 obj->send(NETMSG_CLIENT_MOVE, pkt, false); |
102 |
102 |
103 // do not handle locally |
103 // do not handle locally |
104 } |
104 } |
105 |
105 |
106 void NetworkClientLocalPlayer::on_position (CL_NetPacket &pkt) { |
106 void NetworkClientLocalPlayer::on_position (NetworkPacket &pkt) { |
107 Vector position = readVector(pkt); |
107 Vector position = pkt.read_vector(); |
108 Vector velocity = readVector(pkt); |
108 Vector velocity = pkt.read_vector(); |
109 |
109 |
110 Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity; |
110 Engine::log(INFO, "client_player.on_position") /* << "obj=" << obj */ << ", position=" << position << ", velocity=" << velocity; |
111 |
111 |
112 // just update... |
112 // just update... |
113 updatePhysics(position, velocity); |
113 updatePhysics(position, velocity); |
114 } |
114 } |
115 |
115 |
116 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, CL_NetObject_Client &obj, Vector position) : |
116 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) : |
117 RemotePlayer(client.state, position, true), client(client), obj(obj) { |
117 RemotePlayer(client.state, position, true), client(client), obj(obj) { |
118 |
118 |
119 // receive messages |
119 // receive messages |
120 slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientRemotePlayer::on_position); |
120 slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientRemotePlayer::on_position); |
121 slots.connect(obj.sig_received_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit); |
121 slots.connect(obj->sig_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit); |
122 } |
122 } |
123 |
123 |
124 void NetworkClientRemotePlayer::on_position (CL_NetPacket &pkt) { |
124 void NetworkClientRemotePlayer::on_position (NetworkPacket &pkt) { |
125 Vector position = readVector(pkt); |
125 Vector position = pkt.read_vector(); |
126 Vector velocity = readVector(pkt); |
126 Vector velocity = pkt.read_vector(); |
127 |
127 |
128 Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity; |
128 Engine::log(INFO, "client_player.on_position") /* << "obj=" << obj */ << ", position=" << position << ", velocity=" << velocity; |
129 |
129 |
130 // just update... |
130 // just update... |
131 updatePhysics(position, velocity); |
131 updatePhysics(position, velocity); |
132 } |
132 } |
133 |
133 |
134 void NetworkClientRemotePlayer::on_quit (CL_NetPacket &pkt) { |
134 void NetworkClientRemotePlayer::on_quit (NetworkPacket &pkt) { |
135 // pkt is empty |
135 // pkt is empty |
136 (void) pkt; |
136 (void) pkt; |
137 |
137 |
138 Engine::log(INFO, "client_player.on_quit") << "obj=" << obj; |
138 Engine::log(INFO, "client_player.on_quit") /* << "obj=" << obj */; |
139 |
139 |
140 client.player_quit(this); |
140 client.player_quit(this); |
141 } |
141 } |
|
142 |