⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 handle_anongame.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 3 页
字号:
	    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 + -