14 |
19 |
15 // lookup object |
20 // lookup object |
16 NetworkObject *obj = objects[obj_id]; |
21 NetworkObject *obj = objects[obj_id]; |
17 |
22 |
18 if (obj) { |
23 if (obj) { |
19 obj->_map_sig_message[msg_id](node, pkt); |
24 obj->handle_packet(node, msg_id, pkt); |
20 |
25 |
21 } else { |
26 } else { |
22 handle_create(obj_id, msg_id, pkt, node); |
27 handle_create(obj_id, msg_id, pkt, node); |
23 } |
28 } |
24 } |
29 } |
25 |
30 |
|
31 /* |
|
32 * NetworkObject_ServerController |
|
33 */ |
26 NetworkObject_ServerController::NetworkObject_ServerController (NetworkSession &session, NetworkChannelID channel_id) : |
34 NetworkObject_ServerController::NetworkObject_ServerController (NetworkSession &session, NetworkChannelID channel_id) : |
27 NetworkObjectController(session, channel_id), id_pool(0) { |
35 NetworkObjectController(session, channel_id), id_pool(0) { |
28 |
36 |
29 } |
37 } |
30 |
38 |
31 NetworkObjectID NetworkObject_ServerController::getObjectID (void) { |
39 NetworkObjectID NetworkObject_ServerController::getObjectID (void) { |
32 return ++id_pool; |
40 return ++id_pool; |
33 } |
41 } |
34 |
42 |
35 void NetworkObject_ServerController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) { |
43 void NetworkObject_ServerController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) { |
|
44 (void) obj_id; |
|
45 (void) msg_id; |
|
46 (void) pkt; |
|
47 (void) node; |
|
48 |
36 // XXX: fail |
49 // XXX: fail |
37 throw CL_Error("clients cannot create objects"); |
50 throw CL_Error("clients cannot create objects"); |
38 } |
51 } |
39 |
52 |
|
53 /* |
|
54 * NetworkObject_ClientController * |
|
55 */ |
40 NetworkObject_ClientController::NetworkObject_ClientController (NetworkSession &session, NetworkChannelID channel_id, NetworkNode *server) : |
56 NetworkObject_ClientController::NetworkObject_ClientController (NetworkSession &session, NetworkChannelID channel_id, NetworkNode *server) : |
41 NetworkObjectController(session, channel_id), server(server) { |
57 NetworkObjectController(session, channel_id), server(server) { |
42 |
58 |
43 |
59 |
44 } |
60 } |
46 void NetworkObject_ClientController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) { |
62 void NetworkObject_ClientController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) { |
47 // we only communicate with the server |
63 // we only communicate with the server |
48 assert(node == server); |
64 assert(node == server); |
49 |
65 |
50 // create new object |
66 // create new object |
51 NetworkObject_Client *obj = new NetworkObject_Client(*this, node, obj_id); |
67 NetworkObject_Client *obj = new NetworkObject_Client(*this, obj_id); |
52 |
68 |
53 // signal |
69 // signal |
54 _sig_create(obj, msg_id, pkt); |
70 _sig_create(obj, msg_id, pkt); |
55 } |
71 } |
56 |
72 |
57 NetworkObject::NetworkObject (NetworkObjectID obj_id) : |
73 /* |
|
74 * NetworkObject |
|
75 */ |
|
76 NetworkObject::NetworkObject (NetworkObjectController &controller, NetworkObjectID obj_id) : |
58 obj_id(obj_id) { |
77 obj_id(obj_id) { |
59 |
78 |
60 assert(obj_id); |
79 assert(obj_id); |
61 |
80 |
62 controller.objects[obj_id] = this; |
81 controller.objects[obj_id] = this; |
66 pkt.write_uint32(obj_id); |
85 pkt.write_uint32(obj_id); |
67 pkt.write_uint16(msg_id); |
86 pkt.write_uint16(msg_id); |
68 pkt.write_packet(payload); |
87 pkt.write_packet(payload); |
69 } |
88 } |
70 |
89 |
|
90 std::ostream& operator<< (std::ostream &s, const NetworkObject &obj) { |
|
91 return s << "<NetworkObject #" << obj << ">"; |
|
92 } |
|
93 |
|
94 /* |
|
95 * NetworkObject_Server |
|
96 */ |
71 NetworkObject_Server::NetworkObject_Server (NetworkObject_ServerController &controller) : |
97 NetworkObject_Server::NetworkObject_Server (NetworkObject_ServerController &controller) : |
72 NetworkObject(controller.getObjectID()), controller(controller) { |
98 NetworkObject(controller, controller.getObjectID()), controller(controller) { |
73 |
99 |
74 } |
100 } |
75 |
101 |
|
102 void NetworkObject_Server::handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) { |
|
103 _map_sig_message[msg_id](node, pkt); |
|
104 } |
|
105 |
76 void NetworkObject_Server::send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) { |
106 void NetworkObject_Server::send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) { |
77 NetworkPacket pkt; |
107 NetworkPacket pkt_out; |
78 |
108 |
79 buildPacket(pkt, msg_id, pkt); |
109 buildPacket(pkt_out, msg_id, pkt); |
80 |
110 |
81 dst->send(controller.channel_id, pkt, reliable); |
111 dst->send(controller.channel_id, pkt_out, reliable); |
82 } |
112 } |
83 |
113 |
84 void NetworkObject_Server::send_all (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) { |
114 void NetworkObject_Server::send_all (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) { |
85 send_all_except(msg_id, pkt, NULL, reliable); |
115 send_all_except(msg_id, pkt, NULL, reliable); |
86 } |
116 } |
87 |
117 |
88 void NetworkObject_Server::send_all_except (NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *black_sheep, bool reliable) { |
118 void NetworkObject_Server::send_all_except (NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *black_sheep, bool reliable) { |
89 NetworkPacket pkt; |
119 NetworkPacket pkt_out; |
90 |
120 |
91 buildPacket(pkt, msg_id, pkt); |
121 buildPacket(pkt_out, msg_id, pkt); |
92 |
122 |
93 controller.session.send_all_except(controller.channel_id, pkt, black_sheep, reliable); |
123 controller.session.send_all_except(controller.channel_id, pkt_out, black_sheep, reliable); |
94 } |
124 } |
95 |
125 |
96 void NetworkObject_Client::send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) { |
126 /* |
97 NetworkPacket pkt; |
127 * NetworkObject_Client |
98 |
128 */ |
99 buildPacket(pkt, msg_id, pkt); |
129 NetworkObject_Client::NetworkObject_Client (NetworkObject_ClientController &controller, NetworkObjectID id) : |
100 |
130 NetworkObject(controller, id), controller(controller) { |
101 controller.server->send(controller.channel_id, pkt, reliable); |
131 |
|
132 // nothing |
102 } |
133 } |
103 |
134 |
|
135 void NetworkObject_Client::handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) { |
|
136 assert(node == controller.server); |
|
137 |
|
138 _map_sig_message[msg_id](pkt); |
|
139 } |
|
140 |
|
141 void NetworkObject_Client::send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) { |
|
142 NetworkPacket pkt_out; |
|
143 |
|
144 buildPacket(pkt_out, msg_id, pkt); |
|
145 |
|
146 controller.server->send(controller.channel_id, pkt_out, reliable); |
|
147 } |
|
148 |