Files
2022-10-26 12:25:11 +08:00

242 lines
16 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "StdAfx.h"
#include ".\Handler_AG_CONNECTION.h"
#include "GameServerEx.h"
#include <PacketStruct_AG.h>
#include <PacketStruct_DG.h>
#include <Protocol_AG.h>
#include <Protocol_DG.h>
#include <ServerSession.h>
#include "PlayerManager.h"
#include "Player.h"
#include "ItemManager.h"
#include <PacketStruct_GZ.h>
#include <Protocol_AZ.h>
#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<ePHASE_SHIFT>(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<MSG_AG_CONNECTION_DBCONNECT_UPDATE_CMD*>(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<MSG_AG_CONNECTION_SERVER_INFO_CMD*>(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<MSG_AG_CONNECTION_SERVER_SELECT_CONTROL_SYN*>(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