Files
LGram16 dd97ddec92 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>
2025-11-29 20:17:20 +09:00

451 lines
12 KiB
C++

#ifndef _CHAR_ITEM_PACKET_H_
#define _CHAR_ITEM_PACKET_H_
// CharItemPacket.h
// ItemStructure.h을 포함해야 함. (집기, 떨구기, )
#include <Item/ItemStructure.h>
#include <Network/Packet/PacketBase.h>
#include "CharItemPacketStruct.h"
#pragma pack(1)
// 집기 패킷 (응답 필요)
typedef struct PktPU* LPPktPU;
struct PktPU : public PktBase
{
unsigned long m_dwCharID; // 캐릭터 아이디
unsigned long m_dwObjectID; // 오브젝트 아이디
Item::ItemPos m_itemPos; // 아이템 위치
};
// 집기 패킷 Ack
typedef struct PktPUAck* LPPktPUAck;
struct PktPUAck : public PktBase
{
enum ObjectType { Item = 0, Gold = 1 };
enum PktPUAckError
{
SERVER_ERROR = 1,
FAIL_GET_CELL = 2,
FAIL_GET_ITEM = 3,
FAIL_PICKUP_INVEN = 4
};
unsigned long m_dwCharID; // 캐릭터 아이디
unsigned long m_dwObjectID; // 오브젝트 아이디
unsigned long m_dwSize; // Object크기(혹은 돈 양)
Item::ItemPos m_itemPos; // 아이템이 놓일 위치
unsigned char m_cType; // Object종류(아이템 혹은 돈)
unsigned char m_cNum; // 아이템 개수
};
// 집기 정보
typedef struct PktPUInfo PktPUInfo, *LPPktPUInfo;
struct PktPUInfo : public PktBase
{
unsigned long m_dwCharID; // 캐릭터 정보
unsigned long m_dwObjectID; // 오브젝트 아이디
};
// 떨구기 (응답 필요)
typedef struct PktPD* LPPktPD;
struct PktPD : public PktBase
{
unsigned long m_dwCharID; // 캐릭터 아이디
Item::ItemPos m_itemPos; // 아이템 위치 및 인덱스
unsigned char m_cNum; // 아이템 개수
};
// 떨구기 Ack
typedef struct PktPDAck* LPPktPDAck;
struct PktPDAck : public PktBase
{
enum PktPDAckError
{
SERVER_ERROR = 1,
FAIL_GET_CELL = 2,
FAIL_DROP_INVEN = 3,
FAIL_DROP_FIELD = 4,
FAIL_ZERO_ITEM = 5
};
unsigned long m_dwCharID; // 캐릭터 아이디
FieldObject m_FieldObject; // FieldObject
Item::ItemPos m_itemPos; // 아이템 위치 및 인덱스
};
// 떨구기 정보
typedef struct PktPDInfo* LPPktPDInfo;
struct PktPDInfo : public PktBase
{
unsigned long m_dwCharID;
FieldObject m_FieldObject;
};
// 셀 정보
typedef struct PktCeInfo* LPPktCeInfo;
struct PktCeInfo : public PktBase
{
unsigned char m_cObjectNum; // 오브젝트 개수
};
// 아이템 처리 패킷 (응답 필요)
typedef struct PktTI* LPPktTI;
struct PktTI : public PktBase
{
enum PktTIError
{
SERVER_ERROR = 1,
FAIL_MOVE = 2
};
unsigned long m_dwCharID; // 캐릭터 아이디
TakeType m_TakeType; // 아이템 집기 구조체
};
// 돈 처리 패킷 (응답 필요)
typedef struct PktTG* LPPktTG;
struct PktTG : public PktBase
{
enum PktTGError
{
SERVER_ERROR = 1,
FAIL_MOVE = 2,
GOLD_OVERFLOW = 3
};
unsigned long m_dwCharID; // 캐릭터 아이디
unsigned long m_dwGold; // 돈 액수
unsigned char m_cSrcPos : 4; // Src위치 - TakeType 참조
unsigned char m_cDstPos : 4; // Dst위치 - TakeType 참조
};
// 아이템 처리 패킷 (응답 필요)
typedef struct PktTIs* LPPktTIs;
struct PktTIs : public PktBase
{
enum PktTlsError
{
SERVER_ERROR = 1
};
unsigned long m_dwCharID; // 캐릭터 아이디
unsigned char m_TakeNum; // 아이템 집기 숫자
};
// 아이템 스왑 패킷
typedef struct PktSwI* LPPktSwI;
struct PktSwI : public PktBase
{
enum PktSwlError
{
SERVER_ERROR = 1,
FAIL_SRC_MOVE = 2,
FAIL_DST_MOVE = 3,
CANT_SWAP = 4
};
unsigned long m_dwCharID; // - 캐릭터 아이디
TakeType m_SwapSrc; // - 스왑 소스 아이템 집기 구조체
TakeType m_SwapDst; // - 스왑 대상 아이템 집기 구조체
};
// 아이템 거래 패킷
typedef struct PktTr* LPPktTr;
struct PktTr : public PktBase
{
enum PktTrError
{
NO_SERVER_ERR = 0,
SERVER_ERROR = 1,
FAIL_DROP_INVEN = 2,
WRONG_NPC = 3,
FAIL_ITEM_BUY = 4,
FAIL_PUT_INVEN = 5
};
unsigned long m_dwCustomerID; // 손님 아이디
unsigned long m_dwOwnerID; // 상점 주인 아이디 (NPC 또는 캐릭터)
unsigned short m_wBuyItemID; // 사려고 하는 아이템 종류 ID (0이면 팔기)
TakeType m_TakeType; // 아이템 집기 구조체
};
// 아이템 거래 패킷 Ack (+ 가변길이 아이템)
typedef struct PktTrAck* LPPktTrAck;
struct PktTrAck : public PktBase
{
unsigned long m_dwCharID; // 캐릭터 아이디
unsigned long m_dwNPCID; // 상점 NPC 아이디
unsigned long m_dwGold; // 현재 소지금
unsigned short m_wSize; // 아이템 크기(0 = 팔기, 0이 아니면 사기)
Item::ItemPos m_itemPos; // 아이템 위치
unsigned char m_cNum; // 아이템 갯수
};
// 아이템의 수리 패킷 (응답 필요)
typedef struct PktRpI* LPPktRpI;
struct PktRpI : public PktBase
{
enum Pos
{
EQUIPMENT = 1,
INVENTORY = 2,
EQUIPMENT_ALL = 3,
INVENTORY_ALL = 4,
};
unsigned long m_dwCharID; // 캐릭터 아이디
unsigned long m_dwGold; // 수리 비용
Item::ItemPos m_itemPos; // 수리 아이템 위치
};
// 아이템의 사용 패킷 (응답 필요)
typedef struct PktUI* LPPktUI;
struct PktUI : public PktBase
{
enum PktUIAck
{
SERVER_ERROR = 1,
USE_FAILED = 2
};
unsigned long m_dwSender; // 사용자 아이디
unsigned long m_dwRecver; // 대상자 아이디
Item::ItemPos m_itemPos; // 사용 아이템 위치
};
// 오브젝트 던지기 패킷 ( 응답 필요 )
typedef struct PktCO* LPPktCO;
struct PktCO : public PktBase
{
CastObject m_sCastObject;
unsigned long m_dwSenderID; // 던지는 사람
unsigned long m_dwReceiverID; // 받는 사람
};
// 오브젝트 던지기 패킷 (Cast Object)
typedef struct PktCOInfo* LPPktCOInfo;
struct PktCOInfo : public PktBase
{
CastObject m_sCastObject;
unsigned long m_dwSenderID; // 던지는 사람
unsigned long m_dwReceiverID; // 받는 사람
};
// 소켓 설치 패킷
typedef struct PktIS* LPPktIS;
struct PktIS : public PktBase
{
unsigned long m_dwCharID;
Item::ItemPos m_equipPos; // 장비 위치
Item::ItemPos m_gemPos; // 보석 위치
};
// 소켓 설치 패킷 Ack (+ 소켓이 설치된 장비 아이템)
typedef struct PktISAck* LPPktISAck;
struct PktISAck : public PktBase
{
unsigned long m_dwCharID;
Item::ItemPos m_equipPos; // 장비 위치
Item::ItemPos m_gemPos; // 보석 위치
unsigned char m_wSize; // 아이템 크기
};
// 업그레이드 아이템
typedef struct PktUgI* LPPktUgI;
struct PktUgI : public PktBase
{
unsigned long m_dwCharID; // 캐릭터 아이디
unsigned char m_cMineralNum; // 광물 숫자
};
// 업그레이드 아이템 Ack (+ 아이템 구조체)
typedef struct PktUgIAck* LPPktUgIAck;
struct PktUgIAck : public PktBase
{
unsigned long m_dwCharID; // 캐릭터 아이디
unsigned char m_cSize; // 아이템 크기
};
// 아이템 스플릿 요청 (응답 필요)
typedef struct PktSplt* LPPktSplt;
struct PktSplt : public PktBase
{
unsigned long m_dwCharID; // 캐릭터 아이디
TakeType m_TakeType; // 아이템 집기 구조체
// ( Src : 나눌 아이템, Dst : 나누어서 놓을 자리(항상 비어 있어야 함),
// Num : 나눌 아이템 개수)
};
// 아이템 스플릿 Ack (응답 필요) (+ 가변길이 아이템 구조체 (나누어서 생긴 아이템 정보))
typedef struct PktSpItAck* LPPktSpItAck;
struct PktSpItAck : public PktBase
{
enum PktSpltAckError
{
SERVER_ERROR = 1,
FAIL_SPLIT = 2
};
unsigned long m_dwCharID; // 캐릭터 아이디
TakeType m_TakeType; // 아이템 집기 구조체
unsigned char m_cSize; // 아이템 크기
};
// 퀵 슬롯 이동 (응답 필요)
typedef struct PktQSM* LPPktQSM;
struct PktQSM : public PktBase
{
enum PktQSMError
{
SERVER_ERROR = 1,
FAIL_MOVE = 2
};
TakeType m_TakeType;
};
// 스위치 핸드
typedef struct PktSwH* LPPktSwH;
struct PktSwH : public PktBase
{
unsigned char m_cSelect; // 선택 핸드 ( 1 = 무기1 & 방패1, 2 = 무기2 & 방패2 )
};
// 교환 명령
//
// 명령 :
// 0 = 제안, 1 = 수락, 2 = 거절, 3 = 확인, 4 = 확인 취소, 5 = 거래 성립, 6 = 거래 취소
//
// 에러 :
// 0 = 성공, 1 = 서버 에러, 2 = 이미 교환중인 캐릭터에게 교환 신청,
// 3 = 양쪽 모두 확인하지 않은 상태에서 거래 성립, 4 = 거부 옵션이 켜진 상태
//
typedef struct PktExC* LPPktExC;
struct PktExC : public PktBase
{
enum ExchageCmd
{
EXC_PROPOSE = 0, EXC_ACCEPT = 1, EXC_REFUSE = 2,
EXC_OK = 3, EXC_CANCEL = 4, EXC_EXCHANGE = 5,
EXC_QUIT = 6, EXC_LOCK = 7, EXC_UNLOCK = 8
};
enum PktExCError
{
NO_SERVER_ERR = 0, SERVER_ERROR = 1, FAIL_EXCHANGING_CHAR = 2,
FAIL_NOT_ALL_OK = 3, FAIL_REJECT = 4
};
unsigned long m_dwSenderID; // 보낸이 아이디
unsigned long m_dwRecverID; // 받는이 아이디
unsigned char m_cCmd; // 명령
};
// 교환 아이템 (+ 아이템 구조체)
typedef struct PktExI* LPPktExI;
struct PktExI : public PktBase
{
enum Type
{
Item = 0,
Gold = 1,
Remove = 2
};
unsigned long m_dwCharID; // 캐릭터 아이디
unsigned long m_dwSize; // 아이템 데이터 크기(혹은 돈 양)
Item::ItemPos m_itemPos; // 아이템 위치
unsigned char m_cType; // 아이템 종류(아이템 = 0, 돈 = 1)
unsigned char m_cNum; // 아이템 개수(stack아이템인 경우, 개수만 보냄)
};
namespace Deposit
{
enum Const { PASSWORD_LENGTH = 4 };
};
// 창고 패킷 (GameServer <--> DBAgent)
// 로그인시에, PktDBUpdate를 보낸 후, PktDepositUpdateDB를 여러개 준다.
// 마지막 패킷에 m_bUpdateComplete를 true로 Set해 준다.
// 게임 중에는 게임 서버가 수시로 Update를 한다.
typedef struct PktDepositUpdateDB* LPPktDepositUpdateDB;
struct PktDepositUpdateDB : public PktBase
{
enum TabFlag
{
ITEM_TAB1 = ( 1 << 0 ),
ITEM_TAB2 = ( 1 << 1 ),
ITEM_TAB3 = ( 1 << 2 ),
ITEM_TAB4 = ( 1 << 3 ),
USED_DEPOSIT = ( 1 << 30), // 0 : 창고 사용 X, 1 : 창고 사용함.
SAVED_PASSWORD = ( 1 << 31) // 0 : NOSAVE 1 : SAVE
};
enum TabNum
{
TAB_12 = 0,
TAB_34 = 1,
};
unsigned long m_dwUID; // 캐릭터 UID
unsigned long m_dwCID; // 캐릭터 CID
unsigned long m_dwTabFlag; // 현재 탭의 구입 상태를 나타내는 bitset
unsigned short m_usDataSize; // 탭(혹은 암호) 데이터 크기. 암호인 경우는 Deposit::PASSWORD_LENGTH와 같아야 한다.
unsigned char m_cTabNum; // password인 경우는 PASSWORD_TABNUM임
bool m_bUpdateComplete; // 업데이트가 완료되는 경우, true로 set.
};
// 창고 패킷 (Client <--> GameServer)
struct PktDeposit : public PktBase
{
enum CMD
{
LOGIN = 1, // Ack있음(Ack데이터 없음) (Client<->GameServer) szData[0]~[3]는 password, 그 다음에 암호 저장 여부 1byte (0, 1)
BUY_TAB = 2, // Ack있음(Ack데이터 없음) (Client<->GameServer) szData[0]에 사용할 탭 번호를 넣어 줌
RETURN_TAB = 3, // Ack있음(Ack데이터 없음) (Client<->GameServer) szData[0]에 사용할 탭 번호를 넣어 줌, 아직 구현되지 않음
LOGOUT = 4, // Ack있음 (Client->GameServer) 데이터 없음.
CHANGE_PASS = 5, // Ack있음 (Client->GameServer) szData[0]~[3]는 password. 인증된 상태에서만 가능.
SAVED_PASS = 6, // Ack없음 (GameServer -> Client) 게임 로그인시 줌. szData[0]~[3]는 Gold, [4]는 암호 저장 여부 1byte (0, 1)
PASSWORD = 7, // AgentServer -> GameServer (CID, Password), GameServer -> AgentServer (UID, Password)
GOLD = 8 // AgentServer -> GameServer (CID, Gold), GameServer -> AgentServer (UID, Gold)
};
enum DepositError
{
SERVER_ERROR = 1,
INSUFFICIENT_MONEY = 2,
AUTH_FAILED = 3,
INVALID_ARGUMENT = 4
};
enum { MIN_DATA_SIZE = Deposit::PASSWORD_LENGTH + 4 };
unsigned char m_cCmd;
char m_szData[MIN_DATA_SIZE];
};
#pragma pack()
#endif