/[LeafOK_CVS]/pvpgn-1.7.4/src/bnetd/handle_anongame.c
ViewVC logotype

Contents of /pvpgn-1.7.4/src/bnetd/handle_anongame.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (vendor branch)
Tue Jun 6 03:41:37 2006 UTC (19 years, 9 months ago) by sysadm
Branch: GNU, MAIN
CVS Tags: pvpgn_1-7-4-0_MIL, arelease, HEAD
Changes since 1.1: +0 -0 lines
Content type: text/x-csrc
no message

1 /*
2 * Copyright (C) 2004 CreepLord (creeplord@pvpgn.org)
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18 #include "common/setup_before.h"
19 #ifdef HAVE_STRING_H
20 # include <string.h>
21 #else
22 # ifdef HAVE_STRINGS_H
23 # include <strings.h>
24 # endif
25 #endif
26 #include <errno.h>
27 #ifdef STDC_HEADERS
28 # include <stdlib.h>
29 #else
30 # ifdef HAVE_MALLOC_H
31 # include <malloc.h>
32 # endif
33 #endif
34
35 #ifdef WIN32_GUI
36 # include <win32/winmain.h>
37 #endif
38
39 #include "common/bn_type.h"
40 #include "common/eventlog.h"
41 #include "common/packet.h"
42 #include "common/queue.h"
43 #include "common/tag.h"
44 #include "common/list.h"
45 #include "common/util.h"
46 #include "common/xalloc.h"
47 #include "common/bnettime.h"
48 #include "connection.h"
49 #include "team.h"
50 #include "account.h"
51 #include "account_wrap.h"
52 #include "channel.h"
53 #include "anongame.h"
54 #include "anongame_infos.h"
55 #include "anongame_maplists.h"
56 #include "handle_anongame.h"
57 #include "tournament.h"
58 #include "server.h"
59 #include "clan.h"
60 #include "common/setup_after.h"
61
62 /* option - handling function */
63
64 /* 0x00 */ /* PG style search - handle_anongame_search() in anongame.c */
65 /* 0x01 */ /* server side packet sent from handle_anongame_search() in anongame.c */
66 /* 0x02 */ static int _client_anongame_infos(t_connection * c, t_packet const * const packet);
67 /* 0x03 */ static int _client_anongame_cancel(t_connection * c);
68 /* 0x04 */ static int _client_anongame_profile(t_connection * c, t_packet const * const packet);
69 /* 0x05 */ /* AT style search - handle_anongame_search() in anongame.c */
70 /* 0x06 */ /* AT style search (Inviter) handle_anongame_search() in anongame.c */
71 /* 0x07 */ static int _client_anongame_tournament(t_connection * c, t_packet const * const packet);
72 /* 0x08 */ static int _client_anongame_profile_clan(t_connection * c, t_packet const * const packet);
73 /* 0x09 */ static int _client_anongame_get_icon(t_connection * c, t_packet const * const packet);
74 /* 0x0A */ static int _client_anongame_set_icon(t_connection * c, t_packet const * const packet);
75
76 /* misc functions used by _client_anongame_tournament() */
77 static unsigned int _tournament_time_convert(unsigned int time);
78
79 /* and now the functions */
80
81 static int _client_anongame_profile_clan(t_connection * c, t_packet const * const packet)
82 {
83 t_packet * rpacket;
84 int clantag;
85 int clienttag;
86 int count;
87 int temp;
88 t_clan * clan;
89 unsigned char rescount;
90
91 if (packet_get_size(packet)<sizeof(t_client_findanongame_profile_clan))
92 {
93 eventlog(eventlog_level_error,__FUNCTION__,"[%d] got bad ANONGAME_PROFILE_CLAN packet (expected %u bytes, got %u)",conn_get_socket(c), sizeof(t_client_findanongame_profile_clan), packet_get_size(packet));
94 return -1;
95 }
96
97 clantag = bn_int_get(packet->u.client_findanongame_profile_clan.clantag);
98 clienttag = bn_int_get(packet->u.client_findanongame_profile_clan.clienttag);
99 count = bn_int_get(packet->u.server_findanongame_profile_clan.count);
100 clan = clanlist_find_clan_by_clantag(clantag);
101
102 if ((rpacket = packet_create(packet_class_bnet)))
103 {
104 packet_set_size(rpacket,sizeof(t_server_findanongame_profile_clan));
105 packet_set_type(rpacket,SERVER_FINDANONGAME_PROFILE_CLAN);
106 bn_byte_set(&rpacket->u.server_findanongame_profile_clan.option,CLIENT_FINDANONGAME_PROFILE_CLAN);
107 bn_int_set(&rpacket->u.server_findanongame_profile_clan.count,count);
108 rescount = 0;
109
110 if (!(clan))
111 {
112 temp = 0;
113 packet_append_data(rpacket,&temp,1);
114 }
115 else
116 {
117 temp = 0;
118 packet_append_data(rpacket,&temp,1);
119
120 /* need to add clan stuff here:
121 format:
122 bn_int ladder_tag (SNLC, 2NLC, 3NLC, 4NLC)
123 bn_int wins
124 bn_int losses
125 bn_byte rank
126 bn_byte progess bar
127 bn_int xp
128 bn_int rank
129 bn_byte 0x06 <-- random + 5 races
130 6 times:
131 bn_int wins
132 bn_int losses
133 */
134 }
135
136 bn_byte_set(&rpacket->u.server_findanongame_profile_clan.rescount,rescount);
137
138
139 conn_push_outqueue(c,rpacket);
140 packet_del_ref(rpacket);
141 }
142
143 return 0;
144 }
145
146 static int _client_anongame_profile(t_connection * c, t_packet const * const packet)
147 {
148 t_packet * rpacket;
149 char const * username;
150 int Count, i;
151 int temp;
152 t_account * account;
153 t_connection * dest_c;
154 t_clienttag ctag;
155 char clienttag_str[5];
156 t_list * teamlist;
157 unsigned char teamcount;
158 unsigned char *atcountp;
159 t_elem * curr;
160 t_team * team;
161 t_bnettime bn_time;
162 bn_long ltime;
163
164
165 Count = bn_int_get(packet->u.client_findanongame.count);
166 eventlog(eventlog_level_info,__FUNCTION__,"[%d] got a FINDANONGAME PROFILE packet",conn_get_socket(c));
167
168 if (!(username = packet_get_str_const(packet,sizeof(t_client_findanongame_profile),USER_NAME_MAX)))
169 {
170 eventlog(eventlog_level_error,__FUNCTION__,"[%d] got bad FINDANONGAME_PROFILE (missing or too long username)",conn_get_socket(c));
171 return -1;
172 }
173
174 //If no account is found then break
175 if (!(account = accountlist_find_account(username)))
176 {
177 eventlog(eventlog_level_error, __FUNCTION__, "Could not get account - PROFILE");
178 return -1;
179 }
180
181 if (!(dest_c = connlist_find_connection_by_accountname(username))) {
182 eventlog(eventlog_level_debug, __FUNCTION__, "account is offline - try ll_clienttag");
183 if (!(ctag = account_get_ll_clienttag(account))) return -1;
184 }
185 else
186 ctag = conn_get_clienttag(dest_c);
187
188 eventlog(eventlog_level_info,__FUNCTION__,"Looking up %s's %s Stats.",username,tag_uint_to_str(clienttag_str,ctag));
189
190 if (account_get_ladder_level(account,ctag,ladder_id_solo)<=0 &&
191 account_get_ladder_level(account,ctag,ladder_id_team)<=0 &&
192 account_get_ladder_level(account,ctag,ladder_id_ffa)<=0 &&
193 account_get_teams(account)==NULL)
194 {
195 eventlog(eventlog_level_info,__FUNCTION__,"%s does not have WAR3 Stats.",username);
196 if (!(rpacket = packet_create(packet_class_bnet)))
197 return -1;
198 packet_set_size(rpacket,sizeof(t_server_findanongame_profile2));
199 packet_set_type(rpacket,SERVER_FINDANONGAME_PROFILE);
200 bn_byte_set(&rpacket->u.server_findanongame_profile2.option,CLIENT_FINDANONGAME_PROFILE);
201 bn_int_set(&rpacket->u.server_findanongame_profile2.count,Count);
202 bn_int_set(&rpacket->u.server_findanongame_profile2.icon,account_icon_to_profile_icon(account_get_user_icon(account,ctag),account,ctag));
203 bn_byte_set(&rpacket->u.server_findanongame_profile2.rescount,0);
204 temp=0;
205 packet_append_data(rpacket,&temp,2);
206 conn_push_outqueue(c,rpacket);
207 packet_del_ref(rpacket);
208 }
209 else // If they do have a profile then:
210 {
211 int solowins=account_get_ladder_wins(account,ctag,ladder_id_solo);
212 int sololoss=account_get_ladder_losses(account,ctag,ladder_id_solo);
213 int soloxp=account_get_ladder_xp(account,ctag,ladder_id_solo);
214 int sololevel=account_get_ladder_level(account,ctag,ladder_id_solo);
215 int solorank=account_get_ladder_rank(account,ctag,ladder_id_solo);
216
217 int teamwins=account_get_ladder_wins(account,ctag,ladder_id_team);
218 int teamloss=account_get_ladder_losses(account,ctag,ladder_id_team);
219 int teamxp=account_get_ladder_xp(account,ctag,ladder_id_team);
220 int teamlevel=account_get_ladder_level(account,ctag,ladder_id_team);
221 int teamrank=account_get_ladder_rank(account,ctag,ladder_id_team);
222
223 int ffawins=account_get_ladder_wins(account,ctag,ladder_id_ffa);
224 int ffaloss=account_get_ladder_losses(account,ctag,ladder_id_ffa);
225 int ffaxp=account_get_ladder_xp(account,ctag,ladder_id_ffa);
226 int ffalevel=account_get_ladder_level(account,ctag,ladder_id_ffa);
227 int ffarank=account_get_ladder_rank(account,ctag,ladder_id_ffa);
228
229 int humanwins=account_get_racewins(account,1,ctag);
230 int humanlosses=account_get_racelosses(account,1,ctag);
231 int orcwins=account_get_racewins(account,2,ctag);
232 int orclosses=account_get_racelosses(account,2,ctag);
233 int undeadwins=account_get_racewins(account,8,ctag);
234 int undeadlosses=account_get_racelosses(account,8,ctag);
235 int nightelfwins=account_get_racewins(account,4,ctag);
236 int nightelflosses=account_get_racelosses(account,4,ctag);
237 int randomwins=account_get_racewins(account,0,ctag);
238 int randomlosses=account_get_racelosses(account,0,ctag);
239
240 unsigned char rescount;
241
242 if (!(rpacket = packet_create(packet_class_bnet)))
243 return -1;
244 packet_set_size(rpacket,sizeof(t_server_findanongame_profile2));
245 packet_set_type(rpacket,SERVER_FINDANONGAME_PROFILE);
246 bn_byte_set(&rpacket->u.server_findanongame_profile2.option,CLIENT_FINDANONGAME_PROFILE);
247 bn_int_set(&rpacket->u.server_findanongame_profile2.count,Count); //job count
248 bn_int_set(&rpacket->u.server_findanongame_profile2.icon,account_icon_to_profile_icon(account_get_user_icon(account,ctag),account,ctag));
249
250 rescount = 0;
251 if (sololevel > 0) {
252 bn_int_set((bn_int*)&temp,0x534F4C4F); // SOLO backwards
253 packet_append_data(rpacket,&temp,4);
254 temp=0;
255 bn_int_set((bn_int*)&temp,solowins);
256 packet_append_data(rpacket,&temp,2); //SOLO WINS
257 bn_int_set((bn_int*)&temp,sololoss);
258 packet_append_data(rpacket,&temp,2); // SOLO LOSSES
259 bn_int_set((bn_int*)&temp,sololevel);
260 packet_append_data(rpacket,&temp,1); // SOLO LEVEL
261 bn_int_set((bn_int*)&temp,account_get_profile_calcs(account,soloxp,sololevel));
262 packet_append_data(rpacket,&temp,1); // SOLO PROFILE CALC
263 bn_int_set((bn_int *)&temp,soloxp);
264 packet_append_data(rpacket,&temp,2); // SOLO XP
265 bn_int_set((bn_int *)&temp,solorank);
266 packet_append_data(rpacket,&temp,4); // SOLO LADDER RANK
267 rescount++;
268 }
269
270 if (teamlevel > 0) {
271 //below is for team records. Add this after 2v2,3v3,4v4 are done
272 bn_int_set((bn_int*)&temp,0x5445414D);
273 packet_append_data(rpacket,&temp,4);
274 bn_int_set((bn_int*)&temp,teamwins);
275 packet_append_data(rpacket,&temp,2);
276 bn_int_set((bn_int*)&temp,teamloss);
277 packet_append_data(rpacket,&temp,2);
278 bn_int_set((bn_int*)&temp,teamlevel);
279 packet_append_data(rpacket,&temp,1);
280 bn_int_set((bn_int*)&temp,account_get_profile_calcs(account,teamxp,teamlevel));
281
282 packet_append_data(rpacket,&temp,1);
283 bn_int_set((bn_int*)&temp,teamxp);
284 packet_append_data(rpacket,&temp,2);
285 bn_int_set((bn_int*)&temp,teamrank);
286 packet_append_data(rpacket,&temp,4);
287 //done of team game stats
288 rescount++;
289 }
290
291 if (ffalevel > 0) {
292 bn_int_set((bn_int*)&temp,0x46464120);
293 packet_append_data(rpacket,&temp,4);
294 bn_int_set((bn_int*)&temp,ffawins);
295 packet_append_data(rpacket,&temp,2);
296 bn_int_set((bn_int*)&temp,ffaloss);
297 packet_append_data(rpacket,&temp,2);
298 bn_int_set((bn_int*)&temp,ffalevel);
299 packet_append_data(rpacket,&temp,1);
300 bn_int_set((bn_int*)&temp,account_get_profile_calcs(account,ffaxp,ffalevel));
301 packet_append_data(rpacket,&temp,1);
302 bn_int_set((bn_int*)&temp,ffaxp);
303 packet_append_data(rpacket,&temp,2);
304 bn_int_set((bn_int*)&temp,ffarank);
305 packet_append_data(rpacket,&temp,4);
306 //End of FFA Stats
307 rescount++;
308 }
309 /* set result count */
310 bn_byte_set(&rpacket->u.server_findanongame_profile2.rescount,rescount);
311
312 bn_int_set((bn_int*)&temp,0x06); //start of race stats
313 packet_append_data(rpacket,&temp,1);
314 bn_int_set((bn_int*)&temp,randomwins);
315 packet_append_data(rpacket,&temp,2); //random wins
316 bn_int_set((bn_int*)&temp,randomlosses);
317 packet_append_data(rpacket,&temp,2); //random losses
318 bn_int_set((bn_int*)&temp,humanwins);
319 packet_append_data(rpacket,&temp,2); //human wins
320 bn_int_set((bn_int*)&temp,humanlosses);
321 packet_append_data(rpacket,&temp,2); //human losses
322 bn_int_set((bn_int*)&temp,orcwins);
323 packet_append_data(rpacket,&temp,2); //orc wins
324 bn_int_set((bn_int*)&temp,orclosses);
325 packet_append_data(rpacket,&temp,2); //orc losses
326 bn_int_set((bn_int*)&temp,undeadwins);
327 packet_append_data(rpacket,&temp,2); //undead wins
328 bn_int_set((bn_int*)&temp,undeadlosses);
329 packet_append_data(rpacket,&temp,2); //undead losses
330 bn_int_set((bn_int*)&temp,nightelfwins);
331 packet_append_data(rpacket,&temp,2); //elf wins
332 bn_int_set((bn_int*)&temp,nightelflosses);
333 packet_append_data(rpacket,&temp,2); //elf losses
334 temp=0;
335 packet_append_data(rpacket,&temp,4);
336 //end of normal stats - Start of AT stats
337
338 /* 1 byte team count place holder, set later */
339 packet_append_data(rpacket, &temp, 1);
340
341 /* we need to store the AT team count but we dont know yet the no
342 * of stored teams so we cache the pointer for later use
343 */
344 atcountp = (unsigned char *)packet_get_raw_data(rpacket, packet_get_size(rpacket) - 1);
345
346 teamlist = account_get_teams(account);
347 teamcount = 0;
348 if (teamlist)
349 {
350 int teamtype[] = {0, 0x32565332, 0x33565333, 0x34565334, 0x35565335, 0x36565336};
351
352 LIST_TRAVERSE(teamlist,curr)
353 {
354 if (!(team = elem_get_data(curr)))
355 {
356 eventlog(eventlog_level_error, __FUNCTION__, "found NULL entry in list");
357 continue;
358 }
359
360 if (team_get_clienttag(team) != ctag)
361 continue;
362
363 bn_int_set((bn_int*)&temp,teamtype[team_get_size(team)-1]);
364 packet_append_data(rpacket,&temp,4);
365
366 bn_int_set((bn_int*)&temp,team_get_wins(team)); //at team wins
367 packet_append_data(rpacket,&temp,2);
368 bn_int_set((bn_int*)&temp,team_get_losses(team)); //at team losses
369 packet_append_data(rpacket,&temp,2);
370 bn_int_set((bn_int*)&temp,team_get_level(team));
371 packet_append_data(rpacket,&temp,1);
372 bn_int_set((bn_int*)&temp,account_get_profile_calcs(account,team_get_xp(team),team_get_level(team))); // xp bar calc
373 packet_append_data(rpacket,&temp,1);
374 bn_int_set((bn_int*)&temp,team_get_xp(team));
375 packet_append_data(rpacket,&temp,2);
376 bn_int_set((bn_int*)&temp,team_get_rank(team)); //rank on AT ladder
377 packet_append_data(rpacket,&temp,4);
378
379 bn_time = time_to_bnettime(temp,team_get_lastgame(team));
380 bnettime_to_bn_long(bn_time,&ltime);
381 packet_append_data(rpacket,&ltime,8);
382
383 bn_int_set((bn_int*)&temp,team_get_size(team)-1);
384 packet_append_data(rpacket,&temp,1);
385
386 for (i=0; i<team_get_size(team);i++)
387 {
388 if ((team_get_memberuid(team,i)!=account_get_uid(account)))
389 packet_append_string(rpacket,account_get_name(team_get_member(team,i)));
390 //now attach the names to the packet - not including yourself
391 // [quetzal] 20020826
392
393 }
394 teamcount++;
395
396 if ((teamcount>=16)) break;
397 }
398 }
399
400 *atcountp = (unsigned char)teamcount;
401
402 conn_push_outqueue(c,rpacket);
403 packet_del_ref(rpacket);
404
405 eventlog(eventlog_level_info,__FUNCTION__,"Sent %s's WAR3 Stats (including %d teams) to requestor.",username,teamcount);
406 }
407 return 0;
408 }
409
410 static int _client_anongame_cancel(t_connection * c)
411 {
412 t_packet * rpacket;
413 t_connection * tc[ANONGAME_MAX_GAMECOUNT/2];
414
415 // [quetzal] 20020809 - added a_count, so we dont refer to already destroyed anongame
416 t_anongame *a = conn_get_anongame(c);
417 int a_count, i;
418
419 eventlog(eventlog_level_info,__FUNCTION__,"[%d] got FINDANONGAME CANCEL packet", conn_get_socket(c));
420
421 if(!a)
422 return -1;
423
424 a_count = anongame_get_count(a);
425
426 // anongame_unqueue(c, anongame_get_queue(a));
427 // -- already doing unqueue in conn_destroy_anongame
428 for (i=0; i < ANONGAME_MAX_GAMECOUNT/2; i++)
429 tc[i] = anongame_get_tc(a, i);
430
431 for (i=0; i < ANONGAME_MAX_GAMECOUNT/2; i++) {
432 if (tc[i] == NULL)
433 continue;
434
435 conn_set_routeconn(tc[i], NULL);
436 conn_destroy_anongame(tc[i]);
437 }
438
439 if (!(rpacket = packet_create(packet_class_bnet)))
440 return -1;
441
442 packet_set_size(rpacket,sizeof(t_server_findanongame_playgame_cancel));
443 packet_set_type(rpacket,SERVER_FINDANONGAME_PLAYGAME_CANCEL);
444 bn_byte_set(&rpacket->u.server_findanongame_playgame_cancel.cancel,SERVER_FINDANONGAME_CANCEL);
445 bn_int_set(&rpacket->u.server_findanongame_playgame_cancel.count, a_count);
446 conn_push_outqueue(c,rpacket);
447 packet_del_ref(rpacket);
448 return 0;
449 }
450
451 static int _client_anongame_get_icon(t_connection * c, t_packet const * const packet)
452 {
453 t_packet * rpacket;
454
455 //BlacKDicK 04/20/2003 Need some huge re-work on this.
456 {
457 struct
458 {
459 char icon_code[4];
460 unsigned int portrait_code;
461 char race;
462 bn_short required_wins;
463 char client_enabled;
464 } tempicon;
465
466 //FIXME: Add those to the prefs and also merge them on accoun_wrap;
467 // FIXED BY DJP 07/16/2003 FOR 110 CHANGE ( TOURNEY & RACE WINS ) + Table_witdh
468 short icon_req_race_wins;
469 short icon_req_tourney_wins;
470 int race[]={W3_RACE_RANDOM,W3_RACE_HUMANS,W3_RACE_ORCS,W3_RACE_UNDEAD,W3_RACE_NIGHTELVES,W3_ICON_DEMONS};
471 char race_char[6] ={'R','H','O','U','N','D'};
472 char icon_pos[5] ={'2','3','4','5','6',};
473 char table_width = 6;
474 char table_height= 5;
475 int i,j;
476 char rico;
477 unsigned int rlvl,rwins;
478 t_clienttag clienttag;
479 t_account * acc;
480
481 char user_icon[5];
482 char const * uicon;
483
484 clienttag = conn_get_clienttag(c);
485 acc = conn_get_account(c);
486 /* WAR3 uses a different table size, might change if blizzard add tournament support to RoC */
487 if (clienttag==CLIENTTAG_WARCRAFT3_UINT) {
488 table_width = 5;
489 table_height= 4;
490 }
491
492 eventlog(eventlog_level_info,__FUNCTION__,"[%d] got FINDANONGAME Get Icons packet",conn_get_socket(c));
493
494 if ((rpacket = packet_create(packet_class_bnet)) == NULL) {
495 eventlog(eventlog_level_error, __FUNCTION__, "could not create new packet");
496 return -1;
497 }
498
499 packet_set_size(rpacket, sizeof(t_server_findanongame_iconreply));
500 packet_set_type(rpacket, SERVER_FINDANONGAME_ICONREPLY);
501 bn_int_set(&rpacket->u.server_findanongame_iconreply.count, bn_int_get(packet->u.client_findanongame_inforeq.count));
502 bn_byte_set(&rpacket->u.server_findanongame_iconreply.option, CLIENT_FINDANONGAME_GET_ICON);
503 if ((uicon = account_get_user_icon(acc,clienttag)))
504 {
505 memcpy(&rpacket->u.server_findanongame_iconreply.curricon, uicon,4);
506 }
507 else
508 {
509 account_get_raceicon(acc,&rico,&rlvl,&rwins,clienttag);
510 sprintf(user_icon,"%1d%c3W",rlvl,rico);
511 memcpy(&rpacket->u.server_findanongame_iconreply.curricon,user_icon,4);
512 }
513
514 bn_byte_set(&rpacket->u.server_findanongame_iconreply.table_width, table_width);
515 bn_byte_set(&rpacket->u.server_findanongame_iconreply.table_size, table_width*table_height);
516 for (j=0;j<table_height;j++){
517 if (clienttag==CLIENTTAG_WARCRAFT3_UINT)
518 icon_req_race_wins = anongame_infos_get_ICON_REQ_WAR3(j+1);
519 else
520 icon_req_race_wins = anongame_infos_get_ICON_REQ_W3XP(j+1);
521 for (i=0;i<table_width;i++){
522 tempicon.race=i;
523 tempicon.icon_code[0] = icon_pos[j];
524 tempicon.icon_code[1] = race_char[i];
525 tempicon.icon_code[2] = '3';
526 tempicon.icon_code[3] = 'W';
527 tempicon.portrait_code = (account_icon_to_profile_icon(tempicon.icon_code,acc,clienttag));
528 if (i<=4){
529 //Building the icon for the races
530 bn_short_set(&tempicon.required_wins,icon_req_race_wins);
531 if (account_get_racewins(acc,race[i],clienttag)>=icon_req_race_wins) {
532 tempicon.client_enabled=1;
533 }else{
534 tempicon.client_enabled=0;
535 }
536 }else{
537 //Building the icon for the tourney
538 icon_req_tourney_wins = anongame_infos_get_ICON_REQ_TOURNEY(j+1);
539 bn_short_set(&tempicon.required_wins,icon_req_tourney_wins);
540 if (account_get_racewins(acc,race[i],clienttag)>=icon_req_tourney_wins) {
541 tempicon.client_enabled=1;
542 }else{
543 tempicon.client_enabled=0;}
544 }
545 packet_append_data(rpacket, &tempicon, sizeof(tempicon));
546 }
547 }
548 //Go,go,go
549 conn_push_outqueue(c,rpacket);
550 packet_del_ref(rpacket);
551 }
552 return 0;
553 }
554
555 static int _client_anongame_set_icon(t_connection * c, t_packet const * const packet)
556 {
557 //BlacKDicK 04/20/2003
558 unsigned int desired_icon;
559 char user_icon[5];
560
561 /*FIXME: In this case we do not get a 'count' but insted of it we get the icon
562 that the client wants to set.'W3H2' for an example. For now it is ok, since they share
563 the same position on the packet*/
564 desired_icon=bn_int_get(packet->u.client_findanongame.count);
565 user_icon[4]=0;
566 if (desired_icon==0){
567 strcpy(user_icon,"NULL");
568 eventlog(eventlog_level_info,__FUNCTION__,"[%d] Set icon packet to DEFAULT ICON [%4.4s]",conn_get_socket(c),user_icon);
569 }else{
570 memcpy(user_icon,&desired_icon,4);
571 eventlog(eventlog_level_info,__FUNCTION__,"[%d] Set icon packet to ICON [%s]",conn_get_socket(c),user_icon);
572 }
573
574 account_set_user_icon(conn_get_account(c),conn_get_clienttag(c),user_icon);
575 //FIXME: Still need a way to 'refresh the user/channel'
576 //_handle_rejoin_command(conn_get_account(c),"");
577 /* ??? channel_update_userflags() */
578 conn_update_w3_playerinfo(c);
579
580 channel_rejoin(c);
581 return 0;
582 }
583
584 static int _client_anongame_infos(t_connection * c, t_packet const * const packet)
585 {
586 t_packet * rpacket;
587
588 if (bn_int_get(packet->u.client_findanongame_inforeq.count) > 1) {
589 /* reply with 0 entries found */
590 int temp = 0;
591
592 if ((rpacket = packet_create(packet_class_bnet)) == NULL) {
593 eventlog(eventlog_level_error, __FUNCTION__, "could not create new packet");
594 return -1;
595 }
596
597 packet_set_size(rpacket, sizeof(t_server_findanongame_inforeply));
598 packet_set_type(rpacket, SERVER_FINDANONGAME_INFOREPLY);
599 bn_byte_set(&rpacket->u.server_findanongame_inforeply.option, CLIENT_FINDANONGAME_INFOS);
600 bn_int_set(&rpacket->u.server_findanongame_inforeply.count, bn_int_get(packet->u.client_findanongame_inforeq.count));
601 bn_byte_set(&rpacket->u.server_findanongame_inforeply.noitems, 0);
602 packet_append_data(rpacket, &temp, 1);
603
604 conn_push_outqueue(c,rpacket);
605 packet_del_ref(rpacket);
606 } else {
607 int i;
608 int client_tag;
609 int server_tag_count = 0;
610 int client_tag_unk;
611 int server_tag_unk;
612 bn_int temp;
613 char noitems;
614 char * tmpdata;
615 int tmplen;
616 t_clienttag clienttag = conn_get_clienttag(c);
617 char last_packet = 0x00;
618 char other_packet = 0x01;
619 char langstr[5];
620 t_gamelang gamelang = conn_get_gamelang(c);
621 bn_int_tag_get((bn_int const *)&gamelang, langstr, 5);
622
623 /* Send seperate packet for each item requested
624 * sending all at once overloaded w3xp
625 * [Omega] */
626 for (i=0;i<bn_byte_get(packet->u.client_findanongame_inforeq.noitems);i++){
627 noitems = 0;
628
629 if ((rpacket = packet_create(packet_class_bnet)) == NULL) {
630 eventlog(eventlog_level_error, __FUNCTION__, "could not create new packet");
631 return -1;
632 }
633
634 /* Starting the packet stuff */
635 packet_set_size(rpacket, sizeof(t_server_findanongame_inforeply));
636 packet_set_type(rpacket, SERVER_FINDANONGAME_INFOREPLY);
637 bn_byte_set(&rpacket->u.server_findanongame_inforeply.option, CLIENT_FINDANONGAME_INFOS);
638 bn_int_set(&rpacket->u.server_findanongame_inforeply.count, 1);
639
640 memcpy(&temp,(packet_get_data_const(packet,10+(i*8),4)),sizeof(int));
641 client_tag=bn_int_get(temp);
642 memcpy(&temp,packet_get_data_const(packet,14+(i*8),4),sizeof(int));
643 client_tag_unk=bn_int_get(temp);
644
645 switch (client_tag){
646 case CLIENT_FINDANONGAME_INFOTAG_URL:
647 bn_int_set((bn_int*)&server_tag_unk,0xBF1F1047);
648 packet_append_data(rpacket, "LRU\0" , 4);
649 packet_append_data(rpacket, &server_tag_unk , 4);
650 // FIXME: Maybe need do do some checks to avoid prefs empty strings.
651 tmpdata = anongame_infos_data_get_url(clienttag, conn_get_versionid(c), &tmplen);
652 packet_append_data(rpacket, tmpdata, tmplen);
653 noitems++;
654 server_tag_count++;
655 eventlog(eventlog_level_debug,__FUNCTION__,"client_tag version=(0x%01x) request tagid=(0x%01x) tag=(%s) tag_unk=(0x%04x)",conn_get_versionid(c),i,"CLIENT_FINDANONGAME_INFOTAG_URL",client_tag_unk);
656 break;
657 case CLIENT_FINDANONGAME_INFOTAG_MAP:
658 bn_int_set((bn_int*)&server_tag_unk,0x70E2E0D5);
659 packet_append_data(rpacket, "PAM\0" , 4);
660 packet_append_data(rpacket, &server_tag_unk , 4);
661 tmpdata = anongame_infos_data_get_map(clienttag, conn_get_versionid(c), &tmplen);
662 packet_append_data(rpacket, tmpdata, tmplen);
663 noitems++;
664 server_tag_count++;
665 eventlog(eventlog_level_debug,__FUNCTION__,"client_tag request tagid=(0x%01x) tag=(%s) tag_unk=(0x%04x)",i,"CLIENT_FINDANONGAME_INFOTAG_MAP",client_tag_unk);
666 break;
667 case CLIENT_FINDANONGAME_INFOTAG_TYPE:
668 bn_int_set((bn_int*)&server_tag_unk,0x7C87DEEE);
669 packet_append_data(rpacket, "EPYT" , 4);
670 packet_append_data(rpacket, &server_tag_unk , 4);
671 tmpdata = anongame_infos_data_get_type(clienttag, conn_get_versionid(c), &tmplen);
672 packet_append_data(rpacket, tmpdata, tmplen);
673 noitems++;
674 server_tag_count++;
675 eventlog(eventlog_level_debug,__FUNCTION__,"client_tag request tagid=(0x%01x) tag=(%s) tag_unk=(0x%04x)",i,"CLIENT_FINDANONGAME_INFOTAG_TYPE",client_tag_unk);
676 break;
677 case CLIENT_FINDANONGAME_INFOTAG_DESC:
678 bn_int_set((bn_int*)&server_tag_unk,0xA4F0A22F);
679 packet_append_data(rpacket, "CSED" , 4);
680 packet_append_data(rpacket,&server_tag_unk,4);
681 tmpdata = anongame_infos_data_get_desc(langstr, clienttag, conn_get_versionid(c), &tmplen);
682 packet_append_data(rpacket, tmpdata, tmplen);
683 eventlog(eventlog_level_debug,__FUNCTION__,"client_tag request tagid=(0x%01x) tag=(%s) tag_unk=(0x%04x)",i,"CLIENT_FINDANONGAME_INFOTAG_DESC",client_tag_unk);
684 noitems++;
685 server_tag_count++;
686 break;
687 case CLIENT_FINDANONGAME_INFOTAG_LADR:
688 bn_int_set((bn_int*)&server_tag_unk,0x3BADE25A);
689 packet_append_data(rpacket, "RDAL" , 4);
690 packet_append_data(rpacket, &server_tag_unk , 4);
691 tmpdata = anongame_infos_data_get_ladr(langstr, clienttag, conn_get_versionid(c), &tmplen);
692 packet_append_data(rpacket, tmpdata, tmplen);
693 noitems++;
694 server_tag_count++;
695 eventlog(eventlog_level_debug,__FUNCTION__,"client_tag request tagid=(0x%01x) tag=(%s) tag_unk=(0x%04x)",i,"CLIENT_FINDANONGAME_INFOTAG_LADR",client_tag_unk);
696 break;
697 default:
698 eventlog(eventlog_level_debug,__FUNCTION__,"unrec client_tag request tagid=(0x%01x) tag=(0x%04x)",i,client_tag);
699
700 }
701 //Adding a last padding null-byte
702 if (server_tag_count == bn_byte_get(packet->u.client_findanongame_inforeq.noitems))
703 packet_append_data(rpacket, &last_packet, 1); /* only last packet in group gets 0x00 */
704 else
705 packet_append_data(rpacket, &other_packet, 1); /* the rest get 0x01 */
706
707 //Go,go,go
708 bn_byte_set(&rpacket->u.server_findanongame_inforeply.noitems, noitems);
709 conn_push_outqueue(c,rpacket);
710 packet_del_ref(rpacket);
711 }
712 }
713 return 0;
714 }
715
716 /* tournament notice disabled at this time, but responce is sent to cleint */
717 static int _client_anongame_tournament(t_connection * c, t_packet const * const packet)
718 {
719 t_packet * rpacket;
720
721 t_account * account = conn_get_account(c);
722 t_clienttag clienttag = conn_get_clienttag(c);
723
724 unsigned int start_prelim = tournament_get_start_preliminary();
725 unsigned int end_signup = tournament_get_end_signup();
726 unsigned int end_prelim = tournament_get_end_preliminary();
727 unsigned int start_r1 = tournament_get_start_round_1();
728
729 if ((rpacket = packet_create(packet_class_bnet)) == NULL) {
730 eventlog(eventlog_level_error, __FUNCTION__, "could not create new packet");
731 return -1;
732 }
733
734 packet_set_size(rpacket, sizeof(t_server_anongame_tournament_reply));
735 packet_set_type(rpacket, SERVER_FINDANONGAME_TOURNAMENT_REPLY);
736 bn_byte_set(&rpacket->u.server_anongame_tournament_reply.option, 7);
737 bn_int_set(&rpacket->u.server_anongame_tournament_reply.count,
738 bn_int_get(packet->u.client_anongame_tournament_request.count));
739
740 if ( !start_prelim || (end_signup <= now && tournament_user_signed_up(account) < 0) ||
741 tournament_check_client(clienttag) < 0) { /* No Tournament Notice */
742 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 0);
743 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0);
744 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0);
745 bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, 0);
746 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0);
747 bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, 0);
748 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0);
749 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, 0);
750 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, 0);
751 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, 0);
752 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0);
753 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 0);
754 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0);
755 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0);
756 }
757 else if (start_prelim>=now) { /* Tournament Notice */
758 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 1);
759 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0);
760 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0000); /* random */
761 bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(start_prelim));
762 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01);
763 bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, start_prelim-now);
764 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0);
765 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, 0);
766 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, 0);
767 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, 0);
768 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x00);
769 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2);
770 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0);
771 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0);
772 }
773 else if (end_signup>=now) { /* Tournament Signup Notice - Play Game Active */
774 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 2);
775 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0);
776 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0828); /* random */
777 bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(end_signup));
778 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01);
779 bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, end_signup-now);
780 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0);
781 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, tournament_get_stat(account, 1));
782 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, tournament_get_stat(account, 2));
783 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, tournament_get_stat(account, 3));
784 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x08);
785 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2);
786 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0);
787 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0);
788 }
789 else if (end_prelim>=now) { /* Tournament Prelim Period - Play Game Active */
790 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 3);
791 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0);
792 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0828); /* random */
793 bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(end_prelim));
794 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01);
795 bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, end_prelim-now);
796 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0);
797 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, tournament_get_stat(account, 1));
798 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, tournament_get_stat(account, 2));
799 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, tournament_get_stat(account, 3));
800 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x08);
801 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2);
802 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0);
803 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0);
804 }
805 else if (start_r1>=now && (tournament_get_game_in_progress()) ) { /* Prelim Period Over - Shows user stats (not all prelim games finished) */
806 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 4);
807 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0);
808 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0000); /* random */
809 bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(start_r1));
810 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01);
811 bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, start_r1-now);
812 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0); /* 00 00 */
813 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, tournament_get_stat(account, 1));
814 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, tournament_get_stat(account, 2));
815 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, tournament_get_stat(account, 3));
816 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x08);
817 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2);
818 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0);
819 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0);
820 }
821 else if (!(tournament_get_in_finals_status(account))) { /* Prelim Period Over - user did not make finals - Shows user stats */
822 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 5);
823 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0);
824 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0);
825 bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, 0);
826 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0);
827 bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, 0);
828 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0);
829 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, tournament_get_stat(account, 1));
830 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, tournament_get_stat(account, 2));
831 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, tournament_get_stat(account, 3));
832 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x04);
833 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2);
834 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0);
835 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0);
836 }
837 /* cycle through [type-6] & [type-7] packets
838 *
839 * use [type-6] to show client "eliminated" or "continue"
840 * timestamp , countdown & round number (of next round) must be set if clinet continues
841 *
842 * use [type-7] to make cleint wait for 44FF packet option 1 to start game (A guess, not tested)
843 *
844 * not sure if there is overall winner packet sent at end of last final round
845 */
846
847 else if ( (0) ) { /* User in finals - Shows user stats and start of next round*/
848 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 6);
849 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0);
850 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0000);
851 bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(start_r1));
852 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01);
853 bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, start_r1-now);
854 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0x0000); /* 00 00 */
855 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, 4); /* round number */
856 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, 0); /* 0 = continue , 1= eliminated */
857 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, 0);
858 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x04); /* number of rounds in finals */
859 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2);
860 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0);
861 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0);
862 }
863 else if ( (0) ) { /* user waiting for match to be made */
864 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 7);
865 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0);
866 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0);
867 bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, 0);
868 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0);
869 bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, 0);
870 bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0);
871 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, 1); /* round number */
872 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, 0);
873 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, 0);
874 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x04); /* number of finals */
875 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2);
876 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0);
877 bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0);
878 }
879
880 conn_push_outqueue(c,rpacket);
881 packet_del_ref(rpacket);
882 return 0;
883 }
884
885 static unsigned int _tournament_time_convert(unsigned int time)
886 {
887 /* it works, don't ask me how */ /* some time drift reportd by testers */
888 unsigned int tmp1, tmp2, tmp3;
889
890 tmp1 = time-1059179400; /* 0x3F21CB88 */
891 tmp2 = tmp1*0.59604645;
892 tmp3 = tmp2+3276999960U;
893 /*eventlog(eventlog_level_trace,__FUNCTION__,"time: 0x%08x, tmp1: 0x%08x, tmp2 0x%08x, tmp3 0x%08x",time,tmp1,tmp2,tmp3);*/
894
895 return tmp3;
896 }
897
898 extern int handle_anongame_packet(t_connection * c, t_packet const * const packet)
899 {
900 switch (bn_byte_get(packet->u.client_anongame.option))
901 {
902 case CLIENT_FINDANONGAME_PROFILE:
903 return _client_anongame_profile(c, packet);
904
905 case CLIENT_FINDANONGAME_CANCEL:
906 return _client_anongame_cancel(c);
907
908 case CLIENT_FINDANONGAME_SEARCH:
909 case CLIENT_FINDANONGAME_AT_INVITER_SEARCH:
910 case CLIENT_FINDANONGAME_AT_SEARCH:
911 return handle_anongame_search(c, packet); /* located in anongame.c */
912
913 case CLIENT_FINDANONGAME_GET_ICON:
914 return _client_anongame_get_icon(c, packet);
915
916 case CLIENT_FINDANONGAME_SET_ICON:
917 return _client_anongame_set_icon(c, packet);
918
919 case CLIENT_FINDANONGAME_INFOS:
920 return _client_anongame_infos(c, packet);
921
922 case CLIENT_ANONGAME_TOURNAMENT:
923 return _client_anongame_tournament(c, packet);
924
925 case CLIENT_FINDANONGAME_PROFILE_CLAN:
926 return _client_anongame_profile_clan(c, packet);
927
928 default:
929 eventlog(eventlog_level_error,__FUNCTION__,"got unhandled option %d",bn_byte_get(packet->u.client_findanongame.option));
930 return -1;
931 }
932 }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1