?? handle_anongame.c
字號:
noitems = 0; if ((rpacket = packet_create(packet_class_bnet)) == NULL) { eventlog(eventlog_level_error, __FUNCTION__, "could not create new packet"); return -1; } /* Starting the packet stuff */ packet_set_size(rpacket, sizeof(t_server_findanongame_inforeply)); packet_set_type(rpacket, SERVER_FINDANONGAME_INFOREPLY); bn_byte_set(&rpacket->u.server_findanongame_inforeply.option, CLIENT_FINDANONGAME_INFOS); bn_int_set(&rpacket->u.server_findanongame_inforeply.count, 1); memcpy(&temp,(packet_get_data_const(packet,10+(i*8),4)),sizeof(int)); client_tag=bn_int_get(temp); memcpy(&temp,packet_get_data_const(packet,14+(i*8),4),sizeof(int)); client_tag_unk=bn_int_get(temp); switch (client_tag){ case CLIENT_FINDANONGAME_INFOTAG_URL: bn_int_set((bn_int*)&server_tag_unk,0xBF1F1047); packet_append_data(rpacket, "LRU\0" , 4); packet_append_data(rpacket, &server_tag_unk , 4); // FIXME: Maybe need do do some checks to avoid prefs empty strings. tmpdata = anongame_infos_data_get_url(clienttag, conn_get_versionid(c), &tmplen); packet_append_data(rpacket, tmpdata, tmplen); noitems++; server_tag_count++; 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); break; case CLIENT_FINDANONGAME_INFOTAG_MAP: bn_int_set((bn_int*)&server_tag_unk,0x70E2E0D5); packet_append_data(rpacket, "PAM\0" , 4); packet_append_data(rpacket, &server_tag_unk , 4); tmpdata = anongame_infos_data_get_map(clienttag, conn_get_versionid(c), &tmplen); packet_append_data(rpacket, tmpdata, tmplen); noitems++; server_tag_count++; 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); break; case CLIENT_FINDANONGAME_INFOTAG_TYPE: bn_int_set((bn_int*)&server_tag_unk,0x7C87DEEE); packet_append_data(rpacket, "EPYT" , 4); packet_append_data(rpacket, &server_tag_unk , 4); tmpdata = anongame_infos_data_get_type(clienttag, conn_get_versionid(c), &tmplen); packet_append_data(rpacket, tmpdata, tmplen); noitems++; server_tag_count++; 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); break; case CLIENT_FINDANONGAME_INFOTAG_DESC: bn_int_set((bn_int*)&server_tag_unk,0xA4F0A22F); packet_append_data(rpacket, "CSED" , 4); packet_append_data(rpacket,&server_tag_unk,4); tmpdata = anongame_infos_data_get_desc(langstr, clienttag, conn_get_versionid(c), &tmplen); packet_append_data(rpacket, tmpdata, tmplen); 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); noitems++; server_tag_count++; break; case CLIENT_FINDANONGAME_INFOTAG_LADR: bn_int_set((bn_int*)&server_tag_unk,0x3BADE25A); packet_append_data(rpacket, "RDAL" , 4); packet_append_data(rpacket, &server_tag_unk , 4); tmpdata = anongame_infos_data_get_ladr(langstr, clienttag, conn_get_versionid(c), &tmplen); packet_append_data(rpacket, tmpdata, tmplen); noitems++; server_tag_count++; 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); break; default: eventlog(eventlog_level_debug,__FUNCTION__,"unrec client_tag request tagid=(0x%01x) tag=(0x%04x)",i,client_tag); } //Adding a last padding null-byte if (server_tag_count == bn_byte_get(packet->u.client_findanongame_inforeq.noitems)) packet_append_data(rpacket, &last_packet, 1); /* only last packet in group gets 0x00 */ else packet_append_data(rpacket, &other_packet, 1); /* the rest get 0x01 */ //Go,go,go bn_byte_set(&rpacket->u.server_findanongame_inforeply.noitems, noitems); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); } } return 0;}/* tournament notice disabled at this time, but responce is sent to cleint */static int _client_anongame_tournament(t_connection * c, t_packet const * const packet){ t_packet * rpacket; t_account * account = conn_get_account(c); t_clienttag clienttag = conn_get_clienttag(c); unsigned int start_prelim = tournament_get_start_preliminary(); unsigned int end_signup = tournament_get_end_signup(); unsigned int end_prelim = tournament_get_end_preliminary(); unsigned int start_r1 = tournament_get_start_round_1(); if ((rpacket = packet_create(packet_class_bnet)) == NULL) { eventlog(eventlog_level_error, __FUNCTION__, "could not create new packet"); return -1; } packet_set_size(rpacket, sizeof(t_server_anongame_tournament_reply)); packet_set_type(rpacket, SERVER_FINDANONGAME_TOURNAMENT_REPLY); bn_byte_set(&rpacket->u.server_anongame_tournament_reply.option, 7); bn_int_set(&rpacket->u.server_anongame_tournament_reply.count, bn_int_get(packet->u.client_anongame_tournament_request.count)); if ( !start_prelim || (end_signup <= now && tournament_user_signed_up(account) < 0) || tournament_check_client(clienttag) < 0) { /* No Tournament Notice */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0); bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0); } else if (start_prelim>=now) { /* Tournament Notice */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 1); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0000); /* random */ bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(start_prelim)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01); bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, start_prelim-now); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x00); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0); } else if (end_signup>=now) { /* Tournament Signup Notice - Play Game Active */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 2); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0828); /* random */ bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(end_signup)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01); bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, end_signup-now); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, tournament_get_stat(account, 1)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, tournament_get_stat(account, 2)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, tournament_get_stat(account, 3)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x08); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0); } else if (end_prelim>=now) { /* Tournament Prelim Period - Play Game Active */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 3); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0828); /* random */ bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(end_prelim)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01); bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, end_prelim-now); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, tournament_get_stat(account, 1)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, tournament_get_stat(account, 2)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, tournament_get_stat(account, 3)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x08); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0); } else if (start_r1>=now && (tournament_get_game_in_progress()) ) { /* Prelim Period Over - Shows user stats (not all prelim games finished) */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 4); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0000); /* random */ bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(start_r1)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01); bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, start_r1-now); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0); /* 00 00 */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, tournament_get_stat(account, 1)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, tournament_get_stat(account, 2)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, tournament_get_stat(account, 3)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x08); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0); } else if (!(tournament_get_in_finals_status(account))) { /* Prelim Period Over - user did not make finals - Shows user stats */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 5); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0); bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, tournament_get_stat(account, 1)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, tournament_get_stat(account, 2)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, tournament_get_stat(account, 3)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x04); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0); } /* cycle through [type-6] & [type-7] packets * * use [type-6] to show client "eliminated" or "continue" * timestamp , countdown & round number (of next round) must be set if clinet continues * * use [type-7] to make cleint wait for 44FF packet option 1 to start game (A guess, not tested) * * not sure if there is overall winner packet sent at end of last final round */ else if ( (0) ) { /* User in finals - Shows user stats and start of next round*/ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 6); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0x0000); bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, _tournament_time_convert(start_r1)); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0x01); bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, start_r1-now); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0x0000); /* 00 00 */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, 4); /* round number */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, 0); /* 0 = continue , 1= eliminated */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x04); /* number of rounds in finals */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0); } else if ( (0) ) { /* user waiting for match to be made */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.type, 7); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown4, 0); bn_int_set( &rpacket->u.server_anongame_tournament_reply.timestamp, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown5, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.countdown, 0); bn_short_set( &rpacket->u.server_anongame_tournament_reply.unknown2, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.wins, 1); /* round number */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.losses, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.ties, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.unknown3, 0x04); /* number of finals */ bn_byte_set( &rpacket->u.server_anongame_tournament_reply.selection, 2); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.descnum, 0); bn_byte_set( &rpacket->u.server_anongame_tournament_reply.nulltag, 0); } conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); return 0;}static unsigned int _tournament_time_convert(unsigned int time){ /* it works, don't ask me how */ /* some time drift reportd by testers */ unsigned int tmp1, tmp2, tmp3; tmp1 = time-1059179400; /* 0x3F21CB88 */ tmp2 = tmp1*0.59604645; tmp3 = tmp2+3276999960U; /*eventlog(eventlog_level_trace,__FUNCTION__,"time: 0x%08x, tmp1: 0x%08x, tmp2 0x%08x, tmp3 0x%08x",time,tmp1,tmp2,tmp3);*/ return tmp3;}extern int handle_anongame_packet(t_connection * c, t_packet const * const packet){ switch (bn_byte_get(packet->u.client_anongame.option)) { case CLIENT_FINDANONGAME_PROFILE: return _client_anongame_profile(c, packet); case CLIENT_FINDANONGAME_CANCEL: return _client_anongame_cancel(c); case CLIENT_FINDANONGAME_SEARCH: case CLIENT_FINDANONGAME_AT_INVITER_SEARCH: case CLIENT_FINDANONGAME_AT_SEARCH: return handle_anongame_search(c, packet); /* located in anongame.c */ case CLIENT_FINDANONGAME_GET_ICON: return _client_anongame_get_icon(c, packet); case CLIENT_FINDANONGAME_SET_ICON: return _client_anongame_set_icon(c, packet); case CLIENT_FINDANONGAME_INFOS: return _client_anongame_infos(c, packet); case CLIENT_ANONGAME_TOURNAMENT: return _client_anongame_tournament(c, packet); case CLIENT_FINDANONGAME_PROFILE_CLAN: return _client_anongame_profile_clan(c, packet); default: eventlog(eventlog_level_error,__FUNCTION__,"got unhandled option %d",bn_byte_get(packet->u.client_findanongame.option)); return -1; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -