10017
|
1 |
/*
|
|
2 |
* Hedgewars, a free turn based strategy game
|
|
3 |
* Copyright (C) 2012 Simeon Maxein <smaxein@googlemail.com>
|
|
4 |
*
|
|
5 |
* This program is free software; you can redistribute it and/or
|
|
6 |
* modify it under the terms of the GNU General Public License
|
|
7 |
* as published by the Free Software Foundation; either version 2
|
|
8 |
* of the License, or (at your option) any later version.
|
|
9 |
*
|
|
10 |
* This program is distributed in the hope that it will be useful,
|
|
11 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13 |
* GNU General Public License for more details.
|
|
14 |
*
|
|
15 |
* You should have received a copy of the GNU General Public License
|
|
16 |
* along with this program; if not, write to the Free Software
|
|
17 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
18 |
*/
|
|
19 |
|
|
20 |
/**
|
|
21 |
* This file contains functions for communicating with a Hedgewars server to chat, prepare and play
|
|
22 |
* rounds of Hedgewars.
|
|
23 |
*
|
|
24 |
* To use this, first create a netconn object by calling flib_netconn_create. This will start the
|
|
25 |
* connection to the game server (which might fail right away, the function returns null then). You
|
|
26 |
* should also register your callback functions right at the start to ensure you don't miss any
|
|
27 |
* callbacks.
|
|
28 |
*
|
|
29 |
* In order to allow the netconn to run, you should regularly call flib_netconn_tick(), which
|
|
30 |
* performs network I/O and calls your callbacks on interesting events.
|
|
31 |
*
|
|
32 |
* When the connection is closed, you will receive the onDisconnect callback. This is the signal to
|
|
33 |
* destroy the netconn and stop calling tick().
|
|
34 |
*
|
|
35 |
* The connection process lasts from the time you create the netconn until you receive the
|
|
36 |
* onConnected callback (or onDisconnected in case something goes wrong). During that time, you
|
|
37 |
* might receive the onNickTaken and onPasswordRequest callbacks; see their description for more
|
|
38 |
* information on how to handle them. You could also receive other callbacks during connecting (e.g.
|
|
39 |
* about the room list), but it should be safe to ignore them.
|
|
40 |
*
|
|
41 |
* Once you are connected, you are in the lobby, and you can enter rooms and leave them again. The
|
|
42 |
* room and lobby states have different protocols, so many commands only work in either one or the
|
|
43 |
* other. If you are in a room you might also be in a game, but most of the functions behave the
|
|
44 |
* same ingame as in a room.
|
|
45 |
*
|
|
46 |
* The state changes from lobby to room when the server tells you that you just entered one, which
|
|
47 |
* will also trigger the onEnterRoom callback. This usually happens in reply to either a joinRoom,
|
|
48 |
* createRoom or playerFollow command.
|
|
49 |
*
|
|
50 |
* The state changes back to lobby when the room is dissolved, when you are kicked from the room, or
|
|
51 |
* when you actively leave the room using flib_netconn_send_leaveRoom. The first two events will
|
|
52 |
* trigger the onLeaveRoom callback.
|
|
53 |
*/
|
|
54 |
|
|
55 |
#ifndef NETCONN_H_
|
|
56 |
#define NETCONN_H_
|
|
57 |
|
|
58 |
#include "../model/gamesetup.h"
|
|
59 |
#include "../model/scheme.h"
|
|
60 |
#include "../model/room.h"
|
|
61 |
|
|
62 |
#include <stddef.h>
|
|
63 |
#include <stdint.h>
|
|
64 |
#include <stdbool.h>
|
|
65 |
|
|
66 |
#define NETCONN_STATE_CONNECTING 0
|
|
67 |
#define NETCONN_STATE_LOBBY 1
|
|
68 |
#define NETCONN_STATE_ROOM 2
|
|
69 |
#define NETCONN_STATE_DISCONNECTED 10
|
|
70 |
|
|
71 |
#define NETCONN_DISCONNECT_NORMAL 0 //!< The connection was closed normally
|
|
72 |
#define NETCONN_DISCONNECT_SERVER_TOO_OLD 1 //!< The server has a lower protocol version than we do
|
|
73 |
#define NETCONN_DISCONNECT_AUTH_FAILED 2 //!< You sent a password with flib_netconn_send_password that was not accepted
|
|
74 |
#define NETCONN_DISCONNECT_CONNLOST 3 //!< The network connection was lost
|
|
75 |
#define NETCONN_DISCONNECT_INTERNAL_ERROR 100 //!< Something went wrong in frontlib itself
|
|
76 |
|
|
77 |
#define NETCONN_ROOMLEAVE_ABANDONED 0 //!< The room was closed because the chief left
|
|
78 |
#define NETCONN_ROOMLEAVE_KICKED 1 //!< You have been kicked from the room
|
|
79 |
|
|
80 |
#define NETCONN_MSG_TYPE_PLAYERINFO 0 //!< A response to flib_netconn_send_playerInfo
|
|
81 |
#define NETCONN_MSG_TYPE_SERVERMESSAGE 1 //!< The welcome message when connecting to the lobby
|
|
82 |
#define NETCONN_MSG_TYPE_WARNING 2 //!< A general warning message
|
|
83 |
#define NETCONN_MSG_TYPE_ERROR 3 //!< A general error message
|
|
84 |
|
|
85 |
#define NETCONN_MAPCHANGE_FULL 0
|
|
86 |
#define NETCONN_MAPCHANGE_MAP 1
|
|
87 |
#define NETCONN_MAPCHANGE_MAPGEN 2
|
|
88 |
#define NETCONN_MAPCHANGE_DRAWNMAP 3
|
|
89 |
#define NETCONN_MAPCHANGE_MAZE_SIZE 4
|
|
90 |
#define NETCONN_MAPCHANGE_TEMPLATE 5
|
|
91 |
#define NETCONN_MAPCHANGE_THEME 6
|
|
92 |
#define NETCONN_MAPCHANGE_SEED 7
|
|
93 |
|
|
94 |
typedef struct _flib_netconn flib_netconn;
|
|
95 |
|
|
96 |
/**
|
|
97 |
* Create a new netplay connection with these parameters.
|
|
98 |
* The path to the data directory must end with a path delimiter (e.g. C:\Games\Hedgewars\Data\)
|
|
99 |
*/
|
|
100 |
flib_netconn *flib_netconn_create(const char *playerName, const char *dataDirPath, const char *host, int port);
|
|
101 |
void flib_netconn_destroy(flib_netconn *conn);
|
|
102 |
|
|
103 |
/**
|
|
104 |
* Perform I/O operations and call callbacks if something interesting happens.
|
|
105 |
* Should be called regularly.
|
|
106 |
*/
|
|
107 |
void flib_netconn_tick(flib_netconn *conn);
|
|
108 |
|
|
109 |
/**
|
|
110 |
* Are you currently the owner of this room? The return value only makes sense in
|
|
111 |
* NETCONN_STATE_ROOM and NETCONN_STATE_INGAME states.
|
|
112 |
*/
|
|
113 |
bool flib_netconn_is_chief(flib_netconn *conn);
|
|
114 |
|
|
115 |
/**
|
|
116 |
* Returns the playername. This is *probably* the one provided on creation, but if that name was
|
|
117 |
* already taken, a different one could have been set by the onNickTaken callback or its default
|
|
118 |
* implementation.
|
|
119 |
*/
|
|
120 |
const char *flib_netconn_get_playername(flib_netconn *conn);
|
|
121 |
|
|
122 |
/**
|
|
123 |
* Generate a game setup from the current room state.
|
|
124 |
* Returns NULL if the room state does not contain enough information for a complete game setup,
|
|
125 |
* or if an error occurs.
|
|
126 |
*
|
|
127 |
* The new gamesetup must be destroyed with flib_gamesetup_destroy().
|
|
128 |
*/
|
|
129 |
flib_gamesetup *flib_netconn_create_gamesetup(flib_netconn *conn);
|
|
130 |
|
|
131 |
|
|
132 |
|
|
133 |
|
|
134 |
// Send functions needed when connecting and disconnecting
|
|
135 |
|
|
136 |
/**
|
|
137 |
* Request a different nickname.
|
|
138 |
* This function only makes sense in reaction to an onNickTaken callback, because the netconn
|
|
139 |
* automatically requests the nickname you provide on creation, and once the server accepts the
|
|
140 |
* nickname it can no longer be changed.
|
|
141 |
*/
|
|
142 |
int flib_netconn_send_nick(flib_netconn *conn, const char *nick);
|
|
143 |
|
|
144 |
/**
|
|
145 |
* Send the password in reply to a password request.
|
|
146 |
* If the server does not accept the password, you will be disconnected
|
|
147 |
* (NETCONN_DISCONNECT_AUTH_FAILED)
|
|
148 |
*/
|
|
149 |
int flib_netconn_send_password(flib_netconn *conn, const char *passwd);
|
|
150 |
|
|
151 |
/**
|
|
152 |
* Tell the server that you want to leave. If successful, the server will disconnect you.
|
|
153 |
*/
|
|
154 |
int flib_netconn_send_quit(flib_netconn *conn, const char *quitmsg);
|
|
155 |
|
|
156 |
|
|
157 |
// Send functions that make sense both in the lobby and in rooms
|
|
158 |
|
|
159 |
/**
|
|
160 |
* Send a chat message. This message is either sent to the lobby or the room, depending on
|
|
161 |
* whether you are in a room at the moment. The message is not echoed back to you.
|
|
162 |
*/
|
|
163 |
int flib_netconn_send_chat(flib_netconn *conn, const char *chat);
|
|
164 |
|
|
165 |
/**
|
|
166 |
* Kick a player. This has different meanings in the lobby and in a room;
|
|
167 |
* In the lobby, it will kick the player from the server, and you need to be a server admin to
|
|
168 |
* do it. In a room, it will kick the player from the room, and you need to be room chief.
|
|
169 |
*/
|
|
170 |
int flib_netconn_send_kick(flib_netconn *conn, const char *playerName);
|
|
171 |
|
|
172 |
/**
|
|
173 |
* Request information about a player (e.g. current room, version, partial IP). If the action
|
|
174 |
* succeeds, you will receive an onMessage callback with NETCONN_MSG_TYPE_PLAYERINFO containing
|
|
175 |
* the requested information.
|
|
176 |
*/
|
|
177 |
int flib_netconn_send_playerInfo(flib_netconn *conn, const char *playerName);
|
|
178 |
|
|
179 |
|
|
180 |
// Send functions that only make sense in the lobby
|
|
181 |
|
|
182 |
/**
|
|
183 |
* Request an update of the room list. Only makes sense when in lobby state.
|
|
184 |
* If the action succeeds, you will receive an onRoomlist callback containing the current room
|
|
185 |
* data.
|
|
186 |
*/
|
|
187 |
int flib_netconn_send_request_roomlist(flib_netconn *conn);
|
|
188 |
|
|
189 |
/**
|
|
190 |
* Join a room as guest (not chief). Only makes sense when in lobby state. If the action
|
|
191 |
* succeeds, you will receive an onEnterRoom callback with chief=false followed by other
|
|
192 |
* callbacks with current room information.
|
|
193 |
*/
|
|
194 |
int flib_netconn_send_joinRoom(flib_netconn *conn, const char *room);
|
|
195 |
|
|
196 |
/**
|
|
197 |
* Follow a player. Only valid in the lobby. If the player is in a room (or in a game), this
|
|
198 |
* command is analogous to calling flib_netconn_send_joinRoom with that room.
|
|
199 |
*/
|
|
200 |
int flib_netconn_send_playerFollow(flib_netconn *conn, const char *playerName);
|
|
201 |
|
|
202 |
/**
|
|
203 |
* Create and join a new room. Only makes sense when in lobby state. If the action succeeds,
|
|
204 |
* you will receive an onEnterRoom callback with chief=true.
|
|
205 |
*/
|
|
206 |
int flib_netconn_send_createRoom(flib_netconn *conn, const char *room);
|
|
207 |
|
|
208 |
/**
|
|
209 |
* Ban a player. The scope of this ban depends on whether you are in a room or in the lobby.
|
|
210 |
* In a room, you need to be the room chief, and the ban will apply to the room only. In the
|
|
211 |
* lobby, you need to be server admin to ban someone, and the ban applies to the entire server.
|
|
212 |
*/
|
|
213 |
int flib_netconn_send_ban(flib_netconn *conn, const char *playerName);
|
|
214 |
|
|
215 |
/**
|
|
216 |
* Does something administrator-y. At any rate you need to be an administrator and in the lobby
|
|
217 |
* to use this command.
|
|
218 |
*/
|
|
219 |
int flib_netconn_send_clearAccountsCache(flib_netconn *conn);
|
|
220 |
|
|
221 |
/**
|
|
222 |
* Sets a server variable to the indicated value. Only makes sense if you are server admin and
|
|
223 |
* in the lobby. Known variables are MOTD_NEW, MOTD_OLD and LATEST_PROTO. MOTD_OLD is shown to
|
|
224 |
* players with older protocol versions, to inform them that they might want to update.
|
|
225 |
*/
|
|
226 |
int flib_netconn_send_setServerVar(flib_netconn *conn, const char *name, const char *value);
|
|
227 |
|
|
228 |
/**
|
|
229 |
* Queries all server variables. Only makes sense if you are server admin and in the lobby.
|
|
230 |
* If the action succeeds, you will receive several onServerVar callbacks with the
|
|
231 |
* current values of all server variables.
|
|
232 |
*/
|
|
233 |
int flib_netconn_send_getServerVars(flib_netconn *conn);
|
|
234 |
|
|
235 |
|
|
236 |
// Send functions that only make sense in a room
|
|
237 |
|
|
238 |
/**
|
|
239 |
* Leave the room for the lobby. Only makes sense in room state. msg can be NULL if you don't
|
|
240 |
* want to send a message. The server always accepts a part command, so once you send it off,
|
|
241 |
* you can just assume that you are back in the lobby.
|
|
242 |
*/
|
|
243 |
int flib_netconn_send_leaveRoom(flib_netconn *conn, const char *msg);
|
|
244 |
|
|
245 |
/**
|
|
246 |
* Change your "ready" status in the room. Only makes sense when in room state. If the action
|
|
247 |
* succeeds, you will receive an onClientFlags callback containing the change.
|
|
248 |
*/
|
|
249 |
int flib_netconn_send_toggleReady(flib_netconn *conn);
|
|
250 |
|
|
251 |
/**
|
|
252 |
* Add a team to the current room. Apart from the "fixed" team information, this also includes
|
|
253 |
* the color, but not the number of hogs. Only makes sense when in room state. If the action
|
|
254 |
* succeeds, you will receive an onTeamAccepted callback with the name of the team.
|
|
255 |
*
|
|
256 |
* Notes: Technically, sending a color here is the only way for a non-chief to set the color of
|
|
257 |
* her own team. The server remembers this color and even generates a separate teamColor message
|
|
258 |
* to inform everyone of it. However, at the moment the frontends generally override this color
|
|
259 |
* with one they choose themselves in order to deal with unfortunate behavior of the QtFrontend,
|
|
260 |
* which always sends color index 0 when adding a team but thinks that the team has a random
|
|
261 |
* color. The chief always sends a new color in order to bring the QtFrontend back into sync.
|
|
262 |
*/
|
|
263 |
int flib_netconn_send_addTeam(flib_netconn *conn, const flib_team *team);
|
|
264 |
|
|
265 |
/**
|
|
266 |
* Remove the team with the name teamname. Only makes sense when in room state.
|
|
267 |
* The server does not send a reply on success.
|
|
268 |
*/
|
|
269 |
int flib_netconn_send_removeTeam(flib_netconn *conn, const char *teamname);
|
|
270 |
|
|
271 |
|
|
272 |
// Send functions that only make sense in a room and if you are room chief
|
|
273 |
|
|
274 |
/**
|
|
275 |
* Rename the current room. Only makes sense in room state and if you are chief. If the action
|
|
276 |
* succeeds, you (and everyone else on the server) will receive an onRoomUpdate message
|
|
277 |
* containing the change.
|
|
278 |
*/
|
|
279 |
int flib_netconn_send_renameRoom(flib_netconn *conn, const char *roomName);
|
|
280 |
|
|
281 |
/**
|
|
282 |
* Set the number of hogs for a team. Only makes sense in room state and if you are chief.
|
|
283 |
* The server does not send a reply.
|
|
284 |
*/
|
|
285 |
int flib_netconn_send_teamHogCount(flib_netconn *conn, const char *teamname, int hogcount);
|
|
286 |
|
|
287 |
/**
|
|
288 |
* Set the teamcolor of a team. Only makes sense in room state and if you are chief.
|
|
289 |
* The server does not send a reply.
|
|
290 |
*/
|
|
291 |
int flib_netconn_send_teamColor(flib_netconn *conn, const char *teamname, int colorIndex);
|
|
292 |
|
|
293 |
/**
|
|
294 |
* Set the weaponset for the room. Only makes sense in room state and if you are chief.
|
|
295 |
* The server does not send a reply.
|
|
296 |
*/
|
|
297 |
int flib_netconn_send_weaponset(flib_netconn *conn, const flib_weaponset *weaponset);
|
|
298 |
|
|
299 |
/**
|
|
300 |
* Set the map for the room. Only makes sense in room state and if you are chief.
|
|
301 |
* The server does not send a reply.
|
|
302 |
*/
|
|
303 |
int flib_netconn_send_map(flib_netconn *conn, const flib_map *map);
|
|
304 |
|
|
305 |
/**
|
|
306 |
* Set the mapname. Only makes sense in room state and if you are chief.
|
|
307 |
* The server does not send a reply.
|
|
308 |
*/
|
|
309 |
int flib_netconn_send_mapName(flib_netconn *conn, const char *mapName);
|
|
310 |
|
|
311 |
/**
|
|
312 |
* Set the map generator (regular, maze, drawn, named). Only makes sense in room state and if
|
|
313 |
* you are chief.
|
|
314 |
* The server does not send a reply.
|
|
315 |
*/
|
|
316 |
int flib_netconn_send_mapGen(flib_netconn *conn, int mapGen);
|
|
317 |
|
|
318 |
/**
|
|
319 |
* Set the map template for regular maps. Only makes sense in room state and if you are chief.
|
|
320 |
* The server does not send a reply.
|
|
321 |
*/
|
|
322 |
int flib_netconn_send_mapTemplate(flib_netconn *conn, int templateFilter);
|
|
323 |
|
|
324 |
/**
|
|
325 |
* Set the maze template (maze size) for mazes. Only makes sense in room state and if you are
|
|
326 |
* chief. The server does not send a reply.
|
|
327 |
*/
|
|
328 |
int flib_netconn_send_mapMazeSize(flib_netconn *conn, int mazeSize);
|
|
329 |
|
|
330 |
/**
|
|
331 |
* Set the seed for the map. Only makes sense in room state and if you are chief.
|
|
332 |
* The server does not send a reply.
|
|
333 |
*/
|
|
334 |
int flib_netconn_send_mapSeed(flib_netconn *conn, const char *seed);
|
|
335 |
|
|
336 |
/**
|
|
337 |
* Set the theme for the map. Only makes sense in room state and if you are chief.
|
|
338 |
* The server does not send a reply.
|
|
339 |
*/
|
|
340 |
int flib_netconn_send_mapTheme(flib_netconn *conn, const char *theme);
|
|
341 |
|
|
342 |
/**
|
|
343 |
* Set the draw data for the drawn map. Only makes sense in room state and if you are chief.
|
|
344 |
* The server does not send a reply.
|
|
345 |
*/
|
|
346 |
int flib_netconn_send_mapDrawdata(flib_netconn *conn, const uint8_t *drawData, size_t size);
|
|
347 |
|
|
348 |
/**
|
|
349 |
* Set the script (game style). Only makes sense in room state and if you are chief.
|
|
350 |
* The server does not send a reply.
|
|
351 |
*/
|
|
352 |
int flib_netconn_send_script(flib_netconn *conn, const char *scriptName);
|
|
353 |
|
|
354 |
/**
|
|
355 |
* Set the scheme. Only makes sense in room state and if you are chief.
|
|
356 |
* The server does not send a reply.
|
|
357 |
*/
|
|
358 |
int flib_netconn_send_scheme(flib_netconn *conn, const flib_scheme *scheme);
|
|
359 |
|
|
360 |
/**
|
|
361 |
* Signal that you want to start the game. Only makes sense in room state and if you are chief.
|
|
362 |
* The server will check whether all players are ready and whether it believes the setup makes
|
|
363 |
* sense (e.g. more than one clan). If the server is satisfied, you will receive an onRunGame
|
|
364 |
* callback (all other clients in the room are notified the same way). Otherwise the server
|
|
365 |
* might answer with a warning, or might not answer at all.
|
|
366 |
*/
|
|
367 |
int flib_netconn_send_startGame(flib_netconn *conn);
|
|
368 |
|
|
369 |
/**
|
|
370 |
* Allow/forbid players to join the room. Only makes sense in room state and if you are chief.
|
|
371 |
* The server does not send a reply.
|
|
372 |
*/
|
|
373 |
int flib_netconn_send_toggleRestrictJoins(flib_netconn *conn);
|
|
374 |
|
|
375 |
/**
|
|
376 |
* Allow/forbid adding teams to the room. Only makes sense in room state and if you are chief.
|
|
377 |
* The server does not send a reply.
|
|
378 |
*/
|
|
379 |
int flib_netconn_send_toggleRestrictTeams(flib_netconn *conn);
|
|
380 |
|
|
381 |
|
|
382 |
// Send functions that are only needed for running a game
|
|
383 |
|
|
384 |
/**
|
|
385 |
* Send a teamchat message, forwarded from the engine. Only makes sense ingame.
|
|
386 |
* The server does not send a reply. In contrast to a Chat message, the server
|
|
387 |
* automatically converts this into an engine message and passes it on to the other
|
|
388 |
* clients.
|
|
389 |
*/
|
|
390 |
int flib_netconn_send_teamchat(flib_netconn *conn, const char *msg);
|
|
391 |
|
|
392 |
/**
|
|
393 |
* Send an engine message. Only makes sense when ingame. In a networked game, you have to pass
|
|
394 |
* all the engine messages from the engine here, and they will be spread to all other clients
|
|
395 |
* in the game to keep the game in sync.
|
|
396 |
*/
|
|
397 |
int flib_netconn_send_engineMessage(flib_netconn *conn, const uint8_t *message, size_t size);
|
|
398 |
|
|
399 |
/**
|
|
400 |
* Inform the server that the round has ended. Call this when the engine has disconnected,
|
|
401 |
* passing 1 if the round ended normally, 0 otherwise.
|
|
402 |
*/
|
|
403 |
int flib_netconn_send_roundfinished(flib_netconn *conn, bool withoutError);
|
|
404 |
|
|
405 |
|
|
406 |
|
|
407 |
|
|
408 |
|
|
409 |
// Callbacks that are important for connecting/disconnecting
|
|
410 |
|
|
411 |
/**
|
|
412 |
* onNickTaken is called when connecting to the server, if it turns out that there is already a
|
|
413 |
* player with the same nick.
|
|
414 |
* In order to proceed, a new nickname needs to be sent to the server using
|
|
415 |
* flib_netconn_send_nick() (or of course you can bail out and send a QUIT).
|
|
416 |
* If you don't set a callback, the netconn will automatically react by generating a new name.
|
|
417 |
*/
|
|
418 |
void flib_netconn_onNickTaken(flib_netconn *conn, void (*callback)(void *context, const char *nick), void* context);
|
|
419 |
|
|
420 |
/**
|
|
421 |
* When connecting with a registered nickname, the server will ask for a password before
|
|
422 |
* admitting you in. This callback is called when that happens. As a reaction, you can send the
|
|
423 |
* password using flib_netconn_send_password. If you don't register a callback, the default
|
|
424 |
* behavior is to just quit in a way that will cause a disconnect with
|
|
425 |
* NETCONN_DISCONNECT_AUTH_FAILED.
|
|
426 |
*
|
|
427 |
* You can't just choose a new nickname when you receive this callback, because at that point
|
|
428 |
* the server has already accepted your nick.
|
|
429 |
*/
|
|
430 |
void flib_netconn_onPasswordRequest(flib_netconn *conn, void (*callback)(void *context, const char *nick), void* context);
|
|
431 |
|
|
432 |
/**
|
|
433 |
* This is called when the server has accepted our nickname (and possibly password) and we have
|
|
434 |
* entered the lobby.
|
|
435 |
*/
|
|
436 |
void flib_netconn_onConnected(flib_netconn *conn, void (*callback)(void *context), void* context);
|
|
437 |
|
|
438 |
/**
|
|
439 |
* This is always the last callback (unless the netconn is destroyed early), and the netconn
|
|
440 |
* should be destroyed when it is received. The reason for the disconnect is passed as one of
|
|
441 |
* the NETCONN_DISCONNECT_ constants. Sometimes a message is included as well, but that
|
|
442 |
* parameter might also be NULL.
|
|
443 |
*/
|
|
444 |
void flib_netconn_onDisconnected(flib_netconn *conn, void (*callback)(void *context, int reason, const char *message), void* context);
|
|
445 |
|
|
446 |
|
|
447 |
// Callbacks that make sense in most situations
|
|
448 |
|
|
449 |
/**
|
|
450 |
* Callback for several informational messages that should be displayed to the user
|
|
451 |
* (e.g. in the chat window), but do not require a reaction. If a game is running, you might
|
|
452 |
* want to redirect some of these messages to the engine as well so the user will see them.
|
|
453 |
*/
|
|
454 |
void flib_netconn_onMessage(flib_netconn *conn, void (*callback)(void *context, int msgtype, const char *msg), void* context);
|
|
455 |
|
|
456 |
/**
|
|
457 |
* We received a chat message. Where this message belongs depends on the current state
|
|
458 |
* (lobby/room). If a game is running the message should be passed to the engine.
|
|
459 |
*/
|
|
460 |
void flib_netconn_onChat(flib_netconn *conn, void (*callback)(void *context, const char *nick, const char *msg), void* context);
|
|
461 |
|
|
462 |
/**
|
|
463 |
* Callbacks for incremental room list updates. They will fire whenever these events occur,
|
|
464 |
* even before you first query the actual roomlist - so be sure not to blindly reference your
|
|
465 |
* room list in these callbacks. The server currently only sends updates when a room changes
|
|
466 |
* its name, so in order to update other room information you need to query the roomlist again
|
|
467 |
* (see send_request_roomlist / onRoomlist).
|
|
468 |
*/
|
|
469 |
void flib_netconn_onRoomAdd(flib_netconn *conn, void (*callback)(void *context, const flib_room *room), void* context);
|
|
470 |
void flib_netconn_onRoomDelete(flib_netconn *conn, void (*callback)(void *context, const char *name), void* context);
|
|
471 |
void flib_netconn_onRoomUpdate(flib_netconn *conn, void (*callback)(void *context, const char *oldName, const flib_room *room), void* context);
|
|
472 |
|
|
473 |
/**
|
|
474 |
* Callbacks for players joining or leaving the lobby. In contrast to the roomlist updates, you
|
|
475 |
* will get a JOIN callback for every player already on the server when you join (and there is
|
|
476 |
* no direct way to query the current playerlist)
|
|
477 |
*
|
|
478 |
* NOTE: partMessage may be NULL.
|
|
479 |
*/
|
|
480 |
void flib_netconn_onLobbyJoin(flib_netconn *conn, void (*callback)(void *context, const char *nick), void* context);
|
|
481 |
void flib_netconn_onLobbyLeave(flib_netconn *conn, void (*callback)(void *context, const char *nick, const char *partMessage), void* context);
|
|
482 |
|
|
483 |
/**
|
|
484 |
* This is called when the server informs us that one or more flags associated with a
|
|
485 |
* player/client have changed.
|
|
486 |
*
|
|
487 |
* nick is the name of the player, flags is a string containing one character for each modified
|
|
488 |
* flag (see below), and newFlagState signals whether the flags should be set to true or false.
|
|
489 |
*
|
|
490 |
* Some of these flags are important for protocol purposes (especially if they are set for you)
|
|
491 |
* while others are just informational. Also, some flags are only relevant for players who are
|
|
492 |
* in the same room as you, and the server will not inform you if they change for others.
|
|
493 |
*
|
|
494 |
* These are the currently known/used flags:
|
|
495 |
* a: Server admin. Always updated.
|
|
496 |
* h: Room chief. Updated when in the same room.
|
|
497 |
* r: Ready to play. Updated when in the same room.
|
|
498 |
* u: Registered user. Always updated.
|
|
499 |
*
|
|
500 |
* The server tells us the 'a' and 'u' flags for all players when we first join the lobby, and
|
|
501 |
* also tells us the 'r' and 'h' flags when we join or create a room. It assumes that all flags
|
|
502 |
* are initially false, so it will typically only tell you to set certain flags to true when
|
|
503 |
* transmitting the initial states. Reset the 'h' and 'r' flags to false when leaving a room,
|
|
504 |
* or when entering room state, to arrive at the right state for each player.
|
|
505 |
*
|
|
506 |
* The room chief state of yourself is particularly important because it determines whether you
|
|
507 |
* can modify settings of the current room. Generally, when you create a room you start out
|
|
508 |
* being room chief, and when you join an existing room you are not. However, if the original
|
|
509 |
* chief leaves a room, the server can choose a new chief, and if that happens the chief flag
|
|
510 |
* will be transferred to someone else.
|
|
511 |
*/
|
|
512 |
void flib_netconn_onClientFlags(flib_netconn *conn, void (*callback)(void *context, const char *nick, const char *flags, bool newFlagState), void *context);
|
|
513 |
|
|
514 |
// Callbacks that happen only in response to specific requests
|
|
515 |
|
|
516 |
/**
|
|
517 |
* Response to flib_netconn_send_request_roomlist().
|
|
518 |
* The rooms array contains the current state of all rooms on the server.
|
|
519 |
*/
|
|
520 |
void flib_netconn_onRoomlist(flib_netconn *conn, void (*callback)(void *context, const flib_room **rooms, int roomCount), void* context);
|
|
521 |
|
|
522 |
/**
|
|
523 |
* Response to flib_netconn_send_joinRoom, flib_netconn_send_playerFollow or
|
|
524 |
* flib_netconn_send_createRoom.
|
|
525 |
*
|
|
526 |
* You just left the lobby and entered a room.
|
|
527 |
* If chief is true, you can and should send a full configuration for the room now. This
|
|
528 |
* consists of ammo, scheme, script and map, where map apparently has to come last.
|
|
529 |
*/
|
|
530 |
void flib_netconn_onEnterRoom(flib_netconn *conn, void (*callback)(void *context, bool chief), void *context);
|
|
531 |
|
|
532 |
/**
|
|
533 |
* Response to flib_netconn_send_addTeam.
|
|
534 |
* The server might reject your team for several reasons, e.g. because it has the same name as
|
|
535 |
* an existing team, or because the room chief restricted adding new teams. If the team is
|
|
536 |
* accepted by the server, this callback is fired.
|
|
537 |
*
|
|
538 |
* If you are the room chief, you are expected to provide the hog count for your own team now
|
|
539 |
* using flib_netconn_send_teamHogCount. The color of the team is already set to the one you
|
|
540 |
* provided in addTeam.
|
|
541 |
*/
|
|
542 |
void flib_netconn_onTeamAccepted(flib_netconn *conn, void (*callback)(void *context, const char *team), void *context);
|
|
543 |
|
|
544 |
/**
|
|
545 |
* When you query the server vars with flib_netconn_send_getServerVars (only works as admin),
|
|
546 |
* the server replies with a list of them. This callback is called for each entry in that list.
|
|
547 |
*/
|
|
548 |
void flib_netconn_onServerVar(flib_netconn *conn, void (*callback)(void *context, const char *name, const char *value), void *context);
|
|
549 |
|
|
550 |
|
|
551 |
// Callbacks that are only relevant in a room
|
|
552 |
|
|
553 |
/**
|
|
554 |
* You just left a room and entered the lobby again.
|
|
555 |
* reason is one of the NETCONN_ROOMLEAVE_ constants (usually a kick).
|
|
556 |
* This will not be called when you actively leave a room using PART.
|
|
557 |
* Don't confuse with onRoomLeave, which indicates that *someone else* left the room.
|
|
558 |
*/
|
|
559 |
void flib_netconn_onLeaveRoom(flib_netconn *conn, void (*callback)(void *context, int reason, const char *message), void *context);
|
|
560 |
|
|
561 |
/**
|
|
562 |
* Someone joined or left the room you are currently in.
|
|
563 |
* Analogous to onLobbyJoin/leave, you will receive the join callback for all players that are
|
|
564 |
* already in the room when you join, including for yourself (this is actually how it is
|
|
565 |
* determined that you joined a room).
|
|
566 |
*
|
|
567 |
* However, you will *not* receive onRoomLeave messages for everyone when you leave the room.
|
|
568 |
*/
|
|
569 |
void flib_netconn_onRoomJoin(flib_netconn *conn, void (*callback)(void *context, const char *nick), void* context);
|
|
570 |
void flib_netconn_onRoomLeave(flib_netconn *conn, void (*callback)(void *context, const char *nick, const char *partMessage), void* context);
|
|
571 |
|
|
572 |
/**
|
|
573 |
* A new team was added to the room. The person who adds a team does NOT receive this callback
|
|
574 |
* (he gets onTeamAccepted instead).
|
|
575 |
*
|
|
576 |
* The team does not contain bindings, stats, weaponset, color or the number of hogs (but it is
|
|
577 |
* assumed to be the default of 4).
|
|
578 |
*
|
|
579 |
* If you receive this message and you are the room chief, you may want to send a color and hog
|
|
580 |
* count for this team using flib_netconn_send_teamHogCount / teamColor for QtFrontend
|
|
581 |
* compatibility.
|
|
582 |
*
|
|
583 |
* The server currently sends another message with the color of the team to the same recipients
|
|
584 |
* as this teamAdd message, which will trigger an onTeamColorChanged callback. See the
|
|
585 |
* description of flib_netconn_send_addTeam for more information.
|
|
586 |
*/
|
|
587 |
void flib_netconn_onTeamAdd(flib_netconn *conn, void (*callback)(void *context, const flib_team *team), void *context);
|
|
588 |
|
|
589 |
/**
|
|
590 |
* A team was removed from the room. The person who removed the team will not receive this
|
|
591 |
* callback.
|
|
592 |
*/
|
|
593 |
void flib_netconn_onTeamDelete(flib_netconn *conn, void (*callback)(void *context, const char *teamname), void *context);
|
|
594 |
|
|
595 |
/**
|
|
596 |
* The number of hogs in a team has been changed by the room chief. If you are the chief and
|
|
597 |
* change the number of hogs yourself, you will not receive this callback.
|
|
598 |
*/
|
|
599 |
void flib_netconn_onHogCountChanged(flib_netconn *conn, void (*callback)(void *context, const char *teamName, int hogs), void *context);
|
|
600 |
|
|
601 |
/**
|
|
602 |
* The color of a team has been set or changed. The client who set or changed the color will
|
|
603 |
* not receive this callback.
|
|
604 |
*
|
|
605 |
* Normally, only the chief can change the color of a team. However, this message is also
|
|
606 |
* generated when a team is added, so you can receive it even as chief.
|
|
607 |
*/
|
|
608 |
void flib_netconn_onTeamColorChanged(flib_netconn *conn, void (*callback)(void *context, const char *teamName, int colorIndex), void *context);
|
|
609 |
|
|
610 |
/**
|
|
611 |
* The room chief has changed the game scheme (or you just joined a room).
|
|
612 |
* You will not receive this callback if you changed the scheme yourself.
|
|
613 |
*/
|
|
614 |
void flib_netconn_onSchemeChanged(flib_netconn *conn, void (*callback)(void *context, const flib_scheme *scheme), void *context);
|
|
615 |
|
|
616 |
/**
|
|
617 |
* The room chief has changed the map (or you just joined a room). Only non-chiefs receive these
|
|
618 |
* messages.
|
|
619 |
*
|
|
620 |
* To reduce the number of callback functions, the netconn keeps track of the current map
|
|
621 |
* settings and always passes the entire current map config, but informs the callee about what
|
|
622 |
* has changed (see the NETCONN_MAPCHANGE_ constants).
|
|
623 |
*
|
|
624 |
* Caution: Due to the way the protocol works, the map might not be complete at this point if it
|
|
625 |
* is a hand-drawn map, because the "full" map config does not include the drawn map data.
|
|
626 |
*/
|
|
627 |
void flib_netconn_onMapChanged(flib_netconn *conn, void (*callback)(void *context, const flib_map *map, int changetype), void *context);
|
|
628 |
|
|
629 |
/**
|
|
630 |
* The room chief has changed the game style (or you just joined a room). If you are the chief
|
|
631 |
* and change the style yourself, you will not receive this callback.
|
|
632 |
*/
|
|
633 |
void flib_netconn_onScriptChanged(flib_netconn *conn, void (*callback)(void *context, const char *script), void *context);
|
|
634 |
|
|
635 |
/**
|
|
636 |
* The room chief has changed the weaponset (or you just joined a room). If you are the chief
|
|
637 |
* and change the weaponset yourself, you will not receive this callback.
|
|
638 |
*/
|
|
639 |
void flib_netconn_onWeaponsetChanged(flib_netconn *conn, void (*callback)(void *context, const flib_weaponset *weaponset), void *context);
|
|
640 |
|
|
641 |
/**
|
|
642 |
* The game is starting. Fire up the engine and join in!
|
|
643 |
* You can let the netconn generate the right game setup using flib_netconn_create_gamesetup
|
|
644 |
*/
|
|
645 |
void flib_netconn_onRunGame(flib_netconn *conn, void (*callback)(void *context), void *context);
|
|
646 |
|
|
647 |
/**
|
|
648 |
* You are in a room, a game is in progress, and the server is sending you the new input for the
|
|
649 |
* engine to keep up to date with the current happenings. Pass it on to the engine using
|
|
650 |
* flib_gameconn_send_enginemsg.
|
|
651 |
*/
|
|
652 |
void flib_netconn_onEngineMessage(flib_netconn *conn, void (*callback)(void *context, const uint8_t *message, size_t size), void *context);
|
|
653 |
|
|
654 |
#endif
|