DragonNest/Server/DNMasterServer/DNGameConnection.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

2824 lines
No EOL
100 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 "DNGameConnection.h"
#include "DNUser.h"
//#include "DNParty.h"
#include "DNVillageConnection.h"
#include "DNLoginConnection.h"
#include "DNExtManager.h"
#include "DNDivisionManager.h"
#include "Log.h"
#include "DNPvP.h"
#include "./boost/format.hpp"
#include "./EtStringManager/EtUIXML.h"
#include "DNGuildWarManager.h"
#if defined(_KR)
#include "DNNexonAuth.h"
#elif defined (_JP) && defined (WIN64)
#include "DNNHNNetCafe.h"
#elif defined(_TH)
#include "DNAsiaSoftPCCafe.h"
#elif defined(_ID)
#include "DNKreonPCCafe.h"
#endif // _KR
#if defined(PRE_ADD_CHNC2C)
#include "DNC2C.h"
#endif
extern TMasterConfig g_Config;
CDNGameConnection::CDNGameConnection(void): CConnection(), m_wGameID(0)
{
#if defined(_FINAL_BUILD)
Init(1024 * 1024, 1024 * 1024);
#else // #if defined(_FINAL_BUILD)
Init(1024 * 100, 1024 * 100);
#endif // #if defined(_FINAL_BUILD)
m_nRoomCnt = m_nUserCnt = 0;
m_bZeroPopulation = false;
m_cAffinityType = _GAMESERVER_AFFINITYTYPE_HYBRYD;
m_nManagedID = 0;
m_bConnectComplete = false;
m_uiLastReqEnterGameTick = 0;
m_uiLastEnterGameTick = 0;
#if defined( PRE_FIX_WORLDCOMBINEPARTY )
m_bWorldCombineGameServer = false;
#endif
}
CDNGameConnection::~CDNGameConnection(void)
{
std::vector <TGameInfo*>::iterator ii;
for (ii = m_GameServerInfoList.begin(); ii != m_GameServerInfoList.end(); ii++)
SAFE_DELETE((*ii));
}
int CDNGameConnection::MessageProcess(int iMainCmd, int iSubCmd, char * pData, int iLen)
{
switch (iMainCmd)
{
case GAMA_REGIST:
{
GARegist *pRegist = (GARegist*)pData;
m_nManagedID = pRegist->nManagedID;
m_cAffinityType = pRegist->cAffinityType;
for (int i = 0; i < pRegist->cInfoCount; i++)
{
TGameInfo * pInfo = new TGameInfo;
memset(pInfo, 0, sizeof(TGameInfo));
pInfo->nServerID = pRegist->ServerInfo[i].cServerIdx;
pInfo->nServerAttribute = pRegist->ServerInfo[i].nServerAttribute;
pInfo->nIP = pRegist->ServerInfo[i].nIP;
pInfo->nPort = pRegist->ServerInfo[i].nPort;
pInfo->nTcpPort = pRegist->nTcpOpenPort;
pInfo->bHasMargin = pRegist->ServerInfo[i].cMargin == 1 ? true : false;
pInfo->bComplete = false;
pInfo->uiLastDelayReportTick = timeGetTime();
m_GameServerInfoList.push_back(pInfo);
}
SendReqUserList(ERROR_NONE);
g_Log.Log(LogType::_NORMAL, L"GameConnection Regist ServerInfo ID:[%d]\n", m_wGameID);
return ERROR_NONE;
}
break;
case GAMA_ENDOFREGIST:
{
GAMAEndofRegist * pPacket = (GAMAEndofRegist*)pData;
std::vector <TGameInfo*>::iterator ii;
for (ii = m_GameServerInfoList.begin(); ii != m_GameServerInfoList.end(); ii++)
{
if ((*ii)->nServerID == pPacket->nServerID)
{
(*ii)->bComplete = true;
break;
}
}
bool bAllComplete = true;
for (ii = m_GameServerInfoList.begin(); ii != m_GameServerInfoList.end(); ii++)
{
if ((*ii)->bComplete == false)
{
bAllComplete = false;
break;
}
}
if (bAllComplete)
{
SendGameRegistComplete();
g_Log.Log(LogType::_NORMAL, L"[GAMA_ENDOFREGIST] GameID[%d]\r\n", m_wGameID);
}
return ERROR_NONE;
}
break;
case GAMA_CONNECTCOMPLETE:
{
m_bConnectComplete = true;
#if defined(PRE_FIX_LIVE_CONNECT)
g_pDivisionManager->AddGameServerConnection(this);
#endif //#if defined(PRE_FIX_LIVE_CONNECT)
g_pDivisionManager->GameServerRegist(this);
#ifdef PRE_MOD_OPERATINGFARM
g_pDivisionManager->CheckFarmSync(timeGetTime());
#else //#ifdef PRE_MOD_OPERATINGFARM
g_pDivisionManager->CheckFarmSync();
#endif //#ifdef PRE_MOD_OPERATINGFARM
g_pDivisionManager->SendGuildWarInfoToGame( this );
g_Log.Log(LogType::_NORMAL, L"[GAMA_CONNECTCOMPLETE] GameID[%d]\r\n", m_wGameID);
}
break;
case GAMA_DELAYREPORT:
{
GAMADelayReport * pPacket = (GAMADelayReport*)pData;
m_nRoomCnt = pPacket->nWholeRoomCnt; //<2F><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int nCnt = 0;
std::vector <TGameInfo*>::iterator ii;
for (ii = m_GameServerInfoList.begin(); ii != m_GameServerInfoList.end(); ii++)
{
if ((*ii)->nServerID == pPacket->nServerIdx)
{
(*ii)->nRoomCnt = pPacket->nRoomCnt;
(*ii)->nUserCnt = pPacket->nUserCnt;
(*ii)->nFrame = pPacket->nAvrFrame;
(*ii)->bHasMargin = pPacket->cHasMargin == 1 ? true : false;
(*ii)->uiLastDelayReportTick = timeGetTime();
#ifdef _WORK
if( pPacket->nAvrFrame < 17 )
g_Log.Log(LogType::_FILELOG, L"ID[%d]Index[%d]WRC[%d]RCnt[%d]UCnt[%d]MinF[%d]MaxF[%d]AvrF[%d]\n", m_wGameID, (*ii)->nServerID, pPacket->nWholeRoomCnt, pPacket->nRoomCnt, pPacket->nUserCnt, pPacket->nMinFrame, pPacket->nMaxFrame, pPacket->nAvrFrame);
#else
if (pPacket->nAvrFrame < 17 && pPacket->nAvrFrame != 0)
g_Log.Log(LogType::_ERROR, L"ID[%d]Index[%d]WRC[%d]RCnt[%d]UCnt[%d]MinF[%d]MaxF[%d]AvrF[%d]\n", m_wGameID, (*ii)->nServerID, pPacket->nWholeRoomCnt, pPacket->nRoomCnt, pPacket->nUserCnt, pPacket->nMinFrame, pPacket->nMaxFrame, pPacket->nAvrFrame);
#endif
}
nCnt += (*ii)->nUserCnt;
}
m_nUserCnt = nCnt;
return ERROR_NONE;
}
break;
case GAMA_CHECKUSER:
{
/*GAMACheckUser *pCheckUser = (GAMACheckUser*)pData;
if (g_pDivisionManager->GameCheckUser(this, pCheckUser->nSessionID) == false)
_DANGER_POINT(); */
return ERROR_NONE;
}
break;
case GAMA_ENTERGAME:
{
GAMAEnterGame * pPacket = (GAMAEnterGame*)pData;
g_pDivisionManager->EnterGame(pPacket->nAccountDBID, m_wGameID, pPacket->nRoomID, pPacket->nServerIdx);
m_uiLastEnterGameTick = timeGetTime();
return ERROR_NONE;
}
break;
case GAMA_RECONNECTLOGIN:
{
GAMAReconnectLogin * pPacket = (GAMAReconnectLogin*)pData;
g_pDivisionManager->ReconnectLogin(pPacket->nAccountDBID);
CDNUser * pUser = g_pDivisionManager->GetUserByAccountDBID(pPacket->nAccountDBID);
if(pUser)
{
g_pDivisionManager->UpdateUserState(pUser->GetCharacterName(), pUser->GetCharacterDBID(), _LOCATION_NONE, _COMMUNITY_NONE);
}
return ERROR_NONE;
}
case GAMA_UPDATEWORLDUSERSTATE:
{
#if defined( STRESS_TEST )
break;
#endif
GAMAUpdateWorldUserState * pPacket = (GAMAUpdateWorldUserState*)pData;
CDNUser * pUser = g_pDivisionManager->GetUserByName(pPacket->szName);
if (pUser)
{
g_pDivisionManager->UpdateUserState(pUser->GetCharacterName(), pUser->GetCharacterDBID(), _LOCATION_GAME, _COMMUNITY_NONE, -1, pPacket->nMapIdx, this);
}
else
_DANGER_POINT();
}
break;
case GAMA_ADDUSERLIST:
{
GAMAAddUserList *pAdd = (GAMAAddUserList*)pData;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> User<65>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ְ<EFBFBD>
#if defined(PRE_MOD_SELECT_CHAR)
g_pDivisionManager->AddUser(pAdd, m_wGameID, true);
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID( pAdd->nAccountDBID );
#if defined(_FINAL_BUILD)
if( pUser ){
pUser->m_nRoomID = pAdd->nRoomID;
}
#endif //#if defined(_FINAL_BUILD)
#else // #if defined(PRE_MOD_SELECT_CHAR)
BYTE szMID[MACHINEIDMAX] = {0,};
DWORD dwGRC = 0;
#if defined (_KR)
memcpy(szMID, pAdd->szMID, sizeof(szMID));
dwGRC = pAdd->dwGRC;
#endif
g_pDivisionManager->AddUser(0, pAdd->wChannelID, m_wGameID, pAdd->nThreadIdx, pAdd->nAccountDBID, pAdd->nSessionID, pAdd->biCharacterDBID, pAdd->wszCharacterName, pAdd->wszAccountName,
#if defined(PRE_ADD_DWC)
pAdd->cAccountLevel,
#endif
#ifdef PRE_ADD_MULTILANGUAGE
pAdd->bAdult, pAdd->szIP, pAdd->szVirtualIp, pAdd->PartyID, szMID, dwGRC, pAdd->cPCBangGrade, pAdd->cSelectedLanguage, true);
#else //#ifdef PRE_ADD_MULTILANGUAGE
pAdd->bAdult, pAdd->szIP, pAdd->szVirtualIp, pAdd->PartyID, szMID, dwGRC, pAdd->cPCBangGrade, 0, true);
#endif //#ifdef PRE_ADD_MULTILANGUAGE
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID( pAdd->nAccountDBID );
if( pUser ){
pUser->m_nRoomID = pAdd->nRoomID;
}
#endif // #if defined(PRE_MOD_SELECT_CHAR)
#if defined(_KR) && defined(_FINAL_BUILD) // nexon pc bang
if (pUser)
g_pNexonAuth->SendLogin(pUser);
#elif defined (_JP) && defined(_FINAL_BUILD) && defined (WIN64)
char szTempAccountName[IDLENMAX * 2];
WideCharToMultiByte(CP_ACP, 0, pAdd->wszAccountName, -1, szTempAccountName, IDLENMAX * 2, NULL, NULL);
bool bTempNetCafe = false;
char szNHNNetCafeCode[NHNNETCAFECODEMAX];
char szNHNProductCode[NHNNETCAFECODEMAX];
if (g_pNHNNetCafe->NetCafe_UserLogin(szTempAccountName, pAdd->szIP, bTempNetCafe))
{
if (bTempNetCafe)
{
if (g_pNHNNetCafe->NetCafe_GetNetCafeCode(szTempAccountName, szNHNNetCafeCode, sizeof(szNHNNetCafeCode)) == false)
memset(szNHNNetCafeCode, 0, sizeof(szNHNNetCafeCode));
if (g_pNHNNetCafe->NetCafe_GetProductCode(szTempAccountName, szNHNProductCode, sizeof(szNHNProductCode)) == false)
memset(szNHNProductCode, 0, sizeof(szNHNProductCode));
if (g_pDivisionManager->SetNHNNetCafeInfo(pAdd->nAccountDBID, bTempNetCafe, szNHNNetCafeCode, szNHNProductCode) == false)
_DANGER_POINT();
}
}
#elif defined(_TH) && defined(_FINAL_BUILD)
if (pUser)
g_pAsiaSoftPCCafe->SendCheckIPBonus(pUser->GetAccountNameA(), pUser->GetIp(), 1, pUser->GetAccountDBID() );
#elif defined(_ID) && defined(_FINAL_BUILD)
if (pUser)
{
_strcpy(pUser->m_szMacAddress, _countof(pUser->m_szMacAddress), pAdd->szMacAddress, (int)strlen(pAdd->szMacAddress));
_strcpy(pUser->m_szKey, _countof(pUser->m_szKey), pAdd->szKey, (int)strlen(pAdd->szKey));
pUser->m_dwKreonCN = pAdd->dwKreonCN;
g_pKreonPCCafe->AddProcessCall(pUser->GetAccountDBID());
}
#endif // _KR
return ERROR_NONE;
}
break;
case GAMA_DELUSER:
{
GAMADelUser *pDelUser = (GAMADelUser*)pData;
g_pDivisionManager->DelUser(pDelUser->nAccountDBID);
return ERROR_NONE;
}
break;
case GAMA_SETROOMID:
{
GAMASetRoomID *pRoomID = (GAMASetRoomID*)pData;
if (g_pDivisionManager->SetGameRoom(this, pRoomID) == false)
{
#if defined( PRE_WORLDCOMBINE_PARTY )
if( Party::bIsWorldCombineParty(pRoomID->Type) )
{
return ERROR_NONE;
}
#endif
#if defined( STRESS_TEST )
#else
_DANGER_POINT();
g_Log.Log( LogType::_GAMECONNECTLOG, L"SetGameRoom() Failed!!!\n" );
#endif // #if defined( STRESS_TEST )
}
return ERROR_NONE;
}
break;
case GAMA_SETTUTORIALROOMID:
{
GAMASetTutorialRoomID *pRoomID = (GAMASetTutorialRoomID*)pData;
if (g_pDivisionManager->SetTutorialGameRoom(m_wGameID, pRoomID->nAccountDBID, pRoomID->cGameID, pRoomID->cServerIdx, pRoomID->nRoomID, pRoomID->nLoginServerID) == false) {
_DANGER_POINT();
}
return ERROR_NONE;
}
break;
case GAMA_REQNEXTVILLAGEINFO:
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ұ~
GAMARequestNextVillageInfo * pPacket = (GAMARequestNextVillageInfo*)pData;
g_pDivisionManager->MoveGameToVillage(this, pPacket);
return ERROR_NONE;
}
case GAMA_REBIRTHVILLAGEINFO:
{
GAMARebirthVillageInfo *pInfo = (GAMARebirthVillageInfo*)pData;
CDNUser *pUser = g_pDivisionManager->GetUserByAccountDBID(pInfo->nAccountDBID);
if (!pUser){
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
return _ProcessRebirthVillage( pUser, pInfo->nLastVillageMapIdx );
}
break;
case GAMA_MOVEPVPGAMETOPVPLOBBY:
{
GAMAMovePvPGameToPvPLobby* pPacket = reinterpret_cast<GAMAMovePvPGameToPvPLobby*>(pData);
if( g_pDivisionManager )
{
// <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
CDNUser *pUser = g_pDivisionManager->GetUserByAccountDBID( pPacket->uiAccountDBID );
if( !pUser )
{
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
char szIp[IPLENMAX] = { 0, };
USHORT nPort = 0;
int nChannel = 0;
BYTE cVillageID = 0;
#if defined( PRE_WORLDCOMBINE_PVP )
if( pPacket->bIsLadderRoom == true || pPacket->uiPvPIndex > WorldPvPMissionRoom::Common::WorldPvPRoomStartIndex )
#else
if( pPacket->bIsLadderRoom == true )
#endif
{
// PvP <20>κ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() );
if( pVillageCon == NULL || pVillageCon->GetActive() == false )
{
return _ProcessRebirthVillage( pUser, pPacket->iLastVillageMapIndex );
}
#if defined( PRE_WORLDCOMBINE_PVP )
if( pUser->GetPvPVillageID() == 0 && pUser->GetPvPVillageChannelID() == 0 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ<EFBFBD> <20><><EFBFBD><EFBFBD>
if( pPacket->uiPvPIndex > WorldPvPMissionRoom::Common::WorldPvPRoomStartIndex )
return _ProcessRebirthVillage( pUser, pPacket->iLastVillageMapIndex );
}
#endif
nChannel = g_pDivisionManager->GetPvPLobbyChannelID();
cVillageID = g_pDivisionManager->GetPvPLobbyVillageID();
nPort = pVillageCon->GetVillageChannelInfo()->nPort;
_strcpy( szIp, IPLENMAX, pVillageCon->GetVillageChannelInfo()->szIP, (int)strlen(pVillageCon->GetVillageChannelInfo()->szIP) );
if( g_pDivisionManager->GameToVillage( this, pUser->GetAccountDBID(), cVillageID, nChannel ) )
{
SendMovePvPGameToPvPLobby( pPacket->uiAccountDBID, szIp, nPort, ERROR_NONE);
#if defined( PRE_WORLDCOMBINE_PVP )
if( pPacket->uiPvPIndex > WorldPvPMissionRoom::Common::WorldPvPRoomStartIndex )
{
pUser->SetPvPIndex(0);
}
#endif
return ERROR_NONE;
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ĵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( pUser->GetPvPIndex() == 0 )
{
return _ProcessRebirthVillage( pUser, pPacket->iLastVillageMapIndex );
}
// PvPIndex <20><><EFBFBD><EFBFBD>
if( pUser->GetPvPIndex() != pPacket->uiPvPIndex )
{
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
CDNPvP* pPvPRoom = g_pDivisionManager->GetPvPRoomByIdx( pPacket->uiPvPIndex );
if( !pPvPRoom )
{
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
#if defined( PRE_PVP_GAMBLEROOM )
if( pPvPRoom->GetGambleRoomType() > 0 )
pUser->SetPvPIndex(0);
#endif
if( g_pDivisionManager->GetVillageInfo( pPvPRoom->GetVillageMapIndex(), pPvPRoom->GetVillageChannelID(), nChannel, cVillageID, szIp, nPort ) )
{
if( g_pDivisionManager->GameToVillage( this, pUser->GetAccountDBID(), cVillageID, nChannel ) )
{
// PvPCommon::UserSate::Playing|PvPCommon::UserState::Ready <20><><EFBFBD><EFBFBD>
UINT uiUserState = pUser->GetPvPUserState()&~(PvPCommon::UserState::Playing|PvPCommon::UserState::Ready);
pPvPRoom->SetPvPUserState( pUser, uiUserState );
SendMovePvPGameToPvPLobby( pPacket->uiAccountDBID, szIp, nPort, ERROR_NONE);
return ERROR_NONE;
}
}
}
SendMovePvPGameToPvPLobby( pPacket->uiAccountDBID, szIp, nPort, ERROR_GENERIC_VILLAGECON_NOT_FOUND);
return ERROR_GENERIC_UNKNOWNERROR;
}
else
_DANGER_POINT();
break;
}
case GAMA_LOGINSTATE:
{
GAMALoginState *pState = (GAMALoginState*)pData;
if (!g_pDivisionManager->GetLoginConnection() || g_pDivisionManager->GetLoginConnection()->GetDelete()) {
SendLoginState(pState->nAccountDBID, ERROR_LOGIN_FAIL);
}
else {
SendLoginState(pState->nAccountDBID, ERROR_NONE);
}
}
break;
case GAMA_VILLAGESTATE:
{
GAMAVillageState *pState = (GAMAVillageState*)pData;
CDNUser *pUser = g_pDivisionManager->GetUserByAccountDBID(pState->nAccountDBID);
if (!pUser){
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
char szIP[IPLENMAX] = { 0, };
USHORT nPort = 0;
int nNextChannelIdx = 0;
BYTE cNextVillageID = 0;
if (g_pDivisionManager->GetVillageInfo(pState->nMapIndex, pUser->GetChannelID(), nNextChannelIdx, cNextVillageID, szIP, nPort))
{
SendVillageState(pState->nAccountDBID, pState->nRoomID, pState->nMapIndex, ERROR_NONE );
}
else {
SendVillageState(pState->nAccountDBID, pState->nRoomID, pState->nMapIndex, ERROR_GENERIC_VILLAGECON_NOT_FOUND);
}
}
break;
//case GAMA_DELPARTYMEMBER:
// {
// GAMADelPartyMember *pDelMember = (GAMADelPartyMember*)pData;
// //if (g_pDivisionManager->DelPartyMember(pDelMember->nAccountDBID, true, pDelMember->cKickKind) == false)
// // _DANGER_POINT();
// return ERROR_NONE;
// }
// break;
case GAMA_FRIENDADD:
{
GAMAFriendAddNotice * pPacket = (GAMAFriendAddNotice*)pData;
g_pDivisionManager->SendFriendAddNotice(pPacket->nAddedAccountDBID, pPacket->wszAddName);
}
break;
case GAMA_PRIVATECHAT:
{
GAMAPrivateChat *pChat = (GAMAPrivateChat*)pData;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pChat->wszChatMsg, pChat->wChatLen);
#ifdef PRE_ADD_DOORS
int nRet = g_pDivisionManager->PrivateChat(pChat->nAccountDBID, pChat->wszToCharacterName, pChat->cType, wszChatMsg, pChat->wChatLen, pChat->biDestCharacterDBID);
#else //#ifdef PRE_ADD_DOORS
int nRet = g_pDivisionManager->PrivateChat(pChat->nAccountDBID, pChat->wszToCharacterName, pChat->cType, wszChatMsg, pChat->wChatLen);
#endif //#ifdef PRE_ADD_DOORS
if (nRet != ERROR_NONE)
SendPrivateChat(pChat->nAccountDBID, pChat->wszToCharacterName, pChat->cType, wszChatMsg, pChat->wChatLen, nRet);
return ERROR_NONE;
}
break;
case GAMA_CHAT:
{
GAMAChat *pChat = (GAMAChat*)pData;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pChat->wszChatMsg, pChat->wChatLen);
switch( pChat->cType )
{
// GAMA_CHAT <20><>Ŷ<EFBFBD><C5B6> CHATTYPE_GM <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>߰<EFBFBD>~! by <20><><EFBFBD><EFBFBD>
case CHATTYPE_GM:
{
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID( pChat->nAccountDBID );
if( pUser )
{
if( pUser->GetUserState() == STATE_VILLAGE )
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if( pVillageCon )
pVillageCon->SendChat( pChat->cType, pChat->nAccountDBID, L"", wszChatMsg, pChat->wChatLen );
}
}
return ERROR_NONE;
}
case CHATTYPE_WORLD:
#if defined(PRE_ADD_WORLD_MSG_RED)
case CHATTYPE_WORLD_POPMSG:
#endif // #if defined(PRE_ADD_WORLD_MSG_RED)
{
#if defined(PRE_ADD_WORLD_MSG_RED)
if (g_pDivisionManager->WorldChat(pChat->nAccountDBID, wszChatMsg, pChat->wChatLen, pChat->cType) != ERROR_NONE)
#else // #if defined(PRE_ADD_WORLD_MSG_RED)
if (g_pDivisionManager->WorldChat(pChat->nAccountDBID, wszChatMsg, pChat->wChatLen) != ERROR_NONE)
#endif // #if defined(PRE_ADD_WORLD_MSG_RED)
_DANGER_POINT();
return ERROR_NONE;
}
}
}
break;
case GAMA_WORLDSYSTEMMSG:
{
GAMAWorldSystemMsg *pMsg = (GAMAWorldSystemMsg*)pData;
g_pDivisionManager->WorldSystemMsg(pMsg->nAccountDBID, pMsg->cType, pMsg->nID, pMsg->nValue, pMsg->wszToCharacterName);
}
break;
#if defined( PRE_PRIVATECHAT_CHANNEL )
case GAMA_PRIVATECHANNELCHAT:
{
GAMAPrivateChannelChatMsg *pChat = (GAMAPrivateChannelChatMsg*)pData;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pChat->wszChatMsg, pChat->wChatLen);
if (g_pDivisionManager->PrivateChannelChat(pChat->nAccountDBID, wszChatMsg, pChat->wChatLen, pChat->nChannelID) != ERROR_NONE)
return ERROR_NONE;
}
break;
#endif
case GAMA_NOTICE:
{
GAMANotice * pPacket = (GAMANotice*)pData;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pPacket->szMsg, pPacket->nLen);
g_pDivisionManager->Notice(wszChatMsg, pPacket->nLen, 0);
return ERROR_NONE;
}
break;
case GAMA_BANUSER:
{
GAMABanUser * pPacket = (GAMABanUser*)pData;
CDNUser * pUser = g_pDivisionManager->GetUserByName(pPacket->wszCharacterName);
if(!pUser)
{
//std::wstring wString = boost::io::str( boost::wformat( L"%s <20><><EFBFBD><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.") % pPacket->wszCharacterName );
#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wString = boost::io::str( boost::wformat( GetEtUIXML().GetUIString(CEtUIXML::idCategory1,4418, pPacket->cSelectedLang) ) % pPacket->wszCharacterName );
#else //#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wString = boost::io::str( boost::wformat( GetEtUIXML().GetUIString(CEtUIXML::idCategory1,4418) ) % pPacket->wszCharacterName );
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
SendChat( CHATTYPE_GM, pPacket->nAccountDBID, L"", wString.c_str(), static_cast<short>(wString.size()) );
return ERROR_NONE;
}
g_pDivisionManager->SendDetachUser(pUser->GetAccountDBID());
}
break;
case GAMA_PVP_ROOMSYNCOK:
{
GAMAPVP_ROOMSYNCOK* pPacket = reinterpret_cast<GAMAPVP_ROOMSYNCOK*>(pData);
if( g_pDivisionManager )
g_pDivisionManager->SetPvPRoomSyncOK( pPacket->uiPvPIndex );
else
_DANGER_POINT();
break;
}
case GAMA_PVP_LADDERROOMSYNC:
{
GAMAPVP_LADDERROOMSYNC* pPacket = reinterpret_cast<GAMAPVP_LADDERROOMSYNC*>(pData);
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() );
if( pVillageCon )
pVillageCon->SendLadderSystemRoomSync( pPacket );
break;
}
case GAMA_PVP_BREAKINTOOK:
{
GAMAPVP_BREAKINTOOK* pPacket = reinterpret_cast<GAMAPVP_BREAKINTOOK*>(pData);
if( g_pDivisionManager )
g_pDivisionManager->SetPvPBreakIntoOK( pPacket );
else
_DANGER_POINT();
break;
}
case GAMA_PVP_COMMAND:
{
GAMAPVP_COMMAND* pPacket = reinterpret_cast<GAMAPVP_COMMAND*>(pData);
if( !g_pDivisionManager )
{
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
#if defined( PRE_WORLDCOMBINE_PVP)
if( pPacket->uiPvPIndex > WorldPvPMissionRoom::Common::WorldPvPRoomStartIndex )
break;
#endif
switch( pPacket->uiCommandType )
{
case PvPCommon::GAMA_Command::DeleteGameRoom:
{
g_pDivisionManager->SetDestroyPvPGameRoom( pPacket->uiPvPIndex, pPacket->uiRoomIndex );
break;
}
case PvPCommon::GAMA_Command::FinishGameMode:
{
g_pDivisionManager->SetPvPFinishGameMode( pPacket->uiPvPIndex, pPacket->uiRoomIndex );
break;
}
case PvPCommon::GAMA_Command::NoMoreBreakInto:
{
g_pDivisionManager->SetPvPNoMoreBreakInto( pPacket->uiPvPIndex, pPacket->uiRoomIndex );
break;
}
}
break;
}
case GAMA_PVP_SWAPTMEMBER_INDEX:
{
GAMAPVPSwapMemberIndex * pPacket = (GAMAPVPSwapMemberIndex*)pData;
bool bRet = false;
USHORT nTeam = PvPCommon::Team::A;
if (g_pDivisionManager)
bRet = g_pDivisionManager->SetPvPMemberIndex(pPacket->nAccountDBID, pPacket->cCount, pPacket->Index, nTeam);
SendPvPMemberIndex(nTeam, pPacket, bRet ? ERROR_NONE : ERROR_PVP_SWAPTEAM_MEMBERINDEX_FAIL);
break;
}
case GAMA_PVP_CHANGEMEMBER_GRADE:
{
GAMAPVPChangeMemberGrade * pPacket = (GAMAPVPChangeMemberGrade*)pData;
bool bRet = false;
USHORT nUserState = PvPCommon::UserState::None;
USHORT nTeam = PvPCommon::Team::A;
if (g_pDivisionManager)
bRet = g_pDivisionManager->SetGuildWarMemberGrade(pPacket->nAccountDBID, pPacket->bAsign, pPacket->nType, pPacket->nTargetSessionID, nUserState, nTeam);
SendPvPMemberGrade(pPacket->nAccountDBID, nTeam, nUserState, pPacket->nTargetSessionID, bRet ? ERROR_NONE : ERROR_PVP_CHANGEMEMBERGRADE_FAIL);
break;
}
case GAMA_PVP_GUILDWARSCORE:
{
GAMAPvPGuildWarScore * pPacket = (GAMAPvPGuildWarScore*)pData;
if( g_pGuildWarManager )
g_pGuildWarManager->SetGuildWarTournamentPoint(pPacket);
break;
}
case GAMA_PVP_GUILDWARRESULT:
{
GAMAPvPGuildWarResult * pPacket = (GAMAPvPGuildWarResult*)pData;
if( g_pGuildWarManager )
g_pGuildWarManager->SetGuildWarTournamentResult(pPacket);
break;
}
case GAMA_PVP_GUILDWAREXCEPTION:
{
GAMAPvPGuildWarException * pPacket = (GAMAPvPGuildWarException*)pData;
if (g_pGuildWarManager)
g_pGuildWarManager->SetDropTournament(pPacket->nPvPIndex);
else
_DANGER_POINT();
break;
}
// Guild
case GAMA_CHANGEGUILDINFO: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD>
{
g_pDivisionManager->SendChangeGuildInfo(reinterpret_cast<MAChangeGuildInfo*>(pData));
}
break;
case GAMA_CHANGEGUILDMEMBINFO: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD>
{
g_pDivisionManager->SendChangeGuildMemberInfo(reinterpret_cast<MAChangeGuildMemberInfo*>(pData));
}
break;
case GAMA_GUILDCHAT: // <20><><EFBFBD><EFBFBD> ä<><C3A4>
{
g_pDivisionManager->SendGuildChat(reinterpret_cast<MAGuildChat*>(pData));
}
break;
case GAMA_GUILDCHANGENAME :
{
g_pDivisionManager->SendChangeGuildName(reinterpret_cast<MAGuildChangeName*>(pData));
}
break;
case GAMA_UPDATEGUILDEXP:
{
g_pDivisionManager->SendUpdateGuildExp(reinterpret_cast<MAUpdateGuildExp*>(pData));
}
break;
case GAMA_ADDGUILDWAR_POINT:
{
MAAddGuildWarPoint* pPacket = (MAAddGuildWarPoint*)pData;
g_pGuildWarManager->AddGuildWarPoint(pPacket->cTeamType, pPacket->nAddPoint);
g_pDivisionManager->SendAddGuildWarPoint(pPacket);
}
break;
case GAMA_CHANGECHARACTERNAME:
{
g_pDivisionManager->SendChangeCharacterName(reinterpret_cast<MAChangeCharacterName*>(pData));
}
break;
case GAMA_INVITEPARTYMEMBER:
{
GAMAInvitePartyMember * pPacket = (GAMAInvitePartyMember*)pData;
int nInviteRet = g_pDivisionManager->SendInvitePartyMember(GetGameID(), pPacket);
if (nInviteRet != ERROR_NONE)
{
g_pDivisionManager->SendInvitePartyMemberResult(GetGameID(), pPacket->wszInviterName, pPacket->wszInvitedName, nInviteRet);
}
}
break;
case GAMA_INVITEPARTYMEMBER_RETURNMSG:
{
GAMAInvitedReturnMsg * pPacket = (GAMAInvitedReturnMsg*)pData;
if (g_pDivisionManager->SendInvitedPartyMemberReturn(pPacket->nAccountDBID, pPacket->nRetCode) == false)
_DANGER_POINT();
}
break;
#if defined(PRE_MOD_REQ_JOIN_PARTY_ANSWER_MSG_APP)
case GAMA_GETPARTYID_RESULT:
{
GAMAGetPartyIDResult * pPacket = (GAMAGetPartyIDResult*)pData;
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID(pPacket->nSenderAccountDBID);
if( pUser && pUser->GetUserState() == STATE_VILLAGE )
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if( pVillageCon )
{
pVillageCon->SendGetPartyIDResult( pPacket->nSenderAccountDBID, pPacket->PartyID );
}
}
}
break;
case GAMA_RESPARTYASKJOIN:
{
GAMAResPartyAskJoin* pPacket = (GAMAResPartyAskJoin*)pData;
CDNUser* pUser = NULL;
if(pPacket->uiReqAccountDBID > 0 )
pUser = g_pDivisionManager->GetUserByAccountDBID(pPacket->uiReqAccountDBID);
else if( pPacket->wszReqChracterName[0] != '\0' )
pUser = g_pDivisionManager->GetUserByName(pPacket->wszReqChracterName);
if( pUser && pUser->GetUserState() == STATE_VILLAGE )
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if( pVillageCon )
pVillageCon->SendResPartyAskJoin( pPacket->iRet, pUser->GetAccountDBID());
}
}
break;
case GAMA_ASKJOINAGREEINFO:
{
GAMAAskJoinAgreeInfo* pPacket = (GAMAAskJoinAgreeInfo*)pData;
CDNUser* pUser = g_pDivisionManager->GetUserByName(pPacket->wszAskerCharName);
if( pUser && pUser->GetUserState() == STATE_VILLAGE )
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if( pVillageCon )
pVillageCon->SendAskJoinAgreeInfo( pUser->GetAccountDBID(), pPacket->PartyID, pPacket->iPassword );
}
}
break;
#endif
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
case GAMA_SYNC_SYSTEMMAIL:
{
g_pDivisionManager->SyncSystemMail( reinterpret_cast<VIMASyncSystemMail*>(pData) );
break;
}
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
case GAMA_PCBANGRESULT:
{
GAMAPCBangResult *pResult = (GAMAPCBangResult*)pData;
CDNUser *pUser = g_pDivisionManager->GetUserByAccountDBID(pResult->nAccountDBID);
if (!pUser){
SendPCBangResult(pResult->nAccountDBID, NULL);
return ERROR_NONE;
}
SendPCBangResult(pResult->nAccountDBID, pUser);
}
break;
case GAMA_NOTIFYGIFT:
{
GAMANotifyGift *pGift = (GAMANotifyGift*)pData;
g_pDivisionManager->SendNotifyGift(pGift->nToAccountDBID, pGift->biToCharacterDBID, pGift->bNew, pGift->nGiftCount);
}
break;
case GAMA_MASTERSYSTEM_SYNC_SIMPLEINFO:
{
g_pDivisionManager->SyncMasterSystemSimpleInfo( reinterpret_cast<MasterSystem::GAMASyncSimpleInfo*>(pData) );
break;
}
case GAMA_MASTERSYSTEM_SYNC_GRADUATE:
{
g_pDivisionManager->SyncMasterSystemGraduate( reinterpret_cast<MasterSystem::GAMASyncGraduate*>(pData) );
break;
}
case GAMA_MASTERSYSTEM_SYNC_CONNECT:
{
g_pDivisionManager->SyncMasterSystemConnect( reinterpret_cast<MasterSystem::GAMASyncConnect*>(pData) );
break;
}
//Farm
case GAMA_FARM_DATALOADED:
{
GAMAFarmDataLoaded * pPacket = (GAMAFarmDataLoaded*)pData;
if (g_pDivisionManager->SetFarmDataLoaded(pPacket->nFarmDBID, GetGameID(), pPacket->nGameServerIdx, pPacket->nRoomID, pPacket->nMapID, pPacket->nFarmMaxUser) == false)
{
//<2F>հ<EFBFBD> <20>ؾ<EFBFBD><D8BE>ұ<EFBFBD>? <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4> <20>հ<EFBFBD> <20>̻<EFBFBD><CCBB>ѰŴ<D1B0>. <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
g_Log.Log( LogType::_FARM, L"GAMA_FARM_DATALOADED Failed!\n" );
break;
}
g_Log.Log( LogType::_FARM, L"GAMA_FARM_DATALOADED! FarmID[%d]\n", pPacket->nFarmDBID );
break;
}
case GAMA_FARM_USERCOUNT:
{
GAMAFarmUserCount * pPacket = (GAMAFarmUserCount*)pData;
if (g_pDivisionManager->SetFarmUpdateUserCount(pPacket->nFarmDBID, pPacket->nFarmRoomID, pPacket->nCurUserCount, pPacket->bStarted, m_nManagedID) == false)
{
//<2F>̷<EFBFBD><CCB7>ø<EFBFBD> <20>ƴϵ<C6B4><CFB5>ɴϴ<C9B4>.
_DANGER_POINT();
}
break;
}
case GAMA_FARM_INTENDEDDESTROY:
{
GAMAFarmIntendedDestroy * pPacket = (GAMAFarmIntendedDestroy*)pData;
if (g_pDivisionManager->DestroyFarm(pPacket->nFarmDBID) == false)
_DANGER_POINT();
break;
}
case GAMA_FARM_SYNC:
{
g_pDivisionManager->SyncFarm( reinterpret_cast<GAMAFarmSync*>(pData) );
break;
}
case GAMA_FARM_SYNC_ADDWATER:
{
g_pDivisionManager->SyncFarmAddWater( reinterpret_cast<GAMAFarmSyncAddWater*>(pData) );
break;
}
case GAMA_GUILDMEMBER_LELVEUP:
{
g_pDivisionManager->SendGuildMemberLevelUp(reinterpret_cast<MAGuildMemberLevelUp*>(pData));
}
break;
case GAMA_LOAD_USERTEMPDATA:
{
GAMALoadUserTempData * pPacket = (GAMALoadUserTempData*)pData;
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID( pPacket->uiAccountDBID );
#if defined(PRE_ADD_REMOTE_QUEST)
if(pUser)
SendUserTempDataResult(pPacket->uiAccountDBID, pUser);
#else
#if defined(PRE_ADD_GAMEQUIT_REWARD)
if( pUser )
SendUserTempDataResult(pPacket->uiAccountDBID, pUser->GetDungeonClearCount(), pUser->GetUserGameQuitRewardType());
#else // #if defined(PRE_ADD_GAMEQUIT_REWARD)
if( pUser )
SendUserTempDataResult(pPacket->uiAccountDBID, pUser->GetDungeonClearCount());
#endif // #if defined(PRE_ADD_GAMEQUIT_REWARD)
#endif //#if defined(PRE_ADD_REMOTE_QUEST)
}
break;
case GAMA_SAVE_USERTEMPDATA:
{
GAMASaveUserTempData * pPacket = (GAMASaveUserTempData*)pData;
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID( pPacket->uiAccountDBID );
if( pUser )
{
pUser->SetDungeonClearCount(pPacket->nDungeonClearCount);
#if defined(PRE_ADD_REMOTE_QUEST)
pUser->SetAcceptWaitRemoteQuest(pPacket->nAcceptWaitRemoteQuestCount, pPacket->AcceptWaitRemoteQuestList);
#endif
#if defined(PRE_ADD_GAMEQUIT_REWARD)
pUser->SetUserGameQuitRewardType(pPacket->eUserGameQuitRewardType);
#endif // #if defined(PRE_ADD_GAMEQUIT_REWARD)
}
}
break;
case GAMA_DUPLICATE_LOGIN :
{
GAMADuplicateLogin* pPacket = (GAMADuplicateLogin*)pData;
// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD> <20><><EFBFBD>е<EFBFBD>
//g_pDivisionManager->DelUser(pPacket->nAccountDBID);
// <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>α<EFBFBD><CEB1>ο<EFBFBD> ResetAuthȣ<68><C8A3><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20>˸<EFBFBD>
if( !pPacket->bIsDetach )
{
CDNLoginConnection* pLoginConnection = g_pDivisionManager->GetFirstEnableLoginServer();
if( pLoginConnection )
{
pLoginConnection->SendDuplicateLogin(pPacket->nAccountDBID, pPacket->nSessionID);
g_Log.Log(LogType::_ERROR, g_Config.nWorldSetID, pPacket->nAccountDBID, 0, pPacket->nSessionID, L"[ADBID:%u] GAMA_DUPLICATE_LOGIN \r\n", pPacket->nAccountDBID);
}
}
}
break;
case GAMA_CHECK_LASTDUNGEONINFO:
{
GAMACheckLastDungeonInfo* pPacket = reinterpret_cast<GAMACheckLastDungeonInfo*>(pData);
CDNUser* pUser = g_pDivisionManager->GetUserByCharacterDBID( pPacket->biCharacterDBID );
if( pUser && (pUser->GetUserState() == STATE_VILLAGE || pUser->GetUserState() == STATE_CHECKVILLAGE) )
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if( pVillageCon )
pVillageCon->SendCheckLastDungeonInfo( pPacket->uiAccountDBID, pPacket->biCharacterDBID, pPacket->bIsCheck, pPacket->wszPartyName );
}
break;
}
case GAMA_CONFIRM_LASTDUNGEONINFO:
{
GAMAConfirmLastDungeonInfo* pPacket = reinterpret_cast<GAMAConfirmLastDungeonInfo*>(pData);
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID( pPacket->uiAccountDBID );
if( pUser && (pUser->GetUserState() == STATE_VILLAGE || pUser->GetUserState() == STATE_CHECKVILLAGE) )
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if( pVillageCon )
#if defined( PRE_PARTY_DB )
pVillageCon->SendConfirmLastDungeonInfo( pPacket->iRet, pPacket->uiAccountDBID, pPacket->BreakIntoType );
#else
pVillageCon->SendConfirmLastDungeonInfo( pPacket->iRet, pPacket->uiAccountDBID );
#endif // #if defined( PRE_PARTY_DB )
}
break;
}
#if defined( PRE_WORLDCOMBINE_PARTY )
case GAMA_DELWORLDPARTY:
{
MADelWorldParty *pPacket = (MADelWorldParty*)pData;
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() );
if( pVillageCon )
{
pVillageCon->SendDelWorldParty( pPacket );
}
}
break;
case GAMA_WORLDPARTYMEMBER:
{
GAMASendWorldPartyMember* pPacket = reinterpret_cast<GAMASendWorldPartyMember*>(pData);
CDNUser* pUser = g_pDivisionManager->GetUserByCharacterDBID( pPacket->biCharacterDBID );
if( pUser )
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if( pVillageCon )
pVillageCon->SendWorldPartyMember( pPacket );
}
}
break;
#endif
#if defined( PRE_ADD_BESTFRIEND )
case GAMA_LEVELUP_BESTFRIEND:
{
g_pDivisionManager->SendLevelBestFriend(reinterpret_cast<MALevelUpBestFriend*>(pData));
}
break;
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
case GAMA_PRIVATECHATCHANNEL_ADD:
{
int nRet = g_pDivisionManager->AddPrivateChatChannel( reinterpret_cast<MAAddPrivateChannel*>(pData) );
}
break;
case GAMA_PRIVATECHATCHANNEL_MEMBERADD:
{
int nRet = g_pDivisionManager->AddPrivateChatChannelMember( reinterpret_cast<MAAddPrivateChannelMember*>(pData) );
}
break;
case GAMA_PRIVATECHATCHANNEL_MEMBERINVITE:
{
int nRet = g_pDivisionManager->InvitePrivateChatChannelMember( reinterpret_cast<MAInvitePrivateChannelMember*>(pData) );
}
break;
case GAMA_PRIVATECHATCHANNEL_MEMBERINVITERESULT:
{
int nRet = g_pDivisionManager->InviteResultPrivateChatChannelMember( reinterpret_cast<MAInvitePrivateChannelMemberResult*>(pData) );
}
break;
case GAMA_PRIVATECHATCHANNEL_MEMBERDEL:
{
int nRet = g_pDivisionManager->DelPrivateChatChannelMember( reinterpret_cast<MADelPrivateChannelMember*>(pData) );
}
break;
case GAMA_PRIVATECHATCHANNEL_MOD:
{
int nRet = g_pDivisionManager->ModPrivateChatChannel( reinterpret_cast<MAModPrivateChannel*>(pData) );
}
break;
case GAMA_PRIVATECHATCHANNEL_MEMBERKICKRESULT:
{
int nRet = g_pDivisionManager->KickPrivateChatChannelMemberResult( reinterpret_cast<MAKickPrivateChannelMemberResult*>(pData) );
}
break;
#endif
#if defined( PRE_FIX_WORLDCOMBINEPARTY )
case GAMA_WORLDCOMBINEGAMESERVER:
{
SetWorldCombineGameServer(true);
}
break;
#endif
#if defined( PRE_WORLDCOMBINE_PVP )
case GAMA_DEL_WORLDPVPROOM:
{
MADelWorldPvPRoom *pPacket = (MADelWorldPvPRoom*)pData;
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() );
if( pVillageCon )
{
pVillageCon->SendDelWorldPvPRoom( pPacket );
}
}
break;
case GAMA_WORLDPVPROOM_JOINRESULT:
{
MAWorldPvPRoomJoinResult *pPacket = (MAWorldPvPRoomJoinResult*)pData;
CDNUser *pUser = g_pDivisionManager->GetUserByAccountDBID(pPacket->uiAccountDBID);
if (!pUser) break;
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if( pVillageCon )
{
UINT uiUserState = pUser->GetPvPUserState()&~PvPCommon::UserState::Syncing;
pUser->SetPvPUserState( uiUserState );
pVillageCon->SendWorldPvPRoomJoinResult( pPacket );
pVillageCon->SendPvPChangeUserState( g_pDivisionManager->GetPvPLobbyChannelID(), 0, pUser->GetAccountDBID(), uiUserState );
}
}
break;
case GAMA_WORLDPVPROOM_GMCREATERESULT:
{
MAWorldPvPRoomGMCreateResult *pPacket = (MAWorldPvPRoomGMCreateResult*)pData;
CDNUser *pUser = g_pDivisionManager->GetUserByAccountDBID(pPacket->uiAccountDBID);
if (!pUser) break;
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if( pVillageCon )
{
UINT uiUserState = pUser->GetPvPUserState()&~PvPCommon::UserState::Syncing;
pUser->SetPvPUserState( uiUserState );
pVillageCon->SendWorldPvPRoomGMCreateResult( pPacket );
pVillageCon->SendPvPChangeUserState( g_pDivisionManager->GetPvPLobbyChannelID(), 0, pUser->GetAccountDBID(), uiUserState );
}
}
break;
#endif
#if defined(PRE_ADD_MUTE_USERCHATTING)
case GAMA_MUTE_USERFIND:
{
MAMuteUserFind *pPacket = (MAMuteUserFind*)pData;
CDNUser *pUser = g_pDivisionManager->GetUserByName(pPacket->wszMuteUserName);
if(pUser)
{
MAMuteUserChat RestraintData;
RestraintData.uiGmAccountID = pPacket->uiGmAccountID;
RestraintData.nMuteMinute = pPacket->nMuteMinute;
RestraintData.uiMuteUserAccountID = pUser->GetAccountDBID();
if(pUser->GetUserState() == STATE_VILLAGE)
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( pUser->GetVillageID() );
if(pVillageCon)
{
pVillageCon->SendMuteUserChatting(&RestraintData);
return ERROR_NONE;
}
}
else if(pUser->GetUserState() == STATE_GAME)
{
CDNGameConnection* pGameCon = g_pDivisionManager->GetGameConnectionByGameID(pUser->GetGameID());
if(pGameCon)
{
pGameCon->SendMuteUserChatting(&RestraintData);
return ERROR_NONE;
}
}
}
#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wString = boost::io::str( boost::wformat( GetEtUIXML().GetUIString(CEtUIXML::idCategory1,4418, pPacket->cSelectedLanguage) ) % pPacket->wszMuteUserName );
#else //#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wString = boost::io::str( boost::wformat( GetEtUIXML().GetUIString(CEtUIXML::idCategory1,4418) ) % pPacket->wszMuteUserName );
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
SendChat( CHATTYPE_GM, pPacket->uiGmAccountID, L"", wString.c_str(), static_cast<short>(wString.size()) );
break;
}
#endif // #if defined(PRE_ADD_MUTE_USERCHATTING)
#if defined( PRE_MOD_71820 )
case GAMA_NOTIFYMAIL:
{
GAMANotifyMail *pMail = (GAMANotifyMail*)pData;
g_pDivisionManager->SendNotifyMail(pMail->nToAccountDBID, pMail->biToCharacterDBID, pMail->wTotalMailCount, pMail->wNotReadMailCount, pMail->w7DaysLeftMailCount, pMail->bNewMail);
}
break;
#endif // #if defined( PRE_MOD_71820 )
#if defined( PRE_ALTEIAWORLD_EXPLORE )
case GAMA_ALTEIAWORLD_SENDTICKET_RESULT:
{
MAAlteiaWorldSendTicketResult *pPacket = (MAAlteiaWorldSendTicketResult*)pData;
int nRet = g_pDivisionManager->AlteiaSendTicketResult( reinterpret_cast<MAAlteiaWorldSendTicketResult*>(pData) );
}
break;
#endif
#if defined(PRE_ADD_CHNC2C)
case GAMA_C2C_CHAR_ADDCOIN :
{
MAC2CAddCoinResult *pPacket = (MAC2CAddCoinResult*)pData;
if( g_pDnC2C )
g_pDnC2C->SendAddCoin(pPacket->nRetCode, pPacket->szSeqID);
}
break;
case GAMA_C2C_CHAR_REDUCECOIN :
{
MAC2CReduceCoinResult *pPacket = (MAC2CReduceCoinResult*)pData;
if( g_pDnC2C )
g_pDnC2C->SendReduceCoin(pPacket->nRetCode, pPacket->szSeqID);
}
break;
#endif //#if defined(PRE_ADD_CHNC2C)
#if defined(PRE_ADD_DWC)
case GAMA_DWC_TEAMCHAT:
{
g_pDivisionManager->SendDWCTeamChat(reinterpret_cast<MADWCTeamChat*>(pData));
}
break;
case GAMA_DWC_UPDATE_SCORE:
{
g_pDivisionManager->SendUpdateDWCScore(reinterpret_cast<MADWCUpdateScore*>(pData));
}
break;
#endif
}
return ERROR_NONE;
}
#ifdef _WORK
//For _WORK
void CDNGameConnection::SendReloadExt()
{
AddSendData(MAGA_RELOADEXT, 0, NULL, 0);
}
void CDNGameConnection::SendReloadAct()
{
AddSendData(MAGA_RELOADACT, 0, NULL, 0);
}
#endif //#ifdef _WORK
void CDNGameConnection::SendRegistWorldID()
{
MARegist Regist = { 0, };
Regist.cWorldSetID = g_Config.nWorldSetID;
Regist.cGameID = (BYTE)m_wGameID;
AddSendData(MAGA_REGISTWORLDINFO, 0, (char*)&Regist, sizeof(MARegist));
}
void CDNGameConnection::SendReqUserList(short nRetCode)
{
MAReqUserList packet;
memset(&packet, 0, sizeof(packet));
packet.nRetCode = nRetCode;
AddSendData(MAGA_REQUSERLIST, 0, (char*)&packet, sizeof(packet));
}
void CDNGameConnection::SendGameRegistComplete()
{
AddSendData(MAGA_REGISTCOMPLETE, 0, NULL, 0);
}
void CDNGameConnection::SendAddUserState(const WCHAR * pName, INT64 biCharacterDBID, int nLocationState, int nCommunityState, int nChannelID, int nMapIdx)
{
MAUserState packet;
memset(&packet, 0, sizeof(packet));
packet.Type = WorldUserState::Add;
packet.biCharacterDBID = biCharacterDBID;
packet.cLocationState = static_cast<BYTE>(nLocationState == -1 ? _LOCATION_LOGIN : nLocationState); //<2F>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1>̿<EFBFBD><CCBF><EFBFBD>
packet.cCommunityState = _COMMUNITY_NONE; //<2F><><EFBFBD><EFBFBD> <20><EFBFBD><EEB6BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
packet.cNameLen = (BYTE)wcslen(pName);
_wcscpy(packet.wszBuf, NAMELENMAX, pName, (BYTE)wcslen(pName));
packet.nChannelID = nChannelID == -1 ? 0 : nChannelID;
packet.nMapIdx = nMapIdx == -1 ? 0 : nMapIdx;
AddSendData(MAGA_USERSTATE, 0, (char*)&packet, sizeof(packet) - sizeof(packet.wszBuf) + (packet.cNameLen * sizeof(WCHAR)));
}
void CDNGameConnection::SendDelUserState(const WCHAR * pName, INT64 biCharacterDBID)
{
MAUserState packet;
memset(&packet, 0, sizeof(packet));
packet.Type = WorldUserState::Delete;
packet.cNameLen = (BYTE)wcslen(pName);
_wcscpy(packet.wszBuf, NAMELENMAX, pName, (BYTE)wcslen(pName));
packet.biCharacterDBID = biCharacterDBID;
AddSendData(MAGA_USERSTATE, 0, (char*)&packet, sizeof(packet) - sizeof(packet.wszBuf) + (packet.cNameLen * sizeof(WCHAR)));
}
void CDNGameConnection::SendUpdateUserState(const WCHAR * pName, INT64 biCharacterDBID, int nLocationState, int nCommunityState, int nChannelID, int nMapIdx)
{
MAUserState packet;
memset(&packet, 0, sizeof(packet));
packet.Type = WorldUserState::Modify;
packet.biCharacterDBID = biCharacterDBID;
packet.cNameLen = (BYTE)wcslen(pName);
_wcscpy(packet.wszBuf, NAMELENMAX, pName, (BYTE)wcslen(pName));
packet.cLocationState = nLocationState;
packet.cCommunityState = nCommunityState;
packet.nChannelID = nChannelID;
packet.nMapIdx = nMapIdx;
AddSendData(MAGA_USERSTATE, 0, (char*)&packet, sizeof(packet) - sizeof(packet.wszBuf) + (packet.cNameLen * sizeof(WCHAR)));
}
void CDNGameConnection::SendReqTutorialRoomID(CDNUser *pUser, int nLoginServerID)
{
MAGAReqTutorialRoomID RoomID = { 0, };
RoomID.nAccountDBID = pUser->GetAccountDBID();
RoomID.nSessionID = pUser->GetSessionID();
RoomID.biCharacterDBID = pUser->GetCharacterDBID();
RoomID.nRandomSeed = pUser->m_nRandomSeed;
RoomID.nTutorialMapIndex = pUser->m_nMapIndex;
RoomID.cTutorialGateNo = pUser->m_cGateNo;
RoomID.cWorldSetID = (BYTE)g_Config.nWorldSetID;
RoomID.bAdult = pUser->IsAdult();
#if defined(PRE_ADD_MULTILANGUAGE)
RoomID.cSelectedLanguage = pUser->m_eSelectedLanguage;
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
_wcscpy(RoomID.wszAccountName, IDLENMAX, pUser->GetAccountName(), (BYTE)wcslen(pUser->GetAccountName()));
RoomID.nLoginServerID = nLoginServerID;
AddSendData(MAGA_REQTUTORIALROOMID, 0, (char*)&RoomID, sizeof(MAGAReqTutorialRoomID));
}
bool CDNGameConnection::SendReqRoomID( GameTaskType::eType GameTaskType, CDNUser* pUser, TDUNGEONDIFFICULTY StageDifficulty, int nMeritBonusID, bool bDirectConnect )
{
MAGAReqRoomID TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.GameTaskType = GameTaskType;
TxPacket.cReqGameIDType = REQINFO_TYPE_SINGLE;
TxPacket.nLeaderAccountDBID = pUser->GetAccountDBID();
TxPacket.InstanceID = pUser->GetAccountDBID();
TxPacket.nRandomSeed = pUser->m_nRandomSeed;
TxPacket.nMapIndex = pUser->m_nMapIndex;
#if defined( PRE_PARTY_DB )
TxPacket.PartyData.Clear();
#else
TxPacket.ItemLootRule = ITEMLOOTRULE_NONE;
#endif
TxPacket.cGateNo = pUser->m_cGateNo;
TxPacket.cGateSelect = pUser->m_cGateSelect;
TxPacket.StageDifficulty = StageDifficulty;
TxPacket.cWorldSetID = g_Config.nWorldSetID;
TxPacket.cVillageID = pUser->GetVillageID();
TxPacket.nMeritBonusID = nMeritBonusID;
TxPacket.bDirectConnect = bDirectConnect;
TxPacket.nChannelID = pUser->GetChannelID();
TxPacket.cMemberCount = 1;
TxPacket.arrMemberInfo[0].MemberAccountDBID = pUser->GetAccountDBID();
TxPacket.arrMemberInfo[0].MemberSessionID = pUser->GetSessionID();
TxPacket.arrMemberInfo[0].biMemberCharacterDBID = pUser->GetCharacterDBID();
TxPacket.arrMemberInfo[0].MemberTeam = 0;
TxPacket.arrMemberInfo[0].bAdult = pUser->IsAdult();
TxPacket.arrMemberInfo[0].cPCBangGrade = pUser->GetPCBangGrade();
#if defined(PRE_ADD_MULTILANGUAGE)
TxPacket.arrMemberInfo[0].cSelectedLanguage = pUser->m_eSelectedLanguage;
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
_wcscpy(TxPacket.arrMemberInfo[0].wszAccountName, IDLENMAX, pUser->GetAccountName(), (BYTE)wcslen(pUser->GetAccountName()));
#if defined(_ID)
_strcpy(TxPacket.arrMemberInfo[0].szMacAddress, _countof(TxPacket.arrMemberInfo[0].szMacAddress), pUser->m_szMacAddress, (int)strlen(pUser->m_szMacAddress));
_strcpy(TxPacket.arrMemberInfo[0].szKey, _countof(TxPacket.arrMemberInfo[0].szKey), pUser->m_szKey, (int)strlen(pUser->m_szKey));
#endif //
int iLen = sizeof(MAGAReqRoomID)-sizeof(TxPacket.arrMemberInfo)+sizeof(MAGAReqMemberInfo)*TxPacket.cMemberCount;
int nRet = AddSendData( MAGA_REQROOMID, 0, reinterpret_cast<char*>(&TxPacket), iLen );
if( nRet < 0 )
g_Log.Log( LogType::_GAMECONNECTLOG, pUser, L"SendReqRoomID() Failed!!\n" );
return ( nRet == 0 );
}
void CDNGameConnection::SendReqRoomID(VIMAReqGameID * pPacket, int nMeritBonusID)
{
MAGAReqRoomID TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.GameTaskType = pPacket->GameTaskType;
TxPacket.cReqGameIDType = REQINFO_TYPE_PARTY;
TxPacket.nLeaderAccountDBID = pPacket->PartyData.nLeaderAccountDBID;
TxPacket.InstanceID = pPacket->InstanceID;
TxPacket.nRandomSeed = pPacket->nRandomSeed;
TxPacket.nMapIndex = pPacket->nMapIndex;
#if defined( PRE_PARTY_DB )
TxPacket.PartyData = pPacket->PartyData.PartyData;
#else
TxPacket.ItemLootRule = pPacket->PartyData.ItemLootRule;
TxPacket.ItemLootRank = pPacket->PartyData.ItemLootRank;
TxPacket.cUserLvLimitMin = pPacket->PartyData.cUserLvLimitMin;
TxPacket.nTargetMapIdx = pPacket->PartyData.nTargetMapIdx;
#endif
TxPacket.cGateNo = pPacket->cGateNo;
TxPacket.cGateSelect = pPacket->cGateSelect;
TxPacket.StageDifficulty = pPacket->StageDifficulty;
TxPacket.cWorldSetID = g_Config.nWorldSetID;
TxPacket.nMeritBonusID = nMeritBonusID;
TxPacket.bDirectConnect = pPacket->bDirectConnect;
TxPacket.nChannelID = pPacket->PartyData.nChannelID;
#if defined( PRE_PARTY_DB )
#else
TxPacket.cUserLvLimitMax = pPacket->PartyData.cUserLvLimitMax;
TxPacket.PartyDifficulty = pPacket->PartyData.Difficulty;
_wcscpy(TxPacket.wszPartyName, PARTYNAMELENMAX, pPacket->PartyData.wszPartyName, (BYTE)wcslen(pPacket->PartyData.wszPartyName));
#endif // #if defined( PRE_PARTY_DB )
#if defined( PRE_PARTY_DB )
#else
TxPacket.cIsJobDice = pPacket->PartyData.cJobDice;
_wcscpy(TxPacket.wszPartyPass, PARTYPASSWORDMAX, pPacket->PartyData.wszPartyPass, (BYTE)wcslen(pPacket->PartyData.wszPartyPass));
TxPacket.cUpkeepCount = pPacket->PartyData.cUpkeepCount;
#endif // #if defined( PRE_PARTY_DB )
memcpy(&TxPacket.nKickedMemberList, &pPacket->PartyData.nKickedMemberDBID, sizeof(TxPacket.nKickedMemberList));
TxPacket.nVoiceChannelID[0] = pPacket->PartyData.nVoiceChannelID;
#if defined(PRE_PARTY_DB )
#else
TxPacket.cMemberMax = pPacket->PartyData.cMemberMax;
#endif
TxPacket.cMemberCount = 0;
#if defined( PRE_PARTY_DB )
for( int i=0 ; i<pPacket->PartyData.PartyData.iCurMemberCount; ++i )
#else
for( int i=0 ; i<pPacket->PartyData.cMemberCount; ++i )
#endif
{
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID(pPacket->PartyData.MemberInfo[i].nAccountDBID);
if( pUser )
{
if( pUser->GetAccountDBID() == TxPacket.nLeaderAccountDBID )
TxPacket.cVillageID = pUser->GetVillageID();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].MemberAccountDBID = pUser->GetAccountDBID();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].MemberSessionID = pUser->GetSessionID();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].biMemberCharacterDBID = pUser->GetCharacterDBID();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].MemberTeam = 0;
TxPacket.arrMemberInfo[TxPacket.cMemberCount].bAdult = pUser->IsAdult();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].cPCBangGrade = pUser->GetPCBangGrade();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].cMemberIndex = pPacket->PartyData.MemberInfo[i].cMemberIndex;
TxPacket.arrMemberInfo[TxPacket.cMemberCount].VoiceInfo = pPacket->PartyData.MemberInfo[i].VoiceInfo;
#if defined( PRE_ADD_NEWCOMEBACK )
TxPacket.arrMemberInfo[TxPacket.cMemberCount].bCheckComebackAppellation = pPacket->PartyData.MemberInfo[i].bCheckComebackAppellation;
#endif
#if defined(PRE_ADD_MULTILANGUAGE)
TxPacket.arrMemberInfo[TxPacket.cMemberCount].cSelectedLanguage = pUser->m_eSelectedLanguage;
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
_wcscpy( TxPacket.arrMemberInfo[TxPacket.cMemberCount].wszAccountName, IDLENMAX, pUser->GetAccountName(), (int)wcslen(pUser->GetAccountName()));
#if defined(_ID)
_strcpy(TxPacket.arrMemberInfo[TxPacket.cMemberCount].szMacAddress, _countof(TxPacket.arrMemberInfo[TxPacket.cMemberCount].szMacAddress), pUser->m_szMacAddress, (int)strlen(pUser->m_szMacAddress));
_strcpy(TxPacket.arrMemberInfo[TxPacket.cMemberCount].szKey, _countof(TxPacket.arrMemberInfo[TxPacket.cMemberCount].szKey), pUser->m_szKey, (int)strlen(pUser->m_szKey));
#endif //
++TxPacket.cMemberCount;
}
}
#if defined( PRE_WORLDCOMBINE_PARTY )
if( Party::bIsWorldCombineParty(pPacket->PartyData.PartyData.Type) )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2B6A7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD> <20>̰ɷ<CCB0> <20><><EFBFBD><EFBFBD>
TxPacket.cVillageID = (BYTE)pPacket->unVillageChannelID;
}
#endif
//
int iLen = sizeof(MAGAReqRoomID)-sizeof(TxPacket.arrMemberInfo)+sizeof(MAGAReqMemberInfo)*TxPacket.cMemberCount;
AddSendData( MAGA_REQROOMID, 0, reinterpret_cast<char*>(&TxPacket), iLen );
}
void CDNGameConnection::SendLadderReqRoomID( VIMALadderReqGameID* pPacket )
{
MAGAReqRoomID TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.GameTaskType = GameTaskType::PvP;
TxPacket.cReqGameIDType = REQINFO_TYPE_LADDER;
TxPacket.nRandomSeed = pPacket->iRandomSeed;
TxPacket.nMapIndex = pPacket->iMapIndex;;
TxPacket.cWorldSetID = g_Config.nWorldSetID;
TxPacket.bDirectConnect = true;
TxPacket.cMemberCount = pPacket->LadderData.cMemberCount;
TxPacket.biLadderRoomIndexArr[0] = pPacket->biRoomIndexArr[0];
TxPacket.biLadderRoomIndexArr[1] = pPacket->biRoomIndexArr[1];
TxPacket.MatchType = pPacket->MatchType;
for( int i=0 ; i<TxPacket.cMemberCount ; ++i )
{
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID( pPacket->LadderData.MemberInfoArr[i].uiAccountDBID );
if (pUser)
{
if( i == 0 )
{
TxPacket.cVillageID = pUser->GetVillageID();
}
TxPacket.arrMemberInfo[i].MemberAccountDBID = pUser->GetAccountDBID();
TxPacket.arrMemberInfo[i].MemberSessionID = pUser->GetSessionID();
TxPacket.arrMemberInfo[i].biMemberCharacterDBID = pUser->GetCharacterDBID();
TxPacket.arrMemberInfo[i].MemberTeam = pPacket->LadderData.MemberInfoArr[i].uiTeam;
TxPacket.arrMemberInfo[i].bAdult = pUser->IsAdult();
TxPacket.arrMemberInfo[i].cPCBangGrade = pUser->GetPCBangGrade();
#if defined(PRE_ADD_MULTILANGUAGE)
TxPacket.arrMemberInfo[i].cSelectedLanguage = pUser->m_eSelectedLanguage;
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
_wcscpy( TxPacket.arrMemberInfo[i].wszAccountName, IDLENMAX, pUser->GetAccountName(), (int)wcslen(pUser->GetAccountName()) );
#if defined(_ID)
_strcpy(TxPacket.arrMemberInfo[i].szMacAddress, _countof(TxPacket.arrMemberInfo[i].szMacAddress), pUser->m_szMacAddress, (int)strlen(pUser->m_szMacAddress));
_strcpy(TxPacket.arrMemberInfo[i].szKey, _countof(TxPacket.arrMemberInfo[i].szKey), pUser->m_szKey, (int)strlen(pUser->m_szKey));
#endif //
}
}
int iLen = sizeof(MAGAReqRoomID)-sizeof(TxPacket.arrMemberInfo)+sizeof(MAGAReqMemberInfo)*TxPacket.cMemberCount;
AddSendData( MAGA_REQROOMID, 0, reinterpret_cast<char*>(&TxPacket), iLen );
}
bool CDNGameConnection::SendReqRoomID( CDNPvP* pPvPRoom, bool bDirectConnect )
{
MAGAReqRoomID TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.GameTaskType = GameTaskType::PvP;
TxPacket.cReqGameIDType = REQINFO_TYPE_PVP;
TxPacket.nLeaderAccountDBID = pPvPRoom->GetCaptainAccountDBID();
TxPacket.InstanceID = pPvPRoom->GetIndex();
TxPacket.nRandomSeed = pPvPRoom->GetRandomSeed();
TxPacket.nMapIndex = pPvPRoom->GetMapIndex();
#if defined( PRE_PARTY_DB )
TxPacket.PartyData.Clear();
#else
TxPacket.ItemLootRule = ITEMLOOTRULE_NONE;
#endif
TxPacket.cGateNo = 0;
TxPacket.cWorldSetID = g_Config.nWorldSetID;
TxPacket.nMeritBonusID = 0;
TxPacket.bDirectConnect = bDirectConnect;
#if defined( PRE_PVP_GAMBLEROOM )
TxPacket.cGambleType = pPvPRoom->GetGambleRoomType();
TxPacket.nGamblePrice = pPvPRoom->GetGambleRoomPrice();
#endif
if (pPvPRoom->GetGuildWarInfo(TxPacket.nGuildDBID, TxPacket.nGuildQualifyingScore))
TxPacket.cVillageID = pPvPRoom->GetVillageID();
TxPacket.nEventRoomIndex = pPvPRoom->GetEventRoomIndex();
if (pPvPRoom->GetEventRoomIndex() > 0)
g_Log.Log(LogType::_PVPROOM, g_Config.nWorldSetID, 0, 0, 0, L"SendReqRoomID [Index:%d][Room:%d][Event:%d] \r\n", pPvPRoom->GetIndex(), pPvPRoom->GetGameServerRoomIndex(), pPvPRoom->GetEventRoomIndex());
std::vector<UINT> vAccountDBID;
pPvPRoom->GetMembersByAccountDBID( vAccountDBID );
if( pPvPRoom->GetIsGuildWarSystem() == false )
{
if (vAccountDBID.size() <= 0)
return false;
}
TxPacket.biCreateRoomCharacterDBID = pPvPRoom->GetCreateRoomCharacterDBID();
pPvPRoom->GetVoiceChannelID(TxPacket.nVoiceChannelID);
TxPacket.cMemberCount = 0;
for( size_t i=0 ; i<vAccountDBID.size() ; ++i )
{
CDNUser* pUser = g_pDivisionManager->GetUserByAccountDBID(vAccountDBID[i]);
if( pUser && pPvPRoom->bIsReady( pUser ) && pUser->GetPvPUserState()&PvPCommon::UserState::Syncing )
{
if( pUser->GetAccountDBID() == TxPacket.nLeaderAccountDBID )
TxPacket.cVillageID = pUser->GetVillageID();
#if defined( PRE_PVP_GAMBLEROOM )
else if( pPvPRoom->GetEventRoomIndex() > 0 || pPvPRoom->GetGambleRoomType() > 0 )
#else
else if( pPvPRoom->GetEventRoomIndex() > 0 )
#endif
TxPacket.cVillageID = pPvPRoom->GetVillageID();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].MemberAccountDBID = pUser->GetAccountDBID();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].MemberSessionID = pUser->GetSessionID();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].biMemberCharacterDBID = pUser->GetCharacterDBID();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].cMemberIndex = pPvPRoom->GetPvPTeamIndex(pUser);
TxPacket.arrMemberInfo[TxPacket.cMemberCount].uiPvPUserState = pUser->GetPvPUserState();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].uiPvPUserState &= ~PvPCommon::UserState::CantLeaveMask;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( pPvPRoom->GetGameMode() == PvPCommon::GameMode::PvP_Zombie_Survival && pUser->GetPvPTeam() != PvPCommon::Team::Observer )
TxPacket.arrMemberInfo[TxPacket.cMemberCount].MemberTeam = PvPCommon::Team::A;
#if defined( PRE_ADD_RACING_MODE)
// <20><><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
else if( pPvPRoom->GetGameMode() == PvPCommon::GameMode::PvP_Racing && pUser->GetPvPTeam() != PvPCommon::Team::Observer )
TxPacket.arrMemberInfo[TxPacket.cMemberCount].MemberTeam = PvPCommon::Team::A;
#endif
else
TxPacket.arrMemberInfo[TxPacket.cMemberCount].MemberTeam = pUser->GetPvPTeam();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].bAdult = pUser->IsAdult();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].cPCBangGrade = pUser->GetPCBangGrade();
TxPacket.arrMemberInfo[TxPacket.cMemberCount].bPvPFatigue = pUser->GetPvPFatiue();
#if defined(PRE_ADD_MULTILANGUAGE)
TxPacket.arrMemberInfo[TxPacket.cMemberCount].cSelectedLanguage = pUser->m_eSelectedLanguage;
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
#if defined(_ID)
_strcpy(TxPacket.arrMemberInfo[TxPacket.cMemberCount].szMacAddress, _countof(TxPacket.arrMemberInfo[TxPacket.cMemberCount].szMacAddress), pUser->m_szMacAddress, (int)strlen(pUser->m_szMacAddress));
_strcpy(TxPacket.arrMemberInfo[TxPacket.cMemberCount].szKey, _countof(TxPacket.arrMemberInfo[TxPacket.cMemberCount].szKey), pUser->m_szKey, (int)strlen(pUser->m_szKey));
#endif //
_wcscpy( TxPacket.arrMemberInfo[TxPacket.cMemberCount].wszAccountName, IDLENMAX, pUser->GetAccountName(), (int)wcslen(pUser->GetAccountName()) );
++TxPacket.cMemberCount;
}
}
//
int iLen = sizeof(MAGAReqRoomID)-sizeof(TxPacket.arrMemberInfo)+sizeof(MAGAReqMemberInfo)*TxPacket.cMemberCount;
AddSendData( MAGA_REQROOMID, 0, reinterpret_cast<char*>(&TxPacket), iLen );
return true;
}
#if defined( PRE_WORLDCOMBINE_PVP )
void CDNGameConnection::SendWorldPvPReqRoomID( VIMACreateWorldPvPRoom* pPacket, BYTE cVillageID )
{
MAGAReqRoomID TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.cVillageID = cVillageID;
TxPacket.GameTaskType = GameTaskType::PvP;
TxPacket.cReqGameIDType = REQINFO_TYPE_PVP;
TxPacket.nMapIndex = pPacket->Data.nMapID;
TxPacket.cWorldSetID = g_Config.nWorldSetID;
TxPacket.bDirectConnect = true;
TxPacket.InstanceID = pPacket->nRoomIndex;
TxPacket.eWorldReqType = pPacket->Data.eWorldReqType;
TxPacket.MissonRoomData = pPacket->Data;
if( pPacket->nGMAccountDBID > 0 )
{
TxPacket.cMemberCount++;
TxPacket.arrMemberInfo[0].MemberAccountDBID = pPacket->nGMAccountDBID;
}
int iLen = sizeof(MAGAReqRoomID)-sizeof(TxPacket.arrMemberInfo)+sizeof(MAGAReqMemberInfo)*TxPacket.cMemberCount;
AddSendData( MAGA_REQROOMID, 0, reinterpret_cast<char*>(&TxPacket), iLen );
}
#endif
#if defined( PRE_ADD_FARM_DOWNSCALE )
bool CDNGameConnection::SendReqFarmRoomID(UINT nFarmDBID, int nMapID, int nMaxUser, bool bStart, int iAttr )
#elif defined( PRE_ADD_VIP_FARM )
bool CDNGameConnection::SendReqFarmRoomID(UINT nFarmDBID, int nMapID, int nMaxUser, bool bStart, Farm::Attr::eType Attr )
#else
bool CDNGameConnection::SendReqFarmRoomID(UINT nFarmDBID, int nMapID, int nMaxUser, bool bStart)
#endif // #if defined( PRE_ADD_FARM_DOWNSCALE )
{
MAGAReqRoomID TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.GameTaskType = GameTaskType::Farm;
TxPacket.cReqGameIDType = REQINFO_TYPE_FARM;
TxPacket.InstanceID = nFarmDBID;
TxPacket.cWorldSetID = g_Config.nWorldSetID;
TxPacket.nMapIndex = nMapID;
#if defined( PRE_PARTY_DB )
TxPacket.PartyData.Clear();
TxPacket.PartyData.nPartyMaxCount = nMaxUser;
#else
TxPacket.cMemberMax = nMaxUser;
#endif
TxPacket.nRandomSeed = timeGetTime();
TxPacket.bStart = bStart;
#if defined( PRE_ADD_FARM_DOWNSCALE )
TxPacket.iFarmAttr = iAttr;
#elif defined( PRE_ADD_VIP_FARM )
TxPacket.FarmAttr = Attr;
#endif // #if defined( PRE_ADD_FARM_DOWNSCALE )
int iLen = sizeof(MAGAReqRoomID)-sizeof(TxPacket.arrMemberInfo);
int nRet = AddSendData( MAGA_REQROOMID, 0, reinterpret_cast<char*>(&TxPacket), iLen );
if (nRet < 0)
g_Log.Log(LogType::_GAMECONNECTLOG, L"SendReqFarmRoomID() Failed!!\n");
return (nRet == 0);
}
void CDNGameConnection::SetLastReqEnterGameTick()
{
m_uiLastReqEnterGameTick = timeGetTime();
if( m_uiLastEnterGameTick == 0 )
m_uiLastEnterGameTick = m_uiLastReqEnterGameTick;
}
bool CDNGameConnection::SendForceStopPvP(int nGameRoomID, UINT nForceWinGuildDBID)
{
MAGAForceStopPvP packet;
memset(&packet, 0, sizeof(MAGAForceStopPvP));
packet.nGameRoomID = nGameRoomID;
packet.nForceWinGuildDBID = nForceWinGuildDBID;
if (AddSendData(MAGA_PVP_FORCESTOP, 0, (char*)&packet, sizeof(MAGAForceStopPvP)) == ERROR_NONE)
return true;
return false;
}
void CDNGameConnection::SendGuildWarAllStop()
{
AddSendData(MAGA_PVP_ALLSTOPGUILDWAR, 0, NULL, 0);
}
void CDNGameConnection::SendInivitePartyMemberResult(UINT nAccountDBID, const WCHAR * pwszInvitedName, int nRetCode)
{
MAGAInvitePartyMemberResult packet;
memset(&packet, 0, sizeof(MAGAInvitePartyMemberResult));
packet.nAccountDBID = nAccountDBID;
STRCPYW(packet.wszInvitedName, NAMELENMAX, pwszInvitedName);
packet.nRetCode = nRetCode;
AddSendData(MAGA_INVITEPARTYMEMBERRESULT, 0, (char*)&packet, sizeof(MAGAInvitePartyMemberResult));
}
#if defined(PRE_MOD_REQ_JOIN_PARTY_ANSWER_MSG_APP)
void CDNGameConnection::SendGetPartyID( UINT nAccountDBID, UINT nSenderAccountDBID )
{
MAGAGetPartyID packet;
memset(&packet, 0, sizeof(MAGAGetPartyID));
packet.nAccountDBID = nAccountDBID;
packet.nSenderAccountDBID = nSenderAccountDBID;
AddSendData(MAGA_GETPARTYID, 0, (char*)&packet, sizeof(packet));
}
void CDNGameConnection::SendReqPartyAskJoin( UINT nAccountDBID, const VIMAReqPartyAskJoin* pPacket )
{
MAGAReqPartyAskJoin TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.nAccountDBID = nAccountDBID;
TxPacket.nReqAccountDBID = pPacket->uiReqAccountDBID;
TxPacket.biReqCharacterDBID = pPacket->biReqCharacterDBID;
TxPacket.cReqUserJob = pPacket->cReqUserJob;
TxPacket.cReqUserLevel = pPacket->cReqUserLevel;
_wcscpy( TxPacket.wszReqChracterName, _countof(TxPacket.wszReqChracterName), pPacket->wszReqChracterName, static_cast<int>(wcslen(pPacket->wszReqChracterName)) );
AddSendData( MAGA_REQPARTYASKJOIN, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
#endif
bool CDNGameConnection::GetHasMargin()
{
if (m_GameServerInfoList.empty()) return false;
std::vector <TGameInfo*>::iterator ii;
for (ii = m_GameServerInfoList.begin(); ii != m_GameServerInfoList.end(); ii++)
{
if( timeGetTime()-(*ii)->uiLastDelayReportTick >= DELAYED_PRCESS_CHECKTICK+3000 )
{
g_Log.Log( LogType::_GAMESERVERDELAY, L"[%d] GameServer Delay Delay=%d!!!\n", m_nManagedID, timeGetTime()-(*ii)->uiLastDelayReportTick );
return false;
}
}
// 10<31>е<EFBFBD><D0B5><EFBFBD> <20>ƹ<EFBFBD><C6B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD>˽ð<CBBD><C3B0>̳<EFBFBD> <20><><EFBFBD>׻<EFBFBD><D7BB>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( m_uiLastReqEnterGameTick && timeGetTime()-m_uiLastReqEnterGameTick >= 1000*60*10 )
{
m_uiLastReqEnterGameTick = timeGetTime();
m_uiLastEnterGameTick = timeGetTime();
//g_Log.Log( LogType::_ENTERGAMECHECK, L"[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƹ<EFBFBD><C6B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>˽ð<CBBD><C3B0>̳<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> Tick <20>ʱ<EFBFBD>ȭ!!!\n", m_nManagedID );
}
DWORD dwGap = abs( static_cast<int>(m_uiLastReqEnterGameTick-m_uiLastEnterGameTick) );
if( dwGap >= 60000 )
{
//g_Log.Log( LogType::_ENTERGAMECHECK, L"[%d] EnterGameCheck!!! Delay=%d!!!\n", m_nManagedID, dwGap );
return false;
}
for (ii = m_GameServerInfoList.begin(); ii != m_GameServerInfoList.end(); ii++)
if ((*ii)->bHasMargin == true)
return true;
return false;
}
int CDNGameConnection::GetIdleGameServer(int nCnt)
{
if (m_GameServerInfoList.empty()) return -2;
if (nCnt > (int)m_GameServerInfoList.size())
return m_GameServerInfoList[rand()%m_GameServerInfoList.size()]->nServerID;
std::vector <TGameInfo*>::iterator ii;
for (ii = m_GameServerInfoList.begin(); ii != m_GameServerInfoList.end(); ii++)
if ((*ii)->bHasMargin == true)
return (*ii)->nServerID;
return -1;
}
int CDNGameConnection::GetIdleGameServerByAtt(int Att)
{
std::vector <TGameInfo*>::iterator ii;
for (ii = m_GameServerInfoList.begin(); ii != m_GameServerInfoList.end(); ii++)
if ((*ii)->bHasMargin == true && (*ii)->nServerAttribute&Att)
return (*ii)->nServerID;
return -1;
}
bool CDNGameConnection::GetGameServerInfoByID(int nGameServerID, USHORT * pPort, char * pIP, USHORT * pTcpPort)
{
std::vector <TGameInfo*>::iterator ii;
for (ii = m_GameServerInfoList.begin(); ii != m_GameServerInfoList.end(); ii++)
{
if ((*ii)->nServerID == nGameServerID)
{
*pPort = (*ii)->nPort;
_inet_addr((*ii)->nIP, pIP);
*pTcpPort = (*ii)->nTcpPort;
return true;
}
}
return false;
}
void CDNGameConnection::SendNextVillageServerInfo(UINT nAccountDBID, int nMapIdx, int nNextMapIdx, int nNextGateIdx, const char * pIP, USHORT nPort, short nRet, INT64 nItemSerial)
{
MAGANextVillageInfo packet = { 0, };
packet.nAccountDBID = nAccountDBID;
packet.nMapIdx = nMapIdx;
packet.nNextMapIdx = nNextMapIdx;
packet.nNextGateIdx = nNextGateIdx;
_strcpy( packet.szIP, _countof(packet.szIP), pIP, static_cast<int>(strlen(pIP)) );
packet.nPort = nPort;
packet.nRet = nRet;
packet.nItemSerial = nItemSerial;
AddSendData(MAGA_NEXTVILLAGEINFO, 0, (char*)&packet, sizeof(packet));
}
void CDNGameConnection::SendRebirthVillageInfo(UINT nAccountDBID, int nVillageID, int nChannelID, const char *pIp, USHORT nPort, short nRet)
{
MAGARebirthVillageInfo Info = { 0, };
Info.nAccountDBID = nAccountDBID;
Info.nVillageID = nVillageID;
Info.nChannelID = nChannelID;
_strcpy(Info.szIP, _countof(Info.szIP), pIp, (int)strlen(pIp));
Info.nPort = nPort;
Info.nRet = nRet;
AddSendData(MAGA_REBIRTHVILLAGEINFO, 0, (char*)&Info, sizeof(MAGARebirthVillageInfo));
}
void CDNGameConnection::SendMovePvPGameToPvPLobby( const UINT uiAccountDBID, const char* pszIP, const USHORT unPort, const short nRet )
{
MAGAMovePvPGameToPvPLobby TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
TxPacket.unPort = unPort;
TxPacket.nRet = nRet;
if( pszIP )
_strcpy( TxPacket.szIP, _countof(TxPacket.szIP), pszIP, (int)strlen(pszIP) );
AddSendData( MAGA_MOVEPVPGAMETOPVPLOBBY, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendLoginState(UINT nAccountDBID, short nRet)
{
MAGALoginState State = { 0, };
State.nAccountDBID = nAccountDBID;
State.nRet = nRet;
AddSendData(MAGA_LOGINSTATE, 0, (char*)&State, sizeof(MAGALoginState));
}
void CDNGameConnection::SendVillageState(UINT nAccountDBID, int nRoomID, int nMapIndex, short nRet)
{
MAGAVillageState State = { 0, };
State.nAccountDBID = nAccountDBID;
State.nRoomID = nRoomID;
State.nMapIndex = nMapIndex;
State.nRet = nRet;
AddSendData(MAGA_VILLAGESTATE, 0, (char*)&State, sizeof(MAGAVillageState));
}
void CDNGameConnection::SendFriendAddNotice(UINT nAddedAccountDBID, const WCHAR * pName)
{
MAGAFriendAddNotice packet;
memset(&packet, 0, sizeof(packet));
packet.nAddedAccountDBID = nAddedAccountDBID;
_wcscpy(packet.wszAddName, NAMELENMAX, pName, (int)wcslen(pName));
AddSendData(MAGA_FRIENDADDNOTICE, 0, (char*)&packet, sizeof(packet));
}
//void CDNGameConnection::SendDelPartyMember(int nRoomID, UINT nLeaderAccountDBID, UINT nMemberSessionID, UINT nLeaderSessionID, char cKickKind)
//{
// MAGADelPartyMember PartyMember = { 0, };
//
// PartyMember.nRoomID = nRoomID;
// PartyMember.nNewLeaderAccountDBID = nLeaderAccountDBID;
// PartyMember.nMemberSessionID = nMemberSessionID;
// PartyMember.nNewLeaderSessionID = nLeaderSessionID;
// PartyMember.cKickKind = cKickKind;
//
// AddSendData(MAGA_DELPARTYMEMBER, 0, (char*)&PartyMember, sizeof(MAGADelPartyMember));
//}
void CDNGameConnection::SendPrivateChat(UINT nToAccountDBID, const WCHAR *pwszFromCharacterName, char cType, const WCHAR *pwszChatMsg, short wChatLen, int nRet)
{
MAPrivateChat Private = { 0, };
Private.nAccountDBID = nToAccountDBID;
Private.wChatLen = wChatLen;
Private.cType = cType;
_wcscpy(Private.wszFromCharacterName, NAMELENMAX, pwszFromCharacterName, (int)wcslen(pwszFromCharacterName));
Private.nRet = nRet;
int nSize = 0;
if (nRet != ERROR_NONE){ // <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>
nSize = sizeof(MAPrivateChat) - sizeof(Private.wszChatMsg);
}
else {
nSize = sizeof(MAPrivateChat) - sizeof(Private.wszChatMsg) + (wChatLen * 2);
_wcscpy(Private.wszChatMsg, CHATLENMAX, pwszChatMsg, (int)wcslen(pwszChatMsg));
}
AddSendData(MAGA_PRIVATECHAT, 0, (char*)&Private, nSize);
}
void CDNGameConnection::SendChat(char cType, UINT nToAccountDBID, const WCHAR *pwszFromCharacterName, const WCHAR *pwszChatMsg, short wChatLen)
{
MAChat Chat = { 0, };
Chat.nAccountDBID = nToAccountDBID;
Chat.cType = cType;
Chat.wChatLen = wChatLen;
if (pwszFromCharacterName)
_wcscpy(Chat.wszFromCharacterName, NAMELENMAX, pwszFromCharacterName, (int)wcslen(pwszFromCharacterName));
if (pwszChatMsg)
_wcscpy(Chat.wszChatMsg, CHATLENMAX, pwszChatMsg, (int)wcslen(pwszChatMsg));
AddSendData(MAGA_CHAT, 0, (char*)&Chat, sizeof(MAChat) - sizeof(Chat.wszChatMsg) + (wChatLen*sizeof(WCHAR)) );
}
void CDNGameConnection::SendWorldSystemMsg(const WCHAR *pwszFromCharacterName, char cType, int nID, int nValue, WCHAR* pwszToCharacterName)
{
MAWorldSystemMsg Msg;
memset(&Msg, 0, sizeof(MAWorldSystemMsg));
_wcscpy(Msg.wszFromCharacterName, NAMELENMAX, pwszFromCharacterName, (int)wcslen(pwszFromCharacterName));
Msg.cType = cType;
Msg.nID = nID;
Msg.nValue = nValue;
if (pwszToCharacterName)
_wcscpy(Msg.wszToCharacterName, _countof(Msg.wszToCharacterName), pwszToCharacterName, (int)wcslen(pwszToCharacterName));
AddSendData(MAGA_WORLDSYSTEMMSG, 0, (char*)&Msg, sizeof(MAWorldSystemMsg));
}
#if defined( PRE_PRIVATECHAT_CHANNEL )
void CDNGameConnection::SendPrivateChannelChat(const WCHAR *pwszFromCharacterName, const WCHAR *pwszChatMsg, short wChatLen, INT64 nChannelID)
{
MAPrivateChannelChat Chat;
memset(&Chat, 0, sizeof(MAPrivateChannelChat));
Chat.cWorldSetID = g_Config.nWorldSetID;
Chat.wChatLen = wChatLen;
Chat.nChannelID = nChannelID;
_wcscpy(Chat.wszFromCharacterName, NAMELENMAX, pwszFromCharacterName, (int)wcslen(pwszFromCharacterName));
_wcscpy(Chat.wszChatMsg, CHATLENMAX, pwszChatMsg, (int)wcslen(pwszChatMsg));
AddSendData(MAGA_PRIVATECHANNELCHAT, 0, (char*)&Chat, sizeof(Chat) - sizeof(Chat.wszChatMsg) + (wChatLen * 2));
}
#endif
void CDNGameConnection::SendNotice(const WCHAR * pMsg, const int nLen, int nShowSec)
{
MANotice packet;
memset(&packet, 0, sizeof(packet));
packet.Info.nNoticeType = _NOTICETYPE_WORLD;
packet.Info.nSlideShowSec = nShowSec;
_wcscpy(packet.wszNoticeMsg, CHATLENMAX, pMsg, (int)wcslen(pMsg));
packet.nLen = nLen;
AddSendData(MAGA_NOTICE, 0, (char*)&packet, sizeof(MANotice) - sizeof(packet.wszNoticeMsg) + (packet.nLen * sizeof(WCHAR)));
}
void CDNGameConnection::SendNoticeServer(int nManagedID, const WCHAR * pMsg, int nLen, int nShowSec)
{
MANotice packet;
memset(&packet, 0, sizeof(packet));
packet.Info.nNoticeType = _NOTICETYPE_EACHSERVER;
packet.Info.nManagedID = nManagedID;
packet.Info.nSlideShowSec = nShowSec;
_wcscpy(packet.wszNoticeMsg, CHATLENMAX, pMsg, (int)wcslen(pMsg));
packet.nLen = nLen;
AddSendData(MAGA_NOTICE, 0, (char*)&packet, sizeof(MANotice) - sizeof(packet.wszNoticeMsg) + (packet.nLen * sizeof(WCHAR)));
}
void CDNGameConnection::SendNoticeCancel()
{
AddSendData(MAGA_CANCELNOTICE, 0, NULL, 0);
}
// ġƮ<C4A1><C6AE><EFBFBD><EFBFBD>
void CDNGameConnection::SendResRecall( CDNUser* pRecallUser, const VIMAReqRecall* pPacket, const int iRecallMapIndex )
{
MAGAResRecall TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = pPacket->uiAccountDBID;
TxPacket.uiRecallAccountDBID = pRecallUser->GetAccountDBID();
TxPacket.uiRecallChannelID = pPacket->uiRecallChannelID;
TxPacket.iRecallMapIndex = iRecallMapIndex;
#if defined(PRE_ADD_MULTILANGUAGE)
TxPacket.cRecallerSelectedLang = pPacket->cCallerSelectedLang;
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
AddSendData( MAGA_RESRECALL, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendUserRestraint(UINT nAccountDBID)
{
MARestraint packet;
memset(&packet, 0, sizeof(MARestraint));
packet.nAccountDBID = nAccountDBID;
AddSendData(MAGA_RESTRAINT, 0, reinterpret_cast<char*>(&packet), sizeof(packet));
}
void CDNGameConnection::SendPvPGameMode( const CDNPvP* pPvPRoom )
{
MAGAPVP_GAMEMODE TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.iGameRoomID = pPvPRoom->GetGameServerRoomIndex();
TxPacket.uiPvPIndex = pPvPRoom->GetIndex();
TxPacket.uiPvPGameModeTableID = pPvPRoom->GetGameModeTableID();
TxPacket.uiWinCondition = pPvPRoom->GetGameModeWinCondition();
TxPacket.uiPlayTimeSec = pPvPRoom->GetGameModePlayTimeSec();
TxPacket.unGameModeCheck = pPvPRoom->GetGameModeCheck();
TxPacket.biSNMain = pPvPRoom->GetSNMain();
TxPacket.iSNSub = pPvPRoom->GetSNSub();
TxPacket.cIsPWRoom = pPvPRoom->bIsPWRoom() ? 1 : 0;
TxPacket.unRoomOptionBit = pPvPRoom->GetRoomOptionBit();
TxPacket.cMaxUser = static_cast<BYTE>(pPvPRoom->GetMaxUser());
TxPacket.nEventID = pPvPRoom->GetEventRoomIndex();
TxPacket.bIsGuildWar = pPvPRoom->GetIsGuildWarSystem();
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
TxPacket.cPvPChannelType = static_cast<char>(pPvPRoom->GetRoomChannelType());
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
AddSendData( MAGA_PVP_GAMEMODE, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
#if defined(PRE_ADD_PVP_TOURNAMENT)
void CDNGameConnection::SendPvPTournamentUserInfo( CDNPvP* pPvPRoom )
{
MAGAPVP_TOURNAMENT_INFO TxPacket;
memset(&TxPacket, 0, sizeof(TxPacket));
TxPacket.nGameRoomID = pPvPRoom->GetGameServerRoomIndex();
for( int i=0; i<PvPCommon::Common::PvPTournamentUserMax; ++i)
{
UINT uiAccountDBID = pPvPRoom->GetPvPTournamentIndex(i);
if( uiAccountDBID == 0)
break;
CDNUser * pUser = g_pDivisionManager->GetUserByAccountDBID(uiAccountDBID);
if( pUser )
{
TxPacket.sTournamentUserInfo[TxPacket.nCount].uiAccountDBID = uiAccountDBID;
TxPacket.sTournamentUserInfo[TxPacket.nCount].biCharacterDBID = pUser->GetCharacterDBID();
TxPacket.sTournamentUserInfo[TxPacket.nCount].cJob = pUser->GetUserJob();
TxPacket.sTournamentUserInfo[TxPacket.nCount].uiSessionID = pUser->GetSessionID();
_wcscpy( TxPacket.sTournamentUserInfo[TxPacket.nCount].wszCharName, NAMELENMAX, pUser->GetCharacterName(), (int)wcslen(pUser->GetCharacterName()) );
++TxPacket.nCount;
}
}
int nLen = sizeof(MAGAPVP_TOURNAMENT_INFO) - sizeof(TxPacket.sTournamentUserInfo) + (sizeof(STournamentUserInfo)*TxPacket.nCount);
AddSendData( MAGA_PVP_TOURNAMENT_INFO, 0, reinterpret_cast<char*>(&TxPacket), nLen);
}
#endif
void CDNGameConnection::SendPvPLadderGameMode( GAMASetRoomID* pPacket, const TPvPGameModeTable* pGameModeTable )
{
MAGAPVP_GAMEMODE TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.iGameRoomID = pPacket->iRoomID;
TxPacket.unGameModeCheck = PvPCommon::Check::AllCheck;
TxPacket.bIsLadderRoom = true;
TxPacket.uiPvPGameModeTableID = pGameModeTable->nItemID;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> StartID<49><44> <20>ȳ<EFBFBD><C8B3>Ƽ<EFBFBD> EndLog<6F><67> <20>̻<EFBFBD><CCBB>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD>..<2E><><EFBFBD><20><><EFBFBD><EFBFBD>
SYSTEMTIME st;
GetLocalTime( &st );
char szSN[MAX_PATH];
sprintf( szSN, "%.4d%.2d%.2d%.2d%.2d%.2d%.3d%", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds );
TxPacket.biSNMain = _atoi64( szSN );
sprintf( szSN, "%.2d%.2d%.4d", g_Config.nWorldSetID, pPacket->cVillageID, pPacket->iRoomID );
TxPacket.iSNSub = atoi( szSN );
TxPacket.uiWinCondition = pGameModeTable->vWinCondition[0];
TxPacket.uiPlayTimeSec = pGameModeTable->vPlayTimeSec[0];
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
TxPacket.cPvPChannelType = static_cast<char>(PvPCommon::RoomType::max);
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
AddSendData( MAGA_PVP_GAMEMODE, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendLadderObserver( int iGameRoomID, CDNUser* pUser )
{
MAGABreakIntoRoom TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.iGameRoomID = iGameRoomID;
TxPacket.cWorldSetID = g_Config.nWorldSetID;
TxPacket.cVillageID = pUser->GetVillageID();
TxPacket.uiAccountDBID = pUser->GetAccountDBID();
TxPacket.uiSessionID = pUser->GetSessionID();
TxPacket.biCharacterDBID = pUser->GetCharacterDBID();
TxPacket.uiTeam = PvPCommon::Team::Observer;
TxPacket.bAdult = pUser->IsAdult();
TxPacket.cPCBangGrade = pUser->GetPCBangGrade();
#if defined(PRE_ADD_MULTILANGUAGE)
TxPacket.cSelectedLanguage = pUser->m_eSelectedLanguage;
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
#if defined(_ID)
_strcpy(TxPacket.szMacAddress, _countof(TxPacket.szMacAddress), pUser->m_szMacAddress, (int)strlen(pUser->m_szMacAddress));
_strcpy(TxPacket.szKey, _countof(TxPacket.szKey), pUser->m_szKey, (int)strlen(pUser->m_szKey));
#endif
_wcscpy( TxPacket.wszAccountName, IDLENMAX, pUser->GetAccountName(), (int)wcslen(pUser->GetAccountName()) );
STRCPYW(TxPacket.wszCharacterName, NAMELENMAX, pUser->GetCharacterName());
AddSendData( MAGA_BREAKINTOROOM, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendPvPMemberGrade(UINT nAccountDBID, USHORT nTeam, UINT uiUserState, UINT nChangedSessionID, int nRetCode)
{
MAGAPvPMemberGrade packet;
memset(&packet, 0, sizeof(MAGAPvPMemberGrade));
packet.nAccountDBID = nAccountDBID;
packet.nTeam = nTeam;
packet.uiUserState = uiUserState;
packet.nChangedSessionID = nChangedSessionID;
packet.nRetCode = nRetCode;
AddSendData(MAGA_PVP_MEMBERGRADE, 0, reinterpret_cast<char*>(&packet), sizeof(packet));
}
void CDNGameConnection::SendPvPMemberIndex(USHORT nTeam, const GAMAPVPSwapMemberIndex * pIndex, int nRetCode)
{
MAGAPvPMemberIndex packet;
memset(&packet, 0, sizeof(MAGAPvPMemberIndex));
packet.nAccountDBID = pIndex->nAccountDBID;
packet.nRetCode = nRetCode;
packet.nTeam = nTeam;
packet.cCount = pIndex->cCount;
memcpy(packet.Index, pIndex->Index, sizeof(packet.Index));
AddSendData(MAGA_PVP_MEMBERINDEX, 0, reinterpret_cast<char*>(&packet), sizeof(packet) - sizeof(packet.Index) + (sizeof(TSwapMemberIndex) * packet.cCount));
}
void CDNGameConnection::SendPvPChangeUserState( const UINT nRoomID, const UINT uiAccountDBID, const UINT uiUserState )
{
MAGAPVPChangeUserState packet;
memset(&packet, 0, sizeof(MAGAPVPChangeUserState));
packet.nPvPRoomID = nRoomID;
packet.nAccountDBID = uiAccountDBID;
packet.uiUserState = uiUserState;
AddSendData(MAGA_PVP_MEMBERUSERSTATE, 0, reinterpret_cast<char*>(&packet), sizeof(packet));
}
void CDNGameConnection::SendBreakintoRoom( int iGameRoomID, CDNUser* pJoinUser, BreakInto::Type::eCode BreakIntoType, char cTeamSlotIndex /*= -1*/ )
{
MAGABreakIntoRoom TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.iGameRoomID = iGameRoomID;
TxPacket.cWorldSetID = g_Config.nWorldSetID;
TxPacket.cVillageID = pJoinUser->GetVillageID();
TxPacket.uiAccountDBID = pJoinUser->GetAccountDBID();
TxPacket.uiSessionID = pJoinUser->GetSessionID();
TxPacket.biCharacterDBID = pJoinUser->GetCharacterDBID();
TxPacket.uiTeam = pJoinUser->GetPvPTeam();
TxPacket.bAdult = pJoinUser->IsAdult();
TxPacket.cPCBangGrade = pJoinUser->GetPCBangGrade();
TxPacket.BreakIntoType = BreakIntoType;
TxPacket.bPvPFatigue = pJoinUser->GetPvPFatiue();
TxPacket.uiPvPUserState = pJoinUser->GetPvPUserState();
TxPacket.cPvPTeamIndex = cTeamSlotIndex;
#if defined(_ID)
_strcpy(TxPacket.szMacAddress, _countof(TxPacket.szMacAddress), pJoinUser->m_szMacAddress, (int)strlen(pJoinUser->m_szMacAddress));
_strcpy(TxPacket.szKey, _countof(TxPacket.szKey), pJoinUser->m_szKey, (int)strlen(pJoinUser->m_szKey));
#endif
_wcscpy( TxPacket.wszAccountName, IDLENMAX, pJoinUser->GetAccountName(), (int)wcslen(pJoinUser->GetAccountName()) );
STRCPYW(TxPacket.wszCharacterName, NAMELENMAX, pJoinUser->GetCharacterName());
AddSendData( MAGA_BREAKINTOROOM, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendPopulationZero(bool bZero)
{
MAGAZeroPopulation packet;
memset(&packet, 0, sizeof(packet));
packet.bZeroPopulation = bZero;
AddSendData(MAGA_ZEROPOPULATION, 0, (char*)&packet, sizeof(packet));
}
void CDNGameConnection::SendDetachUser(UINT nAccountDBID, bool bIsDuplicate, UINT nSessionID)
{
MADetachUser Detach;
memset(&Detach, 0, sizeof(MADetachUser));
Detach.nAccountDBID = nAccountDBID;
Detach.bIsDuplicate = bIsDuplicate;
Detach.nSessionID = nSessionID;
AddSendData(MAGA_DETACHUSER, 0, (char*)&Detach, sizeof(MADetachUser));
}
#if defined(_CH)
void CDNGameConnection::SendFCMState(UINT nAccountDBID, int nOnline, bool bSend)
{
MAFCMState State = { 0, };
State.nAccountDBID = nAccountDBID;
State.nOnlineMin = nOnline;
State.bSend = bSend;
AddSendData(MAGA_FCMSTATE, 0, (char*)&State, sizeof(MAFCMState));
g_Log.Log(LogType::_NORMAL, L"[ADBID:%u] MAGA_FCMSTATE Online:%d\r\n", nAccountDBID, nOnline);
}
#endif // _CH
void CDNGameConnection::SendNotifyMail(UINT nToAccountDBID, INT64 biToCharacterDBID, short wTotalMailCount, short wNotReadMailCount, short w7DaysLeftCount, bool bNewMail)
{
MANotifyMail Mail = { 0, };
Mail.nToAccountDBID = nToAccountDBID;
Mail.biToCharacterDBID = biToCharacterDBID;
Mail.wTotalMailCount = wTotalMailCount;
Mail.wNotReadMailCount = wNotReadMailCount;
Mail.w7DaysLeftCount = w7DaysLeftCount;
Mail.bNewMail = bNewMail;
AddSendData(MAGA_NOTIFYMAIL, 0, (char*)&Mail, sizeof(MANotifyMail));
}
void CDNGameConnection::SendNotifyMarket(UINT nSellerAccountDBID, INT64 biSellerCharacterDBID, int nItemID, short wCalculationCount)
{
MANotifyMarket Market = { 0, };
Market.nSellerAccountDBID = nSellerAccountDBID;
Market.biSellerCharacterDBID = biSellerCharacterDBID;
Market.nItemID = nItemID;
Market.wCalculationCount = wCalculationCount;
AddSendData(MAGA_NOTIFYMARKET, 0, (char*)&Market, sizeof(MANotifyMarket));
}
void CDNGameConnection::SendNotifyGift(UINT nToAccountDBID, INT64 biToCharacterDBID, bool bNew, int nGiftCount)
{
MANotifyGift Gift = { 0, };
Gift.nToAccountDBID = nToAccountDBID;
Gift.biToCharacterDBID = biToCharacterDBID;
Gift.bNew = bNew;
Gift.nGiftCount = nGiftCount;
AddSendData(MAGA_NOTIFYGIFT, 0, (char*)&Gift, sizeof(MANotifyGift));
}
void CDNGameConnection::SendDismissGuild(MADismissGuild* pPacket)
{
AddSendData(MAGA_DISMISSGUILD, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
void CDNGameConnection::SendAddGuildMember(MAAddGuildMember* pPacket)
{
AddSendData(MAGA_ADDGUILDMEMBER, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
void CDNGameConnection::SendDelGuildMember(MADelGuildMember* pPacket)
{
AddSendData(MAGA_DELGUILDMEMBER, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
void CDNGameConnection::SendChangeGuildInfo(MAChangeGuildInfo* pPacket)
{
AddSendData(MAGA_CHANGEGUILDINFO, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
void CDNGameConnection::SendChangeGuildMemberInfo(MAChangeGuildMemberInfo* pPacket)
{
AddSendData(MAGA_CHANGEGUILDMEMBERINFO, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
void CDNGameConnection::SendGuildChat(MAGuildChat* pPacket)
{
AddSendData(MAGA_GUILDCHAT, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
#ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT
void CDNGameConnection::SendDoorsGuildChat(MADoorsGuildChat* pPacket)
{
AddSendData(MAGA_GUILDCHAT_MOBILE, 0, reinterpret_cast<char*>(pPacket), sizeof(MADoorsGuildChat) - sizeof(pPacket->wszChatMsg) + (sizeof(WCHAR) * pPacket->nLen));
}
#endif //#ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT
void CDNGameConnection::SendGuildMemberLevelUp(MAGuildMemberLevelUp* pPacket)
{
AddSendData(MAGA_GUILDMEMBER_LEVELUP, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
void CDNGameConnection::SendChangeGuildName(MAGuildChangeName* pPacket)
{
AddSendData(MAGA_CHANGEGUILDNAME, 0, reinterpret_cast<char*>(pPacket), sizeof(MAGuildChangeName));
}
void CDNGameConnection::SendChangeGuildMark(MAGuildChangeMark* pPacket)
{
AddSendData(MAGA_CHANGEGUILDMARK, 0, reinterpret_cast<char*>(pPacket), sizeof(MAGuildChangeMark));
}
void CDNGameConnection::SendUpdateGuildExp(MAUpdateGuildExp* pPacket)
{
AddSendData(MAGA_UPDATEGUILDEXP, 0, reinterpret_cast<char*>(pPacket), sizeof(MAUpdateGuildExp));
}
void CDNGameConnection::SendEnrollGuildWar(MAEnrollGuildWar* pPacket)
{
AddSendData(MAGA_ENROLLGUILDWAR, 0, reinterpret_cast<char*>(pPacket), sizeof(MAEnrollGuildWar));
}
void CDNGameConnection::SendChangeGuildWarStep(MAChangeGuildWarStep* pPacket)
{
AddSendData(MAGA_CHANGE_GUILDWAR_STEP, 0, reinterpret_cast<char*>(pPacket), sizeof(MAChangeGuildWarStep));
}
void CDNGameConnection::SendSetGuildWarPoint(MASetGuildWarPoint* pPacket)
{
AddSendData(MAGA_SETGUILDWAR_POINT, 0, reinterpret_cast<char*>(pPacket), sizeof(MASetGuildWarPoint));
}
void CDNGameConnection::SendAddGuildWarPoint(MAAddGuildWarPoint* pPacket)
{
AddSendData(MAGA_ADDGUILDWAR_POINT, 0, reinterpret_cast<char*>(pPacket), sizeof(MAAddGuildWarPoint));
}
void CDNGameConnection::SendSetGuildWarSecretMission(MASetGuildWarSecretMission * pPacket)
{
AddSendData(MAGA_SETGUILDWAR_SECRETMISSION, 0, reinterpret_cast<char*>(pPacket), sizeof(MASetGuildWarSecretMission));
}
void CDNGameConnection::SendSetGuildwarFinalProcess(char cGuildFinalPart, __time64_t tBeginTime)
{
MASetGuildWarFinalProcess SetGuildWarFinalProcess;
memset(&SetGuildWarFinalProcess, 0, sizeof(MASetGuildWarFinalProcess));
SetGuildWarFinalProcess.cGuildFinalPart = cGuildFinalPart;
SetGuildWarFinalProcess.tBeginTime = tBeginTime;
AddSendData(MAGA_SETGUILDWAR_FINALPROCESS, 0, reinterpret_cast<char*>(&SetGuildWarFinalProcess), sizeof(MASetGuildWarFinalProcess));
}
void CDNGameConnection::SendSetGuildWarPreWinGuild(MAGuildWarPreWinGuild* pPacket)
{
AddSendData(MAGA_SETGUILDWAR_PRE_WIN_GUILD, 0, reinterpret_cast<char*>(pPacket), sizeof(MAGuildWarPreWinGuild));
}
void CDNGameConnection::SendSetGuildWarTournamentWin(MASetGuildWarTournamentWin* pPacket)
{
AddSendData(MAGA_SETGUILDWAR_TOURNAMENTWIN, 0, reinterpret_cast<char*>(pPacket), sizeof(MASetGuildWarTournamentWin));
}
void CDNGameConnection::SendSetGuildWarSchedule(MASetGuildWarEventTime* pPacket)
{
AddSendData(MAGA_SETGUILDWAR_EVENT_TIME, 0, reinterpret_cast<char*>(pPacket), sizeof(MASetGuildWarEventTime));
}
void CDNGameConnection::SendGuildRecruitMember(MAGuildRecruitMember* pPacket)
{
AddSendData(MAGA_GUILDRECRUIT_MEMBER, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
void CDNGameConnection::SendAddGuildRewardItem(MAGuildRewardItem* pPacket)
{
AddSendData(MAGA_GUILD_ADD_REWARDITEM, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
void CDNGameConnection::SendExtendGuildSize(MAExtendGuildSize* pPacket)
{
AddSendData(MAGA_GUILD_EXTEND_GUILDSIZE, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
void CDNGameConnection::SendUpdateGuildWare(int nGuildID)
{
MAUpdateGuildWare packet;
memset(&packet, 0, sizeof(MAUpdateGuildWare));
packet.GUildID.Set(g_Config.nWorldSetID, nGuildID);
AddSendData(MAGI_UPDATEGUILDWARE, 0, reinterpret_cast<char*>(&packet), sizeof(MAUpdateGuildWare));
}
void CDNGameConnection::SendChangeCharacterName(MAChangeCharacterName* pPacket)
{
AddSendData(MAGA_CHANGE_CHARACTERNAME, 0, reinterpret_cast<char*>(pPacket), sizeof(MAChangeCharacterName));
}
void CDNGameConnection::SendMasterSystemSyncSimpleInfo( UINT uiAccountDBID, INT64 biCharacterDBID, MasterSystem::EventType::eCode EventCode )
{
MasterSystem::MAGASyncSimpleInfo TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
TxPacket.biCharacterDBID = biCharacterDBID;
TxPacket.EventCode = EventCode;
AddSendData( MAGA_MASTERSYSTEM_SYNC_SIMPLEINFO, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendMasterSystemSyncJoin( UINT uiAccountDBID, INT64 biCharacterDBID, bool bIsAddPupil )
{
MasterSystem::MAGASyncJoin TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
TxPacket.biCharacterDBID = biCharacterDBID;
TxPacket.bIsAddPupil = bIsAddPupil;
AddSendData( MAGA_MASTERSYSTEM_SYNC_JOIN, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendMasterSystemSyncLeave( UINT uiAccountDBID, INT64 biCharacterDBID, bool bIsDelPupil )
{
MasterSystem::MAGASyncLeave TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
TxPacket.biCharacterDBID = biCharacterDBID;
TxPacket.bIsDelPupil = bIsDelPupil;
AddSendData( MAGA_MASTERSYSTEM_SYNC_LEAVE, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendMasterSystemSyncGraduate( UINT uiAccountDBID, MasterSystem::VIMASyncGraduate* pPacket )
{
MasterSystem::MAGASyncGraduate TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
_wcscpy( TxPacket.wszCharName, NAMELENMAX, pPacket->wszCharName, (int)wcslen(pPacket->wszCharName) );
AddSendData( MAGA_MASTERSYSTEM_SYNC_GRADUATE, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendMasterSystemSyncConnect( UINT uiAccountDBID, bool bIsConnect, WCHAR* pwszCharName )
{
MasterSystem::MAGASyncConnect TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
TxPacket.bIsConnect = bIsConnect;
_wcscpy( TxPacket.wszCharName, NAMELENMAX, pwszCharName, (int)wcslen(pwszCharName) );
AddSendData( MAGA_MASTERSYSTEM_SYNC_CONNECT, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendFarmSync( UINT uiAccountDBID, INT64 biCharacterDBID, Farm::ServerSyncType::eType Type )
{
MAGAFarmSync TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
TxPacket.biCharacterDBID = biCharacterDBID;
TxPacket.Type = Type;
AddSendData( MAGA_FARM_SYNC, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendFarmSyncAddWater( UINT uiAccountDBID, WCHAR* pwszCharName, int iAddWaterPoint )
{
MAGAFarmSyncAddWater TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
TxPacket.iAddPoint = iAddWaterPoint;
_wcscpy( TxPacket.wszCharName, NAMELENMAX, pwszCharName, (int)wcslen(pwszCharName) );
AddSendData( MAGA_FARM_SYNC_ADDWATER, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
void CDNGameConnection::SendSyncSystemMail( UINT uiAccountDBID, VIMASyncSystemMail* pMail )
{
MAGASyncSystemMail TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
TxPacket.nMailDBID = pMail->nMailDBID;
TxPacket.iTotalMailCount = pMail->iTotalMailCount;
TxPacket.iNotReadMailCount = pMail->iNotReadMailCount;
TxPacket.i7DaysLeftMailCount = pMail->i7DaysLeftMailCount;
AddSendData( MAGA_SYNC_SYSTEMMAIL, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
int CDNGameConnection::_ProcessRebirthVillage( CDNUser* pUser, const int iLastVillageMapIndex )
{
char szIp[IPLENMAX] = { 0, };
USHORT nPort = 0;
int nChannel = 0;
BYTE cVillageID = 0;
if( g_pDivisionManager )
{
if( g_pDivisionManager->GetVillageInfo( iLastVillageMapIndex, pUser->GetChannelID(), nChannel, cVillageID, szIp, nPort ) )
{
if( g_pDivisionManager->GameToVillage( this, pUser->GetAccountDBID(), cVillageID, nChannel) )
SendRebirthVillageInfo( pUser->GetAccountDBID(), cVillageID, pUser->GetChannelID(), szIp, nPort, ERROR_NONE );
else
SendRebirthVillageInfo( pUser->GetAccountDBID(), cVillageID, pUser->GetChannelID(), szIp, nPort, ERROR_GENERIC_VILLAGECON_NOT_FOUND );
return ERROR_NONE;
}
}
SendRebirthVillageInfo( pUser->GetAccountDBID(), 0, 0, szIp, nPort, ERROR_GENERIC_VILLAGECON_NOT_FOUND );
return ERROR_GENERIC_UNKNOWNERROR;
}
void CDNGameConnection::SendPCBangResult(UINT nAccountDBID, CDNUser *pUser)
{
MAPCBangResult Result;
memset(&Result, 0, sizeof(MAPCBangResult));
Result.nAccountDBID = nAccountDBID;
if (pUser){
#if defined(_KR)
Result.cResult = pUser->m_cPCBangResult;
Result.cAuthorizeType = pUser->m_cPCBangAuthorizeType;
Result.cOption = pUser->m_cPCBangOption;
Result.nArgument = pUser->m_nPCBangArgument;
Result.bShutdowned = pUser->m_bShutdowned;
Result.cPolicyError = pUser->m_cPolicyError;
Result.nShutdownTime = pUser->m_nShutdownTime;
#else // #if defined(_KR)
#if defined(_ID)
Result.bBlockPcCafe = pUser->m_bBlockPcCafe;
#endif // #if defined(_ID)
Result.cPCBangGrade = pUser->GetPCBangGrade();
#if defined(_KRAZ)
Result.ShutdownData = pUser->m_ShutdownData;
#endif // #if defined(_KRAZ)
#endif // #if defined(_KR)
}
AddSendData(MAGA_PCBANGRESULT, 0, (char*)&Result, sizeof(MAPCBangResult));
}
#if defined(PRE_ADD_REMOTE_QUEST)
void CDNGameConnection::SendUserTempDataResult(UINT uiAccountDBID, CDNUser *pUser)
{
if(!pUser) return;
MAGAUserTempDataResult packet;
memset(&packet, 0, sizeof(packet));
packet.uiAccountDBID = uiAccountDBID;
packet.nDungeonClearCount = pUser->GetDungeonClearCount();
#if defined(PRE_ADD_GAMEQUIT_REWARD)
packet.eUserGameQuitRewardType = pUser->GetUserGameQuitRewardType();
#endif // #if defined(PRE_ADD_GAMEQUIT_REWARD)
#if defined(PRE_ADD_REMOTE_QUEST)
pUser->GetAcceptWaitRemoteQuest(&packet.nAcceptWaitRemoteQuestCount, packet.AcceptWaitRemoteQuestList);
#endif
AddSendData(MAGA_USERTEMPDATA_RESULT, 0, (char*)&packet, sizeof(MAGAUserTempDataResult) - sizeof(packet.AcceptWaitRemoteQuestList) + sizeof(int) * packet.nAcceptWaitRemoteQuestCount );
}
#else
#if defined(PRE_ADD_GAMEQUIT_REWARD)
void CDNGameConnection::SendUserTempDataResult(UINT uiAccountDBID, int nDungeonClearCount, GameQuitReward::RewardType::eType eUserGameQuitRewardType)
#else // #if defined(PRE_ADD_GAMEQUIT_REWARD)
void CDNGameConnection::SendUserTempDataResult(UINT uiAccountDBID, int nDungeonClearCount)
#endif // #if defined(PRE_ADD_GAMEQUIT_REWARD)
{
MAGAUserTempDataResult packet;
memset(&packet, 0, sizeof(packet));
packet.uiAccountDBID = uiAccountDBID;
packet.nDungeonClearCount = nDungeonClearCount;
#if defined(PRE_ADD_GAMEQUIT_REWARD)
packet.eUserGameQuitRewardType = eUserGameQuitRewardType;
#endif
AddSendData(MAGA_USERTEMPDATA_RESULT, 0, (char*)&packet, sizeof(MAGAUserTempDataResult));
}
#endif //#if defined(PRE_ADD_REMOTE_QUEST)
void CDNGameConnection::SendCheckLastDungeonInfo( char cWorldSetID, const VIMACheckLastDungeonInfo* pPacket )
{
MAGACheckLastDungeonInfo TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.cWorldSetID = cWorldSetID;
TxPacket.uiAccountDBID = pPacket->uiAccountDBID;
TxPacket.biCharacterDBID = pPacket->biCharacterDBID;
TxPacket.iRoomID = pPacket->iRoomID;
AddSendData( MAGA_CHECK_LASTDUNGEONINFO, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNGameConnection::SendDeleteBackupDungeonInfo( UINT uiAccountDBID, INT64 biCharacterDBID, int iRoomID )
{
MAGADeleteBackupDungeonInfo TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiAccountDBID = uiAccountDBID;
TxPacket.biCharacterDBID = biCharacterDBID;
TxPacket.iRoomID = iRoomID;
AddSendData( MAGA_DELETE_BACKUPDUNGEONINFO, 0, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
#if defined( PRE_WORLDCOMBINE_PARTY )
void CDNGameConnection::SendGetWorldPartyMember( MAGetWorldPartyMember *Packet)
{
AddSendData(MAGA_GET_WORLDPARTYMEMBER, 0, reinterpret_cast<char*>(Packet), sizeof(MAGetWorldPartyMember));
}
#endif
#if defined( PRE_ADD_BESTFRIEND )
void CDNGameConnection::SendCancelBestFriend(MACancelBestFriend* pPacket)
{
AddSendData(MAGA_CANCEL_BESTFRIEND, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendCloseBestFriend(MACloseBestFriend* pPacket)
{
AddSendData(MAGA_CLOSE_BESTFRIEND, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendLevelBestFriend(MALevelUpBestFriend* pPacket)
{
AddSendData(MAGA_LEVELUP_BESTFRIEND, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
void CDNGameConnection::SendPrivateChatChannelAdd(MAAddPrivateChannel* pPacket)
{
AddSendData(MAGA_PRIVATECHATCHANNEL_ADD, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendPrivateChatChannelMemberAdd(MAAddPrivateChannelMember* pPacket)
{
AddSendData(MAGA_PRIVATECHATCHANNEL_MEMBERADD, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendPrivateChatChannelMemberInvite(MAInvitePrivateChannelMember* pPacket)
{
AddSendData(MAGA_PRIVATECHATCHANNEL_MEMBERINVITE, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendPrivateChatChannelMemberInviteResult(MAInvitePrivateChannelMemberResult* pPacket)
{
AddSendData(MAGA_PRIVATECHATCHANNEL_MEMBERINVITERESULT, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendPrivateChatChannelMemberDel(MADelPrivateChannelMember* pPacket)
{
AddSendData(MAGA_PRIVATECHATCHANNEL_MEMBERDEL, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendPrivateChatChannelMemberKickResult(MAKickPrivateChannelMemberResult* pPacket)
{
AddSendData(MAGA_PRIVATECHATCHANNEL_MEMBERKICKRESULT, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendPrivateChatChannelMod(MAModPrivateChannel* pPacket)
{
AddSendData(MAGA_PRIVATECHATCHANNEL_MOD, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendPrivateChatChannelModMemberName(MAModPrivateChannelMemberName* pPacket)
{
AddSendData(MAGA_PRIVATECHATCHANNEL_MODMEMBERNAME, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
#endif
#if defined( PRE_ADD_PVP_COMBOEXERCISE )
void CDNGameConnection::SendChangeRoomMaster( UINT uiRoomID, INT64 biRoomMasterCharacterDBID, UINT uiRoomMasterSessionID )
{
MAGAChangeRoomMaster Packet;
memset(&Packet, 0, sizeof(MAGAChangeRoomMaster));
Packet.uiRoomID = uiRoomID;
Packet.biRoomMasterCharacterDBID = biRoomMasterCharacterDBID;
Packet.uiRoomMasterSessionID = uiRoomMasterSessionID;
AddSendData(MAGA_PVP_CHANGEROOMMASTER, 0, reinterpret_cast<char*>(&Packet), sizeof(Packet));
}
#endif // #if defined( PRE_ADD_PVP_COMBOEXERCISE )
#if defined(PRE_ADD_MUTE_USERCHATTING)
void CDNGameConnection::SendMuteUserChatting(MAMuteUserChat* pPacket)
{
AddSendData(MAGA_MUTE_USERCHAT, 0, reinterpret_cast<char*>(pPacket), sizeof(*pPacket));
}
#endif // #if defined(PRE_ADD_MUTE_USERCHATTING)
#if defined( PRE_ALTEIAWORLD_EXPLORE )
void CDNGameConnection::SendAlteiaWorldSendTicket( MAAlteiaWorldSendTicket *pPacket )
{
AddSendData(MAGA_ALTEIAWORLD_SENDTICKET, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendAlteiaWorldSendTicketResult( MAAlteiaWorldSendTicketResult *pPacket )
{
AddSendData(MAGA_ALTEIAWORLD_SENDTICKET_RESULT, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
#endif
#if defined(PRE_ADD_CHNC2C)
void CDNGameConnection::SendC2CAddCoin( UINT uiAccountDBID, INT64 biCharacterDBID, INT64 biAddCoin, const char* szSeqID, const char* szBookID )
{
MAC2CAddCoin packet = {0,};
packet.uiAccountDBID = uiAccountDBID;
packet.biCharacterDBID = biCharacterDBID;
packet.biAddCoin = biAddCoin;
memcpy(packet.szBookID, szBookID, sizeof(packet.szBookID));
memcpy(packet.szSeqID, szSeqID, sizeof(packet.szSeqID));
AddSendData(MAGA_C2C_CHAR_ADDCOIN, 0, (char*)&packet, sizeof(packet));
}
void CDNGameConnection::SendC2CReduceCoin( UINT uiAccountDBID, INT64 biCharacterDBID, INT64 biReduceCoin, const char* szSeqID, const char* szBookID )
{
MAC2CReduceCoin packet = {0,};
packet.uiAccountDBID = uiAccountDBID;
packet.biCharacterDBID = biCharacterDBID;
packet.biReduceCoin = biReduceCoin;
memcpy(packet.szBookID, szBookID, sizeof(packet.szBookID));
memcpy(packet.szSeqID, szSeqID, sizeof(packet.szSeqID));
AddSendData(MAGA_C2C_CHAR_REDUCECOIN, 0, (char*)&packet, sizeof(packet));
}
#endif //#if defined(PRE_ADD_CHNC2C)
#if defined(PRE_ADD_DWC)
void CDNGameConnection::SendAddDWCTeamMember(MAAddDWCTeamMember* pPacket)
{
AddSendData(MAGA_ADD_DWCTEAMMEMBER, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendLeaveDWCTeamMember(MALeaveDWCTeamMember* pPacket)
{
AddSendData(MAGA_DEL_DWCTEAMMEMB, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendDismissDWCTeam(MADismissDWCTeam* pPacket)
{
AddSendData(MAGA_DISMISS_DWCTEAM, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendChangeDWCTeamMemberState(MAChangeDWCTeamMemberState* pPacket)
{
AddSendData(MAGA_CHANGE_DWCTEAMMEMB_STATE, 0, reinterpret_cast<char*>(pPacket), sizeof((*pPacket)));
}
void CDNGameConnection::SendDWCTeamChat(char cType, UINT nToAccountDBID, const WCHAR *pwszFromCharacterName, const WCHAR *pwszChatMsg, short wChatLen)
{
MAChat Chat = { 0, };
Chat.nAccountDBID = nToAccountDBID;
Chat.cType = cType;
Chat.wChatLen = wChatLen;
if (pwszFromCharacterName)
_wcscpy(Chat.wszFromCharacterName, NAMELENMAX, pwszFromCharacterName, (int)wcslen(pwszFromCharacterName));
if (pwszChatMsg)
_wcscpy(Chat.wszChatMsg, CHATLENMAX, pwszChatMsg, (int)wcslen(pwszChatMsg));
AddSendData(MAGA_DWC_TEAMCHAT, 0, (char*)&Chat, sizeof(MAChat) - sizeof(Chat.wszChatMsg) + (wChatLen*sizeof(WCHAR)) );
}
#endif