Restructure repository to include all source folders

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>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,92 @@
#include "stdafx.h"
#include "AdminToolDispatch.h"
#include < Network/Packet/PacketBase.h >
#include < Network/Packet/WrapPacket.h >
#include < Network/XORCrypt/XORCrypt.h >
#include < Utility/Compress/MiniLZO/miniLZOWrapper.h >
#include < Log/ServerLog.h >
bool CClientMultiThreadDispatch::ParsePacket( char* const lpStream_In, unsigned long* dwStreamSize_InOut )
{
CXORCrypt& Crypt = CXORCrypt::GetInstance();
PktBase* lpPktBase = NULL;
char* lpBufferPos = lpStream_In;
unsigned long dwStreamSize = *dwStreamSize_InOut;
unsigned long dwDecompressedSize = 0;
char szDecompressedPacket[PktMaxLen] = "";
while(dwStreamSize >= sizeof(PktBase))
{
lpPktBase = reinterpret_cast<PktBase*>(lpBufferPos);
// 패킷 헤더가 vaild한지 확인한다. invalid한 경우는 그냥 끊어버린다.
if(StartBit != lpPktBase->GetStartBit())
{
PktBase::CMDType cCmd = lpPktBase->GetCmd();
Crypt.DecodeHeader(reinterpret_cast<char*>(&cCmd), 1, 0, 0);
//LogErrorPacket("패킷 헤더의 시작 비트가 잘못되었습니다.", cCmd);
return false;
}
// 패킷 헤더 디코딩
Crypt.DecodeHeader(lpBufferPos + 1, sizeof(PktBase) - 1, 0, 0);
// 헤더 길이 얻어 오기.
const PktBase::CMDType nPacketCMD = lpPktBase->GetCmd();
const PktBase::LengthType nPacketLength = lpPktBase->GetLen();
if(dwStreamSize < nPacketLength)
{
// 전체 스트림 사이즈가 파싱을 하기에는 모자람. 다시 인코딩 한 후 다음 턴을 기다림
Crypt.EncodeHeader(lpBufferPos + 1, sizeof(PktBase) - 1, 0, 0);
break;
}
else
{
// 패킷 디코딩.
if(lpPktBase->IsCrypt())
{
Crypt.DecodePacket(lpBufferPos + sizeof(PktBase),
nPacketLength - sizeof(PktBase), lpPktBase->GetCodePage());
}
// 패킷 압축 해제.
if(lpPktBase->IsCompress())
{
// 압축 지원하지 않음..
// return false;
dwDecompressedSize = PktMaxLen - sizeof(PktBase);
memcpy(szDecompressedPacket, lpPktBase, sizeof(PktBase));
// 로컬 버퍼에서 압축 해제.
if(!CMiniLZO::Decompress(lpBufferPos + sizeof(PktBase), nPacketLength - sizeof(PktBase),
szDecompressedPacket + sizeof(PktBase), &dwDecompressedSize))
{
//LogErrorPacket("패킷 압축 해제에 실패했습니다.", nPacketCMD);
return false;
}
// lpPktBase를 로컬 버퍼로 세팅.
lpPktBase = reinterpret_cast<PktBase*>(szDecompressedPacket);
lpPktBase->SetLen(static_cast<PktBase::LengthType>(dwDecompressedSize + sizeof(PktBase)));
}
if(!DispatchPacket(lpPktBase))
{
// 패킷 파싱에 실패. 세션을 종료한다.
return false;
}
dwStreamSize -= nPacketLength;
lpBufferPos += nPacketLength;
}
}
*dwStreamSize_InOut -= dwStreamSize;
return true;
}

View File

@@ -0,0 +1,63 @@
#ifndef _ADMIN_TOOL_DISPATCH_H_
#define _ADMIN_TOOL_DISPATCH_H_
struct PktBase;
class CSingleSession;
class CWnd;
class CPacketToolDispatch
{
public:
// Desc: 세션에서 받은 데이터로 패킷을 생성한다.
// Input: const char* lpStream_In : 세션에서 받은 데이터.
// size_t* nStreamSize_InOut : 받은 데이터의 크기.
// Output: size_t* nStreamSize_InOut : 처리된 데이터의 크기.
// 리턴값 : false 리턴 시 접속을 해제한다. (잘못된 패킷 존재 가능성 있음)
virtual bool ParsePacket(char* const lpStream_In, unsigned long* dwStreamSize_InOut) = 0;
// Desc: 생성한 패킷을 단일 스레드에서 처리한다.
// (CSession::Process 에서 매 펄스마다 호출한다.)
virtual bool SingleThreadDispatch(unsigned long dwCurrentTime) = 0;
// Desc: 자기 자신을 생성한다.
// Output: 리턴값 : 생성 실패시 NULL 리턴
virtual CPacketToolDispatch* Clone() = 0;
// Desc: 자기 자신을 소멸시킨다.
virtual void Destroy() = 0;
// Desc: 연결 종료시 처리할 내용을 넣는다.
virtual void Disconnected() = 0;
// Desc: 세션과의 상호참조를 위한 함수들.
inline void SetSession(CSingleSession* lpSession) { m_lpSession = lpSession; }
inline CSingleSession* GetSession() { return m_lpSession; }
virtual ~CPacketToolDispatch() { }
protected:
// Dispatcher의 생성자는 항상 Protected이어야 한다.
CPacketToolDispatch() : m_lpSession(0) { }
CSingleSession* m_lpSession;
};
class CClientMultiThreadDispatch : public CPacketToolDispatch
{
public:
CClientMultiThreadDispatch( ) { m_pDispatchWindow = NULL; }
virtual bool ParsePacket(char* const lpStream_In, unsigned long* dwStreamSize_InOut);
virtual bool SingleThreadDispatch(unsigned long dwCurrentTime) { return true; }
protected:
virtual bool DispatchPacket(PktBase* lpPktBase) = 0;
virtual ~CClientMultiThreadDispatch() { }
CWnd* m_pDispatchWindow;
};
#endif