📄 handle_d2gs.c
字号:
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 + -