#include "StdAfx.h" #include ".\Handler_AG_CONNECTION.h" #include "GameServerEx.h" #include #include #include #include #include #include "PlayerManager.h" #include "Player.h" #include "ItemManager.h" #include #include #include "GameGuildManager.h" // _NA_0_20091118_GAMEROOM_BATTLE_RESULT #include "GameBattleResult.h" #include "GameZone.h" //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #include "GameInstanceDungeon.h" Handler_AG_CONNECTION::Handler_AG_CONNECTION(void) { } Handler_AG_CONNECTION::~Handler_AG_CONNECTION(void) { } //-------------------------------------------------------------------------------------------------- // changes, f100819.1L const nsPacket::PacketHandlerInfo Handler_AG_CONNECTION::GetPacketHandlerNodes() { #define HANDLER_NODE_INFO(c, p, phase) { MAKEWORD(c, p), phase, Handler_AG_CONNECTION::On##p } #define HANDLER_NODE_INFO_EOR() { 0, static_cast(0), NULL } static const nsPacket::PacketHandlerNode handlers_static_[] = { // CONNECTION HANDLER_NODE_INFO(AG_CONNECTION, AG_CONNECTION_GROUND_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_CONNECTION, AG_CONNECTION_DBCONNECT_UPDATE_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_CONNECTION, AG_CONNECTION_DISCONNECT_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_CONNECTION, AG_WORLDSERVER_INFO_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_CONNECTION, AG_CONNECTION_SERVER_INFO_CMD, PHASE_SERVICE), HANDLER_NODE_INFO(AG_CONNECTION, AG_WORLDSERVER_ABUSING_USER_VERIFY_QUERY_CMD, PHASE_SERVICE), #ifdef __NA001334_090420_SERVER_SELECT_FACILITY__ HANDLER_NODE_INFO(AG_CONNECTION, AG_CONNECTION_SERVER_SELECT_CONTROL_SYN, PHASE_SERVICE), #endif //HANDLER_NODE_INFO(AG_CONNECTION, AG_CONNECTION_UNREGISTER_CMD, PHASE_SERVICE), HANDLER_NODE_INFO_EOR() // end of records }; // BOOST_STATIC_ASSERT(_countof(handlers_static_) >= 1); nsPacket::PacketHandlerInfo return_value = { handlers_static_, _countof(handlers_static_) - 1 }; // return return_value; }; //-------------------------------------------------------------------------------------------------- Handler_AG_CONNECTION_IMPL(AG_CONNECTION_GROUND_CMD) { __UNUSED((pServerSession, pMsg, wSize)); } Handler_AG_CONNECTION_IMPL(AG_CONNECTION_DBCONNECT_UPDATE_CMD) { __TOUCHED((pServerSession, pMsg, wSize)); //_NA000000_DBQUERY_REVERSAL_STATE_PREVENTION const MSG_AG_CONNECTION_DBCONNECT_UPDATE_CMD* recv_msg = \ static_cast(pMsg); g_pGameServer->ChangeDBConnectorIndex(recv_msg->db_connector_index_); ; MSG_DG_CONNECTION_DBCONNECT_UPDATE_CMD msg_cmd; msg_cmd.db_connector_index_ = recv_msg->db_connector_index_; g_pGameServer->SendToServer(GAME_DBPROXY, &msg_cmd, sizeof(msg_cmd)); } ////////////////////////////////////////////////////////////////////////////////////////////// // // 客户端和Agent之间断开连接时 // ////////////////////////////////////////////////////////////////////////////////////////////// Handler_AG_CONNECTION_IMPL( AG_CONNECTION_DISCONNECT_CMD ) { __TOUCHED((pServerSession, pMsg, wSize)); __UNUSED(wSize); MSG_AG_CONNECTION_DISCONNECT_CMD * pRecvMsg = (MSG_AG_CONNECTION_DISCONNECT_CMD *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey ); if (pPlayer == NULL) { // Agent和Game Server断开连接时,game server中没有玩家. SUNLOG( eCRITICAL_LOG, "[AG_CONNECTION_DISCONNECT_CMD] GameServer中没有这样的玩家(%d)", pRecvMsg->m_dwKey ); return; } // _NA_0_20091118_GAMEROOM_BATTLE_RESULT GameZone * pEnterZone = NULL; MAPCODE EnterFieldCode = 0; eZONE_STATE eRoomState = pPlayer->GetGameZone( pEnterZone, EnterFieldCode ); if( eRoomState & ePRS_AT_ZONE ) { GameBattleResult* battle_result = pEnterZone->GetGameBattleResult(); bool abnormal_exit = pRecvMsg->m_AbNormalExit; if (battle_result /*&& pRecvMsg->m_AbNormalExit*/) // 不管正常还是非正常Leave시킨다. arycoat 2012.02.01 battle_result->Leave(pPlayer, abnormal_exit); } g_GameGuildManager.DestroyMember( pPlayer->GetCharInfo()->m_GuildGuid, pPlayer->GetCharGuid() ); MSG_GZ_GUILD_LOGOUT_CHAR_SYN synMsg; synMsg.m_GuildGuid = pPlayer->GetCharInfo()->m_GuildGuid; synMsg.m_CharGuid = pPlayer->GetCharGuid(); pPlayer->SendToGuildServer( &synMsg, sizeof(synMsg) ); SUNLOG( eFULL_LOG, "[AG_CONNECTION_DISCONNECT_CMD] UserKey(%d) 解除连接", pPlayer->GetUserKey() ); PlayerManager::Instance()->Disconnect( pPlayer ); } // 告知世界服务器与Agent之间的连接状态. Handler_AG_CONNECTION_IMPL( AG_WORLDSERVER_INFO_CMD ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_AG_WORLDSERVER_INFO_CMD* pRecvMsg = (MSG_AG_WORLDSERVER_INFO_CMD*)pMsg; g_pGameServer->SetConnectToWorldServer( pRecvMsg->m_bIsConnectedWorld ); } Handler_AG_CONNECTION_IMPL(AG_CONNECTION_SERVER_INFO_CMD) { __TOUCHED((pServerSession, pMsg, wSize)); // (CHANGES) (f100424.3L) 添加要同步或调试的通道id const MSG_AG_CONNECTION_SERVER_INFO_CMD* recv_msg = \ static_cast(pMsg); assert(sizeof(*recv_msg) == wSize); g_pGameServer->SetPVPMode(recv_msg->pvp_enabled_ != false); if (g_pGameServer->IsServerInfoFromFile()) { SERVER_KEY change_key = g_pGameServer->GetKey(); change_key.m_ChannelID = recv_msg->channel_id_; g_pGameServer->SetKey(change_key); g_pGameServer->UpdateAppTitle(); } else { const SERVER_KEY server_key = g_pGameServer->GetKey(); if (!FlowControl::FCAssert(server_key.m_ChannelID == recv_msg->channel_id_ && \ "必须修改服务器键值 " \ "在WOPS_RTTDB的T_ServerInfoList表中")) { __debugbreak(); } } } Handler_AG_CONNECTION_IMPL( AG_WORLDSERVER_ABUSING_USER_VERIFY_QUERY_CMD ) { __TOUCHED((pServerSession, pMsg, wSize)); MSG_AG_WORLDSERVER_ABUSING_USER_VERIFY_QUERY_CMD * pRecvMsg = (MSG_AG_WORLDSERVER_ABUSING_USER_VERIFY_QUERY_CMD *)pMsg; Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey(pRecvMsg->m_dwKey); if(pPlayer) { SECURELOG( SECURELOG_PLAYERINFO((Player*)pPlayer, eABUSE_LOGIC_VIOLATION, pRecvMsg->m_eAbuseSubType), _T("[FromWorldServer] WorldServer用户数据错误!!")); return; } SUNLOG(eCRITICAL_LOG, "AG_WORLDSERVER_ABUSING_USER_VERIFY_QUERY_CMD(%u)(%u)", pRecvMsg->m_dwKey, pRecvMsg->m_CharGuid); } #ifdef __NA001334_090420_SERVER_SELECT_FACILITY__ Handler_AG_CONNECTION_IMPL(AG_CONNECTION_SERVER_SELECT_CONTROL_SYN) { __TOUCHED((pServerSession, pMsg, wSize)); const MSG_AG_CONNECTION_SERVER_SELECT_CONTROL_SYN* pRecvMsg = static_cast(pMsg); MSG_AG_CONNECTION_SERVER_SELECT_CONTROL_ACK msgACK; BOOLEAN bValidState = TRUE, bSendResult = TRUE; Player* pPlayer = PlayerManager::Instance()->FindPlayerByUserKey(pRecvMsg->m_dwKey); if(pPlayer == 0) { msgACK.m_dwKey = pRecvMsg->m_dwKey; msgACK.m_Result = RC::RC_ROOM_FAILED; pServerSession->SendPacket(&msgACK, sizeof(msgACK)); return; } ePLAYER_BEHAVE_STATE behave = pPlayer->GetBehave(); if(pRecvMsg->m_Control == pRecvMsg->eControl_StartTransaction) { #ifdef _NA_000000_20130508_DONOT_SERVER_SELECT_WHILE_BATTLE_GROUND_RESERVATION if(bValidState && behave != PLAYER_BEHAVE_IDLE_STATE && behave != PLAYER_BEHAVE_RESERVATION_BATTLE_GROUND_ZONE) #else if(bValidState && behave != PLAYER_BEHAVE_IDLE_STATE) #endif // _NA_000000_20130508_DONOT_SERVER_SELECT_WHILE_BATTLE_GROUND_RESERVATION bValidState = FALSE, msgACK.m_Result = RC::RC_ROOM_INVALID_PLAYER_STATE; if(bValidState) { GameZone* pCurrentZone = 0; MAPCODE currentFieldCode = 0; eZONE_STATE eZone_State = pPlayer->GetGameZone(pCurrentZone, currentFieldCode); if((eZone_State & ePRS_AT_ZONE) == 0) bValidState = FALSE, msgACK.m_Result = RC::RC_ROOM_ALREADY_DOING_TRANSACTION; } } else { bSendResult = FALSE; if(bValidState && behave == PLAYER_BEHAVE_SERVER_SELECTING_STATE) pPlayer->SetBehave(PLAYER_BEHAVE_IDLE_STATE); } if(bValidState && pRecvMsg->m_Control == pRecvMsg->eControl_StartTransaction) { pPlayer->SetBehave(PLAYER_BEHAVE_SERVER_SELECTING_STATE); msgACK.m_Result = RC::RC_ROOM_SUCCESS; } if(bSendResult) pPlayer->SendPacket(&msgACK, sizeof(msgACK)); } #endif