2024-12-21 10:04:04 +08:00
|
|
|
|
|
|
|
|
|
|
#include "Stdafx.h"
|
|
|
|
|
|
#include "DNDoorsConnection.h"
|
|
|
|
|
|
#include "DNIocpManager.h"
|
|
|
|
|
|
#include "Log.h"
|
|
|
|
|
|
#include "Util.h"
|
|
|
|
|
|
#include "DNServerPacket.h"
|
|
|
|
|
|
#include "DNDoorsPacket.h"
|
|
|
|
|
|
#include "DNUser.h"
|
|
|
|
|
|
#include "DNDivisionManager.h"
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_ADD_DOORS)
|
|
|
|
|
|
|
|
|
|
|
|
extern TMasterConfig g_Config;
|
|
|
|
|
|
CDNDoorsConnection * g_pDoorsConnection = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
CDNDoorsConnection::CDNDoorsConnection() : m_dwReconnectTick(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)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDNDoorsConnection::~CDNDoorsConnection()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDNDoorsConnection::MessageProcess(int iMainCmd, int iSubCmd, char * pData, int iLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (iMainCmd)
|
|
|
|
|
|
{
|
|
|
|
|
|
case DoorsProtocol::DDN_CHAT:
|
|
|
|
|
|
{
|
|
|
|
|
|
TDoorsChat * pPacket = (TDoorsChat*)pData;
|
|
|
|
|
|
|
|
|
|
|
|
if (pPacket->cNameCount >= NAMELENMAX || pPacket->nMessageCount >= CHATLENMAX)
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT_MSG(L"DoorsChat string overflow");
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WCHAR wszName[NAMELENMAX];
|
|
|
|
|
|
WCHAR wszMessage[CHATLENMAX];
|
|
|
|
|
|
memset(wszName, 0, sizeof(wszName));
|
|
|
|
|
|
memset(wszMessage, 0, sizeof(wszMessage));
|
|
|
|
|
|
|
|
|
|
|
|
_wcscpy(wszName, NAMELENMAX, pPacket->wszMessage, pPacket->cNameCount);
|
|
|
|
|
|
_wcscpy(wszMessage, CHATLENMAX, pPacket->wszMessage + pPacket->cNameCount, pPacket->nMessageCount);
|
|
|
|
|
|
|
|
|
|
|
|
if (g_pDivisionManager)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (g_pDivisionManager->DoorsChat(wszName, pPacket->biDestCharacterID, wszMessage, pPacket->nMessageCount))
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT
|
|
|
|
|
|
case DoorsProtocol::DDN_GUILDCHAT:
|
|
|
|
|
|
{
|
|
|
|
|
|
TDoorsGuildChat * pPacket = (TDoorsGuildChat*)pData;
|
|
|
|
|
|
|
|
|
|
|
|
if (pPacket->cNameCount >= NAMELENMAX || pPacket->nMessageCount >= CHATLENMAX)
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT_MSG(L"DoorsChat string overflow");
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WCHAR wszMessage[CHATLENMAX];
|
|
|
|
|
|
memset(wszMessage, 0, sizeof(wszMessage));
|
|
|
|
|
|
_wcscpy(wszMessage, CHATLENMAX, pPacket->wszMessage + pPacket->cNameCount, pPacket->nMessageCount);
|
|
|
|
|
|
|
|
|
|
|
|
if (g_pDivisionManager)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (g_pDivisionManager->DoorsGuildChat(pPacket->biSrcCharacterID, pPacket->nGuildID, wszMessage, pPacket->nMessageCount))
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PRE_ADD_DOORS_SELFKICK
|
|
|
|
|
|
case DoorsProtocol::DDN_SELFKICK:
|
|
|
|
|
|
{
|
|
|
|
|
|
TDoorsSelfKick * pPacket = (TDoorsSelfKick*)pData;
|
|
|
|
|
|
|
|
|
|
|
|
if (pPacket->nAccountID <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_DOORSLOG, L"Doors DetachUser Invalid Request [ADBID:%d][CHDBID:%I64d\n", pPacket->nAccountID, pPacket->biCharacterID);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (g_pDivisionManager)
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNUser * pUser = g_pDivisionManager->GetUserByAccountDBID(pPacket->nAccountID);
|
|
|
|
|
|
if (pUser)
|
|
|
|
|
|
g_pDivisionManager->SendDetachUser(pPacket->nAccountID);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> ij<><C4B3>â<EFBFBD><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3>â Ÿ<>ֿ̹<CCB9> <20>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
g_pDivisionManager->SendAllLoginServerDetachUser(pPacket->nAccountID);
|
|
|
|
|
|
g_Log.Log(LogType::_DOORSLOG, pUser, L"Doors DetachUser Request [ADBID:%d]\n", pPacket->nAccountID);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_DANGER_POINT_MSG(L"Doors SelfKick User Not Found");
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#ifdef PRE_ADD_DOORS_SELFKICK
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_UNKNOWN_HEADER;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNDoorsConnection::Reconnect(DWORD CurTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_wPort == 0) return;
|
|
|
|
|
|
if (m_dwReconnectTick + 5000 < CurTick){
|
|
|
|
|
|
m_dwReconnectTick = CurTick;
|
|
|
|
|
|
|
|
|
|
|
|
if (!GetActive() && !GetConnecting() )
|
|
|
|
|
|
{
|
|
|
|
|
|
SetConnecting(true);
|
|
|
|
|
|
if (g_pIocpManager->AddConnectionEx(this, CONNECTIONKEY_DOORS, m_szIP, m_wPort) < 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
SetConnecting(false);
|
|
|
|
|
|
g_Log.Log(LogType::_FILEDBLOG, L"DoorsServer Fail(%S, %d)\r\n", m_szIP, m_wPort);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
g_Log.Log(LogType::_FILEDBLOG, L"DoorsServer(%S, %d) Connecting..\r\n", m_szIP, m_wPort);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNDoorsConnection::SendRegist(char cWorldID, const char * pszIP, int nPort, const char * pszIP2, int nPort2)
|
|
|
|
|
|
{
|
|
|
|
|
|
TDNDRegist packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TDNDRegist));
|
|
|
|
|
|
|
|
|
|
|
|
packet.cWorldID = cWorldID;
|
|
|
|
|
|
_strcpy(packet.szIP, IPLENMAX, pszIP, (int)strlen(pszIP));
|
|
|
|
|
|
packet.nPort = nPort;
|
|
|
|
|
|
_strcpy(packet.szIP2, IPLENMAX, pszIP2, (int)strlen(pszIP2));
|
|
|
|
|
|
packet.nPort2 = nPort2;
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(DoorsProtocol::DND_REGIST, 0, reinterpret_cast<char*>(&packet), sizeof(TDNDRegist));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDNDoorsConnection::SendChatToDoors(CDNUser * pUser, INT64 biDestCharacterDBID, const WCHAR * pMessage, int nLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pMessage == NULL) return false;
|
|
|
|
|
|
|
|
|
|
|
|
TDoorsChat packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TDoorsChat));
|
|
|
|
|
|
|
|
|
|
|
|
packet.cWorldID = static_cast<char>(g_Config.nWorldSetID);
|
|
|
|
|
|
packet.biSrcCharacterID = pUser->GetCharacterDBID();
|
|
|
|
|
|
packet.biDestCharacterID = biDestCharacterDBID;
|
|
|
|
|
|
packet.cNameCount = static_cast<unsigned char>(wcslen(pUser->GetCharacterName()));
|
|
|
|
|
|
packet.nMessageCount = static_cast<unsigned char>(nLen);
|
|
|
|
|
|
|
|
|
|
|
|
_wcscpy(packet.wszMessage, NAMELENMAX + CHATLENMAX, pUser->GetCharacterName(), packet.cNameCount);
|
|
|
|
|
|
_wcscpy(packet.wszMessage + packet.cNameCount, NAMELENMAX + CHATLENMAX - packet.cNameCount, pMessage, packet.nMessageCount);
|
|
|
|
|
|
|
|
|
|
|
|
return AddSendData(DoorsProtocol::DND_CHAT, 0, reinterpret_cast<char*>(&packet), sizeof(TDoorsChat) - sizeof(packet.wszMessage) + ((packet.cNameCount + packet.nMessageCount) * sizeof(wchar_t))) < 0 ? false : true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT
|
|
|
|
|
|
bool CDNDoorsConnection::SendGuildChatToDoors(CDNUser * pUser, int nGuildID, const WCHAR * pMessage, int nLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pMessage == NULL || nLen == 0) return false;
|
|
|
|
|
|
|
|
|
|
|
|
TDoorsGuildChat packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TDoorsGuildChat));
|
|
|
|
|
|
|
|
|
|
|
|
packet.cWorldID = static_cast<char>(g_Config.nWorldSetID);
|
|
|
|
|
|
packet.nGuildID = nGuildID;
|
|
|
|
|
|
packet.biSrcCharacterID = pUser->GetCharacterDBID();
|
|
|
|
|
|
packet.cNameCount = static_cast<unsigned char>(wcslen(pUser->GetCharacterName()));
|
|
|
|
|
|
packet.nMessageCount = static_cast<unsigned char>(nLen);
|
|
|
|
|
|
|
|
|
|
|
|
_wcscpy(packet.wszMessage, NAMELENMAX + CHATLENMAX, pUser->GetCharacterName(), packet.cNameCount);
|
|
|
|
|
|
_wcscpy(packet.wszMessage + packet.cNameCount, NAMELENMAX + CHATLENMAX - packet.cNameCount, pMessage, packet.nMessageCount);
|
|
|
|
|
|
|
|
|
|
|
|
return AddSendData(DoorsProtocol::DND_GUILDCHAT, 0, reinterpret_cast<char*>(&packet), sizeof(TDoorsChat) - sizeof(packet.wszMessage) + ((packet.cNameCount + packet.nMessageCount) * sizeof(wchar_t))) < 0 ? false : true;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#ifdef PRE_ADD_DOORS_GUILDCHAT_DISCONNECT
|
|
|
|
|
|
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_DOORS)
|