- Katılım
- 10 Kas 2019
- Konular
- 41
- Mesajlar
- 203
- Çözüm
- 21
- Online süresi
- 29d 12h
- Reaksiyon Skoru
- 32
- Altın Konu
- 0
- TM Yaşı
- 6 Yıl 6 Ay 27 Gün
- Başarım Puanı
- 99
- MmoLira
- 3,011
- DevLira
- 3
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!
Merhaba yeni eklediğim itemine vs sisteminde unkown packet header hatası alıyorum
hatanın kaynağını tespit edemedim ama packet.h larda olduğunu biliyorum yardım eder misiniz
indirdiğim yer: https://forum.turkmmo.com/konu/3698753-itemine-ws-sistemi/
hatanın kaynağını tespit edemedim ama packet.h larda olduğunu biliyorum yardım eder misiniz
indirdiğim yer: https://forum.turkmmo.com/konu/3698753-itemine-ws-sistemi/
#ifndef __INC_PACKET_H__
#define __INC_PACKET_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,
#ifdef WJ_NEW_DROP_DIALOG
HEADER_CG_ITEM_DESTROY = 21,
HEADER_CG_ITEM_SELL = 22,
#endif
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,
HEADER_CG_ITEM_USE_TO_ITEM = 60,
HEADER_CG_TARGET = 61,
HEADER_CG_TEXT = 64, // @ 로 시작되면 텍스트를 파싱한다.
HEADER_CG_WARP = 65,
HEADER_CG_SCRIPT_BUTTON = 66,
HEADER_CG_MESSENGER = 67,
HEADER_CG_MALL_CHECKOUT = 69,
HEADER_CG_SAFEBOX_CHECKIN = 70, // 아이템을 창고에 넣는다.
HEADER_CG_SAFEBOX_CHECKOUT = 71, // 아이템을 창고로 부터 빼온다.
HEADER_CG_PARTY_INVITE = 72,
HEADER_CG_PARTY_INVITE_ANSWER = 73,
HEADER_CG_PARTY_REMOVE = 74,
HEADER_CG_PARTY_SET_STATE = 75,
HEADER_CG_PARTY_USE_SKILL = 76,
HEADER_CG_SAFEBOX_ITEM_MOVE = 77,
HEADER_CG_PARTY_PARAMETER = 78,
HEADER_CG_GUILD = 80,
HEADER_CG_ANSWER_MAKE_GUILD = 81,
HEADER_CG_FISHING = 82,
HEADER_CG_ITEM_GIVE = 83,
HEADER_CG_EMPIRE = 90,
HEADER_CG_REFINE = 96,
HEADER_CG_MARK_LOGIN = 100,
HEADER_CG_MARK_CRCLIST = 101,
HEADER_CG_MARK_UPLOAD = 102,
HEADER_CG_MARK_IDXLIST = 104,
HEADER_CG_HACK = 105,
HEADER_CG_CHANGE_NAME = 106,
HEADER_CG_LOGIN2 = 109,
HEADER_CG_DUNGEON = 110,
HEADER_CG_LOGIN3 = 238,
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 인증키를 받는다.
#if defined(WJ_COMBAT_ZONE)
HEADER_CG_COMBAT_ZONE_REQUEST_ACTION = 117,
#endif
#ifdef ENABLE_ADMIN_BAN_MANAGER
HEADER_CG_ADMIN_BAN_MANAGER = 123,
#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 ENABLE_SHOP_SEARCH_SYSTEM
HEADER_CG_SHOP_SEARCH = 210,
HEADER_CG_SHOP_SEARCH_SUB = 211,
HEADER_CG_SHOP_SEARCH_BUY = 212,
#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,
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_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
#if defined(WJ_COMBAT_ZONE)
HEADER_GC_RANKING_COMBAT_ZONE = 139,
HEADER_GC_SEND_COMBAT_ZONE = 140,
#endif
#ifdef TOURNAMENT_PVP_SYSTEM
HEADER_GC_TOURNAMENT_ADD = 145,
#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
#ifdef ENABLE_SHOP_SEARCH_SYSTEM
HEADER_GC_SHOPSEARCH_SET = 170,
#endif
HEADER_GC_SPECIFIC_EFFECT = 208,
HEADER_GC_DRAGON_SOUL_REFINE = 209,
HEADER_GC_RESPOND_CHANNELSTATUS = 210,
/////////////////////////////////////////////////////////////////////////////
HEADER_GG_LOGIN = 1,
HEADER_GG_LOGOUT = 2,
HEADER_GG_RELAY = 3,
HEADER_GG_NOTICE = 4,
HEADER_GG_SHUTDOWN = 5,
HEADER_GG_GUILD = 6,
HEADER_GG_DISCONNECT = 7, // 누군가의 접속을 강제로 끊을 때
HEADER_GG_SHOUT = 8,
HEADER_GG_SETUP = 9,
HEADER_GG_MESSENGER_ADD = 10,
HEADER_GG_MESSENGER_REMOVE = 11,
HEADER_GG_FIND_POSITION = 12,
HEADER_GG_WARP_CHARACTER = 13,
HEADER_GG_MESSENGER_MOBILE = 14,
HEADER_GG_GUILD_WAR_ZONE_MAP_INDEX = 15,
HEADER_GG_TRANSFER = 16,
HEADER_GG_XMAS_WARP_SANTA = 17,
HEADER_GG_XMAS_WARP_SANTA_REPLY = 18,
HEADER_GG_RELOAD_CRC_LIST = 19,
HEADER_GG_LOGIN_PING = 20,
HEADER_GG_CHECK_CLIENT_VERSION = 21,
HEADER_GG_BLOCK_CHAT = 22,
HEADER_GG_BLOCK_EXCEPTION = 24,
HEADER_GG_SIEGE = 25,
HEADER_GG_MONARCH_NOTICE = 26,
HEADER_GG_MONARCH_TRANSFER = 27,
HEADER_GG_PCBANG_UPDATE = 28,
HEADER_GG_CHECK_AWAKENESS = 29,
#ifdef ENABLE_MESSENGER_BLOCK
HEADER_GG_MESSENGER_BLOCK_ADD = 31,
HEADER_GG_MESSENGER_BLOCK_REMOVE = 32,
#endif
HEADER_GG_GUILD_NOTICE = 33,
};
#pragma pack(1)
typedef struct SPacketGGSetup
{
BYTE bHeader;
WORD wPort;
BYTE bChannel;
} TPacketGGSetup;
#if defined(WJ_COMBAT_ZONE)
typedef struct SPacketCGCombatZoneAction
{
BYTE header;
int action;
int value;
} TPacketCGCombatZoneRequestAction;
typedef struct SPacketGCCombatZone
{
int rank;
char name[12 + 1];
int empire;
int points;
} TPacketGCCombatZoneRanking;
typedef struct SPacketGCCombatZoneData
{
BYTE header;
TPacketGCCombatZoneRanking rankingData[11];
} TPacketGCCombatZoneRankingData;
typedef struct SPacketGCSendCombatZone
{
BYTE header;
DWORD sub_header;
DWORD m_pInfoData[4];
DWORD m_pDataDays[7][8];
bool isRunning;
} TPacketGCSendCombatZone;
#endif
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;
typedef struct SPacketGGGuildNotice
{
BYTE bHeader;
DWORD dwGuildID;
long lSize;
} TPacketGGGuildNotice;
//FORKED_ROAD
typedef struct SPacketGGForkedMapInfo
{
BYTE bHeader;
BYTE bPass;
BYTE bSungzi;
} TPacketGGForkedMapInfo;
//END_FORKED_ROAD
typedef struct SPacketGGShutdown
{
BYTE bHeader;
} TPacketGGShutdown;
typedef struct SPacketGGGuild
{
BYTE bHeader;
BYTE bSubHeader;
DWORD dwGuild;
} TPacketGGGuild;
enum
{
GUILD_SUBHEADER_GG_CHAT,
GUILD_SUBHEADER_GG_SET_MEMBER_COUNT_BONUS,
};
typedef struct SPacketGGGuildChat
{
BYTE bHeader;
BYTE bSubHeader;
DWORD dwGuild;
char szText[CHAT_MAX_LEN + 1];
} TPacketGGGuildChat;
typedef struct SPacketGGParty
{
BYTE header;
BYTE subheader;
DWORD pid;
DWORD leaderpid;
} TPacketGGParty;
enum
{
PARTY_SUBHEADER_GG_CREATE,
PARTY_SUBHEADER_GG_DESTROY,
PARTY_SUBHEADER_GG_JOIN,
PARTY_SUBHEADER_GG_QUIT,
};
typedef struct SPacketGGDisconnect
{
BYTE bHeader;
char szLogin[LOGIN_MAX_LEN + 1];
} TPacketGGDisconnect;
typedef struct SPacketGGShout
{
BYTE bHeader;
BYTE bEmpire;
char szText[CHAT_MAX_LEN + 1];
} TPacketGGShout;
typedef struct SPacketGGXmasWarpSanta
{
BYTE bHeader;
BYTE bChannel;
long lMapIndex;
} TPacketGGXmasWarpSanta;
typedef struct SPacketGGXmasWarpSantaReply
{
BYTE bHeader;
BYTE bChannel;
} TPacketGGXmasWarpSantaReply;
typedef struct SMessengerData
{
char szMobile[MOBILE_MAX_LEN + 1];
} TMessengerData;
typedef struct SPacketGGMessenger
{
BYTE bHeader;
char szAccount[CHARACTER_NAME_MAX_LEN + 1];
char szCompanion[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGGMessenger;
typedef struct SPacketGGMessengerMobile
{
BYTE bHeader;
char szName[CHARACTER_NAME_MAX_LEN + 1];
char szMobile[MOBILE_MAX_LEN + 1];
} TPacketGGMessengerMobile;
typedef struct SPacketGGFindPosition
{
BYTE header;
DWORD dwFromPID; // 저 위치로 워프하려는 사람
DWORD dwTargetPID; // 찾는 사람
} TPacketGGFindPosition;
typedef struct SPacketGGWarpCharacter
{
BYTE header;
DWORD pid;
long x;
long y;
} TPacketGGWarpCharacter;
// HEADER_GG_GUILD_WAR_ZONE_MAP_INDEX = 15,
typedef struct SPacketGGGuildWarMapIndex
{
BYTE bHeader;
DWORD dwGuildID1;
DWORD dwGuildID2;
long lMapIndex;
} TPacketGGGuildWarMapIndex;
typedef struct SPacketGGTransfer
{
BYTE bHeader;
char szName[CHARACTER_NAME_MAX_LEN + 1];
long lX, lY;
} TPacketGGTransfer;
typedef struct SPacketGGLoginPing
{
BYTE bHeader;
char szLogin[LOGIN_MAX_LEN + 1];
} TPacketGGLoginPing;
typedef struct SPacketGGBlockChat
{
BYTE bHeader;
char szName[CHARACTER_NAME_MAX_LEN + 1];
long lBlockDuration;
} TPacketGGBlockChat;
/* 클라이언트 측에서 보내는 패킷 */
typedef struct command_text
{
BYTE bHeader;
} TPacketCGText;
/* 로그인 (1) */
typedef struct command_handshake
{
BYTE bHeader;
DWORD dwHandshake;
DWORD dwTime;
long lDelta;
} TPacketCGHandshake;
typedef struct command_login
{
BYTE header;
char login[LOGIN_MAX_LEN + 1];
char passwd[PASSWD_MAX_LEN + 1];
} TPacketCGLogin;
typedef struct command_login2
{
BYTE header;
char login[LOGIN_MAX_LEN + 1];
DWORD dwLoginKey;
DWORD adwClientKey[4];
} TPacketCGLogin2;
typedef struct command_login3
{
BYTE header;
char login[LOGIN_MAX_LEN + 1];
char passwd[PASSWD_MAX_LEN + 1];
DWORD adwClientKey[4];
DWORD security_key[5];
char cHWInfo[255 + 1];
} TPacketCGLogin3;
#ifdef NEW_PET_SYSTEM
typedef struct packet_RequestPetName
{
BYTE byHeader;
char petname[13];
}TPacketCGRequestPetName;
#endif
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;
#ifdef WJ_NEW_DROP_DIALOG
typedef struct command_item_destroy
{
BYTE header;
TItemPos Cell;
} TPacketCGItemDestroy;
typedef struct command_item_sell
{
BYTE header;
TItemPos Cell;
} TPacketCGItemSell;
#endif
typedef struct command_item_move
{
BYTE header;
TItemPos Cell;
TItemPos CellTo;
BYTE count;
} TPacketCGItemMove;
typedef struct command_item_pickup
{
BYTE header;
DWORD vid;
} TPacketCGItemPickup;
typedef struct command_quickslot_add
{
BYTE header;
UINT pos;
TQuickslot slot;
} TPacketCGQuickslotAdd;
typedef struct command_quickslot_del
{
BYTE header;
UINT pos;
} TPacketCGQuickslotDel;
typedef struct command_quickslot_swap
{
BYTE header;
UINT pos;
UINT 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 */
#ifdef __ENABLE_CHEQUE_SYSTEM__
EXCHANGE_SUBHEADER_CG_CHEQUE_ADD, /* arg1 == amount of cheque */
#endif
EXCHANGE_SUBHEADER_CG_ACCEPT, /* arg1 == not used */
EXCHANGE_SUBHEADER_CG_CANCEL, /* arg1 == not used */
};
typedef struct command_exchange
{
BYTE header;
BYTE sub_header;
DWORD arg1;
BYTE arg2;
TItemPos Pos;
} TPacketCGExchange;
typedef struct command_position
{
BYTE header;
BYTE position;
} TPacketCGPosition;
typedef struct command_script_answer
{
BYTE header;
BYTE answer;
//char file[32 + 1];
//BYTE answer[16 + 1];
} TPacketCGScriptAnswer;
typedef struct command_script_button
{
BYTE header;
unsigned int idx;
} TPacketCGScriptButton;
typedef struct command_quest_input_string
{
BYTE header;
char msg[64+1];
} TPacketCGQuestInputString;
typedef struct command_quest_confirm
{
BYTE header;
BYTE answer;
DWORD requestPID;
} TPacketCGQuestConfirm;
/*
* 서버 측에서 보내는 패킷
*/
typedef struct packet_quest_confirm
{
BYTE header;
char msg[64+1];
long timeout;
DWORD requestPID;
} TPacketGCQuestConfirm;
typedef struct packet_handshake
{
BYTE bHeader;
DWORD dwHandshake;
DWORD dwTime;
long lDelta;
} TPacketGCHandshake;
enum EPhase
{
PHASE_CLOSE,
PHASE_HANDSHAKE,
PHASE_LOGIN,
PHASE_SELECT,
PHASE_LOADING,
PHASE_GAME,
PHASE_DEAD,
PHASE_CLIENT_CONNECTING,
PHASE_DBCLIENT,
PHASE_P2P,
PHASE_AUTH,
PHASE_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_login_failure
{
BYTE header;
char szStatus[ACCOUNT_STATUS_MAX_LEN + 1];
} TPacketGCLoginFailure;
typedef struct packet_create_failure
{
BYTE header;
BYTE bType;
} TPacketGCCreateFailure;
enum
{
ADD_CHARACTER_STATE_DEAD = (1 << 0),
ADD_CHARACTER_STATE_SPAWN = (1 << 1),
ADD_CHARACTER_STATE_GUNGON = (1 << 2),
ADD_CHARACTER_STATE_KILLER = (1 << 3),
ADD_CHARACTER_STATE_PARTY = (1 << 4),
};
enum ECharacterEquipmentPart
{
CHR_EQUIPPART_ARMOR,
CHR_EQUIPPART_WEAPON,
CHR_EQUIPPART_HEAD,
CHR_EQUIPPART_HAIR,
CHR_EQUIPPART_ACCE,
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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
BYTE bPKMode;
DWORD dwMountVnum;
#if defined(WJ_COMBAT_ZONE)
BYTE combat_zone_rank;
#endif
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
} 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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
#ifdef NEW_PET_SYSTEM
DWORD dwLevel;
#endif
BYTE bPKMode;
DWORD dwMountVnum;
#if defined(WJ_COMBAT_ZONE)
DWORD combat_zone_points;
#endif
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
#ifdef WJ_SECURITY_SYSTEM
bool bActivateSecurity;
#endif
#ifdef __ENABLE_AUTO_HUNTING_SYSTEM__
bool bAutoHuntStatus;
#endif
} TPacketGCCharacterUpdate;
typedef struct packet_del_char
{
BYTE header;
DWORD id;
} TPacketGCCharacterDelete;
#ifdef ENABLE_SHOW_CHEST_DROP
enum
{
HEADER_CG_CHEST_DROP_INFO = 215,
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
typedef struct packet_chat // 가변 패킷
{
BYTE header;
WORD size;
BYTE type;
DWORD id;
BYTE bEmpire;
} TPacketGCChat;
typedef struct packet_whisper // 가변 패킷
{
BYTE bHeader;
WORD wSize;
BYTE bType;
char szNameFrom[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGCWhisper;
typedef struct packet_main_character
{
BYTE header;
DWORD dwVID;
WORD wRaceNum;
char szName[CHARACTER_NAME_MAX_LEN + 1];
long lx, ly, lz;
BYTE empire;
BYTE skill_group;
} TPacketGCMainCharacter;
// SUPPORT_BGM
typedef struct packet_main_character3_bgm
{
enum
{
MUSIC_NAME_LEN = 24,
};
BYTE header;
DWORD dwVID;
WORD wRaceNum;
char szChrName[CHARACTER_NAME_MAX_LEN + 1];
char szBGMName[MUSIC_NAME_LEN + 1];
long lx, ly, lz;
BYTE empire;
BYTE skill_group;
} TPacketGCMainCharacter3_BGM;
typedef struct packet_main_character4_bgm_vol
{
enum
{
MUSIC_NAME_LEN = 24,
};
BYTE header;
DWORD dwVID;
WORD wRaceNum;
char szChrName[CHARACTER_NAME_MAX_LEN + 1];
char szBGMName[MUSIC_NAME_LEN + 1];
float fBGMVol;
long lx, ly, lz;
BYTE empire;
BYTE skill_group;
} TPacketGCMainCharacter4_BGM_VOL;
// END_OF_SUPPORT_BGM
typedef struct packet_points
{
BYTE header;
INT points[POINT_MAX_NUM];
} TPacketGCPoints;
typedef struct packet_skill_level
{
BYTE bHeader;
TPlayerSkill skills[SKILL_MAX_NUM];
} TPacketGCSkillLevel;
typedef struct packet_point_change
{
int header;
DWORD dwVID;
BYTE type;
long amount;
long value;
} TPacketGCPointChange;
typedef struct packet_stun
{
BYTE header;
DWORD vid;
} TPacketGCStun;
typedef struct packet_dead
{
BYTE header;
DWORD vid;
} TPacketGCDead;
struct TPacketGCItemDelDeprecated
{
BYTE header;
TItemPos Cell;
DWORD vnum;
BYTE count;
DWORD evolution;
#ifdef WJ_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;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
DWORD flags;
DWORD anti_flags;
bool highlight;
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
#ifdef ENABLE_SOULBIND_SYSTEM
long sealbind;
#endif
} TPacketGCItemSet;
typedef struct packet_item_del
{
BYTE header;
UINT 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;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
#ifdef ENABLE_SOULBIND_SYSTEM
long sealbind;
#endif
} TPacketGCItemUpdate;
typedef struct packet_item_ground_add
{
BYTE bHeader;
long x, y, z;
DWORD dwVID;
DWORD dwVnum;
long alSockets[ITEM_SOCKET_MAX_NUM];
DWORD count;
} 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;
UINT pos;
TQuickslot slot;
};
struct packet_quickslot_del
{
BYTE header;
UINT pos;
};
struct packet_quickslot_swap
{
BYTE header;
UINT pos;
UINT pos_to;
};
struct packet_motion
{
BYTE header;
DWORD vid;
DWORD victim_vid;
WORD motion;
};
enum EPacketShopSubHeaders
{
SHOP_SUBHEADER_GC_START,
SHOP_SUBHEADER_GC_END,
SHOP_SUBHEADER_GC_UPDATE_ITEM,
SHOP_SUBHEADER_GC_UPDATE_PRICE,
SHOP_SUBHEADER_GC_OK,
SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY,
SHOP_SUBHEADER_GC_SOLDOUT,
SHOP_SUBHEADER_GC_INVENTORY_FULL,
SHOP_SUBHEADER_GC_INVALID_POS,
SHOP_SUBHEADER_GC_SOLD_OUT,
SHOP_SUBHEADER_GC_START_EX,
SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY_EX,
#if defined(WJ_COMBAT_ZONE)
SHOP_SUBHEADER_GC_NOT_ENOUGH_POINTS,
SHOP_SUBHEADER_GC_MAX_LIMIT_POINTS,
SHOP_SUBHEADER_GC_OVERFLOW_LIMIT_POINTS,
#endif
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
SHOP_SUBHEADER_GC_NOT_ENOUGH_DRAGON_COIN,
SHOP_SUBHEADER_GC_NOT_ENOUGH_DRAGON_MARK,
SHOP_SUBHEADER_GC_NOT_ENOUGH_ALIGNMENT,
SHOP_SUBHEADER_GC_NOT_ENOUGH_WARPOINT,
SHOP_SUBHEADER_GC_NOT_ENOUGH_10TH_GOLD,
#endif
SHOP_SUBHEADER_GC_UPDATE_MONEY,
};
struct packet_shop_item
{
DWORD vnum;
DWORD price;
DWORD price_cheque;
BYTE count;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
BYTE display_pos;
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
DWORD iLimitValue;
#endif
};
typedef struct packet_shop_start
{
DWORD owner_vid;
struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
char shop_name[SHOP_TAB_NAME_MAX];
short price_type;
#endif
} 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;
#if defined(WJ_COMBAT_ZONE)
DWORD points;
DWORD curLimit;
DWORD maxLimit;
#endif
} TPacketGCShopStartEx;
typedef struct packet_shop_update_item
{
BYTE pos;
struct packet_shop_item item;
} TPacketGCShopUpdateItem;
typedef struct packet_shop_update_price
{
BYTE bPos;
int iPrice;
} TPacketGCShopUpdatePrice;
typedef struct packet_shop // 가변 패킷
{
BYTE header;
WORD size;
BYTE subheader;
} TPacketGCShop;
struct packet_exchange
{
BYTE header;
BYTE sub_header;
BYTE is_me;
DWORD arg1; // vnum
TItemPos arg2; // cell
DWORD arg3; // count
#ifdef WJ_ENABLE_TRADABLE_ICON
TItemPos arg4; // srccell
#endif
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD dwTransmutation;
#endif
};
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 */
#ifdef __ENABLE_CHEQUE_SYSTEM__
EXCHANGE_SUBHEADER_GC_CHEQUE_ADD, /* arg1 == cheque */
#endif
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 */
#ifdef __ENABLE_CHEQUE_SYSTEM__
EXCHANGE_SUBHEADER_GC_LESS_CHEQUE, /* arg1 == not used */
#endif
};
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;
};
typedef struct packet_change_speed
{
BYTE header;
DWORD vid;
WORD moving_speed;
} TPacketGCChangeSpeed;
struct packet_mount
{
BYTE header;
DWORD vid;
DWORD mount_vid;
BYTE pos;
DWORD x, y;
};
typedef struct packet_move
{
BYTE bHeader;
BYTE bFunc;
BYTE bArg;
BYTE bRot;
DWORD dwVID;
long lX;
long lY;
DWORD dwTime;
DWORD dwDuration;
} TPacketGCMove;
// 소유권
typedef struct packet_ownership
{
BYTE bHeader;
DWORD dwOwnerVID;
DWORD dwVictimVID;
} TPacketGCOwnership;
// 위치 동기화 패킷의 bCount 만큼 붙는 단위
typedef struct packet_sync_position_element
{
DWORD dwVID;
long lX;
long lY;
} TPacketGCSyncPositionElement;
// 위치 동기화
typedef struct packet_sync_position // 가변 패킷
{
BYTE bHeader;
WORD wSize; // 개수 = (wSize - sizeof(TPacketGCSyncPosition)) / sizeof(TPacketGCSyncPositionElement)
} TPacketGCSyncPosition;
typedef struct packet_fly
{
BYTE bHeader;
BYTE bType;
DWORD dwStartVID;
DWORD dwEndVID;
} TPacketGCCreateFly;
typedef struct command_fly_targeting
{
BYTE bHeader;
DWORD dwTargetVID;
long x, y;
} TPacketCGFlyTargeting;
typedef struct packet_fly_targeting
{
BYTE bHeader;
DWORD dwShooterVID;
DWORD dwTargetVID;
long x, y;
} TPacketGCFlyTargeting;
typedef struct packet_shoot
{
BYTE bHeader;
BYTE bType;
} TPacketCGShoot;
typedef struct packet_duel_start
{
BYTE header;
WORD wSize; // DWORD가 몇개? 개수 = (wSize - sizeof(TPacketGCPVPList)) / 4
} TPacketGCDuelStart;
enum EPVPModes
{
PVP_MODE_NONE,
PVP_MODE_AGREE,
PVP_MODE_FIGHT,
PVP_MODE_REVENGE
};
typedef struct packet_pvp
{
BYTE bHeader;
DWORD dwVIDSrc;
DWORD dwVIDDst;
BYTE bMode; // 0 이면 끔, 1이면 켬
} TPacketGCPVP;
typedef struct command_use_skill
{
BYTE bHeader;
DWORD dwVnum;
DWORD dwVID;
} TPacketCGUseSkill;
typedef struct command_target
{
BYTE header;
DWORD dwVID;
} TPacketCGTarget;
typedef struct packet_target
{
BYTE header;
DWORD dwVID;
BYTE bHPPercent;
#ifdef __VIEW_TARGET_DECIMAL_HP__
int iMinHP;
int iMaxHP;
#endif
#ifdef ELEMENT_TARGET
BYTE bElement;
#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;
BYTE flag;
};
enum
{
#ifdef ENABLE_MESSENGER_BLOCK
MESSENGER_SUBHEADER_GC_BLOCK_LIST,
MESSENGER_SUBHEADER_GC_BLOCK_LOGIN,
MESSENGER_SUBHEADER_GC_BLOCK_LOGOUT,
MESSENGER_SUBHEADER_GC_BLOCK_INVITE,//not used
#endif
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;
#ifdef ENABLE_MESSENGER_BLOCK
typedef struct packet_messenger_block_list_offline
{
BYTE connected; // always 0
BYTE length;
} TPacketGCMessengerBlockListOffline;
typedef struct packet_messenger_block_list_online
{
BYTE connected; // always 1
BYTE length;
} TPacketGCMessengerBlockListOnline;
#endif
enum
{
#ifdef ENABLE_MESSENGER_BLOCK
MESSENGER_SUBHEADER_CG_ADD_BLOCK_BY_VID,
MESSENGER_SUBHEADER_CG_ADD_BLOCK_BY_NAME,
MESSENGER_SUBHEADER_CG_REMOVE_BLOCK,
#endif
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;
#ifdef ENABLE_MESSENGER_BLOCK
typedef struct command_messenger_add_block_by_vid
{
DWORD vid;
} TPacketCGMessengerAddBlockByVID;
typedef struct command_messenger_add_block_by_name
{
BYTE length;
} TPacketCGMessengerAddBlockByName;
typedef struct command_messenger_remove_block
{
char login[LOGIN_MAX_LEN+1];
} TPacketCGMessengerRemoveBlock;
#endif
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;
#ifdef TOURNAMENT_PVP_SYSTEM
typedef struct packet_tournament_add
{
BYTE header;
int membersOnline_A;
int membersOnline_B;
int membersDead_A;
int membersDead_B;
int memberLives;
int dwTimeRemained;
} TPacketGCTournamentAdd;
#endif
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;
#ifdef __IMPROVED_GUILD_WAR__
int iMaxPlayer;
int iMaxScore;
DWORD flags;
int custom_map_index;
#endif
} TPacketGCGuildWar;
typedef struct command_guild
{
BYTE header;
BYTE subheader;
} 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_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;
#ifdef __ENABLE_SHOP_DECORATION_SYSTEM__
BYTE bShopKasmirTitle;
#endif
char szSign[SHOP_SIGN_MAX_LEN + 1];
} TPacketGCShopSign;
typedef struct SPacketCGMyShop
{
BYTE bHeader;
char szSign[SHOP_SIGN_MAX_LEN + 1];
int bCount;
#ifdef OFFLINE_SHOP
BYTE days;
#endif
#ifdef __ENABLE_SHOP_DECORATION_SYSTEM__
DWORD dwKasmirNpc;
BYTE bKasmirBaslik;
#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 ENABLE_FEATURES_REFINE_SYSTEM
BYTE lLow;
BYTE lMedium;
BYTE lExtra;
BYTE lTotal;
#endif
} TPacketCGRefine;
typedef struct SPacketCGRequestRefineInfo
{
BYTE header;
UINT pos;
} TPacketCGRequestRefineInfo;
typedef struct SPacketGCRefineInformaion
{
BYTE header;
BYTE type;
UINT 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 pakcet_view_equip
{
BYTE header;
DWORD vid;
struct
{
DWORD vnum;
BYTE count;
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
}
#ifdef EQUIP_ENABLE_VIEW_SASH
equips[17];
#else
equips[16];
#endif
} 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;
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 WJ_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 ENABLE_SHOP_SEARCH_SYSTEM
typedef struct packet_priv_shop_item_set
{
BYTE header;
DWORD vnum;
DWORD vid;
BYTE count;
DWORD flags;
DWORD anti_flags;
long long price;
int price_cheque;
BYTE display_pos;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
} TPacketGCShopSearchItemSet;
typedef struct command_shop_search
{
BYTE header;
WORD Race;
int ItemCat;
int SubCat;
int MinLevel;
int MaxLevel;
int MinRefine;
int MaxRefine;
unsigned long long MinGold;
unsigned long long MaxGold;
int MinWon;
int MaxWon;
char ItemName[SHOP_TAB_NAME_MAX + 1];
} TPacketCGShopSearch;
typedef struct command_shop_search_buy
{
BYTE header;
int32_t shopVid;
BYTE shopItemPos;
} TPacketCGShopSearchBuy;
#endif
#pragma pack()
#endif
#define __INC_PACKET_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,
#ifdef WJ_NEW_DROP_DIALOG
HEADER_CG_ITEM_DESTROY = 21,
HEADER_CG_ITEM_SELL = 22,
#endif
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,
HEADER_CG_ITEM_USE_TO_ITEM = 60,
HEADER_CG_TARGET = 61,
HEADER_CG_TEXT = 64, // @ 로 시작되면 텍스트를 파싱한다.
HEADER_CG_WARP = 65,
HEADER_CG_SCRIPT_BUTTON = 66,
HEADER_CG_MESSENGER = 67,
HEADER_CG_MALL_CHECKOUT = 69,
HEADER_CG_SAFEBOX_CHECKIN = 70, // 아이템을 창고에 넣는다.
HEADER_CG_SAFEBOX_CHECKOUT = 71, // 아이템을 창고로 부터 빼온다.
HEADER_CG_PARTY_INVITE = 72,
HEADER_CG_PARTY_INVITE_ANSWER = 73,
HEADER_CG_PARTY_REMOVE = 74,
HEADER_CG_PARTY_SET_STATE = 75,
HEADER_CG_PARTY_USE_SKILL = 76,
HEADER_CG_SAFEBOX_ITEM_MOVE = 77,
HEADER_CG_PARTY_PARAMETER = 78,
HEADER_CG_GUILD = 80,
HEADER_CG_ANSWER_MAKE_GUILD = 81,
HEADER_CG_FISHING = 82,
HEADER_CG_ITEM_GIVE = 83,
HEADER_CG_EMPIRE = 90,
HEADER_CG_REFINE = 96,
HEADER_CG_MARK_LOGIN = 100,
HEADER_CG_MARK_CRCLIST = 101,
HEADER_CG_MARK_UPLOAD = 102,
HEADER_CG_MARK_IDXLIST = 104,
HEADER_CG_HACK = 105,
HEADER_CG_CHANGE_NAME = 106,
HEADER_CG_LOGIN2 = 109,
HEADER_CG_DUNGEON = 110,
HEADER_CG_LOGIN3 = 238,
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 인증키를 받는다.
#if defined(WJ_COMBAT_ZONE)
HEADER_CG_COMBAT_ZONE_REQUEST_ACTION = 117,
#endif
#ifdef ENABLE_ADMIN_BAN_MANAGER
HEADER_CG_ADMIN_BAN_MANAGER = 123,
#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 ENABLE_SHOP_SEARCH_SYSTEM
HEADER_CG_SHOP_SEARCH = 210,
HEADER_CG_SHOP_SEARCH_SUB = 211,
HEADER_CG_SHOP_SEARCH_BUY = 212,
#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,
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_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
#if defined(WJ_COMBAT_ZONE)
HEADER_GC_RANKING_COMBAT_ZONE = 139,
HEADER_GC_SEND_COMBAT_ZONE = 140,
#endif
#ifdef TOURNAMENT_PVP_SYSTEM
HEADER_GC_TOURNAMENT_ADD = 145,
#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
#ifdef ENABLE_SHOP_SEARCH_SYSTEM
HEADER_GC_SHOPSEARCH_SET = 170,
#endif
HEADER_GC_SPECIFIC_EFFECT = 208,
HEADER_GC_DRAGON_SOUL_REFINE = 209,
HEADER_GC_RESPOND_CHANNELSTATUS = 210,
/////////////////////////////////////////////////////////////////////////////
HEADER_GG_LOGIN = 1,
HEADER_GG_LOGOUT = 2,
HEADER_GG_RELAY = 3,
HEADER_GG_NOTICE = 4,
HEADER_GG_SHUTDOWN = 5,
HEADER_GG_GUILD = 6,
HEADER_GG_DISCONNECT = 7, // 누군가의 접속을 강제로 끊을 때
HEADER_GG_SHOUT = 8,
HEADER_GG_SETUP = 9,
HEADER_GG_MESSENGER_ADD = 10,
HEADER_GG_MESSENGER_REMOVE = 11,
HEADER_GG_FIND_POSITION = 12,
HEADER_GG_WARP_CHARACTER = 13,
HEADER_GG_MESSENGER_MOBILE = 14,
HEADER_GG_GUILD_WAR_ZONE_MAP_INDEX = 15,
HEADER_GG_TRANSFER = 16,
HEADER_GG_XMAS_WARP_SANTA = 17,
HEADER_GG_XMAS_WARP_SANTA_REPLY = 18,
HEADER_GG_RELOAD_CRC_LIST = 19,
HEADER_GG_LOGIN_PING = 20,
HEADER_GG_CHECK_CLIENT_VERSION = 21,
HEADER_GG_BLOCK_CHAT = 22,
HEADER_GG_BLOCK_EXCEPTION = 24,
HEADER_GG_SIEGE = 25,
HEADER_GG_MONARCH_NOTICE = 26,
HEADER_GG_MONARCH_TRANSFER = 27,
HEADER_GG_PCBANG_UPDATE = 28,
HEADER_GG_CHECK_AWAKENESS = 29,
#ifdef ENABLE_MESSENGER_BLOCK
HEADER_GG_MESSENGER_BLOCK_ADD = 31,
HEADER_GG_MESSENGER_BLOCK_REMOVE = 32,
#endif
HEADER_GG_GUILD_NOTICE = 33,
};
#pragma pack(1)
typedef struct SPacketGGSetup
{
BYTE bHeader;
WORD wPort;
BYTE bChannel;
} TPacketGGSetup;
#if defined(WJ_COMBAT_ZONE)
typedef struct SPacketCGCombatZoneAction
{
BYTE header;
int action;
int value;
} TPacketCGCombatZoneRequestAction;
typedef struct SPacketGCCombatZone
{
int rank;
char name[12 + 1];
int empire;
int points;
} TPacketGCCombatZoneRanking;
typedef struct SPacketGCCombatZoneData
{
BYTE header;
TPacketGCCombatZoneRanking rankingData[11];
} TPacketGCCombatZoneRankingData;
typedef struct SPacketGCSendCombatZone
{
BYTE header;
DWORD sub_header;
DWORD m_pInfoData[4];
DWORD m_pDataDays[7][8];
bool isRunning;
} TPacketGCSendCombatZone;
#endif
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;
typedef struct SPacketGGGuildNotice
{
BYTE bHeader;
DWORD dwGuildID;
long lSize;
} TPacketGGGuildNotice;
//FORKED_ROAD
typedef struct SPacketGGForkedMapInfo
{
BYTE bHeader;
BYTE bPass;
BYTE bSungzi;
} TPacketGGForkedMapInfo;
//END_FORKED_ROAD
typedef struct SPacketGGShutdown
{
BYTE bHeader;
} TPacketGGShutdown;
typedef struct SPacketGGGuild
{
BYTE bHeader;
BYTE bSubHeader;
DWORD dwGuild;
} TPacketGGGuild;
enum
{
GUILD_SUBHEADER_GG_CHAT,
GUILD_SUBHEADER_GG_SET_MEMBER_COUNT_BONUS,
};
typedef struct SPacketGGGuildChat
{
BYTE bHeader;
BYTE bSubHeader;
DWORD dwGuild;
char szText[CHAT_MAX_LEN + 1];
} TPacketGGGuildChat;
typedef struct SPacketGGParty
{
BYTE header;
BYTE subheader;
DWORD pid;
DWORD leaderpid;
} TPacketGGParty;
enum
{
PARTY_SUBHEADER_GG_CREATE,
PARTY_SUBHEADER_GG_DESTROY,
PARTY_SUBHEADER_GG_JOIN,
PARTY_SUBHEADER_GG_QUIT,
};
typedef struct SPacketGGDisconnect
{
BYTE bHeader;
char szLogin[LOGIN_MAX_LEN + 1];
} TPacketGGDisconnect;
typedef struct SPacketGGShout
{
BYTE bHeader;
BYTE bEmpire;
char szText[CHAT_MAX_LEN + 1];
} TPacketGGShout;
typedef struct SPacketGGXmasWarpSanta
{
BYTE bHeader;
BYTE bChannel;
long lMapIndex;
} TPacketGGXmasWarpSanta;
typedef struct SPacketGGXmasWarpSantaReply
{
BYTE bHeader;
BYTE bChannel;
} TPacketGGXmasWarpSantaReply;
typedef struct SMessengerData
{
char szMobile[MOBILE_MAX_LEN + 1];
} TMessengerData;
typedef struct SPacketGGMessenger
{
BYTE bHeader;
char szAccount[CHARACTER_NAME_MAX_LEN + 1];
char szCompanion[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGGMessenger;
typedef struct SPacketGGMessengerMobile
{
BYTE bHeader;
char szName[CHARACTER_NAME_MAX_LEN + 1];
char szMobile[MOBILE_MAX_LEN + 1];
} TPacketGGMessengerMobile;
typedef struct SPacketGGFindPosition
{
BYTE header;
DWORD dwFromPID; // 저 위치로 워프하려는 사람
DWORD dwTargetPID; // 찾는 사람
} TPacketGGFindPosition;
typedef struct SPacketGGWarpCharacter
{
BYTE header;
DWORD pid;
long x;
long y;
} TPacketGGWarpCharacter;
// HEADER_GG_GUILD_WAR_ZONE_MAP_INDEX = 15,
typedef struct SPacketGGGuildWarMapIndex
{
BYTE bHeader;
DWORD dwGuildID1;
DWORD dwGuildID2;
long lMapIndex;
} TPacketGGGuildWarMapIndex;
typedef struct SPacketGGTransfer
{
BYTE bHeader;
char szName[CHARACTER_NAME_MAX_LEN + 1];
long lX, lY;
} TPacketGGTransfer;
typedef struct SPacketGGLoginPing
{
BYTE bHeader;
char szLogin[LOGIN_MAX_LEN + 1];
} TPacketGGLoginPing;
typedef struct SPacketGGBlockChat
{
BYTE bHeader;
char szName[CHARACTER_NAME_MAX_LEN + 1];
long lBlockDuration;
} TPacketGGBlockChat;
/* 클라이언트 측에서 보내는 패킷 */
typedef struct command_text
{
BYTE bHeader;
} TPacketCGText;
/* 로그인 (1) */
typedef struct command_handshake
{
BYTE bHeader;
DWORD dwHandshake;
DWORD dwTime;
long lDelta;
} TPacketCGHandshake;
typedef struct command_login
{
BYTE header;
char login[LOGIN_MAX_LEN + 1];
char passwd[PASSWD_MAX_LEN + 1];
} TPacketCGLogin;
typedef struct command_login2
{
BYTE header;
char login[LOGIN_MAX_LEN + 1];
DWORD dwLoginKey;
DWORD adwClientKey[4];
} TPacketCGLogin2;
typedef struct command_login3
{
BYTE header;
char login[LOGIN_MAX_LEN + 1];
char passwd[PASSWD_MAX_LEN + 1];
DWORD adwClientKey[4];
DWORD security_key[5];
char cHWInfo[255 + 1];
} TPacketCGLogin3;
#ifdef NEW_PET_SYSTEM
typedef struct packet_RequestPetName
{
BYTE byHeader;
char petname[13];
}TPacketCGRequestPetName;
#endif
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;
#ifdef WJ_NEW_DROP_DIALOG
typedef struct command_item_destroy
{
BYTE header;
TItemPos Cell;
} TPacketCGItemDestroy;
typedef struct command_item_sell
{
BYTE header;
TItemPos Cell;
} TPacketCGItemSell;
#endif
typedef struct command_item_move
{
BYTE header;
TItemPos Cell;
TItemPos CellTo;
BYTE count;
} TPacketCGItemMove;
typedef struct command_item_pickup
{
BYTE header;
DWORD vid;
} TPacketCGItemPickup;
typedef struct command_quickslot_add
{
BYTE header;
UINT pos;
TQuickslot slot;
} TPacketCGQuickslotAdd;
typedef struct command_quickslot_del
{
BYTE header;
UINT pos;
} TPacketCGQuickslotDel;
typedef struct command_quickslot_swap
{
BYTE header;
UINT pos;
UINT 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 */
#ifdef __ENABLE_CHEQUE_SYSTEM__
EXCHANGE_SUBHEADER_CG_CHEQUE_ADD, /* arg1 == amount of cheque */
#endif
EXCHANGE_SUBHEADER_CG_ACCEPT, /* arg1 == not used */
EXCHANGE_SUBHEADER_CG_CANCEL, /* arg1 == not used */
};
typedef struct command_exchange
{
BYTE header;
BYTE sub_header;
DWORD arg1;
BYTE arg2;
TItemPos Pos;
} TPacketCGExchange;
typedef struct command_position
{
BYTE header;
BYTE position;
} TPacketCGPosition;
typedef struct command_script_answer
{
BYTE header;
BYTE answer;
//char file[32 + 1];
//BYTE answer[16 + 1];
} TPacketCGScriptAnswer;
typedef struct command_script_button
{
BYTE header;
unsigned int idx;
} TPacketCGScriptButton;
typedef struct command_quest_input_string
{
BYTE header;
char msg[64+1];
} TPacketCGQuestInputString;
typedef struct command_quest_confirm
{
BYTE header;
BYTE answer;
DWORD requestPID;
} TPacketCGQuestConfirm;
/*
* 서버 측에서 보내는 패킷
*/
typedef struct packet_quest_confirm
{
BYTE header;
char msg[64+1];
long timeout;
DWORD requestPID;
} TPacketGCQuestConfirm;
typedef struct packet_handshake
{
BYTE bHeader;
DWORD dwHandshake;
DWORD dwTime;
long lDelta;
} TPacketGCHandshake;
enum EPhase
{
PHASE_CLOSE,
PHASE_HANDSHAKE,
PHASE_LOGIN,
PHASE_SELECT,
PHASE_LOADING,
PHASE_GAME,
PHASE_DEAD,
PHASE_CLIENT_CONNECTING,
PHASE_DBCLIENT,
PHASE_P2P,
PHASE_AUTH,
PHASE_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_login_failure
{
BYTE header;
char szStatus[ACCOUNT_STATUS_MAX_LEN + 1];
} TPacketGCLoginFailure;
typedef struct packet_create_failure
{
BYTE header;
BYTE bType;
} TPacketGCCreateFailure;
enum
{
ADD_CHARACTER_STATE_DEAD = (1 << 0),
ADD_CHARACTER_STATE_SPAWN = (1 << 1),
ADD_CHARACTER_STATE_GUNGON = (1 << 2),
ADD_CHARACTER_STATE_KILLER = (1 << 3),
ADD_CHARACTER_STATE_PARTY = (1 << 4),
};
enum ECharacterEquipmentPart
{
CHR_EQUIPPART_ARMOR,
CHR_EQUIPPART_WEAPON,
CHR_EQUIPPART_HEAD,
CHR_EQUIPPART_HAIR,
CHR_EQUIPPART_ACCE,
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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
BYTE bPKMode;
DWORD dwMountVnum;
#if defined(WJ_COMBAT_ZONE)
BYTE combat_zone_rank;
#endif
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
} 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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
#ifdef NEW_PET_SYSTEM
DWORD dwLevel;
#endif
BYTE bPKMode;
DWORD dwMountVnum;
#if defined(WJ_COMBAT_ZONE)
DWORD combat_zone_points;
#endif
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
#ifdef WJ_SECURITY_SYSTEM
bool bActivateSecurity;
#endif
#ifdef __ENABLE_AUTO_HUNTING_SYSTEM__
bool bAutoHuntStatus;
#endif
} TPacketGCCharacterUpdate;
typedef struct packet_del_char
{
BYTE header;
DWORD id;
} TPacketGCCharacterDelete;
#ifdef ENABLE_SHOW_CHEST_DROP
enum
{
HEADER_CG_CHEST_DROP_INFO = 215,
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
typedef struct packet_chat // 가변 패킷
{
BYTE header;
WORD size;
BYTE type;
DWORD id;
BYTE bEmpire;
} TPacketGCChat;
typedef struct packet_whisper // 가변 패킷
{
BYTE bHeader;
WORD wSize;
BYTE bType;
char szNameFrom[CHARACTER_NAME_MAX_LEN + 1];
} TPacketGCWhisper;
typedef struct packet_main_character
{
BYTE header;
DWORD dwVID;
WORD wRaceNum;
char szName[CHARACTER_NAME_MAX_LEN + 1];
long lx, ly, lz;
BYTE empire;
BYTE skill_group;
} TPacketGCMainCharacter;
// SUPPORT_BGM
typedef struct packet_main_character3_bgm
{
enum
{
MUSIC_NAME_LEN = 24,
};
BYTE header;
DWORD dwVID;
WORD wRaceNum;
char szChrName[CHARACTER_NAME_MAX_LEN + 1];
char szBGMName[MUSIC_NAME_LEN + 1];
long lx, ly, lz;
BYTE empire;
BYTE skill_group;
} TPacketGCMainCharacter3_BGM;
typedef struct packet_main_character4_bgm_vol
{
enum
{
MUSIC_NAME_LEN = 24,
};
BYTE header;
DWORD dwVID;
WORD wRaceNum;
char szChrName[CHARACTER_NAME_MAX_LEN + 1];
char szBGMName[MUSIC_NAME_LEN + 1];
float fBGMVol;
long lx, ly, lz;
BYTE empire;
BYTE skill_group;
} TPacketGCMainCharacter4_BGM_VOL;
// END_OF_SUPPORT_BGM
typedef struct packet_points
{
BYTE header;
INT points[POINT_MAX_NUM];
} TPacketGCPoints;
typedef struct packet_skill_level
{
BYTE bHeader;
TPlayerSkill skills[SKILL_MAX_NUM];
} TPacketGCSkillLevel;
typedef struct packet_point_change
{
int header;
DWORD dwVID;
BYTE type;
long amount;
long value;
} TPacketGCPointChange;
typedef struct packet_stun
{
BYTE header;
DWORD vid;
} TPacketGCStun;
typedef struct packet_dead
{
BYTE header;
DWORD vid;
} TPacketGCDead;
struct TPacketGCItemDelDeprecated
{
BYTE header;
TItemPos Cell;
DWORD vnum;
BYTE count;
DWORD evolution;
#ifdef WJ_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;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
DWORD flags;
DWORD anti_flags;
bool highlight;
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
#ifdef ENABLE_SOULBIND_SYSTEM
long sealbind;
#endif
} TPacketGCItemSet;
typedef struct packet_item_del
{
BYTE header;
UINT 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;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
#ifdef ENABLE_SOULBIND_SYSTEM
long sealbind;
#endif
} TPacketGCItemUpdate;
typedef struct packet_item_ground_add
{
BYTE bHeader;
long x, y, z;
DWORD dwVID;
DWORD dwVnum;
long alSockets[ITEM_SOCKET_MAX_NUM];
DWORD count;
} 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;
UINT pos;
TQuickslot slot;
};
struct packet_quickslot_del
{
BYTE header;
UINT pos;
};
struct packet_quickslot_swap
{
BYTE header;
UINT pos;
UINT pos_to;
};
struct packet_motion
{
BYTE header;
DWORD vid;
DWORD victim_vid;
WORD motion;
};
enum EPacketShopSubHeaders
{
SHOP_SUBHEADER_GC_START,
SHOP_SUBHEADER_GC_END,
SHOP_SUBHEADER_GC_UPDATE_ITEM,
SHOP_SUBHEADER_GC_UPDATE_PRICE,
SHOP_SUBHEADER_GC_OK,
SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY,
SHOP_SUBHEADER_GC_SOLDOUT,
SHOP_SUBHEADER_GC_INVENTORY_FULL,
SHOP_SUBHEADER_GC_INVALID_POS,
SHOP_SUBHEADER_GC_SOLD_OUT,
SHOP_SUBHEADER_GC_START_EX,
SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY_EX,
#if defined(WJ_COMBAT_ZONE)
SHOP_SUBHEADER_GC_NOT_ENOUGH_POINTS,
SHOP_SUBHEADER_GC_MAX_LIMIT_POINTS,
SHOP_SUBHEADER_GC_OVERFLOW_LIMIT_POINTS,
#endif
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
SHOP_SUBHEADER_GC_NOT_ENOUGH_DRAGON_COIN,
SHOP_SUBHEADER_GC_NOT_ENOUGH_DRAGON_MARK,
SHOP_SUBHEADER_GC_NOT_ENOUGH_ALIGNMENT,
SHOP_SUBHEADER_GC_NOT_ENOUGH_WARPOINT,
SHOP_SUBHEADER_GC_NOT_ENOUGH_10TH_GOLD,
#endif
SHOP_SUBHEADER_GC_UPDATE_MONEY,
};
struct packet_shop_item
{
DWORD vnum;
DWORD price;
DWORD price_cheque;
BYTE count;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
BYTE display_pos;
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
DWORD iLimitValue;
#endif
};
typedef struct packet_shop_start
{
DWORD owner_vid;
struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
char shop_name[SHOP_TAB_NAME_MAX];
short price_type;
#endif
} 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;
#if defined(WJ_COMBAT_ZONE)
DWORD points;
DWORD curLimit;
DWORD maxLimit;
#endif
} TPacketGCShopStartEx;
typedef struct packet_shop_update_item
{
BYTE pos;
struct packet_shop_item item;
} TPacketGCShopUpdateItem;
typedef struct packet_shop_update_price
{
BYTE bPos;
int iPrice;
} TPacketGCShopUpdatePrice;
typedef struct packet_shop // 가변 패킷
{
BYTE header;
WORD size;
BYTE subheader;
} TPacketGCShop;
struct packet_exchange
{
BYTE header;
BYTE sub_header;
BYTE is_me;
DWORD arg1; // vnum
TItemPos arg2; // cell
DWORD arg3; // count
#ifdef WJ_ENABLE_TRADABLE_ICON
TItemPos arg4; // srccell
#endif
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD dwTransmutation;
#endif
};
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 */
#ifdef __ENABLE_CHEQUE_SYSTEM__
EXCHANGE_SUBHEADER_GC_CHEQUE_ADD, /* arg1 == cheque */
#endif
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 */
#ifdef __ENABLE_CHEQUE_SYSTEM__
EXCHANGE_SUBHEADER_GC_LESS_CHEQUE, /* arg1 == not used */
#endif
};
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;
};
typedef struct packet_change_speed
{
BYTE header;
DWORD vid;
WORD moving_speed;
} TPacketGCChangeSpeed;
struct packet_mount
{
BYTE header;
DWORD vid;
DWORD mount_vid;
BYTE pos;
DWORD x, y;
};
typedef struct packet_move
{
BYTE bHeader;
BYTE bFunc;
BYTE bArg;
BYTE bRot;
DWORD dwVID;
long lX;
long lY;
DWORD dwTime;
DWORD dwDuration;
} TPacketGCMove;
// 소유권
typedef struct packet_ownership
{
BYTE bHeader;
DWORD dwOwnerVID;
DWORD dwVictimVID;
} TPacketGCOwnership;
// 위치 동기화 패킷의 bCount 만큼 붙는 단위
typedef struct packet_sync_position_element
{
DWORD dwVID;
long lX;
long lY;
} TPacketGCSyncPositionElement;
// 위치 동기화
typedef struct packet_sync_position // 가변 패킷
{
BYTE bHeader;
WORD wSize; // 개수 = (wSize - sizeof(TPacketGCSyncPosition)) / sizeof(TPacketGCSyncPositionElement)
} TPacketGCSyncPosition;
typedef struct packet_fly
{
BYTE bHeader;
BYTE bType;
DWORD dwStartVID;
DWORD dwEndVID;
} TPacketGCCreateFly;
typedef struct command_fly_targeting
{
BYTE bHeader;
DWORD dwTargetVID;
long x, y;
} TPacketCGFlyTargeting;
typedef struct packet_fly_targeting
{
BYTE bHeader;
DWORD dwShooterVID;
DWORD dwTargetVID;
long x, y;
} TPacketGCFlyTargeting;
typedef struct packet_shoot
{
BYTE bHeader;
BYTE bType;
} TPacketCGShoot;
typedef struct packet_duel_start
{
BYTE header;
WORD wSize; // DWORD가 몇개? 개수 = (wSize - sizeof(TPacketGCPVPList)) / 4
} TPacketGCDuelStart;
enum EPVPModes
{
PVP_MODE_NONE,
PVP_MODE_AGREE,
PVP_MODE_FIGHT,
PVP_MODE_REVENGE
};
typedef struct packet_pvp
{
BYTE bHeader;
DWORD dwVIDSrc;
DWORD dwVIDDst;
BYTE bMode; // 0 이면 끔, 1이면 켬
} TPacketGCPVP;
typedef struct command_use_skill
{
BYTE bHeader;
DWORD dwVnum;
DWORD dwVID;
} TPacketCGUseSkill;
typedef struct command_target
{
BYTE header;
DWORD dwVID;
} TPacketCGTarget;
typedef struct packet_target
{
BYTE header;
DWORD dwVID;
BYTE bHPPercent;
#ifdef __VIEW_TARGET_DECIMAL_HP__
int iMinHP;
int iMaxHP;
#endif
#ifdef ELEMENT_TARGET
BYTE bElement;
#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;
BYTE flag;
};
enum
{
#ifdef ENABLE_MESSENGER_BLOCK
MESSENGER_SUBHEADER_GC_BLOCK_LIST,
MESSENGER_SUBHEADER_GC_BLOCK_LOGIN,
MESSENGER_SUBHEADER_GC_BLOCK_LOGOUT,
MESSENGER_SUBHEADER_GC_BLOCK_INVITE,//not used
#endif
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;
#ifdef ENABLE_MESSENGER_BLOCK
typedef struct packet_messenger_block_list_offline
{
BYTE connected; // always 0
BYTE length;
} TPacketGCMessengerBlockListOffline;
typedef struct packet_messenger_block_list_online
{
BYTE connected; // always 1
BYTE length;
} TPacketGCMessengerBlockListOnline;
#endif
enum
{
#ifdef ENABLE_MESSENGER_BLOCK
MESSENGER_SUBHEADER_CG_ADD_BLOCK_BY_VID,
MESSENGER_SUBHEADER_CG_ADD_BLOCK_BY_NAME,
MESSENGER_SUBHEADER_CG_REMOVE_BLOCK,
#endif
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;
#ifdef ENABLE_MESSENGER_BLOCK
typedef struct command_messenger_add_block_by_vid
{
DWORD vid;
} TPacketCGMessengerAddBlockByVID;
typedef struct command_messenger_add_block_by_name
{
BYTE length;
} TPacketCGMessengerAddBlockByName;
typedef struct command_messenger_remove_block
{
char login[LOGIN_MAX_LEN+1];
} TPacketCGMessengerRemoveBlock;
#endif
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;
#ifdef TOURNAMENT_PVP_SYSTEM
typedef struct packet_tournament_add
{
BYTE header;
int membersOnline_A;
int membersOnline_B;
int membersDead_A;
int membersDead_B;
int memberLives;
int dwTimeRemained;
} TPacketGCTournamentAdd;
#endif
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;
#ifdef __IMPROVED_GUILD_WAR__
int iMaxPlayer;
int iMaxScore;
DWORD flags;
int custom_map_index;
#endif
} TPacketGCGuildWar;
typedef struct command_guild
{
BYTE header;
BYTE subheader;
} 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_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;
#ifdef __ENABLE_SHOP_DECORATION_SYSTEM__
BYTE bShopKasmirTitle;
#endif
char szSign[SHOP_SIGN_MAX_LEN + 1];
} TPacketGCShopSign;
typedef struct SPacketCGMyShop
{
BYTE bHeader;
char szSign[SHOP_SIGN_MAX_LEN + 1];
int bCount;
#ifdef OFFLINE_SHOP
BYTE days;
#endif
#ifdef __ENABLE_SHOP_DECORATION_SYSTEM__
DWORD dwKasmirNpc;
BYTE bKasmirBaslik;
#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 ENABLE_FEATURES_REFINE_SYSTEM
BYTE lLow;
BYTE lMedium;
BYTE lExtra;
BYTE lTotal;
#endif
} TPacketCGRefine;
typedef struct SPacketCGRequestRefineInfo
{
BYTE header;
UINT pos;
} TPacketCGRequestRefineInfo;
typedef struct SPacketGCRefineInformaion
{
BYTE header;
BYTE type;
UINT 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 pakcet_view_equip
{
BYTE header;
DWORD vid;
struct
{
DWORD vnum;
BYTE count;
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
}
#ifdef EQUIP_ENABLE_VIEW_SASH
equips[17];
#else
equips[16];
#endif
} 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;
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 WJ_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 ENABLE_SHOP_SEARCH_SYSTEM
typedef struct packet_priv_shop_item_set
{
BYTE header;
DWORD vnum;
DWORD vid;
BYTE count;
DWORD flags;
DWORD anti_flags;
long long price;
int price_cheque;
BYTE display_pos;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
} TPacketGCShopSearchItemSet;
typedef struct command_shop_search
{
BYTE header;
WORD Race;
int ItemCat;
int SubCat;
int MinLevel;
int MaxLevel;
int MinRefine;
int MaxRefine;
unsigned long long MinGold;
unsigned long long MaxGold;
int MinWon;
int MaxWon;
char ItemName[SHOP_TAB_NAME_MAX + 1];
} TPacketCGShopSearch;
typedef struct command_shop_search_buy
{
BYTE header;
int32_t shopVid;
BYTE shopItemPos;
} TPacketCGShopSearchBuy;
#endif
#pragma pack()
#endif
#pragma once
#include "../gamelib/RaceData.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,
HEADER_CG_ITEM_DROP2 = 20,
#ifdef WJ_NEW_DROP_DIALOG
HEADER_CG_ITEM_DESTROY = 21,
HEADER_CG_ITEM_SELL = 22,
#endif
//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_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,
//HEADER_CG_SHOP2 = 56,
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 = 109,
HEADER_CG_DUNGEON = 110,
HEADER_CG_LOGIN3 = 238,
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 : 실행시 받은 인증키를 서버에 보냄.
#if defined(WJ_COMBAT_ZONE)
HEADER_CG_COMBAT_ZONE_REQUEST_ACTION = 117,
#endif
#ifdef ENABLE_ADMIN_BAN_MANAGER
HEADER_CG_ADMIN_BAN_MANAGER = 123,
#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 ENABLE_SHOP_SEARCH_SYSTEM
HEADER_CG_SHOP_SEARCH = 210,
HEADER_CG_SHOP_SEARCH_SUB = 211,
HEADER_CG_SHOP_SEARCH_BUY = 212,
#endif
#ifdef __AUCTION__
HEADER_CG_AUCTION_CMD = 205,
#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_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_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,
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
#if defined(WJ_COMBAT_ZONE)
HEADER_GC_RANKING_COMBAT_ZONE = 139,
HEADER_GC_SEND_COMBAT_ZONE = 140,
#endif
#ifdef TOURNAMENT_PVP_SYSTEM
HEADER_GC_TOURNAMENT_ADD = 145,
#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
#ifdef ENABLE_SHOP_SEARCH_SYSTEM
HEADER_GC_SHOPSEARCH_SET = 170,
#endif
HEADER_GC_SPECIFIC_EFFECT = 208,
HEADER_GC_DRAGON_SOUL_REFINE = 209,
HEADER_GC_RESPOND_CHANNELSTATUS = 210,
HEADER_GC_KEY_AGREEMENT_COMPLETED = 0xfa, // _IMPROVED_PACKET_ENCRYPTION_
HEADER_GC_KEY_AGREEMENT = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_
HEADER_GC_HANDSHAKE_OK = 0xfc, // 252
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 = 4,
PLAYER_PER_ACCOUNT4 = 5,
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 = 50,
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,
WEAR_MAX_NUM = 11,
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];
DWORD security_key[5];
char cHWInfo[255 + 1];
} TPacketCGLogin3;
#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;
#ifdef WJ_NEW_DROP_DIALOG
typedef struct command_item_destroy
{
BYTE header;
TItemPos pos;
} TPacketCGItemDestroy;
typedef struct command_item_sell
{
BYTE header;
TItemPos pos;
} TPacketCGItemSell;
#endif
typedef struct command_item_drop2
{
BYTE header;
TItemPos pos;
DWORD gold;
BYTE count;
} TPacketCGItemDrop2;
typedef struct command_item_move
{
BYTE header;
TItemPos pos;
TItemPos change_pos;
BYTE num;
} TPacketCGItemMove;
typedef struct command_item_pickup
{
BYTE header;
DWORD vid;
} TPacketCGItemPickUp;
typedef struct command_quickslot_add
{
BYTE header;
UINT pos;
TQuickSlot slot;
}TPacketCGQuickSlotAdd;
typedef struct command_quickslot_del
{
BYTE header;
UINT pos;
}TPacketCGQuickSlotDel;
typedef struct command_quickslot_swap
{
BYTE header;
UINT pos;
UINT 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,
SHOP_SUBHEADER_CG_CHANGE_EDIT_TIME,
SHOP_SUBHEADER_CG_ADD_ITEM,
SHOP_SUBHEADER_CG_REMOVE_ITEM,
SHOP_SUBHEADER_CG_CHANGE_PRICE,
SHOP_SUBHEADER_CG_REFRESH,
SHOP_SUBHEADER_CG_REFRESH_MONEY,
SHOP_SUBHEADER_CG_WITHDRAW_MONEY,
SHOP_SUBHEADER_CG_REFRESH_UNSOLD_ITEMS,
SHOP_SUBHEADER_CG_TAKE_ITEM,
SHOP_SUBHEADER_CG_CHECK,
};
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
#ifdef ENABLE_CHEQUE_SYSTEM
EXCHANGE_SUBHEADER_CG_CHEQUE_ADD, /* arg1 == amount of cheque */
#endif
EXCHANGE_SUBHEADER_CG_ACCEPT, // arg1 == not used
EXCHANGE_SUBHEADER_CG_CANCEL, // arg1 == not used
};
typedef struct command_exchange
{
BYTE header;
BYTE subheader;
DWORD arg1;
BYTE arg2;
TItemPos Pos;
} TPacketCGExchange;
typedef struct command_position
{
BYTE header;
BYTE position;
} TPacketCGPosition;
typedef struct command_script_answer
{
BYTE header;
BYTE answer;
} 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
{
#ifdef ENABLE_MESSENGER_BLOCK
MESSENGER_SUBHEADER_GC_BLOCK_LIST,
MESSENGER_SUBHEADER_GC_BLOCK_LOGIN,
MESSENGER_SUBHEADER_GC_BLOCK_LOGOUT,
MESSENGER_SUBHEADER_GC_BLOCK_INVITE,//not used
#endif
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;
#ifdef ENABLE_MESSENGER_BLOCK
typedef struct packet_messenger_block_list_offline
{
BYTE connected; // always 0
BYTE length;
} TPacketGCMessengerBlockListOffline;
typedef struct packet_messenger_block_list_online
{
BYTE connected; // always 1
BYTE length;
} TPacketGCMessengerBlockListOnline;
#endif
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
{
#ifdef ENABLE_MESSENGER_BLOCK
MESSENGER_SUBHEADER_CG_ADD_BLOCK_BY_VID,
MESSENGER_SUBHEADER_CG_ADD_BLOCK_BY_NAME,
MESSENGER_SUBHEADER_CG_REMOVE_BLOCK,
#endif
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;
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;
TItemPos pos; // PC 상점에만 이용
DWORD price; // PC 상점에만 이용
DWORD price_cheque;
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
#endif
BYTE display_pos; // PC 상점에만 이용, 보일 위치.
} TShopItemTable;
typedef struct SShopItemTable2
{
DWORD vnum;
BYTE count;
TItemPos pos; // PC 상점에만 이용
DWORD price; // PC 상점에만 이용
DWORD price_cheque;
BYTE display_pos; // PC 상점에만 이용, 보일 위치.
} TShopItemTable2;
typedef struct SPacketCGMyShop
{
BYTE bHeader;
char szSign[SHOP_SIGN_MAX_LEN + 1];
int bCount; // count of TShopItemTable, max 39
#ifdef ENABLE_OFFLINE_SHOP
BYTE days;
#endif
#ifdef ENABLE_SHOP_DECORATION_SYSTEM
DWORD dwKasmirNpc;
BYTE bKasmirBaslik;
#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;
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 wMainPart;
BYTE bChangeName;
WORD wHairPart;
WORD wAccePart;
BYTE bDummy[4];
long x, y;
LONG lAddr;
WORD wPort;
BYTE bySkillGroup;
long lWarPoint;
} 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;
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;
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 TOURNAMENT_PVP_SYSTEM
PK_MODE_TEAM_A,
PK_MODE_TEAM_B,
#endif
PK_MODE_MAX_NUM,
};
// 2004.11.20.myevan.CRaceData:
ART_MAX_NUM 사용안하게 수정 - 서버에서 사용하는것과 일치하지 않음
enum ECharacterEquipmentPart
{
CHR_EQUIPPART_ARMOR,
CHR_EQUIPPART_WEAPON,
CHR_EQUIPPART_HEAD,
CHR_EQUIPPART_HAIR,
CHR_EQUIPPART_ACCE,
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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
BYTE bPKMode;
#if defined(WJ_COMBAT_ZONE)
BYTE combat_zone_rank;
#endif
DWORD dwMountVnum;
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
} TPacketGCCharacterAdditionalInfo;
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_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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
#ifdef NEW_PET_SYSTEM
DWORD dwLevel;
#endif
BYTE bPKMode;
DWORD dwMountVnum;
BYTE dwNewIsGuildName;
DWORD m_dwWeaponEvolution;
} 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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
DWORD dwLevel;
BYTE bPKMode;
#if defined(WJ_COMBAT_ZONE)
DWORD combat_zone_points;
#endif
DWORD dwMountVnum;
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
#ifdef WJ_SECURITY_SYSTEM
bool bActivateSecurity;
#endif
#ifdef ENABLE_AUTO_HUNT_SYSTEM
bool bAutoHuntStaus;
#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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
BYTE bPKMode;
DWORD dwMountVnum;
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
#ifdef WJ_SECURITY_SYSTEM
bool bActivateSecurity;
#endif
} TPacketGCCharacterUpdate2;
typedef struct packet_del_char
{
BYTE header;
DWORD dwVID;
} TPacketGCCharacterDelete;
#ifdef ENABLE_SHOW_CHEST_DROP
enum
{
HEADER_CG_CHEST_DROP_INFO = 215,
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
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;
#if defined(WJ_COMBAT_ZONE)
enum EPacketCGCombatZoneSubHeaderType
{
COMBAT_ZONE_SUB_HEADER_NONE,
COMBAT_ZONE_SUB_HEADER_ADD_LEAVING_TARGET,
COMBAT_ZONE_SUB_HEADER_REMOVE_LEAVING_TARGET,
COMBAT_ZONE_SUB_HEADER_FLASH_ON_MINIMAP,
COMBAT_ZONE_SUB_HEADER_OPEN_RANKING,
COMBAT_ZONE_SUB_HEADER_REFRESH_SHOP,
};
typedef struct SPacketCGCombatZoneRequestAction
{
BYTE header;
int action;
int value;
} TPacketCGCombatZoneRequestAction;
typedef struct SPacketGCCombatZoneRanking
{
int rank;
char name[12 + 1];
int empire;
int points;
} TPacketGCCombatZoneRanking;
typedef struct SPacketGCCombatZoneRankingData
{
BYTE header;
TPacketGCCombatZoneRanking rankingData[11];
} TPacketGCCombatZoneRankingData;
typedef struct SPacketGCSendCombatZone
{
BYTE header;
DWORD sub_header;
DWORD m_pInfoData[4];
DWORD m_pDataDays[7][8];
bool isRunning;
} TPacketGCSendCombatZone;
#endif
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_SKILL_PASV,
// POINT_SKILL_ACTIVE,
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_UNUSED0,
POINT_ATTBONUS_UNUSED1,
POINT_ATTBONUS_UNUSED2,
POINT_ATTBONUS_UNUSED3,
POINT_ATTBONUS_UNUSED4,
POINT_ATTBONUS_UNUSED5,
POINT_ATTBONUS_UNUSED6,
POINT_ATTBONUS_UNUSED7,
POINT_ATTBONUS_UNUSED8,
POINT_ATTBONUS_UNUSED9,
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_MIN_WEP = 200,
#ifdef ELEMENT_NEW_BONUSES
POINT_ATTBONUS_ELEC,
POINT_ATTBONUS_WIND,
POINT_ATTBONUS_EARTH,
POINT_ATTBONUS_DARK,
#endif
POINT_MAX_WEP,
POINT_MIN_MAGIC_WEP,
POINT_MAX_MAGIC_WEP,
POINT_HIT_RATE,
POINT_BLEEDING_PCT = 138,
POINT_BLEEDING_REDUCE = 139,
#ifdef __GAYA__
POINT_GAYA = 175,
#endif
POINT_WAR_POINT = 144,
#ifdef ENABLE_CHEQUE_SYSTEM
POINT_CHEQUE = 145,
#endif
};
typedef struct packet_points
{
BYTE header;
long points[POINT_MAX_NUM];
} TPacketGCPoints;
typedef struct packet_point_change
{
int header;
DWORD dwVID;
BYTE Type;
long amount; // 바뀐 값
long value; // 현재 값
} 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;
DWORD evolution;
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 evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
DWORD flags; // 플래그 추가
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCItemSet;
typedef struct packet_item_del
{
BYTE header;
UINT pos;
} TPacketGCItemDel;
#else
typedef struct packet_set_item
{
BYTE header;
TItemPos Cell;
DWORD vnum;
BYTE count;
DWORD evolution;
#ifdef WJ_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;
DWORD evolution;
#ifdef WJ_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];
#ifdef ENABLE_SOULBIND_SYSTEM
long sealbind;
#endif
} TPacketGCItemSet2;
#endif
typedef struct packet_item_del
{
BYTE header;
UINT 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;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
#ifdef ENABLE_SOULBIND_SYSTEM
long sealbind;
#endif
} TPacketGCItemUpdate;
typedef struct packet_ground_add_item
{
BYTE bHeader;
long lX;
long lY;
long lZ;
DWORD dwVID;
DWORD dwVnum;
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
DWORD count;
} 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;
UINT pos;
TQuickSlot slot;
} TPacketGCQuickSlotAdd;
typedef struct packet_quickslot_del
{
BYTE header;
UINT pos;
} TPacketGCQuickSlotDel;
typedef struct packet_quickslot_swap
{
BYTE header;
UINT pos;
UINT change_pos;
} TPacketGCQuickSlotSwap;
typedef struct packet_shop_start
{
DWORD owner_vid;
struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
char shop_name[SHOP_TAB_NAME_MAX];
short price_type;
#endif
} 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;
#if defined(WJ_COMBAT_ZONE)
DWORD points;
DWORD curLimit;
DWORD maxLimit;
#endif
} TPacketGCShopStartEx;
typedef struct packet_shop_update_item
{
BYTE pos;
struct packet_shop_item item;
} TPacketGCShopUpdateItem;
typedef struct packet_shop_update_price
{
int iElkAmount;
} 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,
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,
#if defined(WJ_COMBAT_ZONE)
SHOP_SUBHEADER_GC_NOT_ENOUGH_POINTS,
SHOP_SUBHEADER_GC_MAX_LIMIT_POINTS,
SHOP_SUBHEADER_GC_OVERFLOW_LIMIT_POINTS,
#endif
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
SHOP_SUBHEADER_GC_NOT_ENOUGH_DRAGON_COIN,
SHOP_SUBHEADER_GC_NOT_ENOUGH_DRAGON_MARK,
SHOP_SUBHEADER_GC_NOT_ENOUGH_ALIGNMENT,
SHOP_SUBHEADER_GC_NOT_ENOUGH_WARPOINT,
SHOP_SUBHEADER_GC_NOT_ENOUGH_10TH_GOLD,
#endif
SHOP_SUBHEADER_GC_UPDATE_MONEY,
};
typedef struct packet_shop
{
BYTE header;
WORD size;
BYTE subheader;
} TPacketGCShop;
typedef struct packet_exchange
{
BYTE header;
BYTE subheader;
BYTE is_me;
DWORD arg1;
TItemPos arg2;
DWORD arg3;
#ifdef WJ_ENABLE_TRADABLE_ICON
TItemPos arg4;
#endif
long alValues[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD dwTransmutation;
#endif
} 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
#ifdef ENABLE_CHEQUE_SYSTEM
EXCHANGE_SUBHEADER_GC_CHEQUE_ADD, /* arg1 == cheque */
#endif
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
#ifdef ENABLE_CHEQUE_SYSTEM
EXCHANGE_SUBHEADER_GC_LESS_CHEQUE, /* arg1 == not used */
#endif
};
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
#ifdef ELEMENT_TARGET
BYTE bElement;
#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;
#ifdef TOURNAMENT_PVP_SYSTEM
typedef struct packet_tournament_add
{
BYTE header;
int membersOnline_A;
int membersOnline_B;
int membersDead_A;
int membersDead_B;
int memberLives;
int dwTimeRemained;
} TPacketGCTournamentAdd;
#endif
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;
#ifdef __IMPROVED_GUILD_WAR__
int iMaxPlayer;
int iMaxScore;
DWORD flags;
int custom_map_index;
#endif
} 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;
#ifdef ENABLE_SHOP_DECORATION_SYSTEM
BYTE bShopKasmirTitle;
#endif
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;
UINT pos;
TRefineTable refine_table;
} TPacketGCRefineInformation;
typedef struct SPacketGCRefineInformationNew
{
BYTE header;
BYTE type;
UINT 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) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
#if defined(WJ_COMBAT_ZONE)
SE_COMBAT_ZONE_POTION,
#endif
#ifdef VERSION_162_ENABLED
SE_EFFECT_HEALER,
#endif
SE_EQUIP_RUZGAR,
SE_DUEL_VICTIM_EFFECT,
SE_DUEL_KILLER_EFFECT,
SE_DUEL_SENDER,
SE_DUEL_RECEIVER,
SE_DUEL_5,
SE_DUEL_4,
SE_DUEL_3,
SE_DUEL_2,
SE_DUEL_1,
SE_DUEL_0,
SE_ACCE_SUCCEDED_1,
SE_EQUIP_ACCE_1,
SE_EQUIP_ACCE_2,
SE_EQUIP_ACCE_3,
SE_EQUIP_ACCE_4,
};
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),
BLOCK_POINT_EXP = (1 << 6),
};
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_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;
#ifdef EQUIP_ENABLE_VIEW_SASH
TEquipmentItemSet equips[17];
#else
TEquipmentItemSet equips[16];
#endif
} 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(WJ_COMBAT_ZONE)
CREATE_TARGET_TYPE_COMBAT_ZONE = 4,
#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 SPacketGCHybridCryptKeys
{
private:
SPacketGCHybridCryptKeys() : m_pStream(NULL) {}
public:
SPacketGCHybridCryptKeys(int iStreamSize) : iKeyStreamLen(iStreamSize)
{
m_pStream = new BYTE[iStreamSize];
}
~SPacketGCHybridCryptKeys()
{
if( m_pStream )
{
delete[] m_pStream;
m_pStream = NULL;
}
}
static int GetFixedHeaderSize()
{
return sizeof(BYTE)+sizeof(WORD)+sizeof(int);
}
BYTE bHeader;
WORD wDynamicPacketSize;
int iKeyStreamLen;
BYTE* m_pStream;
} TPacketGCHybridCryptKeys;
typedef struct SPacketGCHybridSDB
{
private:
SPacketGCHybridSDB() : m_pStream(NULL) {}
public:
SPacketGCHybridSDB(int iStreamSize) : iSDBStreamLen(iStreamSize)
{
m_pStream = new BYTE[iStreamSize];
}
~SPacketGCHybridSDB()
{
delete[] m_pStream;
m_pStream = NULL;
}
static int GetFixedHeaderSize()
{
return sizeof(BYTE)+sizeof(WORD)+sizeof(int);
}
BYTE bHeader;
WORD wDynamicPacketSize;
int iSDBStreamLen;
BYTE* m_pStream;
} TPacketGCHybridSDB;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Client To Client
typedef struct packet_state
{
BYTE bHeader;
BYTE bFunc;
BYTE bArg;
BYTE bRot;
DWORD dwVID;
DWORD dwTime;
TPixelPosition kPPos;
} TPacketCCState;
// 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_
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;
typedef struct SChannelStatus
{
short nPort;
BYTE bStatus;
} TChannelStatus;
#ifdef WJ_CHANGELOOK_SYSTEM
enum EChangeLookInfo
{
CL_WINDOW_MAX_MATERIALS = 3,
CL_CLEAN_ATTR_VALUE0 = 8,
CL_SCROLL_VNUM = 72326,
};
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_SHOP_SEARCH_SYSTEM
typedef struct packet_priv_shop_item_set
{
BYTE header;
DWORD vnum;
DWORD vid;
BYTE count;
DWORD flags;
DWORD anti_flags;
long long price;
int price_cheque;
BYTE display_pos;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCShopSearchItemSet;
typedef struct command_shop_search
{
BYTE header;
WORD Race;
int ItemCat;
int SubCat;
int MinLevel;
int MaxLevel;
int MinRefine;
int MaxRefine;
unsigned long long MinGold;
unsigned long long MaxGold;
int MinWon;
int MaxWon;
char ItemName[SHOP_TAB_NAME_MAX + 1];
} TPacketCGShopSearch;
typedef struct command_shop_search_buy
{
BYTE header;
int32_t shopVid;
BYTE shopItemPos;
} TPacketCGShopSearchBuy;
#endif
#pragma pack(pop)
#include "../gamelib/RaceData.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,
HEADER_CG_ITEM_DROP2 = 20,
#ifdef WJ_NEW_DROP_DIALOG
HEADER_CG_ITEM_DESTROY = 21,
HEADER_CG_ITEM_SELL = 22,
#endif
//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_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,
//HEADER_CG_SHOP2 = 56,
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 = 109,
HEADER_CG_DUNGEON = 110,
HEADER_CG_LOGIN3 = 238,
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 : 실행시 받은 인증키를 서버에 보냄.
#if defined(WJ_COMBAT_ZONE)
HEADER_CG_COMBAT_ZONE_REQUEST_ACTION = 117,
#endif
#ifdef ENABLE_ADMIN_BAN_MANAGER
HEADER_CG_ADMIN_BAN_MANAGER = 123,
#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 ENABLE_SHOP_SEARCH_SYSTEM
HEADER_CG_SHOP_SEARCH = 210,
HEADER_CG_SHOP_SEARCH_SUB = 211,
HEADER_CG_SHOP_SEARCH_BUY = 212,
#endif
#ifdef __AUCTION__
HEADER_CG_AUCTION_CMD = 205,
#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_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_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,
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
#if defined(WJ_COMBAT_ZONE)
HEADER_GC_RANKING_COMBAT_ZONE = 139,
HEADER_GC_SEND_COMBAT_ZONE = 140,
#endif
#ifdef TOURNAMENT_PVP_SYSTEM
HEADER_GC_TOURNAMENT_ADD = 145,
#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
#ifdef ENABLE_SHOP_SEARCH_SYSTEM
HEADER_GC_SHOPSEARCH_SET = 170,
#endif
HEADER_GC_SPECIFIC_EFFECT = 208,
HEADER_GC_DRAGON_SOUL_REFINE = 209,
HEADER_GC_RESPOND_CHANNELSTATUS = 210,
HEADER_GC_KEY_AGREEMENT_COMPLETED = 0xfa, // _IMPROVED_PACKET_ENCRYPTION_
HEADER_GC_KEY_AGREEMENT = 0xfb, // _IMPROVED_PACKET_ENCRYPTION_
HEADER_GC_HANDSHAKE_OK = 0xfc, // 252
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 = 4,
PLAYER_PER_ACCOUNT4 = 5,
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 = 50,
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,
WEAR_MAX_NUM = 11,
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];
DWORD security_key[5];
char cHWInfo[255 + 1];
} TPacketCGLogin3;
#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;
#ifdef WJ_NEW_DROP_DIALOG
typedef struct command_item_destroy
{
BYTE header;
TItemPos pos;
} TPacketCGItemDestroy;
typedef struct command_item_sell
{
BYTE header;
TItemPos pos;
} TPacketCGItemSell;
#endif
typedef struct command_item_drop2
{
BYTE header;
TItemPos pos;
DWORD gold;
BYTE count;
} TPacketCGItemDrop2;
typedef struct command_item_move
{
BYTE header;
TItemPos pos;
TItemPos change_pos;
BYTE num;
} TPacketCGItemMove;
typedef struct command_item_pickup
{
BYTE header;
DWORD vid;
} TPacketCGItemPickUp;
typedef struct command_quickslot_add
{
BYTE header;
UINT pos;
TQuickSlot slot;
}TPacketCGQuickSlotAdd;
typedef struct command_quickslot_del
{
BYTE header;
UINT pos;
}TPacketCGQuickSlotDel;
typedef struct command_quickslot_swap
{
BYTE header;
UINT pos;
UINT 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,
SHOP_SUBHEADER_CG_CHANGE_EDIT_TIME,
SHOP_SUBHEADER_CG_ADD_ITEM,
SHOP_SUBHEADER_CG_REMOVE_ITEM,
SHOP_SUBHEADER_CG_CHANGE_PRICE,
SHOP_SUBHEADER_CG_REFRESH,
SHOP_SUBHEADER_CG_REFRESH_MONEY,
SHOP_SUBHEADER_CG_WITHDRAW_MONEY,
SHOP_SUBHEADER_CG_REFRESH_UNSOLD_ITEMS,
SHOP_SUBHEADER_CG_TAKE_ITEM,
SHOP_SUBHEADER_CG_CHECK,
};
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
#ifdef ENABLE_CHEQUE_SYSTEM
EXCHANGE_SUBHEADER_CG_CHEQUE_ADD, /* arg1 == amount of cheque */
#endif
EXCHANGE_SUBHEADER_CG_ACCEPT, // arg1 == not used
EXCHANGE_SUBHEADER_CG_CANCEL, // arg1 == not used
};
typedef struct command_exchange
{
BYTE header;
BYTE subheader;
DWORD arg1;
BYTE arg2;
TItemPos Pos;
} TPacketCGExchange;
typedef struct command_position
{
BYTE header;
BYTE position;
} TPacketCGPosition;
typedef struct command_script_answer
{
BYTE header;
BYTE answer;
} 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
{
#ifdef ENABLE_MESSENGER_BLOCK
MESSENGER_SUBHEADER_GC_BLOCK_LIST,
MESSENGER_SUBHEADER_GC_BLOCK_LOGIN,
MESSENGER_SUBHEADER_GC_BLOCK_LOGOUT,
MESSENGER_SUBHEADER_GC_BLOCK_INVITE,//not used
#endif
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;
#ifdef ENABLE_MESSENGER_BLOCK
typedef struct packet_messenger_block_list_offline
{
BYTE connected; // always 0
BYTE length;
} TPacketGCMessengerBlockListOffline;
typedef struct packet_messenger_block_list_online
{
BYTE connected; // always 1
BYTE length;
} TPacketGCMessengerBlockListOnline;
#endif
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
{
#ifdef ENABLE_MESSENGER_BLOCK
MESSENGER_SUBHEADER_CG_ADD_BLOCK_BY_VID,
MESSENGER_SUBHEADER_CG_ADD_BLOCK_BY_NAME,
MESSENGER_SUBHEADER_CG_REMOVE_BLOCK,
#endif
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;
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;
TItemPos pos; // PC 상점에만 이용
DWORD price; // PC 상점에만 이용
DWORD price_cheque;
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
#endif
BYTE display_pos; // PC 상점에만 이용, 보일 위치.
} TShopItemTable;
typedef struct SShopItemTable2
{
DWORD vnum;
BYTE count;
TItemPos pos; // PC 상점에만 이용
DWORD price; // PC 상점에만 이용
DWORD price_cheque;
BYTE display_pos; // PC 상점에만 이용, 보일 위치.
} TShopItemTable2;
typedef struct SPacketCGMyShop
{
BYTE bHeader;
char szSign[SHOP_SIGN_MAX_LEN + 1];
int bCount; // count of TShopItemTable, max 39
#ifdef ENABLE_OFFLINE_SHOP
BYTE days;
#endif
#ifdef ENABLE_SHOP_DECORATION_SYSTEM
DWORD dwKasmirNpc;
BYTE bKasmirBaslik;
#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;
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 wMainPart;
BYTE bChangeName;
WORD wHairPart;
WORD wAccePart;
BYTE bDummy[4];
long x, y;
LONG lAddr;
WORD wPort;
BYTE bySkillGroup;
long lWarPoint;
} 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;
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;
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 TOURNAMENT_PVP_SYSTEM
PK_MODE_TEAM_A,
PK_MODE_TEAM_B,
#endif
PK_MODE_MAX_NUM,
};
// 2004.11.20.myevan.CRaceData:
ART_MAX_NUM 사용안하게 수정 - 서버에서 사용하는것과 일치하지 않음enum ECharacterEquipmentPart
{
CHR_EQUIPPART_ARMOR,
CHR_EQUIPPART_WEAPON,
CHR_EQUIPPART_HEAD,
CHR_EQUIPPART_HAIR,
CHR_EQUIPPART_ACCE,
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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
BYTE bPKMode;
#if defined(WJ_COMBAT_ZONE)
BYTE combat_zone_rank;
#endif
DWORD dwMountVnum;
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
} TPacketGCCharacterAdditionalInfo;
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_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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
#ifdef NEW_PET_SYSTEM
DWORD dwLevel;
#endif
BYTE bPKMode;
DWORD dwMountVnum;
BYTE dwNewIsGuildName;
DWORD m_dwWeaponEvolution;
} 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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
DWORD dwLevel;
BYTE bPKMode;
#if defined(WJ_COMBAT_ZONE)
DWORD combat_zone_points;
#endif
DWORD dwMountVnum;
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
#ifdef WJ_SECURITY_SYSTEM
bool bActivateSecurity;
#endif
#ifdef ENABLE_AUTO_HUNT_SYSTEM
bool bAutoHuntStaus;
#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 ENABLE_REBORN_SYSTEM
short sReborn;
#endif
#ifdef ENABLE_TITLE_SYSTEM
short sPrestige;
#endif
BYTE bPKMode;
DWORD dwMountVnum;
BYTE dwNewIsGuildName;
DWORD dwWeaponEvolution;
#ifdef WJ_SECURITY_SYSTEM
bool bActivateSecurity;
#endif
} TPacketGCCharacterUpdate2;
typedef struct packet_del_char
{
BYTE header;
DWORD dwVID;
} TPacketGCCharacterDelete;
#ifdef ENABLE_SHOW_CHEST_DROP
enum
{
HEADER_CG_CHEST_DROP_INFO = 215,
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
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;
#if defined(WJ_COMBAT_ZONE)
enum EPacketCGCombatZoneSubHeaderType
{
COMBAT_ZONE_SUB_HEADER_NONE,
COMBAT_ZONE_SUB_HEADER_ADD_LEAVING_TARGET,
COMBAT_ZONE_SUB_HEADER_REMOVE_LEAVING_TARGET,
COMBAT_ZONE_SUB_HEADER_FLASH_ON_MINIMAP,
COMBAT_ZONE_SUB_HEADER_OPEN_RANKING,
COMBAT_ZONE_SUB_HEADER_REFRESH_SHOP,
};
typedef struct SPacketCGCombatZoneRequestAction
{
BYTE header;
int action;
int value;
} TPacketCGCombatZoneRequestAction;
typedef struct SPacketGCCombatZoneRanking
{
int rank;
char name[12 + 1];
int empire;
int points;
} TPacketGCCombatZoneRanking;
typedef struct SPacketGCCombatZoneRankingData
{
BYTE header;
TPacketGCCombatZoneRanking rankingData[11];
} TPacketGCCombatZoneRankingData;
typedef struct SPacketGCSendCombatZone
{
BYTE header;
DWORD sub_header;
DWORD m_pInfoData[4];
DWORD m_pDataDays[7][8];
bool isRunning;
} TPacketGCSendCombatZone;
#endif
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_SKILL_PASV,
// POINT_SKILL_ACTIVE,
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_UNUSED0,
POINT_ATTBONUS_UNUSED1,
POINT_ATTBONUS_UNUSED2,
POINT_ATTBONUS_UNUSED3,
POINT_ATTBONUS_UNUSED4,
POINT_ATTBONUS_UNUSED5,
POINT_ATTBONUS_UNUSED6,
POINT_ATTBONUS_UNUSED7,
POINT_ATTBONUS_UNUSED8,
POINT_ATTBONUS_UNUSED9,
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_MIN_WEP = 200,
#ifdef ELEMENT_NEW_BONUSES
POINT_ATTBONUS_ELEC,
POINT_ATTBONUS_WIND,
POINT_ATTBONUS_EARTH,
POINT_ATTBONUS_DARK,
#endif
POINT_MAX_WEP,
POINT_MIN_MAGIC_WEP,
POINT_MAX_MAGIC_WEP,
POINT_HIT_RATE,
POINT_BLEEDING_PCT = 138,
POINT_BLEEDING_REDUCE = 139,
#ifdef __GAYA__
POINT_GAYA = 175,
#endif
POINT_WAR_POINT = 144,
#ifdef ENABLE_CHEQUE_SYSTEM
POINT_CHEQUE = 145,
#endif
};
typedef struct packet_points
{
BYTE header;
long points[POINT_MAX_NUM];
} TPacketGCPoints;
typedef struct packet_point_change
{
int header;
DWORD dwVID;
BYTE Type;
long amount; // 바뀐 값
long value; // 현재 값
} 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;
DWORD evolution;
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 evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
DWORD flags; // 플래그 추가
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCItemSet;
typedef struct packet_item_del
{
BYTE header;
UINT pos;
} TPacketGCItemDel;
#else
typedef struct packet_set_item
{
BYTE header;
TItemPos Cell;
DWORD vnum;
BYTE count;
DWORD evolution;
#ifdef WJ_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;
DWORD evolution;
#ifdef WJ_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];
#ifdef ENABLE_SOULBIND_SYSTEM
long sealbind;
#endif
} TPacketGCItemSet2;
#endif
typedef struct packet_item_del
{
BYTE header;
UINT 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;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
#ifdef ENABLE_SOULBIND_SYSTEM
long sealbind;
#endif
} TPacketGCItemUpdate;
typedef struct packet_ground_add_item
{
BYTE bHeader;
long lX;
long lY;
long lZ;
DWORD dwVID;
DWORD dwVnum;
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
DWORD count;
} 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;
UINT pos;
TQuickSlot slot;
} TPacketGCQuickSlotAdd;
typedef struct packet_quickslot_del
{
BYTE header;
UINT pos;
} TPacketGCQuickSlotDel;
typedef struct packet_quickslot_swap
{
BYTE header;
UINT pos;
UINT change_pos;
} TPacketGCQuickSlotSwap;
typedef struct packet_shop_start
{
DWORD owner_vid;
struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
char shop_name[SHOP_TAB_NAME_MAX];
short price_type;
#endif
} 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;
#if defined(WJ_COMBAT_ZONE)
DWORD points;
DWORD curLimit;
DWORD maxLimit;
#endif
} TPacketGCShopStartEx;
typedef struct packet_shop_update_item
{
BYTE pos;
struct packet_shop_item item;
} TPacketGCShopUpdateItem;
typedef struct packet_shop_update_price
{
int iElkAmount;
} 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,
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,
#if defined(WJ_COMBAT_ZONE)
SHOP_SUBHEADER_GC_NOT_ENOUGH_POINTS,
SHOP_SUBHEADER_GC_MAX_LIMIT_POINTS,
SHOP_SUBHEADER_GC_OVERFLOW_LIMIT_POINTS,
#endif
#ifdef ENABLE_2TH_SHOPEX_SYSTEM
SHOP_SUBHEADER_GC_NOT_ENOUGH_DRAGON_COIN,
SHOP_SUBHEADER_GC_NOT_ENOUGH_DRAGON_MARK,
SHOP_SUBHEADER_GC_NOT_ENOUGH_ALIGNMENT,
SHOP_SUBHEADER_GC_NOT_ENOUGH_WARPOINT,
SHOP_SUBHEADER_GC_NOT_ENOUGH_10TH_GOLD,
#endif
SHOP_SUBHEADER_GC_UPDATE_MONEY,
};
typedef struct packet_shop
{
BYTE header;
WORD size;
BYTE subheader;
} TPacketGCShop;
typedef struct packet_exchange
{
BYTE header;
BYTE subheader;
BYTE is_me;
DWORD arg1;
TItemPos arg2;
DWORD arg3;
#ifdef WJ_ENABLE_TRADABLE_ICON
TItemPos arg4;
#endif
long alValues[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD dwTransmutation;
#endif
} 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
#ifdef ENABLE_CHEQUE_SYSTEM
EXCHANGE_SUBHEADER_GC_CHEQUE_ADD, /* arg1 == cheque */
#endif
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
#ifdef ENABLE_CHEQUE_SYSTEM
EXCHANGE_SUBHEADER_GC_LESS_CHEQUE, /* arg1 == not used */
#endif
};
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
#ifdef ELEMENT_TARGET
BYTE bElement;
#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;
#ifdef TOURNAMENT_PVP_SYSTEM
typedef struct packet_tournament_add
{
BYTE header;
int membersOnline_A;
int membersOnline_B;
int membersDead_A;
int membersDead_B;
int memberLives;
int dwTimeRemained;
} TPacketGCTournamentAdd;
#endif
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;
#ifdef __IMPROVED_GUILD_WAR__
int iMaxPlayer;
int iMaxScore;
DWORD flags;
int custom_map_index;
#endif
} 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;
#ifdef ENABLE_SHOP_DECORATION_SYSTEM
BYTE bShopKasmirTitle;
#endif
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;
UINT pos;
TRefineTable refine_table;
} TPacketGCRefineInformation;
typedef struct SPacketGCRefineInformationNew
{
BYTE header;
BYTE type;
UINT 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) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
#if defined(WJ_COMBAT_ZONE)
SE_COMBAT_ZONE_POTION,
#endif
#ifdef VERSION_162_ENABLED
SE_EFFECT_HEALER,
#endif
SE_EQUIP_RUZGAR,
SE_DUEL_VICTIM_EFFECT,
SE_DUEL_KILLER_EFFECT,
SE_DUEL_SENDER,
SE_DUEL_RECEIVER,
SE_DUEL_5,
SE_DUEL_4,
SE_DUEL_3,
SE_DUEL_2,
SE_DUEL_1,
SE_DUEL_0,
SE_ACCE_SUCCEDED_1,
SE_EQUIP_ACCE_1,
SE_EQUIP_ACCE_2,
SE_EQUIP_ACCE_3,
SE_EQUIP_ACCE_4,
};
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),
BLOCK_POINT_EXP = (1 << 6),
};
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_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;
#ifdef EQUIP_ENABLE_VIEW_SASH
TEquipmentItemSet equips[17];
#else
TEquipmentItemSet equips[16];
#endif
} 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(WJ_COMBAT_ZONE)
CREATE_TARGET_TYPE_COMBAT_ZONE = 4,
#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 SPacketGCHybridCryptKeys
{
private:
SPacketGCHybridCryptKeys() : m_pStream(NULL) {}
public:
SPacketGCHybridCryptKeys(int iStreamSize) : iKeyStreamLen(iStreamSize)
{
m_pStream = new BYTE[iStreamSize];
}
~SPacketGCHybridCryptKeys()
{
if( m_pStream )
{
delete[] m_pStream;
m_pStream = NULL;
}
}
static int GetFixedHeaderSize()
{
return sizeof(BYTE)+sizeof(WORD)+sizeof(int);
}
BYTE bHeader;
WORD wDynamicPacketSize;
int iKeyStreamLen;
BYTE* m_pStream;
} TPacketGCHybridCryptKeys;
typedef struct SPacketGCHybridSDB
{
private:
SPacketGCHybridSDB() : m_pStream(NULL) {}
public:
SPacketGCHybridSDB(int iStreamSize) : iSDBStreamLen(iStreamSize)
{
m_pStream = new BYTE[iStreamSize];
}
~SPacketGCHybridSDB()
{
delete[] m_pStream;
m_pStream = NULL;
}
static int GetFixedHeaderSize()
{
return sizeof(BYTE)+sizeof(WORD)+sizeof(int);
}
BYTE bHeader;
WORD wDynamicPacketSize;
int iSDBStreamLen;
BYTE* m_pStream;
} TPacketGCHybridSDB;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Client To Client
typedef struct packet_state
{
BYTE bHeader;
BYTE bFunc;
BYTE bArg;
BYTE bRot;
DWORD dwVID;
DWORD dwTime;
TPixelPosition kPPos;
} TPacketCCState;
// 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_
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;
typedef struct SChannelStatus
{
short nPort;
BYTE bStatus;
} TChannelStatus;
#ifdef WJ_CHANGELOOK_SYSTEM
enum EChangeLookInfo
{
CL_WINDOW_MAX_MATERIALS = 3,
CL_CLEAN_ATTR_VALUE0 = 8,
CL_SCROLL_VNUM = 72326,
};
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_SHOP_SEARCH_SYSTEM
typedef struct packet_priv_shop_item_set
{
BYTE header;
DWORD vnum;
DWORD vid;
BYTE count;
DWORD flags;
DWORD anti_flags;
long long price;
int price_cheque;
BYTE display_pos;
DWORD evolution;
#ifdef WJ_CHANGELOOK_SYSTEM
DWORD transmutation;
#endif
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCShopSearchItemSet;
typedef struct command_shop_search
{
BYTE header;
WORD Race;
int ItemCat;
int SubCat;
int MinLevel;
int MaxLevel;
int MinRefine;
int MaxRefine;
unsigned long long MinGold;
unsigned long long MaxGold;
int MinWon;
int MaxWon;
char ItemName[SHOP_TAB_NAME_MAX + 1];
} TPacketCGShopSearch;
typedef struct command_shop_search_buy
{
BYTE header;
int32_t shopVid;
BYTE shopItemPos;
} TPacketCGShopSearchBuy;
#endif
#pragma pack(pop)

