Mt2Hizmet 1
Mt2Hizmet
melankolıa18 1
melankolıa18
romegames 1
romegames
Krutzo 1
Krutzo
shrpnl 1
shrpnl
Best Studio 1
Best Studio
D 1
delimuratt
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

UNKNOWN HEADER

  • Konuyu başlatan Konuyu başlatan EnZiiiiK
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 4
  • Görüntüleme Görüntüleme 5K

EnZiiiiK

Level 2
Üye
Katılım
3 Eyl 2019
Konular
32
Mesajlar
89
Çözüm
19
Online süresi
15d 15h
Reaksiyon Skoru
8
Altın Konu
0
TM Yaşı
6 Yıl 9 Ay 6 Gün
Başarım Puanı
78
MmoLira
2,882
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!

Hi. Today I added Ticket System but Im still getting this ERROR in sysser..

sysser
Kod:
SYSERR: Sep 15 21:44:26 :: Process: UNKNOWN HEADER: 155, LAST HEADER: 0(0), REMAIN BYTES: 40, fd: 27

Server/packet.h
Kod:
#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_ITEM_DESTROY            = 21,
    
    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,
#ifdef ENABLE_GEM_SYSTEM
    HEADER_CG_GEM_SHOP                = 56,
#endif

    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                = 117,
    HEADER_CG_DUNGEON                = 110,
    HEADER_CG_LOGIN3                = 119,

    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 인증키를 받는다.
#ifdef ENABLE_TICKET_SYSTEM
    HEADER_CG_TICKET_OPEN            = 117,
    HEADER_CG_TICKET_CREATE            = 118,
    HEADER_CG_TICKET_REPLY            = 119,
    HEADER_CG_TICKET_ADMIN            = 120,
    HEADER_CG_TICKET_ADMIN_PAGE        = 121,
#endif
#ifdef ENABLE_FEATURES_OXEVENT
    HEADER_CG_OXEVENT_MANAGER        = 120,
#endif
#ifdef __ADMIN_MANAGER__
    HEADER_CG_ADMIN_BAN_MANAGER        = 126,
#endif
#ifdef __UPGRADE_ITEMS_STORAGE__
    HEADER_CG_UPGRADE_ITEMS_STORAGE_CHECKIN        = 127,
    HEADER_CG_UPGRADE_ITEMS_STORAGE_CHECKOUT    = 128,
    HEADER_CG_UPGRADE_ITEMS_STORAGE_ITEM_MOVE    = 129,
#endif
//    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,
#ifdef __WHISPER_ADMIN__
    HEADER_CG_WHISPER_ADMIN    = 215,
#endif
    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,
#ifdef NEW_PET_SYSTEM
    HEADER_CG_PetSetName = 147,
#endif

    HEADER_GC_MOUNT                = 61,
    HEADER_GC_OWNERSHIP                = 62,
    HEADER_GC_TARGET                 = 63,
    #ifdef __SEND_TARGET_INFO__
    HEADER_GC_TARGET_INFO            = 58,
    HEADER_CG_TARGET_INFO_LOAD        = 59,
#endif

    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,
#ifdef ENABLE_SUPPORT_SYSTEM
    HEADER_GC_SUPPORT_SKILL            = 148,
#endif
    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
#ifdef ENABLE_TICKET_SYSTEM
    HEADER_GC_TICKET_LOGS                = 139,
    HEADER_GC_TICKET_LOGS_REPLY            = 140,
#endif
#ifdef ENABLE_FEATURES_OXEVENT
    HEADER_GC_OXEVENT                    = 146,
#endif    
    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,
#ifdef ENABLE_GEM_SYSTEM
    HEADER_GC_GEM_SHOP_OPEN            = 155,
    HEADER_GC_GEM_SHOP_REFRESH        = 156,
#endif
#ifdef __UPGRADE_ITEMS_STORAGE__
    HEADER_GC_UPGRADE_ITEMS_STORAGE_SET        = 160,
    HEADER_GC_UPGRADE_ITEMS_STORAGE_DEL        = 161,
    HEADER_GC_UPGRADE_ITEMS_STORAGE_OPEN    = 162,
#endif

    // 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_GC_SKILL_MOTION                    = 157,
    HEADER_GC_IGNORE_NEXT_SKILL_COOLDOWN    = 158,


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

    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,
#ifdef __TITLE_SYSTEM__
    HEADER_CG_TITLE_CHOOSE = 208,
    HEADER_GG_TITLE_ANSWER = 37,
#endif
    HEADER_GG_CHECK_AWAKENESS        = 29,
#ifdef ENABLE_FULL_NOTICE
    HEADER_GG_BIG_NOTICE            = 30,
#endif
#ifdef __WHISPER_ADMIN__    
    HEADER_GG_WHISPER_SYSTEM        = 31,
#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;

#ifdef __UPGRADE_ITEMS_STORAGE__
typedef struct command_upgrade_items_storage_checkout
{
    BYTE    bHeader;
    WORD    bSafePos;
    TItemPos    ItemPos;
} TPacketCGUpgradeItemsStorageCheckout;

typedef struct command_upgrade_items_storage_checkin
{
    BYTE    bHeader;
    WORD    bSafePos;
    TItemPos    ItemPos;
} TPacketCGUpgradeItemsStorageCheckin;
#endif

/* 로그인 (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;

#ifdef NEW_PET_SYSTEM
typedef struct packet_RequestPetName
{
    BYTE byHeader;
    char petname[13];

}TPacketCGRequestPetName;
#endif

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_destroy
{
    BYTE        header;
    TItemPos    Cell;
} TPacketCGItemDestroy;

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

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

#ifdef ENABLE_GEM_SYSTEM
typedef struct command_gem_shop
{
    BYTE        header;
    BYTE        subheader;
} TPacketCGGemShop;

typedef struct command_gem_shop_open
{
    BYTE    header;
    int     nextRefreshTime;
    TGemShopItem shopItems[GEM_SLOTS_MAX_NUM];
} TPacketGCGemShopOpen;

typedef struct command_gem_shop_refresh
{
    BYTE    header;
    int     nextRefreshTime;
    TGemShopItem shopItems[GEM_SLOTS_MAX_NUM];
} TPacketGCGemShopRefresh;

enum
{
    GEM_SHOP_SUBHEADER_CG_BUY,
    GEM_SHOP_SUBHEADER_CG_ADD,
    GEM_SHOP_SUBHEADER_CG_REFRESH,
};
#endif

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
};

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;
    long long    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,
    #ifdef __SASH_SYSTEM__
    CHR_EQUIPPART_SASH,
    #endif
    CHR_EQUIPPART_NUM,
};

typedef struct packet_add_char
{
    BYTE    header;
    DWORD    dwVID;
#if defined(__WJ_SHOW_MOB_INFO__)
    DWORD    dwLevel;
    DWORD    dwAIFlag;
#endif
    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;
#ifdef TITLE_SYSTEM_ENABLE
    short    sPrestige;
#endif
    BYTE    bPKMode;
#ifdef __TITLE_SYSTEM__
    int        iTitleID;
#endif
    DWORD    dwMountVnum;
#ifdef __ENABLE_BATTLE_FIELD__
    BYTE    bBattleRank;
#endif    
} 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;
#ifdef TITLE_SYSTEM_ENABLE
    short    sPrestige;
#endif
#ifdef NEW_PET_SYSTEM
    DWORD   dwLevel;
#endif
    BYTE    bPKMode;
#ifdef __TITLE_SYSTEM__
    int        iTitleID;
#endif
    DWORD    dwMountVnum;
#ifdef __ENABLE_BATTLE_FIELD__
    BYTE    bBattleRank;
#endif
} TPacketGCCharacterUpdate;


#ifdef __WHISPER_ADMIN__
typedef struct SPacketCGWhisperAdmin
{
    BYTE    header;
    char    szText[512 + 1];
    char    szLang[2 + 1];
    int        color;
} TPacketCGWhisperAdmin;

typedef struct SPacketGGWhisperSystem
{
    BYTE    bHeader;
    long    lSize;
} TPacketGGWhisperSystem;
#endif

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

#ifdef ENABLE_TICKET_SYSTEM
typedef struct SPacketCGTicketOpen
{
    BYTE    header;
    int        action;
    int        mode;
    char    ticked_id[10 + 1];
} TPacketCGTicketOpen;

typedef struct SPacketCGTicketCreate
{
    BYTE    header;
    char    title[32 + 1];
    char    content[512 + 1];
    int        priority;
} TPacketCGTicketCreate;

typedef struct SPacketCGTicketReply
{
    BYTE    header;
    char    ticked_id[10 + 1];
    char    reply[512 + 1];
} TPacketCGTicketReply;

typedef struct SPacketTicketLogs
{
    char    ticked_id[10 + 1];
    char    title[32 + 1];
    char    content[512 + 1];
    int        priority;
    char    create_date[19 + 1];
    int        status;
} TPacketTicketLogs;

typedef struct SPacketTicketLogsData
{
    BYTE header;
    TPacketTicketLogs logs[200];
} TPacketTicketLogsData;

typedef struct SPacketTicketLogsReply
{
    char    reply_from[12 + 1];
    char    reply_content[512 + 1];
    char    reply_date[19 + 1];
} TPacketTicketLogsReply;

typedef struct SPacketTicketLogsDataReply
{
    BYTE header;
    TPacketTicketLogsReply logs[40];
} TPacketTicketLogsDataReply;

typedef struct SPacketCGTicketAdmin
{
    BYTE    header;
    int        action;
    char    ticked_id[10 + 1];    
    char    char_name[12 + 1];
    char    reason[32 + 1];
} TPacketCGTicketAdmin;

typedef struct SPacketCGTicketAdminChangePage
{
    BYTE    header;
    int        iStartPage;
} TPacketCGTicketAdminChangePage;
#endif

#ifdef ENABLE_FEATURES_OXEVENT
typedef struct SPacketOxEvent
{
    char    name[12 + 1];
    int        level;
    char    guild[12 + 1];
    int        empire;
    int        job;
    char    date[19 + 1];
    int        correct_answers;
} TPacketCGOxEvent;

typedef struct SPacketOxEventData
{
    BYTE header;
    TPacketCGOxEvent tempInfo[5];
} TPacketCGOxEventData;

typedef struct SPacketCGOxEventManager
{
    BYTE    header;
    int        type;
    char    password[12 + 1];
    int        vnum;
    int        count;
} TPacketCGOxEventManager;
#endif

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;
    long long        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 long    amount;
    long 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;
#ifdef __CHANGELOOK_SYSTEM__
    DWORD    transmutation;
#endif
    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;
#ifdef __CHANGELOOK_SYSTEM__
    DWORD    transmutation;
#endif
    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;
#ifdef __CHANGELOOK_SYSTEM__
    DWORD    transmutation;
#endif
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
} TPacketGCItemUpdate;

typedef struct packet_item_ground_add
{
#ifdef __EXTENDED_ITEM_NAME__
    packet_item_ground_add()
    {
        memset(&alSockets, 0, sizeof(alSockets));
        memset(&aAttrs, 0, sizeof(aAttrs));
    }
#endif

    BYTE    bHeader;
    long     x, y, z;
    DWORD    dwVID;
    DWORD    dwVnum;
#ifdef __EXTENDED_ITEM_NAME__
    long    alSockets[ITEM_SOCKET_MAX_NUM];//3
    TPlayerItemAttribute aAttrs[ITEM_ATTRIBUTE_MAX_NUM];//7
#endif
} 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,
#ifdef __MULTI_SHOP__
    SHOP_SUBHEADER_GC_NOT_ENOUGH_ITEM,
#endif
    YOK_2,
    YOK_3,
    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,
#ifdef __ENABLE_BATTLE_FIELD__
    SHOP_SUBHEADER_GC_NOT_ENOUGH_BATTLE_POINTS,
    SHOP_SUBHEADER_GC_EXCEED_LIMIT_TODAY,
#endif
};

struct packet_shop_item
{   
    DWORD       vnum;
#ifdef FULL_YANG
    long long    price;
#else
    DWORD       price;
#endif
    BYTE        count;

#ifdef __MULTI_SHOP__
    DWORD        wPriceVnum;
    DWORD        wPrice;
#endif

#ifdef __CHANGELOOK_SYSTEM__
    DWORD    transmutation;
#endif
    BYTE        display_pos;
    long    alSockets[ITEM_SOCKET_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
};

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

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;
#ifdef __ENABLE_BATTLE_FIELD__
    int    usablePoints;
    int    limitMaxPoints;
#endif
} TPacketGCShopStartEx;

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

typedef struct packet_shop_update_price
{
    long long                iPrice;
} TPacketGCShopUpdatePrice;

typedef struct packet_shop    // 가변 패킷
{
    BYTE        header;
    WORD    size;
    BYTE        subheader;
} TPacketGCShop;

struct packet_exchange
{
    BYTE    header;
    BYTE    sub_header;
    BYTE    is_me;
    long long    arg1;    // vnum
    TItemPos    arg2;    // cell
    DWORD    arg3;    // count
#ifdef WJ_ENABLE_TRADABLE_ICON
    TItemPos    arg4;    // srccell
#endif
#ifdef __CHANGELOOK_SYSTEM__
    DWORD    dwTransmutation;
#endif
    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;

#ifdef ENABLE_SUPPORT_SYSTEM
typedef struct support_use_skill
{
    BYTE    bHeader;
    DWORD    dwVnum;
    DWORD    dwVid;
    DWORD    dwLevel;
}TPacketGCSupportUseSkill;
#endif

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;
#ifdef __VIEW_TARGET_DECIMAL_HP__
    int        iMinHP;
    int        iMaxHP;
#endif
} TPacketGCTarget;

#ifdef __SEND_TARGET_INFO__
typedef struct packet_target_info
{
    BYTE    header;
    DWORD    dwVID;
    DWORD    race;
    DWORD    dwVnum;
    BYTE    count;
} TPacketGCTargetInfo;

typedef struct packet_target_info_load
{
    BYTE header;
    DWORD dwVID;
} TPacketCGTargetInfoLoad;
#endif

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;

#ifdef __ADMIN_MANAGER__
typedef struct SPacketCGAdminTool
{
    BYTE    header;
    int        action;
    char    user_name[12 + 1];
    char    reason[32 + 1];
    int        duration;
} TPacketCGAdminBanManger;
#endif

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;
    #ifdef OFFLINE_SHOP
    BYTE    days;
    #endif
} TPacketCGMyShop;

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;
#ifdef __REFINE_SYSTEM__
    BYTE        lLow;
    BYTE        lMedium;
    BYTE        lExtra;
    BYTE        lTotal;
#endif
} 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;

#ifdef __ENABLE_BATTLE_FIELD__
enum
{
    HEADER_CG_REQUEST_ENTER_BATTLE  = 217,
    HEADER_CG_REQUEST_EXIT_BATTLE  = 218,
    
    HEADER_GC_BATTLE_ZONE_INFO = 222,
};

typedef struct SBattleRankingMember {
    BYTE    bPosition;
    BYTE    bType;
    char     szName[CHARACTER_NAME_MAX_LEN + 1];
    BYTE    bEmpire;
    long    lScore;
} TBattleRankingMember;

typedef struct SPacketGCBattleInfo {
    BYTE    bHeader;
    WORD    wSize;
    int        iOpenTime;
    int        iCloseTime;
    bool    bIsEnterOpen;
    bool    bIsEvent;
} TPacketGCBattleInfo;
#endif

#ifdef __TITLE_SYSTEM__
typedef struct SPacketGGTitleInfo
{
    BYTE    bHeader;
    int        iTitle;
    BYTE    bAnswer;
} TPacketGGTitleInfo;
#endif

#ifdef __CHANGELOOK_SYSTEM__
enum
{
    HEADER_CG_CL = 213,
    HEADER_GC_CL = 218,
    CL_SUBHEADER_OPEN = 0,
    CL_SUBHEADER_CLOSE,
    CL_SUBHEADER_ADD,
    CL_SUBHEADER_REMOVE,
    CL_SUBHEADER_REFINE,
};

typedef struct SPacketChangeLook
{
    BYTE    header;
    BYTE    subheader;
    DWORD    dwCost;
    BYTE    bPos;
    TItemPos    tPos;
} TPacketChangeLook;
#endif

#ifdef __SASH_SYSTEM__
enum
{
    HEADER_CG_SASH = 211,
    HEADER_GC_SASH = 215,
    SASH_SUBHEADER_GC_OPEN = 0,
    SASH_SUBHEADER_GC_CLOSE,
    SASH_SUBHEADER_GC_ADDED,
    SASH_SUBHEADER_GC_REMOVED,
    SASH_SUBHEADER_CG_REFINED,
    SASH_SUBHEADER_CG_CLOSE = 0,
    SASH_SUBHEADER_CG_ADD,
    SASH_SUBHEADER_CG_REMOVE,
    SASH_SUBHEADER_CG_REFINE,
};

typedef struct SPacketSash
{
    BYTE    header;
    BYTE    subheader;
    bool    bWindow;
    DWORD    dwPrice;
    BYTE    bPos;
    TItemPos    tPos;
    DWORD    dwItemVnum;
    DWORD    dwMinAbs;
    DWORD    dwMaxAbs;
} TPacketSash;
#endif

//ceva buffi
typedef struct SPacketGCIgnoreNextSkillCooldown
{
    BYTE    header;
} TPacketGCIgnoreNextSkillCooldown;

typedef struct SPacketGCSkillMotion
{
    BYTE    header;
    DWORD    dwVID;
    long    lX;
    long    lY;
    BYTE    bRot;
    DWORD    dwTime;
    DWORD    dwSkillVnum;
    BYTE    bSkillLevel;
    BYTE    bSkillGrade;
} TPacketGCSkillMotion;

#ifdef __SHOW_CHEST_DROP__
enum
{
    HEADER_CG_CHEST_DROP_INFO = 216,
    HEADER_GC_CHEST_DROP_INFO = 219,
};

typedef struct SPacketCGChestDropInfo {
    BYTE    header;
    WORD    wInventoryCell;
} TPacketCGChestDropInfo;

typedef struct SChestDropInfoTable {
    BYTE    bPageIndex;
    BYTE    bSlotIndex;
    DWORD    dwItemVnum;
    BYTE    bItemCount;
} TChestDropInfoTable;

typedef struct SPacketGCChestDropInfo {
    BYTE    bHeader;
    WORD    wSize;
    DWORD    dwChestVnum;
} TPacketGCChestDropInfo;
#endif

#ifdef __ATTENDANCE_EVENT__
enum
{
    HEADER_CG_ATTENDANCE_REWARD = 220,
    
    HEADER_GC_HIT_COUNT_INFO = 224,
    HEADER_GC_ATTENDANCE_EVENT = 225,
    HEADER_GC_ATTENDANCE_EVENT_INFO = 226,
};

typedef struct SHitCountInfo
{
    SHitCountInfo(){ dwVid = dwCount = 0;}
    SHitCountInfo(DWORD vid, DWORD count)
    {
        dwVid = vid;
        dwCount = count;
    }
    DWORD    dwVid;
    DWORD    dwCount;
} THitCountInfo;

typedef struct SRewardItem
{
    BYTE bDay;
    DWORD dwVnum;
    DWORD dwCount;
} TRewardItem;

typedef struct SPacketGCHitCountInfo {
    BYTE    bHeader;
    DWORD    dwVid;
    DWORD    dwCount;
} TPacketGCHitCountInfo;

typedef struct SPacketGCAttendanceEventInfo {
    BYTE    bHeader;
    WORD    wSize;
    bool    bIsEnable;
    BYTE    bDay;
    BYTE    bClear;
    BYTE    bReward;
} TPacketGCAttendanceEventInfo;

typedef struct SPacketGCAttendanceEvent {
    BYTE    bHeader;
    BYTE    bType;
    BYTE    bValue;
} TPacketGCAttendanceEvent;
#endif

#ifdef ENABLE_FISH_EVENT
enum
{
    HEADER_CG_FISH_EVENT_SEND = 219,
    HEADER_GC_FISH_EVENT_INFO = 223,
};

enum
{
    FISH_EVENT_SUBHEADER_BOX_USE,
    FISH_EVENT_SUBHEADER_SHAPE_ADD,
    FISH_EVENT_SUBHEADER_GC_REWARD,
    FISH_EVENT_SUBHEADER_GC_ENABLE,
};

typedef struct SPacketGCFishEvent {
    BYTE    bHeader;
    BYTE    bSubheader;
} TPacketCGFishEvent;

typedef struct SPacketGCFishEventInfo {
    BYTE    bHeader;
    BYTE    bSubheader;
    DWORD    dwFirstArg;
    DWORD    dwSecondArg;
} TPacketGCFishEventInfo;
#endif

#pragma pack()
#endif
Client/packet.h
Kod:
#pragma once

#ifdef USE_AHNLAB_HACKSHIELD
#include "Hackshield.h"
#include METIN2HS_INCLUDE_ANTICPXSVR
#include "../UserInterface/Locale_inc.h"
#else
#pragma pack(push) //기존 alignment 저장
#pragma pack(8)

#define ANTICPX_TRANS_BUFFER_MAX            400

typedef struct _AHNHS_TRANS_BUFFER
{
    unsigned char byBuffer[ANTICPX_TRANS_BUFFER_MAX/* 송수신 패킷의 최대 크기 */];
    unsigned short nLength;
} AHNHS_TRANS_BUFFER, *PAHNHS_TRANS_BUFFER;

#pragma pack(pop) // 기존 alignment 복구.
#endif /* !USE_AHNLAB_HACKSHIELD */

#include "Locale.h"
#include "../gamelib/RaceData.h"
#include "../gamelib/ItemData.h"
#include "Locale_inc.h"
typedef BYTE TPacketHeader;

enum
{
    /////////////////////////////////////////////////
    // To Server
    // HEADER_BLANK is the not use(for future use)
    HEADER_CG_LOGIN                                = 1,
    HEADER_CG_ATTACK                            = 2,
    HEADER_CG_CHAT                                = 3,
    HEADER_CG_PLAYER_CREATE                        = 4,        // 새로운 플래이어를 생성
    HEADER_CG_PLAYER_DESTROY                    = 5,        // 플래이어를 삭제.
    HEADER_CG_PLAYER_SELECT                        = 6,
    HEADER_CG_CHARACTER_MOVE                    = 7,
    HEADER_CG_SYNC_POSITION                      = 8,
    HEADER_CG_DIRECT_ENTER                        = 9,
    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,
#ifdef NEW_ADD_INVENTORY
    ENVANTER_BLACK                                = 23,
#endif
    HEADER_CG_ITEM_DROP2                        = 20,
    HEADER_CG_ITEM_DESTROY                        = 21,
    //HEADER_BLANK21                                = 21,
    //HEADER_BLANK22                                = 22,
    //HEADER_BLANK22                                = 23,
    //HEADER_BLANK24                                = 24,
    //HEADER_BLANK25                                = 25,
    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_BLANK32                                = 32,
    //HEADER_BLANK33                                = 33,
    //HEADER_BLANK34                                = 34,
    //HEADER_BLANK35                                = 35,
    //HEADER_BLANK36                                = 36,
    //HEADER_BLANK37                                = 37,
    //HEADER_BLANK38                                = 38,
    //HEADER_BLANK39                                = 39,
    //HEADER_BLANK40                                = 40,
    HEADER_CG_PVP                                = 41,
    //HEADER_BLANK42                                = 42,
    //HEADER_BLANK43                                = 43,
    //HEADER_BLANK44                                = 44,
    //HEADER_BLANK45                                = 45,
    //HEADER_BLANK46                                = 46,
    //HEADER_BLANK47                                = 47,
    //HEADER_BLANK48                                = 48,
    //HEADER_BLANK49                                = 49,
    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,
#ifdef ENABLE_GEM_SYSTEM
    HEADER_CG_GEM_SHOP                            = 56,
#endif
    //HEADER_BLANK56                                = 56,
    //HEADER_BLANK57                                = 57,
    //HEADER_BLANK58                                = 58,
    //HEADER_BLANK59                                = 59,
    HEADER_CG_ITEM_USE_TO_ITEM                    = 60,
    HEADER_CG_TARGET                            = 61,
    //HEADER_BLANK62                                = 62,
    //HEADER_BLANK63                                = 63,
    //HEADER_BLANK64                                = 64,
    HEADER_CG_WARP                                = 65,
    HEADER_CG_SCRIPT_BUTTON                        = 66,
    HEADER_CG_MESSENGER                         = 67,
    //HEADER_BLANK68                                = 68,
    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_BLANK68                                = 79,
    HEADER_CG_GUILD                                = 80,
    HEADER_CG_ANSWER_MAKE_GUILD                    = 81,
    HEADER_CG_FISHING                           = 82,
    HEADER_CG_GIVE_ITEM                         = 83,
    //HEADER_BLANK84                                = 84,
    //HEADER_BLANK85                                = 85,
    //HEADER_BLANK86                                = 86,
    //HEADER_BLANK87                                = 87,
    //HEADER_BLANK88                                = 88,
    //HEADER_BLANK89                                = 89,
    HEADER_CG_EMPIRE                            = 90,
    //HEADER_BLANK91                                = 91,
    //HEADER_BLANK92                                = 92,
    //HEADER_BLANK93                                = 93,
    //HEADER_BLANK94                                = 94,
    //HEADER_BLANK95                                = 95,
    HEADER_CG_REFINE                            = 96,
    //HEADER_BLANK97                                = 97,
    //HEADER_BLANK98                                = 98,
    //HEADER_BLANK99                                = 99,

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

    HEADER_CG_CRC_REPORT                        = 103,

    HEADER_CG_HACK                                = 105,
    HEADER_CG_CHANGE_NAME                       = 106,
    HEADER_CG_SMS                               = 107,
    HEADER_CG_CHINA_MATRIX_CARD                 = 108,
    HEADER_CG_LOGIN2                            = 117,
    HEADER_CG_DUNGEON                            = 110,
    HEADER_CG_LOGIN3                            = 119,
    HEADER_CG_GUILD_SYMBOL_UPLOAD                = 112,
    HEADER_CG_GUILD_SYMBOL_CRC                    = 113,
    HEADER_CG_SCRIPT_SELECT_ITEM                = 114,
    HEADER_CG_LOGIN4                            = 115,
    HEADER_CG_LOGIN5_OPENID                        = 116,    //OpenID : 실행시 받은 인증키를 서버에 보냄.
#ifdef ENABLE_TICKET_SYSTEM
    HEADER_CG_TICKET_OPEN                        = 117,
    HEADER_CG_TICKET_CREATE                        = 118,
    HEADER_CG_TICKET_REPLY                        = 119,
    HEADER_CG_TICKET_ADMIN                        = 120,
    HEADER_CG_TICKET_ADMIN_PAGE                    = 121,
#endif
#ifdef ENABLE_ADMIN_BAN_MANAGER
    HEADER_CG_ADMIN_BAN_MANAGER                    = 126,
#endif
#ifdef ENABLE_UPGRADE_ITEMS_STORAGE
    HEADER_CG_UPGRADE_ITEMS_STORAGE_CHECKIN        = 127,
    HEADER_CG_UPGRADE_ITEMS_STORAGE_CHECKOUT    = 128,
    HEADER_CG_UPGRADE_ITEMS_STORAGE_ITEM_MOVE    = 129,
#endif    
    HEADER_CG_RUNUP_MATRIX_ANSWER               = 201,
    HEADER_CG_NEWCIBN_PASSPOD_ANSWER            = 202,

    HEADER_CG_HS_ACK                            = 203,
    HEADER_CG_XTRAP_ACK                            = 204,

    HEADER_CG_DRAGON_SOUL_REFINE            = 205,
    HEADER_CG_STATE_CHECKER                    = 206,

#ifdef __AUCTION__
    HEADER_CG_AUCTION_CMD                            = 205,
#endif

#ifdef ENABLE_WHISPER_ADMIN_SYSTEM
    HEADER_CG_WHISPER_ADMIN            = 215,
#endif
    HEADER_CG_KEY_AGREEMENT                        = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_
    HEADER_CG_TIME_SYNC                            = 0xfc,
    HEADER_CG_CLIENT_VERSION                    = 0xfd,
    HEADER_CG_CLIENT_VERSION2                    = 0xf1,
    HEADER_CG_PONG                                = 0xfe,
    HEADER_CG_HANDSHAKE                         = 0xff,
    /////////////////////////////////////////////////
    // From Server

    HEADER_GC_CHARACTER_ADD                        = 1,
    HEADER_GC_CHARACTER_DEL                        = 2,
    HEADER_GC_CHARACTER_MOVE                    = 3,
    HEADER_GC_CHAT                                = 4,
    HEADER_GC_SYNC_POSITION                     = 5,
    HEADER_GC_LOGIN_SUCCESS3                    = 6,
    HEADER_GC_LOGIN_FAILURE                        = 7,
    HEADER_GC_PLAYER_CREATE_SUCCESS                = 8,
    HEADER_GC_PLAYER_CREATE_FAILURE                = 9,
    HEADER_GC_PLAYER_DELETE_SUCCESS                = 10,
    HEADER_GC_PLAYER_DELETE_WRONG_SOCIAL_ID        = 11,
    // 12
    HEADER_GC_STUN                                = 13,
    HEADER_GC_DEAD                                = 14,

    HEADER_GC_MAIN_CHARACTER                    = 15,
    HEADER_GC_PLAYER_POINTS                        = 16,
    HEADER_GC_PLAYER_POINT_CHANGE                = 17,
    HEADER_GC_CHANGE_SPEED                        = 18,
    HEADER_GC_CHARACTER_UPDATE                  = 19,
#if defined(GAIDEN)
    HEADER_GC_ITEM_DEL                            = 20, // 아이템 창에 추가
    HEADER_GC_ITEM_SET                            = 21, // 아이템 창에 추가
#else
    HEADER_GC_ITEM_SET                            = 20, // 아이템 창에 추가
    HEADER_GC_ITEM_SET2                            = 21, // 아이템 창에 추가
#endif
    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_LOGIN_SUCCESS4                    = 32,
    HEADER_GC_ITEM_UNBIND_TIME                    = 33,
    HEADER_GC_WHISPER                            = 34,
    HEADER_GC_ALERT                                = 35,

    HEADER_GC_MOTION                            = 36,

    HEADER_GC_SHOP                                = 38,
    HEADER_GC_SHOP_SIGN                            = 39,

    // 39 ~ 41 Balnk
    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,
#ifdef NEW_PET_SYSTEM
    HEADER_CG_PetSetName                        = 147,
#endif

    HEADER_GC_MOUNT                                = 61,
    HEADER_GC_OWNERSHIP                         = 62,
    HEADER_GC_TARGET                            = 63,
    
#ifdef ENABLE_SEND_TARGET_INFO
    HEADER_GC_TARGET_INFO                        = 58,
    HEADER_CG_TARGET_INFO_LOAD                    = 59,
#endif


    HEADER_GC_WARP                                = 65,
    HEADER_GC_ADD_FLY_TARGETING                 = 69,

    HEADER_GC_CREATE_FLY                        = 70,
    HEADER_GC_FLY_TARGETING                        = 71,
    HEADER_GC_SKILL_LEVEL                        = 72,
    HEADER_GC_SKILL_COOLTIME_END                = 73,
    HEADER_GC_MESSENGER                         = 74,
    HEADER_GC_GUILD                                = 75,
    HEADER_GC_SKILL_LEVEL_NEW                    = 76,

    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_MONEY_CHANGE              = 84,
    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                = 95,

    HEADER_GC_OBSERVER_ADD                        = 96,
    HEADER_GC_OBSERVER_REMOVE                    = 97,
    HEADER_GC_OBSERVER_MOVE                        = 98,
    HEADER_GC_VIEW_EQUIP                        = 99,

    HEADER_GC_MARK_BLOCK                        = 100,
    HEADER_GC_MARK_DIFF_DATA                    = 101,
    HEADER_GC_MARK_IDXLIST                        = 102,

    //HEADER_GC_SLOW_TIMER                        = 105,
    HEADER_GC_TIME                              = 106,
    HEADER_GC_CHANGE_NAME                       = 107,

    HEADER_GC_DUNGEON                            = 110,
    HEADER_GC_WALK_MODE                            = 111,
    HEADER_GC_CHANGE_SKILL_GROUP                = 112,

#if defined(GAIDEN)
    HEADER_GC_MAIN_CHARACTER                    = 113,
    HEADER_GC_MAIN_CHARACTER3_BGM                = 137,
    HEADER_GC_MAIN_CHARACTER4_BGM_VOL            = 138,
#else
    // SUPPORT_BGM
    HEADER_GC_MAIN_CHARACTER2_EMPIRE            = 113,
    // END_OF_SUPPORT_BGM
#endif
    HEADER_GC_SEPCIAL_EFFECT                    = 114,
    HEADER_GC_NPC_POSITION                        = 115,

    HEADER_GC_CHINA_MATRIX_CARD                 = 116,
    HEADER_GC_CHARACTER_UPDATE2                 = 117,
    HEADER_GC_LOGIN_KEY                         = 118,
    HEADER_GC_REFINE_INFORMATION_NEW            = 119,
    HEADER_GC_CHARACTER_ADD2                    = 120,
    HEADER_GC_CHANNEL                           = 121,

    HEADER_GC_MALL_OPEN                         = 122,
    HEADER_GC_TARGET_UPDATE                     = 123,
    HEADER_GC_TARGET_DELETE                     = 124,
    HEADER_GC_TARGET_CREATE_NEW                 = 125,

#ifdef ENABLE_SUPPORT_SYSTEM
    HEADER_GC_SUPPORT_SKILL                        = 148,
#endif    
    
    HEADER_GC_AFFECT_ADD                        = 126,
    HEADER_GC_AFFECT_REMOVE                     = 127,

    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_GUILD_SYMBOL_DATA                    = 133,
    HEADER_GC_DIG_MOTION                        = 134,

    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

#ifdef ENABLE_TICKET_SYSTEM
    HEADER_GC_TICKET_LOGS                        = 139,
    HEADER_GC_TICKET_LOGS_REPLY                    = 140,
#endif

    HEADER_GC_AUTH_SUCCESS                      = 150,
    HEADER_GC_PANAMA_PACK                        = 151,

    HEADER_GC_AUTH_SUCCESS_OPENID                = 154,
#ifdef ENABLE_UPGRADE_ITEMS_STORAGE
    HEADER_GC_UPGRADE_ITEMS_STORAGE_SET            = 160,
    HEADER_GC_UPGRADE_ITEMS_STORAGE_DEL            = 161,
    HEADER_GC_UPGRADE_ITEMS_STORAGE_OPEN        = 162,
#endif
#ifdef ENABLE_GEM_SYSTEM
    HEADER_GC_GEM_SHOP_OPEN                        = 155,
    HEADER_GC_GEM_SHOP_REFRESH                    = 156,
#endif
    HEADER_GC_SKILL_MOTION                        = 157,

    HEADER_GC_RUNUP_MATRIX_QUIZ                 = 201,
    HEADER_GC_NEWCIBN_PASSPOD_REQUEST            = 202,
    HEADER_GC_NEWCIBN_PASSPOD_FAILURE            = 203,
#if defined(GAIDEN)
    HEADER_GC_ONTIME                            = 204,
    HEADER_GC_RESET_ONTIME                        = 205,

    // AUTOBAN
    HEADER_GC_AUTOBAN_QUIZ                        = 206,
    // END_OF_AUTOBAN

    HEADER_GC_HS_REQUEST                        = 207,    // Origially it's 204 on devel branch
#else
    HEADER_GC_HS_REQUEST                        = 204,
    HEADER_GC_XTRAP_CS1_REQUEST                    = 205,
#endif

#ifdef __AUCTION__
    HEADER_GC_AUCTOIN_ITEM_LIST                    = 206,
#endif

    HEADER_GC_SPECIFIC_EFFECT                    = 208,
    HEADER_GC_DRAGON_SOUL_REFINE                        = 209,
    HEADER_GC_RESPOND_CHANNELSTATUS                = 210,

    // @fixme007
    HEADER_GC_UNK_213                            = 213,

    HEADER_GC_KEY_AGREEMENT_COMPLETED            = 0xfa, // _IMPROVED_PACKET_ENCRYPTION_
    HEADER_GC_KEY_AGREEMENT                        = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_
    HEADER_GC_HANDSHAKE_OK                        = 0xfc, // 252
#ifdef ENABLE_TITLE_SYSTEM
    HEADER_CG_TITLE_CHOOSE = 208,
    HEADER_GG_TITLE_ANSWER = 37,
#endif
    HEADER_GC_PHASE                                = 0xfd,    // 253
    HEADER_GC_BINDUDP                           = 0xfe, // 254
    HEADER_GC_HANDSHAKE                         = 0xff, // 255

    /////////////////////////////////////////////////
    // Client To Client for UDP
    /*
    HEADER_CC_STATE_WAITING                        = 1,
    HEADER_CC_STATE_WALKING                        = 2,
    HEADER_CC_STATE_GOING                        = 3,
    HEADER_CC_EVENT_NORMAL_ATTACKING            = 4,
    HEADER_CC_EVENT_COMBO_ATTACKING                = 5,
    HEADER_CC_EVENT_HIT                            = 6,
    */
};

enum
{
    ID_MAX_NUM = 30,
    PASS_MAX_NUM = 16,
    CHAT_MAX_NUM = 128,
    PATH_NODE_MAX_NUM = 64,
    SHOP_SIGN_MAX_LEN = 32,

    PLAYER_PER_ACCOUNT3 = 3,
#ifndef ENABLE_PLAYER_PER_ACCOUNT5
    PLAYER_PER_ACCOUNT4 = 4,
#else
    PLAYER_PER_ACCOUNT4 = 5,
    PLAYER_PER_ACCOUNT5 = 5,
#endif

    PLAYER_ITEM_SLOT_MAX_NUM = 20,        // 플래이어의 슬롯당 들어가는 갯수.

    QUICKSLOT_MAX_LINE = 4,
    QUICKSLOT_MAX_COUNT_PER_LINE = 8, // 클라이언트 임의 결정값
    QUICKSLOT_MAX_COUNT = QUICKSLOT_MAX_LINE * QUICKSLOT_MAX_COUNT_PER_LINE,

    QUICKSLOT_MAX_NUM = 36, // 서버와 맞춰져 있는 값

    SHOP_HOST_ITEM_MAX_NUM = 45,

    METIN_SOCKET_COUNT = 6,

    PARTY_AFFECT_SLOT_MAX_NUM = 7,

    GUILD_GRADE_NAME_MAX_LEN = 8,
    GUILD_NAME_MAX_LEN = 12,
    GUILD_GRADE_COUNT = 15,
    GULID_COMMENT_MAX_LEN = 50,

    MARK_CRC_NUM = 8*8,
    MARK_DATA_SIZE = 16*12,
    SYMBOL_DATA_SIZE = 128*256,
    QUEST_INPUT_STRING_MAX_NUM = 64,

    PRIVATE_CODE_LENGTH = 8,

    REFINE_MATERIAL_MAX_NUM = 5,

    CHINA_MATRIX_ANSWER_MAX_LEN    = 8,

    RUNUP_MATRIX_QUIZ_MAX_LEN    = 8,
    RUNUP_MATRIX_ANSWER_MAX_LEN = 4,
    NEWCIBN_PASSPOD_ANSWER_MAX_LEN = 8,
    NEWCIBN_PASSPOD_FAILURE_MAX_LEN = 128,

    WEAR_MAX_NUM = CItemData::WEAR_MAX_NUM,

    OPENID_AUTHKEY_LEN = 32,

    SHOP_TAB_NAME_MAX = 32,
    SHOP_TAB_COUNT_MAX = 3,
};

#pragma pack(push)
#pragma pack(1)

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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    handle;
} TPacketCGSymbolUpload;

typedef struct command_symbol_crc
{
    BYTE    header;
    DWORD    dwGuildID;
    DWORD    dwCRC;
    DWORD    dwSize;
} TPacketCGSymbolCRC;

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

//
//
//
typedef struct packet_observer_add
{
    BYTE    header;
    DWORD    vid;
    WORD    x;
    WORD    y;
} TPacketGCObserverAdd;

typedef struct packet_observer_move
{
    BYTE    header;
    DWORD    vid;
    WORD    x;
    WORD    y;
} TPacketGCObserverMove;


typedef struct packet_observer_remove
{
    BYTE    header;
    DWORD    vid;
} TPacketGCObserverRemove;


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// To Server

typedef struct command_checkin
{
    BYTE header;
    char name[ID_MAX_NUM+1];
    char pwd[PASS_MAX_NUM+1];
} TPacketCGCheckin;

typedef struct command_login
{
    BYTE header;
    char name[ID_MAX_NUM + 1];
    char pwd[PASS_MAX_NUM + 1];
} TPacketCGLogin;

// start - 권한 서버 접속을 위한 패킷들
typedef struct command_login2
{
    BYTE    header;
    char    name[ID_MAX_NUM + 1];
    DWORD    login_key;
    DWORD    adwClientKey[4];
} TPacketCGLogin2;

typedef struct command_login3
{
    BYTE    header;
    char    name[ID_MAX_NUM + 1];
    char    pwd[PASS_MAX_NUM + 1];
    DWORD    adwClientKey[4];
} TPacketCGLogin3;

typedef struct command_login5
{
    BYTE    header;
    char    authKey[OPENID_AUTHKEY_LEN + 1];
    DWORD    adwClientKey[4];
} TPacketCGLogin5;
// end - 권한 서버 접속을 위한 패킷들

#ifdef NEW_PET_SYSTEM
typedef struct packet_RequestPetName
{
    BYTE byHeader;
    char petname[13];
} TPacketCGRequestPetName;
#endif

typedef struct command_direct_enter
{
    BYTE        bHeader;
    char        login[ID_MAX_NUM + 1];
    char        passwd[PASS_MAX_NUM + 1];
    BYTE        index;
} TPacketCGDirectEnter;

typedef struct command_player_select
{
    BYTE    header;
    BYTE    player_index;
} TPacketCGSelectCharacter;

typedef struct command_attack
{
    BYTE    header;
    BYTE    bType;            // 공격 유형
    DWORD    dwVictimVID;    // 적 VID
    BYTE    bCRCMagicCubeProcPiece;
    BYTE    bCRCMagicCubeFilePiece;
} TPacketCGAttack;

typedef struct command_chat
{
    BYTE    header;
    WORD    length;
    BYTE    type;
} TPacketCGChat;

typedef struct command_whisper
{
    BYTE        bHeader;
    WORD        wSize;
    char        szNameTo[CHARACTER_NAME_MAX_LEN + 1];
} TPacketCGWhisper;

typedef struct command_sms
{
    BYTE        bHeader;
    WORD        wSize;
    char        szNameTo[CHARACTER_NAME_MAX_LEN + 1];
} TPacketCGSMS;

enum EBattleMode
{
    BATTLEMODE_ATTACK = 0,
    BATTLEMODE_DEFENSE = 1,
};

typedef struct command_EnterFrontGame
{
    BYTE header;
} TPacketCGEnterFrontGame;

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

typedef struct command_item_use_to_item
{
    BYTE header;
    TItemPos source_pos;
    TItemPos target_pos;
} TPacketCGItemUseToItem;

typedef struct command_item_drop
{
    BYTE  header;
    TItemPos pos;
    DWORD elk;
} TPacketCGItemDrop;

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

typedef struct command_item_destroy
{
    BYTE        header;
    TItemPos    pos;
} TPacketCGItemDestroy;

typedef struct command_item_move
{
    BYTE header;
    TItemPos pos;
    TItemPos change_pos;
    BYTE num;
} TPacketCGItemMove;

#ifdef NEW_ADD_INVENTORY
typedef struct envanter_paketi
{
    BYTE        header;
} TPacketCGEnvanter;
#endif

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

typedef struct command_quickslot_add
{
    BYTE        header;
    BYTE        pos;
    TQuickSlot    slot;
}TPacketCGQuickSlotAdd;

#ifdef ENABLE_GEM_SYSTEM
typedef struct command_gem_shop
{
    BYTE        header;
    BYTE        subheader;
} TPacketCGGemShop;

typedef struct command_gem_shop_open
{
    BYTE    header;
    int     nextRefreshTime;
    TGemShopItem shopItems[9];
} TPacketGCGemShopOpen;

typedef struct command_gem_shop_refresh
{
    BYTE    header;
    int     nextRefreshTime;
    TGemShopItem shopItems[9];
} TPacketGCGemShopRefresh;

enum
{
    GEM_SHOP_SUBHEADER_CG_BUY,
    GEM_SHOP_SUBHEADER_CG_ADD,
    GEM_SHOP_SUBHEADER_CG_REFRESH,
};
#endif

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

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

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


enum
{
    SHOP_SUBHEADER_CG_END,
    SHOP_SUBHEADER_CG_BUY,
    SHOP_SUBHEADER_CG_SELL,
    SHOP_SUBHEADER_CG_SELL2,
};

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

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 elk
    EXCHANGE_SUBHEADER_CG_ACCEPT,            // arg1 == not used
    EXCHANGE_SUBHEADER_CG_CANCEL,            // arg1 == not used
};

typedef struct command_exchange
{
    BYTE        header;
    BYTE        subheader;
#ifdef ENABLE_YANG_LIMIT
    long long    arg1;
#else
    DWORD        arg1;
#endif
    BYTE        arg2;
    TItemPos    Pos;
} TPacketCGExchange;

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

typedef struct command_script_answer
{
    BYTE        header;
    BYTE        answer;
} TPacketCGScriptAnswer;

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

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

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;

typedef struct command_fly_targeting
{
    BYTE        bHeader;
    DWORD        dwTargetVID;
    long        lX;
    long        lY;
} TPacketCGFlyTargeting;

typedef struct packet_fly_targeting
{
    BYTE        bHeader;
    DWORD        dwShooterVID;
    DWORD        dwTargetVID;
    long        lX;
    long        lY;
} TPacketGCFlyTargeting;

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

typedef struct command_warp
{
    BYTE            bHeader;
} TPacketCGWarp;

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_list_offline
{
    BYTE connected; // always 0
    BYTE length;
} TPacketGCMessengerListOffline;

enum
{
    MESSENGER_CONNECTED_STATE_OFFLINE,
    MESSENGER_CONNECTED_STATE_ONLINE,
    MESSENGER_CONNECTED_STATE_MOBILE,
};

typedef struct packet_messenger_list_online
{
    BYTE connected;
    BYTE length;
    //BYTE length_char_name;
} TPacketGCMessengerListOnline;

typedef struct packet_messenger_login
{
    //BYTE length_login;
    //BYTE length_char_name;
    BYTE length;
} TPacketGCMessengerLogin;

typedef struct packet_messenger_logout
{
    BYTE length;
} TPacketGCMessengerLogout;

enum
{
    MESSENGER_SUBHEADER_CG_ADD_BY_VID,
    MESSENGER_SUBHEADER_CG_ADD_BY_NAME,
    MESSENGER_SUBHEADER_CG_REMOVE,
};

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

typedef struct command_messenger_remove
{
    BYTE length;
} TPacketCGMessengerRemove;

enum
{
    SAFEBOX_MONEY_STATE_SAVE,
    SAFEBOX_MONEY_STATE_WITHDRAW,
};

typedef struct command_safebox_money
{
    BYTE        bHeader;
    BYTE        bState;
    DWORD       dwMoney;
} TPacketCGSafeboxMoney;

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

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

#ifdef ENABLE_UPGRADE_ITEMS_STORAGE
typedef struct command_upgrade_items_storage_checkin
{
    BYTE        bHeader;
    WORD        bSafePos;
    TItemPos    ItemPos;
} TPacketCGUpgradeItemsStorageCheckin;

typedef struct command_upgrade_items_storage_checkout
{
    BYTE        bHeader;
    WORD        bSafePos;
    TItemPos    ItemPos;
} TPacketCGUpgradeItemsStorageCheckout;
#endif

typedef struct command_mall_checkout
{
    BYTE        bHeader;
    BYTE        bMallPos;
    TItemPos    ItemPos;
} TPacketCGMallCheckout;

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

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

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

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

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

typedef struct command_party_set_state
{
    BYTE byHeader;
    DWORD dwVID;
    BYTE byState;
    BYTE byFlag;
} TPacketCGPartySetState;

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_use_skill
{
    BYTE byHeader;
    BYTE bySkillIndex;
    DWORD dwTargetVID;
} TPacketCGPartyUseSkill;

enum
{
    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 command_guild
{
    BYTE byHeader;
    BYTE bySubHeader;
} TPacketCGGuild;

#ifdef ENABLE_ADMIN_BAN_MANAGER
typedef struct SPacketCGAdminTool
{
    BYTE    header;
    int        action;
    char    user_name[12 + 1];
    char    reason[32 + 1];
    int        duration;
} TPacketCGAdminBanManger;
#endif

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

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

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

typedef struct command_dungeon
{
    BYTE        bHeader;
    WORD        size;
} TPacketCGDungeon;

// Private Shop
typedef struct SShopItemTable
{
    DWORD        vnum;
    BYTE        count;
#ifdef __MULTI_SHOP__
    DWORD        wPriceVnum;
    DWORD        wPrice;
#endif

    TItemPos    pos;            // PC 상점에만 이용
#ifdef ENABLE_FULL_YANG
    long long    price;            // PC 상점에만 이용
#else
    DWORD        price;
#endif
    BYTE        display_pos;    //    PC 상점에만 이용, 보일 위치.
} TShopItemTable;

typedef struct SPacketCGMyShop
{
    BYTE        bHeader;
    char        szSign[SHOP_SIGN_MAX_LEN + 1];
    BYTE        bCount;    // count of TShopItemTable, max 39
#ifdef ENABLE_OFFLINE_SHOP
    BYTE        days;
#endif
} TPacketCGMyShop;

typedef struct SPacketCGRefine
{
    BYTE        header;
    BYTE        pos;
    BYTE        type;
#ifdef ENABLE_FEATURES_REFINE_SYSTEM
    BYTE        lLow;
    BYTE        lMedium;
    BYTE        lExtra;
    BYTE        lTotal;
#endif
} TPacketCGRefine;

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

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 command_crc_report
{
    BYTE header;
    BYTE byPackMode;
    DWORD dwBinaryCRC32;
    DWORD dwProcessCRC32;
    DWORD dwRootPackCRC32;
} TPacketCGCRCReport;

typedef struct command_china_matrix_card
{
    BYTE    bHeader;
    char    szAnswer[CHINA_MATRIX_ANSWER_MAX_LEN + 1];
} TPacketCGChinaMatrixCard;

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

typedef struct command_newcibn_passpod_answer
{
    BYTE    bHeader;
    char    szAnswer[NEWCIBN_PASSPOD_ANSWER_MAX_LEN + 1];
} TPacketCGNEWCIBNPasspodAnswer;

enum EPartyExpDistributionType
{
    PARTY_EXP_DISTRIBUTION_NON_PARITY,
    PARTY_EXP_DISTRIBUTION_PARITY,
};

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

typedef struct command_quest_input_string
{
    BYTE        bHeader;
    char        szString[QUEST_INPUT_STRING_MAX_NUM+1];
} TPacketCGQuestInputString;

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

typedef struct command_script_select_item
{
    BYTE header;
    DWORD selection;
} TPacketCGScriptSelectItem;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// From Server
enum EPhase
{
    PHASE_CLOSE,                // 끊기는 상태 (또는 끊기 전 상태)
    PHASE_HANDSHAKE,            // 악수..;;
    PHASE_LOGIN,                // 로그인 중
    PHASE_SELECT,                // 캐릭터 선택 화면
    PHASE_LOADING,                // 선택 후 로딩 화면
    PHASE_GAME,                    // 게임 화면
    PHASE_DEAD,                    // 죽었을 때.. (게임 안에 있는 것일 수도..)

    PHASE_DBCLIENT_CONNECTING,    // 서버용
    PHASE_DBCLIENT,                // 서버용
    PHASE_P2P,                    // 서버용
    PHASE_AUTH,                    // 로그인 인증 용
};

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

typedef struct packet_blank        // 공백패킷.
{
    BYTE        header;
} TPacketGCBlank;

typedef struct packet_blank_dynamic
{
    BYTE        header;
    WORD        size;
} TPacketGCBlankDynamic;

typedef struct packet_header_handshake
{
    BYTE        header;
    DWORD        dwHandshake;
    DWORD        dwTime;
    LONG        lDelta;
} TPacketGCHandshake;

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

typedef struct packet_header_dynamic_size
{
    BYTE        header;
    WORD        size;
} TDynamicSizePacketHeader;

typedef struct SSimplePlayerInformation
{
    DWORD               dwID;
    char                szName[CHARACTER_NAME_MAX_LEN + 1];
    BYTE                byJob;
    BYTE                byLevel;
    DWORD               dwPlayMinutes;
    BYTE                byST, byHT, byDX, byIQ;
//    WORD                wParts[CRaceData::PART_MAX_NUM];
    WORD                wMainPart;
    BYTE                bChangeName;
    WORD                wHairPart;
    #ifdef ENABLE_SASH_SYSTEM
    WORD    wSashPart;
    #endif

    BYTE                bDummy[4];
    long                x, y;
    LONG                lAddr;
    WORD                wPort;
    BYTE                bySkillGroup;
} TSimplePlayerInformation;

typedef struct packet_login_success3
{
    BYTE                        header;
    TSimplePlayerInformation    akSimplePlayerInformation[PLAYER_PER_ACCOUNT3];
    DWORD                        guild_id[PLAYER_PER_ACCOUNT3];
    char                        guild_name[PLAYER_PER_ACCOUNT3][GUILD_NAME_MAX_LEN+1];
    DWORD handle;
    DWORD random_key;
} TPacketGCLoginSuccess3;

typedef struct packet_login_success4
{
    BYTE                        header;
    TSimplePlayerInformation    akSimplePlayerInformation[PLAYER_PER_ACCOUNT4];
    DWORD                        guild_id[PLAYER_PER_ACCOUNT4];
    char                        guild_name[PLAYER_PER_ACCOUNT4][GUILD_NAME_MAX_LEN+1];
    DWORD handle;
    DWORD random_key;
} TPacketGCLoginSuccess4;
#ifdef ENABLE_PLAYER_PER_ACCOUNT5
typedef struct packet_login_success5
{
    BYTE                        header;
    TSimplePlayerInformation    akSimplePlayerInformation[PLAYER_PER_ACCOUNT5];
    DWORD                        guild_id[PLAYER_PER_ACCOUNT5];
    char                        guild_name[PLAYER_PER_ACCOUNT5][GUILD_NAME_MAX_LEN+1];
    DWORD handle;
    DWORD random_key;
} TPacketGCLoginSuccess5;
#endif

enum { LOGIN_STATUS_MAX_LEN = 8 };
typedef struct packet_login_failure
{
    BYTE    header;
    char    szStatus[LOGIN_STATUS_MAX_LEN + 1];
} TPacketGCLoginFailure;

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;
} TPacketCGCreateCharacter;

#ifdef ENABLE_SUPPORT_SYSTEM
typedef struct support_use_skill
{
    BYTE    bHeader;
    DWORD    dwVnum;
    DWORD    dwVid;
    DWORD    dwLevel;
}TPacketGCSupportUseSkill;
#endif

typedef struct command_player_create_success
{
    BYTE                        header;
    BYTE                        bAccountCharacterSlot;
    TSimplePlayerInformation    kSimplePlayerInfomation;
} TPacketGCPlayerCreateSuccess;

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

typedef struct command_player_delete
{
    BYTE        header;
    BYTE        index;
    char        szPrivateCode[PRIVATE_CODE_LENGTH];
} TPacketCGDestroyCharacter;

typedef struct packet_player_delete_success
{
    BYTE        header;
    BYTE        account_index;
} TPacketGCDestroyCharacterSuccess;

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 EPKModes
{
    PK_MODE_PEACE,
    PK_MODE_REVENGE,
    PK_MODE_FREE,
    PK_MODE_PROTECT,
    PK_MODE_GUILD,
#ifdef ENABLE_BATTLE_FIELD
    PK_MODE_BATTLE,
#endif
    PK_MODE_MAX_NUM,
};

// 2004.11.20.myevan.CRaceData::PART_MAX_NUM 사용안하게 수정 - 서버에서 사용하는것과 일치하지 않음
enum ECharacterEquipmentPart
{
    CHR_EQUIPPART_ARMOR,
    CHR_EQUIPPART_WEAPON,
    CHR_EQUIPPART_HEAD,
    CHR_EQUIPPART_HAIR,
    #ifdef ENABLE_SASH_SYSTEM
    CHR_EQUIPPART_SASH,
    #endif


    CHR_EQUIPPART_NUM,
};

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; //선악치
#ifdef TITLE_SYSTEM_ENABLE
    short    sPrestige;
#endif
    BYTE    bPKMode;
#ifdef ENABLE_TITLE_SYSTEM
    int        iTitleID;
#endif
    DWORD   dwMountVnum;
#ifdef ENABLE_BATTLE_FIELD
    BYTE    bBattleRank;
#endif

} TPacketGCCharacterAdditionalInfo;

typedef struct packet_add_char
{
    BYTE        header;

    DWORD       dwVID;
#if defined(WJ_SHOW_MOB_INFO)
    DWORD    dwLevel;
    DWORD    dwAIFlag;
#endif
    //char        name[CHARACTER_NAME_MAX_LEN + 1];

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

    BYTE        bType;
    WORD        wRaceNum;
    //WORD        awPart[CHR_EQUIPPART_NUM];
    BYTE        bMovingSpeed;
    BYTE        bAttackSpeed;

    BYTE        bStateFlag;
    DWORD       dwAffectFlag[2];        // ??
    //BYTE      bEmpire;
    //DWORD     dwGuild;
    //short     sAlignment;
    //BYTE        bPKMode;
    //DWORD        dwMountVnum;
} TPacketGCCharacterAdd;

typedef struct packet_add_char2
{
    BYTE        header;

    DWORD       dwVID;

    char        name[CHARACTER_NAME_MAX_LEN + 1];

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

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

    BYTE        bStateFlag;
    DWORD       dwAffectFlag[2];        // ??
    BYTE        bEmpire;

    DWORD       dwGuild;
    short       sAlignment;
#ifdef TITLE_SYSTEM_ENABLE
    short    sPrestige;
#endif
    BYTE        bPKMode;
#ifdef ENABLE_TITLE_SYSTEM
    int            iTitleID;
#endif
    DWORD        dwMountVnum;
#ifdef ENABLE_SHOW_LIDER_AND_GENERAL_GUILD
    BYTE        dwNewIsGuildName;
#endif
} TPacketGCCharacterAdd2;

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;
#ifdef TITLE_SYSTEM_ENABLE
    short    sPrestige;
#endif
#ifdef NEW_PET_SYSTEM
    DWORD        dwLevel;
#endif
    BYTE        bPKMode;
#ifdef ENABLE_TITLE_SYSTEM
    int            iTitleID;
#endif
    DWORD        dwMountVnum;
#ifdef ENABLE_BATTLE_FIELD
    BYTE    bBattleRank;
#endif
} TPacketGCCharacterUpdate;

typedef struct packet_update_char2
{
    BYTE        header;
    DWORD       dwVID;

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

    BYTE        bStateFlag;
    DWORD       dwAffectFlag[2];

    DWORD        dwGuildID;
    short       sAlignment;
#ifdef TITLE_SYSTEM_ENABLE
    short    sPrestige;
#endif
    BYTE        bPKMode;
#ifdef ENABLE_TITLE_SYSTEM
    int            iTitleID;
#endif
    DWORD        dwMountVnum;
#ifdef ENABLE_SHOW_LIDER_AND_GENERAL_GUILD
    BYTE        dwNewIsGuildName;
#endif
} TPacketGCCharacterUpdate2;

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

#ifdef ENABLE_TICKET_SYSTEM
typedef struct SPacketCGTicketOpen
{
    BYTE    header;
    int        action;
    int        mode;
    char    ticked_id[10 + 1];
} TPacketCGTicketOpen;

typedef struct SPacketCGTicketCreate
{
    BYTE    header;
    char    title[32 + 1];
    char    content[512 + 1];
    int        priority;
} TPacketCGTicketCreate;

typedef struct SPacketCGTicketReply
{
    BYTE    header;
    char    ticked_id[10 + 1];
    char    reply[512 + 1];
} TPacketCGTicketReply;

typedef struct SPacketTicketLogs
{
    char    ticked_id[10 + 1];
    char    title[32 + 1];
    char    content[512 + 1];
    int        priority;
    char    create_date[19 + 1];
    int        status;
} TPacketTicketLogs;

typedef struct SPacketTicketLogsData
{
    BYTE header;
    TPacketTicketLogs logs[200];
} TPacketTicketLogsData;

typedef struct SPacketTicketLogsReply
{
    char    reply_from[12 + 1];
    char    reply_content[512 + 1];
    char    reply_date[19 + 1];
} TPacketTicketLogsReply;

typedef struct SPacketTicketLogsDataReply
{
    BYTE header;
    TPacketTicketLogsReply logs[40];
} TPacketTicketLogsDataReply;

typedef struct SPacketCGTicketAdmin
{
    BYTE    header;
    int        action;
    char    ticked_id[10 + 1];
    char    char_name[12 + 1];
    char    reason[32 + 1];
} TPacketCGTicketAdmin;

typedef struct SPacketCGTicketAdminChangePage
{
    BYTE    header;
    int        iStartPage;
} TPacketCGTicketAdminChangePage;
#endif

typedef struct packet_GlobalTime
{
    BYTE    header;
    float    GlobalTime;
} TPacketGCGlobalTime;

enum EChatType
{
    CHAT_TYPE_TALKING,  /* 그냥 채팅 */
    CHAT_TYPE_INFO,     /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */
    CHAT_TYPE_NOTICE,   /* 공지사항 */
    CHAT_TYPE_PARTY,    /* 파티말 */
    CHAT_TYPE_GUILD,    /* 길드말 */
    CHAT_TYPE_COMMAND,    /* 명령 */
    CHAT_TYPE_SHOUT,    /* 외치기 */
    CHAT_TYPE_WHISPER,    // 서버와는 연동되지 않는 Only Client Enum
    CHAT_TYPE_BIG_NOTICE,
    CHAT_TYPE_MONARCH_NOTICE,
    // CHAT_TYPE_UNK_10,
#ifdef ENABLE_DICE_SYSTEM
    CHAT_TYPE_DICE_INFO, //11
#endif
    CHAT_TYPE_MAX_NUM,
};

typedef struct packet_chatting
{
    BYTE    header;
    WORD    size;
    BYTE    type;
    DWORD    dwVID;
    BYTE    bEmpire;
} TPacketGCChat;

typedef struct packet_whisper   // 가변 패킷
{
    BYTE        bHeader;
    WORD        wSize;
    BYTE        bType;
    char        szNameFrom[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGCWhisper;

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

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

typedef struct packet_main_character
{
    BYTE        header;
    DWORD       dwVID;
    WORD        wRaceNum;
    char        szName[CHARACTER_NAME_MAX_LEN + 1];
    long        lX, lY, lZ;
    BYTE        bySkillGroup;
} TPacketGCMainCharacter;

// SUPPORT_BGM
typedef struct packet_main_character2_empire
{
    BYTE        header;
    DWORD       dwVID;
    WORD        wRaceNum;
    char        szName[CHARACTER_NAME_MAX_LEN + 1];
    long        lX, lY, lZ;
    BYTE        byEmpire;
    BYTE        bySkillGroup;
} TPacketGCMainCharacter2_EMPIRE;

typedef struct packet_main_character3_bgm
{
    enum
    {
        MUSIC_NAME_MAX_LEN = 24,
    };
    BYTE        header;
    DWORD       dwVID;
    WORD        wRaceNum;
    char        szUserName[CHARACTER_NAME_MAX_LEN + 1];
    char        szBGMName[MUSIC_NAME_MAX_LEN + 1];
    long        lX, lY, lZ;
    BYTE        byEmpire;
    BYTE        bySkillGroup;
} TPacketGCMainCharacter3_BGM;

typedef struct packet_main_character4_bgm_vol
{
    enum
    {
        MUSIC_NAME_MAX_LEN = 24,
    };
    BYTE        header;
    DWORD       dwVID;
    WORD        wRaceNum;
    char        szUserName[CHARACTER_NAME_MAX_LEN + 1];
    char        szBGMName[MUSIC_NAME_MAX_LEN + 1];
    float        fBGMVol;
    long        lX, lY, lZ;
    BYTE        byEmpire;
    BYTE        bySkillGroup;
} TPacketGCMainCharacter4_BGM_VOL;
// END_OF_SUPPORT_BGM

enum EPointTypes
{
    POINT_NONE,
    POINT_LEVEL,
    POINT_VOICE,
    POINT_EXP,
    POINT_NEXT_EXP,
    POINT_HP,
    POINT_MAX_HP,
    POINT_SP,
    POINT_MAX_SP,
    POINT_STAMINA,
    POINT_MAX_STAMINA,
    POINT_GOLD,
    POINT_ST,
    POINT_HT,
    POINT_DX,
    POINT_IQ,
    POINT_ATT_POWER,
    POINT_ATT_SPEED,
    POINT_EVADE_RATE,
    POINT_MOV_SPEED,
    POINT_DEF_GRADE,
    POINT_CASTING_SPEED,
    POINT_MAGIC_ATT_GRADE,
    POINT_MAGIC_DEF_GRADE,
    POINT_EMPIRE_POINT,
    POINT_LEVEL_STEP,
    POINT_STAT,
    POINT_SUB_SKILL,
    POINT_SKILL,
    POINT_MIN_ATK,
    POINT_MAX_ATK,
    POINT_PLAYTIME,
    POINT_HP_REGEN,
    POINT_SP_REGEN,
    POINT_BOW_DISTANCE,
    POINT_HP_RECOVERY,
    POINT_SP_RECOVERY,
    POINT_POISON_PCT,
    POINT_STUN_PCT,
    POINT_SLOW_PCT,
    POINT_CRITICAL_PCT,
    POINT_PENETRATE_PCT,
    POINT_CURSE_PCT,
    POINT_ATTBONUS_HUMAN,
    POINT_ATTBONUS_ANIMAL,
    POINT_ATTBONUS_ORC,
    POINT_ATTBONUS_MILGYO,
    POINT_ATTBONUS_UNDEAD,
    POINT_ATTBONUS_DEVIL,
    POINT_ATTBONUS_INSECT,
    POINT_ATTBONUS_FIRE,
    POINT_ATTBONUS_ICE,
    POINT_ATTBONUS_DESERT,
    POINT_ATTBONUS_MONSTER,
    POINT_ATTBONUS_WARRIOR,
    POINT_ATTBONUS_ASSASSIN,
    POINT_ATTBONUS_SURA,
    POINT_ATTBONUS_SHAMAN,
    POINT_ATTBONUS_UNUSED5,
    POINT_RESIST_WARRIOR,
    POINT_RESIST_ASSASSIN,
    POINT_RESIST_SURA,
    POINT_RESIST_SHAMAN,
    POINT_STEAL_HP,
    POINT_STEAL_SP,
    POINT_MANA_BURN_PCT,
    POINT_DAMAGE_SP_RECOVER,
    POINT_BLOCK,
    POINT_DODGE,
    POINT_RESIST_SWORD,
    POINT_RESIST_TWOHAND,
    POINT_RESIST_DAGGER,
    POINT_RESIST_BELL,
    POINT_RESIST_FAN,
    POINT_RESIST_BOW,
    POINT_RESIST_FIRE,
    POINT_RESIST_ELEC,
    POINT_RESIST_MAGIC,
    POINT_RESIST_WIND,
    POINT_REFLECT_MELEE,
    POINT_REFLECT_CURSE,
    POINT_POISON_REDUCE,
    POINT_KILL_SP_RECOVER,
    POINT_EXP_DOUBLE_BONUS,
    POINT_GOLD_DOUBLE_BONUS,
    POINT_ITEM_DROP_BONUS,
    POINT_POTION_BONUS,
    POINT_KILL_HP_RECOVER,
    POINT_IMMUNE_STUN,
    POINT_IMMUNE_SLOW,
    POINT_IMMUNE_FALL,
    POINT_PARTY_ATT_GRADE,
    POINT_PARTY_DEF_GRADE,
    POINT_ATT_BONUS,
    POINT_DEF_BONUS,
    POINT_ATT_GRADE_BONUS,
    POINT_DEF_GRADE_BONUS,
    POINT_MAGIC_ATT_GRADE_BONUS,
    POINT_MAGIC_DEF_GRADE_BONUS,
    POINT_RESIST_NORMAL_DAMAGE,
    POINT_STAT_RESET_COUNT = 112,
    POINT_HORSE_SKILL = 113,
    POINT_MALL_ATTBONUS,
    POINT_MALL_DEFBONUS,
    POINT_MALL_EXPBONUS,
    POINT_MALL_ITEMBONUS,
    POINT_MALL_GOLDBONUS,
    POINT_MAX_HP_PCT,
    POINT_MAX_SP_PCT,
    POINT_SKILL_DAMAGE_BONUS,
    POINT_NORMAL_HIT_DAMAGE_BONUS,
    POINT_SKILL_DEFEND_BONUS,
    POINT_NORMAL_HIT_DEFEND_BONUS,
    POINT_PC_BANG_EXP_BONUS,
    POINT_PC_BANG_DROP_BONUS,
    POINT_ENERGY = 128,
    POINT_ENERGY_END_TIME = 129,
    POINT_COSTUME_ATTR_BONUS = 130,
    POINT_MAGIC_ATT_BONUS_PER = 131,
    POINT_MELEE_MAGIC_ATT_BONUS_PER = 132,
    POINT_RESIST_ICE = 133,
    POINT_RESIST_EARTH = 134,
    POINT_RESIST_DARK = 135,
    POINT_RESIST_CRITICAL = 136,
    POINT_RESIST_PENETRATE = 137,

#ifdef NEW_ADD_INVENTORY
    POINT_BLACK = 145,
#endif

#ifdef ENABLE_GEM_SYSTEM
    POINT_GEM                 = 147,
#endif

#ifdef ENABLE_BATTLE_FIELD
    POINT_BATTLE_POINT                 = 148,
    POINT_TEMP_BATTLE_POINT         = 149,
#endif

#ifdef ENABLE_TITLE_SYSTEM
    POINT_TITLE = 150,
    POINT_TITLE_1 = 151,
    POINT_TITLE_2 = 152,
    POINT_TITLE_3 = 153,
    POINT_TITLE_4 = 154,
    POINT_TITLE_5 = 155,
    POINT_TITLE_6 = 156,
    POINT_TITLE_7 = 157,
    POINT_TITLE_8 = 158,
    POINT_TITLE_9 = 159,
    POINT_TITLE_10 = 160,
    POINT_TITLE_11 = 161,
    POINT_TITLE_12 = 162,
    POINT_TITLE_13 = 163,
    POINT_TITLE_14 = 164,
    POINT_TITLE_15 = 165,
    POINT_TITLE_16 = 166,
    POINT_TITLE_17 = 167,
    POINT_TITLE_18 = 168,
    POINT_TITLE_19 = 169,
    POINT_TITLE_20 = 170,
#endif

    POINT_MIN_WEP = 200,
    POINT_MAX_WEP,
    POINT_MIN_MAGIC_WEP,
    POINT_MAX_MAGIC_WEP,
    POINT_HIT_RATE,

};

typedef struct packet_points
{
    BYTE        header;
#ifdef ENABLE_YANG_LIMIT
    long long    points[POINT_MAX_NUM];
#else
    long        points[POINT_MAX_NUM];
#endif
} TPacketGCPoints;

typedef struct packet_point_change
{
    int            header;

    DWORD        dwVID;
    BYTE        Type;

#ifdef ENABLE_YANG_LIMIT
    long long    amount;
    long long    value;
#else
    long        amount; // 바뀐 값
    long        value; // 현재 값
#endif
} TPacketGCPointChange;

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

#if defined(GAIDEN)
struct TPacketGCItemDelDeprecate
{
    TPacketGCItemDelDeprecate() :
        header(HEADER_GC_ITEM_DEL),
        pos(0),
        vnum(0),
        count(0)
    {
        memset(&alSockets, 0, sizeof(alSockets));
        memset(&aAttr, 0, sizeof(aAttr));
    }

    BYTE    header;
    BYTE    pos;
    DWORD   vnum;
    BYTE    count;
    long    alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
};

typedef struct packet_set_item
{
    BYTE        header;
    BYTE        pos;
    DWORD        vnum;
    BYTE        count;
    DWORD        flags;    // 플래그 추가
    long        alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCItemSet;

typedef struct packet_item_del
{
    BYTE        header;
    BYTE        pos;
} TPacketGCItemDel;
#else
typedef struct packet_set_item
{
    BYTE        header;
    TItemPos    Cell;
    DWORD        vnum;
    BYTE        count;
#ifdef ENABLE_CHANGELOOK_SYSTEM
    DWORD    transmutation;
#endif
    long        alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCItemSet;

typedef struct packet_set_item2
{
    BYTE        header;
    TItemPos    Cell;
    DWORD        vnum;
    BYTE        count;

#ifdef ENABLE_CHANGELOOK_SYSTEM
    DWORD    transmutation;
#endif
    DWORD        flags;    // 플래그 추가
    DWORD        anti_flags;    // 플래그 추가
    bool        highlight;
    long        alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCItemSet2;
#endif

#ifdef ENABLE_WHISPER_ADMIN_SYSTEM
typedef struct SPacketCGWhisperAdmin
{
    BYTE    header;
    char    szText[512 + 1];
    char    szLang[2 + 1];
    int        color;
} TPacketCGWhisperAdmin;
#endif

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

typedef struct packet_use_item
{
    BYTE        header;
    TItemPos    Cell;
    DWORD        ch_vid;
    DWORD        victim_vid;

    DWORD        vnum;
} TPacketGCItemUse;

typedef struct packet_update_item
{
    BYTE        header;
    TItemPos    Cell;
    BYTE        count;
#ifdef ENABLE_CHANGELOOK_SYSTEM
    DWORD    transmutation;
#endif
    long        alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCItemUpdate;

typedef struct packet_ground_add_item
{
#ifdef ENABLE_EXTENDED_ITEMNAME_ON_GROUND
    packet_ground_add_item()
    {
        memset(&alSockets, 0, sizeof(alSockets));
        memset(&aAttrs, 0, sizeof(aAttrs));
    }
#endif

    BYTE    bHeader;
    long    lX;
    long    lY;
    long    lZ;
    DWORD    dwVID;
    DWORD    dwVnum;
#ifdef ENABLE_EXTENDED_ITEMNAME_ON_GROUND
    long    alSockets[ITEM_SOCKET_SLOT_MAX_NUM];//3 
    TPlayerItemAttribute aAttrs[ITEM_ATTRIBUTE_SLOT_MAX_NUM];//7
#endif
} TPacketGCItemGroundAdd;

typedef struct packet_ground_del_item
{
    BYTE        header;
    DWORD        vid;
} TPacketGCItemGroundDel;

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

typedef struct packet_quickslot_add
{
    BYTE        header;
    BYTE        pos;
    TQuickSlot    slot;
} TPacketGCQuickSlotAdd;

typedef struct packet_quickslot_del
{
    BYTE        header;
    BYTE        pos;
} TPacketGCQuickSlotDel;

typedef struct packet_quickslot_swap
{
    BYTE        header;
    BYTE        pos;
    BYTE        change_pos;
} TPacketGCQuickSlotSwap;

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

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;
#ifdef ENABLE_BATTLE_FIELD
    int    usablePoints;
    int    limitMaxPoints;
#endif
} TPacketGCShopStartEx;


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

typedef struct packet_shop_update_price
{
#ifdef ENABLE_YANG_LIMIT
    long long iElkAmount;    
#else
    int iElkAmount;
#endif
} TPacketGCShopUpdatePrice;

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,
#ifdef __MULTI_SHOP__
    SHOP_SUBHEADER_GC_NOT_ENOUGH_ITEM,
#endif
    YOK_2,
    YOK_3,
    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,
#ifdef ENABLE_BATTLE_FIELD
    SHOP_SUBHEADER_GC_NOT_ENOUGH_BATTLE_POINTS,
    SHOP_SUBHEADER_GC_EXCEED_LIMIT_TODAY,
#endif
};

typedef struct packet_shop
{
    BYTE        header;
    WORD        size;
    BYTE        subheader;
} TPacketGCShop;

typedef struct packet_exchange
{
    BYTE        header;
    BYTE        subheader;
    BYTE        is_me;
#ifdef ENABLE_YANG_LIMIT
    long long    arg1;
#else
    DWORD        arg1;
#endif
    TItemPos        arg2;
    DWORD            arg3;
#ifdef WJ_ENABLE_TRADABLE_ICON
    TItemPos        arg4;
#endif
#ifdef ENABLE_CHANGELOOK_SYSTEM
    DWORD    dwTransmutation;
#endif
    long        alValues[ITEM_SOCKET_SLOT_MAX_NUM];
    TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCExchange;

enum
{
    EXCHANGE_SUBHEADER_GC_START,            // arg1 == vid
    EXCHANGE_SUBHEADER_GC_ITEM_ADD,        // arg1 == vnum  arg2 == pos  arg3 == count
    EXCHANGE_SUBHEADER_GC_ITEM_DEL,        // arg1 == pos
    EXCHANGE_SUBHEADER_GC_ELK_ADD,            // arg1 == elk
    EXCHANGE_SUBHEADER_GC_ACCEPT,            // arg1 == accept
    EXCHANGE_SUBHEADER_GC_END,                // arg1 == not used
    EXCHANGE_SUBHEADER_GC_ALREADY,            // arg1 == not used
    EXCHANGE_SUBHEADER_GC_LESS_ELK,        // arg1 == not used
};

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

typedef struct packet_ping
{
    BYTE        header;
} TPacketGCPing;

typedef struct packet_pong
{
    BYTE        bHeader;
} TPacketCGPong;

typedef struct packet_script
{
    BYTE        header;
    WORD        size;
    BYTE        skin;
    WORD        src_size;
} TPacketGCScript;

typedef struct packet_target
{
    BYTE        header;
    DWORD       dwVID;
    BYTE        bHPPercent;
#ifdef ENABLE_VIEW_TARGET_DECIMAL_HP
    int        iMinHP;
    int        iMaxHP;
#endif
} TPacketGCTarget;

#ifdef ENABLE_SEND_TARGET_INFO
typedef struct packet_target_info
{
    BYTE    header;
    DWORD    dwVID;
    DWORD    race;
    DWORD    dwVnum;
    BYTE    count;
} TPacketGCTargetInfo;

typedef struct packet_target_info_load
{
    BYTE header;
    DWORD dwVID;
} TPacketCGTargetInfoLoad;
#endif

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

typedef struct packet_mount
{
    BYTE        header;
    DWORD       vid;
    DWORD       mount_vid;
    BYTE        pos;
    DWORD        _x, _y;
} TPacketGCMount;

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

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

enum
{
    QUEST_SEND_IS_BEGIN         = 1 << 0,
    QUEST_SEND_TITLE            = 1 << 1,  // 28자 까지
    QUEST_SEND_CLOCK_NAME       = 1 << 2,  // 16자 까지
    QUEST_SEND_CLOCK_VALUE      = 1 << 3,
    QUEST_SEND_COUNTER_NAME     = 1 << 4,  // 16자 까지
    QUEST_SEND_COUNTER_VALUE    = 1 << 5,
    QUEST_SEND_ICON_FILE        = 1 << 6,  // 24자 까지
};

typedef struct packet_quest_info
{
    BYTE header;
    WORD size;
    WORD index;
    BYTE flag;
} TPacketGCQuestInfo;

typedef struct packet_quest_confirm
{
    BYTE header;
    char msg[64+1];
    long timeout;
    DWORD requestPID;
} TPacketGCQuestConfirm;

typedef struct packet_attack
{
    BYTE        header;
    DWORD       dwVID;
    DWORD       dwVictimVID;    // 적 VID
    BYTE        bType;          // 공격 유형
} TPacketGCAttack;

typedef struct packet_c2c
{
    BYTE        header;
    WORD        wSize;
} TPacketGCC2C;

typedef struct packetd_sync_position_element
{
    DWORD       dwVID;
    long        lX;
    long        lY;
} TPacketGCSyncPositionElement;

typedef struct packetd_sync_position
{
    BYTE        bHeader;
    WORD        wSize;
} TPacketGCSyncPosition;

typedef struct packet_ownership
{
    BYTE                bHeader;
    DWORD               dwOwnerVID;
    DWORD               dwVictimVID;
} TPacketGCOwnership;

#define    SKILL_MAX_NUM 255

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

typedef struct SPlayerSkill
{
    BYTE bMasterType;
    BYTE bLevel;
    time_t tNextRead;
} TPlayerSkill;

typedef struct packet_skill_level_new
{
    BYTE bHeader;
    TPlayerSkill skills[SKILL_MAX_NUM];
} TPacketGCSkillLevelNew;

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

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

typedef struct packet_duel_start
{
    BYTE    header ;
    WORD    wSize ;    // DWORD가 몇개? 개수 = (wSize - sizeof(TPacketGCPVPList)) / 4
} TPacketGCDuelStart ;

typedef struct packet_pvp
{
    BYTE        header;
    DWORD        dwVIDSrc;
    DWORD        dwVIDDst;
    BYTE        bMode;
} TPacketGCPVP;

typedef struct packet_skill_cooltime_end
{
    BYTE        header;
    BYTE        bSkill;
} TPacketGCSkillCoolTimeEnd;

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

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

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

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

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

typedef TPacketCGSafeboxCheckout TPacketGCSafeboxCheckout;
typedef TPacketCGSafeboxCheckin TPacketGCSafeboxCheckin;

typedef struct packet_safebox_wrong_password
{
    BYTE        bHeader;
} TPacketGCSafeboxWrongPassword;

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

typedef struct packet_safebox_money_change
{
    BYTE bHeader;
    DWORD dwMoney;
} TPacketGCSafeboxMoneyChange;

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

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

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 packet_fishing
{
    BYTE header;
    BYTE subheader;
    DWORD info;
    BYTE dir;
} TPacketGCFishing;

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

//////////////////////////////////////////////////////////////////////////
// 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_POINT,
    GUILD_SUBHEADER_GC_MONEY_CHANGE,
};

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

// SubHeader - Grade
enum
{
    GUILD_AUTH_ADD_MEMBER       = (1 << 0),
    GUILD_AUTH_REMOVE_MEMBER    = (1 << 1),
    GUILD_AUTH_NOTICE           = (1 << 2),
    GUILD_AUTH_SKILL            = (1 << 3),
};

typedef struct packet_guild_sub_grade
{
    char grade_name[GUILD_GRADE_NAME_MAX_LEN+1]; // 8+1 길드장, 길드원 등의 이름
    BYTE auth_flag;
} TPacketGCGuildSubGrade;

typedef struct packet_guild_sub_member
{
    DWORD pid;
    BYTE byGrade;
    BYTE byIsGeneral;
    BYTE byJob;
    BYTE byLevel;
    DWORD dwOffer;
    BYTE byNameFlag;
// if NameFlag is TRUE, name is sent from server.
//    char szName[CHARACTER_ME_MAX_LEN+1];
} TPacketGCGuildSubMember;

typedef struct packet_guild_sub_info
{
    WORD member_count;
    WORD max_member_count;
    DWORD guild_id;
    DWORD master_pid;
    DWORD exp;
    BYTE level;
    char name[GUILD_NAME_MAX_LEN+1];
    DWORD gold;
    BYTE hasLand;
} TPacketGCGuildInfo;

enum EGuildWarState
{
    GUILD_WAR_NONE,
    GUILD_WAR_SEND_DECLARE,
    GUILD_WAR_REFUSE,
    GUILD_WAR_RECV_DECLARE,
    GUILD_WAR_WAIT_START,
    GUILD_WAR_CANCEL,
    GUILD_WAR_ON_WAR,
    GUILD_WAR_END,

    GUILD_WAR_DURATION = 2*60*60, // 2시간
};

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

typedef struct SPacketGuildWarPoint
{
    DWORD dwGainGuildID;
    DWORD dwOpponentGuildID;
    long lPoint;
} TPacketGuildWarPoint;

// 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;

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

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;

struct TMaterial
{
    DWORD vnum;
    DWORD count;
};

typedef struct SRefineTable
{
    DWORD src_vnum;
    DWORD result_vnum;
    BYTE material_count;
    int cost; // 소요 비용
    int prob; // 확률
    TMaterial materials[REFINE_MATERIAL_MAX_NUM];
} TRefineTable;

typedef struct SPacketGCRefineInformation
{
    BYTE            header;
    BYTE            pos;
    TRefineTable    refine_table;
} TPacketGCRefineInformation;

typedef struct SPacketGCRefineInformationNew
{
    BYTE            header;
    BYTE            type;
    BYTE            pos;
    TRefineTable    refine_table;
} TPacketGCRefineInformationNew;

enum SPECIAL_EFFECT
{
    SE_NONE,
    SE_HPUP_RED,
    SE_SPUP_BLUE,
    SE_SPEEDUP_GREEN,
    SE_DXUP_PURPLE,
    SE_CRITICAL,
    SE_PENETRATE,
    SE_BLOCK,
    SE_DODGE,
    SE_CHINA_FIREWORK,
    SE_SPIN_TOP,
    SE_SUCCESS,
    SE_FAIL,
    SE_FR_SUCCESS,
    SE_LEVELUP_ON_14_FOR_GERMANY,    //레벨업 14일때 ( 독일전용 )
    SE_LEVELUP_UNDER_15_FOR_GERMANY,//레벨업 15일때 ( 독일전용 )
    SE_PERCENT_DAMAGE1,
    SE_PERCENT_DAMAGE2,
    SE_PERCENT_DAMAGE3,
    SE_AUTO_HPUP,
    SE_AUTO_SPUP,
    SE_EQUIP_RAMADAN_RING,            // 초승달의 반지를 착용하는 순간에 발동하는 이펙트
    SE_EQUIP_HALLOWEEN_CANDY,        // 할로윈 사탕을 착용(-_-;)한 순간에 발동하는 이펙트
    SE_EQUIP_HAPPINESS_RING,        // 크리스마스 행복의 반지를 착용하는 순간에 발동하는 이펙트
    SE_EQUIP_LOVE_PENDANT,        // 발렌타인 사랑의 팬던트(71145) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
#ifdef ENABLE_BATTLE_FIELD
    SE_EFFECT_BATTLE_POTION,
#endif
#ifdef VERSION_162_ENABLED
    SE_EFFECT_HEALER,
#endif
#ifdef ENABLE_AGGREGATE_MONSTER_EFFECT
    SE_AGGREGATE_MONSTER_EFFECT,
#endif
    #ifdef ENABLE_SASH_SYSTEM
    SE_EFFECT_SASH_SUCCEDED,
    SE_EFFECT_SASH_EQUIP,
    #endif
};

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

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

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

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

enum EBlockAction
{
    BLOCK_EXCHANGE              = (1 << 0),
    BLOCK_PARTY_INVITE          = (1 << 1),
    BLOCK_GUILD_INVITE          = (1 << 2),
    BLOCK_WHISPER               = (1 << 3),
    BLOCK_MESSENGER_INVITE      = (1 << 4),
    BLOCK_PARTY_REQUEST         = (1 << 5),
};

typedef struct packet_china_matrixd_card
{
    BYTE    bHeader;
    DWORD    dwRows;
    DWORD    dwCols;
} TPacketGCChinaMatrixCard;

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

typedef struct packet_newcibn_passpod_request
{
    BYTE    bHeader;
} TPacketGCNEWCIBNPasspodRequest;

typedef struct packet_newcibn_passpod_failure
{
    BYTE    bHeader;
    char    szMessage[NEWCIBN_PASSPOD_FAILURE_MAX_LEN + 1];
} TPacketGCNEWCIBNPasspodFailure;

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

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[ID_MAX_NUM + 1];
} TPacketGCAuthSuccessOpenID;

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

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

typedef struct pakcet_view_equip
{
    BYTE    header;
    DWORD    dwVID;
        TEquipmentItemSet equips[16];    
} TPacketGCViewEquip;

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        szTargetName[32+1];
} TPacketGCTargetCreate;

enum
{
    CREATE_TARGET_TYPE_NONE,
    CREATE_TARGET_TYPE_LOCATION,
    CREATE_TARGET_TYPE_CHARACTER,
#if defined(ENABLE_SHOP_SEARCH)
    CREATE_TARGET_TYPE_SHOP,
#endif
};

typedef struct
{
    BYTE        bHeader;
    long        lID;
    char        szTargetName[32+1];
    DWORD        dwVID;
    BYTE        byType;
} TPacketGCTargetCreateNew;

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

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

typedef struct
{
    DWORD       dwType;
    BYTE        bPointIdxApplyOn;
    long        lApplyValue;
    DWORD       dwFlag;
    long        lDuration;
    long        lSPCost;
} TPacketAffectElement;

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

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

typedef struct packet_mall_open
{
    BYTE bHeader;
    BYTE bSize;
} TPacketGCMallOpen;

typedef struct packet_lover_info
{
    BYTE bHeader;
    char szName[CHARACTER_NAME_MAX_LEN + 1];
    BYTE byLovePoint;
} TPacketGCLoverInfo;

typedef struct packet_love_point_update
{
    BYTE bHeader;
    BYTE byLovePoint;
} TPacketGCLovePointUpdate;

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

typedef struct SPacketGCOnTime
{
    BYTE header;
    int ontime;     // sec
} TPacketGCOnTime;

typedef struct SPacketGCResetOnTime
{
    BYTE header;
} TPacketGCResetOnTime;

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

typedef struct packet_state
{
    BYTE            bHeader;
    BYTE            bFunc;
    BYTE            bArg;
    BYTE            bRot;
    DWORD            dwVID;
    DWORD            dwTime;
    TPixelPosition    kPPos;
} TPacketCCState;

typedef struct packet_hs_check_req
{
    BYTE    bHeader;
    AHNHS_TRANS_BUFFER    Req;
} TPacketHSCheck;

//NOTE : recv/send에 공통으로 생김, bPacketData의 내용만 바뀐다.
typedef struct packet_xtrap_verify
{
    BYTE    bHeader;
    BYTE    bPacketData[128];

} TPacketXTrapCSVerify;
// AUTOBAN
typedef struct packet_autoban_quiz
{
    BYTE bHeader;
    BYTE bDuration;
    BYTE bCaptcha[64*32];
    char szQuiz[256];
} TPacketGCAutoBanQuiz;
// END_OF_AUTOBAN

#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_

#ifdef __AUCTION__
// Argument의 용도는 cmd에 따라 다르다.
typedef struct SPacketCGAuctionCmd
{
    BYTE bHeader;
    BYTE cmd;
    int arg1;
    int arg2;
    int arg3;
    int arg4;
} TPacketCGAuctionCmd;

typedef struct SPacketGCAuctionItemListPack
{
    BYTE bHeader;
    BYTE bNumbers;
} TPacketGCAuctionItemListPack;

#endif

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

// 용혼석
enum EDragonSoulRefineWindowRefineType
{
    DragonSoulRefineWindow_UPGRADE,
    DragonSoulRefineWindow_IMPROVEMENT,
    DragonSoulRefineWindow_REFINE,
};

enum EPacketCGDragonSoulSubHeaderType
{
    DS_SUB_HEADER_OPEN,
    DS_SUB_HEADER_CLOSE,
    DS_SUB_HEADER_DO_UPGRADE,
    DS_SUB_HEADER_DO_IMPROVEMENT,
    DS_SUB_HEADER_DO_REFINE,
    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[DS_REFINE_WINDOW_MAX_NUM];
} TPacketCGDragonSoulRefine;

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

#ifdef ENABLE_TITLE_SYSTEM
typedef struct SPacketGGTitleInfo
{
    BYTE    bHeader;
    int        iTitle;
    BYTE    bAnswer;
} TPacketGGTitleInfo;
#endif

typedef struct SChannelStatus
{
    short nPort;
    BYTE bStatus;
} TChannelStatus;

#ifdef ENABLE_CHANGELOOK_SYSTEM
enum EChangeLookInfo
{
    CL_WINDOW_MAX_MATERIALS = 2,
    CL_CLEAN_ATTR_VALUE0 = 8,
};

enum
{
    HEADER_CG_CL = 213,
    HEADER_GC_CL = 218,
    CL_SUBHEADER_OPEN = 0,
    CL_SUBHEADER_CLOSE,
    CL_SUBHEADER_ADD,
    CL_SUBHEADER_REMOVE,
    CL_SUBHEADER_REFINE,
};

typedef struct SPacketChangeLook
{
    BYTE    header;
    BYTE    subheader;
    DWORD    dwCost;
    BYTE    bPos;
    TItemPos    tPos;
} TPacketChangeLook;

typedef struct SChangeLookMaterial
{
    BYTE    bHere;
    WORD    wCell;
} TChangeLookMaterial;
#endif

#ifdef ENABLE_SASH_SYSTEM
enum ESashInfo
{
    SASH_ABSORPTION_SOCKET = 0,
    SASH_ABSORBED_SOCKET = 1,
    SASH_CLEAN_ATTR_VALUE0 = 7,
    SASH_WINDOW_MAX_MATERIALS = 2,
};

enum
{
    HEADER_CG_SASH = 211,
    HEADER_GC_SASH = 215,
    SASH_SUBHEADER_GC_OPEN = 0,
    SASH_SUBHEADER_GC_CLOSE,
    SASH_SUBHEADER_GC_ADDED,
    SASH_SUBHEADER_GC_REMOVED,
    SASH_SUBHEADER_CG_REFINED,
    SASH_SUBHEADER_CG_CLOSE = 0,
    SASH_SUBHEADER_CG_ADD,
    SASH_SUBHEADER_CG_REMOVE,
    SASH_SUBHEADER_CG_REFINE,
};

typedef struct SPacketSash
{
    BYTE    header;
    BYTE    subheader;
    bool    bWindow;
    DWORD    dwPrice;
    BYTE    bPos;
    TItemPos    tPos;
    DWORD    dwItemVnum;
    DWORD    dwMinAbs;
    DWORD    dwMaxAbs;
} TPacketSash;

typedef struct SSashMaterial
{
    BYTE    bHere;
    WORD    wCell;
} TSashMaterial;

typedef struct SSashResult
{
    DWORD    dwItemVnum;
    DWORD    dwMinAbs;
    DWORD    dwMaxAbs;
} TSashResult;
#endif

typedef struct SPacketGCSkillMotion
{
    BYTE    header;
    DWORD    dwVID;
    LONG    lX;
    LONG    lY;
    BYTE    bRot;
    DWORD    dwTime;
    DWORD    dwSkillVnum;
    BYTE    bSkillLevel;
    BYTE    bSkillGrade;
} TPacketGCSkillMotion;

// @fixme007 length 2
typedef struct packet_unk_213
{
    BYTE bHeader;
    BYTE bUnk2;
} TPacketGCUnk213;

#ifdef ENABLE_SHOW_CHEST_DROP
enum
{
    HEADER_CG_CHEST_DROP_INFO = 216,
    HEADER_GC_CHEST_DROP_INFO = 219,
};

typedef struct SPacketCGChestDropInfo {
    BYTE    header;
    WORD    wInventoryCell;
} TPacketCGChestDropInfo;

typedef struct SChestDropInfoTable {
    BYTE    bPageIndex;
    BYTE    bSlotIndex;
    DWORD    dwItemVnum;
    BYTE    bItemCount;
} TChestDropInfoTable;

typedef struct SPacketGCChestDropInfo {
    BYTE    bHeader;
    WORD    wSize;
    DWORD    dwChestVnum;
} TPacketGCChestDropInfo;
#endif

#ifdef ENABLE_BATTLE_FIELD
enum
{
    HEADER_CG_REQUEST_ENTER_BATTLE  = 217,
    HEADER_CG_REQUEST_EXIT_BATTLE  = 218,
    
    HEADER_GC_BATTLE_ZONE_INFO         = 222,
};

typedef struct SBattleRankingMember {
    BYTE    bPosition;
    BYTE    bType;
    char     szName[CHARACTER_NAME_MAX_LEN + 1];
    BYTE    bEmpire;
    long    lScore;
} TBattleRankingMember;

typedef struct SPacketGCBattleInfo {
    BYTE    bHeader;
    WORD    wSize;
    int        iOpenTime;
    int        iCloseTime;
    bool    bIsEnterOpen;
    bool    bIsEvent;
} TPacketGCBattleInfo;
#endif

#ifdef ENABLE_ATTENDANCE_EVENT
enum
{
    HEADER_CG_ATTENDANCE_REWARD = 220,
    
    HEADER_GC_HIT_COUNT_INFO = 224,
    HEADER_GC_ATTENDANCE_EVENT = 225,
    HEADER_GC_ATTENDANCE_EVENT_INFO = 226,
};

typedef struct SHitCountInfo
{
    SHitCountInfo(){ dwVid = dwCount = 0;}
    SHitCountInfo(DWORD vid, DWORD count)
    {
        dwVid = vid;
        dwCount = count;
    }
    DWORD    dwVid;
    DWORD    dwCount;
} THitCountInfo;

typedef struct SRewardItem
{
    BYTE bDay;
    DWORD dwVnum;
    DWORD dwCount;
} TRewardItem;

typedef struct SPacketGCHitCountInfo {
    BYTE    bHeader;
    DWORD    dwVid;
    DWORD    dwCount;
} TPacketGCHitCountInfo;

typedef struct SPacketGCAttendanceEventInfo {
    BYTE    bHeader;
    WORD    wSize;
    bool    bIsEnable;
    BYTE    bDay;
    BYTE    bClear;
    BYTE    bReward;
} TPacketGCAttendanceEventInfo;

typedef struct SPacketGCAttendanceEvent {
    BYTE    bHeader;
    BYTE    bType;
    BYTE    bValue;
} TPacketGCAttendanceEvent;
#endif
#ifdef ENABLE_FISH_EVENT
enum
{
    HEADER_CG_FISH_EVENT_SEND = 219,
    HEADER_GC_FISH_EVENT_INFO = 223,
};

enum
{
    FISH_EVENT_SUBHEADER_BOX_USE,
    FISH_EVENT_SUBHEADER_SHAPE_ADD,
    FISH_EVENT_SUBHEADER_GC_REWARD,
    FISH_EVENT_SUBHEADER_GC_ENABLE,
};

typedef struct SPacketGCFishEvent {
    BYTE    bHeader;
    BYTE    bSubheader;
} TPacketCGFishEvent;

typedef struct SPacketGCFishEventInfo {
    BYTE    bHeader;
    BYTE    bSubheader;
    DWORD    dwFirstArg;
    DWORD    dwSecondArg;
} TPacketGCFishEventInfo;
#endif
#pragma pack(pop)

Can someone help me with this?
 
HEADER_CG_TICKET_ADMIN = 120,
HEADER_CG_TICKET_ADMIN_PAGE = 121,
#endif
#ifdef ENABLE_FEATURES_OXEVENT
HEADER_CG_OXEVENT_MANAGER = 120,
#endif

take a look here. 120th header declared twice.
 
Yes, but I dont have defined ENABLE_FEATURES_OXEVENT then..
 
I checked everything and its not defined.. I check everything 100 times and found nothing bad..
 

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

Geri
Üst