Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
235 lines
5.1 KiB
C++
235 lines
5.1 KiB
C++
#include "Global.h"
|
|
#include <Nave/NFLog.h>
|
|
#include <Nave/NFStringUtil.h>
|
|
#include "GameConnection.h"
|
|
|
|
#include "DBComponent.h"
|
|
|
|
extern "C"
|
|
{
|
|
#include "MD5/global.h"
|
|
#include "MD5/md5.h"
|
|
}
|
|
|
|
|
|
using namespace NaveNet;
|
|
|
|
GameConnection::GameConnection(void)
|
|
{
|
|
// 함수를 Map으로 선언한다.
|
|
OnMsgMap[CMD] = &GameConnection::Parsed_CMD;
|
|
OnMsgMap[AUTHOR] = &GameConnection::Parsed_AUTHOR;
|
|
OnMsgMap[IPLIST] = &GameConnection::Parsed_Dummy;
|
|
OnMsgMap[BUYITEMINFO] = &GameConnection::Parsed_BUYITEMINFO;
|
|
OnMsgMap[IRC] = &GameConnection::Parsed_IRC;
|
|
|
|
}
|
|
|
|
GameConnection::~GameConnection(void)
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// 변수 초기화..
|
|
//////////////////////////////////////////////////////////////////////
|
|
void GameConnection::Clear()
|
|
{
|
|
m_SendPacket.Init();
|
|
}
|
|
|
|
void GameConnection::DispatchPacket(NFPacket& Packet)
|
|
{
|
|
// InterlockedExchange((LONG*)&g_iProcessPacket,g_iProcessPacket+1);
|
|
|
|
// 함수 호출
|
|
(this->*OnMsgMap[Packet.GetCommand()])(Packet.m_Packet, Packet.GetSize());
|
|
}
|
|
|
|
void GameConnection::OnConnect(BOOL bConnect)
|
|
{
|
|
if(bConnect)
|
|
{
|
|
LOG_IMPORTANT((L"[%04d] Connect User", GetIndex()));
|
|
|
|
g_UManager.Join(this);
|
|
}
|
|
}
|
|
|
|
void GameConnection::OnDisconnect()
|
|
{
|
|
g_UManager.Levae(GetIndex());
|
|
LOG_IMPORTANT((L"[%04d] Disconnect User", GetIndex()));
|
|
m_SendPacket.Init();
|
|
}
|
|
|
|
void GameConnection::Parsed_IRC(CHAR* Packet, int Len)
|
|
{
|
|
LPPKIRC pkIRC = (LPPKIRC)Packet;
|
|
|
|
CHAR Buff[DEF_PACKETSIZE];
|
|
ZeroMemory(Buff, sizeof(Buff));
|
|
sprintf(Buff, "%s : %s", pkIRC->Key, pkIRC->Message);
|
|
|
|
Nave::String strCmd = Nave::ToString(Buff);
|
|
LOG_IMPORTANT((strCmd.c_str()));
|
|
}
|
|
|
|
void GameConnection::Parsed_CMD(CHAR* Packet, int Len)
|
|
{
|
|
LPPKCMD lpPK = (LPPKCMD)Packet;
|
|
|
|
if(lpPK->dwCmd == CS_IPLIST)
|
|
Send_IPList();
|
|
}
|
|
|
|
void GameConnection::Parsed_AUTHOR(CHAR* Packet, int Len)
|
|
{
|
|
LPPKAUTHOR lpPK = (LPPKAUTHOR)Packet;
|
|
|
|
// DB와 연동하여 MD5값을 비교. 결과를 리턴한다.
|
|
m_dwServerType = LOWORD(lpPK->Type);
|
|
m_dwServerCH = HIWORD(lpPK->Type);
|
|
|
|
Nave::String strKey = Nave::ToString(lpPK->Key);
|
|
LOG_IMPORTANT((L"AUTHOR : %d(%d) : %s", m_dwServerType, m_dwServerCH, strKey.c_str()));
|
|
|
|
char sIP[32];
|
|
GetClientIP(sIP);
|
|
|
|
// 클라에서 날라온 정보를 DB에 적는다.
|
|
if(!DBComponent::CheckAuthCode(g_DBComp, lpPK->Key, sIP))
|
|
{
|
|
LOG_ERROR((L"CheckAuthCode Faild : %d(%d) %s, %s", m_dwServerType, m_dwServerCH, strKey.c_str(), sIP));
|
|
}
|
|
}
|
|
|
|
void GameConnection::Parsed_BUYITEMINFO(CHAR* Packet, int Len)
|
|
{
|
|
// 클라에서 날라온 정보를 DB에 적는다.
|
|
LPPKBUYITEMINFO lpPK = (LPPKBUYITEMINFO)Packet;
|
|
|
|
char* Buffer_Out = (char*)Packet+sizeof(PKBUYITEMINFO);
|
|
|
|
LPNFITEMINFO ipInfo = (LPNFITEMINFO)Buffer_Out;
|
|
|
|
for(int i = 0; i < lpPK->Count; ++i, ++ipInfo)
|
|
{
|
|
if(DBComponent::AddItemLog(g_DBComp, ipInfo->CreateID, ipInfo->UID, ipInfo->CID, ipInfo->ItemPrototypeID, ipInfo->Amount) )
|
|
{
|
|
// 이정보를 DB에 쓰면 된다.
|
|
LOG_IMPORTANT((L"[Item] ID:%d UID:%d CID:%d = %d", ipInfo->CreateID, ipInfo->UID, ipInfo->CID, ipInfo->ItemPrototypeID));
|
|
}
|
|
else
|
|
{
|
|
// 이정보를 DB에 쓰면 된다.
|
|
LOG_ERROR((L"[Item] FAILD ID:%d UID:%d CID:%d = %d", ipInfo->CreateID, ipInfo->UID, ipInfo->CID, ipInfo->ItemPrototypeID));
|
|
}
|
|
}
|
|
}
|
|
|
|
void GameConnection::Parsed_Dummy(CHAR* Packet, int Len)
|
|
{
|
|
|
|
}
|
|
|
|
void GameConnection::Send_IRC(const char* strCommand, const char* strMsg)
|
|
{
|
|
m_SendPacket.SetCommand(IRC);
|
|
m_SendPacket.SetSize(sizeof(PKIRC));
|
|
|
|
LPPKIRC lpIRC = (LPPKIRC)m_SendPacket.m_Packet;
|
|
|
|
|
|
MD5_CTX context;
|
|
unsigned char digest[16] ;
|
|
memset( digest, 0, sizeof( char ) * 16 ) ;
|
|
|
|
int len = strlen(strCommand);
|
|
|
|
char strMD5[64];
|
|
strcpy(strMD5, strCommand);
|
|
|
|
MD5Init(&context);
|
|
MD5Update(&context, reinterpret_cast<unsigned char *>(strMD5), len );
|
|
MD5Final(digest, &context);
|
|
|
|
for (int i = 0; i < 16; ++i)
|
|
{
|
|
sprintf(lpIRC->Key + i * 2, "%02x", digest[i]);
|
|
}
|
|
|
|
strcpy(lpIRC->Message, strMsg);
|
|
|
|
SendPost(m_SendPacket);
|
|
}
|
|
|
|
void GameConnection::Send_CMD(DWORD dwCmd, DWORD dwValue)
|
|
{
|
|
m_SendPacket.SetCommand(CMD);
|
|
m_SendPacket.SetSize(sizeof(PKCMD));
|
|
|
|
LPPKCMD lpPk = (LPPKCMD)m_SendPacket.m_Packet;
|
|
|
|
lpPk->dwCmd = dwCmd;
|
|
lpPk->dwValue = dwValue;
|
|
|
|
SendPost(m_SendPacket);
|
|
}
|
|
|
|
void GameConnection::Send_IPList()
|
|
{
|
|
m_SendPacket.SetCommand(IPLIST);
|
|
|
|
LPPKIPLIST lpPk = (LPPKIPLIST)m_SendPacket.m_Packet;
|
|
lpPk->Type = PKIPLIST::ALLOWIP;
|
|
lpPk->Page = 0;
|
|
|
|
int iCurCount = 0;
|
|
char cPage = 0;
|
|
int iCount = 0;
|
|
while(TRUE)
|
|
{
|
|
lpPk->Type = PKIPLIST::ALLOWIP;
|
|
lpPk->Page = ++cPage;
|
|
|
|
char* Buffer_Out = (char*)m_SendPacket.m_Packet+sizeof(PKIPLIST);
|
|
lpPk->Count = g_IPSec.SerializeOut(PKIPLIST::ALLOWIP, iCount, 100, Buffer_Out);
|
|
|
|
m_SendPacket.SetSize(sizeof(PKIPLIST)+(sizeof(IPINFO)*lpPk->Count));
|
|
|
|
iCurCount = lpPk->Count;
|
|
iCount += lpPk->Count;
|
|
|
|
SendPost(m_SendPacket);
|
|
|
|
if(iCurCount < 100)
|
|
break;
|
|
}
|
|
|
|
cPage = 0;
|
|
iCount = 0;
|
|
while(TRUE)
|
|
{
|
|
lpPk->Type = PKIPLIST::BLOCKIP;
|
|
lpPk->Page = ++cPage;
|
|
|
|
char* Buffer_Out = (char*)m_SendPacket.m_Packet+sizeof(PKIPLIST);
|
|
lpPk->Count = g_IPSec.SerializeOut(PKIPLIST::BLOCKIP, iCount, 100, Buffer_Out);
|
|
|
|
m_SendPacket.SetSize(sizeof(PKIPLIST)+(sizeof(IPINFO)*lpPk->Count));
|
|
|
|
iCurCount = lpPk->Count;
|
|
iCount += lpPk->Count;
|
|
|
|
SendPost(m_SendPacket);
|
|
|
|
if(iCurCount < 100)
|
|
break;
|
|
}
|
|
|
|
Send_CMD(SC_IPLISTEND, 0);
|
|
}
|
|
|
|
|
|
|