Best Studio 1
Best Studio
Agora Metin2 1
Agora Metin2
raderde 1
raderde
Cannn6161 1
Cannn6161
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Mt2Hizmet 1
Mt2Hizmet
melankolıa18 1
melankolıa18
romegames 1
romegames
Krutzo 1
Krutzo
shrpnl 1
shrpnl
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Build Hata

  • Konuyu başlatan Konuyu başlatan recepin94
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 19
  • Görüntüleme Görüntüleme 2K
  • Etiketler Etiketler
    build hata
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

recepin94

Level 5
TM Üye
Katılım
29 May 2011
Konular
64
Mesajlar
903
Online süresi
14d 10h
Reaksiyon Skoru
137
Altın Konu
0
TM Yaşı
15 Yıl 10 Gün
Başarım Puanı
161
MmoLira
1,828
DevLira
0
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

Offline shop ekledim build olurken hata veriyor hata nerede

Hata Kodları
Kod:
packet.h:773: error: expected `}' before 'SHOP_SUBHEADER_CG_PUT_ITEM'
packet.h:773: warning: non-local variable '<anonymous enum> SHOP_SUBHEADER_CG_PUT_ITEM' uses anonymous type
packet.h:774: warning: non-local variable '<anonymous enum> SHOP_SUBHEADER_CG_DESTROY_OFFLINE_SHOP' uses anonymous type
packet.h:776: error: expected unqualified-id before '}' token
packet.h:776: error: expected declaration before '}' token
gmake[1]: *** [.obj/OXEvent.o] Error 1
gmake[1]: Leaving directory `'
gmake: *** [all] Error 2
 
packet.h atabilirmisin.
C++:
#ifndef __INC_PACKET_H__
#define __INC_PACKET_H__
#include "stdafx.h"

enum
{
    HEADER_CG_HANDSHAKE                = 0xff,
    HEADER_CG_PONG                = 0xfe,
    HEADER_CG_TIME_SYNC                = 0xfc,
    HEADER_CG_KEY_AGREEMENT            = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_

    HEADER_CG_LOGIN                = 1,
    HEADER_CG_ATTACK                = 2,
    HEADER_CG_CHAT                = 3,
    HEADER_CG_CHARACTER_CREATE            = 4,
    HEADER_CG_CHARACTER_DELETE            = 5,
    HEADER_CG_CHARACTER_SELECT            = 6,
    HEADER_CG_MOVE                = 7,
    HEADER_CG_SYNC_POSITION            = 8,
    HEADER_CG_ENTERGAME                = 10,

    HEADER_CG_ITEM_USE                = 11,
    HEADER_CG_ITEM_DROP                = 12,
    HEADER_CG_ITEM_MOVE                = 13,
    HEADER_CG_ITEM_PICKUP            = 15,

    HEADER_CG_QUICKSLOT_ADD            = 16,
    HEADER_CG_QUICKSLOT_DEL            = 17,
    HEADER_CG_QUICKSLOT_SWAP            = 18,
    HEADER_CG_WHISPER                = 19,
    HEADER_CG_ITEM_DROP2            = 20,

    HEADER_CG_ON_CLICK                = 26,
    HEADER_CG_EXCHANGE                = 27,
    HEADER_CG_CHARACTER_POSITION        = 28,
    HEADER_CG_SCRIPT_ANSWER            = 29,
    HEADER_CG_QUEST_INPUT_STRING        = 30,
    HEADER_CG_QUEST_CONFIRM            = 31,

    HEADER_CG_SHOP                = 50,
    HEADER_CG_FLY_TARGETING            = 51,
    HEADER_CG_USE_SKILL                = 52,
    HEADER_CG_ADD_FLY_TARGETING            = 53,
    HEADER_CG_SHOOT                = 54,
    HEADER_CG_MYSHOP                = 55,

    // BEGIN_OFFLINE_SHOP
    HEADER_CG_OFFLINE_SHOP            = 56,
    HEADER_CG_MY_OFFLINE_SHOP        = 57,
    // END_OF_OFFLINE_SHOP

    HEADER_CG_ITEM_USE_TO_ITEM            = 60,
    HEADER_CG_TARGET                 = 61,

    HEADER_CG_TEXT                = 64,    // @ ·Î ½ÃÀ۵Ǹé ÅØ½ºÆ®¸¦ ÆÄ½ÌÇÑ´Ù.
    HEADER_CG_WARP                = 65,
    HEADER_CG_SCRIPT_BUTTON            = 66,
    HEADER_CG_MESSENGER                = 67,

    HEADER_CG_MALL_CHECKOUT            = 69,
    HEADER_CG_SAFEBOX_CHECKIN            = 70,    // ¾ÆÀÌÅÛÀ» â°í¿¡ ³Ö†š´Â´Ù.
    HEADER_CG_SAFEBOX_CHECKOUT            = 71,    // ¾ÆÀÌÅÛÀ» â°í·Î ºÎÅÍ »©¿Â´Ù.

    HEADER_CG_PARTY_INVITE            = 72,
    HEADER_CG_PARTY_INVITE_ANSWER        = 73,
    HEADER_CG_PARTY_REMOVE            = 74,
    HEADER_CG_PARTY_SET_STATE                   = 75,
    HEADER_CG_PARTY_USE_SKILL            = 76,
    HEADER_CG_SAFEBOX_ITEM_MOVE            = 77,
    HEADER_CG_PARTY_PARAMETER            = 78,

    HEADER_CG_GUILD                = 80,
    HEADER_CG_ANSWER_MAKE_GUILD            = 81,

    HEADER_CG_FISHING                = 82,

    HEADER_CG_ITEM_GIVE                = 83,

    HEADER_CG_EMPIRE                = 90,

    HEADER_CG_REFINE                = 96,

    HEADER_CG_MARK_LOGIN            = 100,
    HEADER_CG_MARK_CRCLIST            = 101,
    HEADER_CG_MARK_UPLOAD            = 102,
    HEADER_CG_MARK_IDXLIST            = 104,

    HEADER_CG_HACK                    = 105,
    HEADER_CG_CHANGE_NAME            = 106,
    HEADER_CG_LOGIN2                = 109,
    HEADER_CG_DUNGEON                = 110,
    HEADER_CG_LOGIN3                = 111,

    HEADER_CG_GUILD_SYMBOL_UPLOAD    = 112,
    HEADER_CG_SYMBOL_CRC            = 113,

    // SCRIPT_SELECT_ITEM
    HEADER_CG_SCRIPT_SELECT_ITEM    = 114,
    // END_OF_SCRIPT_SELECT_ITEM

    HEADER_CG_LOGIN5_OPENID            = 116,    //OpenID : Ŭ¶óÀÌ¾ğÆ®·ÎºÎÅÍ OpenID ÀÎÁõ۸¦ ¹Ş´Â´Ù.

//    HEADER_CG_ROULETTE                = 200,
//    HEADER_CG_RUNUP_MATRIX_ANSWER    = 201,

    //
    HEADER_CG_PASSPOD_ANSWER        = 202,

    //NOTE : ÀÌ·± °³XXX Á¤¸» À̰ŠPacket¼³°èÇÑ »ç¶÷Àº ´©±¸³Ä. ÀÌ·¸°Ô ÄÚµùÇÏ°í ¹äÀÌ ³Ñ¾î°¡³ª.
    //enumÀ» º°µµ·Î ±¸º°À» ÇÏ´ø°¡. ¾Æ´Ô namepsace·Î ±¸º°À» ÇÏ´ø°¡..
    //Á¤¸» packet generator±îÁö´Â ¹Ù¶óÁöµµ ¾Ê´Â´Ù. ÀÌ·± ¾¾XX
    //ÀÌ·¯´Ù°¡ ¼ıÀÚ °ãÄ¡¸é ´©°¡ Ã¥ÀÓÁö´Âµ¥???
    HEADER_CG_HS_ACK                = 203,
    HEADER_CG_XTRAP_ACK                = 204,

    HEADER_CG_DRAGON_SOUL_REFINE            = 205,
    HEADER_CG_STATE_CHECKER                    = 206,

    HEADER_CG_CLIENT_VERSION            = 0xfd,
    HEADER_CG_CLIENT_VERSION2            = 0xf1,

    /********************************************************/
    HEADER_GC_KEY_AGREEMENT_COMPLETED = 0xfa, // _IMPROVED_PACKET_ENCRYPTION_
    HEADER_GC_KEY_AGREEMENT            = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_
    HEADER_GC_TIME_SYNC                = 0xfc,
    HEADER_GC_PHASE                    = 0xfd,
    HEADER_GC_BINDUDP                = 0xfe,
    HEADER_GC_HANDSHAKE                = 0xff,

    HEADER_GC_CHARACTER_ADD            = 1,
    HEADER_GC_CHARACTER_DEL            = 2,
    HEADER_GC_MOVE                    = 3,
    HEADER_GC_CHAT                    = 4,
    HEADER_GC_SYNC_POSITION            = 5,

    HEADER_GC_LOGIN_SUCCESS            = 6,
    HEADER_GC_LOGIN_SUCCESS_NEWSLOT    = 32,
    HEADER_GC_LOGIN_FAILURE            = 7,

    HEADER_GC_CHARACTER_CREATE_SUCCESS        = 8,
    HEADER_GC_CHARACTER_CREATE_FAILURE        = 9,
    HEADER_GC_CHARACTER_DELETE_SUCCESS        = 10,
    HEADER_GC_CHARACTER_DELETE_WRONG_SOCIAL_ID    = 11,

    HEADER_GC_ATTACK                = 12,
    HEADER_GC_STUN                = 13,
    HEADER_GC_DEAD                = 14,

    HEADER_GC_MAIN_CHARACTER_OLD        = 15,
    HEADER_GC_CHARACTER_POINTS            = 16,
    HEADER_GC_CHARACTER_POINT_CHANGE        = 17,
    HEADER_GC_CHANGE_SPEED            = 18,
    HEADER_GC_CHARACTER_UPDATE            = 19,
    HEADER_GC_CHARACTER_UPDATE_NEW        = 24,

    HEADER_GC_ITEM_DEL                = 20,
    HEADER_GC_ITEM_SET                = 21,
    HEADER_GC_ITEM_USE                = 22,
    HEADER_GC_ITEM_DROP                = 23,
    HEADER_GC_ITEM_UPDATE            = 25,

    HEADER_GC_ITEM_GROUND_ADD            = 26,
    HEADER_GC_ITEM_GROUND_DEL            = 27,

    HEADER_GC_QUICKSLOT_ADD            = 28,
    HEADER_GC_QUICKSLOT_DEL            = 29,
    HEADER_GC_QUICKSLOT_SWAP            = 30,

    HEADER_GC_ITEM_OWNERSHIP            = 31,

    HEADER_GC_WHISPER                = 34,

    HEADER_GC_MOTION                = 36,
    HEADER_GC_PARTS                = 37,

    HEADER_GC_SHOP                = 38,
    HEADER_GC_SHOP_SIGN                = 39,

    HEADER_GC_DUEL_START                = 40,
    HEADER_GC_PVP                               = 41,
    HEADER_GC_EXCHANGE                = 42,
    HEADER_GC_CHARACTER_POSITION        = 43,

    HEADER_GC_PING                = 44,
    HEADER_GC_SCRIPT                = 45,
    HEADER_GC_QUEST_CONFIRM            = 46,

    // BEGIN_OFFLINE_SHOP
    HEADER_GC_OFFLINE_SHOP                        = 47,
    HEADER_GC_OFFLINE_SHOP_SIGN                    = 48,
    // END_OF_OFFLINE_SHOP

    HEADER_GC_MOUNT                = 61,
    HEADER_GC_OWNERSHIP                = 62,
    HEADER_GC_TARGET                 = 63,

    HEADER_GC_WARP                = 65,

    HEADER_GC_ADD_FLY_TARGETING            = 69,
    HEADER_GC_CREATE_FLY            = 70,
    HEADER_GC_FLY_TARGETING            = 71,
    HEADER_GC_SKILL_LEVEL_OLD            = 72,
    HEADER_GC_SKILL_LEVEL            = 76,

    HEADER_GC_MESSENGER                = 74,
    HEADER_GC_GUILD                = 75,

    HEADER_GC_PARTY_INVITE            = 77,
    HEADER_GC_PARTY_ADD                = 78,
    HEADER_GC_PARTY_UPDATE            = 79,
    HEADER_GC_PARTY_REMOVE            = 80,
    HEADER_GC_QUEST_INFO            = 81,
    HEADER_GC_REQUEST_MAKE_GUILD        = 82,
    HEADER_GC_PARTY_PARAMETER            = 83,

    HEADER_GC_SAFEBOX_SET            = 85,
    HEADER_GC_SAFEBOX_DEL            = 86,
    HEADER_GC_SAFEBOX_WRONG_PASSWORD        = 87,
    HEADER_GC_SAFEBOX_SIZE            = 88,

    HEADER_GC_FISHING                = 89,

    HEADER_GC_EMPIRE                = 90,

    HEADER_GC_PARTY_LINK            = 91,
    HEADER_GC_PARTY_UNLINK            = 92,

    HEADER_GC_REFINE_INFORMATION_OLD        = 95,

    HEADER_GC_VIEW_EQUIP            = 99,

    HEADER_GC_MARK_BLOCK            = 100,
    HEADER_GC_MARK_IDXLIST            = 102,

    HEADER_GC_TIME                    = 106,
    HEADER_GC_CHANGE_NAME            = 107,

    HEADER_GC_DUNGEON                = 110,

    HEADER_GC_WALK_MODE                = 111,
    HEADER_GC_SKILL_GROUP            = 112,
    HEADER_GC_MAIN_CHARACTER            = 113,

    //    HEADER_GC_USE_POTION            = 114,
    HEADER_GC_SEPCIAL_EFFECT        = 114,

    HEADER_GC_NPC_POSITION            = 115,

    HEADER_GC_MATRIX_CARD            = 116,
    HEADER_GC_LOGIN_KEY                = 118,
    HEADER_GC_REFINE_INFORMATION        = 119,
    HEADER_GC_CHANNEL                = 121,

    // 122 HEADER_GC_MALL_OPEN
    HEADER_GC_TARGET_UPDATE            = 123,
    HEADER_GC_TARGET_DELETE            = 124,
    HEADER_GC_TARGET_CREATE            = 125,

    HEADER_GC_AFFECT_ADD            = 126,
    HEADER_GC_AFFECT_REMOVE            = 127,

    HEADER_GC_MALL_OPEN                = 122,
    HEADER_GC_MALL_SET                = 128,
    HEADER_GC_MALL_DEL                = 129,

    HEADER_GC_LAND_LIST                = 130,
    HEADER_GC_LOVER_INFO            = 131,
    HEADER_GC_LOVE_POINT_UPDATE            = 132,

    HEADER_GC_SYMBOL_DATA            = 133,

    // MINING
    HEADER_GC_DIG_MOTION            = 134,
    // END_OF_MINING

    HEADER_GC_DAMAGE_INFO           = 135,
    HEADER_GC_CHAR_ADDITIONAL_INFO    = 136,

    // SUPPORT_BGM
    HEADER_GC_MAIN_CHARACTER3_BGM        = 137,
    HEADER_GC_MAIN_CHARACTER4_BGM_VOL    = 138,
    // END_OF_SUPPORT_BGM

    HEADER_GC_AUTH_SUCCESS            = 150,

    HEADER_GC_PANAMA_PACK            = 151,

    //HYBRID CRYPT
    HEADER_GC_HYBRIDCRYPT_KEYS        = 152,
    HEADER_GC_HYBRIDCRYPT_SDB        = 153, // SDB means Supplmentary Data Blocks
    //HYBRID CRYPT

    HEADER_GC_AUTH_SUCCESS_OPENID    = 154,

    // ROULETTE
    HEADER_GC_ROULETTE                    = 200,
    // END_ROULETTE
    //
    HEADER_GC_REQUEST_PASSPOD                = 202,
    HEADER_GC_REQUEST_PASSPOD_FAILED        = 203,

    HEADER_GC_HS_REQUEST                    = 204,
    HEADER_GC_XTRAP_CS1_REQUEST                = 205,

    HEADER_GC_SPECIFIC_EFFECT                = 208,

    HEADER_GC_DRAGON_SOUL_REFINE            = 209,
    HEADER_GC_RESPOND_CHANNELSTATUS            = 210,


    /////////////////////////////////////////////////////////////////////////////

    HEADER_GG_LOGIN                = 1,
    HEADER_GG_LOGOUT                = 2,
    HEADER_GG_RELAY                = 3,
    HEADER_GG_NOTICE                = 4,
    HEADER_GG_SHUTDOWN                = 5,
    HEADER_GG_GUILD                = 6,
    HEADER_GG_DISCONNECT            = 7,    // ´©±º°¡ÀÇ Á¢¼ÓÀ» °Á¦·Î ²÷À» ¶§
    HEADER_GG_SHOUT                = 8,
    HEADER_GG_SETUP                = 9,
    HEADER_GG_MESSENGER_ADD                     = 10,
    HEADER_GG_MESSENGER_REMOVE                  = 11,
    HEADER_GG_FIND_POSITION            = 12,
    HEADER_GG_WARP_CHARACTER            = 13,
    HEADER_GG_MESSENGER_MOBILE            = 14,
    HEADER_GG_GUILD_WAR_ZONE_MAP_INDEX        = 15,
    HEADER_GG_TRANSFER                = 16,
    HEADER_GG_XMAS_WARP_SANTA            = 17,
    HEADER_GG_XMAS_WARP_SANTA_REPLY        = 18,
    HEADER_GG_RELOAD_CRC_LIST            = 19,
    HEADER_GG_LOGIN_PING            = 20,
    HEADER_GG_CHECK_CLIENT_VERSION        = 21,
    HEADER_GG_BLOCK_CHAT            = 22,

    HEADER_GG_BLOCK_EXCEPTION        = 24,
    HEADER_GG_SIEGE                    = 25,
    HEADER_GG_MONARCH_NOTICE        = 26,
    HEADER_GG_MONARCH_TRANSFER        = 27,
    HEADER_GG_PCBANG_UPDATE            = 28,

    HEADER_GG_CHECK_AWAKENESS        = 29,

    // BEGIN_OFFLINE_SHOP
    HEADER_GG_OFFLINE_SHOP_SEND_MESSAGE            = 30,
    // END_OF_OFFLINE_SHOP

#ifdef ENABLE_FULL_NOTICE
    HEADER_GG_BIG_NOTICE            = 30,
#endif
};

#pragma pack(1)
typedef struct SPacketGGSetup
{
    BYTE    bHeader;
    WORD    wPort;
    BYTE    bChannel;
} TPacketGGSetup;

typedef struct SPacketGGLogin
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    DWORD    dwPID;
    BYTE    bEmpire;
    long    lMapIndex;
    BYTE    bChannel;
} TPacketGGLogin;

typedef struct SPacketGGLogout
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGGLogout;

typedef struct SPacketGGRelay
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    long    lSize;
} TPacketGGRelay;

typedef struct SPacketGGNotice
{
    BYTE    bHeader;
    long    lSize;
} TPacketGGNotice;

typedef struct SPacketGGMonarchNotice
{
    BYTE    bHeader;
    BYTE    bEmpire;
    long    lSize;
} TPacketGGMonarchNotice;

//FORKED_ROAD
typedef struct SPacketGGForkedMapInfo
{
    BYTE    bHeader;
    BYTE    bPass;
    BYTE    bSungzi;
} TPacketGGForkedMapInfo;
//END_FORKED_ROAD
typedef struct SPacketGGShutdown
{
    BYTE    bHeader;
} TPacketGGShutdown;

typedef struct SPacketGGGuild
{
    BYTE    bHeader;
    BYTE    bSubHeader;
    DWORD    dwGuild;
} TPacketGGGuild;

enum
{
    GUILD_SUBHEADER_GG_CHAT,
    GUILD_SUBHEADER_GG_SET_MEMBER_COUNT_BONUS,
};

typedef struct SPacketGGGuildChat
{
    BYTE    bHeader;
    BYTE    bSubHeader;
    DWORD    dwGuild;
    char    szText[CHAT_MAX_LEN + 1];
} TPacketGGGuildChat;

typedef struct SPacketGGParty
{
    BYTE    header;
    BYTE    subheader;
    DWORD    pid;
    DWORD    leaderpid;
} TPacketGGParty;

enum
{
    PARTY_SUBHEADER_GG_CREATE,
    PARTY_SUBHEADER_GG_DESTROY,
    PARTY_SUBHEADER_GG_JOIN,
    PARTY_SUBHEADER_GG_QUIT,
};

typedef struct SPacketGGDisconnect
{
    BYTE    bHeader;
    char    szLogin[LOGIN_MAX_LEN + 1];
} TPacketGGDisconnect;

typedef struct SPacketGGShout
{
    BYTE    bHeader;
    BYTE    bEmpire;
    char    szText[CHAT_MAX_LEN + 1];
} TPacketGGShout;

typedef struct SPacketGGXmasWarpSanta
{
    BYTE    bHeader;
    BYTE    bChannel;
    long    lMapIndex;
} TPacketGGXmasWarpSanta;

typedef struct SPacketGGXmasWarpSantaReply
{
    BYTE    bHeader;
    BYTE    bChannel;
} TPacketGGXmasWarpSantaReply;

typedef struct SMessengerData
{
    char        szMobile[MOBILE_MAX_LEN + 1];
} TMessengerData;

typedef struct SPacketGGMessenger
{
    BYTE        bHeader;
    char        szAccount[CHARACTER_NAME_MAX_LEN + 1];
    char        szCompanion[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGGMessenger;

typedef struct SPacketGGMessengerMobile
{
    BYTE        bHeader;
    char        szName[CHARACTER_NAME_MAX_LEN + 1];
    char        szMobile[MOBILE_MAX_LEN + 1];
} TPacketGGMessengerMobile;

typedef struct SPacketGGFindPosition
{
    BYTE header;
    DWORD dwFromPID; // Àú À§Ä¡·Î ¿öÇÁÇÏ·Á´Â »ç¶÷
    DWORD dwTargetPID; // ã´Â »ç¶÷
} TPacketGGFindPosition;

typedef struct SPacketGGWarpCharacter
{
    BYTE header;
    DWORD pid;
    long x;
    long y;
} TPacketGGWarpCharacter;

//  HEADER_GG_GUILD_WAR_ZONE_MAP_INDEX        = 15,

typedef struct SPacketGGGuildWarMapIndex
{
    BYTE bHeader;
    DWORD dwGuildID1;
    DWORD dwGuildID2;
    long lMapIndex;
} TPacketGGGuildWarMapIndex;

typedef struct SPacketGGTransfer
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    long    lX, lY;
} TPacketGGTransfer;

typedef struct SPacketGGLoginPing
{
    BYTE    bHeader;
    char    szLogin[LOGIN_MAX_LEN + 1];
} TPacketGGLoginPing;

typedef struct SPacketGGBlockChat
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    long    lBlockDuration;
} TPacketGGBlockChat;

/* Ŭ¶óÀÌ¾ğÆ® Ãø¿¡¼ º¸³»´Â ÆĞŶ */

typedef struct command_text
{
    BYTE    bHeader;
} TPacketCGText;

/* ·Î±×ÀÎ (1) */
typedef struct command_handshake
{
    BYTE    bHeader;
    DWORD    dwHandshake;
    DWORD    dwTime;
    long    lDelta;
} TPacketCGHandshake;

typedef struct command_login
{
    BYTE    header;
    char    login[LOGIN_MAX_LEN + 1];
    char    passwd[PASSWD_MAX_LEN + 1];
} TPacketCGLogin;

typedef struct command_login2
{
    BYTE    header;
    char    login[LOGIN_MAX_LEN + 1];
    DWORD    dwLoginKey;
    DWORD    adwClientKey[4];
} TPacketCGLogin2;

typedef struct command_login3
{
    BYTE    header;
    char    login[LOGIN_MAX_LEN + 1];
    char    passwd[PASSWD_MAX_LEN + 1];
    DWORD    adwClientKey[4];
} TPacketCGLogin3;

typedef struct command_login5
{
    BYTE    header;
    char    authKey[OPENID_AUTHKEY_LEN + 1];
    DWORD    adwClientKey[4];
} TPacketCGLogin5;

typedef struct command_matrix_card
{
    BYTE    bHeader;
    char    szAnswer[MATRIX_ANSWER_MAX_LEN + 1];
} TPacketCGMatrixCard;

typedef struct packet_matrix_card
{
    BYTE    bHeader;
    DWORD    dwRows;
    DWORD    dwCols;
} TPacketGCMatrixCard;

typedef struct packet_login_key
{
    BYTE    bHeader;
    DWORD    dwLoginKey;
} TPacketGCLoginKey;

typedef struct command_player_select
{
    BYTE    header;
    BYTE    index;
} TPacketCGPlayerSelect;

typedef struct command_player_delete
{
    BYTE    header;
    BYTE    index;
    char    private_code[8];
} TPacketCGPlayerDelete;

typedef struct command_player_create
{
    BYTE        header;
    BYTE        index;
    char        name[CHARACTER_NAME_MAX_LEN + 1];
    WORD        job;
    BYTE    shape;
    BYTE    Con;
    BYTE    Int;
    BYTE    Str;
    BYTE    Dex;
} TPacketCGPlayerCreate;

typedef struct command_player_create_success
{
    BYTE        header;
    BYTE        bAccountCharacterIndex;
    TSimplePlayer    player;
} TPacketGCPlayerCreateSuccess;

// °ø°İ
typedef struct command_attack
{
    BYTE    bHeader;
    BYTE    bType;
    DWORD    dwVID;
    BYTE    bCRCMagicCubeProcPiece;
    BYTE    bCRCMagicCubeFilePiece;
} TPacketCGAttack;

enum EMoveFuncType
{
    FUNC_WAIT,
    FUNC_MOVE,
    FUNC_ATTACK,
    FUNC_COMBO,
    FUNC_MOB_SKILL,
    _FUNC_SKILL,
    FUNC_MAX_NUM,
    FUNC_SKILL = 0x80,
};

// À̵¿
typedef struct command_move
{
    BYTE    bHeader;
    BYTE    bFunc;
    BYTE    bArg;
    BYTE    bRot;
    long    lX;
    long    lY;
    DWORD    dwTime;
} TPacketCGMove;

typedef struct command_sync_position_element
{
    DWORD    dwVID;
    long    lX;
    long    lY;
} TPacketCGSyncPositionElement;

// À§Ä¡ µ¿±âÈ
typedef struct command_sync_position    // °¡º¯ ÆĞŶ
{
    BYTE    bHeader;
    WORD    wSize;
} TPacketCGSyncPosition;

/* äÆÃ (3) */
typedef struct command_chat    // °¡º¯ ÆĞŶ
{
    BYTE    header;
    WORD    size;
    BYTE    type;
} TPacketCGChat;

/* ±Ó¼Ó¸» */
typedef struct command_whisper
{
    BYTE    bHeader;
    WORD    wSize;
    char     szNameTo[CHARACTER_NAME_MAX_LEN + 1];
} TPacketCGWhisper;

typedef struct command_entergame
{
    BYTE    header;
} TPacketCGEnterGame;

typedef struct command_item_use
{
    BYTE     header;
    TItemPos     Cell;
} TPacketCGItemUse;

typedef struct command_item_use_to_item
{
    BYTE    header;
    TItemPos    Cell;
    TItemPos    TargetCell;
} TPacketCGItemUseToItem;

typedef struct command_item_drop
{
    BYTE     header;
    TItemPos     Cell;
    DWORD    gold;
} TPacketCGItemDrop;

typedef struct command_item_drop2
{
    BYTE     header;
    TItemPos     Cell;
    DWORD    gold;
    BYTE    count;
} TPacketCGItemDrop2;

typedef struct command_item_move
{
    BYTE     header;
    TItemPos    Cell;
    TItemPos    CellTo;
    BYTE    count;
} TPacketCGItemMove;

typedef struct command_item_pickup
{
    BYTE     header;
    DWORD    vid;
} TPacketCGItemPickup;

typedef struct command_quickslot_add
{
    BYTE    header;
    BYTE    pos;
    TQuickslot    slot;
} TPacketCGQuickslotAdd;

typedef struct command_quickslot_del
{
    BYTE    header;
    BYTE    pos;
} TPacketCGQuickslotDel;

typedef struct command_quickslot_swap
{
    BYTE    header;
    BYTE    pos;
    BYTE    change_pos;
} TPacketCGQuickslotSwap;

enum
{
    SHOP_SUBHEADER_CG_END,
    SHOP_SUBHEADER_CG_BUY,
    SHOP_SUBHEADER_CG_SELL,
    SHOP_SUBHEADER_CG_SELL2
    // BEGIN_OFFLINE_SHOP
    SHOP_SUBHEADER_CG_PUT_ITEM,
    SHOP_SUBHEADER_CG_DESTROY_OFFLINE_SHOP,
    // END_OF_OFFLINE_SHOP
};

typedef struct command_shop_buy
{
    BYTE    count;
} TPacketCGShopBuy;

typedef struct command_shop_sell
{
    BYTE    pos;
    BYTE    count;
} TPacketCGShopSell;

typedef struct command_shop
{
    BYTE    header;
    BYTE    subheader;
} TPacketCGShop;

typedef struct command_on_click
{
    BYTE    header;
    DWORD    vid;
} TPacketCGOnClick;

enum
{
    EXCHANGE_SUBHEADER_CG_START,    /* arg1 == vid of target character */
    EXCHANGE_SUBHEADER_CG_ITEM_ADD,    /* arg1 == position of item */
    EXCHANGE_SUBHEADER_CG_ITEM_DEL,    /* arg1 == position of item */
    EXCHANGE_SUBHEADER_CG_ELK_ADD,    /* arg1 == amount of gold */
    EXCHANGE_SUBHEADER_CG_ACCEPT,    /* arg1 == not used */
    EXCHANGE_SUBHEADER_CG_CANCEL,    /* arg1 == not used */
};

typedef struct command_exchange
{
    BYTE    header;
    BYTE    sub_header;
    DWORD    arg1;
    BYTE    arg2;
    TItemPos    Pos;
} TPacketCGExchange;

typedef struct command_position
{
    BYTE    header;
    BYTE    position;
} TPacketCGPosition;

typedef struct command_script_answer
{
    BYTE    header;
    BYTE    answer;
    //char    file[32 + 1];
    //BYTE    answer[16 + 1];
} TPacketCGScriptAnswer;


typedef struct command_script_button
{
    BYTE        header;
    unsigned int    idx;
} TPacketCGScriptButton;

typedef struct command_quest_input_string
{
    BYTE header;
    char msg[64+1];
} TPacketCGQuestInputString;

typedef struct command_quest_confirm
{
    BYTE header;
    BYTE answer;
    DWORD requestPID;
} TPacketCGQuestConfirm;

/*
* ¼¹ö Ãø¿¡¼ º¸³»´Â ÆĞŶ
*/
typedef struct packet_quest_confirm
{
    BYTE header;
    char msg[64+1];
    long timeout;
    DWORD requestPID;
} TPacketGCQuestConfirm;

typedef struct packet_handshake
{
    BYTE    bHeader;
    DWORD    dwHandshake;
    DWORD    dwTime;
    long    lDelta;
} TPacketGCHandshake;

enum EPhase
{
    PHASE_CLOSE,
    PHASE_HANDSHAKE,
    PHASE_LOGIN,
    PHASE_SELECT,
    PHASE_LOADING,
    PHASE_GAME,
    PHASE_DEAD,

    PHASE_CLIENT_CONNECTING,
    PHASE_DBCLIENT,
    PHASE_P2P,
    PHASE_AUTH,
    PHASE_TEEN,
    PHASE_PASSPOD,
};

typedef struct packet_phase
{
    BYTE    header;
    BYTE    phase;
} TPacketGCPhase;

typedef struct packet_bindudp
{
    BYTE    header;
    DWORD    addr;
    WORD    port;
} TPacketGCBindUDP;

enum
{
    LOGIN_FAILURE_ALREADY    = 1,
    LOGIN_FAILURE_ID_NOT_EXIST    = 2,
    LOGIN_FAILURE_WRONG_PASS    = 3,
    LOGIN_FAILURE_FALSE        = 4,
    LOGIN_FAILURE_NOT_TESTOR    = 5,
    LOGIN_FAILURE_NOT_TEST_TIME    = 6,
    LOGIN_FAILURE_FULL        = 7
};

typedef struct packet_login_success
{
    BYTE        bHeader;
    TSimplePlayer    players[PLAYER_PER_ACCOUNT];
    DWORD        guild_id[PLAYER_PER_ACCOUNT];
    char        guild_name[PLAYER_PER_ACCOUNT][GUILD_NAME_MAX_LEN+1];

    DWORD        handle;
    DWORD        random_key;
} TPacketGCLoginSuccess;

typedef struct packet_auth_success
{
    BYTE    bHeader;
    DWORD    dwLoginKey;
    BYTE    bResult;
} TPacketGCAuthSuccess;

typedef struct packet_auth_success_openid
{
    BYTE    bHeader;
    DWORD    dwLoginKey;
    BYTE    bResult;
    char    login[LOGIN_MAX_LEN + 1];
} TPacketGCAuthSuccessOpenID;

typedef struct packet_login_failure
{
    BYTE    header;
    char    szStatus[ACCOUNT_STATUS_MAX_LEN + 1];
} TPacketGCLoginFailure;

typedef struct packet_create_failure
{
    BYTE    header;
    BYTE    bType;
} TPacketGCCreateFailure;

enum
{
    ADD_CHARACTER_STATE_DEAD        = (1 << 0),
    ADD_CHARACTER_STATE_SPAWN        = (1 << 1),
    ADD_CHARACTER_STATE_GUNGON        = (1 << 2),
    ADD_CHARACTER_STATE_KILLER        = (1 << 3),
    ADD_CHARACTER_STATE_PARTY        = (1 << 4),
};

enum ECharacterEquipmentPart
{
    CHR_EQUIPPART_ARMOR,
    CHR_EQUIPPART_WEAPON,
    CHR_EQUIPPART_HEAD,
    CHR_EQUIPPART_HAIR,
    CHR_EQUIPPART_NUM,
};

typedef struct packet_add_char
{
    BYTE    header;
    DWORD    dwVID;

    float    angle;
    long    x;
    long    y;
    long    z;

    BYTE    bType;
    WORD    wRaceNum;
    BYTE    bMovingSpeed;
    BYTE    bAttackSpeed;

    BYTE    bStateFlag;
    DWORD    dwAffectFlag[2];    // È¿°ú
} TPacketGCCharacterAdd;

typedef struct packet_char_additional_info
{
    BYTE    header;
    DWORD   dwVID;
    char    name[CHARACTER_NAME_MAX_LEN + 1];
    WORD    awPart[CHR_EQUIPPART_NUM];
    BYTE    bEmpire;
    DWORD   dwGuildID;
    DWORD   dwLevel;
    short    sAlignment;
    BYTE    bPKMode;
    DWORD    dwMountVnum;
} TPacketGCCharacterAdditionalInfo;

/*
   typedef struct packet_update_char_old
   {
   BYTE    header;
   DWORD    dwVID;

   WORD        awPart[CHR_EQUIPPART_NUM];
   BYTE    bMovingSpeed;
   BYTE    bAttackSpeed;

   BYTE    bStateFlag;
   DWORD    dwAffectFlag[2];

   DWORD    dwGuildID;
   short    sAlignment;
   BYTE    bPKMode;
   DWORD    dwMountVnum;
   } TPacketGCCharacterUpdateOld;
*/

typedef struct packet_update_char
{
    BYTE    header;
    DWORD    dwVID;

    WORD        awPart[CHR_EQUIPPART_NUM];
    BYTE    bMovingSpeed;
    BYTE    bAttackSpeed;

    BYTE    bStateFlag;
    DWORD    dwAffectFlag[2];

    DWORD    dwGuildID;
    short    sAlignment;
    BYTE    bPKMode;
    DWORD    dwMountVnum;
    //WORD    wRaceNum;
} TPacketGCCharacterUpdate;

typedef struct packet_del_char
{
    BYTE    header;
    DWORD    id;
} TPacketGCCharacterDelete;

typedef struct packet_chat    // °¡º¯ ÆĞŶ
{
    BYTE    header;
    WORD    size;
    BYTE    type;
    DWORD    id;
    BYTE    bEmpire;
} TPacketGCChat;

typedef struct packet_whisper    // °¡º¯ ÆĞŶ
{
    BYTE    bHeader;
    WORD    wSize;
    BYTE    bType;
    char    szNameFrom[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGCWhisper;

typedef struct packet_main_character
{
    BYTE        header;
    DWORD    dwVID;
    WORD    wRaceNum;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    long    lx, ly, lz;
    BYTE    empire;
    BYTE    skill_group;
} TPacketGCMainCharacter;

// SUPPORT_BGM
typedef struct packet_main_character3_bgm
{
    enum
    {
        MUSIC_NAME_LEN = 24,
    };

    BYTE    header;
    DWORD    dwVID;
    WORD    wRaceNum;
    char    szChrName[CHARACTER_NAME_MAX_LEN + 1];
    char    szBGMName[MUSIC_NAME_LEN + 1];
    long    lx, ly, lz;
    BYTE    empire;
    BYTE    skill_group;
} TPacketGCMainCharacter3_BGM;

typedef struct packet_main_character4_bgm_vol
{
    enum
    {
        MUSIC_NAME_LEN = 24,
    };

    BYTE    header;
    DWORD    dwVID;
    WORD    wRaceNum;
    char    szChrName[CHARACTER_NAME_MAX_LEN + 1];
    char    szBGMName[MUSIC_NAME_LEN + 1];
    float    fBGMVol;
    long    lx, ly, lz;
    BYTE    empire;
    BYTE    skill_group;
} TPacketGCMainCharacter4_BGM_VOL;
// END_OF_SUPPORT_BGM

typedef struct packet_points
{
    BYTE    header;
    INT        points[POINT_MAX_NUM];
} TPacketGCPoints;

typedef struct packet_skill_level
{
    BYTE        bHeader;
    TPlayerSkill    skills[SKILL_MAX_NUM];
} TPacketGCSkillLevel;

typedef struct packet_point_change
{
    int        header;
    DWORD    dwVID;
    BYTE    type;
    long    amount;
    long    value;
} TPacketGCPointChange;

typedef struct packet_stun
{
    BYTE    header;
    DWORD    vid;
} TPacketGCStun;

typedef struct packet_dead
{
    BYTE    header;
    DWORD    vid;
} TPacketGCDead;

struct TPacketGCItemDelDeprecated
{
    BYTE    header;
    TItemPos Cell;
    DWORD    vnum;
    BYTE    count;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
};

typedef struct packet_item_set
{
    BYTE    header;
    TItemPos Cell;
    DWORD    vnum;
    BYTE    count;
    DWORD    flags;
    DWORD    anti_flags;
    bool    highlight;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
} TPacketGCItemSet;

typedef struct packet_item_del
{
    BYTE    header;
    BYTE    pos;
} TPacketGCItemDel;

struct packet_item_use
{
    BYTE    header;
    TItemPos Cell;
    DWORD    ch_vid;
    DWORD    victim_vid;
    DWORD    vnum;
};

struct packet_item_move
{
    BYTE    header;
    TItemPos Cell;
    TItemPos CellTo;
};

typedef struct packet_item_update
{
    BYTE    header;
    TItemPos Cell;
    BYTE    count;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
} TPacketGCItemUpdate;

typedef struct packet_item_ground_add
{
    BYTE    bHeader;
    long     x, y, z;
    DWORD    dwVID;
    DWORD    dwVnum;
} TPacketGCItemGroundAdd;

typedef struct packet_item_ownership
{
    BYTE    bHeader;
    DWORD    dwVID;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGCItemOwnership;

typedef struct packet_item_ground_del
{
    BYTE    bHeader;
    DWORD    dwVID;
} TPacketGCItemGroundDel;

struct packet_quickslot_add
{
    BYTE    header;
    BYTE    pos;
    TQuickslot    slot;
};

struct packet_quickslot_del
{
    BYTE    header;
    BYTE    pos;
};

struct packet_quickslot_swap
{
    BYTE    header;
    BYTE    pos;
    BYTE    pos_to;
};

struct packet_motion
{
    BYTE    header;
    DWORD    vid;
    DWORD    victim_vid;
    WORD    motion;
};

enum EPacketShopSubHeaders
{
    SHOP_SUBHEADER_GC_START,
    SHOP_SUBHEADER_GC_END,
    SHOP_SUBHEADER_GC_UPDATE_ITEM,
    SHOP_SUBHEADER_GC_UPDATE_PRICE,
    SHOP_SUBHEADER_GC_OK,
    SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY,
    SHOP_SUBHEADER_GC_SOLDOUT,
    SHOP_SUBHEADER_GC_INVENTORY_FULL,
    SHOP_SUBHEADER_GC_INVALID_POS,
    SHOP_SUBHEADER_GC_SOLD_OUT,
    SHOP_SUBHEADER_GC_START_EX,
    SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY_EX,
};

struct packet_shop_item
{
    DWORD       vnum;
    DWORD       price;
    BYTE        count;
    BYTE        display_pos;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
};

// BEGIN_OFFLINE_SHOP
struct packet_shop_offline_item
{
    DWORD       vnum;
    DWORD       price;
    BYTE        count;
    BYTE        display_pos;
    bool        bIsSold;
    char        buyerName[CHARACTER_NAME_MAX_LEN];
    long        alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
};
// END_OF_OFFLINE_SHOP

typedef struct packet_shop_start
{
    DWORD   owner_vid;
    struct packet_shop_item    items[SHOP_HOST_ITEM_MAX_NUM];
} TPacketGCShopStart;

// BEGIN_OFFLINE_SHOP
typedef struct packet_offline_shop_start
{
    DWORD    owner_vid;
    struct packet_shop_offline_item items[OFFLINE_SHOP_HOST_ITEM_MAX_NUM];
} TPacketGCOfflineShopStart;
// END_OF_OFFLINE_SHOP

typedef struct packet_shop_start_ex // ´ÙÀ½¿¡ TSubPacketShopTab* shop_tabs ÀÌ µû¶ó¿È.
{
    typedef struct sub_packet_shop_tab
    {
        char name[SHOP_TAB_NAME_MAX];
        BYTE coin_type;
        packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
    } TSubPacketShopTab;
    DWORD owner_vid;
    BYTE shop_tab_count;
} TPacketGCShopStartEx;

typedef struct packet_shop_update_item
{
    BYTE            pos;
    struct packet_shop_item    item;
} TPacketGCShopUpdateItem;

// BEGIN_OFFLINE_SHOP
typedef struct packet_shop_update_offline_item
{
    BYTE    pos;
    struct packet_shop_offline_item    item;
} TPacketGCShopUpdateOfflineItem;
// END_OF_OFFLINE_SHOP

typedef struct packet_shop_update_price
{
    int                iPrice;
} TPacketGCShopUpdatePrice;

typedef struct packet_shop    // °¡º¯ ÆĞŶ
{
    BYTE        header;
    WORD    size;
    BYTE        subheader;
} TPacketGCShop;

struct packet_exchange
{
    BYTE    header;
    BYTE    sub_header;
    BYTE    is_me;
    DWORD    arg1;    // vnum
    TItemPos    arg2;    // cell
    DWORD    arg3;    // count
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
};

enum EPacketTradeSubHeaders
{
    EXCHANGE_SUBHEADER_GC_START,    /* arg1 == vid */
    EXCHANGE_SUBHEADER_GC_ITEM_ADD,    /* arg1 == vnum  arg2 == pos  arg3 == count */
    EXCHANGE_SUBHEADER_GC_ITEM_DEL,
    EXCHANGE_SUBHEADER_GC_GOLD_ADD,    /* arg1 == gold */
    EXCHANGE_SUBHEADER_GC_ACCEPT,    /* arg1 == accept */
    EXCHANGE_SUBHEADER_GC_END,        /* arg1 == not used */
    EXCHANGE_SUBHEADER_GC_ALREADY,    /* arg1 == not used */
    EXCHANGE_SUBHEADER_GC_LESS_GOLD,    /* arg1 == not used */
};

struct packet_position
{
    BYTE    header;
    DWORD    vid;
    BYTE    position;
};

typedef struct packet_ping
{
    BYTE    header;
} TPacketGCPing;

struct packet_script
{
    BYTE    header;
    WORD    size;
    BYTE    skin;
    WORD    src_size;
#ifdef ENABLE_QUEST_CATEGORY
    BYTE    quest_flag;
#endif
};

typedef struct packet_change_speed
{
    BYTE        header;
    DWORD        vid;
    WORD        moving_speed;
} TPacketGCChangeSpeed;

struct packet_mount
{
    BYTE    header;
    DWORD    vid;
    DWORD    mount_vid;
    BYTE    pos;
    DWORD    x, y;
};

typedef struct packet_move
{
    BYTE        bHeader;
    BYTE        bFunc;
    BYTE        bArg;
    BYTE        bRot;
    DWORD        dwVID;
    long        lX;
    long        lY;
    DWORD        dwTime;
    DWORD        dwDuration;
} TPacketGCMove;

// ¼ÒÀ¯±Ç
typedef struct packet_ownership
{
    BYTE        bHeader;
    DWORD        dwOwnerVID;
    DWORD        dwVictimVID;
} TPacketGCOwnership;

// À§Ä¡ µ¿±âÈ ÆĞŶÀÇ bCount ¸¸Å ºÙ´Â ´ÜÀ§
typedef struct packet_sync_position_element
{
    DWORD    dwVID;
    long    lX;
    long    lY;
} TPacketGCSyncPositionElement;

// À§Ä¡ µ¿±âÈ
typedef struct packet_sync_position    // °¡º¯ ÆĞŶ
{
    BYTE    bHeader;
    WORD    wSize;    // °³¼ö = (wSize - sizeof(TPacketGCSyncPosition)) / sizeof(TPacketGCSyncPositionElement)
} TPacketGCSyncPosition;

typedef struct packet_fly
{
    BYTE    bHeader;
    BYTE    bType;
    DWORD    dwStartVID;
    DWORD    dwEndVID;
} TPacketGCCreateFly;

typedef struct command_fly_targeting
{
    BYTE        bHeader;
    DWORD        dwTargetVID;
    long        x, y;
} TPacketCGFlyTargeting;

typedef struct packet_fly_targeting
{
    BYTE        bHeader;
    DWORD        dwShooterVID;
    DWORD        dwTargetVID;
    long        x, y;
} TPacketGCFlyTargeting;

typedef struct packet_shoot
{
    BYTE        bHeader;
    BYTE        bType;
} TPacketCGShoot;

typedef struct packet_duel_start
{
    BYTE    header;
    WORD    wSize;    // DWORD°¡ ¸î°³? °³¼ö = (wSize - sizeof(TPacketGCPVPList)) / 4
} TPacketGCDuelStart;

enum EPVPModes
{
    PVP_MODE_NONE,
    PVP_MODE_AGREE,
    PVP_MODE_FIGHT,
    PVP_MODE_REVENGE
};

typedef struct packet_pvp
{
    BYTE        bHeader;
    DWORD       dwVIDSrc;
    DWORD       dwVIDDst;
    BYTE        bMode;    // 0 ÀÌ¸é ²û, 1À̸é ÄÔ
} TPacketGCPVP;

typedef struct command_use_skill
{
    BYTE    bHeader;
    DWORD    dwVnum;
    DWORD    dwVID;
} TPacketCGUseSkill;

typedef struct command_target
{
    BYTE    header;
    DWORD    dwVID;
} TPacketCGTarget;

typedef struct packet_target
{
    BYTE    header;
    DWORD    dwVID;
    BYTE    bHPPercent;
} TPacketGCTarget;

typedef struct packet_warp
{
    BYTE    bHeader;
    long    lX;
    long    lY;
    long    lAddr;
    WORD    wPort;
} TPacketGCWarp;

typedef struct command_warp
{
    BYTE    bHeader;
} TPacketCGWarp;

struct packet_quest_info
{
    BYTE header;
    WORD size;
    WORD index;
#ifdef ENABLE_QUEST_CATEGORY
    WORD c_index;
#endif
    BYTE flag;
};

enum
{
    MESSENGER_SUBHEADER_GC_LIST,
    MESSENGER_SUBHEADER_GC_LOGIN,
    MESSENGER_SUBHEADER_GC_LOGOUT,
    MESSENGER_SUBHEADER_GC_INVITE,
    MESSENGER_SUBHEADER_GC_MOBILE
};

typedef struct packet_messenger
{
    BYTE header;
    WORD size;
    BYTE subheader;
} TPacketGCMessenger;

typedef struct packet_messenger_guild_list
{
    BYTE connected;
    BYTE length;
    //char login[LOGIN_MAX_LEN+1];
} TPacketGCMessengerGuildList;

typedef struct packet_messenger_guild_login
{
    BYTE length;
    //char login[LOGIN_MAX_LEN+1];
} TPacketGCMessengerGuildLogin;

typedef struct packet_messenger_guild_logout
{
    BYTE length;

    //char login[LOGIN_MAX_LEN+1];
} TPacketGCMessengerGuildLogout;

typedef struct packet_messenger_list_offline
{
    BYTE connected; // always 0
    BYTE length;
} TPacketGCMessengerListOffline;

typedef struct packet_messenger_list_online
{
    BYTE connected; // always 1
    BYTE length;
} TPacketGCMessengerListOnline;

enum
{
    MESSENGER_SUBHEADER_CG_ADD_BY_VID,
    MESSENGER_SUBHEADER_CG_ADD_BY_NAME,
    MESSENGER_SUBHEADER_CG_REMOVE,
    MESSENGER_SUBHEADER_CG_INVITE_ANSWER,
};

typedef struct command_messenger
{
    BYTE header;
    BYTE subheader;
} TPacketCGMessenger;

typedef struct command_messenger_add_by_vid
{
    DWORD vid;
} TPacketCGMessengerAddByVID;

typedef struct command_messenger_add_by_name
{
    BYTE length;
    //char login[LOGIN_MAX_LEN+1];
} TPacketCGMessengerAddByName;

typedef struct command_messenger_remove
{
    char login[LOGIN_MAX_LEN+1];
    //DWORD account;
} TPacketCGMessengerRemove;

typedef struct command_safebox_checkout
{
    BYTE    bHeader;
    BYTE    bSafePos;
    TItemPos    ItemPos;
} TPacketCGSafeboxCheckout;

typedef struct command_safebox_checkin
{
    BYTE    bHeader;
    BYTE    bSafePos;
    TItemPos    ItemPos;
} TPacketCGSafeboxCheckin;

///////////////////////////////////////////////////////////////////////////////////
// Party

typedef struct command_party_parameter
{
    BYTE    bHeader;
    BYTE    bDistributeMode;
} TPacketCGPartyParameter;

typedef struct paryt_parameter
{
    BYTE    bHeader;
    BYTE    bDistributeMode;
} TPacketGCPartyParameter;

typedef struct packet_party_add
{
    BYTE    header;
    DWORD    pid;
    char    name[CHARACTER_NAME_MAX_LEN+1];
} TPacketGCPartyAdd;

typedef struct command_party_invite
{
    BYTE    header;
    DWORD    vid;
} TPacketCGPartyInvite;

typedef struct packet_party_invite
{
    BYTE    header;
    DWORD    leader_vid;
} TPacketGCPartyInvite;

typedef struct command_party_invite_answer
{
    BYTE    header;
    DWORD    leader_vid;
    BYTE    accept;
} TPacketCGPartyInviteAnswer;

typedef struct packet_party_update
{
    BYTE    header;
    DWORD    pid;
    BYTE    role;
    BYTE    percent_hp;
    short    affects[7];
} TPacketGCPartyUpdate;

typedef struct packet_party_remove
{
    BYTE header;
    DWORD pid;
} TPacketGCPartyRemove;

typedef struct packet_party_link
{
    BYTE header;
    DWORD pid;
    DWORD vid;
} TPacketGCPartyLink;

typedef struct packet_party_unlink
{
    BYTE header;
    DWORD pid;
    DWORD vid;
} TPacketGCPartyUnlink;

typedef struct command_party_remove
{
    BYTE header;
    DWORD pid;
} TPacketCGPartyRemove;

typedef struct command_party_set_state
{
    BYTE header;
    DWORD pid;
    BYTE byRole;
    BYTE flag;
} TPacketCGPartySetState;

enum
{
    PARTY_SKILL_HEAL = 1,
    PARTY_SKILL_WARP = 2
};

typedef struct command_party_use_skill
{
    BYTE header;
    BYTE bySkillIndex;
    DWORD vid;
} TPacketCGPartyUseSkill;

typedef struct packet_safebox_size
{
    BYTE bHeader;
    BYTE bSize;
} TPacketCGSafeboxSize;

typedef struct packet_safebox_wrong_password
{
    BYTE    bHeader;
} TPacketCGSafeboxWrongPassword;

typedef struct command_empire
{
    BYTE    bHeader;
    BYTE    bEmpire;
} TPacketCGEmpire;

typedef struct packet_empire
{
    BYTE    bHeader;
    BYTE    bEmpire;
} TPacketGCEmpire;

enum
{
    SAFEBOX_MONEY_STATE_SAVE,
    SAFEBOX_MONEY_STATE_WITHDRAW,
};

typedef struct command_safebox_money
{
    BYTE        bHeader;
    BYTE        bState;
    long    lMoney;
} TPacketCGSafeboxMoney;

typedef struct packet_safebox_money_change
{
    BYTE    bHeader;
    long    lMoney;
} TPacketGCSafeboxMoneyChange;

// Guild

enum
{
    GUILD_SUBHEADER_GC_LOGIN,
    GUILD_SUBHEADER_GC_LOGOUT,
    GUILD_SUBHEADER_GC_LIST,
    GUILD_SUBHEADER_GC_GRADE,
    GUILD_SUBHEADER_GC_ADD,
    GUILD_SUBHEADER_GC_REMOVE,
    GUILD_SUBHEADER_GC_GRADE_NAME,
    GUILD_SUBHEADER_GC_GRADE_AUTH,
    GUILD_SUBHEADER_GC_INFO,
    GUILD_SUBHEADER_GC_COMMENTS,
    GUILD_SUBHEADER_GC_CHANGE_EXP,
    GUILD_SUBHEADER_GC_CHANGE_MEMBER_GRADE,
    GUILD_SUBHEADER_GC_SKILL_INFO,
    GUILD_SUBHEADER_GC_CHANGE_MEMBER_GENERAL,
    GUILD_SUBHEADER_GC_GUILD_INVITE,
    GUILD_SUBHEADER_GC_WAR,
    GUILD_SUBHEADER_GC_GUILD_NAME,
    GUILD_SUBHEADER_GC_GUILD_WAR_LIST,
    GUILD_SUBHEADER_GC_GUILD_WAR_END_LIST,
    GUILD_SUBHEADER_GC_WAR_SCORE,
    GUILD_SUBHEADER_GC_MONEY_CHANGE,
};

enum GUILD_SUBHEADER_CG
{
    GUILD_SUBHEADER_CG_ADD_MEMBER,
    GUILD_SUBHEADER_CG_REMOVE_MEMBER,
    GUILD_SUBHEADER_CG_CHANGE_GRADE_NAME,
    GUILD_SUBHEADER_CG_CHANGE_GRADE_AUTHORITY,
    GUILD_SUBHEADER_CG_OFFER,
    GUILD_SUBHEADER_CG_POST_COMMENT,
    GUILD_SUBHEADER_CG_DELETE_COMMENT,
    GUILD_SUBHEADER_CG_REFRESH_COMMENT,
    GUILD_SUBHEADER_CG_CHANGE_MEMBER_GRADE,
    GUILD_SUBHEADER_CG_USE_SKILL,
    GUILD_SUBHEADER_CG_CHANGE_MEMBER_GENERAL,
    GUILD_SUBHEADER_CG_GUILD_INVITE_ANSWER,
    GUILD_SUBHEADER_CG_CHARGE_GSP,
    GUILD_SUBHEADER_CG_DEPOSIT_MONEY,
    GUILD_SUBHEADER_CG_WITHDRAW_MONEY,
};

typedef struct packet_guild
{
    BYTE header;
    WORD size;
    BYTE subheader;
} TPacketGCGuild;

typedef struct packet_guild_name_t
{
    BYTE header;
    WORD size;
    BYTE subheader;
    DWORD    guildID;
    char    guildName[GUILD_NAME_MAX_LEN];
} TPacketGCGuildName;

typedef struct packet_guild_war
{
    DWORD    dwGuildSelf;
    DWORD    dwGuildOpp;
    BYTE    bType;
    BYTE     bWarState;
} TPacketGCGuildWar;

typedef struct command_guild
{
    BYTE header;
    BYTE subheader;
} TPacketCGGuild;

typedef struct command_guild_answer_make_guild
{
    BYTE header;
    char guild_name[GUILD_NAME_MAX_LEN+1];
} TPacketCGAnswerMakeGuild;

typedef struct command_guild_use_skill
{
    DWORD    dwVnum;
    DWORD    dwPID;
} TPacketCGGuildUseSkill;

// Guild Mark
typedef struct command_mark_login
{
    BYTE    header;
    DWORD   handle;
    DWORD   random_key;
} TPacketCGMarkLogin;

typedef struct command_mark_upload
{
    BYTE    header;
    DWORD    gid;
    BYTE    image[16*12*4];
} TPacketCGMarkUpload;

typedef struct command_mark_idxlist
{
    BYTE    header;
} TPacketCGMarkIDXList;

typedef struct command_mark_crclist
{
    BYTE    header;
    BYTE    imgIdx;
    DWORD    crclist[80];
} TPacketCGMarkCRCList;

typedef struct packet_mark_idxlist
{
    BYTE    header;
    DWORD    bufSize;
    WORD    count;
    //µÚ¿¡ size * (WORD + WORD)¸¸Å µ¥ÀÌÅÍ ºÙÀ½
} TPacketGCMarkIDXList;

typedef struct packet_mark_block
{
    BYTE    header;
    DWORD    bufSize;
    BYTE    imgIdx;
    DWORD    count;
    // µÚ¿¡ 64 x 48 x Çȼ¿Å©±â(4¹ÙÀÌÆ®) = 12288¸¸Å µ¥ÀÌÅÍ ºÙÀ½
} TPacketGCMarkBlock;

typedef struct command_symbol_upload
{
    BYTE    header;
    WORD    size;
    DWORD    guild_id;
} TPacketCGGuildSymbolUpload;

typedef struct command_symbol_crc
{
    BYTE header;
    DWORD guild_id;
    DWORD crc;
    DWORD size;
} TPacketCGSymbolCRC;

typedef struct packet_symbol_data
{
    BYTE header;
    WORD size;
    DWORD guild_id;
} TPacketGCGuildSymbolData;

// Fishing

typedef struct command_fishing
{
    BYTE header;
    BYTE dir;
} TPacketCGFishing;

typedef struct packet_fishing
{
    BYTE header;
    BYTE subheader;
    DWORD info;
    BYTE dir;
} TPacketGCFishing;

enum
{
    FISHING_SUBHEADER_GC_START,
    FISHING_SUBHEADER_GC_STOP,
    FISHING_SUBHEADER_GC_REACT,
    FISHING_SUBHEADER_GC_SUCCESS,
    FISHING_SUBHEADER_GC_FAIL,
    FISHING_SUBHEADER_GC_FISH,
};

typedef struct command_give_item
{
    BYTE byHeader;
    DWORD dwTargetVID;
    TItemPos ItemPos;
    BYTE byItemCount;
} TPacketCGGiveItem;

typedef struct SPacketCGHack
{
    BYTE    bHeader;
    char    szBuf[255 + 1];
} TPacketCGHack;

// SubHeader - Dungeon
enum
{
    DUNGEON_SUBHEADER_GC_TIME_ATTACK_START = 0,
    DUNGEON_SUBHEADER_GC_DESTINATION_POSITION = 1,
};

typedef struct packet_dungeon
{
    BYTE bHeader;
    WORD size;
    BYTE subheader;
} TPacketGCDungeon;

typedef struct packet_dungeon_dest_position
{
    long x;
    long y;
} TPacketGCDungeonDestPosition;

typedef struct SPacketGCShopSign
{
    BYTE    bHeader;
    DWORD    dwVID;
    char    szSign[SHOP_SIGN_MAX_LEN + 1];
} TPacketGCShopSign;

typedef struct SPacketCGMyShop
{
    BYTE    bHeader;
    char    szSign[SHOP_SIGN_MAX_LEN + 1];
    BYTE    bCount;
} TPacketCGMyShop;

// BEGIN_OFFLINE_SHOP
typedef struct SOfflineShopItemTable
{
    TItemPos    item_pos;
    int            iPrice;
} TOfflineShopItemTable;

typedef struct TPacketCGMyOfflineShop
{
    BYTE    bHeader;
    char    szSign[SHOP_SIGN_MAX_LEN + 1];
    BYTE    bCount;
    BYTE    bTime;
} TPacketCGMyOfflineShop;
// END_OF_OFFLINE_SHOP

typedef struct SPacketGCTime
{
    BYTE    bHeader;
    time_t    time;
} TPacketGCTime;

enum
{
    WALKMODE_RUN,
    WALKMODE_WALK,
};

typedef struct SPacketGCWalkMode
{
    BYTE    header;
    DWORD    vid;
    BYTE    mode;
} TPacketGCWalkMode;

typedef struct SPacketGCChangeSkillGroup
{
    BYTE        header;
    BYTE        skill_group;
} TPacketGCChangeSkillGroup;

typedef struct SPacketCGRefine
{
    BYTE    header;
    BYTE    pos;
    BYTE    type;
} TPacketCGRefine;

typedef struct SPacketCGRequestRefineInfo
{
    BYTE    header;
    BYTE    pos;
} TPacketCGRequestRefineInfo;

typedef struct SPacketGCRefineInformaion
{
    BYTE    header;
    BYTE    type;
    BYTE    pos;
    DWORD    src_vnum;
    DWORD    result_vnum;
    BYTE    material_count;
    int        cost; // ¼Ò¿ä ºñ¿ë
    int        prob; // È®·ü
    TRefineMaterial materials[REFINE_MATERIAL_MAX_NUM];
} TPacketGCRefineInformation;

struct TNPCPosition
{
    BYTE bType;
    char name[CHARACTER_NAME_MAX_LEN+1];
    long x;
    long y;
};

typedef struct SPacketGCNPCPosition
{
    BYTE header;
    WORD size;
    WORD count;

    // array of TNPCPosition
} TPacketGCNPCPosition;

typedef struct SPacketGCSpecialEffect
{
    BYTE header;
    BYTE type;
    DWORD vid;
} TPacketGCSpecialEffect;

typedef struct SPacketCGChangeName
{
    BYTE header;
    BYTE index;
    char name[CHARACTER_NAME_MAX_LEN+1];
} TPacketCGChangeName;

typedef struct SPacketGCChangeName
{
    BYTE header;
    DWORD pid;
    char name[CHARACTER_NAME_MAX_LEN+1];
} TPacketGCChangeName;


typedef struct command_client_version
{
    BYTE header;
    char filename[32+1];
    char timestamp[32+1];
} TPacketCGClientVersion;

typedef struct command_client_version2
{
    BYTE header;
    char filename[32+1];
    char timestamp[32+1];
} TPacketCGClientVersion2;

typedef struct packet_channel
{
    BYTE header;
    BYTE channel;
} TPacketGCChannel;

typedef struct SEquipmentItemSet
{
    DWORD   vnum;
    BYTE    count;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
} TEquipmentItemSet;

typedef struct pakcet_view_equip
{
    BYTE  header;
    DWORD vid;
    TEquipmentItemSet equips[WEAR_MAX_NUM];
} TPacketViewEquip;

typedef struct
{
    DWORD    dwID;
    long    x, y;
    long    width, height;
    DWORD    dwGuildID;
} TLandPacketElement;

typedef struct packet_land_list
{
    BYTE    header;
    WORD    size;
} TPacketGCLandList;

typedef struct
{
    BYTE    bHeader;
    long    lID;
    char    szName[32+1];
    DWORD    dwVID;
    BYTE    bType;
} TPacketGCTargetCreate;

typedef struct
{
    BYTE    bHeader;
    long    lID;
    long    lX, lY;
} TPacketGCTargetUpdate;

typedef struct
{
    BYTE    bHeader;
    long    lID;
} TPacketGCTargetDelete;

typedef struct
{
    BYTE        bHeader;
    TPacketAffectElement elem;
} TPacketGCAffectAdd;

typedef struct
{
    BYTE    bHeader;
    DWORD    dwType;
    BYTE    bApplyOn;
} TPacketGCAffectRemove;

typedef struct packet_lover_info
{
    BYTE header;
    char name[CHARACTER_NAME_MAX_LEN + 1];
    BYTE love_point;
} TPacketGCLoverInfo;

typedef struct packet_love_point_update
{
    BYTE header;
    BYTE love_point;
} TPacketGCLovePointUpdate;

// MINING
typedef struct packet_dig_motion
{
    BYTE header;
    DWORD vid;
    DWORD target_vid;
    BYTE count;
} TPacketGCDigMotion;
// END_OF_MINING

// SCRIPT_SELECT_ITEM
typedef struct command_script_select_item
{
    BYTE header;
    DWORD selection;
} TPacketCGScriptSelectItem;
// END_OF_SCRIPT_SELECT_ITEM

typedef struct packet_damage_info
{
    BYTE header;
    DWORD dwVID;
    BYTE flag;
    int damage;
} TPacketGCDamageInfo;

enum
{
    RUNUP_MATRIX_ANSWER_MAX_LEN = 4,
    RUNUP_MATRIX_QUIZ_MAX_LEN = 8 ,

};

typedef struct packet_runup_matrix_quiz
{
    BYTE    bHeader;
    char    szQuiz[RUNUP_MATRIX_QUIZ_MAX_LEN + 1];
} TPacketGCRunupMatrixQuiz;

typedef struct command_runup_matrix_answer
{
    BYTE    bHeader;
    char    szAnswer[RUNUP_MATRIX_ANSWER_MAX_LEN + 1];
} TPacketCGRunupMatrixAnswer;

typedef struct packet_passpod
{
    BYTE    bHeader;
    char    szAnswer[8+1];
} TPacketCGPasspod;

typedef struct packet_passpod_failed
{
    BYTE    bHeader;
    char    szMessage[128];
} TPacketCGPasspodFailed;

typedef struct tag_GGSiege
{
    BYTE    bHeader;
    BYTE    bEmpire;
    BYTE    bTowerCount;
} TPacketGGSiege;

typedef struct SPacketGGMonarchTransfer
{
    BYTE    bHeader;
    DWORD    dwTargetPID;
    long    x;
    long    y;
} TPacketMonarchGGTransfer;

typedef struct SPacketGGPCBangUpdate
{
    BYTE bHeader;
    unsigned long ulPCBangID;
} TPacketPCBangUpdate;

typedef struct SPacketGGCheckAwakeness
{
    BYTE bHeader;
} TPacketGGCheckAwakeness;

typedef struct SPacketGCPanamaPack
{
    BYTE    bHeader;
    char    szPackName[256];
    BYTE    abIV[32];
} TPacketGCPanamaPack;

//TODO :  ¾Æ¿ì ¯³ª..°¡º¯ÆĞŶ »çÀÌÁî ¹Ş¾ÆµéÀϼö ÀÖ°Ô ÆĞŶ Çڵ鷯 Refactoring ÇÏÀÚ.
typedef struct SPacketGCHybridCryptKeys
{
    SPacketGCHybridCryptKeys() : m_pStream(NULL) {}
    ~SPacketGCHybridCryptKeys()
    {
        //GCC ¿¡¼± NULL delete ÇØµµ ±¦Âú³ª? ÀÏ´Ü ¾ÈÀüÇÏ°Ô NULL üũ ÇÏÀÚ. ( ±Ùµ¥ À̰ŠC++ Ç¥ÁؾƴϾú³ª --a )
        if( m_pStream )
        {
            delete[] m_pStream;
            m_pStream = NULL;
        }
    }

    DWORD GetStreamSize()
    {
        return sizeof(bHeader) + sizeof(WORD) + sizeof(int) + KeyStreamLen;
    }

    BYTE* GetStreamData()
    {
        if( m_pStream )
            delete[] m_pStream;

        uDynamicPacketSize = (WORD)GetStreamSize();

        m_pStream = new BYTE[ uDynamicPacketSize ];

        memcpy( m_pStream, &bHeader, 1 );
        memcpy( m_pStream+1, &uDynamicPacketSize, 2 );
        memcpy( m_pStream+3, &KeyStreamLen, 4 );

        if( KeyStreamLen > 0 )
            memcpy( m_pStream+7, pDataKeyStream, KeyStreamLen );

        return m_pStream;
    }

    BYTE    bHeader;
    WORD    uDynamicPacketSize; // ºô¾î¸ÔÀ» Ŭ¶ó  DynamicPacketHeader ±¸Á¶¶§¹®¿¡ ¸ÂÃçÁà¾ßÇÑ´Ù -_-;
    int        KeyStreamLen;
    BYTE*   pDataKeyStream;

private:
    BYTE* m_pStream;


} TPacketGCHybridCryptKeys;


typedef struct SPacketGCPackageSDB
{
    SPacketGCPackageSDB() : m_pDataSDBStream(NULL), m_pStream(NULL) {}
    ~SPacketGCPackageSDB()
    {
        if( m_pStream )
        {
            delete[] m_pStream;
            m_pStream = NULL;
        }
    }

    DWORD GetStreamSize()
    {
        return sizeof(bHeader) + sizeof(WORD) + sizeof(int) + iStreamLen;
    }

    BYTE* GetStreamData()
    {
        if( m_pStream )
            delete[] m_pStream;

        uDynamicPacketSize =  GetStreamSize();

        m_pStream = new BYTE[ uDynamicPacketSize ];

        memcpy( m_pStream, &bHeader, 1 );
        memcpy( m_pStream+1, &uDynamicPacketSize, 2 );
        memcpy( m_pStream+3, &iStreamLen, 4 );

        if( iStreamLen > 0 )
            memcpy( m_pStream+7, m_pDataSDBStream, iStreamLen );

        return m_pStream;
    }

    BYTE    bHeader;
    WORD    uDynamicPacketSize; // ºô¾î¸ÔÀ» Ŭ¶ó  DynamicPacketHeader ±¸Á¶¶§¹®¿¡ ¸ÂÃçÁà¾ßÇÑ´Ù -_-;
    int        iStreamLen;
    BYTE*   m_pDataSDBStream;

private:
    BYTE* m_pStream;


} TPacketGCPackageSDB;

#ifdef _IMPROVED_PACKET_ENCRYPTION_
struct TPacketKeyAgreement
{
    static const int MAX_DATA_LEN = 256;
    BYTE bHeader;
    WORD wAgreedLength;
    WORD wDataLength;
    BYTE data[MAX_DATA_LEN];
};

struct TPacketKeyAgreementCompleted
{
    BYTE bHeader;
    BYTE data[3]; // dummy (not used)
};

#endif // _IMPROVED_PACKET_ENCRYPTION_

#define MAX_EFFECT_FILE_NAME 128
typedef struct SPacketGCSpecificEffect
{
    BYTE header;
    DWORD vid;
    char effect_file[MAX_EFFECT_FILE_NAME];
} TPacketGCSpecificEffect;

// ¿ëÈ¥¼®
enum EDragonSoulRefineWindowRefineType
{
    DragonSoulRefineWindow_UPGRADE,
    DragonSoulRefineWindow_IMPROVEMENT,
    DragonSoulRefineWindow_REFINE,
};

enum EPacketCGDragonSoulSubHeaderType
{
    DS_SUB_HEADER_OPEN,
    DS_SUB_HEADER_CLOSE,
    DS_SUB_HEADER_DO_REFINE_GRADE,
    DS_SUB_HEADER_DO_REFINE_STEP,
    DS_SUB_HEADER_DO_REFINE_STRENGTH,
    DS_SUB_HEADER_REFINE_FAIL,
    DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE,
    DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL,
    DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY,
    DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL,
    DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL,
    DS_SUB_HEADER_REFINE_SUCCEED,
};
typedef struct SPacketCGDragonSoulRefine
{
    SPacketCGDragonSoulRefine() : header (HEADER_CG_DRAGON_SOUL_REFINE)
    {}
    BYTE header;
    BYTE bSubType;
    TItemPos ItemGrid[DRAGON_SOUL_REFINE_GRID_SIZE];
} TPacketCGDragonSoulRefine;

typedef struct SPacketGCDragonSoulRefine
{
    SPacketGCDragonSoulRefine() : header(HEADER_GC_DRAGON_SOUL_REFINE)
    {}
    BYTE header;
    BYTE bSubType;
    TItemPos Pos;
} TPacketGCDragonSoulRefine;

typedef struct SPacketCGStateCheck
{
    BYTE header;
    unsigned long key;
    unsigned long index;
} TPacketCGStateCheck;

typedef struct SPacketGCStateCheck
{
    BYTE header;
    unsigned long key;
    unsigned long index;
    unsigned char state;
} TPacketGCStateCheck;

// BEGIN_OFFLINE_SHOP
typedef struct SPacketGGOfflineShopMessage
{
    BYTE    bHeader;
    DWORD    dwTargetPID;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    char    szItemName[ITEM_NAME_MAX_LEN + 1];
} TPacketGGOfflineShopMessage;
// END_OF_OFFLINE_SHOP

#pragma pack()
#endif
 
C++:
#ifndef __INC_PACKET_H__
#define __INC_PACKET_H__
#include "stdafx.h"

enum
{
    HEADER_CG_HANDSHAKE                = 0xff,
    HEADER_CG_PONG                = 0xfe,
    HEADER_CG_TIME_SYNC                = 0xfc,
    HEADER_CG_KEY_AGREEMENT            = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_

    HEADER_CG_LOGIN                = 1,
    HEADER_CG_ATTACK                = 2,
    HEADER_CG_CHAT                = 3,
    HEADER_CG_CHARACTER_CREATE            = 4,
    HEADER_CG_CHARACTER_DELETE            = 5,
    HEADER_CG_CHARACTER_SELECT            = 6,
    HEADER_CG_MOVE                = 7,
    HEADER_CG_SYNC_POSITION            = 8,
    HEADER_CG_ENTERGAME                = 10,

    HEADER_CG_ITEM_USE                = 11,
    HEADER_CG_ITEM_DROP                = 12,
    HEADER_CG_ITEM_MOVE                = 13,
    HEADER_CG_ITEM_PICKUP            = 15,

    HEADER_CG_QUICKSLOT_ADD            = 16,
    HEADER_CG_QUICKSLOT_DEL            = 17,
    HEADER_CG_QUICKSLOT_SWAP            = 18,
    HEADER_CG_WHISPER                = 19,
    HEADER_CG_ITEM_DROP2            = 20,

    HEADER_CG_ON_CLICK                = 26,
    HEADER_CG_EXCHANGE                = 27,
    HEADER_CG_CHARACTER_POSITION        = 28,
    HEADER_CG_SCRIPT_ANSWER            = 29,
    HEADER_CG_QUEST_INPUT_STRING        = 30,
    HEADER_CG_QUEST_CONFIRM            = 31,

    HEADER_CG_SHOP                = 50,
    HEADER_CG_FLY_TARGETING            = 51,
    HEADER_CG_USE_SKILL                = 52,
    HEADER_CG_ADD_FLY_TARGETING            = 53,
    HEADER_CG_SHOOT                = 54,
    HEADER_CG_MYSHOP                = 55,

    // BEGIN_OFFLINE_SHOP
    HEADER_CG_OFFLINE_SHOP            = 56,
    HEADER_CG_MY_OFFLINE_SHOP        = 57,
    // END_OF_OFFLINE_SHOP

    HEADER_CG_ITEM_USE_TO_ITEM            = 60,
    HEADER_CG_TARGET                 = 61,

    HEADER_CG_TEXT                = 64,    // @ ·Î ½ÃÀ۵Ǹé ÅØ½ºÆ®¸¦ ÆÄ½ÌÇÑ´Ù.
    HEADER_CG_WARP                = 65,
    HEADER_CG_SCRIPT_BUTTON            = 66,
    HEADER_CG_MESSENGER                = 67,

    HEADER_CG_MALL_CHECKOUT            = 69,
    HEADER_CG_SAFEBOX_CHECKIN            = 70,    // ¾ÆÀÌÅÛÀ» â°í¿¡ ³Ö†š´Â´Ù.
    HEADER_CG_SAFEBOX_CHECKOUT            = 71,    // ¾ÆÀÌÅÛÀ» â°í·Î ºÎÅÍ »©¿Â´Ù.

    HEADER_CG_PARTY_INVITE            = 72,
    HEADER_CG_PARTY_INVITE_ANSWER        = 73,
    HEADER_CG_PARTY_REMOVE            = 74,
    HEADER_CG_PARTY_SET_STATE                   = 75,
    HEADER_CG_PARTY_USE_SKILL            = 76,
    HEADER_CG_SAFEBOX_ITEM_MOVE            = 77,
    HEADER_CG_PARTY_PARAMETER            = 78,

    HEADER_CG_GUILD                = 80,
    HEADER_CG_ANSWER_MAKE_GUILD            = 81,

    HEADER_CG_FISHING                = 82,

    HEADER_CG_ITEM_GIVE                = 83,

    HEADER_CG_EMPIRE                = 90,

    HEADER_CG_REFINE                = 96,

    HEADER_CG_MARK_LOGIN            = 100,
    HEADER_CG_MARK_CRCLIST            = 101,
    HEADER_CG_MARK_UPLOAD            = 102,
    HEADER_CG_MARK_IDXLIST            = 104,

    HEADER_CG_HACK                    = 105,
    HEADER_CG_CHANGE_NAME            = 106,
    HEADER_CG_LOGIN2                = 109,
    HEADER_CG_DUNGEON                = 110,
    HEADER_CG_LOGIN3                = 111,

    HEADER_CG_GUILD_SYMBOL_UPLOAD    = 112,
    HEADER_CG_SYMBOL_CRC            = 113,

    // SCRIPT_SELECT_ITEM
    HEADER_CG_SCRIPT_SELECT_ITEM    = 114,
    // END_OF_SCRIPT_SELECT_ITEM

    HEADER_CG_LOGIN5_OPENID            = 116,    //OpenID : Ŭ¶óÀÌ¾ğÆ®·ÎºÎÅÍ OpenID ÀÎÁõ۸¦ ¹Ş´Â´Ù.

//    HEADER_CG_ROULETTE                = 200,
//    HEADER_CG_RUNUP_MATRIX_ANSWER    = 201,

    //
    HEADER_CG_PASSPOD_ANSWER        = 202,

    //NOTE : ÀÌ·± °³XXX Á¤¸» À̰ŠPacket¼³°èÇÑ »ç¶÷Àº ´©±¸³Ä. ÀÌ·¸°Ô ÄÚµùÇÏ°í ¹äÀÌ ³Ñ¾î°¡³ª.
    //enumÀ» º°µµ·Î ±¸º°À» ÇÏ´ø°¡. ¾Æ´Ô namepsace·Î ±¸º°À» ÇÏ´ø°¡..
    //Á¤¸» packet generator±îÁö´Â ¹Ù¶óÁöµµ ¾Ê´Â´Ù. ÀÌ·± ¾¾XX
    //ÀÌ·¯´Ù°¡ ¼ıÀÚ °ãÄ¡¸é ´©°¡ Ã¥ÀÓÁö´Âµ¥???
    HEADER_CG_HS_ACK                = 203,
    HEADER_CG_XTRAP_ACK                = 204,

    HEADER_CG_DRAGON_SOUL_REFINE            = 205,
    HEADER_CG_STATE_CHECKER                    = 206,

    HEADER_CG_CLIENT_VERSION            = 0xfd,
    HEADER_CG_CLIENT_VERSION2            = 0xf1,

    /********************************************************/
    HEADER_GC_KEY_AGREEMENT_COMPLETED = 0xfa, // _IMPROVED_PACKET_ENCRYPTION_
    HEADER_GC_KEY_AGREEMENT            = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_
    HEADER_GC_TIME_SYNC                = 0xfc,
    HEADER_GC_PHASE                    = 0xfd,
    HEADER_GC_BINDUDP                = 0xfe,
    HEADER_GC_HANDSHAKE                = 0xff,

    HEADER_GC_CHARACTER_ADD            = 1,
    HEADER_GC_CHARACTER_DEL            = 2,
    HEADER_GC_MOVE                    = 3,
    HEADER_GC_CHAT                    = 4,
    HEADER_GC_SYNC_POSITION            = 5,

    HEADER_GC_LOGIN_SUCCESS            = 6,
    HEADER_GC_LOGIN_SUCCESS_NEWSLOT    = 32,
    HEADER_GC_LOGIN_FAILURE            = 7,

    HEADER_GC_CHARACTER_CREATE_SUCCESS        = 8,
    HEADER_GC_CHARACTER_CREATE_FAILURE        = 9,
    HEADER_GC_CHARACTER_DELETE_SUCCESS        = 10,
    HEADER_GC_CHARACTER_DELETE_WRONG_SOCIAL_ID    = 11,

    HEADER_GC_ATTACK                = 12,
    HEADER_GC_STUN                = 13,
    HEADER_GC_DEAD                = 14,

    HEADER_GC_MAIN_CHARACTER_OLD        = 15,
    HEADER_GC_CHARACTER_POINTS            = 16,
    HEADER_GC_CHARACTER_POINT_CHANGE        = 17,
    HEADER_GC_CHANGE_SPEED            = 18,
    HEADER_GC_CHARACTER_UPDATE            = 19,
    HEADER_GC_CHARACTER_UPDATE_NEW        = 24,

    HEADER_GC_ITEM_DEL                = 20,
    HEADER_GC_ITEM_SET                = 21,
    HEADER_GC_ITEM_USE                = 22,
    HEADER_GC_ITEM_DROP                = 23,
    HEADER_GC_ITEM_UPDATE            = 25,

    HEADER_GC_ITEM_GROUND_ADD            = 26,
    HEADER_GC_ITEM_GROUND_DEL            = 27,

    HEADER_GC_QUICKSLOT_ADD            = 28,
    HEADER_GC_QUICKSLOT_DEL            = 29,
    HEADER_GC_QUICKSLOT_SWAP            = 30,

    HEADER_GC_ITEM_OWNERSHIP            = 31,

    HEADER_GC_WHISPER                = 34,

    HEADER_GC_MOTION                = 36,
    HEADER_GC_PARTS                = 37,

    HEADER_GC_SHOP                = 38,
    HEADER_GC_SHOP_SIGN                = 39,

    HEADER_GC_DUEL_START                = 40,
    HEADER_GC_PVP                               = 41,
    HEADER_GC_EXCHANGE                = 42,
    HEADER_GC_CHARACTER_POSITION        = 43,

    HEADER_GC_PING                = 44,
    HEADER_GC_SCRIPT                = 45,
    HEADER_GC_QUEST_CONFIRM            = 46,

    // BEGIN_OFFLINE_SHOP
    HEADER_GC_OFFLINE_SHOP                        = 47,
    HEADER_GC_OFFLINE_SHOP_SIGN                    = 48,
    // END_OF_OFFLINE_SHOP

    HEADER_GC_MOUNT                = 61,
    HEADER_GC_OWNERSHIP                = 62,
    HEADER_GC_TARGET                 = 63,

    HEADER_GC_WARP                = 65,

    HEADER_GC_ADD_FLY_TARGETING            = 69,
    HEADER_GC_CREATE_FLY            = 70,
    HEADER_GC_FLY_TARGETING            = 71,
    HEADER_GC_SKILL_LEVEL_OLD            = 72,
    HEADER_GC_SKILL_LEVEL            = 76,

    HEADER_GC_MESSENGER                = 74,
    HEADER_GC_GUILD                = 75,

    HEADER_GC_PARTY_INVITE            = 77,
    HEADER_GC_PARTY_ADD                = 78,
    HEADER_GC_PARTY_UPDATE            = 79,
    HEADER_GC_PARTY_REMOVE            = 80,
    HEADER_GC_QUEST_INFO            = 81,
    HEADER_GC_REQUEST_MAKE_GUILD        = 82,
    HEADER_GC_PARTY_PARAMETER            = 83,

    HEADER_GC_SAFEBOX_SET            = 85,
    HEADER_GC_SAFEBOX_DEL            = 86,
    HEADER_GC_SAFEBOX_WRONG_PASSWORD        = 87,
    HEADER_GC_SAFEBOX_SIZE            = 88,

    HEADER_GC_FISHING                = 89,

    HEADER_GC_EMPIRE                = 90,

    HEADER_GC_PARTY_LINK            = 91,
    HEADER_GC_PARTY_UNLINK            = 92,

    HEADER_GC_REFINE_INFORMATION_OLD        = 95,

    HEADER_GC_VIEW_EQUIP            = 99,

    HEADER_GC_MARK_BLOCK            = 100,
    HEADER_GC_MARK_IDXLIST            = 102,

    HEADER_GC_TIME                    = 106,
    HEADER_GC_CHANGE_NAME            = 107,

    HEADER_GC_DUNGEON                = 110,

    HEADER_GC_WALK_MODE                = 111,
    HEADER_GC_SKILL_GROUP            = 112,
    HEADER_GC_MAIN_CHARACTER            = 113,

    //    HEADER_GC_USE_POTION            = 114,
    HEADER_GC_SEPCIAL_EFFECT        = 114,

    HEADER_GC_NPC_POSITION            = 115,

    HEADER_GC_MATRIX_CARD            = 116,
    HEADER_GC_LOGIN_KEY                = 118,
    HEADER_GC_REFINE_INFORMATION        = 119,
    HEADER_GC_CHANNEL                = 121,

    // 122 HEADER_GC_MALL_OPEN
    HEADER_GC_TARGET_UPDATE            = 123,
    HEADER_GC_TARGET_DELETE            = 124,
    HEADER_GC_TARGET_CREATE            = 125,

    HEADER_GC_AFFECT_ADD            = 126,
    HEADER_GC_AFFECT_REMOVE            = 127,

    HEADER_GC_MALL_OPEN                = 122,
    HEADER_GC_MALL_SET                = 128,
    HEADER_GC_MALL_DEL                = 129,

    HEADER_GC_LAND_LIST                = 130,
    HEADER_GC_LOVER_INFO            = 131,
    HEADER_GC_LOVE_POINT_UPDATE            = 132,

    HEADER_GC_SYMBOL_DATA            = 133,

    // MINING
    HEADER_GC_DIG_MOTION            = 134,
    // END_OF_MINING

    HEADER_GC_DAMAGE_INFO           = 135,
    HEADER_GC_CHAR_ADDITIONAL_INFO    = 136,

    // SUPPORT_BGM
    HEADER_GC_MAIN_CHARACTER3_BGM        = 137,
    HEADER_GC_MAIN_CHARACTER4_BGM_VOL    = 138,
    // END_OF_SUPPORT_BGM

    HEADER_GC_AUTH_SUCCESS            = 150,

    HEADER_GC_PANAMA_PACK            = 151,

    //HYBRID CRYPT
    HEADER_GC_HYBRIDCRYPT_KEYS        = 152,
    HEADER_GC_HYBRIDCRYPT_SDB        = 153, // SDB means Supplmentary Data Blocks
    //HYBRID CRYPT

    HEADER_GC_AUTH_SUCCESS_OPENID    = 154,

    // ROULETTE
    HEADER_GC_ROULETTE                    = 200,
    // END_ROULETTE
    //
    HEADER_GC_REQUEST_PASSPOD                = 202,
    HEADER_GC_REQUEST_PASSPOD_FAILED        = 203,

    HEADER_GC_HS_REQUEST                    = 204,
    HEADER_GC_XTRAP_CS1_REQUEST                = 205,

    HEADER_GC_SPECIFIC_EFFECT                = 208,

    HEADER_GC_DRAGON_SOUL_REFINE            = 209,
    HEADER_GC_RESPOND_CHANNELSTATUS            = 210,


    /////////////////////////////////////////////////////////////////////////////

    HEADER_GG_LOGIN                = 1,
    HEADER_GG_LOGOUT                = 2,
    HEADER_GG_RELAY                = 3,
    HEADER_GG_NOTICE                = 4,
    HEADER_GG_SHUTDOWN                = 5,
    HEADER_GG_GUILD                = 6,
    HEADER_GG_DISCONNECT            = 7,    // ´©±º°¡ÀÇ Á¢¼ÓÀ» °Á¦·Î ²÷À» ¶§
    HEADER_GG_SHOUT                = 8,
    HEADER_GG_SETUP                = 9,
    HEADER_GG_MESSENGER_ADD                     = 10,
    HEADER_GG_MESSENGER_REMOVE                  = 11,
    HEADER_GG_FIND_POSITION            = 12,
    HEADER_GG_WARP_CHARACTER            = 13,
    HEADER_GG_MESSENGER_MOBILE            = 14,
    HEADER_GG_GUILD_WAR_ZONE_MAP_INDEX        = 15,
    HEADER_GG_TRANSFER                = 16,
    HEADER_GG_XMAS_WARP_SANTA            = 17,
    HEADER_GG_XMAS_WARP_SANTA_REPLY        = 18,
    HEADER_GG_RELOAD_CRC_LIST            = 19,
    HEADER_GG_LOGIN_PING            = 20,
    HEADER_GG_CHECK_CLIENT_VERSION        = 21,
    HEADER_GG_BLOCK_CHAT            = 22,

    HEADER_GG_BLOCK_EXCEPTION        = 24,
    HEADER_GG_SIEGE                    = 25,
    HEADER_GG_MONARCH_NOTICE        = 26,
    HEADER_GG_MONARCH_TRANSFER        = 27,
    HEADER_GG_PCBANG_UPDATE            = 28,

    HEADER_GG_CHECK_AWAKENESS        = 29,

    // BEGIN_OFFLINE_SHOP
    HEADER_GG_OFFLINE_SHOP_SEND_MESSAGE            = 30,
    // END_OF_OFFLINE_SHOP

#ifdef ENABLE_FULL_NOTICE
    HEADER_GG_BIG_NOTICE            = 30,
#endif
};

#pragma pack(1)
typedef struct SPacketGGSetup
{
    BYTE    bHeader;
    WORD    wPort;
    BYTE    bChannel;
} TPacketGGSetup;

typedef struct SPacketGGLogin
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    DWORD    dwPID;
    BYTE    bEmpire;
    long    lMapIndex;
    BYTE    bChannel;
} TPacketGGLogin;

typedef struct SPacketGGLogout
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGGLogout;

typedef struct SPacketGGRelay
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    long    lSize;
} TPacketGGRelay;

typedef struct SPacketGGNotice
{
    BYTE    bHeader;
    long    lSize;
} TPacketGGNotice;

typedef struct SPacketGGMonarchNotice
{
    BYTE    bHeader;
    BYTE    bEmpire;
    long    lSize;
} TPacketGGMonarchNotice;

//FORKED_ROAD
typedef struct SPacketGGForkedMapInfo
{
    BYTE    bHeader;
    BYTE    bPass;
    BYTE    bSungzi;
} TPacketGGForkedMapInfo;
//END_FORKED_ROAD
typedef struct SPacketGGShutdown
{
    BYTE    bHeader;
} TPacketGGShutdown;

typedef struct SPacketGGGuild
{
    BYTE    bHeader;
    BYTE    bSubHeader;
    DWORD    dwGuild;
} TPacketGGGuild;

enum
{
    GUILD_SUBHEADER_GG_CHAT,
    GUILD_SUBHEADER_GG_SET_MEMBER_COUNT_BONUS,
};

typedef struct SPacketGGGuildChat
{
    BYTE    bHeader;
    BYTE    bSubHeader;
    DWORD    dwGuild;
    char    szText[CHAT_MAX_LEN + 1];
} TPacketGGGuildChat;

typedef struct SPacketGGParty
{
    BYTE    header;
    BYTE    subheader;
    DWORD    pid;
    DWORD    leaderpid;
} TPacketGGParty;

enum
{
    PARTY_SUBHEADER_GG_CREATE,
    PARTY_SUBHEADER_GG_DESTROY,
    PARTY_SUBHEADER_GG_JOIN,
    PARTY_SUBHEADER_GG_QUIT,
};

typedef struct SPacketGGDisconnect
{
    BYTE    bHeader;
    char    szLogin[LOGIN_MAX_LEN + 1];
} TPacketGGDisconnect;

typedef struct SPacketGGShout
{
    BYTE    bHeader;
    BYTE    bEmpire;
    char    szText[CHAT_MAX_LEN + 1];
} TPacketGGShout;

typedef struct SPacketGGXmasWarpSanta
{
    BYTE    bHeader;
    BYTE    bChannel;
    long    lMapIndex;
} TPacketGGXmasWarpSanta;

typedef struct SPacketGGXmasWarpSantaReply
{
    BYTE    bHeader;
    BYTE    bChannel;
} TPacketGGXmasWarpSantaReply;

typedef struct SMessengerData
{
    char        szMobile[MOBILE_MAX_LEN + 1];
} TMessengerData;

typedef struct SPacketGGMessenger
{
    BYTE        bHeader;
    char        szAccount[CHARACTER_NAME_MAX_LEN + 1];
    char        szCompanion[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGGMessenger;

typedef struct SPacketGGMessengerMobile
{
    BYTE        bHeader;
    char        szName[CHARACTER_NAME_MAX_LEN + 1];
    char        szMobile[MOBILE_MAX_LEN + 1];
} TPacketGGMessengerMobile;

typedef struct SPacketGGFindPosition
{
    BYTE header;
    DWORD dwFromPID; // Àú À§Ä¡·Î ¿öÇÁÇÏ·Á´Â »ç¶÷
    DWORD dwTargetPID; // ã´Â »ç¶÷
} TPacketGGFindPosition;

typedef struct SPacketGGWarpCharacter
{
    BYTE header;
    DWORD pid;
    long x;
    long y;
} TPacketGGWarpCharacter;

//  HEADER_GG_GUILD_WAR_ZONE_MAP_INDEX        = 15,

typedef struct SPacketGGGuildWarMapIndex
{
    BYTE bHeader;
    DWORD dwGuildID1;
    DWORD dwGuildID2;
    long lMapIndex;
} TPacketGGGuildWarMapIndex;

typedef struct SPacketGGTransfer
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    long    lX, lY;
} TPacketGGTransfer;

typedef struct SPacketGGLoginPing
{
    BYTE    bHeader;
    char    szLogin[LOGIN_MAX_LEN + 1];
} TPacketGGLoginPing;

typedef struct SPacketGGBlockChat
{
    BYTE    bHeader;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    long    lBlockDuration;
} TPacketGGBlockChat;

/* Ŭ¶óÀÌ¾ğÆ® Ãø¿¡¼ º¸³»´Â ÆĞŶ */

typedef struct command_text
{
    BYTE    bHeader;
} TPacketCGText;

/* ·Î±×ÀÎ (1) */
typedef struct command_handshake
{
    BYTE    bHeader;
    DWORD    dwHandshake;
    DWORD    dwTime;
    long    lDelta;
} TPacketCGHandshake;

typedef struct command_login
{
    BYTE    header;
    char    login[LOGIN_MAX_LEN + 1];
    char    passwd[PASSWD_MAX_LEN + 1];
} TPacketCGLogin;

typedef struct command_login2
{
    BYTE    header;
    char    login[LOGIN_MAX_LEN + 1];
    DWORD    dwLoginKey;
    DWORD    adwClientKey[4];
} TPacketCGLogin2;

typedef struct command_login3
{
    BYTE    header;
    char    login[LOGIN_MAX_LEN + 1];
    char    passwd[PASSWD_MAX_LEN + 1];
    DWORD    adwClientKey[4];
} TPacketCGLogin3;

typedef struct command_login5
{
    BYTE    header;
    char    authKey[OPENID_AUTHKEY_LEN + 1];
    DWORD    adwClientKey[4];
} TPacketCGLogin5;

typedef struct command_matrix_card
{
    BYTE    bHeader;
    char    szAnswer[MATRIX_ANSWER_MAX_LEN + 1];
} TPacketCGMatrixCard;

typedef struct packet_matrix_card
{
    BYTE    bHeader;
    DWORD    dwRows;
    DWORD    dwCols;
} TPacketGCMatrixCard;

typedef struct packet_login_key
{
    BYTE    bHeader;
    DWORD    dwLoginKey;
} TPacketGCLoginKey;

typedef struct command_player_select
{
    BYTE    header;
    BYTE    index;
} TPacketCGPlayerSelect;

typedef struct command_player_delete
{
    BYTE    header;
    BYTE    index;
    char    private_code[8];
} TPacketCGPlayerDelete;

typedef struct command_player_create
{
    BYTE        header;
    BYTE        index;
    char        name[CHARACTER_NAME_MAX_LEN + 1];
    WORD        job;
    BYTE    shape;
    BYTE    Con;
    BYTE    Int;
    BYTE    Str;
    BYTE    Dex;
} TPacketCGPlayerCreate;

typedef struct command_player_create_success
{
    BYTE        header;
    BYTE        bAccountCharacterIndex;
    TSimplePlayer    player;
} TPacketGCPlayerCreateSuccess;

// °ø°İ
typedef struct command_attack
{
    BYTE    bHeader;
    BYTE    bType;
    DWORD    dwVID;
    BYTE    bCRCMagicCubeProcPiece;
    BYTE    bCRCMagicCubeFilePiece;
} TPacketCGAttack;

enum EMoveFuncType
{
    FUNC_WAIT,
    FUNC_MOVE,
    FUNC_ATTACK,
    FUNC_COMBO,
    FUNC_MOB_SKILL,
    _FUNC_SKILL,
    FUNC_MAX_NUM,
    FUNC_SKILL = 0x80,
};

// À̵¿
typedef struct command_move
{
    BYTE    bHeader;
    BYTE    bFunc;
    BYTE    bArg;
    BYTE    bRot;
    long    lX;
    long    lY;
    DWORD    dwTime;
} TPacketCGMove;

typedef struct command_sync_position_element
{
    DWORD    dwVID;
    long    lX;
    long    lY;
} TPacketCGSyncPositionElement;

// À§Ä¡ µ¿±âÈ
typedef struct command_sync_position    // °¡º¯ ÆĞŶ
{
    BYTE    bHeader;
    WORD    wSize;
} TPacketCGSyncPosition;

/* äÆÃ (3) */
typedef struct command_chat    // °¡º¯ ÆĞŶ
{
    BYTE    header;
    WORD    size;
    BYTE    type;
} TPacketCGChat;

/* ±Ó¼Ó¸» */
typedef struct command_whisper
{
    BYTE    bHeader;
    WORD    wSize;
    char     szNameTo[CHARACTER_NAME_MAX_LEN + 1];
} TPacketCGWhisper;

typedef struct command_entergame
{
    BYTE    header;
} TPacketCGEnterGame;

typedef struct command_item_use
{
    BYTE     header;
    TItemPos     Cell;
} TPacketCGItemUse;

typedef struct command_item_use_to_item
{
    BYTE    header;
    TItemPos    Cell;
    TItemPos    TargetCell;
} TPacketCGItemUseToItem;

typedef struct command_item_drop
{
    BYTE     header;
    TItemPos     Cell;
    DWORD    gold;
} TPacketCGItemDrop;

typedef struct command_item_drop2
{
    BYTE     header;
    TItemPos     Cell;
    DWORD    gold;
    BYTE    count;
} TPacketCGItemDrop2;

typedef struct command_item_move
{
    BYTE     header;
    TItemPos    Cell;
    TItemPos    CellTo;
    BYTE    count;
} TPacketCGItemMove;

typedef struct command_item_pickup
{
    BYTE     header;
    DWORD    vid;
} TPacketCGItemPickup;

typedef struct command_quickslot_add
{
    BYTE    header;
    BYTE    pos;
    TQuickslot    slot;
} TPacketCGQuickslotAdd;

typedef struct command_quickslot_del
{
    BYTE    header;
    BYTE    pos;
} TPacketCGQuickslotDel;

typedef struct command_quickslot_swap
{
    BYTE    header;
    BYTE    pos;
    BYTE    change_pos;
} TPacketCGQuickslotSwap;

enum
{
    SHOP_SUBHEADER_CG_END,
    SHOP_SUBHEADER_CG_BUY,
    SHOP_SUBHEADER_CG_SELL,
    SHOP_SUBHEADER_CG_SELL2
    // BEGIN_OFFLINE_SHOP
    SHOP_SUBHEADER_CG_PUT_ITEM,
    SHOP_SUBHEADER_CG_DESTROY_OFFLINE_SHOP,
    // END_OF_OFFLINE_SHOP
};

typedef struct command_shop_buy
{
    BYTE    count;
} TPacketCGShopBuy;

typedef struct command_shop_sell
{
    BYTE    pos;
    BYTE    count;
} TPacketCGShopSell;

typedef struct command_shop
{
    BYTE    header;
    BYTE    subheader;
} TPacketCGShop;

typedef struct command_on_click
{
    BYTE    header;
    DWORD    vid;
} TPacketCGOnClick;

enum
{
    EXCHANGE_SUBHEADER_CG_START,    /* arg1 == vid of target character */
    EXCHANGE_SUBHEADER_CG_ITEM_ADD,    /* arg1 == position of item */
    EXCHANGE_SUBHEADER_CG_ITEM_DEL,    /* arg1 == position of item */
    EXCHANGE_SUBHEADER_CG_ELK_ADD,    /* arg1 == amount of gold */
    EXCHANGE_SUBHEADER_CG_ACCEPT,    /* arg1 == not used */
    EXCHANGE_SUBHEADER_CG_CANCEL,    /* arg1 == not used */
};

typedef struct command_exchange
{
    BYTE    header;
    BYTE    sub_header;
    DWORD    arg1;
    BYTE    arg2;
    TItemPos    Pos;
} TPacketCGExchange;

typedef struct command_position
{
    BYTE    header;
    BYTE    position;
} TPacketCGPosition;

typedef struct command_script_answer
{
    BYTE    header;
    BYTE    answer;
    //char    file[32 + 1];
    //BYTE    answer[16 + 1];
} TPacketCGScriptAnswer;


typedef struct command_script_button
{
    BYTE        header;
    unsigned int    idx;
} TPacketCGScriptButton;

typedef struct command_quest_input_string
{
    BYTE header;
    char msg[64+1];
} TPacketCGQuestInputString;

typedef struct command_quest_confirm
{
    BYTE header;
    BYTE answer;
    DWORD requestPID;
} TPacketCGQuestConfirm;

/*
* ¼¹ö Ãø¿¡¼ º¸³»´Â ÆĞŶ
*/
typedef struct packet_quest_confirm
{
    BYTE header;
    char msg[64+1];
    long timeout;
    DWORD requestPID;
} TPacketGCQuestConfirm;

typedef struct packet_handshake
{
    BYTE    bHeader;
    DWORD    dwHandshake;
    DWORD    dwTime;
    long    lDelta;
} TPacketGCHandshake;

enum EPhase
{
    PHASE_CLOSE,
    PHASE_HANDSHAKE,
    PHASE_LOGIN,
    PHASE_SELECT,
    PHASE_LOADING,
    PHASE_GAME,
    PHASE_DEAD,

    PHASE_CLIENT_CONNECTING,
    PHASE_DBCLIENT,
    PHASE_P2P,
    PHASE_AUTH,
    PHASE_TEEN,
    PHASE_PASSPOD,
};

typedef struct packet_phase
{
    BYTE    header;
    BYTE    phase;
} TPacketGCPhase;

typedef struct packet_bindudp
{
    BYTE    header;
    DWORD    addr;
    WORD    port;
} TPacketGCBindUDP;

enum
{
    LOGIN_FAILURE_ALREADY    = 1,
    LOGIN_FAILURE_ID_NOT_EXIST    = 2,
    LOGIN_FAILURE_WRONG_PASS    = 3,
    LOGIN_FAILURE_FALSE        = 4,
    LOGIN_FAILURE_NOT_TESTOR    = 5,
    LOGIN_FAILURE_NOT_TEST_TIME    = 6,
    LOGIN_FAILURE_FULL        = 7
};

typedef struct packet_login_success
{
    BYTE        bHeader;
    TSimplePlayer    players[PLAYER_PER_ACCOUNT];
    DWORD        guild_id[PLAYER_PER_ACCOUNT];
    char        guild_name[PLAYER_PER_ACCOUNT][GUILD_NAME_MAX_LEN+1];

    DWORD        handle;
    DWORD        random_key;
} TPacketGCLoginSuccess;

typedef struct packet_auth_success
{
    BYTE    bHeader;
    DWORD    dwLoginKey;
    BYTE    bResult;
} TPacketGCAuthSuccess;

typedef struct packet_auth_success_openid
{
    BYTE    bHeader;
    DWORD    dwLoginKey;
    BYTE    bResult;
    char    login[LOGIN_MAX_LEN + 1];
} TPacketGCAuthSuccessOpenID;

typedef struct packet_login_failure
{
    BYTE    header;
    char    szStatus[ACCOUNT_STATUS_MAX_LEN + 1];
} TPacketGCLoginFailure;

typedef struct packet_create_failure
{
    BYTE    header;
    BYTE    bType;
} TPacketGCCreateFailure;

enum
{
    ADD_CHARACTER_STATE_DEAD        = (1 << 0),
    ADD_CHARACTER_STATE_SPAWN        = (1 << 1),
    ADD_CHARACTER_STATE_GUNGON        = (1 << 2),
    ADD_CHARACTER_STATE_KILLER        = (1 << 3),
    ADD_CHARACTER_STATE_PARTY        = (1 << 4),
};

enum ECharacterEquipmentPart
{
    CHR_EQUIPPART_ARMOR,
    CHR_EQUIPPART_WEAPON,
    CHR_EQUIPPART_HEAD,
    CHR_EQUIPPART_HAIR,
    CHR_EQUIPPART_NUM,
};

typedef struct packet_add_char
{
    BYTE    header;
    DWORD    dwVID;

    float    angle;
    long    x;
    long    y;
    long    z;

    BYTE    bType;
    WORD    wRaceNum;
    BYTE    bMovingSpeed;
    BYTE    bAttackSpeed;

    BYTE    bStateFlag;
    DWORD    dwAffectFlag[2];    // È¿°ú
} TPacketGCCharacterAdd;

typedef struct packet_char_additional_info
{
    BYTE    header;
    DWORD   dwVID;
    char    name[CHARACTER_NAME_MAX_LEN + 1];
    WORD    awPart[CHR_EQUIPPART_NUM];
    BYTE    bEmpire;
    DWORD   dwGuildID;
    DWORD   dwLevel;
    short    sAlignment;
    BYTE    bPKMode;
    DWORD    dwMountVnum;
} TPacketGCCharacterAdditionalInfo;

/*
   typedef struct packet_update_char_old
   {
   BYTE    header;
   DWORD    dwVID;

   WORD        awPart[CHR_EQUIPPART_NUM];
   BYTE    bMovingSpeed;
   BYTE    bAttackSpeed;

   BYTE    bStateFlag;
   DWORD    dwAffectFlag[2];

   DWORD    dwGuildID;
   short    sAlignment;
   BYTE    bPKMode;
   DWORD    dwMountVnum;
   } TPacketGCCharacterUpdateOld;
*/

typedef struct packet_update_char
{
    BYTE    header;
    DWORD    dwVID;

    WORD        awPart[CHR_EQUIPPART_NUM];
    BYTE    bMovingSpeed;
    BYTE    bAttackSpeed;

    BYTE    bStateFlag;
    DWORD    dwAffectFlag[2];

    DWORD    dwGuildID;
    short    sAlignment;
    BYTE    bPKMode;
    DWORD    dwMountVnum;
    //WORD    wRaceNum;
} TPacketGCCharacterUpdate;

typedef struct packet_del_char
{
    BYTE    header;
    DWORD    id;
} TPacketGCCharacterDelete;

typedef struct packet_chat    // °¡º¯ ÆĞŶ
{
    BYTE    header;
    WORD    size;
    BYTE    type;
    DWORD    id;
    BYTE    bEmpire;
} TPacketGCChat;

typedef struct packet_whisper    // °¡º¯ ÆĞŶ
{
    BYTE    bHeader;
    WORD    wSize;
    BYTE    bType;
    char    szNameFrom[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGCWhisper;

typedef struct packet_main_character
{
    BYTE        header;
    DWORD    dwVID;
    WORD    wRaceNum;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    long    lx, ly, lz;
    BYTE    empire;
    BYTE    skill_group;
} TPacketGCMainCharacter;

// SUPPORT_BGM
typedef struct packet_main_character3_bgm
{
    enum
    {
        MUSIC_NAME_LEN = 24,
    };

    BYTE    header;
    DWORD    dwVID;
    WORD    wRaceNum;
    char    szChrName[CHARACTER_NAME_MAX_LEN + 1];
    char    szBGMName[MUSIC_NAME_LEN + 1];
    long    lx, ly, lz;
    BYTE    empire;
    BYTE    skill_group;
} TPacketGCMainCharacter3_BGM;

typedef struct packet_main_character4_bgm_vol
{
    enum
    {
        MUSIC_NAME_LEN = 24,
    };

    BYTE    header;
    DWORD    dwVID;
    WORD    wRaceNum;
    char    szChrName[CHARACTER_NAME_MAX_LEN + 1];
    char    szBGMName[MUSIC_NAME_LEN + 1];
    float    fBGMVol;
    long    lx, ly, lz;
    BYTE    empire;
    BYTE    skill_group;
} TPacketGCMainCharacter4_BGM_VOL;
// END_OF_SUPPORT_BGM

typedef struct packet_points
{
    BYTE    header;
    INT        points[POINT_MAX_NUM];
} TPacketGCPoints;

typedef struct packet_skill_level
{
    BYTE        bHeader;
    TPlayerSkill    skills[SKILL_MAX_NUM];
} TPacketGCSkillLevel;

typedef struct packet_point_change
{
    int        header;
    DWORD    dwVID;
    BYTE    type;
    long    amount;
    long    value;
} TPacketGCPointChange;

typedef struct packet_stun
{
    BYTE    header;
    DWORD    vid;
} TPacketGCStun;

typedef struct packet_dead
{
    BYTE    header;
    DWORD    vid;
} TPacketGCDead;

struct TPacketGCItemDelDeprecated
{
    BYTE    header;
    TItemPos Cell;
    DWORD    vnum;
    BYTE    count;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
};

typedef struct packet_item_set
{
    BYTE    header;
    TItemPos Cell;
    DWORD    vnum;
    BYTE    count;
    DWORD    flags;
    DWORD    anti_flags;
    bool    highlight;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
} TPacketGCItemSet;

typedef struct packet_item_del
{
    BYTE    header;
    BYTE    pos;
} TPacketGCItemDel;

struct packet_item_use
{
    BYTE    header;
    TItemPos Cell;
    DWORD    ch_vid;
    DWORD    victim_vid;
    DWORD    vnum;
};

struct packet_item_move
{
    BYTE    header;
    TItemPos Cell;
    TItemPos CellTo;
};

typedef struct packet_item_update
{
    BYTE    header;
    TItemPos Cell;
    BYTE    count;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
} TPacketGCItemUpdate;

typedef struct packet_item_ground_add
{
    BYTE    bHeader;
    long     x, y, z;
    DWORD    dwVID;
    DWORD    dwVnum;
} TPacketGCItemGroundAdd;

typedef struct packet_item_ownership
{
    BYTE    bHeader;
    DWORD    dwVID;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGCItemOwnership;

typedef struct packet_item_ground_del
{
    BYTE    bHeader;
    DWORD    dwVID;
} TPacketGCItemGroundDel;

struct packet_quickslot_add
{
    BYTE    header;
    BYTE    pos;
    TQuickslot    slot;
};

struct packet_quickslot_del
{
    BYTE    header;
    BYTE    pos;
};

struct packet_quickslot_swap
{
    BYTE    header;
    BYTE    pos;
    BYTE    pos_to;
};

struct packet_motion
{
    BYTE    header;
    DWORD    vid;
    DWORD    victim_vid;
    WORD    motion;
};

enum EPacketShopSubHeaders
{
    SHOP_SUBHEADER_GC_START,
    SHOP_SUBHEADER_GC_END,
    SHOP_SUBHEADER_GC_UPDATE_ITEM,
    SHOP_SUBHEADER_GC_UPDATE_PRICE,
    SHOP_SUBHEADER_GC_OK,
    SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY,
    SHOP_SUBHEADER_GC_SOLDOUT,
    SHOP_SUBHEADER_GC_INVENTORY_FULL,
    SHOP_SUBHEADER_GC_INVALID_POS,
    SHOP_SUBHEADER_GC_SOLD_OUT,
    SHOP_SUBHEADER_GC_START_EX,
    SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY_EX,
};

struct packet_shop_item
{
    DWORD       vnum;
    DWORD       price;
    BYTE        count;
    BYTE        display_pos;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
};

// BEGIN_OFFLINE_SHOP
struct packet_shop_offline_item
{
    DWORD       vnum;
    DWORD       price;
    BYTE        count;
    BYTE        display_pos;
    bool        bIsSold;
    char        buyerName[CHARACTER_NAME_MAX_LEN];
    long        alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
};
// END_OF_OFFLINE_SHOP

typedef struct packet_shop_start
{
    DWORD   owner_vid;
    struct packet_shop_item    items[SHOP_HOST_ITEM_MAX_NUM];
} TPacketGCShopStart;

// BEGIN_OFFLINE_SHOP
typedef struct packet_offline_shop_start
{
    DWORD    owner_vid;
    struct packet_shop_offline_item items[OFFLINE_SHOP_HOST_ITEM_MAX_NUM];
} TPacketGCOfflineShopStart;
// END_OF_OFFLINE_SHOP

typedef struct packet_shop_start_ex // ´ÙÀ½¿¡ TSubPacketShopTab* shop_tabs ÀÌ µû¶ó¿È.
{
    typedef struct sub_packet_shop_tab
    {
        char name[SHOP_TAB_NAME_MAX];
        BYTE coin_type;
        packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
    } TSubPacketShopTab;
    DWORD owner_vid;
    BYTE shop_tab_count;
} TPacketGCShopStartEx;

typedef struct packet_shop_update_item
{
    BYTE            pos;
    struct packet_shop_item    item;
} TPacketGCShopUpdateItem;

// BEGIN_OFFLINE_SHOP
typedef struct packet_shop_update_offline_item
{
    BYTE    pos;
    struct packet_shop_offline_item    item;
} TPacketGCShopUpdateOfflineItem;
// END_OF_OFFLINE_SHOP

typedef struct packet_shop_update_price
{
    int                iPrice;
} TPacketGCShopUpdatePrice;

typedef struct packet_shop    // °¡º¯ ÆĞŶ
{
    BYTE        header;
    WORD    size;
    BYTE        subheader;
} TPacketGCShop;

struct packet_exchange
{
    BYTE    header;
    BYTE    sub_header;
    BYTE    is_me;
    DWORD    arg1;    // vnum
    TItemPos    arg2;    // cell
    DWORD    arg3;    // count
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
};

enum EPacketTradeSubHeaders
{
    EXCHANGE_SUBHEADER_GC_START,    /* arg1 == vid */
    EXCHANGE_SUBHEADER_GC_ITEM_ADD,    /* arg1 == vnum  arg2 == pos  arg3 == count */
    EXCHANGE_SUBHEADER_GC_ITEM_DEL,
    EXCHANGE_SUBHEADER_GC_GOLD_ADD,    /* arg1 == gold */
    EXCHANGE_SUBHEADER_GC_ACCEPT,    /* arg1 == accept */
    EXCHANGE_SUBHEADER_GC_END,        /* arg1 == not used */
    EXCHANGE_SUBHEADER_GC_ALREADY,    /* arg1 == not used */
    EXCHANGE_SUBHEADER_GC_LESS_GOLD,    /* arg1 == not used */
};

struct packet_position
{
    BYTE    header;
    DWORD    vid;
    BYTE    position;
};

typedef struct packet_ping
{
    BYTE    header;
} TPacketGCPing;

struct packet_script
{
    BYTE    header;
    WORD    size;
    BYTE    skin;
    WORD    src_size;
#ifdef ENABLE_QUEST_CATEGORY
    BYTE    quest_flag;
#endif
};

typedef struct packet_change_speed
{
    BYTE        header;
    DWORD        vid;
    WORD        moving_speed;
} TPacketGCChangeSpeed;

struct packet_mount
{
    BYTE    header;
    DWORD    vid;
    DWORD    mount_vid;
    BYTE    pos;
    DWORD    x, y;
};

typedef struct packet_move
{
    BYTE        bHeader;
    BYTE        bFunc;
    BYTE        bArg;
    BYTE        bRot;
    DWORD        dwVID;
    long        lX;
    long        lY;
    DWORD        dwTime;
    DWORD        dwDuration;
} TPacketGCMove;

// ¼ÒÀ¯±Ç
typedef struct packet_ownership
{
    BYTE        bHeader;
    DWORD        dwOwnerVID;
    DWORD        dwVictimVID;
} TPacketGCOwnership;

// À§Ä¡ µ¿±âÈ ÆĞŶÀÇ bCount ¸¸Å ºÙ´Â ´ÜÀ§
typedef struct packet_sync_position_element
{
    DWORD    dwVID;
    long    lX;
    long    lY;
} TPacketGCSyncPositionElement;

// À§Ä¡ µ¿±âÈ
typedef struct packet_sync_position    // °¡º¯ ÆĞŶ
{
    BYTE    bHeader;
    WORD    wSize;    // °³¼ö = (wSize - sizeof(TPacketGCSyncPosition)) / sizeof(TPacketGCSyncPositionElement)
} TPacketGCSyncPosition;

typedef struct packet_fly
{
    BYTE    bHeader;
    BYTE    bType;
    DWORD    dwStartVID;
    DWORD    dwEndVID;
} TPacketGCCreateFly;

typedef struct command_fly_targeting
{
    BYTE        bHeader;
    DWORD        dwTargetVID;
    long        x, y;
} TPacketCGFlyTargeting;

typedef struct packet_fly_targeting
{
    BYTE        bHeader;
    DWORD        dwShooterVID;
    DWORD        dwTargetVID;
    long        x, y;
} TPacketGCFlyTargeting;

typedef struct packet_shoot
{
    BYTE        bHeader;
    BYTE        bType;
} TPacketCGShoot;

typedef struct packet_duel_start
{
    BYTE    header;
    WORD    wSize;    // DWORD°¡ ¸î°³? °³¼ö = (wSize - sizeof(TPacketGCPVPList)) / 4
} TPacketGCDuelStart;

enum EPVPModes
{
    PVP_MODE_NONE,
    PVP_MODE_AGREE,
    PVP_MODE_FIGHT,
    PVP_MODE_REVENGE
};

typedef struct packet_pvp
{
    BYTE        bHeader;
    DWORD       dwVIDSrc;
    DWORD       dwVIDDst;
    BYTE        bMode;    // 0 ÀÌ¸é ²û, 1À̸é ÄÔ
} TPacketGCPVP;

typedef struct command_use_skill
{
    BYTE    bHeader;
    DWORD    dwVnum;
    DWORD    dwVID;
} TPacketCGUseSkill;

typedef struct command_target
{
    BYTE    header;
    DWORD    dwVID;
} TPacketCGTarget;

typedef struct packet_target
{
    BYTE    header;
    DWORD    dwVID;
    BYTE    bHPPercent;
} TPacketGCTarget;

typedef struct packet_warp
{
    BYTE    bHeader;
    long    lX;
    long    lY;
    long    lAddr;
    WORD    wPort;
} TPacketGCWarp;

typedef struct command_warp
{
    BYTE    bHeader;
} TPacketCGWarp;

struct packet_quest_info
{
    BYTE header;
    WORD size;
    WORD index;
#ifdef ENABLE_QUEST_CATEGORY
    WORD c_index;
#endif
    BYTE flag;
};

enum
{
    MESSENGER_SUBHEADER_GC_LIST,
    MESSENGER_SUBHEADER_GC_LOGIN,
    MESSENGER_SUBHEADER_GC_LOGOUT,
    MESSENGER_SUBHEADER_GC_INVITE,
    MESSENGER_SUBHEADER_GC_MOBILE
};

typedef struct packet_messenger
{
    BYTE header;
    WORD size;
    BYTE subheader;
} TPacketGCMessenger;

typedef struct packet_messenger_guild_list
{
    BYTE connected;
    BYTE length;
    //char login[LOGIN_MAX_LEN+1];
} TPacketGCMessengerGuildList;

typedef struct packet_messenger_guild_login
{
    BYTE length;
    //char login[LOGIN_MAX_LEN+1];
} TPacketGCMessengerGuildLogin;

typedef struct packet_messenger_guild_logout
{
    BYTE length;

    //char login[LOGIN_MAX_LEN+1];
} TPacketGCMessengerGuildLogout;

typedef struct packet_messenger_list_offline
{
    BYTE connected; // always 0
    BYTE length;
} TPacketGCMessengerListOffline;

typedef struct packet_messenger_list_online
{
    BYTE connected; // always 1
    BYTE length;
} TPacketGCMessengerListOnline;

enum
{
    MESSENGER_SUBHEADER_CG_ADD_BY_VID,
    MESSENGER_SUBHEADER_CG_ADD_BY_NAME,
    MESSENGER_SUBHEADER_CG_REMOVE,
    MESSENGER_SUBHEADER_CG_INVITE_ANSWER,
};

typedef struct command_messenger
{
    BYTE header;
    BYTE subheader;
} TPacketCGMessenger;

typedef struct command_messenger_add_by_vid
{
    DWORD vid;
} TPacketCGMessengerAddByVID;

typedef struct command_messenger_add_by_name
{
    BYTE length;
    //char login[LOGIN_MAX_LEN+1];
} TPacketCGMessengerAddByName;

typedef struct command_messenger_remove
{
    char login[LOGIN_MAX_LEN+1];
    //DWORD account;
} TPacketCGMessengerRemove;

typedef struct command_safebox_checkout
{
    BYTE    bHeader;
    BYTE    bSafePos;
    TItemPos    ItemPos;
} TPacketCGSafeboxCheckout;

typedef struct command_safebox_checkin
{
    BYTE    bHeader;
    BYTE    bSafePos;
    TItemPos    ItemPos;
} TPacketCGSafeboxCheckin;

///////////////////////////////////////////////////////////////////////////////////
// Party

typedef struct command_party_parameter
{
    BYTE    bHeader;
    BYTE    bDistributeMode;
} TPacketCGPartyParameter;

typedef struct paryt_parameter
{
    BYTE    bHeader;
    BYTE    bDistributeMode;
} TPacketGCPartyParameter;

typedef struct packet_party_add
{
    BYTE    header;
    DWORD    pid;
    char    name[CHARACTER_NAME_MAX_LEN+1];
} TPacketGCPartyAdd;

typedef struct command_party_invite
{
    BYTE    header;
    DWORD    vid;
} TPacketCGPartyInvite;

typedef struct packet_party_invite
{
    BYTE    header;
    DWORD    leader_vid;
} TPacketGCPartyInvite;

typedef struct command_party_invite_answer
{
    BYTE    header;
    DWORD    leader_vid;
    BYTE    accept;
} TPacketCGPartyInviteAnswer;

typedef struct packet_party_update
{
    BYTE    header;
    DWORD    pid;
    BYTE    role;
    BYTE    percent_hp;
    short    affects[7];
} TPacketGCPartyUpdate;

typedef struct packet_party_remove
{
    BYTE header;
    DWORD pid;
} TPacketGCPartyRemove;

typedef struct packet_party_link
{
    BYTE header;
    DWORD pid;
    DWORD vid;
} TPacketGCPartyLink;

typedef struct packet_party_unlink
{
    BYTE header;
    DWORD pid;
    DWORD vid;
} TPacketGCPartyUnlink;

typedef struct command_party_remove
{
    BYTE header;
    DWORD pid;
} TPacketCGPartyRemove;

typedef struct command_party_set_state
{
    BYTE header;
    DWORD pid;
    BYTE byRole;
    BYTE flag;
} TPacketCGPartySetState;

enum
{
    PARTY_SKILL_HEAL = 1,
    PARTY_SKILL_WARP = 2
};

typedef struct command_party_use_skill
{
    BYTE header;
    BYTE bySkillIndex;
    DWORD vid;
} TPacketCGPartyUseSkill;

typedef struct packet_safebox_size
{
    BYTE bHeader;
    BYTE bSize;
} TPacketCGSafeboxSize;

typedef struct packet_safebox_wrong_password
{
    BYTE    bHeader;
} TPacketCGSafeboxWrongPassword;

typedef struct command_empire
{
    BYTE    bHeader;
    BYTE    bEmpire;
} TPacketCGEmpire;

typedef struct packet_empire
{
    BYTE    bHeader;
    BYTE    bEmpire;
} TPacketGCEmpire;

enum
{
    SAFEBOX_MONEY_STATE_SAVE,
    SAFEBOX_MONEY_STATE_WITHDRAW,
};

typedef struct command_safebox_money
{
    BYTE        bHeader;
    BYTE        bState;
    long    lMoney;
} TPacketCGSafeboxMoney;

typedef struct packet_safebox_money_change
{
    BYTE    bHeader;
    long    lMoney;
} TPacketGCSafeboxMoneyChange;

// Guild

enum
{
    GUILD_SUBHEADER_GC_LOGIN,
    GUILD_SUBHEADER_GC_LOGOUT,
    GUILD_SUBHEADER_GC_LIST,
    GUILD_SUBHEADER_GC_GRADE,
    GUILD_SUBHEADER_GC_ADD,
    GUILD_SUBHEADER_GC_REMOVE,
    GUILD_SUBHEADER_GC_GRADE_NAME,
    GUILD_SUBHEADER_GC_GRADE_AUTH,
    GUILD_SUBHEADER_GC_INFO,
    GUILD_SUBHEADER_GC_COMMENTS,
    GUILD_SUBHEADER_GC_CHANGE_EXP,
    GUILD_SUBHEADER_GC_CHANGE_MEMBER_GRADE,
    GUILD_SUBHEADER_GC_SKILL_INFO,
    GUILD_SUBHEADER_GC_CHANGE_MEMBER_GENERAL,
    GUILD_SUBHEADER_GC_GUILD_INVITE,
    GUILD_SUBHEADER_GC_WAR,
    GUILD_SUBHEADER_GC_GUILD_NAME,
    GUILD_SUBHEADER_GC_GUILD_WAR_LIST,
    GUILD_SUBHEADER_GC_GUILD_WAR_END_LIST,
    GUILD_SUBHEADER_GC_WAR_SCORE,
    GUILD_SUBHEADER_GC_MONEY_CHANGE,
};

enum GUILD_SUBHEADER_CG
{
    GUILD_SUBHEADER_CG_ADD_MEMBER,
    GUILD_SUBHEADER_CG_REMOVE_MEMBER,
    GUILD_SUBHEADER_CG_CHANGE_GRADE_NAME,
    GUILD_SUBHEADER_CG_CHANGE_GRADE_AUTHORITY,
    GUILD_SUBHEADER_CG_OFFER,
    GUILD_SUBHEADER_CG_POST_COMMENT,
    GUILD_SUBHEADER_CG_DELETE_COMMENT,
    GUILD_SUBHEADER_CG_REFRESH_COMMENT,
    GUILD_SUBHEADER_CG_CHANGE_MEMBER_GRADE,
    GUILD_SUBHEADER_CG_USE_SKILL,
    GUILD_SUBHEADER_CG_CHANGE_MEMBER_GENERAL,
    GUILD_SUBHEADER_CG_GUILD_INVITE_ANSWER,
    GUILD_SUBHEADER_CG_CHARGE_GSP,
    GUILD_SUBHEADER_CG_DEPOSIT_MONEY,
    GUILD_SUBHEADER_CG_WITHDRAW_MONEY,
};

typedef struct packet_guild
{
    BYTE header;
    WORD size;
    BYTE subheader;
} TPacketGCGuild;

typedef struct packet_guild_name_t
{
    BYTE header;
    WORD size;
    BYTE subheader;
    DWORD    guildID;
    char    guildName[GUILD_NAME_MAX_LEN];
} TPacketGCGuildName;

typedef struct packet_guild_war
{
    DWORD    dwGuildSelf;
    DWORD    dwGuildOpp;
    BYTE    bType;
    BYTE     bWarState;
} TPacketGCGuildWar;

typedef struct command_guild
{
    BYTE header;
    BYTE subheader;
} TPacketCGGuild;

typedef struct command_guild_answer_make_guild
{
    BYTE header;
    char guild_name[GUILD_NAME_MAX_LEN+1];
} TPacketCGAnswerMakeGuild;

typedef struct command_guild_use_skill
{
    DWORD    dwVnum;
    DWORD    dwPID;
} TPacketCGGuildUseSkill;

// Guild Mark
typedef struct command_mark_login
{
    BYTE    header;
    DWORD   handle;
    DWORD   random_key;
} TPacketCGMarkLogin;

typedef struct command_mark_upload
{
    BYTE    header;
    DWORD    gid;
    BYTE    image[16*12*4];
} TPacketCGMarkUpload;

typedef struct command_mark_idxlist
{
    BYTE    header;
} TPacketCGMarkIDXList;

typedef struct command_mark_crclist
{
    BYTE    header;
    BYTE    imgIdx;
    DWORD    crclist[80];
} TPacketCGMarkCRCList;

typedef struct packet_mark_idxlist
{
    BYTE    header;
    DWORD    bufSize;
    WORD    count;
    //µÚ¿¡ size * (WORD + WORD)¸¸Å µ¥ÀÌÅÍ ºÙÀ½
} TPacketGCMarkIDXList;

typedef struct packet_mark_block
{
    BYTE    header;
    DWORD    bufSize;
    BYTE    imgIdx;
    DWORD    count;
    // µÚ¿¡ 64 x 48 x Çȼ¿Å©±â(4¹ÙÀÌÆ®) = 12288¸¸Å µ¥ÀÌÅÍ ºÙÀ½
} TPacketGCMarkBlock;

typedef struct command_symbol_upload
{
    BYTE    header;
    WORD    size;
    DWORD    guild_id;
} TPacketCGGuildSymbolUpload;

typedef struct command_symbol_crc
{
    BYTE header;
    DWORD guild_id;
    DWORD crc;
    DWORD size;
} TPacketCGSymbolCRC;

typedef struct packet_symbol_data
{
    BYTE header;
    WORD size;
    DWORD guild_id;
} TPacketGCGuildSymbolData;

// Fishing

typedef struct command_fishing
{
    BYTE header;
    BYTE dir;
} TPacketCGFishing;

typedef struct packet_fishing
{
    BYTE header;
    BYTE subheader;
    DWORD info;
    BYTE dir;
} TPacketGCFishing;

enum
{
    FISHING_SUBHEADER_GC_START,
    FISHING_SUBHEADER_GC_STOP,
    FISHING_SUBHEADER_GC_REACT,
    FISHING_SUBHEADER_GC_SUCCESS,
    FISHING_SUBHEADER_GC_FAIL,
    FISHING_SUBHEADER_GC_FISH,
};

typedef struct command_give_item
{
    BYTE byHeader;
    DWORD dwTargetVID;
    TItemPos ItemPos;
    BYTE byItemCount;
} TPacketCGGiveItem;

typedef struct SPacketCGHack
{
    BYTE    bHeader;
    char    szBuf[255 + 1];
} TPacketCGHack;

// SubHeader - Dungeon
enum
{
    DUNGEON_SUBHEADER_GC_TIME_ATTACK_START = 0,
    DUNGEON_SUBHEADER_GC_DESTINATION_POSITION = 1,
};

typedef struct packet_dungeon
{
    BYTE bHeader;
    WORD size;
    BYTE subheader;
} TPacketGCDungeon;

typedef struct packet_dungeon_dest_position
{
    long x;
    long y;
} TPacketGCDungeonDestPosition;

typedef struct SPacketGCShopSign
{
    BYTE    bHeader;
    DWORD    dwVID;
    char    szSign[SHOP_SIGN_MAX_LEN + 1];
} TPacketGCShopSign;

typedef struct SPacketCGMyShop
{
    BYTE    bHeader;
    char    szSign[SHOP_SIGN_MAX_LEN + 1];
    BYTE    bCount;
} TPacketCGMyShop;

// BEGIN_OFFLINE_SHOP
typedef struct SOfflineShopItemTable
{
    TItemPos    item_pos;
    int            iPrice;
} TOfflineShopItemTable;

typedef struct TPacketCGMyOfflineShop
{
    BYTE    bHeader;
    char    szSign[SHOP_SIGN_MAX_LEN + 1];
    BYTE    bCount;
    BYTE    bTime;
} TPacketCGMyOfflineShop;
// END_OF_OFFLINE_SHOP

typedef struct SPacketGCTime
{
    BYTE    bHeader;
    time_t    time;
} TPacketGCTime;

enum
{
    WALKMODE_RUN,
    WALKMODE_WALK,
};

typedef struct SPacketGCWalkMode
{
    BYTE    header;
    DWORD    vid;
    BYTE    mode;
} TPacketGCWalkMode;

typedef struct SPacketGCChangeSkillGroup
{
    BYTE        header;
    BYTE        skill_group;
} TPacketGCChangeSkillGroup;

typedef struct SPacketCGRefine
{
    BYTE    header;
    BYTE    pos;
    BYTE    type;
} TPacketCGRefine;

typedef struct SPacketCGRequestRefineInfo
{
    BYTE    header;
    BYTE    pos;
} TPacketCGRequestRefineInfo;

typedef struct SPacketGCRefineInformaion
{
    BYTE    header;
    BYTE    type;
    BYTE    pos;
    DWORD    src_vnum;
    DWORD    result_vnum;
    BYTE    material_count;
    int        cost; // ¼Ò¿ä ºñ¿ë
    int        prob; // È®·ü
    TRefineMaterial materials[REFINE_MATERIAL_MAX_NUM];
} TPacketGCRefineInformation;

struct TNPCPosition
{
    BYTE bType;
    char name[CHARACTER_NAME_MAX_LEN+1];
    long x;
    long y;
};

typedef struct SPacketGCNPCPosition
{
    BYTE header;
    WORD size;
    WORD count;

    // array of TNPCPosition
} TPacketGCNPCPosition;

typedef struct SPacketGCSpecialEffect
{
    BYTE header;
    BYTE type;
    DWORD vid;
} TPacketGCSpecialEffect;

typedef struct SPacketCGChangeName
{
    BYTE header;
    BYTE index;
    char name[CHARACTER_NAME_MAX_LEN+1];
} TPacketCGChangeName;

typedef struct SPacketGCChangeName
{
    BYTE header;
    DWORD pid;
    char name[CHARACTER_NAME_MAX_LEN+1];
} TPacketGCChangeName;


typedef struct command_client_version
{
    BYTE header;
    char filename[32+1];
    char timestamp[32+1];
} TPacketCGClientVersion;

typedef struct command_client_version2
{
    BYTE header;
    char filename[32+1];
    char timestamp[32+1];
} TPacketCGClientVersion2;

typedef struct packet_channel
{
    BYTE header;
    BYTE channel;
} TPacketGCChannel;

typedef struct SEquipmentItemSet
{
    DWORD   vnum;
    BYTE    count;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
} TEquipmentItemSet;

typedef struct pakcet_view_equip
{
    BYTE  header;
    DWORD vid;
    TEquipmentItemSet equips[WEAR_MAX_NUM];
} TPacketViewEquip;

typedef struct
{
    DWORD    dwID;
    long    x, y;
    long    width, height;
    DWORD    dwGuildID;
} TLandPacketElement;

typedef struct packet_land_list
{
    BYTE    header;
    WORD    size;
} TPacketGCLandList;

typedef struct
{
    BYTE    bHeader;
    long    lID;
    char    szName[32+1];
    DWORD    dwVID;
    BYTE    bType;
} TPacketGCTargetCreate;

typedef struct
{
    BYTE    bHeader;
    long    lID;
    long    lX, lY;
} TPacketGCTargetUpdate;

typedef struct
{
    BYTE    bHeader;
    long    lID;
} TPacketGCTargetDelete;

typedef struct
{
    BYTE        bHeader;
    TPacketAffectElement elem;
} TPacketGCAffectAdd;

typedef struct
{
    BYTE    bHeader;
    DWORD    dwType;
    BYTE    bApplyOn;
} TPacketGCAffectRemove;

typedef struct packet_lover_info
{
    BYTE header;
    char name[CHARACTER_NAME_MAX_LEN + 1];
    BYTE love_point;
} TPacketGCLoverInfo;

typedef struct packet_love_point_update
{
    BYTE header;
    BYTE love_point;
} TPacketGCLovePointUpdate;

// MINING
typedef struct packet_dig_motion
{
    BYTE header;
    DWORD vid;
    DWORD target_vid;
    BYTE count;
} TPacketGCDigMotion;
// END_OF_MINING

// SCRIPT_SELECT_ITEM
typedef struct command_script_select_item
{
    BYTE header;
    DWORD selection;
} TPacketCGScriptSelectItem;
// END_OF_SCRIPT_SELECT_ITEM

typedef struct packet_damage_info
{
    BYTE header;
    DWORD dwVID;
    BYTE flag;
    int damage;
} TPacketGCDamageInfo;

enum
{
    RUNUP_MATRIX_ANSWER_MAX_LEN = 4,
    RUNUP_MATRIX_QUIZ_MAX_LEN = 8 ,

};

typedef struct packet_runup_matrix_quiz
{
    BYTE    bHeader;
    char    szQuiz[RUNUP_MATRIX_QUIZ_MAX_LEN + 1];
} TPacketGCRunupMatrixQuiz;

typedef struct command_runup_matrix_answer
{
    BYTE    bHeader;
    char    szAnswer[RUNUP_MATRIX_ANSWER_MAX_LEN + 1];
} TPacketCGRunupMatrixAnswer;

typedef struct packet_passpod
{
    BYTE    bHeader;
    char    szAnswer[8+1];
} TPacketCGPasspod;

typedef struct packet_passpod_failed
{
    BYTE    bHeader;
    char    szMessage[128];
} TPacketCGPasspodFailed;

typedef struct tag_GGSiege
{
    BYTE    bHeader;
    BYTE    bEmpire;
    BYTE    bTowerCount;
} TPacketGGSiege;

typedef struct SPacketGGMonarchTransfer
{
    BYTE    bHeader;
    DWORD    dwTargetPID;
    long    x;
    long    y;
} TPacketMonarchGGTransfer;

typedef struct SPacketGGPCBangUpdate
{
    BYTE bHeader;
    unsigned long ulPCBangID;
} TPacketPCBangUpdate;

typedef struct SPacketGGCheckAwakeness
{
    BYTE bHeader;
} TPacketGGCheckAwakeness;

typedef struct SPacketGCPanamaPack
{
    BYTE    bHeader;
    char    szPackName[256];
    BYTE    abIV[32];
} TPacketGCPanamaPack;

//TODO :  ¾Æ¿ì ¯³ª..°¡º¯ÆĞŶ »çÀÌÁî ¹Ş¾ÆµéÀϼö ÀÖ°Ô ÆĞŶ Çڵ鷯 Refactoring ÇÏÀÚ.
typedef struct SPacketGCHybridCryptKeys
{
    SPacketGCHybridCryptKeys() : m_pStream(NULL) {}
    ~SPacketGCHybridCryptKeys()
    {
        //GCC ¿¡¼± NULL delete ÇØµµ ±¦Âú³ª? ÀÏ´Ü ¾ÈÀüÇÏ°Ô NULL üũ ÇÏÀÚ. ( ±Ùµ¥ À̰ŠC++ Ç¥ÁؾƴϾú³ª --a )
        if( m_pStream )
        {
            delete[] m_pStream;
            m_pStream = NULL;
        }
    }

    DWORD GetStreamSize()
    {
        return sizeof(bHeader) + sizeof(WORD) + sizeof(int) + KeyStreamLen;
    }

    BYTE* GetStreamData()
    {
        if( m_pStream )
            delete[] m_pStream;

        uDynamicPacketSize = (WORD)GetStreamSize();

        m_pStream = new BYTE[ uDynamicPacketSize ];

        memcpy( m_pStream, &bHeader, 1 );
        memcpy( m_pStream+1, &uDynamicPacketSize, 2 );
        memcpy( m_pStream+3, &KeyStreamLen, 4 );

        if( KeyStreamLen > 0 )
            memcpy( m_pStream+7, pDataKeyStream, KeyStreamLen );

        return m_pStream;
    }

    BYTE    bHeader;
    WORD    uDynamicPacketSize; // ºô¾î¸ÔÀ» Ŭ¶ó  DynamicPacketHeader ±¸Á¶¶§¹®¿¡ ¸ÂÃçÁà¾ßÇÑ´Ù -_-;
    int        KeyStreamLen;
    BYTE*   pDataKeyStream;

private:
    BYTE* m_pStream;


} TPacketGCHybridCryptKeys;


typedef struct SPacketGCPackageSDB
{
    SPacketGCPackageSDB() : m_pDataSDBStream(NULL), m_pStream(NULL) {}
    ~SPacketGCPackageSDB()
    {
        if( m_pStream )
        {
            delete[] m_pStream;
            m_pStream = NULL;
        }
    }

    DWORD GetStreamSize()
    {
        return sizeof(bHeader) + sizeof(WORD) + sizeof(int) + iStreamLen;
    }

    BYTE* GetStreamData()
    {
        if( m_pStream )
            delete[] m_pStream;

        uDynamicPacketSize =  GetStreamSize();

        m_pStream = new BYTE[ uDynamicPacketSize ];

        memcpy( m_pStream, &bHeader, 1 );
        memcpy( m_pStream+1, &uDynamicPacketSize, 2 );
        memcpy( m_pStream+3, &iStreamLen, 4 );

        if( iStreamLen > 0 )
            memcpy( m_pStream+7, m_pDataSDBStream, iStreamLen );

        return m_pStream;
    }

    BYTE    bHeader;
    WORD    uDynamicPacketSize; // ºô¾î¸ÔÀ» Ŭ¶ó  DynamicPacketHeader ±¸Á¶¶§¹®¿¡ ¸ÂÃçÁà¾ßÇÑ´Ù -_-;
    int        iStreamLen;
    BYTE*   m_pDataSDBStream;

private:
    BYTE* m_pStream;


} TPacketGCPackageSDB;

#ifdef _IMPROVED_PACKET_ENCRYPTION_
struct TPacketKeyAgreement
{
    static const int MAX_DATA_LEN = 256;
    BYTE bHeader;
    WORD wAgreedLength;
    WORD wDataLength;
    BYTE data[MAX_DATA_LEN];
};

struct TPacketKeyAgreementCompleted
{
    BYTE bHeader;
    BYTE data[3]; // dummy (not used)
};

#endif // _IMPROVED_PACKET_ENCRYPTION_

#define MAX_EFFECT_FILE_NAME 128
typedef struct SPacketGCSpecificEffect
{
    BYTE header;
    DWORD vid;
    char effect_file[MAX_EFFECT_FILE_NAME];
} TPacketGCSpecificEffect;

// ¿ëÈ¥¼®
enum EDragonSoulRefineWindowRefineType
{
    DragonSoulRefineWindow_UPGRADE,
    DragonSoulRefineWindow_IMPROVEMENT,
    DragonSoulRefineWindow_REFINE,
};

enum EPacketCGDragonSoulSubHeaderType
{
    DS_SUB_HEADER_OPEN,
    DS_SUB_HEADER_CLOSE,
    DS_SUB_HEADER_DO_REFINE_GRADE,
    DS_SUB_HEADER_DO_REFINE_STEP,
    DS_SUB_HEADER_DO_REFINE_STRENGTH,
    DS_SUB_HEADER_REFINE_FAIL,
    DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE,
    DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL,
    DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY,
    DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL,
    DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL,
    DS_SUB_HEADER_REFINE_SUCCEED,
};
typedef struct SPacketCGDragonSoulRefine
{
    SPacketCGDragonSoulRefine() : header (HEADER_CG_DRAGON_SOUL_REFINE)
    {}
    BYTE header;
    BYTE bSubType;
    TItemPos ItemGrid[DRAGON_SOUL_REFINE_GRID_SIZE];
} TPacketCGDragonSoulRefine;

typedef struct SPacketGCDragonSoulRefine
{
    SPacketGCDragonSoulRefine() : header(HEADER_GC_DRAGON_SOUL_REFINE)
    {}
    BYTE header;
    BYTE bSubType;
    TItemPos Pos;
} TPacketGCDragonSoulRefine;

typedef struct SPacketCGStateCheck
{
    BYTE header;
    unsigned long key;
    unsigned long index;
} TPacketCGStateCheck;

typedef struct SPacketGCStateCheck
{
    BYTE header;
    unsigned long key;
    unsigned long index;
    unsigned char state;
} TPacketGCStateCheck;

// BEGIN_OFFLINE_SHOP
typedef struct SPacketGGOfflineShopMessage
{
    BYTE    bHeader;
    DWORD    dwTargetPID;
    char    szName[CHARACTER_NAME_MAX_LEN + 1];
    char    szItemName[ITEM_NAME_MAX_LEN + 1];
} TPacketGGOfflineShopMessage;
// END_OF_OFFLINE_SHOP

#pragma pack()
#endif

SHOP_SUBHEADER_CG_SELL2 nin yanında "," yok ekle öyle build et.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst