2628 lines
61 KiB
C++
2628 lines
61 KiB
C++
#pragma once
|
|
#include "StdAfx.h"
|
|
#include "GameType.h"
|
|
|
|
#include <cstdint>
|
|
|
|
// Control-plane structs + headers (shared with EterLib/NetStream base class)
|
|
#include "EterLib/ControlPackets.h"
|
|
|
|
//
|
|
// Packet header constants (uint16_t)
|
|
//
|
|
// Packet framing: [header:2] [length:2] [payload...]
|
|
// - header: one of the constants below
|
|
// - length: total packet size including header+length (minimum 4)
|
|
// - payload: packet-specific data
|
|
//
|
|
// Ranges:
|
|
// 0x0001-0x00FF Control (handshake, phase, ping, key exchange)
|
|
// 0x0100-0x01FF Authentication (login, auth, empire)
|
|
// 0x0200-0x02FF Character (create, delete, select, stats)
|
|
// 0x0300-0x03FF Movement (move, sync, warp)
|
|
// 0x0400-0x04FF Combat (attack, skill, damage, pvp)
|
|
// 0x0500-0x05FF Items (use, drop, move, exchange, refine)
|
|
// 0x0600-0x06FF Chat (chat, whisper)
|
|
// 0x0700-0x07FF Social (party, guild, messenger)
|
|
// 0x0800-0x08FF Shop/Trade (shop, safebox, mall)
|
|
// 0x0900-0x09FF Quest (script, quest confirm)
|
|
// 0x0A00-0x0AFF UI/Effect (target, affect, effects)
|
|
// 0x0B00-0x0BFF World (dungeon, fishing, land, time)
|
|
// 0x0C00-0x0CFF Guild Marks
|
|
//
|
|
|
|
// Packet header type (used by dispatch/registration systems)
|
|
typedef uint16_t TPacketHeader;
|
|
|
|
// Minimum packet size: header(2) + length(2)
|
|
constexpr uint16_t PACKET_HEADER_SIZE = 4;
|
|
|
|
// ============================================================================
|
|
// CG -- Client -> Game
|
|
// ============================================================================
|
|
namespace CG
|
|
{
|
|
// Control (PONG, KEY_RESPONSE moved to EterLib/ControlPackets.h)
|
|
constexpr uint16_t CLIENT_VERSION = 0x000D;
|
|
constexpr uint16_t STATE_CHECKER = 0x000F;
|
|
constexpr uint16_t TEXT = 0x0011;
|
|
|
|
// Authentication
|
|
constexpr uint16_t LOGIN2 = 0x0101;
|
|
constexpr uint16_t LOGIN3 = 0x0102;
|
|
constexpr uint16_t LOGIN_SECURE = 0x0103;
|
|
constexpr uint16_t EMPIRE = 0x010A;
|
|
constexpr uint16_t CHANGE_NAME = 0x010B;
|
|
|
|
// Character
|
|
constexpr uint16_t CHARACTER_CREATE = 0x0201;
|
|
constexpr uint16_t CHARACTER_DELETE = 0x0202;
|
|
constexpr uint16_t CHARACTER_SELECT = 0x0203;
|
|
constexpr uint16_t ENTERGAME = 0x0204;
|
|
|
|
// Movement
|
|
constexpr uint16_t MOVE = 0x0301;
|
|
constexpr uint16_t SYNC_POSITION = 0x0303;
|
|
constexpr uint16_t WARP = 0x0305;
|
|
|
|
// Combat
|
|
constexpr uint16_t ATTACK = 0x0401;
|
|
constexpr uint16_t USE_SKILL = 0x0402;
|
|
constexpr uint16_t SHOOT = 0x0403;
|
|
constexpr uint16_t FLY_TARGETING = 0x0404;
|
|
constexpr uint16_t ADD_FLY_TARGETING = 0x0405;
|
|
|
|
// Items
|
|
constexpr uint16_t ITEM_USE = 0x0501;
|
|
constexpr uint16_t ITEM_DROP = 0x0502;
|
|
constexpr uint16_t ITEM_DROP2 = 0x0503;
|
|
constexpr uint16_t ITEM_MOVE = 0x0504;
|
|
constexpr uint16_t ITEM_PICKUP = 0x0505;
|
|
constexpr uint16_t ITEM_USE_TO_ITEM = 0x0506;
|
|
constexpr uint16_t ITEM_GIVE = 0x0507;
|
|
constexpr uint16_t EXCHANGE = 0x0508;
|
|
constexpr uint16_t QUICKSLOT_ADD = 0x0509;
|
|
constexpr uint16_t QUICKSLOT_DEL = 0x050A;
|
|
constexpr uint16_t QUICKSLOT_SWAP = 0x050B;
|
|
constexpr uint16_t REFINE = 0x050C;
|
|
constexpr uint16_t DRAGON_SOUL_REFINE = 0x050D;
|
|
|
|
// Chat
|
|
constexpr uint16_t CHAT = 0x0601;
|
|
constexpr uint16_t WHISPER = 0x0602;
|
|
|
|
// Social
|
|
constexpr uint16_t PARTY_INVITE = 0x0701;
|
|
constexpr uint16_t PARTY_INVITE_ANSWER = 0x0702;
|
|
constexpr uint16_t PARTY_REMOVE = 0x0703;
|
|
constexpr uint16_t PARTY_SET_STATE = 0x0704;
|
|
constexpr uint16_t PARTY_USE_SKILL = 0x0705;
|
|
constexpr uint16_t PARTY_PARAMETER = 0x0706;
|
|
constexpr uint16_t GUILD = 0x0720;
|
|
constexpr uint16_t ANSWER_MAKE_GUILD = 0x0721;
|
|
constexpr uint16_t GUILD_SYMBOL_UPLOAD = 0x0722;
|
|
constexpr uint16_t SYMBOL_CRC = 0x0723;
|
|
constexpr uint16_t MESSENGER = 0x0740;
|
|
|
|
// Shop / Safebox / Mall
|
|
constexpr uint16_t SHOP = 0x0801;
|
|
constexpr uint16_t MYSHOP = 0x0802;
|
|
constexpr uint16_t SAFEBOX_CHECKIN = 0x0820;
|
|
constexpr uint16_t SAFEBOX_CHECKOUT = 0x0821;
|
|
constexpr uint16_t SAFEBOX_ITEM_MOVE = 0x0822;
|
|
constexpr uint16_t MALL_CHECKOUT = 0x0840;
|
|
|
|
// Quest
|
|
constexpr uint16_t SCRIPT_ANSWER = 0x0901;
|
|
constexpr uint16_t SCRIPT_BUTTON = 0x0902;
|
|
constexpr uint16_t SCRIPT_SELECT_ITEM = 0x0903;
|
|
constexpr uint16_t QUEST_INPUT_STRING = 0x0904;
|
|
constexpr uint16_t QUEST_CONFIRM = 0x0905;
|
|
constexpr uint16_t QUEST_CANCEL = 0x0906;
|
|
|
|
// UI / Targeting
|
|
constexpr uint16_t TARGET = 0x0A01;
|
|
constexpr uint16_t ON_CLICK = 0x0A02;
|
|
constexpr uint16_t CHARACTER_POSITION = 0x0A60;
|
|
|
|
// World
|
|
constexpr uint16_t FISHING = 0x0B01;
|
|
constexpr uint16_t DUNGEON = 0x0B02;
|
|
constexpr uint16_t HACK = 0x0B03;
|
|
|
|
// Guild Marks
|
|
constexpr uint16_t MARK_LOGIN = 0x0C01;
|
|
constexpr uint16_t MARK_CRCLIST = 0x0C02;
|
|
constexpr uint16_t MARK_UPLOAD = 0x0C03;
|
|
constexpr uint16_t MARK_IDXLIST = 0x0C04;
|
|
}
|
|
|
|
// ============================================================================
|
|
// GC -- Game -> Client
|
|
// ============================================================================
|
|
namespace GC
|
|
{
|
|
// Control (PING, PHASE, KEY_CHALLENGE, KEY_COMPLETE moved to EterLib/ControlPackets.h)
|
|
constexpr uint16_t RESPOND_CHANNELSTATUS = 0x0010;
|
|
|
|
// Authentication
|
|
constexpr uint16_t LOGIN_SUCCESS3 = 0x0104;
|
|
constexpr uint16_t LOGIN_SUCCESS4 = 0x0105;
|
|
constexpr uint16_t LOGIN_FAILURE = 0x0106;
|
|
constexpr uint16_t LOGIN_KEY = 0x0107;
|
|
constexpr uint16_t AUTH_SUCCESS = 0x0108;
|
|
constexpr uint16_t EMPIRE = 0x0109;
|
|
constexpr uint16_t CHANGE_NAME = 0x010C;
|
|
|
|
// Character
|
|
constexpr uint16_t CHARACTER_ADD = 0x0205;
|
|
constexpr uint16_t CHARACTER_ADD2 = 0x0206;
|
|
constexpr uint16_t CHAR_ADDITIONAL_INFO = 0x0207;
|
|
constexpr uint16_t CHARACTER_DEL = 0x0208;
|
|
constexpr uint16_t CHARACTER_UPDATE = 0x0209;
|
|
constexpr uint16_t CHARACTER_UPDATE2 = 0x020A;
|
|
constexpr uint16_t CHARACTER_POSITION = 0x020B;
|
|
constexpr uint16_t PLAYER_CREATE_SUCCESS = 0x020C;
|
|
constexpr uint16_t PLAYER_CREATE_FAILURE = 0x020D;
|
|
constexpr uint16_t PLAYER_DELETE_SUCCESS = 0x020E;
|
|
constexpr uint16_t PLAYER_DELETE_WRONG_SOCIAL_ID = 0x020F;
|
|
constexpr uint16_t MAIN_CHARACTER = 0x0210;
|
|
constexpr uint16_t PLAYER_POINTS = 0x0214;
|
|
constexpr uint16_t PLAYER_POINT_CHANGE = 0x0215;
|
|
constexpr uint16_t STUN = 0x0216;
|
|
constexpr uint16_t DEAD = 0x0217;
|
|
constexpr uint16_t CHANGE_SPEED = 0x0218;
|
|
constexpr uint16_t WALK_MODE = 0x0219;
|
|
constexpr uint16_t SKILL_LEVEL = 0x021A;
|
|
constexpr uint16_t SKILL_LEVEL_NEW = 0x021B;
|
|
constexpr uint16_t SKILL_COOLTIME_END = 0x021C;
|
|
constexpr uint16_t CHANGE_SKILL_GROUP = 0x021D;
|
|
constexpr uint16_t VIEW_EQUIP = 0x021E;
|
|
|
|
// Movement
|
|
constexpr uint16_t MOVE = 0x0302;
|
|
constexpr uint16_t SYNC_POSITION = 0x0304;
|
|
constexpr uint16_t WARP = 0x0306;
|
|
constexpr uint16_t MOTION = 0x0307;
|
|
constexpr uint16_t DIG_MOTION = 0x0308;
|
|
|
|
// Combat
|
|
constexpr uint16_t DAMAGE_INFO = 0x0410;
|
|
constexpr uint16_t FLY_TARGETING = 0x0411;
|
|
constexpr uint16_t ADD_FLY_TARGETING = 0x0412;
|
|
constexpr uint16_t CREATE_FLY = 0x0413;
|
|
constexpr uint16_t PVP = 0x0414;
|
|
constexpr uint16_t DUEL_START = 0x0415;
|
|
|
|
// Items
|
|
constexpr uint16_t ITEM_DEL = 0x0510;
|
|
constexpr uint16_t ITEM_SET = 0x0511;
|
|
constexpr uint16_t ITEM_USE = 0x0512;
|
|
constexpr uint16_t ITEM_DROP = 0x0513;
|
|
constexpr uint16_t ITEM_UPDATE = 0x0514;
|
|
constexpr uint16_t ITEM_GROUND_ADD = 0x0515;
|
|
constexpr uint16_t ITEM_GROUND_DEL = 0x0516;
|
|
constexpr uint16_t ITEM_OWNERSHIP = 0x0517;
|
|
constexpr uint16_t ITEM_GET = 0x0518;
|
|
constexpr uint16_t QUICKSLOT_ADD = 0x0519;
|
|
constexpr uint16_t QUICKSLOT_DEL = 0x051A;
|
|
constexpr uint16_t QUICKSLOT_SWAP = 0x051B;
|
|
constexpr uint16_t EXCHANGE = 0x051C;
|
|
constexpr uint16_t REFINE_INFORMATION = 0x051D;
|
|
constexpr uint16_t REFINE_INFORMATION_NEW = 0x051E;
|
|
constexpr uint16_t DRAGON_SOUL_REFINE = 0x051F;
|
|
|
|
// Chat
|
|
constexpr uint16_t CHAT = 0x0603;
|
|
constexpr uint16_t WHISPER = 0x0604;
|
|
|
|
// Social
|
|
constexpr uint16_t PARTY_INVITE = 0x0710;
|
|
constexpr uint16_t PARTY_ADD = 0x0711;
|
|
constexpr uint16_t PARTY_UPDATE = 0x0712;
|
|
constexpr uint16_t PARTY_REMOVE = 0x0713;
|
|
constexpr uint16_t PARTY_LINK = 0x0714;
|
|
constexpr uint16_t PARTY_UNLINK = 0x0715;
|
|
constexpr uint16_t PARTY_PARAMETER = 0x0716;
|
|
constexpr uint16_t GUILD = 0x0730;
|
|
constexpr uint16_t REQUEST_MAKE_GUILD = 0x0731;
|
|
constexpr uint16_t SYMBOL_DATA = 0x0732;
|
|
constexpr uint16_t MESSENGER = 0x0741;
|
|
constexpr uint16_t LOVER_INFO = 0x0750;
|
|
constexpr uint16_t LOVE_POINT_UPDATE = 0x0751;
|
|
|
|
// Shop / Safebox / Mall
|
|
constexpr uint16_t SHOP = 0x0810;
|
|
constexpr uint16_t SHOP_SIGN = 0x0811;
|
|
constexpr uint16_t SAFEBOX_SET = 0x0830;
|
|
constexpr uint16_t SAFEBOX_DEL = 0x0831;
|
|
constexpr uint16_t SAFEBOX_WRONG_PASSWORD = 0x0832;
|
|
constexpr uint16_t SAFEBOX_SIZE = 0x0833;
|
|
constexpr uint16_t SAFEBOX_MONEY_CHANGE = 0x0834;
|
|
constexpr uint16_t MALL_OPEN = 0x0841;
|
|
constexpr uint16_t MALL_SET = 0x0842;
|
|
constexpr uint16_t MALL_DEL = 0x0843;
|
|
|
|
// Quest
|
|
constexpr uint16_t SCRIPT = 0x0910;
|
|
constexpr uint16_t QUEST_CONFIRM = 0x0911;
|
|
constexpr uint16_t QUEST_INFO = 0x0912;
|
|
|
|
// UI / Effects / Targeting
|
|
constexpr uint16_t TARGET = 0x0A10;
|
|
constexpr uint16_t TARGET_UPDATE = 0x0A11;
|
|
constexpr uint16_t TARGET_DELETE = 0x0A12;
|
|
constexpr uint16_t TARGET_CREATE_NEW = 0x0A13;
|
|
constexpr uint16_t AFFECT_ADD = 0x0A20;
|
|
constexpr uint16_t AFFECT_REMOVE = 0x0A21;
|
|
constexpr uint16_t SEPCIAL_EFFECT = 0x0A30;
|
|
constexpr uint16_t SPECIFIC_EFFECT = 0x0A31;
|
|
constexpr uint16_t MOUNT = 0x0A40;
|
|
constexpr uint16_t OWNERSHIP = 0x0A41;
|
|
constexpr uint16_t NPC_POSITION = 0x0A50;
|
|
|
|
// World
|
|
constexpr uint16_t FISHING = 0x0B10;
|
|
constexpr uint16_t DUNGEON = 0x0B11;
|
|
constexpr uint16_t LAND_LIST = 0x0B12;
|
|
constexpr uint16_t TIME = 0x0B13;
|
|
constexpr uint16_t CHANNEL = 0x0B14;
|
|
constexpr uint16_t MARK_UPDATE = 0x0B15;
|
|
constexpr uint16_t OBSERVER_ADD = 0x0B20;
|
|
constexpr uint16_t OBSERVER_REMOVE = 0x0B21;
|
|
constexpr uint16_t OBSERVER_MOVE = 0x0B22;
|
|
|
|
// Guild Marks
|
|
constexpr uint16_t MARK_BLOCK = 0x0C10;
|
|
constexpr uint16_t MARK_IDXLIST = 0x0C11;
|
|
constexpr uint16_t MARK_DIFF_DATA = 0x0C12;
|
|
}
|
|
|
|
// --- Phase constants ---
|
|
|
|
enum EPhases
|
|
{
|
|
PHASE_CLOSE,
|
|
PHASE_HANDSHAKE,
|
|
PHASE_LOGIN,
|
|
PHASE_SELECT,
|
|
PHASE_LOADING,
|
|
PHASE_GAME,
|
|
PHASE_DEAD,
|
|
|
|
PHASE_CLIENT_CONNECTING,
|
|
PHASE_DBCLIENT,
|
|
PHASE_P2P,
|
|
PHASE_AUTH,
|
|
};
|
|
|
|
// ============================================================================
|
|
// Subheader enums — grouped by feature
|
|
// ============================================================================
|
|
|
|
namespace GuildSub {
|
|
namespace CG { enum : uint8_t {
|
|
ADD_MEMBER,
|
|
REMOVE_MEMBER,
|
|
CHANGE_GRADE_NAME,
|
|
CHANGE_GRADE_AUTHORITY,
|
|
OFFER,
|
|
POST_COMMENT,
|
|
DELETE_COMMENT,
|
|
REFRESH_COMMENT,
|
|
CHANGE_MEMBER_GRADE,
|
|
USE_SKILL,
|
|
CHANGE_MEMBER_GENERAL,
|
|
GUILD_INVITE_ANSWER,
|
|
CHARGE_GSP,
|
|
DEPOSIT_MONEY,
|
|
WITHDRAW_MONEY,
|
|
}; }
|
|
namespace GC { enum : uint8_t {
|
|
LOGIN,
|
|
LOGOUT,
|
|
LIST,
|
|
GRADE,
|
|
ADD,
|
|
REMOVE,
|
|
GRADE_NAME,
|
|
GRADE_AUTH,
|
|
INFO,
|
|
COMMENTS,
|
|
CHANGE_EXP,
|
|
CHANGE_MEMBER_GRADE,
|
|
SKILL_INFO,
|
|
CHANGE_MEMBER_GENERAL,
|
|
GUILD_INVITE,
|
|
WAR,
|
|
GUILD_NAME,
|
|
GUILD_WAR_LIST,
|
|
GUILD_WAR_END_LIST,
|
|
WAR_POINT,
|
|
MONEY_CHANGE,
|
|
}; }
|
|
}
|
|
|
|
namespace ShopSub {
|
|
namespace CG { enum : uint8_t {
|
|
END,
|
|
BUY,
|
|
SELL,
|
|
SELL2,
|
|
}; }
|
|
namespace GC { enum : uint8_t {
|
|
START,
|
|
END,
|
|
UPDATE_ITEM,
|
|
UPDATE_PRICE,
|
|
OK,
|
|
NOT_ENOUGH_MONEY,
|
|
SOLDOUT,
|
|
INVENTORY_FULL,
|
|
INVALID_POS,
|
|
SOLD_OUT,
|
|
START_EX,
|
|
NOT_ENOUGH_MONEY_EX,
|
|
}; }
|
|
}
|
|
|
|
namespace ExchangeSub {
|
|
namespace CG { enum : uint8_t {
|
|
START,
|
|
ITEM_ADD,
|
|
ITEM_DEL,
|
|
ELK_ADD,
|
|
ACCEPT,
|
|
CANCEL,
|
|
}; }
|
|
namespace GC { enum : uint8_t {
|
|
START,
|
|
ITEM_ADD,
|
|
ITEM_DEL,
|
|
ELK_ADD,
|
|
ACCEPT,
|
|
END,
|
|
ALREADY,
|
|
LESS_ELK,
|
|
}; }
|
|
}
|
|
|
|
namespace MessengerSub {
|
|
namespace CG { enum : uint8_t {
|
|
ADD_BY_VID,
|
|
ADD_BY_NAME,
|
|
REMOVE,
|
|
}; }
|
|
namespace GC { enum : uint8_t {
|
|
LIST,
|
|
LOGIN,
|
|
LOGOUT,
|
|
INVITE,
|
|
REMOVE_FRIEND,
|
|
}; }
|
|
}
|
|
|
|
namespace FishingSub {
|
|
namespace GC { enum : uint8_t {
|
|
START,
|
|
STOP,
|
|
REACT,
|
|
SUCCESS,
|
|
FAIL,
|
|
FISH,
|
|
}; }
|
|
}
|
|
|
|
namespace DungeonSub {
|
|
namespace GC { enum : uint8_t {
|
|
TIME_ATTACK_START = 0,
|
|
DESTINATION_POSITION = 1,
|
|
}; }
|
|
}
|
|
|
|
namespace DragonSoulSub { enum : uint8_t {
|
|
OPEN,
|
|
CLOSE,
|
|
DO_UPGRADE,
|
|
DO_IMPROVEMENT,
|
|
DO_REFINE,
|
|
REFINE_FAIL,
|
|
REFINE_FAIL_MAX_REFINE,
|
|
REFINE_FAIL_INVALID_MATERIAL,
|
|
REFINE_FAIL_NOT_ENOUGH_MONEY,
|
|
REFINE_FAIL_NOT_ENOUGH_MATERIAL,
|
|
REFINE_FAIL_TOO_MUCH_MATERIAL,
|
|
REFINE_SUCCEED,
|
|
}; }
|
|
|
|
enum
|
|
{
|
|
ID_MAX_NUM = 30,
|
|
PASS_MAX_NUM = 16,
|
|
CHAT_MAX_NUM = 128,
|
|
PATH_NODE_MAX_NUM = 64,
|
|
SHOP_SIGN_MAX_LEN = 32,
|
|
|
|
PLAYER_PER_ACCOUNT3 = 3,
|
|
PLAYER_PER_ACCOUNT4 = 4,
|
|
|
|
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 = 40,
|
|
|
|
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
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t handle;
|
|
uint32_t random_key;
|
|
} TPacketCGMarkLogin;
|
|
|
|
typedef struct command_mark_upload
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t gid;
|
|
uint8_t image[16*12*4];
|
|
} TPacketCGMarkUpload;
|
|
|
|
typedef struct command_mark_idxlist
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketCGMarkIDXList;
|
|
|
|
typedef struct command_mark_crclist
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t imgIdx;
|
|
uint32_t crclist[80];
|
|
} TPacketCGMarkCRCList;
|
|
|
|
typedef struct packet_mark_idxlist
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t bufSize;
|
|
uint16_t count;
|
|
//뒤에 size * (uint16_t + uint16_t)만큼 데이터 붙음
|
|
} TPacketGCMarkIDXList;
|
|
|
|
typedef struct packet_mark_block
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t bufSize;
|
|
uint8_t imgIdx;
|
|
uint32_t count;
|
|
// 뒤에 64 x 48 x 픽셀크기(4바이트) = 12288만큼 데이터 붙음
|
|
} TPacketGCMarkBlock;
|
|
|
|
typedef struct packet_mark_update
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t guildID;
|
|
uint16_t imgIdx;
|
|
} TPacketGCMarkUpdate;
|
|
|
|
typedef struct command_symbol_upload
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t handle;
|
|
} TPacketCGSymbolUpload;
|
|
|
|
typedef struct command_symbol_crc
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwGuildID;
|
|
uint32_t dwCRC;
|
|
uint32_t dwSize;
|
|
} TPacketCGSymbolCRC;
|
|
|
|
typedef struct packet_symbol_data
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t guild_id;
|
|
} TPacketGCGuildSymbolData;
|
|
|
|
//
|
|
//
|
|
//
|
|
typedef struct packet_observer_add
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
uint16_t x;
|
|
uint16_t y;
|
|
} TPacketGCObserverAdd;
|
|
|
|
typedef struct packet_observer_move
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
uint16_t x;
|
|
uint16_t y;
|
|
} TPacketGCObserverMove;
|
|
|
|
|
|
typedef struct packet_observer_remove
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
} TPacketGCObserverRemove;
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// To Server
|
|
|
|
typedef struct command_checkin
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char name[ID_MAX_NUM+1];
|
|
char pwd[PASS_MAX_NUM+1];
|
|
} TPacketCGCheckin;
|
|
|
|
// start - 권한 서버 접속을 위한 패킷들
|
|
typedef struct command_login2
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char name[ID_MAX_NUM + 1];
|
|
uint32_t login_key;
|
|
} TPacketCGLogin2;
|
|
|
|
typedef struct command_login3
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char name[ID_MAX_NUM + 1];
|
|
char pwd[PASS_MAX_NUM + 1];
|
|
} TPacketCGLogin3;
|
|
|
|
typedef struct command_direct_enter
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char login[ID_MAX_NUM + 1];
|
|
char passwd[PASS_MAX_NUM + 1];
|
|
uint8_t index;
|
|
} TPacketCGDirectEnter;
|
|
|
|
typedef struct command_player_select
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t player_index;
|
|
} TPacketCGSelectCharacter;
|
|
|
|
typedef struct command_attack
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bType; // 공격 유형
|
|
uint32_t dwVictimVID; // 적 VID
|
|
uint8_t bCRCMagicCubeProcPiece;
|
|
uint8_t bCRCMagicCubeFilePiece;
|
|
} TPacketCGAttack;
|
|
|
|
typedef struct command_chat
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t type;
|
|
} TPacketCGChat;
|
|
|
|
typedef struct command_whisper
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char szNameTo[CHARACTER_NAME_MAX_LEN + 1];
|
|
} TPacketCGWhisper;
|
|
|
|
enum EBattleMode
|
|
{
|
|
BATTLEMODE_ATTACK = 0,
|
|
BATTLEMODE_DEFENSE = 1,
|
|
};
|
|
|
|
typedef struct command_EnterFrontGame
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketCGEnterFrontGame;
|
|
|
|
typedef struct command_item_use
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TItemPos pos;
|
|
} TPacketCGItemUse;
|
|
|
|
typedef struct command_item_use_to_item
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TItemPos source_pos;
|
|
TItemPos target_pos;
|
|
} TPacketCGItemUseToItem;
|
|
|
|
typedef struct command_item_drop
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TItemPos pos;
|
|
uint32_t elk;
|
|
} TPacketCGItemDrop;
|
|
|
|
typedef struct command_item_drop2
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TItemPos pos;
|
|
uint32_t gold;
|
|
uint8_t count;
|
|
} TPacketCGItemDrop2;
|
|
|
|
typedef struct command_item_move
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TItemPos pos;
|
|
TItemPos change_pos;
|
|
uint8_t num;
|
|
} TPacketCGItemMove;
|
|
|
|
typedef struct command_item_pickup
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
} TPacketCGItemPickUp;
|
|
|
|
typedef struct command_quickslot_add
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t pos;
|
|
TQuickSlot slot;
|
|
}TPacketCGQuickSlotAdd;
|
|
|
|
typedef struct command_quickslot_del
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t pos;
|
|
}TPacketCGQuickSlotDel;
|
|
|
|
typedef struct command_quickslot_swap
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t pos;
|
|
uint8_t change_pos;
|
|
}TPacketCGQuickSlotSwap;
|
|
|
|
typedef struct command_on_click
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
} TPacketCGOnClick;
|
|
|
|
|
|
typedef struct command_shop
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t subheader;
|
|
} TPacketCGShop;
|
|
|
|
typedef struct command_exchange
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t subheader;
|
|
uint32_t arg1;
|
|
uint8_t arg2;
|
|
TItemPos Pos;
|
|
} TPacketCGExchange;
|
|
|
|
typedef struct command_position
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t position;
|
|
} TPacketCGPosition;
|
|
|
|
typedef struct command_script_answer
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t answer;
|
|
} TPacketCGScriptAnswer;
|
|
|
|
typedef struct command_script_button
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t idx;
|
|
} TPacketCGScriptButton;
|
|
|
|
typedef struct command_target
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
} TPacketCGTarget;
|
|
|
|
typedef struct command_move
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bFunc;
|
|
uint8_t bArg;
|
|
uint8_t bRot;
|
|
int32_t lX; // Signed to match server (can be negative coordinates)
|
|
int32_t lY; // Signed to match server
|
|
uint32_t dwTime;
|
|
} TPacketCGMove;
|
|
|
|
typedef struct command_sync_position_element
|
|
{
|
|
uint32_t dwVID;
|
|
int32_t lX;
|
|
int32_t lY;
|
|
} TPacketCGSyncPositionElement;
|
|
|
|
typedef struct command_sync_position
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketCGSyncPosition;
|
|
|
|
typedef struct command_fly_targeting
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwTargetVID;
|
|
int32_t lX;
|
|
int32_t lY;
|
|
} TPacketCGFlyTargeting;
|
|
|
|
typedef struct packet_fly_targeting
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwShooterVID;
|
|
uint32_t dwTargetVID;
|
|
int32_t lX;
|
|
int32_t lY;
|
|
} TPacketGCFlyTargeting;
|
|
|
|
typedef struct packet_shoot
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bType;
|
|
} TPacketCGShoot;
|
|
|
|
typedef struct command_warp
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketCGWarp;
|
|
|
|
typedef struct packet_messenger
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t subheader;
|
|
} TPacketGCMessenger;
|
|
|
|
typedef struct packet_messenger_list_offline
|
|
{
|
|
uint8_t connected; // always 0
|
|
uint8_t length;
|
|
} TPacketGCMessengerListOffline;
|
|
|
|
enum
|
|
{
|
|
MESSENGER_CONNECTED_STATE_OFFLINE,
|
|
MESSENGER_CONNECTED_STATE_ONLINE,
|
|
};
|
|
|
|
typedef struct packet_messenger_list_online
|
|
{
|
|
uint8_t connected;
|
|
uint8_t length;
|
|
//uint8_t length_char_name;
|
|
} TPacketGCMessengerListOnline;
|
|
|
|
typedef struct packet_messenger_login
|
|
{
|
|
//uint8_t length_login;
|
|
//uint8_t length_char_name;
|
|
uint8_t length;
|
|
} TPacketGCMessengerLogin;
|
|
|
|
typedef struct packet_messenger_logout
|
|
{
|
|
uint8_t length;
|
|
} TPacketGCMessengerLogout;
|
|
|
|
typedef struct command_messenger
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t subheader;
|
|
} TPacketCGMessenger;
|
|
|
|
typedef struct command_messenger_remove
|
|
{
|
|
uint8_t length;
|
|
} TPacketCGMessengerRemove;
|
|
|
|
enum
|
|
{
|
|
SAFEBOX_MONEY_STATE_SAVE,
|
|
SAFEBOX_MONEY_STATE_WITHDRAW,
|
|
};
|
|
|
|
typedef struct command_safebox_money
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bState;
|
|
uint32_t dwMoney;
|
|
} TPacketCGSafeboxMoney;
|
|
|
|
typedef struct command_safebox_checkout
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bSafePos;
|
|
TItemPos ItemPos;
|
|
} TPacketCGSafeboxCheckout;
|
|
|
|
typedef struct command_safebox_checkin
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bSafePos;
|
|
TItemPos ItemPos;
|
|
} TPacketCGSafeboxCheckin;
|
|
|
|
typedef struct command_mall_checkout
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bMallPos;
|
|
TItemPos ItemPos;
|
|
} TPacketCGMallCheckout;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
// Party
|
|
|
|
typedef struct command_use_skill
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVnum;
|
|
uint32_t dwTargetVID;
|
|
} TPacketCGUseSkill;
|
|
|
|
typedef struct command_party_invite
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
} TPacketCGPartyInvite;
|
|
|
|
typedef struct command_party_invite_answer
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t leader_pid;
|
|
uint8_t accept;
|
|
} TPacketCGPartyInviteAnswer;
|
|
|
|
typedef struct command_party_remove
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t pid;
|
|
} TPacketCGPartyRemove;
|
|
|
|
typedef struct command_party_set_state
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
uint8_t byState;
|
|
uint8_t byFlag;
|
|
} TPacketCGPartySetState;
|
|
|
|
typedef struct packet_party_link
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t pid;
|
|
uint32_t vid;
|
|
} TPacketGCPartyLink;
|
|
|
|
typedef struct packet_party_unlink
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t pid;
|
|
uint32_t vid;
|
|
} TPacketGCPartyUnlink;
|
|
|
|
typedef struct command_party_use_skill
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bySkillIndex;
|
|
uint32_t dwTargetVID;
|
|
} TPacketCGPartyUseSkill;
|
|
|
|
typedef struct command_guild
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bySubHeader;
|
|
} TPacketCGGuild;
|
|
|
|
typedef struct command_guild_answer_make_guild
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char guild_name[GUILD_NAME_MAX_LEN+1];
|
|
} TPacketCGAnswerMakeGuild;
|
|
|
|
typedef struct command_give_item
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwTargetVID;
|
|
TItemPos ItemPos;
|
|
uint8_t byItemCount;
|
|
} TPacketCGGiveItem;
|
|
|
|
typedef struct SPacketCGHack
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char szBuf[255 + 1];
|
|
} TPacketCGHack;
|
|
|
|
typedef struct command_dungeon
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketCGDungeon;
|
|
|
|
// Private Shop
|
|
typedef struct SShopItemTable
|
|
{
|
|
uint32_t vnum;
|
|
uint8_t count;
|
|
|
|
TItemPos pos; // PC 상점에만 이용
|
|
uint32_t price; // PC 상점에만 이용
|
|
uint8_t display_pos; // PC 상점에만 이용, 보일 위치.
|
|
} TShopItemTable;
|
|
|
|
typedef struct SPacketCGMyShop
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char szSign[SHOP_SIGN_MAX_LEN + 1];
|
|
uint8_t bCount; // count of TShopItemTable, max 39
|
|
} TPacketCGMyShop;
|
|
|
|
typedef struct SPacketCGRefine
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t pos;
|
|
uint8_t type;
|
|
} TPacketCGRefine;
|
|
|
|
typedef struct SPacketCGChangeName
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t index;
|
|
char name[CHARACTER_NAME_MAX_LEN+1];
|
|
} TPacketCGChangeName;
|
|
|
|
typedef struct command_client_version
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char filename[32+1];
|
|
char timestamp[32+1];
|
|
} TPacketCGClientVersion;
|
|
|
|
typedef struct command_crc_report
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t byPackMode;
|
|
uint32_t dwBinaryCRC32;
|
|
uint32_t dwProcessCRC32;
|
|
uint32_t dwRootPackCRC32;
|
|
} TPacketCGCRCReport;
|
|
|
|
enum EPartyExpDistributionType
|
|
{
|
|
PARTY_EXP_DISTRIBUTION_NON_PARITY,
|
|
PARTY_EXP_DISTRIBUTION_PARITY,
|
|
};
|
|
|
|
typedef struct command_party_parameter
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bDistributeMode;
|
|
} TPacketCGPartyParameter;
|
|
|
|
typedef struct command_quest_input_string
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char szString[QUEST_INPUT_STRING_MAX_NUM+1];
|
|
} TPacketCGQuestInputString;
|
|
|
|
typedef struct command_quest_confirm
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t answer;
|
|
uint32_t requestPID;
|
|
} TPacketCGQuestConfirm;
|
|
|
|
typedef struct command_quest_cancel
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketCGQuestCancel;
|
|
|
|
typedef struct command_script_select_item
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t selection;
|
|
} TPacketCGScriptSelectItem;
|
|
|
|
|
|
// TPacketGCPhase moved to EterLib/ControlPackets.h
|
|
|
|
typedef struct packet_blank
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketGCBlank;
|
|
|
|
typedef TPacketGCBlank TPacketGCBlankDynamic;
|
|
|
|
typedef struct packet_header_dynamic_size
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TDynamicSizePacketHeader;
|
|
|
|
typedef struct SSimplePlayerInformation
|
|
{
|
|
uint32_t dwID;
|
|
char szName[CHARACTER_NAME_MAX_LEN + 1];
|
|
uint8_t byJob;
|
|
uint8_t byLevel;
|
|
uint32_t dwPlayMinutes;
|
|
uint8_t byST, byHT, byDX, byIQ;
|
|
// uint16_t wParts[CRaceData::PART_MAX_NUM];
|
|
uint16_t wMainPart;
|
|
uint8_t bChangeName;
|
|
uint16_t wHairPart;
|
|
uint8_t bDummy[4];
|
|
int32_t x, y;
|
|
uint32_t lAddr;
|
|
uint16_t wPort;
|
|
uint8_t bySkillGroup;
|
|
} TSimplePlayerInformation;
|
|
|
|
typedef struct packet_login_success3
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TSimplePlayerInformation akSimplePlayerInformation[PLAYER_PER_ACCOUNT3];
|
|
uint32_t guild_id[PLAYER_PER_ACCOUNT3];
|
|
char guild_name[PLAYER_PER_ACCOUNT3][GUILD_NAME_MAX_LEN+1];
|
|
uint32_t handle;
|
|
uint32_t random_key;
|
|
} TPacketGCLoginSuccess3;
|
|
|
|
typedef struct packet_login_success4
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TSimplePlayerInformation akSimplePlayerInformation[PLAYER_PER_ACCOUNT4];
|
|
uint32_t guild_id[PLAYER_PER_ACCOUNT4];
|
|
char guild_name[PLAYER_PER_ACCOUNT4][GUILD_NAME_MAX_LEN+1];
|
|
uint32_t handle;
|
|
uint32_t random_key;
|
|
} TPacketGCLoginSuccess4;
|
|
|
|
|
|
enum { LOGIN_STATUS_MAX_LEN = 8 };
|
|
typedef struct packet_login_failure
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char szStatus[LOGIN_STATUS_MAX_LEN + 1];
|
|
} TPacketGCLoginFailure;
|
|
|
|
typedef struct command_player_create
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t index;
|
|
char name[CHARACTER_NAME_MAX_LEN + 1];
|
|
uint16_t job;
|
|
uint8_t shape;
|
|
uint8_t CON;
|
|
uint8_t INT;
|
|
uint8_t STR;
|
|
uint8_t DEX;
|
|
} TPacketCGCreateCharacter;
|
|
|
|
typedef struct command_player_create_success
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bAccountCharacterSlot;
|
|
TSimplePlayerInformation kSimplePlayerInfomation;
|
|
} TPacketGCPlayerCreateSuccess;
|
|
|
|
typedef struct command_create_failure
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bType;
|
|
} TPacketGCCreateFailure;
|
|
|
|
typedef struct command_player_delete
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t index;
|
|
char szPrivateCode[PRIVATE_CODE_LENGTH];
|
|
} TPacketCGDestroyCharacter;
|
|
|
|
typedef struct packet_player_delete_success
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t 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,
|
|
PK_MODE_MAX_NUM,
|
|
};
|
|
|
|
// 2004.11.20.myevan.CRaceData::PART_MAX_NUM 사용안하게 수정 - 서버에서 사용하는것과 일치하지 않음
|
|
enum ECharacterEquipmentPart
|
|
{
|
|
CHR_EQUIPPART_ARMOR,
|
|
CHR_EQUIPPART_WEAPON,
|
|
CHR_EQUIPPART_HEAD,
|
|
CHR_EQUIPPART_HAIR,
|
|
|
|
CHR_EQUIPPART_NUM,
|
|
};
|
|
|
|
typedef struct packet_char_additional_info
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
char name[CHARACTER_NAME_MAX_LEN + 1];
|
|
uint16_t awPart[CHR_EQUIPPART_NUM];
|
|
uint8_t bEmpire;
|
|
uint32_t dwGuildID;
|
|
uint32_t dwLevel;
|
|
int16_t sAlignment; //선악치
|
|
uint8_t bPKMode;
|
|
uint32_t dwMountVnum;
|
|
} TPacketGCCharacterAdditionalInfo;
|
|
|
|
typedef struct packet_add_char
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
|
|
uint32_t dwVID;
|
|
|
|
//char name[CHARACTER_NAME_MAX_LEN + 1];
|
|
|
|
float angle;
|
|
int32_t x;
|
|
int32_t y;
|
|
int32_t z;
|
|
|
|
uint8_t bType;
|
|
uint16_t wRaceNum;
|
|
//uint16_t awPart[CHR_EQUIPPART_NUM];
|
|
uint8_t bMovingSpeed;
|
|
uint8_t bAttackSpeed;
|
|
|
|
uint8_t bStateFlag;
|
|
uint32_t dwAffectFlag[2]; // ??
|
|
//uint8_t bEmpire;
|
|
//uint32_t dwGuild;
|
|
//int16_t sAlignment;
|
|
//uint8_t bPKMode;
|
|
//uint32_t dwMountVnum;
|
|
} TPacketGCCharacterAdd;
|
|
|
|
typedef struct packet_add_char2
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
|
|
uint32_t dwVID;
|
|
|
|
char name[CHARACTER_NAME_MAX_LEN + 1];
|
|
|
|
float angle;
|
|
int32_t x;
|
|
int32_t y;
|
|
int32_t z;
|
|
|
|
uint8_t bType;
|
|
uint16_t wRaceNum;
|
|
uint16_t awPart[CHR_EQUIPPART_NUM];
|
|
uint8_t bMovingSpeed;
|
|
uint8_t bAttackSpeed;
|
|
|
|
uint8_t bStateFlag;
|
|
uint32_t dwAffectFlag[2]; // ??
|
|
uint8_t bEmpire;
|
|
|
|
uint32_t dwGuild;
|
|
int16_t sAlignment;
|
|
uint8_t bPKMode;
|
|
uint32_t dwMountVnum;
|
|
} TPacketGCCharacterAdd2;
|
|
|
|
typedef struct packet_update_char
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
|
|
uint16_t awPart[CHR_EQUIPPART_NUM];
|
|
uint8_t bMovingSpeed;
|
|
uint8_t bAttackSpeed;
|
|
|
|
uint8_t bStateFlag;
|
|
uint32_t dwAffectFlag[2];
|
|
|
|
uint32_t dwGuildID;
|
|
int16_t sAlignment;
|
|
uint8_t bPKMode;
|
|
uint32_t dwMountVnum;
|
|
} TPacketGCCharacterUpdate;
|
|
|
|
typedef struct packet_update_char2
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
|
|
uint16_t awPart[CHR_EQUIPPART_NUM];
|
|
uint8_t bMovingSpeed;
|
|
uint8_t bAttackSpeed;
|
|
|
|
uint8_t bStateFlag;
|
|
uint32_t dwAffectFlag[2];
|
|
|
|
uint32_t dwGuildID;
|
|
int16_t sAlignment;
|
|
uint8_t bPKMode;
|
|
uint32_t dwMountVnum;
|
|
} TPacketGCCharacterUpdate2;
|
|
|
|
typedef struct packet_del_char
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
} TPacketGCCharacterDelete;
|
|
|
|
typedef struct packet_GlobalTime
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
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_MAX_NUM,
|
|
};
|
|
|
|
typedef struct packet_chatting
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t type;
|
|
uint32_t dwVID;
|
|
uint8_t bEmpire;
|
|
} TPacketGCChat;
|
|
|
|
typedef struct packet_whisper // 가변 패킷
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bType;
|
|
char szNameFrom[CHARACTER_NAME_MAX_LEN + 1];
|
|
} TPacketGCWhisper;
|
|
|
|
typedef struct packet_stun
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
} TPacketGCStun;
|
|
|
|
typedef struct packet_dead
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
} TPacketGCDead;
|
|
|
|
typedef struct packet_main_character
|
|
{
|
|
enum { MUSIC_NAME_MAX_LEN = 24 };
|
|
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
uint16_t wRaceNum;
|
|
char szName[CHARACTER_NAME_MAX_LEN + 1];
|
|
char szBGMName[MUSIC_NAME_MAX_LEN + 1];
|
|
float fBGMVol;
|
|
int32_t lX, lY, lZ;
|
|
uint8_t byEmpire;
|
|
uint8_t bySkillGroup;
|
|
} TPacketGCMainCharacter;
|
|
|
|
enum EPointTypes
|
|
{
|
|
POINT_NONE, // 0
|
|
POINT_LEVEL, // 1
|
|
POINT_VOICE, // 2
|
|
POINT_EXP, // 3
|
|
POINT_NEXT_EXP, // 4
|
|
POINT_HP, // 5
|
|
POINT_MAX_HP, // 6
|
|
POINT_SP, // 7
|
|
POINT_MAX_SP, // 8
|
|
POINT_STAMINA, // 9 스테미너
|
|
POINT_MAX_STAMINA, // 10 최대 스테미너
|
|
|
|
POINT_GOLD, // 11
|
|
POINT_ST, // 12 근력
|
|
POINT_HT, // 13 체력
|
|
POINT_DX, // 14 민첩성
|
|
POINT_IQ, // 15 정신력
|
|
POINT_ATT_POWER, // 16 공격력
|
|
POINT_ATT_SPEED, // 17 공격속도
|
|
POINT_EVADE_RATE, // 18 회피율
|
|
POINT_MOV_SPEED, // 19 이동속도
|
|
POINT_DEF_GRADE, // 20 방어등급
|
|
POINT_CASTING_SPEED, // 21 주문속도 (쿨다운타임*100) / (100 + 이값) = 최종 쿨다운 타임
|
|
POINT_MAGIC_ATT_GRADE, // 22 마법공격력
|
|
POINT_MAGIC_DEF_GRADE, // 23 마법방어력
|
|
POINT_EMPIRE_POINT, // 24 제국점수
|
|
POINT_LEVEL_STEP, // 25 한 레벨에서의 단계.. (1 2 3 될 때 보상, 4 되면 레벨 업)
|
|
POINT_STAT, // 26 능력치 올릴 수 있는 개수
|
|
POINT_SUB_SKILL, // 27 보조 스킬 포인트
|
|
POINT_SKILL, // 28 액티브 스킬 포인트
|
|
// POINT_SKILL_PASV, // 27 패시브 기술 올릴 수 있는 개수
|
|
// POINT_SKILL_ACTIVE, // 28 액티브 스킬 포인트
|
|
POINT_MIN_ATK, // 29 최소 파괴력
|
|
POINT_MAX_ATK, // 30 최대 파괴력
|
|
POINT_PLAYTIME, // 31 플레이시간
|
|
POINT_HP_REGEN, // 32 HP 회복률
|
|
POINT_SP_REGEN, // 33 SP 회복률
|
|
|
|
POINT_BOW_DISTANCE, // 34 활 사정거리 증가치 (meter)
|
|
|
|
POINT_HP_RECOVERY, // 35 체력 회복 증가량
|
|
POINT_SP_RECOVERY, // 36 정신력 회복 증가량
|
|
|
|
POINT_POISON_PCT, // 37 독 확률
|
|
POINT_STUN_PCT, // 38 기절 확률
|
|
POINT_SLOW_PCT, // 39 슬로우 확률
|
|
POINT_CRITICAL_PCT, // 40 크리티컬 확률
|
|
POINT_PENETRATE_PCT, // 41 관통타격 확률
|
|
POINT_CURSE_PCT, // 42 저주 확률
|
|
|
|
POINT_ATTBONUS_HUMAN, // 43 인간에게 강함
|
|
POINT_ATTBONUS_ANIMAL, // 44 동물에게 데미지 % 증가
|
|
POINT_ATTBONUS_ORC, // 45 웅귀에게 데미지 % 증가
|
|
POINT_ATTBONUS_MILGYO, // 46 밀교에게 데미지 % 증가
|
|
POINT_ATTBONUS_UNDEAD, // 47 시체에게 데미지 % 증가
|
|
POINT_ATTBONUS_DEVIL, // 48 마귀(악마)에게 데미지 % 증가
|
|
POINT_ATTBONUS_INSECT, // 49 벌레족
|
|
POINT_ATTBONUS_FIRE, // 50 화염족
|
|
POINT_ATTBONUS_ICE, // 51 빙설족
|
|
POINT_ATTBONUS_DESERT, // 52 사막족
|
|
POINT_ATTBONUS_UNUSED0, // 53 UNUSED0
|
|
POINT_ATTBONUS_UNUSED1, // 54 UNUSED1
|
|
POINT_ATTBONUS_UNUSED2, // 55 UNUSED2
|
|
POINT_ATTBONUS_UNUSED3, // 56 UNUSED3
|
|
POINT_ATTBONUS_UNUSED4, // 57 UNUSED4
|
|
POINT_ATTBONUS_UNUSED5, // 58 UNUSED5
|
|
POINT_ATTBONUS_UNUSED6, // 59 UNUSED6
|
|
POINT_ATTBONUS_UNUSED7, // 60 UNUSED7
|
|
POINT_ATTBONUS_UNUSED8, // 61 UNUSED8
|
|
POINT_ATTBONUS_UNUSED9, // 62 UNUSED9
|
|
|
|
POINT_STEAL_HP, // 63 생명력 흡수
|
|
POINT_STEAL_SP, // 64 정신력 흡수
|
|
|
|
POINT_MANA_BURN_PCT, // 65 마나 번
|
|
|
|
/// 피해시 보너스 ///
|
|
|
|
POINT_DAMAGE_SP_RECOVER, // 66 공격당할 시 정신력 회복 확률
|
|
|
|
POINT_BLOCK, // 67 블럭율
|
|
POINT_DODGE, // 68 회피율
|
|
|
|
POINT_RESIST_SWORD, // 69
|
|
POINT_RESIST_TWOHAND, // 70
|
|
POINT_RESIST_DAGGER, // 71
|
|
POINT_RESIST_BELL, // 72
|
|
POINT_RESIST_FAN, // 73
|
|
POINT_RESIST_BOW, // 74 화살 저항 : 대미지 감소
|
|
POINT_RESIST_FIRE, // 75 화염 저항 : 화염공격에 대한 대미지 감소
|
|
POINT_RESIST_ELEC, // 76 전기 저항 : 전기공격에 대한 대미지 감소
|
|
POINT_RESIST_MAGIC, // 77 술법 저항 : 모든술법에 대한 대미지 감소
|
|
POINT_RESIST_WIND, // 78 바람 저항 : 바람공격에 대한 대미지 감소
|
|
|
|
POINT_REFLECT_MELEE, // 79 공격 반사
|
|
|
|
/// 특수 피해시 ///
|
|
POINT_REFLECT_CURSE, // 80 저주 반사
|
|
POINT_POISON_REDUCE, // 81 독데미지 감소
|
|
|
|
/// 적 소멸시 ///
|
|
POINT_KILL_SP_RECOVER, // 82 적 소멸시 MP 회복
|
|
POINT_EXP_DOUBLE_BONUS, // 83
|
|
POINT_GOLD_DOUBLE_BONUS, // 84
|
|
POINT_ITEM_DROP_BONUS, // 85
|
|
|
|
/// 회복 관련 ///
|
|
POINT_POTION_BONUS, // 86
|
|
POINT_KILL_HP_RECOVER, // 87
|
|
|
|
POINT_IMMUNE_STUN, // 88
|
|
POINT_IMMUNE_SLOW, // 89
|
|
POINT_IMMUNE_FALL, // 90
|
|
//////////////////
|
|
|
|
POINT_PARTY_ATT_GRADE, // 91
|
|
POINT_PARTY_DEF_GRADE, // 92
|
|
|
|
POINT_ATT_BONUS, // 93
|
|
POINT_DEF_BONUS, // 94
|
|
|
|
POINT_ATT_GRADE_BONUS, // 95
|
|
POINT_DEF_GRADE_BONUS, // 96
|
|
POINT_MAGIC_ATT_GRADE_BONUS, // 97
|
|
POINT_MAGIC_DEF_GRADE_BONUS, // 98
|
|
|
|
POINT_RESIST_NORMAL_DAMAGE, // 99
|
|
|
|
// MR-10: Added missing POINT_* values
|
|
POINT_HIT_HP_RECOVERY, // 100
|
|
POINT_HIT_SP_RECOVERY, // 101
|
|
POINT_MANASHIELD, // 102 흑신수호 스킬에 의한 마나쉴드 효과 정도
|
|
|
|
POINT_PARTY_BUFFER_BONUS, // 103
|
|
POINT_PARTY_SKILL_MASTER_BONUS, // 104
|
|
|
|
POINT_HP_RECOVER_CONTINUE, // 105
|
|
POINT_SP_RECOVER_CONTINUE, // 106
|
|
|
|
POINT_STEAL_GOLD, // 107
|
|
POINT_POLYMORPH, // 108 변신한 몬스터 번호
|
|
POINT_MOUNT, // 109 타고있는 몬스터 번호
|
|
|
|
POINT_PARTY_HASTE_BONUS, // 110
|
|
POINT_PARTY_DEFENDER_BONUS, // 111
|
|
// MR-10: -- END OF -- Added missing POINT_* values
|
|
|
|
POINT_STAT_RESET_COUNT = 112,
|
|
POINT_HORSE_SKILL = 113,
|
|
|
|
POINT_MALL_ATTBONUS, // 114 공격력 +x%
|
|
POINT_MALL_DEFBONUS, // 115 방어력 +x%
|
|
POINT_MALL_EXPBONUS, // 116 경험치 +x%
|
|
POINT_MALL_ITEMBONUS, // 117 아이템 드롭율 x/10배
|
|
POINT_MALL_GOLDBONUS, // 118 돈 드롭율 x/10배
|
|
POINT_MAX_HP_PCT, // 119 최대생명력 +x%
|
|
POINT_MAX_SP_PCT, // 120 최대정신력 +x%
|
|
|
|
POINT_SKILL_DAMAGE_BONUS, // 121 스킬 데미지 *(100+x)%
|
|
POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 평타 데미지 *(100+x)%
|
|
|
|
POINT_SKILL_DEFEND_BONUS, // 123 스킬 방어 데미지
|
|
POINT_NORMAL_HIT_DEFEND_BONUS, // 124 평타 방어 데미지
|
|
POINT_PC_BANG_EXP_BONUS, // 125
|
|
POINT_PC_BANG_DROP_BONUS, // 126 PC방 전용 드롭률 보너스
|
|
// MR-10: Added missing POINT_* values
|
|
POINT_RAMADAN_CANDY_BONUS_EXP, // 라마단 사탕 경험치 증가용
|
|
// MR-10: -- END OF -- Added missing POINT_* values
|
|
|
|
POINT_ENERGY = 128, // 128 기력
|
|
|
|
// 기력 ui 용.
|
|
// 이렇게 하고 싶지 않았지만,
|
|
// uiTaskBar에서는 affect에 접근할 수 없고,
|
|
// 더구나 클라리언트에서는 blend_affect는 관리하지 않아,
|
|
// 임시로 이렇게 둔다.
|
|
POINT_ENERGY_END_TIME = 129, // 129 기력 종료 시간
|
|
|
|
// MR-10: Added missing POINT_* values
|
|
POINT_COSTUME_ATTR_BONUS = 130,
|
|
POINT_MAGIC_ATT_BONUS_PER = 131,
|
|
POINT_MELEE_MAGIC_ATT_BONUS_PER = 132,
|
|
|
|
// 추가 속성 저항
|
|
POINT_RESIST_ICE = 133, // 냉기 저항 : 얼음공격에 대한 대미지 감소
|
|
POINT_RESIST_EARTH = 134, // 대지 저항 : 얼음공격에 대한 대미지 감소
|
|
POINT_RESIST_DARK = 135, // 어둠 저항 : 얼음공격에 대한 대미지 감소
|
|
|
|
POINT_RESIST_CRITICAL = 136, // 크리티컬 저항 : 상대의 크리티컬 확률을 감소
|
|
POINT_RESIST_PENETRATE = 137, // 관통타격 저항 : 상대의 관통타격 확률을 감소
|
|
// MR-10: -- END OF -- Added missing POINT_* values
|
|
|
|
// 클라이언트 포인트
|
|
POINT_MIN_WEP = 200,
|
|
POINT_MAX_WEP,
|
|
POINT_MIN_MAGIC_WEP,
|
|
POINT_MAX_MAGIC_WEP,
|
|
POINT_HIT_RATE,
|
|
|
|
|
|
//POINT_MAX_NUM = 255,=>stdafx.h 로/
|
|
};
|
|
|
|
typedef struct packet_points
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
int32_t points[POINT_MAX_NUM];
|
|
} TPacketGCPoints;
|
|
|
|
typedef struct packet_point_change
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
|
|
uint32_t dwVID;
|
|
uint8_t Type;
|
|
|
|
int32_t amount; // 바뀐 값
|
|
int32_t value; // 현재 값
|
|
} TPacketGCPointChange;
|
|
|
|
typedef struct packet_motion
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
uint32_t victim_vid;
|
|
uint16_t motion;
|
|
} TPacketGCMotion;
|
|
|
|
typedef struct packet_del_item
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TItemPos pos;
|
|
} TPacketGCItemDel;
|
|
|
|
typedef struct packet_set_item
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TItemPos pos;
|
|
uint32_t vnum;
|
|
uint8_t count;
|
|
uint32_t flags; // 플래그 추가
|
|
uint32_t anti_flags; // 플래그 추가
|
|
uint8_t highlight;
|
|
int32_t alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
|
|
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
|
|
} TPacketGCItemSet;
|
|
|
|
typedef struct packet_item_get
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwItemVnum;
|
|
uint8_t bCount;
|
|
uint8_t bArg; // 0: normal, 1: from party member
|
|
char szFromName[CHARACTER_NAME_MAX_LEN + 1];
|
|
} TPacketGCItemGet;
|
|
|
|
typedef struct packet_use_item
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TItemPos Cell;
|
|
uint32_t ch_vid;
|
|
uint32_t victim_vid;
|
|
|
|
uint32_t vnum;
|
|
} TPacketGCItemUse;
|
|
|
|
typedef struct packet_update_item
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TItemPos Cell;
|
|
uint8_t count;
|
|
int32_t alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
|
|
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
|
|
} TPacketGCItemUpdate;
|
|
|
|
typedef struct packet_ground_add_item
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
int32_t lX;
|
|
int32_t lY;
|
|
int32_t lZ;
|
|
|
|
uint32_t dwVID;
|
|
uint32_t dwVnum;
|
|
} TPacketGCItemGroundAdd;
|
|
|
|
typedef struct packet_ground_del_item
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
} TPacketGCItemGroundDel;
|
|
|
|
typedef struct packet_item_ownership
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
char szName[CHARACTER_NAME_MAX_LEN + 1];
|
|
} TPacketGCItemOwnership;
|
|
|
|
typedef struct packet_quickslot_add
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t pos;
|
|
TQuickSlot slot;
|
|
} TPacketGCQuickSlotAdd;
|
|
|
|
typedef struct packet_quickslot_del
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t pos;
|
|
} TPacketGCQuickSlotDel;
|
|
|
|
typedef struct packet_quickslot_swap
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t pos;
|
|
uint8_t change_pos;
|
|
} TPacketGCQuickSlotSwap;
|
|
|
|
typedef struct packet_shop_start
|
|
{
|
|
struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
|
|
} TPacketGCShopStart;
|
|
|
|
typedef struct packet_shop_start_ex // 다음에 TSubPacketShopTab* shop_tabs 이 따라옴.
|
|
{
|
|
typedef struct sub_packet_shop_tab
|
|
{
|
|
char name[SHOP_TAB_NAME_MAX];
|
|
uint8_t coin_type;
|
|
packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
|
|
} TSubPacketShopTab;
|
|
uint32_t owner_vid;
|
|
uint8_t shop_tab_count;
|
|
} TPacketGCShopStartEx;
|
|
|
|
|
|
typedef struct packet_shop_update_item
|
|
{
|
|
uint8_t pos;
|
|
struct packet_shop_item item;
|
|
} TPacketGCShopUpdateItem;
|
|
|
|
typedef struct packet_shop_update_price
|
|
{
|
|
int32_t iElkAmount;
|
|
} TPacketGCShopUpdatePrice;
|
|
|
|
typedef struct packet_shop
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t subheader;
|
|
} TPacketGCShop;
|
|
|
|
typedef struct packet_exchange
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t subheader;
|
|
uint8_t is_me;
|
|
uint32_t arg1;
|
|
TItemPos arg2;
|
|
uint32_t arg3;
|
|
int32_t alValues[ITEM_SOCKET_SLOT_MAX_NUM];
|
|
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
|
|
} TPacketGCExchange;
|
|
|
|
typedef struct packet_position
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
uint8_t position;
|
|
} TPacketGCPosition;
|
|
|
|
// TPacketGCPing, TPacketCGPong moved to EterLib/ControlPackets.h
|
|
|
|
typedef struct packet_script
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t skin;
|
|
uint16_t src_size;
|
|
} TPacketGCScript;
|
|
|
|
typedef struct packet_target
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
uint8_t bHPPercent;
|
|
} TPacketGCTarget;
|
|
|
|
typedef struct packet_damage_info
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
uint8_t flag;
|
|
int32_t damage;
|
|
} TPacketGCDamageInfo;
|
|
|
|
typedef struct packet_mount
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
uint32_t mount_vid;
|
|
uint8_t pos;
|
|
uint32_t _x, _y;
|
|
} TPacketGCMount;
|
|
|
|
typedef struct packet_change_speed
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
uint16_t moving_speed;
|
|
} TPacketGCChangeSpeed;
|
|
|
|
typedef struct packet_move
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bFunc;
|
|
uint8_t bArg;
|
|
uint8_t bRot;
|
|
uint32_t dwVID;
|
|
int32_t lX;
|
|
int32_t lY;
|
|
uint32_t dwTime;
|
|
uint32_t 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
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint16_t index;
|
|
uint8_t flag;
|
|
} TPacketGCQuestInfo;
|
|
|
|
typedef struct packet_quest_confirm
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char msg[64+1];
|
|
int32_t timeout;
|
|
uint32_t requestPID;
|
|
} TPacketGCQuestConfirm;
|
|
|
|
typedef struct packet_attack
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
uint32_t dwVictimVID; // 적 VID
|
|
uint8_t bType; // 공격 유형
|
|
} TPacketGCAttack;
|
|
|
|
typedef struct packet_c2c
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketGCC2C;
|
|
|
|
typedef struct packetd_sync_position_element
|
|
{
|
|
uint32_t dwVID;
|
|
int32_t lX;
|
|
int32_t lY;
|
|
} TPacketGCSyncPositionElement;
|
|
|
|
typedef struct packetd_sync_position
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketGCSyncPosition;
|
|
|
|
typedef struct packet_ownership
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwOwnerVID;
|
|
uint32_t dwVictimVID;
|
|
} TPacketGCOwnership;
|
|
|
|
#define SKILL_MAX_NUM 255
|
|
|
|
typedef struct packet_skill_level
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t abSkillLevels[SKILL_MAX_NUM];
|
|
} TPacketGCSkillLevel;
|
|
|
|
typedef struct SPlayerSkill
|
|
{
|
|
uint8_t bMasterType;
|
|
uint8_t bLevel;
|
|
time_t tNextRead;
|
|
} TPlayerSkill;
|
|
|
|
typedef struct packet_skill_level_new
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TPlayerSkill skills[SKILL_MAX_NUM];
|
|
} TPacketGCSkillLevelNew;
|
|
|
|
// fly
|
|
typedef struct packet_fly
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bType;
|
|
uint32_t dwStartVID;
|
|
uint32_t dwEndVID;
|
|
} TPacketGCCreateFly;
|
|
|
|
enum EPVPModes
|
|
{
|
|
PVP_MODE_NONE,
|
|
PVP_MODE_AGREE,
|
|
PVP_MODE_FIGHT,
|
|
PVP_MODE_REVENGE,
|
|
};
|
|
|
|
typedef struct packet_duel_start
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketGCDuelStart ;
|
|
|
|
typedef struct packet_pvp
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVIDSrc;
|
|
uint32_t dwVIDDst;
|
|
uint8_t bMode;
|
|
} TPacketGCPVP;
|
|
|
|
typedef struct packet_skill_cooltime_end
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bSkill;
|
|
} TPacketGCSkillCoolTimeEnd;
|
|
|
|
typedef struct packet_warp
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
int32_t lX;
|
|
int32_t lY;
|
|
int32_t lAddr;
|
|
uint16_t wPort;
|
|
} TPacketGCWarp;
|
|
|
|
typedef struct packet_party_invite
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t leader_pid;
|
|
} TPacketGCPartyInvite;
|
|
|
|
typedef struct packet_party_add
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t pid;
|
|
char name[CHARACTER_NAME_MAX_LEN+1];
|
|
} TPacketGCPartyAdd;
|
|
|
|
typedef struct packet_party_update
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t pid;
|
|
uint8_t state;
|
|
uint8_t percent_hp;
|
|
int16_t affects[PARTY_AFFECT_SLOT_MAX_NUM];
|
|
} TPacketGCPartyUpdate;
|
|
|
|
typedef struct packet_party_remove
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t pid;
|
|
} TPacketGCPartyRemove;
|
|
|
|
typedef TPacketCGSafeboxCheckout TPacketGCSafeboxCheckout;
|
|
typedef TPacketCGSafeboxCheckin TPacketGCSafeboxCheckin;
|
|
|
|
typedef struct packet_safebox_wrong_password
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketGCSafeboxWrongPassword;
|
|
|
|
typedef struct packet_safebox_size
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bSize;
|
|
} TPacketGCSafeboxSize;
|
|
|
|
typedef struct packet_safebox_money_change
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
int32_t lMoney; // Signed to match server (uses int32_t lMoney)
|
|
} TPacketGCSafeboxMoneyChange;
|
|
|
|
typedef struct command_empire
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bEmpire;
|
|
} TPacketCGEmpire;
|
|
|
|
typedef struct packet_empire
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bEmpire;
|
|
} TPacketGCEmpire;
|
|
|
|
typedef struct command_fishing
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t dir;
|
|
} TPacketCGFishing;
|
|
|
|
typedef struct packet_fishing
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t subheader;
|
|
uint32_t info;
|
|
uint8_t dir;
|
|
} TPacketGCFishing;
|
|
|
|
typedef struct paryt_parameter
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bDistributeMode;
|
|
} TPacketGCPartyParameter;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Guild
|
|
|
|
typedef struct packet_guild
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t 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 길드장, 길드원 등의 이름
|
|
uint8_t auth_flag;
|
|
} TPacketGCGuildSubGrade;
|
|
|
|
typedef struct packet_guild_sub_member
|
|
{
|
|
uint32_t pid;
|
|
uint8_t byGrade;
|
|
uint8_t byIsGeneral;
|
|
uint8_t byJob;
|
|
uint8_t byLevel;
|
|
uint32_t dwOffer;
|
|
uint8_t byNameFlag;
|
|
// if NameFlag is TRUE, name is sent from server.
|
|
// char szName[CHARACTER_ME_MAX_LEN+1];
|
|
} TPacketGCGuildSubMember;
|
|
|
|
typedef struct packet_guild_sub_info
|
|
{
|
|
uint16_t member_count;
|
|
uint16_t max_member_count;
|
|
uint32_t guild_id;
|
|
uint32_t master_pid;
|
|
uint32_t exp;
|
|
uint8_t level;
|
|
char name[GUILD_NAME_MAX_LEN+1];
|
|
uint32_t gold;
|
|
uint8_t 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
|
|
{
|
|
uint32_t dwGuildSelf;
|
|
uint32_t dwGuildOpp;
|
|
uint8_t bType;
|
|
uint8_t bWarState;
|
|
} TPacketGCGuildWar;
|
|
|
|
typedef struct SPacketGuildWarPoint
|
|
{
|
|
uint32_t dwGainGuildID;
|
|
uint32_t dwOpponentGuildID;
|
|
int32_t lPoint;
|
|
} TPacketGuildWarPoint;
|
|
|
|
typedef struct packet_dungeon
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t subheader;
|
|
} TPacketGCDungeon;
|
|
|
|
// Private Shop
|
|
typedef struct SPacketGCShopSign
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
char szSign[SHOP_SIGN_MAX_LEN + 1];
|
|
} TPacketGCShopSign;
|
|
|
|
typedef struct SPacketGCTime
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
time_t time;
|
|
} TPacketGCTime;
|
|
|
|
enum
|
|
{
|
|
WALKMODE_RUN,
|
|
WALKMODE_WALK,
|
|
};
|
|
|
|
typedef struct SPacketGCWalkMode
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
uint8_t mode;
|
|
} TPacketGCWalkMode;
|
|
|
|
typedef struct SPacketGCChangeSkillGroup
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t skill_group;
|
|
} TPacketGCChangeSkillGroup;
|
|
|
|
struct TMaterial
|
|
{
|
|
uint32_t vnum;
|
|
uint32_t count;
|
|
};
|
|
|
|
typedef struct SRefineTable
|
|
{
|
|
uint32_t src_vnum;
|
|
uint32_t result_vnum;
|
|
uint8_t material_count;
|
|
int32_t cost; // 소요 비용
|
|
int32_t prob; // 확률
|
|
TMaterial materials[REFINE_MATERIAL_MAX_NUM];
|
|
} TRefineTable;
|
|
|
|
typedef struct SPacketGCRefineInformation
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t pos;
|
|
TRefineTable refine_table;
|
|
} TPacketGCRefineInformation;
|
|
|
|
typedef struct SPacketGCRefineInformationNew
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t type;
|
|
uint8_t 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) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님),
|
|
SE_AGGREGATE_MONSTER,
|
|
};
|
|
|
|
typedef struct SPacketGCSpecialEffect
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t type;
|
|
uint32_t vid;
|
|
} TPacketGCSpecialEffect;
|
|
|
|
typedef struct SPacketGCNPCPosition
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint16_t count;
|
|
} TPacketGCNPCPosition;
|
|
|
|
struct TNPCPosition
|
|
{
|
|
uint8_t bType;
|
|
uint32_t dwVnum;
|
|
char name[CHARACTER_NAME_MAX_LEN+1];
|
|
int32_t x;
|
|
int32_t y;
|
|
};
|
|
|
|
typedef struct SPacketGCChangeName
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t pid;
|
|
char name[CHARACTER_NAME_MAX_LEN+1];
|
|
} TPacketGCChangeName;
|
|
|
|
enum EBlockAction
|
|
{
|
|
BLOCK_EXCHANGE = (1 << 0),
|
|
BLOCK_PARTY_INVITE = (1 << 1),
|
|
BLOCK_GUILD_INVITE = (1 << 2),
|
|
BLOCK_WHISPER = (1 << 3),
|
|
BLOCK_MESSENGER_INVITE = (1 << 4),
|
|
BLOCK_PARTY_REQUEST = (1 << 5),
|
|
};
|
|
|
|
typedef struct packet_login_key
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwLoginKey;
|
|
} TPacketGCLoginKey;
|
|
|
|
typedef struct packet_auth_success
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwLoginKey;
|
|
uint8_t bResult;
|
|
} TPacketGCAuthSuccess;
|
|
|
|
typedef struct packet_channel
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t channel;
|
|
} TPacketGCChannel;
|
|
|
|
typedef struct SEquipmentItemSet
|
|
{
|
|
uint32_t vnum;
|
|
uint8_t count;
|
|
int32_t alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
|
|
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
|
|
} TEquipmentItemSet;
|
|
|
|
typedef struct pakcet_view_equip
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwVID;
|
|
TEquipmentItemSet equips[WEAR_MAX_NUM];
|
|
} TPacketGCViewEquip;
|
|
|
|
typedef struct
|
|
{
|
|
uint32_t dwID;
|
|
int32_t x, y;
|
|
int32_t width, height;
|
|
uint32_t dwGuildID;
|
|
} TLandPacketElement;
|
|
|
|
typedef struct packet_land_list
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketGCLandList;
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
int32_t lID;
|
|
char szTargetName[32+1];
|
|
} TPacketGCTargetCreate;
|
|
|
|
enum
|
|
{
|
|
CREATE_TARGET_TYPE_NONE,
|
|
CREATE_TARGET_TYPE_LOCATION,
|
|
CREATE_TARGET_TYPE_CHARACTER,
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
int32_t lID;
|
|
char szTargetName[32+1];
|
|
uint32_t dwVID;
|
|
uint8_t byType;
|
|
} TPacketGCTargetCreateNew;
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
int32_t lID;
|
|
int32_t lX, lY;
|
|
} TPacketGCTargetUpdate;
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
int32_t lID;
|
|
} TPacketGCTargetDelete;
|
|
|
|
typedef struct
|
|
{
|
|
uint32_t dwType;
|
|
uint8_t bPointIdxApplyOn;
|
|
int32_t lApplyValue;
|
|
uint32_t dwFlag;
|
|
int32_t lDuration;
|
|
int32_t lSPCost;
|
|
} TPacketAffectElement;
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
TPacketAffectElement elem;
|
|
} TPacketGCAffectAdd;
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t dwType;
|
|
uint8_t bApplyOn;
|
|
} TPacketGCAffectRemove;
|
|
|
|
typedef struct packet_mall_open
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bSize;
|
|
} TPacketGCMallOpen;
|
|
|
|
typedef struct packet_lover_info
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
char szName[CHARACTER_NAME_MAX_LEN + 1];
|
|
uint8_t byLovePoint;
|
|
} TPacketGCLoverInfo;
|
|
|
|
typedef struct packet_love_point_update
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t byLovePoint;
|
|
} TPacketGCLovePointUpdate;
|
|
|
|
typedef struct packet_dig_motion
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
uint32_t target_vid;
|
|
uint8_t count;
|
|
} TPacketGCDigMotion;
|
|
|
|
typedef struct SPacketGCOnTime
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
int32_t ontime; // sec
|
|
} TPacketGCOnTime;
|
|
|
|
typedef struct SPacketGCResetOnTime
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
} TPacketGCResetOnTime;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Client To Client
|
|
|
|
typedef struct packet_state
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bFunc;
|
|
uint8_t bArg;
|
|
uint8_t bRot;
|
|
uint32_t dwVID;
|
|
uint32_t dwTime;
|
|
TPixelPosition kPPos;
|
|
} TPacketCCState;
|
|
|
|
// AUTOBAN
|
|
typedef struct packet_autoban_quiz
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bDuration;
|
|
uint8_t bCaptcha[64*32];
|
|
char szQuiz[256];
|
|
} TPacketGCAutoBanQuiz;
|
|
// END_OF_AUTOBAN
|
|
|
|
// TPacketGCKeyChallenge, TPacketCGKeyResponse, TPacketGCKeyComplete
|
|
// moved to EterLib/ControlPackets.h
|
|
|
|
// Secure authentication packets (libsodium/XChaCha20-Poly1305)
|
|
#pragma pack(push, 1)
|
|
|
|
// Client -> Server: Secure login
|
|
struct TPacketCGLoginSecure
|
|
{
|
|
uint16_t header; // CG::LOGIN_SECURE
|
|
uint16_t length;
|
|
char name[ID_MAX_NUM + 1];
|
|
char pwd[PASS_MAX_NUM + 1];
|
|
uint8_t session_token[32]; // Session token from KeyComplete
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
typedef struct SPacketGCSpecificEffect
|
|
{
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint32_t vid;
|
|
char effect_file[128];
|
|
} TPacketGCSpecificEffect;
|
|
|
|
// 용혼석
|
|
enum EDragonSoulRefineWindowRefineType
|
|
{
|
|
DragonSoulRefineWindow_UPGRADE,
|
|
DragonSoulRefineWindow_IMPROVEMENT,
|
|
DragonSoulRefineWindow_REFINE,
|
|
};
|
|
|
|
typedef struct SPacketCGDragonSoulRefine
|
|
{
|
|
SPacketCGDragonSoulRefine() : header(CG::DRAGON_SOUL_REFINE), length(sizeof(SPacketCGDragonSoulRefine))
|
|
{}
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bSubType;
|
|
TItemPos ItemGrid[DS_REFINE_WINDOW_MAX_NUM];
|
|
} TPacketCGDragonSoulRefine;
|
|
|
|
typedef struct SPacketGCDragonSoulRefine
|
|
{
|
|
SPacketGCDragonSoulRefine() : header(GC::DRAGON_SOUL_REFINE), length(sizeof(SPacketGCDragonSoulRefine))
|
|
{}
|
|
uint16_t header;
|
|
uint16_t length;
|
|
uint8_t bSubType;
|
|
TItemPos Pos;
|
|
} TPacketGCDragonSoulRefine;
|
|
|
|
typedef struct SChannelStatus
|
|
{
|
|
int16_t nPort;
|
|
uint8_t bStatus;
|
|
} TChannelStatus;
|
|
|
|
#pragma pack(pop)
|