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

📄 handle_d2gs.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 2 页
字号:
	prev_maxgame=d2gs_get_maxgame(gs);	currgame = d2gs_get_gamenum(gs);	eventlog(eventlog_level_info, __FUNCTION__, "change game server %s max game from %d to %d (%d current)",addr_num_to_ip_str(d2cs_conn_get_addr(c)),prev_maxgame, maxgame, currgame);	d2gs_set_maxgame(gs,maxgame);        if ((rpacket=packet_create(packet_class_d2gs))) {	    packet_set_size(rpacket,sizeof(t_d2cs_d2gs_setgsinfo));	    packet_set_type(rpacket,D2CS_D2GS_SETGSINFO);	    bn_int_set(&rpacket->u.d2cs_d2gs_setgsinfo.h.seqno,0);	    bn_int_set(&rpacket->u.d2cs_d2gs_setgsinfo.maxgame,maxgame);	    bn_int_set(&rpacket->u.d2cs_d2gs_setgsinfo.gameflag,gameflag);	    conn_push_outqueue(c,rpacket);	    packet_del_ref(rpacket);        }	gqlist_check_creategame(maxgame - currgame);	return 0;}static int on_d2gs_echoreply(t_connection * c, t_packet * packet){	if (!c || !packet)	    return 0;	return 0;}static int on_d2gs_creategamereply(t_connection * c, t_packet * packet){	t_packet	* opacket, * rpacket;	t_sq		* sq;	t_connection	* client;	t_game		* game;	int		result;	int		reply;	int		seqno;	t_elem		* curr;	seqno=bn_int_get(packet->u.d2cs_d2gs.h.seqno);	if (!(sq=sqlist_find_sq(seqno))) {		eventlog(eventlog_level_error,__FUNCTION__,"seqno %d not found",seqno);		return 0;	}	if (!(client=d2cs_connlist_find_connection_by_sessionnum(sq_get_clientid(sq)))) {		eventlog(eventlog_level_error,__FUNCTION__,"client %d not found",sq_get_clientid(sq));		sq_destroy(sq,&curr);		return 0;	}	if (!(game=gamelist_find_game_by_id(sq_get_gameid(sq)))) {		eventlog(eventlog_level_error,__FUNCTION__,"game %d not found",sq_get_gameid(sq));		sq_destroy(sq,&curr);		return 0;	}	if (!(opacket=sq_get_packet(sq))) {		eventlog(eventlog_level_error,__FUNCTION__,"previous packet not found (seqno: %d)",seqno);		sq_destroy(sq,&curr);		return 0;	}	result=bn_int_get(packet->u.d2gs_d2cs_creategamereply.result);	if (result==D2GS_D2CS_CREATEGAME_SUCCEED) {		game_set_d2gs_gameid(game,bn_int_get(packet->u.d2gs_d2cs_creategamereply.gameid));		game_set_created(game,1);		eventlog(eventlog_level_info,__FUNCTION__,"game %s created on gs %d",d2cs_game_get_name(game),conn_get_d2gs_id(c));		reply=D2CS_CLIENT_CREATEGAMEREPLY_SUCCEED;	} else {		eventlog(eventlog_level_warn,__FUNCTION__,"failed to create game %s on gs %d",d2cs_game_get_name(game),conn_get_d2gs_id(c));		game_destroy(game,&curr);		reply=D2CS_CLIENT_CREATEGAMEREPLY_FAILED;	}	if ((rpacket=packet_create(packet_class_d2cs))) {		packet_set_size(rpacket,sizeof(t_d2cs_client_creategamereply));		packet_set_type(rpacket,D2CS_CLIENT_CREATEGAMEREPLY);		bn_short_set(&rpacket->u.d2cs_client_creategamereply.seqno,				bn_short_get(opacket->u.client_d2cs_creategamereq.seqno));		bn_short_set(&rpacket->u.d2cs_client_creategamereply.gameid,1);		bn_short_set(&rpacket->u.d2cs_client_creategamereply.u1,1);		bn_int_set(&rpacket->u.d2cs_client_creategamereply.reply,reply);		conn_push_outqueue(client,rpacket);		packet_del_ref(rpacket);	}	sq_destroy(sq,&curr);	return 0;}static int on_d2gs_joingamereply(t_connection * c, t_packet * packet){	t_sq		* sq;	t_d2gs		* gs;	t_connection	* client;	t_game		* game;	t_packet	* opacket, * rpacket;	int		result;	int		reply;	int		seqno;	unsigned int	gsaddr;	t_elem		* curr;	unsigned short	gsport;				seqno=bn_int_get(packet->u.d2cs_d2gs.h.seqno);	if (!(sq=sqlist_find_sq(seqno))) {		eventlog(eventlog_level_error,__FUNCTION__,"seqno %d not found",seqno);		return 0;	}	if (!(client=d2cs_connlist_find_connection_by_sessionnum(sq_get_clientid(sq)))) {		eventlog(eventlog_level_error,__FUNCTION__,"client %d not found",sq_get_clientid(sq));		sq_destroy(sq,&curr);		return 0;	}	if (!(game=gamelist_find_game_by_id(sq_get_gameid(sq)))) {		eventlog(eventlog_level_error,__FUNCTION__,"game %d not found",sq_get_gameid(sq));		sq_destroy(sq,&curr);		return 0;	}	if (!(gs=game_get_d2gs(game))) {		eventlog(eventlog_level_error,__FUNCTION__,"try join game without game server set");		sq_destroy(sq,&curr);		return 0;	}	if (!(opacket=sq_get_packet(sq))) {		eventlog(eventlog_level_error,__FUNCTION__,"previous packet not found (seqno: %d)",seqno);		sq_destroy(sq,&curr);		return 0;	}	result=bn_int_get(packet->u.d2gs_d2cs_joingamereply.result);	switch (result) {	case D2GS_D2CS_JOINGAME_SUCCEED:		eventlog(eventlog_level_info,__FUNCTION__,"added %s to game %s on gs %d",d2cs_conn_get_charname(client),			d2cs_game_get_name(game),conn_get_d2gs_id(c));		reply=D2CS_CLIENT_JOINGAMEREPLY_SUCCEED;		break;	case D2GS_D2CS_JOINGAME_GAME_FULL:		eventlog(eventlog_level_info,__FUNCTION__,"failed to add %s to game %s on gs %d (game full)",d2cs_conn_get_charname(client),			d2cs_game_get_name(game),conn_get_d2gs_id(c));		reply=D2CS_CLIENT_JOINGAMEREPLY_GAME_FULL;		break;	default:		eventlog(eventlog_level_info,__FUNCTION__,"failed to add %s to game %s on gs %d",d2cs_conn_get_charname(client),			d2cs_game_get_name(game),conn_get_d2gs_id(c));		reply=D2CS_CLIENT_JOINGAMEREPLY_FAILED;	}	if ((rpacket=packet_create(packet_class_d2cs))) {		packet_set_size(rpacket,sizeof(t_d2cs_client_joingamereply));		packet_set_type(rpacket,D2CS_CLIENT_JOINGAMEREPLY);		bn_short_set(&rpacket->u.d2cs_client_joingamereply.seqno,				bn_short_get(opacket->u.client_d2cs_joingamereq.seqno));		/* specific flag for anti-cheating support */		/*		bn_short_set(&rpacket->u.d2cs_client_joingamereply.gameid,(unsigned short)game_get_d2gs_gameid(game)|0x8000);		*/		bn_short_set(&rpacket->u.d2cs_client_joingamereply.gameid,(unsigned short)game_get_d2gs_gameid(game));		bn_short_set(&rpacket->u.d2cs_client_joingamereply.u1,0);		bn_int_set(&rpacket->u.d2cs_client_joingamereply.reply,reply);//		if (reply == SERVER_JOINGAMEREPLY2_REPLY_OK) {		if (reply == D2CS_CLIENT_JOINGAMEREPLY_SUCCEED) {			bn_int_set(&rpacket->u.d2cs_client_joingamereply.token,sq_get_gametoken(sq));			gsaddr = d2gs_get_ip(gs);			gsport = 4000;			trans_net(d2cs_conn_get_addr(client), &gsaddr, &gsport);						if(d2gs_get_ip(gs)!=gsaddr)			{			    eventlog(eventlog_level_info,__FUNCTION__,"translated gameserver %s -> %s",addr_num_to_ip_str(d2gs_get_ip(gs)),addr_num_to_ip_str(gsaddr));			} else {			    eventlog(eventlog_level_info,__FUNCTION__,"no translation required for gamserver %s",addr_num_to_ip_str(gsaddr));			}						bn_int_nset(&rpacket->u.d2cs_client_joingamereply.addr,gsaddr);		} else {			bn_int_set(&rpacket->u.d2cs_client_joingamereply.token,0);			bn_int_set(&rpacket->u.d2cs_client_joingamereply.addr,0);		}		conn_push_outqueue(client,rpacket);		packet_del_ref(rpacket);	}	sq_destroy(sq,&curr);	return 0;}static int on_d2gs_updategameinfo(t_connection * c, t_packet * packet){	unsigned int	flag;	char const	* charname;	t_game		* game;	unsigned int	charclass;	unsigned int	charlevel;	unsigned int	d2gs_gameid;	unsigned int	d2gs_id;	if (!(charname=packet_get_str_const(packet,sizeof(t_d2gs_d2cs_updategameinfo),MAX_CHARNAME_LEN))) {		eventlog(eventlog_level_error,__FUNCTION__,"got bad charname");		return 0;	}	d2gs_id=conn_get_d2gs_id(c);	d2gs_gameid=bn_int_get(packet->u.d2gs_d2cs_updategameinfo.gameid);	charclass=bn_int_get(packet->u.d2gs_d2cs_updategameinfo.charclass);	charlevel=bn_int_get(packet->u.d2gs_d2cs_updategameinfo.charlevel);	flag=bn_int_get(packet->u.d2gs_d2cs_updategameinfo.flag);	if (!(game=gamelist_find_game_by_d2gs_and_id(d2gs_id,d2gs_gameid))) {		eventlog(eventlog_level_error,__FUNCTION__,"game %d not found on gs %d",d2gs_gameid,d2gs_id);		return -1;	}	if (flag==D2GS_D2CS_UPDATEGAMEINFO_FLAG_ENTER) {		game_add_character(game,charname,charclass,charlevel);	} else if (flag==D2GS_D2CS_UPDATEGAMEINFO_FLAG_LEAVE) {		game_del_character(game,charname);	} else if (flag==D2GS_D2CS_UPDATEGAMEINFO_FLAG_UPDATE) {		game_add_character(game,charname,charclass,charlevel);	} else {		eventlog(eventlog_level_error,__FUNCTION__,"got bad updategameinfo flag %d",flag);	}	return 0;}static int on_d2gs_closegame(t_connection * c, t_packet * packet){	t_game	* game;	t_elem  * curr;	if (!(game=gamelist_find_game_by_d2gs_and_id(conn_get_d2gs_id(c),		bn_int_get(packet->u.d2gs_d2cs_closegame.gameid)))) {		return 0;	}	game_destroy(game, &curr);	return 0;}extern int handle_d2gs_packet(t_connection * c, t_packet * packet){	conn_process_packet(c,packet,d2gs_packet_handle_table,NELEMS(d2gs_packet_handle_table));	return 0;}extern int handle_d2gs_init(t_connection * c){	t_packet	* packet;	if ((packet=packet_create(packet_class_d2gs))) {		packet_set_size(packet,sizeof(t_d2cs_d2gs_authreq));		packet_set_type(packet,D2CS_D2GS_AUTHREQ);		bn_int_set(&packet->u.d2cs_d2gs_authreq.h.seqno,0);		bn_int_set(&packet->u.d2cs_d2gs_authreq.sessionnum,d2cs_conn_get_sessionnum(c));		bn_int_set(&packet->u.d2cs_d2gs_authreq.signlen, 0);		packet_append_string(packet,prefs_get_realmname());//		packet_append_data(packet, sign, signlen);		conn_push_outqueue(c,packet);		packet_del_ref(packet);	}	eventlog(eventlog_level_info,__FUNCTION__,"sent init packet to d2gs %d (sessionnum=%d)",conn_get_d2gs_id(c),d2cs_conn_get_sessionnum(c));	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -