#include "stdafx.h" #include "AuthDispatch.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace DBAgent { CSingleDispatch& CAuthDispatch::GetDispatchTable() { static CSingleDispatch authDispatch; return authDispatch; } CAuthDispatch::CAuthDispatch(CSession& Session) : CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE), m_dwServerID(0), m_nUserNum(1) { } CAuthDispatch::~CAuthDispatch() { } void CAuthDispatch::Connected() { DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/AuthServer Connected", &GetSession(), this, GetRemoteAddr().get_addr_string()); } void CAuthDispatch::Disconnected() { DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/AuthServer Disconnected", &GetSession(), this, GetRemoteAddr().get_addr_string()); if(0 != m_dwServerID) { GetDispatchTable().RemoveDispatch(this); if(0LL != m_AuthItemSerialMgr.GetItemSerial()) { // ¾ÆÀÌÅÛ ½Ã¸®¾ó DB¿¡ ÀúÀå m_AuthItemSerialMgr.SaveItemSerial( CDBSingleObject::GetInstance(), m_dwServerID); } GET_SINGLE_DISPATCH(lpLoginDispatch, CLoginDispatch, CLoginDispatch::GetDispatchTable()); if(0 != lpLoginDispatch) { // ·Î±×Àμ­¹ö·Î ¼­¹ö ¹öÀü ¾÷µ¥ÀÌÆ® SendPacket::UpdateServerVersion(lpLoginDispatch->GetSendStream()); } // ÇöÀç ¼­¹ö¿¡ ·Î±×ÀÎµÈ »ç¶÷À» ÀüºÎ ³»·Á¹ö¸°´Ù. DataStorage::CSessionDataMgr::GetInstance().SessionCloseCurrentServer(m_dwServerID); } } bool CAuthDispatch::DispatchPacket(PktBase* lpPktBase) { // Auth ¿¡¼­ º¸³½ ÆÐŶÀ» ó¸®ÇÏ´Â ºÎºÐÀÌ´Ù. bool bResult = false; PktBase::CMDType cCmd = lpPktBase->GetCmd(); switch(cCmd) { case CmdSysServerLogin: bResult = ParseServerLogin(static_cast(lpPktBase)); break; case CmdSysServerLogout: bResult = ParseServerLogout(lpPktBase); break; case CmdUserKill: bResult = ParseUserKill(static_cast(lpPktBase)); break; case CmdDBGetData: { PktDD* pkDD = static_cast(lpPktBase); // DETLOG4(g_Log, "SS:0x%08x/DP:0x%08x/Len:0x%08x/CMD:0x%04x : CmdDBGetData", &GetSession(), this, pkDD->GetLen(), pkDD->m_wCmd); bResult = ParseCharManage::Parse(GetSendStream(), m_dwServerID, m_AuthItemSerialMgr, pkDD); } break; case CmdAgentZone: bResult = ParseMoveZone::Parse(GetSendStream(), static_cast(lpPktBase)); break; case CmdAgentParty: bResult = ParseParty::Parse(GetSendStream(), lpPktBase); break; case CmdGuildCmd: bResult = ParseGuild::GuildCmd(GetSendStream(), lpPktBase); break; case CmdUnifiedCharSelect: bResult = ParseCharManage::UnifiedCharSelect(GetSendStream(), lpPktBase); break; default: ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ ÀÎÁõ¼­¹ö ÆÐŶ ó¸® ½ÇÆÐ : ¾ø´Â Ä¿¸ÇµåÀÔ´Ï´Ù", &GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd); bResult = true; break; } if(!bResult) { ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ ÀÎÁõ¼­¹ö ÆÐŶ ó¸® ½ÇÆÐ : 󸮸¦ ½ÇÆÐÇß½À´Ï´Ù", &GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd); } return true; } bool CAuthDispatch::ParseServerLogin(PktSL* lpPktSL) { m_dwServerID = lpPktSL->m_dwServerID; INFLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ ÀÎÁõ¼­¹ö ¿¬°á ½Ãµµ : ÆÐŶ ¹ÞÀ½", &GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID); GET_SINGLE_DISPATCH(lpAuthDispatch, CAuthDispatch, GetDispatchTable()); if(0 != lpAuthDispatch) { ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ ÀÎÁõ¼­¹ö ¿¬°á ½ÇÆÐ : ÀÌ¹Ì ¿¬°áÀÌ ÀÖ½À´Ï´Ù", &GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID); CloseSession(); } else { // Dispatch ¼¼ÆÃ. GetDispatchTable().SetDispatch(this); // ¾ÆÀÌÅÛ ½Ã¸®¾ó ·Îµå. if(!m_AuthItemSerialMgr.LoadItemSerial(CDBSingleObject::GetInstance(), m_dwServerID)) { ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ÀÎÁõ¼­¹ö ¿¬°á ½ÇÆÐ : ¾ÆÀÌÅÛ ½Ã¸®¾ó ·Îµå ½ÇÆÐ. Á¢¼ÓÀ» ²÷½À´Ï´Ù.", &GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID); CloseSession(); return false; } GET_SINGLE_DISPATCH(lpLoginDispatch, CLoginDispatch, CLoginDispatch::GetDispatchTable()); if(0 != lpLoginDispatch) { // ·Î±×Àμ­¹ö·Î ¼­¹ö ¹öÀü ¾÷µ¥ÀÌÆ® SendPacket::UpdateServerVersion(lpLoginDispatch->GetSendStream()); } return SendPacket::ServerLoginAck(m_SendStream, m_dwServerID, m_AuthItemSerialMgr.GetItemSerial()); } return true; } bool CAuthDispatch::ParseServerLogout(PktBase* lpPktBase) { // ¹ÞÀº ÆÐŶ ±×´ë·Î µ¹·Á ÁØ´Ù. char* lpBuffer = m_SendStream.GetBuffer(sizeof(PktBase)); if(0 != lpBuffer) { return m_SendStream.WrapHeader(sizeof(PktBase), CmdSysServerLogout, 0, 0); } return false; } bool CAuthDispatch::ParseUserKill(PktUK* lpPktUK) { // À¯Àú Á×À̱⸦ ½ÇÆÐÇØ¼­, Ack·Î ¿À´Â °æ¿ìÀÌ´Ù. if(2 == lpPktUK->GetError()) { DataStorage::CSessionData* lpSessionData = DataStorage::CSessionDataMgr::GetInstance().GetOpenSession(lpPktUK->m_dwUserID); if(0 != lpSessionData && DataStorage::CSessionData::SE_USER_ENABLED == lpSessionData->GetSessionState()) { if(lpSessionData->GetServerID() == lpPktUK->m_dwServerID) { DataStorage::CSessionDataMgr::GetInstance().SessionCloseWithLogout( lpPktUK->m_dwUserID, lpPktUK->m_dwServerID); ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / °ÔÀÓ¼­¹ö ¼¼¼Ç °­Á¦ Á¾·á : ij¸¯ÅÍ Á×ÀÌ±â ½ÇÆÐ", lpPktUK->m_dwUserID, lpPktUK->m_dwServerID); } else { ERRLOG3(g_Log, "UID:%10u / FromServerID:0x%08X / TargetServerID:0x%08X / " "°ÔÀÓ¼­¹ö ¼¼¼Ç °­Á¦ Á¾·á ½ÇÆÐ : ½ÇÆÐ ¼­¹ö¿Í Á×À̱⠿äû ¼­¹ö°¡ ´Ù¸§", lpPktUK->m_dwUserID, lpPktUK->m_dwServerID, lpSessionData->GetServerID()); } } } return true; } }