Files
2022-10-26 12:25:11 +08:00

10494 lines
334 KiB
C

#pragma once
#ifndef __PACKETSTRUCT_CG_H__
#define __PACKETSTRUCT_CG_H__
#include <Define.h>
#include <Struct.h>
#include <Protocol_CG.h>
#include <PacketStruct.h>
#pragma warning(push)
#pragma warning(disable : 4201)
#include <ProgramCommon/WzDataType.h>
#pragma warning(pop)
#include <SafeStringBufferControl.h>
#include "../PartyLib/PartyStruct.h"
#ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM
#include "../RankingLib/RankingStruct.h"
#endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM
#if USING_HACKSHIELD
#ifdef _SERVER
#define HACKSHIELD_INCLUDE_PATH( v ) <HShield/##v/AntiCpXSvr.h>
#else
#define HACKSHIELD_INCLUDE_PATH( v ) <HShield/##v/HShield.h>
#endif
#include HACKSHIELD_INCLUDE_PATH( HACKSHIELD_VERSION )
#endif //USING_HACKSHIELD
#pragma pack(push,1)
#pragma warning(push)
#pragma warning(disable : 4201 4307)
//==================================================================================================
// * Prefix
// C : Client
// G : Game Server
// M : Master Server
// D : DBP Server
// W : World Server
//
// * Postfix
// SYN - Server에 요청
// ACK - 요청에 대한 허락
// NAK - 요청에 대한 거부
// CMD - Server의 명령
// BRD - Server가 동기화 관련 내용을 알림
//
// * 프로토콜 Naming Rule
// Prefix_카테고리명_프로토콜명_Postfix
// ex) CG_CONNECTION_REGISTER_SYN
//
//==================================================================================================
//--------------------------------------------------------------------------------------------------
///! CG_CONNECTION, // 접속
#define PACKET_CG_OPEN(c, p) \
struct MSG_##p : public MSG_BASE_FORWARD { \
MSG_##p() { \
m_byCategory = c; \
m_byProtocol = p; \
}
#define PACKET_CG_CLOSE \
}
//--------------------------------------------------------------------------------------------------
#define PACKET_CG_FWD_OPEN(c, p) \
struct MSG_##p : public MSG_BASE_FORWARD { \
MSG_##p() { \
m_byCategory = c; \
m_byProtocol = p; \
}
#define PACKET_CG_FWD_CLOSE \
}
//--------------------------------------------------------------------------------------------------
#define PACKET_CG_INHERIT_OPEN(c, p, b) \
struct MSG_##p : public b { \
MSG_##p() { \
m_byCategory = c; \
m_byProtocol = p; \
}
#define PACKET_CG_INHERIT_CLOSE \
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_HEARTBEAT_SYN);
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T2(54), 1);
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_CONNECTION, CG_CONNECTION_BACKTOCHARSELECT_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_CONNECTION, CG_CONNECTION_BACKTOCHARSELECT_ACK)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_CONNECTION, CG_CONNECTION_BACKTOCHARSELECT_NAK)
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_WEB_DELETE_ACK ) //xiaomi 警속WEB溝퐕
POSTYPE m_PortalPos;
SLOTCODE m_ItemCode;
DURATYPE m_Dura;
PACKET_CG_FWD_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_DISCONNECT_CMD)
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_SERVER_SHUTDOWN_BRD)
DWORD m_dwStringCode;
BYTE m_byShutdownTime; //< 시간(m_byShutdownTime시간후 서버 종료)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_RESTART_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_REENTERSERVER_SYN)
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T2(77), 1);
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_ENTERSERVER_SYN)
PACKET_RND_TOTAL_BLOCK_START(GETRNDNO_RNG128_T2(29));
PACKET_RND_PAD_START(GETRNDNO_RNG04_T3(109));
// 인증서버가 보내준 인증아이디
DWORD m_dwAuthID;
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T3(44), 1);
// 계정아이디 (ENCODE TARGET)
#if defined(__CH1305_090303_ACCOUNT_ID_LENGTH_EXTENTION__) || \
defined(__NA000000_GLOBAL_AUTH_PROCESS__) // || \
//defined(__KR000000_090128_CHANNELING__) <- 이후 반영하도록 하자. 일괄반영을 위해서 auth계열 버전 정보 설정 필요.
char m_szID[ID_MAX_LEN + 1];
#else
char m_szID[16];
#endif
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T3(41), 2);
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T5(9));
// 클라이언트 버전 Major
PACKET_RND_SHRBLK64_CONT(BYTE, m_byHighVerNo);
PACKET_RND_SHRBLK64_RNDCONT(GETRNDNO_RNG08_T1(8), 1);
// 클라이언트 버전 Minor
PACKET_RND_SHRBLK64_CONT(BYTE, m_byMiddleVerNo);
PACKET_RND_SHRBLK64_RNDCONT(GETRNDNO_RNG08_T1(2), 2);
// 클라이언트 버전 Devel
PACKET_RND_SHRBLK64_CONT(BYTE, m_byLowVerNo);
PACKET_RND_SHRBLK64_RNDCONT(GETRNDNO_RNG08_T1(9), 3);
// 국가 코드
PACKET_RND_SHRBLK64_CONT(BYTE, m_byNationCode);
PACKET_RND_SHRBLK64_END();
PACKET_RND_PAD_CONT(GETRNDNO_RNG16_T5(141), 3);
// 인증서버에서 보내준 시리얼 키 (ENCODE TARGET)
BYTE m_szSerialKey[32];
DWORD m_dwMOLAProtocolCRC;
#ifdef _NA_0_20110915_CLIENT_MAC_ADDRESS
char mac_address_[30];
#endif
PACKET_RND_PAD_END();
PACKET_RND_TOTAL_BLOCK_END();
void Encode();
void Decode();
void _Encode_T1();
void _Encode_T2();
void _Encode_T3();
void _Decode_T1();
void _Decode_T2();
void _Decode_T3();
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_ENTERSERVER_ACK)
// CHANGES: f110608.5L
static const size_t kCharacterPartPaddingSize = sizeof(WORD);
static const WORD kTailMark = \
MAKEWORD(CG_CONNECTION_ENTERSERVER_SYN, CG_CONNECTION_ENTERSERVER_NAK);
// (WAVERIX) (NOTE)
// 이것도 변경할 예정, 크기 정책을 어캐할 것인가를 아직 미설정중이므로 이번엔 패스
// (WAVERIX) (NOTE) (090719) 참 오래 끌고 있다. 빨리 작업해 보자.
BOOL m_bPVP; //__NA_000839_20080129_PVP_OPTION
BYTE m_byCount;
#ifdef _NA_002050_20110216_ADD_GENDER
BYTE char_slot_size; // 사용 가능한 캐릭터 슬롯 개수
#endif
#ifdef _JP_20110222_INGAME_CHARNAME_CHANGE
BYTE m_ReNameStatus[MAX_CHARACTER_LIST_NUM]; //캐릭터명 변경 여부 플레그 값이다 캐릭터 정보와 섞지 말고 따로 할당한다.
#endif
BYTE m_pBuffer[sizeof(CLIENT_CHARACTER_PART) * MAX_CHARACTER_LIST_NUM +
kCharacterPartPaddingSize];
// <임시버퍼로 사용할 타입>
//CLIENT_CHARACTER_PART rpCharacterList[MAX_CHARACTER_LIST_NUM]
uint16_t ConvertForSend(CLIENT_CHARACTER_PART rpCharacterList[MAX_CHARACTER_LIST_NUM]);
bool ConvertForRecv(CLIENT_CHARACTER_PART rpCharacterList[MAX_CHARACTER_LIST_NUM]);
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_ENTERSERVER_NAK)
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
//警속棍밈쇱꿎 by:枷쟁팃숲 2021-07-01
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_HACKER_SYN)
char pszUserID[ID_MAX_LEN];
char pszCharName[MAX_CHARNAME_LENGTH+1];
char pszProgramName[1024];
char pszProgramPath[1024];
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_ENTERVILLAGEREQ_SYN)
PACKET_RND_TOTAL_BLOCK_START(GETRNDNO_RNG16_T1(129));
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T5(35));
PACKET_RND_SHRBLK64_CONT(BYTE, m_bySelectedCharIndex);
PACKET_RND_SHRBLK64_RNDCONT(GETRNDNO_RNG08_T4(9), 1);
PACKET_RND_SHRBLK64_END();
PACKET_RND_TOTAL_BLOCK_END();
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_ENTERVILLAGEREQ_ACK)
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T5(9));
PACKET_RND_SHRBLK64_CONT(DWORD, m_dwPlayerKey);
PACKET_RND_SHRBLK64_RNDCONT(GETRNDNO_RNG08_T1(8), 1);
PACKET_RND_SHRBLK64_END();
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_ENTERVILLAGEREQ_NAK)
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_PREPARE_WORLD_CONNECT_SYN)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_PREPARE_WORLD_CONNECT_ACK)
#ifdef _NA002676_WORLD_SERVER_RENEWAL
bool enabled;
#else
char szWorldServerIP[IP_MAX_LEN];
WORD wWorldServerPort;
#endif
PACKET_CG_CLOSE;
// NOTE: f110916.1L, unused anymore since _NA002676_WORLD_SERVER_RENEWAL
PACKET_CG_OPEN(CG_CONNECTION, CG_PREPARE_WORLD_CONNECT_NAK)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_NOTIFY_LOGOUT_SYN)
PACKET_CG_CLOSE;
// 빌링 시간 만료 알림
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_BILLING_ALARM_BRD)
DWORD dwRestTerm; // 남은 시간 (sec)
PACKET_CG_CLOSE;
// 크래쉬 리포트
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_CRASH_REPORT_SYN)
CRASH_INFO m_CrashInfo;
COMPUTER_INFO m_ComputerInfo;
PACKET_CG_CLOSE;
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_SERVER_SELECT_REQUEST_SYN)
enum eQuery { eQuery_StartTransaction, eQuery_StopTransaction };
BOOLEAN m_bQueryType; //eQuery
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_SERVER_SELECT_REQUEST_ACK)
DWORD m_Result; // RC::eROOM_RESULT
nsPacket::ReAuthTokenStream m_ReAuthToken;
inline WORD GetSize() const {
if (m_Result == RC::RC_ROOM_SUCCESS) {
return sizeof(*this);
}
return sizeof(*this) - sizeof(m_ReAuthToken);
}
PACKET_CG_CLOSE;
#endif
//--------------------------------------------------------
//_NA000000_100609_CS_TIME_SYNCHRONIZATION_
// (f100610.3L) client->server protocol, unused
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_TIME_SYNC_SYN)
util::TimeSyncNode sync_node;
PACKET_CG_CLOSE;
// (f100610.3L) client<-server protocol
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_TIME_SYNC_CMD)
util::TimeSyncNode sync_node;
PACKET_CG_CLOSE;
//--------------------------------------------------------
//--------------------------------------------------------
#ifdef _NA_20100802_SPEED_HACK_DETECTION
// S->C TickCount 질의
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_TICK_QUERY_SYN)
DWORD round; // 서버측 패킷 식별용 라운드 번호
BYTE index; // 서버측 패킷 식별용 인덱스 번호
PACKET_CG_CLOSE;
// C->S TickCount 질의에 대한 응답
PACKET_CG_OPEN(CG_CONNECTION, CG_CONNECTION_TICK_QUERY_ACK)
DWORD round; // _SYN에서 받은 라운드 값을 그대로 담아 응답
BYTE index; // _SYN에서 받은 인덱스 값을 그대로 담아 응답
DWORD tick_count; // 처리 시점의 클라이언트 TickCount
PACKET_CG_CLOSE;
#endif
//---------------------------------------------------------
#ifdef _JP_20110222_INGAME_CHARNAME_CHANGE
PACKET_CG_OPEN(CG_CONNECTION, CG_CHARNAME_CHANGE_SYN)
SLOTIDX slot_index_;
char character_name_[MAX_CHARNAME_LENGTH + 1];
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CHARNAME_CHANGE_ACK)
SLOTIDX slot_index_;
char character_name_[MAX_CHARNAME_LENGTH + 1];
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_CHARNAME_CHANGE_NAK)
enum ERROR_CODE {SUCCEED, //성공
DB_FAIL, //디비 오류
DONOT_RENAME, //이름을 변경할수 있는 캐릭터가 아님
INDEX_INVALID, //캐릭터 슬롯이 유효하지 않다.
NOT_CONDITION = 10, //이름을 변경할수 있는 조건이 안됨 (길드 장, 친구 목록 등등)
SEND_FAIL, //디비로 전송 실패
NOT_FIND_USER, //사용자를 찾을수 없음
};
SLOTIDX slot_index_;
ERROR_CODE result_;
PACKET_CG_CLOSE;
#endif //_JP_20110222_INGAME_CHARNAME_CHANGE
//==================================================================================================
//_NA_002289_20110322_EQUIPMENTS_CALCULATOR_CHANGES_FOR_IMPROVEMENT
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_APPREARANCE_LIST_BRD)
uint16_t player_key;
#ifdef _NA_000000_20130206_BROADCAST_ITEM_SCORE
uint16_t total_item_score_;
#endif // _NA_000000_20130206_BROADCAST_ITEM_SCORE
uint8_t number_of_items;
struct Node {
//_NA_002935_20110704_ITEM_SCORE
typedef RENDER_ITEMSTREAMEX ItemStream;
POSTYPE pos;
ItemStream render_item;
} nodes[eEQUIPCONTAINER_MAX];
//
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(nodes);
return static_cast<uint16_t>(kMinSize + sizeof(nodes[0]) * number_of_items);
};
PACKET_CG_CLOSE;
//_NA_002289_20110322_EQUIPMENTS_CALCULATOR_CHANGES_FOR_IMPROVEMENT
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_DISAPPREARANCE_LIST_BRD)
uint16_t player_key;
#ifdef _NA_000000_20130206_BROADCAST_ITEM_SCORE
uint16_t total_item_score_;
#endif // _NA_000000_20130206_BROADCAST_ITEM_SCORE
uint8_t number_of_items;
struct Node {
POSTYPE pos;
} nodes[eEQUIPCONTAINER_MAX];
//
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(nodes);
return static_cast<uint16_t>(kMinSize + sizeof(nodes[0]) * number_of_items);
};
PACKET_CG_CLOSE;
#if SUN_CODE_DELETE_RESERVED
///! CG_CHARINFO, // 캐릭터 정보
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_APPREARANCE_BRD)
PLAYERKEY m_PlayerKey;
POSTYPE m_EquipPos;
OPT_ITEMSTREAMEX m_OptItemStream;
#ifdef _NA_000000_20130206_BROADCAST_ITEM_SCORE
DWORD m_TotalItemScore;
#endif //_NA_000000_20130206_BROADCAST_ITEM_SCORE
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_DISAPPREARANCE_BRD)
PLAYERKEY m_PlayerKey;
POSTYPE m_EquipPos;
#ifdef _NA_000000_20130206_BROADCAST_ITEM_SCORE
DWORD m_TotalItemScore;
#endif //_NA_000000_20130206_BROADCAST_ITEM_SCORE
PACKET_CG_CLOSE;
#endif //SUN_CODE_DELETE_RESERVED
//==================================================================================================
// UP 변화했음
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_USERPOINT_CMD)
UPTYPE m_TotalUP; // 현재 보유중인 UP
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_CREATE_SYN)
PACKET_RND_TOTAL_BLOCK_START(GETRNDNO_RNG128_T5(99));
PACKET_RND_PAD_START(GETRNDNO_RNG16_T4(197));
BYTE m_byClass;
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T1(19), 1);
char m_pszCharName[MAX_CHARNAME_LENGTH];
BYTE m_byHeight;
BYTE m_byFace;
BYTE m_byHair;
#ifdef _NA_002050_20110216_ADD_GENDER
BYTE gender;
#endif // _NA_002050_20110216_ADD_GENDER
PACKET_RND_PAD_END();
PACKET_RND_TOTAL_BLOCK_END();
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_CREATE_ACK)
BYTE m_pBuffer[sizeof(CLIENT_CHARACTER_PART)];
// <임시버퍼로 사용할 타입>
//CLIENT_CHARACTER_PART& rCharInfo
int ConvertForSend(CLIENT_CHARACTER_PART& rCharInfo);
void ConvertForRecv(CLIENT_CHARACTER_PART& rCharInfo);
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_CREATE_NAK)
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_DESTROY_SYN)
BYTE m_bySelectedCharSlotIndex;
BYTE m_LastSocialSecurityNumber[MAX_SSN_STREAM_LENGTH]; //< 주민번호 뒷자리
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_DESTROY_ACK)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_DESTROY_NAK)
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_RECOVER_SYN)
BYTE m_bySelectedCharSlotIndex;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_RECOVER_ACK)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_RECOVER_NAK)
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
#ifdef __NA_001044_ADD_CUSTOM_UI
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_CHARACTERID_CHECK_SYN)
char m_szCharName[MAX_CHARNAME_LENGTH + 1];
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_CHARACTERID_CHECK_ACK)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_CHARACTERID_CHECK_NAK)
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
#endif
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_CHAR_ITEM_CMD)
PLAYERINFO_FOR_PACKET m_CharacterInfo;
enum { _MAX_BINARY_SIZE = sizeof(RENDER_ITEMSTREAMEX) *
(MAX_INVENTORY_SLOT_NUM + MAX_TEMPINVENTORY_SLOT_NUM),
};
WORD m_Size;
BYTE m_BitStreamBuffer[_MAX_BINARY_SIZE];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_BitStreamBuffer);
return static_cast<uint16_t>(kMinSize + sizeof(m_BitStreamBuffer[0]) * m_Size);
};
void Encode();
void Decode();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_SKILL_CMD)
SKILL_TOTAL_INFO m_SkillInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_SkillInfo);
return static_cast<uint16_t>(kMinSize + m_SkillInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_QUICK_CMD)
QUICK_TOTAL_INFO m_QuickInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_QuickInfo);
return static_cast<uint16_t>(kMinSize + m_QuickInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_STYLE_CMD)
STYLE_TOTAL_INFO m_StyleInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_StyleInfo);
return static_cast<uint16_t>(kMinSize + m_StyleInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
#ifdef _NA_0_20110308_SKILL_COOL_TIME_STORAGE
PACKET_CG_FWD_OPEN( CG_CHARINFO, CG_CHARINFO_SKILL_COOL_TIME_CMD )
SkillCoolTime skill_cool_time;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(skill_cool_time);
return static_cast<uint16_t>(kMinSize + skill_cool_time.GetSize());
}
PACKET_CG_FWD_CLOSE;
#endif
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_SELECT_INFO_SYN)
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T1(59));
PACKET_RND_SHRBLK64_CONT(DWORD, m_dwObjectKey);
PACKET_RND_SHRBLK64_RNDCONT(GETRNDNO_RNG08_T1(8), 1);
PACKET_RND_SHRBLK64_END();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_SELECT_INFO_ACK)
DWORD m_dwObjectKey;
PLAYERHP m_HP;
PLAYERHP m_MaxHP;
LEVELTYPE m_LV;
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
PLAYERSD shield;
PLAYERSD max_shield;
#endif // _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
PACKET_CG_FWD_CLOSE;
#ifdef __CN_OO0510__FATIGUE_MATCHING_UPDATE
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_FATIGUE_CMD)
WORD m_wPlayTime;
WORD m_wOfflineTime;
BYTE m_byType;
PACKET_CG_FWD_CLOSE;
#endif
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_ACCUMULATE_POINT_CMD)
DWORD m_dwReason; // 메시지가 발생한 원인
DWORD m_dwAccumulateTime; // 적립 시간 (값:0000000초)
WORD m_wAccumulatePoint; // 적립 포인트
BYTE m_byRequirePoint; // 필요 적립 포인트
PACKET_CG_FWD_CLOSE;
#endif
//_NA_000096_20100527_CHANGE_CHARACTER_APPEARANCE_SYSTEM
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_CHANGE_APPEARANCE_BRD) // 캐릭터 외모 변경 결과를 알림
PLAYERKEY player_key_; // 플레이어 키
typedef BYTE ResultType;
BOOST_STATIC_ASSERT(sizeof(ResultType) == sizeof(RC::ItemResultUtil::ValueType));
BOOST_STATIC_ASSERT(sizeof(ResultType) == sizeof(RC::ChangeCharacterAppearanceResultUtil::ValueType));
ResultType result_; // 외모 변경 결과
CharacterAppearanceInfo character_appearance_; // 변경된 외모
POSTYPE item_position_; // 아이템 위치
//
WORD GetSize() const
{
return static_cast<WORD>(sizeof(*this));
}
PACKET_CG_CLOSE;
// _NA002217_100728_EP2_PERK_SYSTEM_
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_SKILL_LIST_CMD)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_SKILL_PERK_CMD)
PerkDataList container_;
uint16_t GetSize() const {
const int kMinSize = sizeof(*this) - sizeof(container_);
return static_cast<uint16_t>(kMinSize + container_.GetSize());
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_CHAR_ITEM_TOGGLE_CMD)
#ifdef _NA_006372_20130108_BADGE_ITEM
nsSlot::TOGGLE_ITEMS toggle_items_info_[kToggleItemMax];
#endif //_NA_006372_20130108_BADGE_ITEM
PACKET_CG_FWD_CLOSE;
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
PACKET_CG_FWD_OPEN(CG_CHARINFO, CG_CHARINFO_CHAOS_ZONE_RECORD_INFOS_CMD)
CHAOS_ZONE_RECORD_INFOS chaos_zone_record_infos;
PACKET_CG_FWD_CLOSE;
//==================================================================================================
// _NA000000_SPEED_HACK_PREVENTION_SUPPORT, client local test
// C->G
PACKET_CG_FWD_OPEN(CG_CONNECTION, CG_CONNECTION_CLIENT_TICK_TEST_SYN)
DWORD client_send_tick_id;
DWORD client_send_tick;
PACKET_CG_FWD_CLOSE;
// G->C
PACKET_CG_FWD_OPEN(CG_CONNECTION, CG_CONNECTION_CLIENT_TICK_TEST_ACK)
DWORD client_send_tick_id;
DWORD client_send_tick;
DWORD server_elapsed_tick;
PACKET_CG_FWD_CLOSE;
//==================================================================================================
//_NA000000_SPEED_HACK_PREVENTION_SUPPORT, busy request prevention
// G->C
PACKET_CG_FWD_OPEN(CG_MAP, CG_MAP_KBMOVE_SERIAL_CHECK_CMD)
nsSync::KBMoveSerialNode serial_block;
PACKET_CG_FWD_CLOSE;
// C->G
PACKET_CG_FWD_OPEN(CG_MAP, CG_MAP_KBMOVE_SERIAL_CHECK_ACK)
DWORD serial_guid;
PACKET_CG_FWD_CLOSE;
//==================================================================================================
PACKET_CG_FWD_OPEN(CG_SKILL, CG_SKILL_PERK_CONTROL_SYN)
PerkControl header;
uint16_t GetSize() const {
return sizeof(*this);
}
PACKET_CG_FWD_CLOSE;
#ifdef _NA_007019_20140107_PERK_CHANGE_SYSTEM
PACKET_CG_FWD_OPEN(CG_SKILL, CG_SKILL_PERK_GROUP_CONTROL_SYN)
PerkControl header[4];
uint16_t GetSize() const {
return sizeof(*this);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SKILL, CG_SKILL_PERK_GROUP_CONTROL_CMD)
bool isCanProcessState;
PerkControl header[4];
PerkControlData data[4];
uint16_t GetSize() const{
const size_t kResultDefault = sizeof(isCanProcessState);
const size_t kMinSize = sizeof(*this) - sizeof(data);
return static_cast<uint16_t>(kResultDefault + kMinSize + (data[0].GetSize() * 4));
}
PACKET_CG_FWD_CLOSE;
#endif // _NA_007019_20140107_PERK_CHANGE_SYSTEM
PACKET_CG_FWD_OPEN(CG_SKILL, CG_SKILL_PERK_CONTROL_CMD)
PerkControl header;
PerkControlData data;
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(data);
return static_cast<uint16_t>(kMinSize + data.GetSize());
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SKILL, CG_SKILL_PERK_STATUS_CMD)
PerkControl header;
PerkStatusData data;
//
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(data);
return static_cast<uint16_t>(kMinSize + data.GetSize());
}
PACKET_CG_FWD_CLOSE;
///!------------------------------------------------------------------------------------
PACKET_CG_FWD_OPEN(CG_MAP, CG_MAP_TELEPORT_BRD)
BYTE m_bForcedCommand; // 클라요청에 의한 것인지, 서버에서의 강제 텔레포트인지
DWORD m_dwObjectKey; // 워프하는 오브젝트 키
WzVector vPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MAP, CG_MAP_TELEPORT_SYN)
WzVector vPos; // 순간이동하고자 하는 위치
PACKET_CG_FWD_CLOSE;
//_NA_0_20100722_AUTO_SYSTEM
PACKET_CG_FWD_OPEN(CG_MAP, CG_MAP_MOVE_LAST_RETURNSCROLL_POS_CMD)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MAP, CG_MAP_MOVE_LAST_RETURNSCROLL_POS_NAK)
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
#ifdef _NA_20100307_BETAKEY_SYSTEM
PACKET_CG_FWD_OPEN(CG_MAP, CG_MAP_RECALL_NAK)
enum { RECALL_CANNOT_BETAKEY = 1, };
BYTE error_code_;
PACKET_CG_FWD_CLOSE;
#endif
//==================================================================================================
// CG_SYNC
//
//-------------------------------------------------------------------------------------------------
// 플레이어 필드 등장
//-------------------------------------------------------------------------------------------------
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_PLAYER_ENTER_SYN)
PACKET_RND_TOTAL_BLOCK_START(GETRNDNO_RNG16_T4(1022));
PACKET_RND_PAD_START(GETRNDNO_RNG04_T3(109));
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T4(459));
PACKET_RND_SHRBLK64_CONT(DWORD, m_dwCheckSum);
PACKET_RND_SHRBLK64_END();
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T3(11), 1);
DWORD checksum_wmo_;
PACKET_RND_PAD_END();
PACKET_RND_TOTAL_BLOCK_END();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_PLAYER_ENTER_ACK)
float m_fPos[3];
SLOTCODE m_TransSkillCode; // 드래곤 변신상태라면 변신스킬코드를 보내준다.
//_NA001955_110210_WING_COSTUME
// CHANGES: f110607.3L, added field to support whether his wings spreading status has continued.
bool continued_wings_spreading_;
#ifdef _PCBANG_POLICY_CHANGE_POST_EXPIRED
CHANGE_PCROOM_STATUS m_PcRoomStatus; // ref. CHANGE_PCROOM_STATUS::eStatus
#endif
DOMINATION_GUILD_INFO m_GuildInfo; //점령 길드 정보
#ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION
sDOMINATION_CONTINENT_LORD_INFO m_ContinentLordInfo; //대륙 영주 정보
#endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION
void Encode();
void Decode();
void _Encode_01();
void _Encode_02();
void _Decode_01();
void _Decode_02();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_PLAYER_ENTER_NAK)
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
//-------------------------------------------------------------------------------------------------
// 새로운 섹터에 캐릭터가 등장할 때의 정보들
//-------------------------------------------------------------------------------------------------
// 뒤에 PLAYER_RENDER_INFO,ETC_STATE_TOTAL_INFO,VENDOR_RENDER_INFO 가 m_byCount 만큼 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLPLAYERS_CMD)
enum { _MAX_PLAYER_INFO_SIZE = 50, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 뒤에 PLAYER_VILLAGE_INFO,ETC_STATE_TOTAL_INFO,VENDOR_RENDER_INFO 가 m_byCount 만큼 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_VILLAGE_ALLPLAYERS_CMD)
enum { _MAX_PLAYER_INFO_SIZE = 80, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 뒤에 EQUIP_ITEM_BASEINFO가 m_byCount 만큼 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLPLAYERS_EQUIPINFO_CMD)
enum { _MAX_PLAYER_INFO_SIZE = MSG_CG_SYNC_ALLPLAYERS_CMD::_MAX_PLAYER_INFO_SIZE, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 뒤에 MONSTER_RENDER_INFO, ETC_STATE_TOTAL_INFO 가 m_byCount 만큼 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLMONSTERS_CMD)
enum { _MAX_MONSTER_INFO_SIZE = 80, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 뒤에 SUMMONED_RENDER_INFO가 m_byCount 만큼 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLSUMMONEDS_CMD)
enum { _MAX_SUMMONED_INFO_SIZE = MSG_CG_SYNC_ALLMONSTERS_CMD::_MAX_MONSTER_INFO_SIZE, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 뒤에 MAPNPC_RENDER_INFO가 m_byCount 만큼 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLMAPNPC_CMD)
enum { _MAX_MAPNPC_INFO_SIZE = MSG_CG_SYNC_ALLMONSTERS_CMD::_MAX_MONSTER_INFO_SIZE, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 뒤에 TOTEMNPC_RENDER_INFO가 m_byCount 만큼 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLTOTEMNPC_CMD)
enum { _MAX_TOTEMNPC_INFO_SIZE = MSG_CG_SYNC_ALLMONSTERS_CMD::_MAX_MONSTER_INFO_SIZE, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
//_NA_0_20100222_UNIT_TRIGGERS_REGEN
// 뒤에 MERCHANT_RENDER_INFO가 m_byCount 만큼 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLMERCHANTNPC_CMD)
enum { _MAX_MERCHANTNPC_INFO_SIZE = MSG_CG_SYNC_ALLMONSTERS_CMD::_MAX_MONSTER_INFO_SIZE, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLFIELDITEMS_CMD)
enum { _MAX_FIELDITEM_INFO_SIZE = 80, };
BYTE m_byCount;
ITEM_RENDER_INFO m_pFieldItemRenderInfo[_MAX_FIELDITEM_INFO_SIZE];
//
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_pFieldItemRenderInfo);
return static_cast<uint16_t>(kMinSize + sizeof(m_pFieldItemRenderInfo[0]) * m_byCount);
};
PACKET_CG_FWD_CLOSE;
//_NA_0_20100208_DOMINATION_AREA_INFO
// 길드 관계로 인해 길드 랜더 인포 정보를 따로 보낸다.
// 점령지역 상태 정보 추가됨.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLPLAYERS_GUILDRENDERINFO_CMD)
enum { _MAX_GUILD_RENDERINFO_SIZE = MSG_CG_SYNC_ALLPLAYERS_CMD::_MAX_PLAYER_INFO_SIZE, };
BYTE m_byCount;
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
#ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ALLPLAYERS_SUN_RANKING_GRADE_CMD)
enum { _MAX_SUN_RANKING_GRADE_INFO_SIZE = MSG_CG_SYNC_ALLPLAYERS_CMD::_MAX_PLAYER_INFO_SIZE, };
BYTE m_byCount;
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
#endif // _NA_008012_20150204_SUN_RANKING_SYSTEM
//-------------------------------------------------------------------------------------------------
// 플레이어, 몬스터, 아이템이 필드에 등장
//-------------------------------------------------------------------------------------------------
// 뒤에 PLAYER_RENDER_INFO, ETC_STATE_TOTAL_INFO, EQUIP_ITEM_BASEINFO가 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_PLAYER_ENTER_BRD)
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 뒤에 PLAYER_VILLAGE_INFO, ETC_STATE_TOTAL_INFO, EQUIP_ITEM_BASEINFO가 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_VILLAGE_PLAYER_ENTER_BRD)
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_PLAYER_LEAVE_BRD)
enum { _MAX_PLAYER_SIZE = 50 };
BYTE m_byCount;
WORD m_PlayerKey[_MAX_PLAYER_SIZE];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_PlayerKey);
return static_cast<uint16_t>(kMinSize + sizeof(m_PlayerKey[0]) * m_byCount);
}
PACKET_CG_FWD_CLOSE;
// 뒤에 MONSTER_RENDER_INFO가 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_MONSTER_ENTER_BRD)
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_SUMMONED_ENTER_BRD)
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_MAPNPC_ENTER_BRD)
DWORD m_dwMapNpcID;
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
//_NA_0_20100222_UNIT_TRIGGERS_REGEN
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_MERCHANT_ENTER_BRD)
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 뒤에 TOTEMNPC_RENDER_INFO가 따라온다.
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_TOTEMNPC_ENTER_BRD)
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_MONSTER_DIR_ENTER_BRD)
WORD wAngle;
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// Boss 몬스터 등장
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_BOSS_MONSTER_ENTER_BRD)
DWORD m_dwBossCode; // 보스몬스터 코드
WzVector m_vCurPos; // 몬스터 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_MONSTER_LEAVE_BRD)
enum { _MAX_MONSTER_SIZE = 50 };
BYTE m_byCount;
DWORD m_dwObjectKey[_MAX_MONSTER_SIZE];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_dwObjectKey);
return static_cast<uint16_t>(kMinSize + sizeof(m_dwObjectKey[0]) * m_byCount);
}
PACKET_CG_FWD_CLOSE;
// 필드아이템
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_FIELDITEM_ENTER_BRD)
DWORD m_dwFromMonsterKey;
ITEM_RENDER_INFO m_ItemRenderInfo;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_FIELDITEM_LEAVE_BRD)
enum { _MAX_FIELDITEM_SIZE = 50 };
BYTE m_byCount;
DWORD m_dwObjectKey[_MAX_FIELDITEM_SIZE];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_dwObjectKey);
return static_cast<uint16_t>(kMinSize + sizeof(m_dwObjectKey[0]) * m_byCount);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_OBJECT_DISAPPEAR_DEAD_BRD)
DWORD m_dwObjectKey;
PACKET_CG_FWD_CLOSE;
//-------------------------------------------------------------------------------------------------
// 캐릭터 이동
//-------------------------------------------------------------------------------------------------
#ifdef _NA_0_20111114_CHANGE_MOVE_PATH_COUNT
enum { _MAX_PATHROUTE_SIZE = 512 };
#else
enum { _MAX_PATHROUTE_SIZE = 64 };
#endif
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_MOVE_SYN)
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T3(144), 1);
WzVector wvCurPos;
WzVector wvDestPos;
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T5(9));
PACKET_RND_SHRBLK64_RNDCONT(GETRNDNO_RNG32_T1(89), 1);
#ifdef _NA_0_20111114_CHANGE_MOVE_PATH_COUNT
PACKET_RND_SHRBLK64_CONT(DWORD, m_byNumRoute); // 경로 상의 타일 개수
#else
PACKET_RND_SHRBLK64_CONT(BYTE, m_byNumRoute); // 경로 상의 타일 개수
#endif
PACKET_RND_SHRBLK64_END();
TILEINDEX m_iRoute[ _MAX_PATHROUTE_SIZE ]; // 경로
uint16_t GetPacketSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_iRoute);
#ifdef _NA_0_20111114_CHANGE_MOVE_PATH_COUNT
DWORD routes = m_byNumRoute;
#else
uint8_t routes = (BYTE)m_byNumRoute;
#endif
return static_cast<uint16_t>(kMinSize + sizeof(m_iRoute[0]) * routes);
}
void Encode();
void Decode();
void _Encode_T1();
void _Encode_T2();
void _Decode_T1();
void _Decode_T2();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_MOVE_NAK)
WzVector m_wvCurPos;
BYTE m_byErrorCode; // eSYNC_RESULT
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_MOVE_BRD)
DWORD m_dwObjectKey;
BYTE m_byState;
WzVector wvCurPos;
WzVector wvDestPos;
uint16_t GetPacketSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_MOVE_THRUST_BRD)
DWORD m_dwObjectKey;
BYTE m_byState; // 상태(걷기, 뛰기)
WzVector wvCurPos;
WzVector wvDestPos;
WORD wTileIndex;
uint16_t GetPacketSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_TARGET_MOVE_SYN)
DWORD m_dwTargetKey;
WzVector wvCurPos;
WzVector wvDestPos;
#ifdef _NA_0_20111114_CHANGE_MOVE_PATH_COUNT
DWORD m_byNumRoute; // 경로 상의 타일 개수
#else
BYTE m_byNumRoute; // 경로 상의 타일 개수
#endif
TILEINDEX m_iRoute[ _MAX_PATHROUTE_SIZE ]; // 경로
//
uint16_t GetPacketSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_iRoute);
return static_cast<uint16_t>(kMinSize + sizeof(m_iRoute[0]) * m_byNumRoute);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_TARGET_MOVE_BRD)
DWORD m_dwTargetKey;
WORD m_wPlayerKey;
WzVector wvCurPos;
WzVector wvDestPos;
uint16_t GetPacketSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 키보드 이동
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_KBMOVE_SYN)
WzVector wvCurPos;
WORD m_wAngle;
TILEINDEX m_wTileIndex;
BYTE m_byMoveState;
#ifdef _NA000000_SPEED_HACK_PREVENTION_SUPPORT
DWORD issued_serial;
ulong client_test_result;
int move_speed;
#endif
uint16_t GetSize() const { return sizeof(*this); }
void Encode();
void Decode();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_KBMOVE_BRD)
WORD m_wPlayerKey;
WzVector wvCurPos;
TILEINDEX m_wTileIndex;
WORD m_wAngle;
BYTE m_byMoveState;
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 전방 숏대시, 구르기 키보드 이동
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_FAST_KBMOVE_SYN)
WzVector m_wvCurPos;
WORD m_wAngle;
TILEINDEX m_wTileIndex;
BYTE m_byCmsMoveState; // eCHAR_MOVE_STATE
#ifdef _NA000000_SPEED_HACK_PREVENTION_SUPPORT
DWORD issued_serial;
ulong client_test_result;
int move_speed;
void Encode();
void Decode();
#endif
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_FAST_KBMOVE_BRD)
WORD m_wPlayerKey;
WzVector m_wvCurPos;
WORD m_wAngle;
TILEINDEX m_wTileIndex;
BYTE m_byCmsMoveState;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_JUMP_SYN)
WzVector m_wvDestPos;
int m_iDir;
#ifdef _NA000000_SPEED_HACK_PREVENTION_SUPPORT
DWORD issued_serial;
ulong client_test_result;
#endif
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_JUMP_STOP_SYN)
WzVector m_wvDestPos;
#ifdef _NA000000_SPEED_HACK_PREVENTION_SUPPORT
DWORD issued_serial;
ulong client_test_result;
#endif
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_JUMP_STOP_NAK)
DWORD m_byErrorCode; //< eSYNC_RESULT
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_JUMP_ACK)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_JUMP_NAK)
WzVector m_wvCurPos;
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_JUMP_BRD)
PLAYERKEY m_PlayerKey;
WzVector m_wvDestPos;
int m_iDir;
PACKET_CG_FWD_CLOSE;
// NPC 점프 명령
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_NPC_JUMP_BRD)
bool m_bJumpAttack;
DWORD m_dwObjectKey;
WzVector m_wvEndPos;
PACKET_CG_FWD_CLOSE;
// 몬스터 점프 공격
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_NPC_JUMPRESULT_BRD)
DWORD m_dwObjectKey;
DWORD m_dwTargetObjectKey;
BYTE m_byAttackType;
WzVector m_wvCurPos;
DAMAGETYPE m_wDamage;
WORD m_wTargetHP;
BYTE m_byEffect; // 공격 결과에 대한 특수 이펙트(크리티컬이 터졌다...)
PACKET_CG_FWD_CLOSE;
// 플레이어 정지
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_STOP_SYN)
WzVector wvCurPos;
#ifdef _NA000000_SPEED_HACK_PREVENTION_SUPPORT
DWORD issued_stop_serial;
ulong client_test_result;
#endif
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_STOP_BRD)
DWORD dwObjectKey;
WzVector wvCurPos;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// NPC 정지
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_NPC_STOP_BRD)
DWORD dwObjectKey;
WzVector wvCurPos;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 플레이어 액션 끝남 알림
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_ACTION_EXPIRED_CMD)
PACKET_CG_FWD_CLOSE;
// 플레이어 강제 이동
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_FORCED_WARP_BRD)
DWORD dwObjectKey;
WzVector wvWarpPos;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 럭키몬스터 도망
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_LUCKY_MONSTER_RUNAWY_BRD)
DWORD m_dwObjectKey;
int m_iRotateAngle;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_COMPOSED_STREAM_CMD)
WAR_MSG_HDR m_Header[1]; // Stream Header, next pointer is data stream
uint16_t GetSize() const
{ return static_cast<uint16_t>(sizeof(*this) + m_Header->size); }
PACKET_CG_FWD_CLOSE;
// NOTE: f110315.2L, _NA001955_110210_WING_COSTUME
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_WINGS_CONTROL_SYN)
WingControl header;
uint16_t GetSize() const {
return sizeof(*this);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SYNC, CG_SYNC_WINGS_CONTROL_CMD)
WingControl header;
WingControlData data;
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(data);
return static_cast<uint16_t>(kMinSize + data.GetSize());
}
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_CRYPTOGRAPHY
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <Cryptography>
// 패킷 암호화 키 교환 및 주기적 알고리즘 변환
PACKET_CG_OPEN(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_KEY)
BYTE m_bySN; // Sequence Number
BYTE m_byCryptInfo; // 인코딩된 패킷 암호화키 블록 풀기 위한 키
union {
DWORD m_dwUserKey;
BYTE m_byCryptData[200]; // 알고리즘 정보 (키, 등등...)
};
BYTE& GetSNKey() { return m_bySN; }
void SetSNKey(BYTE bySNKey) { m_bySN = bySNKey; }
BYTE& GetCryptInfo() { return m_byCryptInfo; }
void SetCryptInfo(BYTE byCryptInfo) { m_byCryptInfo = byCryptInfo; }
BYTE* GetCryptStream() { return m_byCryptData; }
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_SNK_KEY)
DWORD m_dwSNKey;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_SNK_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_ACK)
DWORD m_dwANSKEY;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_NAK)
PACKET_CG_CLOSE;
// 암호화된 패킷 풀기위한...
struct MSG_CG_CRYPTOGRAPHY_PACKET_ENCODED {
BYTE m_bySN; // Sequence Number : received
BYTE m_byCRC;
BYTE m_byStream[1]; // 패킷마다 다른 크기를 가질 것이다.
BYTE& GetSNKey() { return m_bySN; }
void SetSNKey(BYTE bySNKey) { m_bySN = bySNKey; }
BYTE& GetCRC() { return m_byCRC; }
void SetCRC(BYTE byCRC) { m_byCRC = byCRC; }
BYTE* GetPacketStream() { return m_byStream; }
DWORD GetHeaderSize() { return (sizeof(BYTE)*2); }
};
// 패킷 암호화 하기 위한...
struct MSG_CG_CRYPTOGRAPHY_PACKET_ENCODING {
BYTE m_bySN; // Sequence Number : sending
BYTE m_byCRC;
BYTE m_byStream[1]; // 패킷마다 다른 크기를 가질 것이다.
BYTE& GetSNKey() { return m_bySN; }
void SetSNKey(BYTE bySNKey) { m_bySN = bySNKey; }
BYTE& GetCRC() { return m_byCRC; }
void SetCRC(BYTE byCRC) { m_byCRC = byCRC; }
BYTE* GetPacketStream() { return m_byStream; }
DWORD GetHeaderSize() { return (sizeof(BYTE)*2); }
};
// <END>
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_ARMORKIT ==> HACKSHIELD
//
// <Waverix><ArmorKit>
//////////////////////////////////
// int값에 대한 문제... 타입이 절대적이지 못하다.
//
// Armorkit 관련 패킷
struct MSG_CG_ARMORKIT_FINDHACK_SYN : public MSG_BASE
{
MSG_CG_ARMORKIT_FINDHACK_SYN()
{
m_byCategory = CG_ARMORKIT;
m_byProtocol = CG_ARMORKIT_FINDHACK;
}
int HackType; // 탐지한 해킹 타입 (e.g. AKDETECT_SPEEDHACK)
int Size; // Buffer 의 길이
char Buf[1024]; // 데이터 버퍼-1024는 보안파트에서 전달받은 암묵적 최대값(성현창)
int GetSize() const { return sizeof(*this); }
};
#ifdef __ARMORKIT_ENABLED_CHECK_BY_CMDnACK__
PACKET_CG_OPEN(CG_ARMORKIT, CG_ARMORKIT_SEED_TEST_CMD)
int m_iSEED;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ARMORKIT, CG_ARMORKIT_SEED_TEST_ACK)
enum { eARMORKIT_AKS_KEYLENGTH = 32, };
char m_pszGeneratedSeed[eARMORKIT_AKS_KEYLENGTH+1];
PACKET_CG_CLOSE;
#endif //__ARMORKIT_ENABLED_CHECK_BY_CMDnACK__
///! -----------------------------------------------------
#if USING_HACKSHIELD
//__NA000000_070913_HACKSHIELD_INSTALLATION__
PACKET_CG_OPEN(CG_ARMORKIT, CG_HACKSHIELD_SERVER_EX_QUERY_CMD)
AHNHS_TRANS_BUFFER m_HShieldReqBlock;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ARMORKIT, CG_HACKSHIELD_SERVER_EX_QUERY_ACK)
AHNHS_TRANS_BUFFER m_HShieldAnsBlock;
PACKET_CG_CLOSE;
#elif USING_XIGNCODE
PACKET_CG_OPEN(CG_ARMORKIT, CG_XIGNCODE_SERVER_QUERY_CMD)
ulong reserve_tag;
uint8_t buffer[XIGNCODE_GAME_PACKET_SIZE];
PACKET_CG_CLOSE;
PACKET_CG_INHERIT_OPEN(CG_ARMORKIT, CG_XIGNCODE_SERVER_QUERY_ACK,
MSG_CG_XIGNCODE_SERVER_QUERY_CMD)
PACKET_CG_CLOSE;
// dummy code
PACKET_CG_OPEN(CG_ARMORKIT, CG_HACKSHIELD_SERVER_EX_QUERY_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ARMORKIT, CG_HACKSHIELD_SERVER_EX_QUERY_ACK)
PACKET_CG_CLOSE;
#endif //
// USING_GAMEGUARD
PACKET_CG_OPEN(CG_ARMORKIT, CG_GAMEGUARD_SERVER_QUERY_CMD)
BYTE buffer[GAMEGUARD_CSAUTH_PACKET_SIZE]; // 인증쿼리
UINT32 query_size; // 인증쿼리 사이즈
void clear()
{
ZeroMemory(buffer, sizeof(buffer));
query_size = 0;
}
PACKET_CG_CLOSE;
PACKET_CG_INHERIT_OPEN(CG_ARMORKIT, CG_GAMEGUARD_SERVER_QUERY_ACK, MSG_CG_GAMEGUARD_SERVER_QUERY_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ARMORKIT, CG_GAMEGUARD_HACKDATA_CMD)
BYTE buffer[GAMEGUARD_HACKDATA_PACKET_SIZE];
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ARMORKIT, CG_GAMEGUARD_SERVER_QUERY_NAK)
UINT32 result_code;
PACKET_CG_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_BATTLE
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 플레이어 공격
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_PLAYER_ATTACK_SYN)
PACKET_RND_PAD_START(GETRNDNO_RNG04_T4(138));
DWORD dwClientSerial; // 클라이언트에서 보낸 시리얼을 브로드 캐스트
#ifdef _NA003109_STYLE_PRESENTATION_IMPROVEMENT
uint8_t byAttackType; // 공격 타입 (1타, 2타, 3타), ref:eATTACK_SEQUENCE
uint8_t byAttackPropensity; // 강제공격 여부
uint8_t style_presentation; // default(0), client animation presentation
#else
BYTE byAttackPropensity : 2; // 강제공격 여부
BYTE byAttackType : 6; // 공격 타입
#endif
DWORD dwTargetKey; // 공격 대상의 오브젝트 키
WzVector wvCurPos; // 공격자의 현재위치
WzVector wvDestPos;
#ifdef _NA000000_SPEED_HACK_PREVENTION_SUPPORT
ulong client_test_result;
#endif
PACKET_RND_PAD_END();
void Encode();
void Decode();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_PLAYER_ATTACK_BRD)
DWORD dwAttackerKey; // 공격자의 오브젝트 키
BYTE byAttackType; // 공격 타입
SLOTCODE StyleCode; // 스타일 코드
DWORD dwClientSerial; // 클라이언트에서 보낸 시리얼을 브로드 캐스트
WzVector wvCurPos; // 공격자의 현재위치
DWORD dwTargetKey ; // 공격 대상의 오브젝트 키
DAMAGETYPE wDamage; // 공격 데미지
DWORD dwTargetHP; // 공격 후 타겟의 HP
BYTE byEffect; // 공격 결과에 대한 특수 이펙트(크리티컬이 터졌다...)
BYTE byEtherComboCount; // 에테르 탄환 장착 시 콤보
void Init()
{
byEtherComboCount = 0;
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_PLAYER_ATTACK_NAK)
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// 일반 범위공격 결과정보
struct AREA_ATTACK_RESULT_INFO
{
DWORD m_dwTargetKey; // 공격 당하는 오브젝트 키
DAMAGETYPE m_wDamage; // 공격 데미지
DWORD m_dwTargetHP; // 공격 후 타겟의 HP
BYTE m_byEffect;
BYTE m_byComboCount; // 에테르 탄환 장착 시 콤보
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
DWORD target_sd; // 공격 후 타겟의 SD
#endif // _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
};
// 플레이어 일반 범위공격
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_PLAYER_AREA_ATTACK_BRD)
DWORD m_dwClientSerial; // 공격 이벤트에 대한 고유 번호
DWORD m_dwAttackerKey; // 공격자의 오브젝트 키
DWORD m_dwPrimaryTargetKey; // 주공격 대상 오브젝트 키
WzVector m_wvCurPos; // 공격자의 현재 좌표
SLOTCODE m_StyleCode; // 스타일 코드
BYTE m_byAttackType; // 공격 타입
BYTE m_byNumberOfTargets; // 공격 대상의 수량
AREA_ATTACK_RESULT_INFO AttackInfo[MAX_TARGET_NUM];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(AttackInfo);
return static_cast<uint16_t>(kMinSize + sizeof(AttackInfo[0]) * m_byNumberOfTargets);
}
PACKET_CG_FWD_CLOSE;
// 발키리 기본 공격
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_VKR_ATTACK_SYN)
DWORD dwTargetKey; // 공격 대상의 오브젝트 키
DWORD dwClientSerial; // 클라이언트에서 보낸 시리얼을 브로드 캐스트
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_VKR_ATTACK_BRD)
DWORD dwAttackerKey; // 공격자의 오브젝트 키
DWORD dwClientSerial; // 클라이언트에서 보낸 시리얼을 브로드 캐스트
DWORD dwTargetKey ; // 공격 대상의 오브젝트 키
DAMAGETYPE wDamage; // 공격 데미지
DWORD dwTargetHP; // 공격 후 타겟의 HP
BYTE byEffect; // 공격 결과에 대한 특수 이펙트(크리티컬이 터졌다...)
PACKET_CG_FWD_CLOSE;
// 발키리 무기 재장전
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_VKR_RELOAD_SYN) //사용안함
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_VKR_RELOAD_BRD) //사용안함
DWORD m_dwObjKey;
PACKET_CG_FWD_CLOSE;
// 몬스터 기본 공격
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_MONSTER_ATTACK_CMD)
DWORD m_dwObjectKey;
DWORD m_dwTargetObjectKey;
BYTE m_byAttackType;
WzVector m_wvCurPos;
DAMAGETYPE m_wDamage;
WORD m_wTargetHP;
WORD m_wTargetReserveHP;
BYTE m_byEffect; // 공격 결과에 대한 특수 이펙트(크리티컬이 터졌다...)
PACKET_CG_FWD_CLOSE;
//// 플레이어 오브젝트 공격
//PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_P2O_ATTACK_SYN)
// DWORD dwTargetKey; // 공격 대상의 오브젝트 키
//PACKET_CG_FWD_CLOSE;
//
//PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_P2O_ATTACK_BRD)
// DAMAGETYPE m_wDamage;
// DWORD m_dwTargetHP; // HP
//PACKET_CG_FWD_CLOSE;
//
//PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_P2O_ATTACK_NAK)
//PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_MONSTER_STATUS_RESIST_BRD)
DWORD m_dwMonsterObjKey; // 상태저항을 성공한 몬스터 ObjKey
BYTE m_ScriptIndex; // 스크립트에서 몇 번째 상태저항을 사용했나(0, 1)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_CHARGE_ETHER_BULLET_BRD)
DWORD m_dwPlayerKey;
BYTE m_BulletIndex;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_REMOVE_ETHER_BULLET_BRD)
DWORD m_dwPlayerKey;
PACKET_CG_FWD_CLOSE;
//_NA_008321_20150601_BATTLE_INFO
PACKET_CG_FWD_OPEN(CG_BATTLE, CG_BATTLE_DETAIL_INFORMATION_CMD)
DAMAGETYPE damage;
SLOTCODE skill_code;
CHAR attacker_name[MAX_CHARNAME_LENGTH+1];
CHAR target_name[MAX_CHARNAME_LENGTH+1];
PACKET_CG_FWD_CLOSE;
//==================================================================================================
// CG_STYLE
//
// 스타일 시작 브로드
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_PLAYER_ATTACK_BRD)
DWORD dwAttackerKey; // 공격자의 오브젝트 키
BYTE byAttackType; // 공격 타입
SLOTCODE StyleCode; // Style Code
DWORD dwClientSerial; // 공격 이벤트에 대한 고유 번호
DWORD dwPrimaryTargetKey; // 주공격 대상 오브젝트 키
WzVector wvCurPos;
uint16_t GetSize() { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 스타일 결과 브로드
struct STYLE_ATTACK_RESULT_INFO
{
DWORD dwTargetKey; // 공격 당하는 오브젝트 키
DAMAGETYPE wDamage; // 공격 데미지
DWORD dwTargetHP; // 공격 후 타겟의 HP
WzVector wvCurPos;
WzVector wvDestPos;
BYTE byEffect;
BYTE byEtherComboCount;
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
DWORD target_sd; // 공격 후 타겟의 SD
#endif // _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
};
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_PLAYER_ATTACK_RESULT_BRD)
DWORD dwClientSerial; // 공격 이벤트에 대한 고유 번호
DWORD dwAttackerKey; // 공격자의 오브젝트 키
BYTE byNumberOfTargets; // 공격 대상의 수량
STYLE_ATTACK_RESULT_INFO AttackInfo[MAX_TARGET_NUM];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(AttackInfo);
return static_cast<uint16_t>(kMinSize + sizeof(AttackInfo[0]) * byNumberOfTargets);
}
PACKET_CG_FWD_CLOSE;
// 스타일 지정
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_SELECT_STYLE_SYN)
SLOTCODE m_NewStyleCode; // 지정할 스타일 코드
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_SELECT_STYLE_BRD)
DWORD m_dwObjectKey; // 스타일을 바꾼 캐릭터 오브젝트 키
SLOTCODE m_CurStyleCode; // 현재 스타일
SLOTCODE m_NewStyleCode; // 새로 지정된 스타일
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_SELECT_STYLE_NAK)
SLOTCODE m_CurStyleCode;
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// 스타일 등록
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_LINK_SYN)
SLOTCODE m_StyleCode;
POSTYPE m_ToPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_LINK_ACK)
SLOTCODE m_StyleCode;
POSTYPE m_ToPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_LINK_NAK)
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_UNLINK_SYN)
POSTYPE m_atPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_UNLINK_ACK)
POSTYPE m_atPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_UNLINK_NAK)
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_LINKMOVE_SYN)
POSTYPE m_fromPos;
POSTYPE m_toPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_LINKMOVE_ACK)
POSTYPE m_fromPos;
POSTYPE m_toPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STYLE, CG_STYLE_LINKMOVE_NAK)
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//==================================================================================================
// CG_SKILL
//
//-------------------------------------------------------------------------------------------------
// 스킬 구사
//-------------------------------------------------------------------------------------------------
PACKET_CG_FWD_OPEN(CG_SKILL, CG_SKILL_ACTION_SYN)
DWORD m_dwClientSerial; // Skill 이벤트에 대한 고유 번호
DWORD m_dwMainTargetKey; // 주공격대상의 오브젝트 키
BYTE m_byAttackPropensity; // 강제공격 여부
SLOTCODE m_SkillCode; // Skill 코드
WzVector m_wvCurPos; // 클라이언트가 주는 플레이어의 현재 좌표
WzVector m_wvDestPos; // 플레이어의 목적지 좌표
WzVector m_wvMainTargetPos; // 주공격대상의 위치
uint16_t GetSize() const { return sizeof(*this); };
void Encode();
void Decode();
PACKET_CG_FWD_CLOSE;
//-------------------------------------------------------------------------------------------------
// 스킬 액션 정보(InstantResult, DelayStart, DelayResult)
//-------------------------------------------------------------------------------------------------
struct SKILL_ACTION_BASE : public MSG_BASE_FORWARD
{
SLOTCODE m_SkillCode; // Skill 코드
DWORD m_dwClientSerial; // 공격 이벤트에 대한 고유 번호
DWORD m_dwAttackerKey; // 공격자의 오브젝트 키
DWORD m_dwPrimaryTargetKey; // 주공격 대상 오브젝트 키
WzVector m_wvMainTargetPos; // 주공격대상의 위치
};
struct MSG_CG_SKILL_ACTION_INSTANT_RESULT_BRD : SKILL_ACTION_BASE
{
WzVector m_wvCurPos; // 공격자의 현재 좌표
WzVector m_wvDestPos; // 공격자의 목적지 좌표
DWORD m_dwAttackerHP; // 스킬을 쓰고난 후 공격자의 HP
DWORD m_dwAttackerMP; // 스킬을 쓰고난 후 공격자의 MP
BYTE m_byNumberOfTargets : 6; // 공격 대상의 수량
BYTE m_byNumberOfFieldEffect : 2; // 필드에 걸리는 이펙트가 있을 경우 그 수량
uint16_t GetSize() { return sizeof(*this); };
};
struct MSG_CG_SKILL_ACTION_DELAY_START_BRD : SKILL_ACTION_BASE
{
WzVector m_wvCurPos; // 공격자의 현재 좌표
WzVector m_wvDestPos; // 공격자의 목적지 좌표
uint16_t GetSize() { return sizeof(*this); };
};
struct MSG_CG_SKILL_ACTION_DELAY_RESULT_BRD : SKILL_ACTION_BASE
{
DWORD m_dwAttackerHP; // 스킬을 쓰고난 후 공격자의 HP
DWORD m_dwAttackerMP; // 스킬을 쓰고난 후 공격자의 MP
BYTE m_byNumberOfTargets : 6; // 공격 대상의 수량
BYTE m_byNumberOfFieldEffect : 2; // 필드에 걸리는 이펙트가 있을 경우 그 수량
uint16_t GetSize() { return sizeof(*this); };
};
// Skill Casting Cancel Syn
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_CASTING_CANCEL_SYN )
SLOTCODE m_SkillCode; // Skill 코드
PACKET_CG_FWD_CLOSE;
// Skill Casting Cancel Ack(BRD)
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_CASTING_CANCEL_BRD )
DWORD m_dwObjectKey; // 스킬 소유자 오브젝트키
SLOTCODE m_SkillCode; // Skill 코드
PACKET_CG_FWD_CLOSE;
// Skill Casting Cancel NAK
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_CASTING_CANCEL_NAK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_ACTION_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// 폭탄투하 이펙트 결과
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_EFFECT_BOMB_BRD )
DWORD m_dwAttackerKey;
SLOTCODE m_SkillCode;
BYTE m_byNumberOfTargets;
EFFECT_BOMB_INFO m_DamageInfo[MAX_TARGET_NUM];
//
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_DamageInfo);
return static_cast<uint16_t>(kMinSize + sizeof(m_DamageInfo[0]) * m_byNumberOfTargets);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_SELF_DESTRUCTION_BRD )
DWORD m_dwAttackerKey;
SLOTCODE m_SkillCode;
BYTE m_byNumberOfTargets;
DAMAGE_INFO m_DamageInfo[MAX_TARGET_NUM];
//
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_DamageInfo);
return static_cast<uint16_t>(kMinSize + sizeof(m_DamageInfo[0]) * m_byNumberOfTargets);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_TRANSPARENT_BRD )
DWORD m_dwObjectKey;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_SUCTION_BRD )
DWORD m_dwAttackerKey; // 흡수를 발생시킨 공격자 키
SLOTCODE m_SkillCode; // 주기데미지를 발생시키는 스킬코드
DAMAGETYPE m_wTargetDamage; // 흡수 데미지
DWORD m_dwTargetHP; // 타겟의 남은 HP
DWORD m_dwTargetMP; // 타겟의 남은 MP
DWORD m_dwAttackerHP; // 공격자의 남은 HP
DWORD m_dwAttackerMP; // 공격자의 남은 MP
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_VITAL_SUCTION_BRD )
DWORD m_dwAttackerKey; // 흡수를 발생시킨 공격자 키
DWORD m_dwTargetKey; // 타겟의 키.
DWORD m_dwHP; // 타겟의 남은 HP
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_EXECUTE_STATUS_CMD )
DWORD m_dwTargetKey; // 타겟의 키.
DWORD m_wStatusCode; // 상태코드.
WORD m_iStatusTime; // 상태유지시간.
PACKET_CG_FWD_CLOSE;
//-------------------------------------------------------------------------------------------------
// 스킬 결과 정보
//-------------------------------------------------------------------------------------------------
struct SKILL_RESULT_BASE
{
DWORD m_dwTargetKey; // 공격 당하는 오브젝트 키
BYTE m_bySkillEffect : 5; // NPC에 적용될 스킬 효과
BYTE m_byAbilityNum : 3; // Ability 개수(타격이 성공한 것만 보낸다)
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
BOOL isDamaged; // 1번Ability에 의해서 피해를 입었는지 여부를 체크
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
int GetSize() { return sizeof(SKILL_RESULT_BASE); };
};
struct EFFECT_INFO
{
DWORD m_Time;
WzVector m_wvEffectPos;
};
struct SKILL_RESULT_EFFECT
{
WORD m_wAbilityIndex; // Ability Index
BYTE m_byCount;
EFFECT_INFO m_EffectInfo[MAX_EFFECT_COUNT];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_EffectInfo);
return static_cast<uint16_t>(kMinSize + sizeof(m_EffectInfo[0]) * m_byCount);
}
};
struct SKILL_RESULT_CODE
{
WORD m_wAbilityIndex; // Ability Index
WORD m_wStatusCode;
int m_iStatusTime; // 상태 유지시간
#ifdef _NA_007667_20141001_WITCHBLADE_SKILL
WORD overlap_status_count; // 중첩버프일경우, 중첩횟수
#endif //_NA_007667_20141001_WITCHBLADE_SKILL
uint16_t GetSize() const { return sizeof(*this); };
};
// eABILITY_DAMAGE
struct SKILL_RESULT_DAMAGE : SKILL_RESULT_CODE
{
DAMAGETYPE m_wDamage; // 공격 데미지
DWORD m_dwTargetHP; // 공격 후 타겟의 HP
BYTE m_byEffect; // 데미지 이펙트(크리티컬 등등)
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
DWORD target_sd; // 공격 후 타켓의 SD
#endif // _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
uint16_t GetSize() const { return sizeof(*this); };
};
// eABILITY_ABNORMAL_STATUS
struct SKILL_RESULT_STUN : SKILL_RESULT_CODE
{
WzVector m_wvCurPos; // 공격대상의 현재 좌표
uint16_t GetSize() const { return sizeof(*this); };
};
// eABILITY_KNOCKBACK
struct SKILL_RESULT_POSITION : SKILL_RESULT_CODE
{
WzVector m_wvCurPos; // 공격대상의 현재 좌표
WzVector m_wvDestPos; // 공격대상의 목적지 좌표
uint16_t GetSize() const { return sizeof(*this); };
};
// eABILITY_EXHAUST_HP, eABILITY_EXHAUST_MP
struct SKILL_RESULT_EXHAUST : SKILL_RESULT_CODE
{
DWORD m_dwTargetHP; // 스킬 사용 후 타겟의 남은 HP
DWORD m_dwTargetMP; // 스킬 사용 후 타겟의 남은 MP
uint16_t GetSize() const { return sizeof(*this); };
};
// eABILITY_FIGHTING_ENERGY_NUM_INCREASE, eABILITY_BONUS_DAMAGE_PER_FIGHTING_ENERGY
struct SKILL_RESULT_FIGHTING_ENERGY : SKILL_RESULT_CODE
{
SHORT m_sFightingEnergyCount; // 현재 투기 개수
uint16_t GetSize() const { return sizeof(*this); };
};
// eABILITY_RESURRECTION
struct SKILL_RESULT_RESURRECTION : SKILL_RESULT_CODE
{
WzVector m_wvCurPos; // 부활대상의 현재 좌표
DWORD m_dwTargetHP; // 부활대상의 HP
DWORD m_dwTargetMP; // 부활대상의 MP
uint16_t GetSize() const { return sizeof(*this); };
};
// eABILITY_MONSTER_TRANSFORMATION
struct SKILL_RESULT_MONSTER_TRANSFORMATION : SKILL_RESULT_CODE
{
DWORD m_dwHP;
DWORD m_dwMaxHP;
WORD m_wMoveSpeedRatio; // 이동속도(100을 곱한 %수치)
WORD m_wAttSpeedRatio; // 공격속도(100을 곱한 %수치)
uint16_t GetSize() const { return sizeof(*this); };
};
struct SKILL_RESULT_SELF_DESTRUCTION : SKILL_RESULT_CODE
{
DWORD m_dwHP;
DWORD m_dwTargetHP;
uint16_t GetSize() const { return sizeof(*this); };
};
//-------------------------------------------------------------------------------------------------
// 주기 데미지, 반사 데미지, 기타
//-------------------------------------------------------------------------------------------------
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_PERIODIC_DAMAGE_BRD )
DWORD m_dwAttackerKey; // 주기데미지를 발생시킨 공격자 키
SLOTCODE m_SkillCode; // 주기데미지를 발생시키는 스킬코드
BYTE m_byNumberOfTargets; // 공격 대상의 수량
DAMAGE_INFO m_DamageInfo[MAX_TARGET_NUM]; // 공격 대상의 데미지 정보
int GetSize()
{
return sizeof(*this) - sizeof(DAMAGE_INFO) * (MAX_TARGET_NUM - m_byNumberOfTargets);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_REFLECT_DAMAGE_BRD )
DWORD m_dwAttackerKey; // 주기데미지를 발생시킨 공격자 키
DWORD m_dwTargetKey; // 공격 당하는 오브젝트 키
SLOTCODE m_SkillCode; // 피격 스킬코드
WORD m_wAbilityCode; // 피격 어빌리티 코드
DAMAGETYPE m_wDamage; // 공격 데미지
DWORD m_dwTargetHP; // 공격 후 타겟의 HP
DWORD m_dwTargetResrveHP; // 공격후 타겟의 적립된 HP
int GetSize() { return sizeof(*this); };
PACKET_CG_FWD_CLOSE;
//-------------------------------------------------------------------------------------------------
// 스킬 포인트 업
//-------------------------------------------------------------------------------------------------
//_NA_0_20110131_SKILLTREE_SYSTEM_RENEWAL
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_SELECT_SKILLPOINT_SYN )
enum { max_skill_count = MAX_SKILL_COUNT};
uint skill_count;
SLOTCODE skill_code_array[max_skill_count]; // SkillCode, StyleCode
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(skill_code_array);
return static_cast<uint16_t>(kMinSize + sizeof(skill_code_array[0]) * skill_count);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_SELECT_SKILLPOINT_ACK )
int remain_skill_point;
SKILL_TOTAL_INFO skill_total_info; // 새로 등록되는 스킬슬롯 정보
int GetSize()
{
return ( sizeof(*this) - (SKILL_TOTAL_INFO::MAX_SLOT_NUM-skill_total_info.m_Count)*sizeof(SKILLSLOT) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_SELECT_SKILLPOINT_NAK )
uint error_code;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_REFRESH_CMD )
SKILL_TOTAL_INFO m_SkillInfo;
int GetSize()
{
return ( sizeof(*this) - (SKILL_TOTAL_INFO::MAX_SLOT_NUM-m_SkillInfo.m_Count)*sizeof(SKILLSLOT) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_POINT_REMAIN_CMD )
INT m_iRemainSkill;
PACKET_CG_FWD_CLOSE;
//-------------------------------------------------------------------------------------------------
// 패시브 스킬 리스트 브로드
//-------------------------------------------------------------------------------------------------
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_PASSIVE_SKILL_LIST_CMD )
DWORD m_dwObjectKey; // 스킬 소유자 오브젝트키
BYTE m_byCount;
SLOTCODE m_SkillCode[MAX_SKILL_SLOT_NUM];
int GetSize()
{
return (sizeof(*this)-(MAX_SKILL_SLOT_NUM-m_byCount)*sizeof(SLOTCODE));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SKILL, CG_SKILL_PASSIVE_SKILL_ADD_CMD )
DWORD m_dwObjectKey; // 스킬 소유자
SLOTCODE m_OldSkillCode; // 이전 스킬 코드(처음으로 습득하는 경우는 0이다)
SLOTCODE m_NewSkillCode; // 변경된 혹은 습득한 스킬 코드
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_CONVERSATION
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
struct MSG_CG_CONVERSATION_FIELDCHAT_SYN : public MSG_BASE_FORWARD
{
enum { _MAX_CHATMSG_SIZE = 255 };
DWORD m_dwObjectKey;
BYTE m_byMsgLength;
char m_pszChatMsg[ _MAX_CHATMSG_SIZE+1 ];
int GetSize()
{
return sizeof(*this) - (_MAX_CHATMSG_SIZE - m_byMsgLength);
}
};
struct MSG_CG_CONVERSATION_FIELDCHAT_BRD : public MSG_CG_CONVERSATION_FIELDCHAT_SYN {};
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 새로 방 테스트 할때 사용하는 패킷 시작!!!!!
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 미션 로비 방 리스트 요청
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_MISSIONLOBBY_SYN )
BYTE m_Count;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_MISSIONLOBBY_ACK )
enum { _MAX_ROOM_NUM = 40, };
BYTE m_Count;
MISSION_ROOMINFO m_RoomInfo[_MAX_ROOM_NUM];
int GetSize()
{
return sizeof(*this) - (_MAX_ROOM_NUM-m_Count)*sizeof(MISSION_ROOMINFO);
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_MISSIONLOBBY_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 헌팅 로비 방 리스트 요청
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_HUNTINGLOBBY_SYN )
BYTE m_Count;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_HUNTINGLOBBY_ACK )
enum { _MAX_ROOM_NUM = 40, };
BYTE m_Count;
HUNTING_ROOMINFO m_RoomInfo[_MAX_ROOM_NUM];
int GetSize()
{
return sizeof(*this) - (_MAX_ROOM_NUM-m_Count)*sizeof(HUNTING_ROOMINFO);
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_HUNTINGLOBBY_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// PVP 로비 방 리스트 요청
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_PVPLOBBY_SYN )
BYTE m_Count;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_PVPLOBBY_ACK )
enum { _MAX_ROOM_NUM = 40, };
BYTE m_Count;
PVP_ROOMINFO m_RoomInfo[_MAX_ROOM_NUM];
int GetSize()
{
return sizeof(*this) - (_MAX_ROOM_NUM-m_Count)*sizeof(PVP_ROOMINFO);
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_PVPLOBBY_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 경쟁헌팅 로비 방 리스트 요청
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_CHUNTINGLOBBY_SYN )
BYTE m_Count;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_CHUNTINGLOBBY_ACK )
enum { _MAX_ROOM_NUM = 40, };
BYTE m_Count;
CHUNTING_ROOMINFO m_RoomInfo[_MAX_ROOM_NUM];
int GetSize()
{
return sizeof(*this) - (_MAX_ROOM_NUM-m_Count)*sizeof(CHUNTING_ROOMINFO);
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_CHUNTINGLOBBY_NAK )
DWORD m_byErrorCode;
PACKET_CG_CLOSE;
// 참가가능한 경쟁헌팅 방 리스트 요청
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_CHUNTING_SYN )
BYTE m_Count;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_CHUNTING_ACK )
enum { _MAX_ROOM_NUM = 40, };
BYTE m_Count;
CHUNTING_ROOMINFO m_RoomInfo[_MAX_ROOM_NUM];
int GetSize()
{
return sizeof(*this) - (_MAX_ROOM_NUM-m_Count)*sizeof(CHUNTING_ROOMINFO);
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_CHUNTING_NAK )
DWORD m_byErrorCode;
PACKET_CG_CLOSE;
// 진행된 헌팅 방 리스트 요청
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_HUNTING_SYN )
BYTE m_Count;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_HUNTING_ACK )
enum { _MAX_ROOM_NUM = 40, };
BYTE m_Count;
HUNTING_ROOMINFO m_RoomInfo[_MAX_ROOM_NUM];
int GetSize()
{
return sizeof(*this) - (_MAX_ROOM_NUM-m_Count)*sizeof(HUNTING_ROOMINFO);
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_HUNTING_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 특정 방 리스트 새로고침
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_REFRESH_SYN )
KEYTYPE m_RoomKey; //< 새로고침할 방의 키
BYTE m_byRoomType; //< eZONETYPE
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_REFRESH_HUNTINGLOBBY_ACK )
HUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_REFRESH_MISSIONLOBBY_ACK )
MISSION_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_REFRESH_PVPLOBBY_ACK )
PVP_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_REFRESH_CHUNTINGLOBBY_ACK )
CHUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_REFRESH_HUNTING_ACK )
HUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_REFRESH_CHUNTING_ACK )
CHUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_REFRESH_NONE_ACK )
KEYTYPE m_RoomKey; //< 방정보가 없다. 파괴되었다.
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LIST_REFRESH_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 바로가기
// 비밀방은 바로가기되지 않는다.
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_SHORTCUT_SYN )
BYTE m_byRoomType; //< eZONETYPE 의 값 eZONETYPE_HUNTING or eZONETYPE_MISSION의 값중 하나
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_SHORTCUT_HUNTINGLOBBY_ACK )
HUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_SHORTCUT_MISSIONLOBBY_ACK )
MISSION_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_SHORTCUT_PVPLOBBY_ACK )
PVP_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_SHORTCUT_CHUNTINGLOBBY_ACK )
CHUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_SHORTCUT_HUNTING_ACK )
HUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_SHORTCUT_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 아이디로 방 찾기
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_FIND_ROOM_FROM_CHARID_SYN )
char m_pszCharName[MAX_CHARNAME_LENGTH];
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSIONLOBBY_ROOM_FROM_CHARID_ACK )
MISSION_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTINGLOBBY_ROOM_FROM_CHARID_ACK )
HUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PVPLOBBY_ROOM_FROM_CHARID_ACK )
PVP_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTINGLOBBY_ROOM_FROM_CHARID_ACK )
CHUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_ROOM_FROM_CHARID_ACK )
HUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_ROOM_FROM_CHARID_ACK )
CHUNTING_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_FIND_ROOM_FROM_CHARID_NAK )
DWORD m_dwErrorCode; //< return 5601 : 접속되어 있지 않거나, 개설된 방이 없으면
PACKET_CG_CLOSE;
// 방장이 로비(헌팅or미션orPVP)방을 만든다
PACKET_CG_OPEN(CG_ZONE, CG_ZONE_LOBBY_CREATE_SYN)
MAPCODE m_MapCode;
BYTE m_byMaxLimitUserNum;
BYTE m_byRoomType : 6; //< eZONETYPE 의 값 eZONETYPE_HUNTING or eZONETYPE_MISSION의 값중 하나
BYTE m_byRoomPublic : 2; //< eZONEPUBLIC
char m_pszRoomTitle[MAX_ROOMTITLE_LENGTH];
BASE_ROOMINFO m_RoomInfo;
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize() const
{// m_byRoomPublic체크를하라(클라이언트신뢰할수없다.)
return (m_byRoomPublic == eZONEPUBLIC_PUBLIC) ?
sizeof(*this) - sizeof(char) * MAX_ROOMPASSWORD_LENGTH :
sizeof(MSG_CG_ZONE_LOBBY_CREATE_SYN);
}
void Encode();
void Decode();
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CREATE_ACK )
KEYTYPE m_LobbyKey;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CREATE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_LOBBY_NAME_CHANGE_SYN )
char m_pszRoomTitle[MAX_ROOMTITLE_LENGTH];
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_LOBBY_NAME_CHANGE_ACK )
char m_pszRoomTitle[MAX_ROOMTITLE_LENGTH];
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_LOBBY_NAME_CHANGE_NAK )
DWORD m_dwErrorCode; //< eROOM_RESULT
PACKET_CG_CLOSE;
// 로비 참가
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_JOIN_SYN )
KEYTYPE m_LobbyKey;
BYTE m_byRoomPublic; //< eZONEPUBLIC
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{// m_byRoomPublic체크를하라(클라이언트신뢰할수없다.)
return (m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_LOBBY_JOIN_SYN));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_JOIN_ACK )
DWORD m_dwMasterKey; //< 방장 플레이어 키
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_JOIN_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 경쟁헌팅 조인로비 생성
PACKET_CG_OPEN(CG_ZONE, CG_ZONE_CHUNTINGLOBBY_CREATE_SYN)
KEYTYPE m_LinkHuntingKey; //< 링크시킬 경쟁헌팅방 키
BYTE m_byRoomPublic; //< eZONEPUBLIC
char m_pszRoomTitle[MAX_ROOMTITLE_LENGTH];
BASE_ROOMINFO m_RoomInfo; //< 생성할 방 정보
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize() const
{
return (m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_SYN));
}
void Encode();
void Decode();
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTINGLOBBY_CREATE_ACK )
KEYTYPE m_LobbyKey;
SLOTCODE m_MapCode;
ADDITIONAL_CHUNTINGINFO m_AdditionalCHuntingInfo;
BYTE m_NonBlockNum;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTINGLOBBY_CREATE_NAK )
DWORD m_byErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MASTER_CHANGED_BRD )
DWORD m_dwMasterPlayerKey;
PACKET_CG_CLOSE;
// 레디 버튼을 누름
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_READY_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_READY_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_READY_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_READY_BRD )
DWORD m_PlayerKey; //< 레디를 누른 플레이어
PACKET_CG_CLOSE;
// 레디 버튼을 누름
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_READY_CANCEL_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_READY_CANCEL_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_READY_CANCEL_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_READY_CANCEL_BRD )
DWORD m_PlayerKey; //< 레디취소를 누른 플레이어
PACKET_CG_CLOSE;
// 방참가한 사람이 기존의 방의 정보 요청
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_REQUEST_INFO_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_HUNTING_REQUEST_INFO_ACK )
SLOTCODE m_MapCode;
ADDITIONAL_ROOMINFO m_AdditionalInfo;
BYTE m_NonBlockNum :4;
BYTE m_Count :4;
DWORD m_dwReadyPlayerKey[MAX_PARTYMEMBER_NUM]; //< 자기자신 불 포함 + 방장 불 포함
int GetSize()
{
return (sizeof(*this) - sizeof(DWORD)*(MAX_PARTYMEMBER_NUM-m_Count));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_MISSION_REQUEST_INFO_ACK )
SLOTCODE m_MapCode;
BYTE m_NonBlockNum;
BYTE m_Count;
uint16_t m_dwReadyPlayerKey[MAX_PARTYMEMBER_NUM]; //< 자기자신 불 포함 + 방장 불 포함
// CHANGES: f110608.6L
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_dwReadyPlayerKey);
return static_cast<uint16_t>(kMinSize + sizeof(m_dwReadyPlayerKey[0]) * m_Count);
};
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_PVP_REQUEST_INFO_ACK )
SLOTCODE m_MapCode;
ADDITIONAL_PVPINFO m_AdditionalPVPInfo;
BYTE m_NonBlockNum :4;
BYTE m_Count :4;
PVP_LOBBY_INFO m_PlayerInfo[MAX_PARTYMEMBER_NUM]; //< 자기자신 포함 + 방장포함
// CHANGES: f110608.6L
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_PlayerInfo);
return static_cast<uint16_t>(kMinSize + sizeof(m_PlayerInfo[0]) * m_Count);
};
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHUNTING_REQUEST_INFO_ACK )
SLOTCODE m_MapCode;
ADDITIONAL_CHUNTINGINFO m_AdditionalCHuntingInfo;
BYTE m_NonBlockNum;
BYTE m_Count;
uint16_t m_dwReadyPlayerKey[MAX_PARTYMEMBER_NUM]; //< 자기자신 불 포함 + 방장 불 포함
// CHANGES: f110608.6L
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_dwReadyPlayerKey);
return static_cast<uint16_t>(kMinSize + sizeof(m_dwReadyPlayerKey[0]) * m_Count);
};
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_REQUEST_INFO_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 인원수 변경
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_NUMBEROFPLAYER_SYN )
BYTE m_NumberOfPlayers;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_NUMBEROFPLAYER_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_NUMBEROFPLAYER_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_NUMBEROFPLAYER_BRD )
BYTE m_NumberOfPlayers;
PACKET_CG_CLOSE;
// 인원수 변경
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_NONBLOCKSLOTNUM_SYN )
BYTE m_NonBlockSlotNum;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_NONBLOCKSLOTNUM_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_NONBLOCKSLOTNUM_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_NONBLOCKSLOTNUM_BRD )
BYTE m_NonBlockSlotNum;
PACKET_CG_CLOSE;
// 플레이어 강퇴
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_KICKPLAYER_SYN )
DWORD m_PlayerKey; //< 강퇴할 플레이어 키
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_KICKPLAYER_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_KICKPLAYER_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 플레이어 팀 변경
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHANGE_TEAM_SYN )
BYTE m_Team; //< 변경할 팀 (1or2)
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHANGE_TEAM_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHANGE_TEAM_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHANGE_TEAM_BRD )
DWORD m_dwPlayerKey; //< 변경한 플레이어 키
BYTE m_Team; //< 변경한 플레이어의 팀
PACKET_CG_CLOSE;
// 맵 변경
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHANGE_MAP_SYN )
MAPCODE m_MapCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHANGE_MAP_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHANGE_MAP_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHANGE_MAP_BRD )
MAPCODE m_MapCode;
PACKET_CG_CLOSE;
// 로비의 헌팅 제한 설정 바꿈( 난이도, 보너스)
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_HUNTING_CONFIG_SYN )
ADDITIONAL_ROOMINFO m_AdditionalInfo; //< 변경할 설정값
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_HUNTING_CONFIG_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_HUNTING_CONFIG_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_HUNTING_CONFIG_BRD )
ADDITIONAL_ROOMINFO m_AdditionalInfo; //< 변경된 설정값
PACKET_CG_CLOSE;
// 로비의 PVP 제한 설정 바꿈( 룰, 모드)
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_PVP_CONFIG_SYN )
ADDITIONAL_PVPINFO m_AdditionalPVPInfo; //< 변경할 설정값
PACKET_CG_CLOSE;
//PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_PVP_CONFIG_ACK )
//PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_PVP_CONFIG_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_PVP_CONFIG_BRD )
ADDITIONAL_PVPINFO m_AdditionalPVPInfo;
BYTE m_Count;
PVP_LOBBY_INFO m_PlayerInfo[MAX_PARTYMEMBER_NUM]; //< 자기자신 포함 + 방장포함
// CHANGES: f110608.6L
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_PlayerInfo);
return static_cast<uint16_t>(kMinSize + sizeof(m_PlayerInfo[0]) * m_Count);
};
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_PVP_INFO_BRD )
// 들어온 사람의 정보
DWORD m_dwPlayerKey;
BYTE m_Team;
PACKET_CG_CLOSE;
// 로비의 헌팅 제한 설정 바꿈( 난이도, 보너스)
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHUNTING_CONFIG_SYN )
ADDITIONAL_CHUNTINGINFO m_AdditionalInfo; //< 변경할 설정값
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHUNTING_CONFIG_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHUNTING_CONFIG_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_CHUNTING_CONFIG_BRD )
ADDITIONAL_CHUNTINGINFO m_AdditionalInfo; //< 변경된 설정값
PACKET_CG_CLOSE;
// 헌팅 생성 ( START를 누름 )
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_CREATE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_CREATE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 미션 생성 ( START를 누름 )
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_CREATE_SYN )
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T4(229), 1);
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_CREATE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// PVP 생성 ( START를 누름 )
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PVP_CREATE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PVP_CREATE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 경쟁헌팅 생성 ( START를 누름 )
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_CREATE_SYN )
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T3(229), 1);
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_CREATE_NAK )
BYTE m_byErrorCode;
PACKET_CG_CLOSE;
// 경쟁헌팅 참가
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_MIGRATE_SYN )
KEYTYPE m_CHuntingKey; //< 참가할 헌팅 키
BYTE m_byRoomPublic; //< eZONEPUBLIC
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_CHUNTING_MIGRATE_SYN));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_JOIN_ACK )
DWORD m_dwMasterObjKey;
MAPCODE m_MapCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_JOIN_NAK )
DWORD m_byErrorCode;
PACKET_CG_CLOSE;
//-------------------------------------------------------------------------------------------------
// 방참가 요청
//-------------------------------------------------------------------------------------------------
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTINGLOBBY_JOIN_CMD )
bool m_bRequireConfirm; // 유저 동의를 받아야 하는가
HUNTING_ROOMINFO m_RoomInfo;
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_RoomInfo.m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_HUNTINGLOBBY_JOIN_CMD));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSIONLOBBY_JOIN_CMD )
bool m_bRequireConfirm;
MISSION_ROOMINFO m_RoomInfo;
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_RoomInfo.m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_MISSIONLOBBY_JOIN_CMD));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PVPLOBBY_JOIN_CMD )
bool m_bRequireConfirm;
PVP_ROOMINFO m_RoomInfo;
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_RoomInfo.m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_PVPLOBBY_JOIN_CMD));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTINGLOBBY_JOIN_CMD )
bool m_bRequireConfirm;
CHUNTING_ROOMINFO m_RoomInfo;
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_RoomInfo.m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_CHUNTINGLOBBY_JOIN_CMD));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_JOIN_CMD )
bool m_bRequireConfirm;
HUNTING_ROOMINFO m_RoomInfo;
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_RoomInfo.m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_HUNTING_JOIN_CMD));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_JOIN_CMD )
bool m_bRequireConfirm;
MISSION_ROOMINFO m_RoomInfo;
PACKET_CG_CLOSE;
// 헌팅 참가
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_JOIN_SYN )
KEYTYPE m_HuntingKey; //< 참가할 헌팅 키
BYTE m_byRoomPublic; //< eZONEPUBLIC
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_HUNTING_JOIN_SYN));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_JOIN_ACK )
KEYTYPE m_HuntingKey; //< 참가한 헌팅 키
MAPCODE m_MapCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_JOIN_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 미션 참가
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_JOIN_ACK )
KEYTYPE m_MissionKey; //< 참가한 미션 키
MAPCODE m_MapCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_JOIN_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// PVP 참가
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PVP_JOIN_ACK )
KEYTYPE m_PVPKey; //< 참가한 미션 키
MAPCODE m_MapCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PVP_JOIN_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_LEAVE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_LEAVE_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_LOBBY_LEAVE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_LEAVE_SYN )
enum {
REASON_INTEND, // 자의적 미션 탈퇴
REASON_EXPULSION, // 추방
};
BYTE m_Reason;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_LEAVE_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_LEAVE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_LEAVE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_LEAVE_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_LEAVE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PVP_LEAVE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PVP_LEAVE_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PVP_LEAVE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_LEAVE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_LEAVE_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_LEAVE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 릴레이 헌팅 생성
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_RELAY_CREATE_SYN )
MAPCODE m_MapCode; //< 생성할 맵 정보
BASE_ROOMINFO m_RoomInfo; //< 생성할 방 정보
ADDITIONAL_ROOMINFO m_AdditionalInfo; //< 생성할 부가 정보
BYTE m_byRoomPublic; //< eZONEPUBLIC
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_HUNTING_RELAY_CREATE_SYN));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_RELAY_CREATE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_RELAY_CREATE_BRD )
KEYTYPE m_HuntingKey;
CODETYPE m_MapCode; //< 생성할 맵 정보
BASE_ROOMINFO m_RoomInfo; //< 생성할 방 정보
ADDITIONAL_ROOMINFO m_AdditionalInfo; //< 생성할 부가 정보
BYTE m_byRoomPublic; //< eZONEPUBLIC
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_HUNTING_RELAY_CREATE_BRD));
}
PACKET_CG_CLOSE;
// 릴레이 헌팅 참가
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_RELAY_JOIN_SYN )
KEYTYPE m_HuntingKey; //< 참가할 헌팅 키
BYTE m_byRoomPublic; //< eZONEPUBLIC
char m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
int GetSize()
{
return (m_byRoomPublic==eZONEPUBLIC_PUBLIC?sizeof(*this)-sizeof(char)*MAX_ROOMPASSWORD_LENGTH:sizeof(MSG_CG_ZONE_HUNTING_RELAY_JOIN_SYN));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_RELAY_JOIN_ACK )
// KEYTYPE m_HuntingKey; //< 참가한 헌팅 키
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_HUNTING_RELAY_JOIN_NAK )
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
// 포탈을 이용한 필드간 이동.
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PORTAL_FIELD_MOVE_SYN )
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG32_T3(996));
PACKET_RND_SHRBLK64_CONT(WORD, m_wIndex);
PACKET_RND_SHRBLK64_END();
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PORTAL_FIELD_MOVE_ACK )
WORD m_wIndex; // 이용하려는 포탈 idx
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PORTAL_FIELD_MOVE_NAK )
BYTE m_byErrorCode;
PACKET_CG_CLOSE;
// 죽었을때 필드에서 마을로 이동.
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_RETURN_VILLAGE_SYN )
PACKET_RND_PAD_CONT(GETRNDNO_RNG04_T2(44), 1);
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_RETURN_VILLAGE_ACK )
WORD m_wMapCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_RETURN_VILLAGE_NAK )
BYTE m_byErrorCode;
PACKET_CG_CLOSE;
// 헌팅로비 최대유저수 변경
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTINGLOBBY_CHANGE_MAXUSER_CMD )
BYTE m_byMaxLimitUser;
PACKET_CG_CLOSE;
// GM 명령에 의한 필드간 이동
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_GMPORTAL_FIELD_MOVE_CMD )
CODETYPE m_MapCode;
PACKET_CG_CLOSE;
// 릴레이 미션 생성
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_RELAY_CREATE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_RELAY_CREATE_BRD )
KEYTYPE m_LobbyKey;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_RELAY_CREATE_NAK )
BYTE m_ErrorCode;
PACKET_CG_CLOSE;
// 릴레이 미션 참가
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_RELAY_JOIN_SYN )
KEYTYPE m_LobbyKey;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_MISSION_RELAY_JOIN_ACK )
KEYTYPE m_LobbyKey;
DWORD m_dwMasterKey;
PACKET_CG_CLOSE;
// 방의 SpecialType이 바뀜
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHANGE_SPECIALTYPE_CMD )
BYTE m_SpecialType; // eROOM_SPECIAL_TYPE
PACKET_CG_CLOSE;
// [11/18/2009 namka199] _NA_0_20091118_GAMEROOM_BATTLE_RESULT 게임방의 전투 결과 통보
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PLAYER_BATTLE_RESULT_SYN )
BYTE m_OwnerGuild; // 0 : 자신의 길드 그외 상대 길드
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PLAYER_BATTLE_RESULT_NAK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_INSERT_BATTLE_PLAYER_CMD )
ZONE_INSERT_BATTLE_PLAYER_INFO m_ZonePlayers;
int GetSize()
{
return ( sizeof(*this)-(ZONE_INSERT_BATTLE_PLAYER_INFO::MAX_PLAYER-m_ZonePlayers.m_PlayerCount)*sizeof(GAMEROOM_BATTLE_ENTER_INFO) );
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_REMOVE_BATTLE_PLAYER_CMD )
ZONE_REMOVE_BATTLE_PLAYER_INFO m_ZonePlayers;
int GetSize()
{
return ( sizeof(*this)-(ZONE_REMOVE_BATTLE_PLAYER_INFO::MAX_PLAYER-m_ZonePlayers.m_PlayerCount)*sizeof(GAMEROOM_BATTLE_LEAVE_INFO) );
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_PLAYER_BATTLE_RESULT_ACK )
ZONE_UPDATE_BATTLE_PLAYER_INFO m_ZonePlayers;
int GetSize()
{
return ( sizeof(*this)-(ZONE_UPDATE_BATTLE_PLAYER_INFO::MAX_PLAYER-m_ZonePlayers.m_PlayerCount)*sizeof(GAMEROOM_BATTLE_UPDATE_INFO) );
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_CHUNTING_BATTLE_INFO_CMD )
BYTE m_HomeTeamWinCount;
BYTE m_AwayTeamWinCount;
PACKET_CG_CLOSE;
// 방 번호로 방 찾기
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_FIND_ROOM_FROM_NO_SYN )
WORD m_RoomNo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX , CG_ZONE_EX_TUTORIAL_FIELD_LEAVE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX , CG_ZONE_EX_TUTORIAL_MISSION_LEAVE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX , CG_ZONE_EX_TUTORIAL_MISSION_LEAVE_CMD )
MAPCODE m_MapCode; // 클라의 이전마을 설정을 변경시킨다. (캐릭터 시작 마을로...)
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX , CG_ZONE_EX_ROOM_JOIN_ACK )
KEYTYPE m_ktROOMKEY; //< 참가한 방 키
MAPCODE m_MapCode; //< 참가한 방 맵코드
// 이전 JOIN계열과 포맷 위치를 맞추기 위한 작업
FIELDCODE m_fcCODE; //< 참가한 방 필드코드 (파티장 위치한 필드)
BYTE m_byZONETYPE; //< 참가한 방 타입
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX , CG_ZONE_EX_CAN_CREATE_100LEVEL_QUEST_MISSION_SYN )
#if defined(_CHINA) || defined(_JAPAN) // (WAVERIX)(080818)(FAKE-CODE) 나중에 수정하겠음. ㅠㅠ
#define __EXTRA_OP (1)
#else
#define __EXTRA_OP (0)
#endif
BYTE __dummy1[(PROTOCOL_GENERATOR_ZONE_EX_077)%4 + __EXTRA_OP];
#undef __EXTRA_OP
POSTYPE m_ItemPos; // 사용하고자 하는 아이템... (서버에서 할 수 있기야 하겠지만, 불필요한 연산이나 오류 방어처리 피하자)
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX , CG_ZONE_EX_CAN_JOIN_100LEVEL_QUEST_MISSION_ACK )
enum eRESULT { FAIL = PROTOCOL_GENERATOR_ZONE_EX_089, SUCCESS = PROTOCOL_GENERATOR_ZONE_EX_091 };
enum eFAIL_RC_CODE { RET_ITEM = PROTOCOL_GENERATOR_ZONE_EX_014, RET_ROOM = PROTOCOL_GENERATOR_ZONE_EX_016 };
BYTE m_Result; // eRESULT
union {
struct {
BYTE m_byKind; // eFAIL_RC_CODE { RET_ITEM 이면 eITEM_RESULT, RET_ROOM이면 eROOM_RESULT }
DWORD m_dwErrorCode;
} RETINFO_FAIL; //
struct {
MAPCODE m_MapCode;
} RETINFO_SUCCESS; //
};
inline VOID SetFailResult( BYTE kind, DWORD errorCode )
{
m_Result = FAIL;
RETINFO_FAIL.m_byKind = kind; RETINFO_FAIL.m_dwErrorCode = errorCode;
}
inline VOID SetSuccessResult( MAPCODE mapCode )
{
m_Result = SUCCESS;
RETINFO_SUCCESS.m_MapCode = mapCode;
}
// for Client 성공 여부 판단용
inline BOOL IsSuccess() { return SUCCESS == m_Result; }
inline WORD GetSize()
{
const WORD DEF_SIZE = sizeof(MSG_BASE_FORWARD) + sizeof(BYTE);
return SUCCESS == m_Result ? DEF_SIZE + sizeof(RETINFO_SUCCESS) : DEF_SIZE + sizeof(RETINFO_FAIL);
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX , CG_ZONE_EX_CAN_JOIN_100LEVEL_QUEST_MISSION_NAK )
PACKET_CG_CLOSE;
//_NA_008069_20150210_ADD_SPA_SYSTEM
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_SPA_ENTER_SYN)
CODETYPE item_code;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_SPA_ENTER_ACK)
MAPCODE spa_mapcode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_SPA_ENTER_NAK)
BYTE error_code;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_SPA_LEAVE_SYN)
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_SPA_LEAVE_ACK)
MAPCODE return_map_code;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_SPA_LEAVE_NAK)
BYTE error_code;
PACKET_CG_CLOSE;
//_NA_008334_20150608_SONNENSCHEIN
// SONNENSCHEIN PACKET
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_SONNENSCHEIN_TIME_SYNC_BRD)
DWORD remain_time_; //밀리세컨드
BYTE event_state_;
PACKET_CG_CLOSE;
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 새로 방 테스트 할때 사용하는 패킷 끝!!!!
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_ITEM
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_MOVE_SYN )
SLOTIDX m_fromIndex;
SLOTIDX m_toIndex;
POSTYPE m_fromPos;
POSTYPE m_toPos;
DURATYPE move_quantity_; // 이동 수량, _NA_000070_20100609_ENHANCED_ITEM_DIVISION
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_MOVE_ACK )
SLOTIDX m_fromIndex;
SLOTIDX m_toIndex;
POSTYPE m_fromPos;
POSTYPE m_toPos;
DURATYPE move_quantity_; // 이동 수량, _NA_000070_20100609_ENHANCED_ITEM_DIVISION
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_MOVE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_LINKITEM_SYN )
//SLOTIDX m_OrgSlotIdx;
POSTYPE m_OrgPos;
POSTYPE m_ToPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_LINKITEM_ACK )
//SLOTIDX m_OrgSlotIdx;
POSTYPE m_OrgPos;
POSTYPE m_ToPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_LINKITEM_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_LINKSKILL_SYN )
SLOTCODE m_SkillCode;
POSTYPE m_ToPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_LINKSKILL_ACK )
SLOTCODE m_SkillCode;
POSTYPE m_ToPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_LINKSKILL_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_UNLINK_SYN )
POSTYPE m_atPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_UNLINK_ACK )
POSTYPE m_atPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_UNLINK_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_MOVE_SYN )
POSTYPE m_fromPos;
POSTYPE m_toPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_MOVE_ACK )
POSTYPE m_fromPos;
POSTYPE m_toPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUICK_MOVE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
// 퀵슬롯의 연결된 아이템 정보 갱신 (클라이언트 -> 서버)
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_QUICK_UPDATE_LINKED_ITEM_CMD)
typedef WORD MessageSize;
POSTYPE target_quick_slot_position; // 갱신할 퀵슬롯 위치
SLOTIDX new_linked_item_container_type; // SI_INVENTORY, SI_EQUIPMENT
POSTYPE new_linked_item_position; // 연결할 아이템 위치
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PICK_SYN )
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T4(12));
PACKET_RND_SHRBLK64_CONT(DWORD, m_dwFieldItemObjectKey);
PACKET_RND_SHRBLK64_END();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_PICK_ACK)
INVENTORY_TOTAL_INFO m_ItemInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_ItemInfo);
return static_cast<uint16_t>(kMinSize + m_ItemInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PICK_NAK )
DWORD m_dwErrorCode;
DWORD m_dwFieldItemObjectKey; //< 실패한 아이템 ObjectKey
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PICK_BRD )
DWORD m_dwObjKey;
SLOTCODE m_ItemCode;
PACKET_CG_FWD_CLOSE;
struct MSG_CG_ITEM_DROP_SYN : public MSG_BASE_FORWARD
{
SLOTIDX m_atIndex;
POSTYPE m_atPos;
};
struct MSG_CG_ITEM_DROP_ACK : public MSG_CG_ITEM_DROP_SYN
{};
struct MSG_CG_ITEM_DROP_NAK : public MSG_BASE_FORWARD
{
DWORD m_dwErrorCode;
};
struct MSG_CG_ITEM_COMBINE_SYN : public MSG_BASE_FORWARD
{
SLOTIDX m_fromIndex;
SLOTIDX m_toIndex;
POSTYPE m_fromPos;
POSTYPE m_toPos;
DURATYPE combine_quantity_; // 합칠 수량, _NA_000070_20100609_ENHANCED_ITEM_DIVISION
};
struct MSG_CG_ITEM_COMBINE_ACK : public MSG_CG_ITEM_COMBINE_SYN
{};
struct MSG_CG_ITEM_COMBINE_NAK : public MSG_BASE_FORWARD
{
DWORD m_dwErrorCode;
};
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_DIVIDE_SYN )
POSTYPE m_fromPos;
POSTYPE m_toPos;
DURATYPE m_fromNum;
DURATYPE m_toNum;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_DIVIDE_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_DIVIDE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_SYN )
SLOTIDX m_atIndex;
POSTYPE m_atPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_ACK )
SLOTIDX m_atIndex;
POSTYPE m_atPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_NAK )
BYTE m_ErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_BRD )
DWORD m_dwObjKey;
SLOTCODE m_ItemCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_CMD )
POSTYPE m_ItemPos;
PACKET_CG_FWD_CLOSE;
//아이템 사용시 모션과 타켓이 있는경우 모션 시작
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_MOTION_SYN )
SLOTIDX m_atIndex;
POSTYPE m_atPos;
WzVector m_wvMainTargetPos; // 주공격 위치
PACKET_CG_FWD_CLOSE;
//아이템 모션 시작을 알린다.
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_MOTION_BRD )
DWORD m_dwAttackerKey;
CODETYPE m_ItemCode;
WzVector m_wvMainTargetPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_MOTION_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//아이템 사용시 타켓이 있는경우(자기자신이 아닌경우).
PACKET_CG_INHERIT_OPEN( CG_ITEM, CG_ITEM_USE_SKILL_ACTION_SYN, MSG_CG_ITEM_USE_SYN )
WzVector m_wvMainTargetPos; // 주공격 위치
BYTE byAttackPropensity; // 강제공격 여부
CODETYPE target_code_; // 아이템 사용 대상의 코드, _NA_000587_20100928_DOMINATION_BUFF_ITEM
int GetSize() { return sizeof(*this); };
PACKET_CG_INHERIT_CLOSE;
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
// 기간 연장 아이템 사용
// 해당 아이템의 사용은 기간연장 쿠폰/아이템(무기,갑옷) 모두 인벤토리에 위치해야한다.
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_EXTEND_DATE_SYN )
POSTYPE extend_item_position_; // 기간 연장 쿠폰
POSTYPE target_item_position_; // 무기, 갑옷, 악세서리등의 기간 연장 아이템.
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_EXTEND_DATE_ACK )
POSTYPE extend_item_position_; // 기간 연장 쿠폰 위치, 해당위치의 아이템을 1 감소 시킨다.
POSTYPE target_item_position_; // 기간 연장된 아이템의 위치
ITEMSTREAMEX target_item_stream_; // 기간 연장된 아이템의 갱신된 값
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_EXTEND_DATE_NAK )
int error_code_;
PACKET_CG_FWD_CLOSE;
#endif
struct MSG_CG_ITEM_SELL_SYN : public MSG_BASE_FORWARD
{
union
{
BYTE fixSIZE[8];
struct
{
CODETYPE m_NPCCode;
SLOTIDX m_atIndex;
POSTYPE m_atPos;
DURATYPE sell_quantity_; // 판매 수량, _NA_000070_20100609_ENHANCED_ITEM_DIVISION
};
};
void Encode();
void Decode();
};
struct MSG_CG_ITEM_SELL_ACK : public MSG_CG_ITEM_SELL_SYN
{
MONEY m_Money;
};
struct MSG_CG_ITEM_SELL_NAK : public MSG_BASE_FORWARD
{
DWORD m_dwErrorCode;
};
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_BUY_SYN )
CODETYPE m_NPCCode;
DWORD m_dwShopListID;
BYTE m_ShopTabIndex;
BYTE m_ShopItemIndex; //< SHOPINFO::_MAX_SELLITEM_NUM를 넘지 않아야 함
DURATYPE buy_quantity_; // 구매 수량, _NA_000070_20100609_ENHANCED_ITEM_DIVISION
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_BUY_ACK )
#ifdef _NA_20110303_ADD_TYPE_OF_NPCSHOP
NPC_SHOP_TYPE m_ShopType;
#endif
MONEY m_Money;
INVENTORY_TOTAL_INFO m_TotalInfo;
int GetSize()
{
return (sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_TotalInfo.m_InvenCount-m_TotalInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_BUY_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
/* (CHANGES) (f100520.1L) remove an unused section
struct MSG_CG_ITEM_OBTAIN_ACK : public MSG_BASE_FORWARD
{
POSTYPE m_ItemPos;
ITEMSTREAM m_ItemStream;
};
struct MSG_CG_ITEM_OBTAIN_NAK : public MSG_BASE_FORWARD
{
DWORD m_dwErrorCode;
};
*/
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_LOSE_ACK )
// 무조건 인벤토리임, 삭제할 아이템
INVEN_DELETE_TOTAL_INFO m_ItemInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_ItemInfo);
return static_cast<uint16_t>(kMinSize + m_ItemInfo.GetSize());
}
PACKET_CG_FWD_CLOSE;
#ifdef __NA_001027_20080423_RANDOM_REWARD_EVENT_
// 길드PVP 후 이그니스뺏지 교환 보상
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXCHANGE_REWARD_ITEM_SYN )
SLOTCODE m_ItemCode;
DWORD m_Count;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXCHANGE_REWARD_ITEM_ACK )
INVENTORY_TOTAL_INFO m_ItemInfo;
int GetSize()
{
return (
sizeof(MSG_CG_ITEM_EXCHANGE_REWARD_ITEM_ACK) -
(INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_ItemInfo.m_InvenCount-m_ItemInfo.m_TmpInvenCount)*sizeof(INVENTORY_TOTAL_INFO::SLOT_TYPE)
);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXCHANGE_REWARD_ITEM_NAK )
BYTE m_ErrorCode;
PACKET_CG_FWD_CLOSE;
#endif
//---------------------------------------------------------------------------------------------------
//
// 아이템 조합
//
// STREAM으로 보내는 것을 바뀐 정보만을 보내어서 최적화 할 여지가 있다.
// @@@ OPT
//---------------------------------------------------------------------------------------------------
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ENCHANT_SYN )
CODETYPE m_NPCCode;
POSTYPE m_TargetPos; //< 인첸트 할 아이템
BYTE m_SuccessRateIndex; //< 선택한 성공 확률 인덱스 값 ( 0 ~ 3 )
#ifdef _NA_003966_20111227_ADD_ENCHANT
POSTYPE down_guard_item_pos; // 인첸트 실패시 다운 및 소멸 방지 아이템 위치
#endif
void Init()
{
m_NPCCode = 0;
m_TargetPos = INVALID_SLOT_POS;
m_SuccessRateIndex = 0;
#ifdef _NA_003966_20111227_ADD_ENCHANT
down_guard_item_pos = INVALID_SLOT_POS;
#endif
}
uint16_t GetSize() const
{
return static_cast<uint16_t>(sizeof(*this));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ENCHANT_SUCCESS_ACK )
//POSTYPE m_TargetPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ENCHANT_FAILED_ACK )
BYTE m_byErrorCode;
//POSTYPE m_TargetPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ENCHANT_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ENCHANTUP_SYN )
POSTYPE m_TargetPos; //< 인첸트 할 아이템
PACKET_CG_FWD_CLOSE;
// ack시에 클라이언트는 보석을 제거하고
// m_TargetItemEnchant는 성공 혹은 실패에 따른 인첸트 결과 값
// m_TargetItemEnchant == 0이면 대상 아이템 삭제
// m_TargetItemEnchant != 0아니면 대상 아이템의 인첸트 다운
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ENCHANTUP_ACK )
POSTYPE m_TargetPos;
BYTE m_TargetItemEnchant;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ENCHANTUP_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_SOCKET_FILL_SYN )
POSTYPE m_SocketItemPos;
POSTYPE m_TargetPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_SOCKET_FILL_ACK )
POSTYPE m_SocketItemPos;
POSTYPE m_TargetPos;
ITEMSTREAMEX m_TargetItemStream;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_SOCKET_FILL_NAK)
DWORD m_dwErrorCode;
// _NA_000251_20100727_SOCKET_SYSTEM
CODETYPE target_item_code; // 쟈드를 삽입할 대상 아이템 코드
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_SOCKET_EXTRACT_SYN )
POSTYPE m_ChargeIntemPos;
POSTYPE m_TargetPos;
BYTE m_SocketNum;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_SOCKET_EXTRACT_SUCCESS_ACK )
POSTYPE m_ChargeIntemPos;
POSTYPE m_TargetPos;
ITEMSTREAMEX m_TargetItemStream;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_SOCKET_EXTRACT_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ACCESSORY_CREATE_SYN )
enum { LOW_RING = 0, HIGH_RING, LOW_NECKLACE, HIGH_NECKLACE, };
BYTE m_type;
POSTYPE m_SocketItemPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ACCESSORY_CREATE_ACK )
enum { LOW_RING = 0, HIGH_RING, LOW_NECKLACE, HIGH_NECKLACE, };
BYTE m_type;
POSTYPE m_SocketItemPos;
MONEY m_Money;
INVENTORY_TOTAL_INFO m_ItemInfo;
int GetSize()
{
return ( sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_ItemInfo.m_InvenCount-m_ItemInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_ACCESSORY_CREATE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_COMPOSE_SYN )
CODETYPE m_NPCCode;
SLOTCODE m_ComposeListCode;
BYTE m_byMakingNum; //< 만들려는 개수: default는 1이겠지?
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_COMPOSE_SUCCESS_ACK )
BYTE m_byMakingNum; //조합 요청 갯수
DURATYPE m_bySuccessNum; //조합 성공 갯수
MONEY m_Money;
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
DURATYPE m_byPreventNum; //조합 재료 소멸 방지 갯수
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
INVENTORY_TOTAL_INFO m_ItemInfo; // 획득한 아이템(제작결과)
int GetSize()
{
return ( sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_ItemInfo.m_InvenCount-m_ItemInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_COMPOSE_FAILED_ACK )
MONEY m_Money;
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
DURATYPE m_byPreventNum; //조합 재료 소멸 방지 갯수
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_COMPOSE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_CRYSTALIZE_SYN )
CODETYPE m_NPCCode;
SLOTCODE m_CrystalizeListCode;
POSTYPE m_TargetPos; //< 분해할 대상 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_CRYSTALIZE_SUCCESS_ACK )
MONEY m_Money;
INVENTORY_TOTAL_INFO m_ItemInfo;
int GetSize()
{
return ( sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_ItemInfo.m_InvenCount-m_ItemInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_CRYSTALIZE_FAILED_ACK )
MONEY m_Money;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_CRYSTALIZE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXTRASTONE_USE_SYN )
POSTYPE m_ExtraStonePos;
POSTYPE m_TargetPos; //< extrastone을 적용할 대상 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXTRASTONE_USE_ACK )
BYTE m_NOptionAttrValueIndex; //< SCItemSlot::SetNOptionAttr(m_NOptionAttrValueIndex) 함수 사용
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXTRASTONE_USE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_OBTAIN_DEFAULTITEM_CMD )
// DWORD m_ItemCode;
//PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_OBTAIN_ITEM_CMD )
INVENTORY_TOTAL_INFO m_tagInventory;
int GetSize() { return (sizeof(MSG_BASE_FORWARD)+m_tagInventory.GetSize()); }
PACKET_CG_FWD_CLOSE;
//_NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_OBTAIN_ITEM_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_FREE_OWNERSHIP_BRD )
DWORD m_dwObjectKey;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXCHANGE_SYN )
POSTYPE m_atPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXCHANGE_ACK )
INVENTORY_TOTAL_INFO m_tagInventory;
int GetSize() { return (sizeof(MSG_BASE_FORWARD)+m_tagInventory.GetSize()); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXCHANGE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_DELETE_SYN )
POSTYPE m_AtPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_DELETE_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_DELETE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_CHANGE_DURA_CMD )
POSTYPE m_EquipPos;
SLOTCODE m_ItemCode;
DURATYPE m_Dura;
PACKET_CG_FWD_CLOSE;
// 아이템 수리
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_REPAIR_DURA_SYN )
CODETYPE m_NPCCode;
bool m_bAllRepair;
SLOTIDX m_SlotIndex;
POSTYPE m_SlotPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_REPAIR_DURA_ACK )
bool m_bAllRepair;
SLOTIDX m_SlotIndex;
POSTYPE m_SlotPos;
MONEY m_Money;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_REPAIR_DURA_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_BLOCKC_CMD )
SLOTIDX m_SlotIdx;
POSTYPE m_SlotPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PK_DROP_ITEM_CMD )
SLOTIDX m_atIndex;
POSTYPE m_atPos;
PACKET_CG_FWD_CLOSE;
// 내구도 감소로 인한 아이템 소멸
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_DESTROY_DURA_CMD )
SLOTIDX m_SlotIndex;
POSTYPE m_SlotPos;
PACKET_CG_FWD_CLOSE;
// 스크롤 아이템 사용
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PORTAL_SYN )
POSTYPE m_CoordPos;
POSTYPE m_PortalPos;
PACKET_CG_FWD_CLOSE;
// 아이템 슬롯정보 변화
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_CHANGE_ITEM_INFO_CMD )
SLOTIDX m_SlotIndex;
POSTYPE m_SlotPos;
ITEMSTREAMEX m_ItemStream;
PACKET_CG_FWD_CLOSE;
// 아이템 삭제
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_DELETE_CMD )
BYTE m_byReason; // 삭제원인(eITEM_DELETE_RESULT)
SLOTIDX m_atIndex;
POSTYPE m_atPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXTRAINVENTORY_ADD_CMD )
BYTE m_ExtraInventoryTabCount; //< 유료화 탭 전체 개수
PACKET_CG_FWD_CLOSE;
// 좌표 초기화
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_CLEAR_COORD_SYN )
POSTYPE m_ClearPos;
POSTYPE m_CoordPos;
PACKET_CG_FWD_CLOSE;
//스텟 초기화
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_INIT_STAT_SYN )
POSTYPE m_ItemSlotPos;
WORD m_wDecreaseValue;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_INIT_STAT_ACK )
POSTYPE m_ItemSlotPos;
WORD m_wDecreaseValue;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_STAT_ONE_CHANGE_CMD )
BYTE m_AttrType; // eATTR_TYPE
DWORD m_dwValue; // value
INT m_iRemainStat; //< 남은 스탯
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_STAT_ALL_CHANGE_CMD )
SHORT m_sStrength;
SHORT m_sDexterity;
SHORT m_sVitality;
SHORT m_sInteligence;
SHORT m_sSpirit;
SHORT m_sSkillStat1;
SHORT m_sSkillStat2;
INT m_iRemainStat; //< 남은 스탯
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_INIT_STAT_NAK )
BYTE m_ErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EXTEND_CASH_SLOT_CMD )
BYTE m_ExtraEquipCashSlotCount; //< 추가된 유료 캐쉬슬롯 전체개수
PACKET_CG_FWD_CLOSE;
// 서버에서 보내지 않음. 클라에서 처리하지않음. 추후 삭제 또는 다른방향으로사용...
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_SETITEM_CHANGE_BRD )
PLAYERKEY m_PlayerKey;
BOOL m_bFull;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_HAMMER_OF_ALCHEMIST_SYN )
POSTYPE m_ChargeItemPos;
POSTYPE m_TargetItemPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_HAMMER_OF_ALCHEMIST_ACK )
POSTYPE m_ChargeItemPos;
POSTYPE m_TargetItemPos;
ITEMSTREAMEX m_TargetItemStream;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_HAMMER_OF_ALCHEMIST_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_VALIDATION_OF_REIHALT_SYN )
POSTYPE m_TargetItemPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_VALIDATION_OF_REIHALT_ACK )
POSTYPE m_TargetItemPos;
ITEMSTREAMEX m_TargetItemStream;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_VALIDATION_OF_REIHALT_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_PET_ITEM_SYN )
POSTYPE m_PetItemPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_PET_ITEM_ACK )
POSTYPE m_PetItemPos; //성공 시에만 사용
INT m_Result; //eITEM_RESULT
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_PANDORA_ITEM_NAK )
INT m_Result;
POSTYPE m_InventoryPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_MOVE_PANDORA_ITEM_SYN )
POSTYPE m_InventoryPos;
POSTYPE m_PandoraItemPosFrom;
POSTYPE m_PandoraItemPosTo;
BOOL m_MoveInventory;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_MOVE_ALL_PANDORA_ITEM_SYN )
POSTYPE m_InventoryPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_MOVE_PANDORA_ITEM_ACK )
BOOL m_Remove; // 판도라 상자에 아이템이 없다. 삭제필요
BOOL m_MoveInventory; // 판도라 -> 인벤토리
INT m_Result;
POSTYPE m_InventoryPos;
ITEMSTREAMEX m_PandoraItemStream;
INVENTORY_TOTAL_INFO m_InventoryInfo;
#ifdef __NA_1234_LOTTERY_ITEM_RESULT_BUG_FIX
int GetSize()
{
// (WAVERIX) (090721) (BUG-FIX) 패킷 크기 계산... 이러지 맙시다...-.-;;; 단순하게 만드는 방법을 고민합시다.
return sizeof(*this) - sizeof(m_InventoryInfo) + m_InventoryInfo.GetSize();
//return sizeof(m_Remove) + sizeof(m_MoveInventory) + sizeof(m_Result) + sizeof(m_InventoryPos) + sizeof(m_PandoraItemStream)
// + m_InventoryInfo.GetSize();
}
#endif
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_MOVE_PANDORA_ITEM_NAK )
INT m_Result;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_PANDORA_ITEM_SYN )
POSTYPE m_InventoryPos;
PACKET_CG_FWD_CLOSE;
// 따라서 여기 ACK 보낼때, 판도라 상자안에 보여질 아이템 정보가 있어야 한다.
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_PANDORA_ITEM_ACK )
POSTYPE m_InventoryPos;
ITEMSTREAMEX m_PandoraItemStream;
BOOL m_Identity;
// PANDORA Item Status
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PANDORABOX_CLOSE_SYN )
POSTYPE m_InventoryPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PANDORABOX_CLOSE_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PANDORABOX_CLOSE_NAK )
INT m_Result;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_REPURCHASE_SYN )
CODETYPE m_NPCCode;
POSTYPE m_RepurchasePos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_REPURCHASE_ACK )
MONEY m_Money;
INVENTORY_TOTAL_INFO m_TotalInfo;
int GetSize()
{
return (sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_TotalInfo.m_InvenCount-m_TotalInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_REPURCHASE_NAK )
BYTE m_ErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EQUIP_ETHER_DEVICE_SYN )
POSTYPE m_DeviceItemPos;
POSTYPE m_WeaponItemPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EQUIP_ETHER_DEVICE_ACK )
INT m_Result; //eITEM_RESULT
POSTYPE m_DeviceItemPos;
POSTYPE m_WeaponItemPos; //성공시에만 사용
PACKET_CG_FWD_CLOSE;
// _NA_000251_20100727_SOCKET_SYSTEM
// 소켓 다시 생성 요청
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_RECREATE_SOCKET_SYN)
typedef WORD MessageSize;
POSTYPE request_item_pos; // 소켓 다시 생성 요청 아이템 인벤토리 위치
POSTYPE target_item_pos; // 소켓을 다시 생성할 대상 아이템 인벤토리 위치
// 초기화한다. 메시지를 사용하기 전에 안전하게 먼저 호출 해주자.
void Init()
{
request_item_pos = INVALID_SLOT_POS;
target_item_pos = INVALID_SLOT_POS;
}
// 요청을 보내기전에 크기를 수동으로 계산하지 말고 이 함수를 사용하자.
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_FWD_CLOSE;
// 소켓 다시 생성 응답
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_RECREATE_SOCKET_ACK)
typedef WORD MessageSize;
typedef int ResultCode;
// 처리 결과
// 성공 : RC::RC_ITEM_SUCCESS,
// 실패 : 아이템 관련 실패 코드
ResultCode result_code;
// 초기화한다. 메시지를 사용하기 전에 안전하게 먼저 호출 해주자.
void Init()
{
result_code = RC::RC_ITEM_FAILED;
}
// 요청을 보내기전에 크기를 수동으로 계산하지 말고 이 함수를 사용하자.
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_STAT_CHANGE_USE_SYN)
SLOTIDX m_atIndex; // 컨테이너 인덱스
POSTYPE m_atPos; // 체인지 아이템 인덱스
POSTYPE m_ChangeItemPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_STAT_CHANGE_USE_ACK)
SHORT m_ItemCount;
POSTYPE m_atPos; // 체인지 아이템 인덱스
POSTYPE m_ChangeItemPos; // 바뀔 아이템 인덱스
CODETYPE m_ItemCodes[MAX_CHANGE_ITEMSTAT_SLOT_NUM];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_STAT_CHANGE_USE_NAK)
DWORD m_ErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_STAT_CHANGE_SELECT_SYN)
BOOLEAN m_bSelect;// 아이템 선택:TRUE, 그냥 닫음:FALSE
DWORD m_SelectItemCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_STAT_CHANGE_SELECT_ACK)
INVENTORY_TOTAL_INFO m_InventoryInfo;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_STAT_CHANGE_SELECT_NAK)
DWORD m_ErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_USE_CHANGE_PET_NAME_ITEM_SYN)
POSTYPE m_ItemPos;
TCHAR m_PetName[MAX_PET_NAME_LENGTH+1];
PACKET_CG_FWD_CLOSE;
//성공, 실패 모두 이 패킷.(구분은 Result Code로 하세요)
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_USE_CHANGE_PET_NAME_ITEM_ACK)
INT m_ResultCode; //RC::eITEM_RESULT
PACKET_CG_FWD_CLOSE;
//클라가 서버로 보내는 SYN
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_ACTIVE_ETHER_BULLET_SYN)
BYTE m_bActive; // 1이면 활성화 0이면 비활성화
POSTYPE m_ActiveBulletItemPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_ACTIVE_ETHER_BULLET_ACK)
INT m_ResultCode; //RC::eITEM_RESULT
BYTE m_BulletEffectCode; //
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_ETHER_ACTIVE_STATE_BRD)
DWORD m_dwPlayerKey;
BYTE m_bActive; // 1이면 활성화 0이면 비활성화
BYTE m_BulletEffectCode; //
PACKET_CG_FWD_CLOSE;
//서버가 클라로 보내는 CMD
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_INACTIVE_ETHER_BULLET_CMD)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_IDENTIFY_POSSESSION_SYN)
BYTE m_ItemPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_IDENTIFY_POSSESSION_ACK)
INT m_ResultCode; //RC::eITEM_RESULT
POSTYPE m_PossessionItemPos;
ITEMSTREAMEX m_PossessionItemStream;
PACKET_CG_FWD_CLOSE;
//{__NA_0_CASH_ITEM_RENEWAL_SUPERMASTER
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_SYN)
POSTYPE m_FireUpItemPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_ACK)
POSTYPE m_FireUpItemPos;
INT m_ResultCode; //RC::eITEM_RESULT
PACKET_CG_FWD_CLOSE;
//}
// 타기, 내리기, 기타 액션 제어 요청
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_RIDER_CONTROL_SYN)
RiderControl header;
void Clear();
WORD GetSize() const {
return sizeof(*this);
}
PACKET_CG_FWD_CLOSE;
// 타기, 내리기, 기타 액션 제어 요청에 대한 응답, 렌더링 동기화
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_RIDER_CONTROL_BRD, MSG_CG_ITEM_RIDER_CONTROL_SYN)
RiderControlData data;
void SetUnknownFailed() {
header.request = header.eReq_None;
header.result = header.eRet_Failed;
//header.result_code <- 추가 정의되면 입력하기로 하자.
data.data_type = data.eDataType_None;
}
void Clear();
WORD GetSize() const {
return sizeof(*this) - sizeof(data) + data.GetSize();
}
PACKET_CG_INHERIT_CLOSE;
// 타기, 내리기, 기타 액션 제어를 서버의 필요에 따라 제어할 경우 (예: 미션 입장시)
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_RIDER_CONTROL_CMD, MSG_CG_ITEM_RIDER_CONTROL_BRD)
void Clear();
WORD GetSize() const {
return sizeof(*this);
}
PACKET_CG_INHERIT_CLOSE;
// Rider에 Parts 장착/해제 요청
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_RIDER_CONTROL_PARTS_SYN)
RiderControl header;
void Clear();
WORD GetSize() const {
return sizeof(*this);
}
PACKET_CG_FWD_CLOSE;
// Rider에 Parts 장착/해제 요청에 대한 응답, 렌더링 동기화
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_RIDER_CONTROL_PARTS_BRD, MSG_CG_ITEM_RIDER_CONTROL_PARTS_SYN)
RiderControlData data;
void SetUnknownFailed() {
header.request = header.eReq_None;
header.result = header.eRet_Failed;
//header.result_code <- 추가 정의되면 입력하기로 하자.
data.data_type = data.eDataType_None;
}
void Clear();
WORD GetSize() const {
return sizeof(*this) - sizeof(data) + data.GetSize();
}
PACKET_CG_INHERIT_CLOSE;
// Rider에 Parts 장착/해제 제어를 서버의 필요에 따라 제어할 경우 (예: 기한 만료시, Rider|Parts)
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_RIDER_CONTROL_PARTS_CMD, MSG_CG_ITEM_RIDER_CONTROL_PARTS_BRD)
void Clear();
WORD GetSize() const {
return sizeof(*this);
}
PACKET_CG_INHERIT_CLOSE;
// [10/30/2009 namka199] _NA_0_20091030_RANDOM_ITEM
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_RANDOM_ITEM_SYN )
POSTYPE m_TargetPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_RANDOM_ITEM_ACK )
INVENTORY_TOTAL_INFO m_ItemInfo;
int GetSize()
{
return ( sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_ItemInfo.m_InvenCount-m_ItemInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_RANDOM_ITEM_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUERY_ACCUMULATE_POINT_ITEM_SYN )
BYTE m_First; // 보상받기 버튼을 눌렀을때 TRUE, 그외 FALSE
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUERY_ACCUMULATE_POINT_ITEM_ACK )
enum { ACCUMULATE_POINT_ITEM_COUNT = 18 };
SLOTCODE m_ItemCodeArray[ACCUMULATE_POINT_ITEM_COUNT];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_QUERY_ACCUMULATE_POINT_ITEM_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_ACCUMULATE_POINT_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_ACCUMULATE_POINT_ACK )
BYTE m_byDropItemOrder; // 드롭 아이템 정렬 순서
WORD m_wAccumulatePoint; // 남은 적립 포인트
INVENTORY_TOTAL_INFO m_ItemInfo;
int GetSize()
{
return ( sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_ItemInfo.m_InvenCount-m_ItemInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_ACCUMULATE_POINT_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
#endif //_NA_1419_20100121_ACCUMULATE_POINT
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_INVENTORY_CONFIG_CHANGE_SYN)
nsSlot::InventoryConfig changed;
PACKET_CG_FWD_CLOSE;
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_INVENTORY_CONFIG_CHANGE_ACK,
MSG_CG_ITEM_INVENTORY_CONFIG_CHANGE_SYN)
RC::eITEM_RESULT result;
PACKET_CG_INHERIT_CLOSE;
//==================================================================================================
//_NA000109_100427_ITEM_CUSTOMIZING_CONTENTS_
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_ETHERIA_CONTROL_SYN)
EtheriaControl header;
//
void Clear();
uint16_t GetSize() const {
return sizeof(*this);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_ETHERIA_CONTROL_ACK, MSG_CG_ITEM_ETHERIA_CONTROL_SYN)
EtheriaControlData data;
//
void SetUnknownFailed() {
header.request = header.eReq_None;
header.result = header.eRet_Failed;
header.result_code = 0; // should be set considering a result diversity
data.data_type = data.eDataType_None;
}
void Clear();
uint16_t GetSize() const {
return sizeof(*this) - sizeof(data) + data.GetSize();
}
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_ETHERIA_CONTROL_BRD, MSG_CG_ITEM_ETHERIA_CONTROL_ACK)
// same as the MSG_CG_ITEM_ETHERIA_CONTROL_ACK specification
PACKET_CG_INHERIT_CLOSE;
//==================================================================================================
//_NA_000096_20100527_CHANGE_CHARACTER_APPEARANCE_SYSTEM
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_CHANGE_CHARACTER_APPEARANCE_SYN) // 캐릭터 외모 변경 아이템 사용 요청
POSTYPE item_position_; // 아이템 위치
CharacterAppearanceInfo character_appearance_; // 변경할 외모
//
WORD GetSize() const
{
return static_cast<WORD>(sizeof(*this));
}
PACKET_CG_CLOSE;
// 아이템 합성 또는 분해 요청
#ifdef _20220329_ADD_EQU_RECOVERY
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_EQU_RECOVERY_SYN)
enum { kMaxMaterialSize = 9 }; // 재료 최대 개수
typedef WORD MessageSize;
POSTYPE InvePos[kMaxMaterialSize];
POSTYPE CubdePos;
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_CLOSE;
#endif
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN)
enum
{
kZardRequest = 1, // 쟈드 합성
kCubeRequest = 2 // 큐브 합성/분해
};
enum { kMaxMaterialSize = 9 }; // 재료 최대 개수
typedef BYTE RequestType;
typedef CODETYPE ReservedCode;
typedef BYTE MaterialListSize;
typedef WORD MessageSize;
struct MaterialInfo // 재료 정보
{
POSTYPE inventory_position_; // 재료의 인벤토리 위치
DURATYPE selected_number_; // 합성 또는 분해하기 위해 인벤토리에서 선택한 개수
BYTE matched_index_; // 합성법상의 일치하는 재료 인덱스
}; // MaterialInfo
RequestType request_type_; // 요청 종류 (쟈드/큐브)
bool is_composition_; // 합성 여부 (합성이 아니라면 분해)
// 예약 코드
// 쟈드 합성일 때 첨가제의 인벤토리 위치 (사용안한다면 INVALID_POSTYPE_VALUE : Define.h)
// 큐브 합성일 때 합성코드
// 큐브 분해일 때 분해 포인트
ReservedCode reserved_code_;
POSTYPE using_item_position_; // 아이템을 사용해서 요청했다면 아이템 위치
MaterialListSize material_list_size_; // 합성 또는 분해할 재료 개수
MaterialInfo material_list_[kMaxMaterialSize]; // 합성 또는 분해할 재료 목록
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this) -
((kMaxMaterialSize - material_list_size_) * sizeof(MaterialInfo)));
}
PACKET_CG_CLOSE; // CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN
// 아이템 합성 또는 분해 응답
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_COMPOSE_OR_DECOMPOSE_ACK)
typedef int ResultCode;
typedef WORD MessageSize;
bool is_composition_; // 합성 여부 (합성이 아니라면 분해)
ResultCode result_code_; //요청 처리 결과
INVENTORY_TOTAL_INFO added_inventory_items_; // 보상으로 인벤토리에 추가된 아이템 정보
// 재료로 사용되어 삭제된 인벤토리 아이템 정보는 MSG_CG_ITEM_LOSE_ACK로 보낸다.
// 이미 구현되어 있으므로 추가 작업은 필요없다.
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this) -
(INVENTORY_TOTAL_INFO::MAX_SLOT_NUM -
added_inventory_items_.m_InvenCount -
added_inventory_items_.m_TmpInvenCount) * sizeof(ITEMSLOTEX));
}
PACKET_CG_CLOSE; // CG_ITEM_COMPOSE_OR_DECOMPOSE_ACK
// 성공한 합성 또는 분해 내역들 요청
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_GET_COMPOSITION_OR_DECOMPOSITION_HISTORIES_SYN)
typedef MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::RequestType RequestType;
typedef WORD MessageSize;
RequestType request_type; // 요청 종류
bool is_composition; // 합성 여부
void Init()
{
request_type = MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN::kCubeRequest;
is_composition = true;
}
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_CLOSE; // CG_ITEM_GET_COMPOSITION_OR_DECOMPOSITION_HISTORIES_SYN
// 성공한 합성 또는 분해 내역들 응답
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_GET_COMPOSITION_OR_DECOMPOSITION_HISTORIES_ACK)
enum { kMaxHistoryListSize = ItemCompositionOrDecompositionHistory::kMaxHistories };
typedef int ResultCode;
typedef BYTE HistoryListSize;
typedef WORD MessageSize;
ResultCode result_code; // 요청 처리 결과
HistoryListSize history_list_size; // 내역 개수
ItemCompositionOrDecompositionHistory history_list[kMaxHistoryListSize]; // 내역
void Init()
{
result_code = RC::RC_ITEM_FAILED_TO_GET_COMPOSITION_OR_DECOMPOSITION_HISTORIES;
history_list_size = 0;
}
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this) -
((kMaxHistoryListSize - history_list_size) *
sizeof(ItemCompositionOrDecompositionHistory)));
}
PACKET_CG_CLOSE; // CG_ITEM_GET_COMPOSITION_OR_DECOMPOSITION_HISTORIES_ACK
// 아이템 합성 또는 분해 내역 수정 요청
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_MODIFY_COMPOSITION_OR_DECOMPOSITION_HISTORIES_CMD)
enum { kMaxConditionListSize = ItemCompositionOrDecompositionHistory::kMaxHistories };
typedef BYTE ConditionListSize;
typedef ItemCompositionOrDecompositionHistory::ModifyCondition ModifyCondition;
typedef WORD MessageSize;
ConditionListSize condition_list_size;
ModifyCondition modify_condition_list[kMaxConditionListSize];
void Init()
{
condition_list_size = 0;
::ZeroMemory(modify_condition_list, sizeof(modify_condition_list));
}
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this) -
((kMaxConditionListSize - condition_list_size) *
sizeof(ModifyCondition)));
}
PACKET_CG_CLOSE; // CG_ITEM_MODIFY_COMPOSITION_OR_DECOMPOSITION_HISTORIES_CMD
// _NA_000251_20100727_SOCKET_SYSTEM
// 액션 스킬, 아이템을 통한 미확인 소켓 아이템의 소켓수 확인 요청
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_IDENTIFY_SOCKET_CMD)
typedef WORD MessageSize;
POSTYPE unidentified_item_pos_; // 미확인 아이템 위치
bool use_identify_item_; // 아이템을 사용한 확인인가?
POSTYPE identify_item_pos_; // 아이템을 통한 확인시 확인 아이템 위치 (사용안한다면 INVALID_POSTYPE_VALUE : Define.h)
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_CLOSE; // CG_ITEM_IDENTIFY_SOCKET_CMD
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_IDENTIFY_SOCKET_NAK)
typedef int ErrorCode;
typedef WORD MessageSize;
ErrorCode error_code_; // RC::eITEM_RESULT
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_CLOSE; // CG_ITEM_IDENTIFY_SOCKET_NAK
// 쟈드 합성 응답
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_ZARD_COMPOSE_ACK, MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_ACK)
// 처리 결과 코드
// RC_ITEM_SUCCESS_TO_COMPOSE_ZARD : 쟈드 합성 성공
// RC_ITEM_FAILED_TO_COMPOSE_ZARD : 쟈드 합성 실패
// RC_ITEM_INVALID_VALUE : 클라에서 요청한 값이 옳바르지 않음
// RC_ITEM_HAVENOTSPACE : 인벤토리에 보상을 받을 여유 공간이 없음
PACKET_CG_INHERIT_CLOSE; // CG_ITEM_ZARD_COMPOSE_ACK
#ifdef _NA_002253_20100811_CUBE_SYSTEM
// 큐브 아이템 합성 또는 분해 응답
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_CUBE_COMPOSE_OR_DECOMPOSE_ACK, MSG_CG_ITEM_COMPOSE_OR_DECOMPOSE_ACK)
// 처리 결과 코드
// RC_ITEM_SUCCESS_TO_COMPOSE_CUBE : 큐브 합성 성공
// RC_ITEM_FAILED_TO_COMPOSE_CUBE : 큐브 합성 실패 (예외적인 경우는 모두 여기에 속함)
// RC_ITEM_SUCCESS_TO_DECOMPOSE_CUBE : 큐브 분해 성공
// RC_ITEM_FAILED_TO_DECOMPOSE_CUBE : 큐브 분해 실패 (예외적인 경우는 모두 여기에 속함)
// RC_ITEM_UNABLE_FUNCTION_FOR_CHAOSTATE : 카오 상태라서 사용 불가
// RC_ITEM_INVALID_VALUE : 클라에서 요청한 값이 옳바르지 않음
// RC_ITEM_HAVENOTSPACE : 인벤토리에 보상을 받을 여유 공간이 없음
PACKET_CG_INHERIT_CLOSE; // CG_ITEM_CUBE_COMPOSE_OR_DECOMPOSE_ACK
// 성공한 큐브 아이템 합성 내역들 응답
PACKET_CG_INHERIT_OPEN(CG_ITEM, CG_ITEM_GET_CUBE_COMPOSITION_HISTORIES_ACK, MSG_CG_ITEM_GET_COMPOSITION_OR_DECOMPOSITION_HISTORIES_ACK)
// 처리 결과 코드
// 성공 : RC_ITEM_SUCCESS_TO_GET_COMPOSITION_LIST
// 실패 : RC_ITEM_FAILED_TO_GET_COMPOSITION_LIST 또는 아이템 관련 기본 오류 코드
PACKET_CG_INHERIT_CLOSE; // CG_ITEM_GET_CUBE_COMPOSITION_HISTORIES_ACK
#endif // _NA_002253_20100811_CUBE_SYSTEM
// _NA_003740_20111122_RANDOM_ITEM
// 아이템 능력치 랜덤화
PACKET_CG_FWD_OPEN(CG_ITEM, CG_ITEM_RANDOMIZE_SYN)
typedef WORD MessageSize;
POSTYPE request_item_pos; // 랜덤화 요청 아이템 인벤토리 위치
POSTYPE target_item_pos; // 랜덤화 대상 아이템 인벤토리 위치
void Init()
{
request_item_pos = INVALID_SLOT_POS;
target_item_pos = INVALID_SLOT_POS;
}
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_OPEN(CG_ITEM, CG_ITEM_RANDOMIZE_ACK)
typedef int ResultCode;
typedef WORD MessageSize;
ResultCode result_code; // RC::eITEM_RESULT 참조
POSTYPE request_item_pos; // 랜덤화 요청 아이템 인벤토리 위치
POSTYPE target_item_pos; // 랜덤화 대상 아이템 인벤토리 위치
void Init()
{
result_code = RC::RC_ITEM_SUCCESS;
request_item_pos = INVALID_SLOT_POS;
target_item_pos = INVALID_SLOT_POS;
}
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_CLOSE; // CG_ITEM_IDENTIFY_SOCKET_NAK
//_NA_004035_20120227_COSTUME_ITEM //코스튬 아이템 패킷..
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_COSTUME_ACK )
typedef WORD MessageSize;
bool is_equipped_costume_;
POSTYPE costume_item_pos_;
void Init()
{
is_equipped_costume_ = false; //코스튬 아이템 활성화 여부
costume_item_pos_ = INVALID_SLOT_POS; //코스튬 아이템 인벤토리 위치
}
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_COSTUME_BRD )
typedef WORD MessageSize;
DWORD object_key_;
SLOTCODE costume_item_code_;
void Init()
{
object_key_ = 0;
costume_item_code_ = 0;
}
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_FWD_CLOSE;
//_NA_008610_20160104_ADD_DECORATECOSTUME
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_DECORATE_COSTUME_ACK )
typedef WORD MessageSize;
bool is_equipped_costume_;
POSTYPE deco_costume_item_pos_;
void Init()
{
is_equipped_costume_ = false; //코스튬 아이템 활성화 여부
deco_costume_item_pos_ = INVALID_SLOT_POS; //코스튬 아이템 인벤토리 위치
}
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_DECORATE_COSTUME_BRD )
typedef WORD MessageSize;
DWORD object_key_;
SLOTCODE deco_costume_item_code_;
void Init()
{
object_key_ = 0;
deco_costume_item_code_ = 0;
}
MessageSize GetSize() const
{
return static_cast<MessageSize>(sizeof(*this));
}
PACKET_CG_FWD_CLOSE;
//!~ _NA_006372_20130108_BADGE_ITEM
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_USE_TOGGLE_ACK )
WORD toggle_item_type_;
bool is_equipped_;
POSTYPE item_pos_;
PACKET_CG_FWD_CLOSE;
//~! _NA_006372_20130108_BADGE_ITEM
#ifdef _NA_008124_20150313_AWAKENING_SYSTEM
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_AWAKENING_SYN )
POSTYPE equip_item_pos; // 각성할 아이템
POSTYPE material_item_pos; // 재료 아이템
POSTYPE additive_item_pos; // 첨가제 아이템
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_AWAKENING_ACK )
int result_code;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EVOLUTION_SYN )
POSTYPE equip_item_pos; // 진화할 아이템
POSTYPE additive_item_pos; // 첨가제 아이템
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_EVOLUTION_ACK )
int result_code;
PACKET_CG_FWD_CLOSE;
#endif // _NA_008124_20150313_AWAKENING_SYSTEM
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_SPA_COSTUME_CHANGE_SYN )
SLOTIDX slotcontainer_type;
POSTYPE item_pos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_SPA_COSTUME_CHANGE_BRD )
DWORD player_object_key;
SLOTCODE spa_ticket_code;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_SPA_COSTUME_CHANGE_NAK )
BYTE error_code;
PACKET_CG_FWD_CLOSE;
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 아이템 조합
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 거래
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_OPEN_SYN )
DWORD m_dwPlayerKey; // 요청할 플레이어 키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_OPEN_ACK ) // 거래 요청이 승락되었음
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_OPEN_CMD ) // 상대방에 거래창 오픈 요청
DWORD m_dwPlayerKey; // 거래 요청한 플레이어 키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_OPEN_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PUT_SYN )
POSTYPE m_OrgPos; // 인벤토리의 아이템 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PUT_ACK )
POSTYPE m_OrgPos; // 인벤토리의 아이템 위치
POSTYPE m_TradePos; // 장착창의 아이템 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PUT_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PUT_CMD )
POSTYPE m_TradePos; // 상대편이 올린 아이템의 거래창의 위치
RENDER_ITEMSTREAMEX m_ItemStream;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PUT_MONEY_SYN )
MONEY m_money;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PUT_MONEY_ACK )
MONEY m_money;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PUT_MONEY_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PUT_MONEY_CMD )
MONEY m_money; // 상대편이 올려놓은 돈의 액수
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_GET_SYN )
POSTYPE m_TradePos; // 거래창의 위치에 있는 아이템을 인벤토리로 가져옴
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_GET_ACK )
POSTYPE m_TradePos; // 거래창의 위치에 있는 아이템을 인벤토리로 가져옴
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_GET_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_GET_CMD )
POSTYPE m_TradePos; // 상대편이 거래창의 특정 아이템을 삭제함
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_GET_MONEY_SYN )
MONEY m_money; // 거래창에서 뺄 돈의 금액
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_GET_MONEY_ACK )
MONEY m_money; // 거래창에서 뺄 돈의 금액
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_GET_MONEY_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_GET_MONEY_CMD )
MONEY m_money; // 거래창에서 뺄 돈의 금액
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PROPOSAL_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PROPOSAL_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PROPOSAL_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_PROPOSAL_CMD )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_MODIFY_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_MODIFY_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_MODIFY_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_MODIFY_CMD )
PACKET_CG_FWD_CLOSE;
//.// TRADE POPUP
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_MODIFY_RESPONSE_SYN )
BOOL m_bAccept;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_MODIFY_RESPONSE_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_MODIFY_RESPONSE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_ACCEPT_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_ACCEPT_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_ACCEPT_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_CANCEL_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_CANCEL_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_CANCEL_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_CANCEL_CMD )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_ACCEPT_CMD )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRADE, CG_TRADE_ACCEPT_BRD )
MONEY m_Money;
TRADE_TOTAL_INFO m_TradeInfo;
int GetSize()
{
return (sizeof(*this) - (TRADE_TOTAL_INFO::MAX_SLOT_NUM - m_TradeInfo.m_InvenCount-m_TradeInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX) );
}
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 거래,개인상점
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//@@@ OPT : 최적화 여지 char m_pszTitle[MAX_VENDOR_TITLE_LENGTH];
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_START_SYN )
TCHAR m_pszTitle[MAX_VENDOR_TITLE_LENGTH]; // MAX_VENDOR_TITLE_LENGTH값 자체가 최대 타이틀 길이인데...
ESTABLISHER_VENDOR_TOTAL_INFO m_ItemInfo;
int GetSize() const
{
return (sizeof(*this)-(ESTABLISHER_VENDOR_TOTAL_INFO::MAX_SLOT_NUM - m_ItemInfo.m_Count)*sizeof(VENDOR_ITEMSLOT));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_START_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_START_BRD )
DWORD m_dwPlayerKey; //< 개설자의 플레이어 키
char m_pszTitle[MAX_VENDOR_TITLE_LENGTH+1];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_pszTitle);
size_t len = strlen(m_pszTitle) + 1;
assert(len <= _countof(m_pszTitle));
len = min(len, _countof(m_pszTitle));
return static_cast<uint16_t>(kMinSize + sizeof(m_pszTitle[0]) * len);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_START_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_END_SYN )
BYTE m_byEndKind; //< 0이면 종료, 1이면 PAUSE
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_END_ACK )
BYTE m_byEndKind; //< 0이면 종료, 1이면 PAUSE
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_END_BRD )
DWORD m_dwPlayerKey; //< 상점을 종료한 플레이어의 키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_END_NAK)
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_REQ_SYN )
POSTYPE m_VendorPos; //< 수정 할려는 아이템의 슬롯 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_REQ_ACK )
POSTYPE m_VendorPos; //< 수정 할려는 아이템의 슬롯 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_REQ_BRD )
POSTYPE m_VendorPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_REQ_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_CANCEL_SYN )
POSTYPE m_VendorPos; //< 수정 할려는 아이템의 슬롯 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_CANCEL_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_CANCEL_BRD )
POSTYPE m_VendorPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_CANCEL_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_APPLY_SYN )
VENDOR_ITEMSLOT m_ItemSlot;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_APPLY_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_APPLY_BRD )
POSTYPE m_VendorPos;
VENDOR_ITEMSLOTEX m_ItemSlot;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_APPLY_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_INSERT_SYN )
VENDOR_ITEMSLOT m_ItemSlot;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_INSERT_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_INSERT_BRD )
POSTYPE m_VendorPos;
VENDOR_ITEMSLOTEX m_ItemSlot;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_INSERT_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_DELETE_SYN )
POSTYPE m_VendorPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_DELETE_ACK )
POSTYPE m_VendorPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_DELETE_BRD )
POSTYPE m_VendorPos;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_DELETE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_BUY_SYN )
POSTYPE m_VendorPos;
BYTE m_BuyNum; //< 살려는 개수 : 일반적으로는 파는 개수의 최대치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_VENDOR, CG_VENDOR_BUY_ACK)
MONEY m_Money; //< 구입하고 난 뒤의 나의 돈
INVENTORY_TOTAL_INFO m_InventoryTotalInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_InventoryTotalInfo);
return static_cast<uint16_t>(kMinSize + m_InventoryTotalInfo.GetSize());
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_BUY_CMD )
POSTYPE m_VendorPos; //< 팔려서 없어진 아이템위
MONEY m_Money; //< 개설자가 판매하고 난뒤의 돈
BYTE m_SellNum; //< 개설자가 판 개수
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_BUY_BRD )
POSTYPE m_VendorPos; //< 팔려서 없어진 아이템
BYTE m_SellNum; //< 판 개수
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_BUY_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_VIEW_START_SYN )
DWORD m_dwPlayerKey; //< 상점을 개설한 플레이어의 키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_VIEW_START_ACK )
char m_pszTitle[MAX_VENDOR_TITLE_LENGTH];
// (BUGFIX) (091116) (WAVERIX) 1st modified - size
// (TODO) change to block convert structure
// SlotNum(8) + Money(64) + Lock(1) + RENDER_ITEMSTREAMEX(16 + 8 + 24(v7))
enum {
_NODE_BIT_SIZE = 64 + 1 + sizeof(RENDER_ITEMSTREAMEX) * 8,
_MAX_BIT_SIZE = (8) + _NODE_BIT_SIZE * VENDOR_TOTAL_INFO::MAX_SLOT_NUM,
_MAX_FIX_AROUND_SIZE = _MAX_BIT_SIZE / 8,
_MAX_BINARY_SIZE = 2000,
};
BOOST_STATIC_ASSERT(_MAX_BINARY_SIZE > _MAX_FIX_AROUND_SIZE);
WORD m_Size;
BYTE m_BitStreamBuffer[_MAX_BINARY_SIZE];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_BitStreamBuffer);
return static_cast<uint16_t>(kMinSize + sizeof(m_BitStreamBuffer[0]) * m_Size);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_VIEW_START_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_VIEW_END_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_VIEW_END_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_VIEW_END_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_TITLE_SYN )
TCHAR m_pszTitle[MAX_VENDOR_TITLE_LENGTH];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_TITLE_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_TITLE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_MODIFY_TITLE_BRD )
DWORD m_dwPlayerKey; //< 개설자의 플레이어 키
char m_pszTitle[MAX_VENDOR_TITLE_LENGTH+1];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_pszTitle);
size_t len = strlen(m_pszTitle) + 1;
assert(len <= _countof(m_pszTitle));
len = min(len, _countof(m_pszTitle));
return static_cast<uint16_t>(kMinSize + sizeof(m_pszTitle[0]) * len);
};
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 개인상점 리스트
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//상점 리스트 시작
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_LIST_START_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_LIST_START_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_LIST_START_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//상점 리스트 Page 요청,
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_REQUIRE_PAGE_SYN )
BYTE m_byKind; //eVENDOR_LIST_PAGE_KIND
BYTE m_byPage; //몇번째 페이지 인가 - 1부터 시작...
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_REQUIRE_PAGE_ACK )
BYTE m_pBuffer[sizeof(VENDOR_LIST_TOTAL_INFO)];
//
uint16_t ConvertforSend(const VENDOR_LIST_TOTAL_INFO& total_info);
void ConvertForRecv(VENDOR_LIST_TOTAL_INFO& total_info) const;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_REQUIRE_PAGE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//상점 리스트 검색 요청
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_SEARCH_SYN )
BYTE m_ebyKind; //eVENDOR_LIST_PAGE_KIND
char m_sPattern[MAX_VENDOR_SEARCH_LENGTH];
#ifdef _NA_0_20091208_VENDOR_ITEM_SEARCH
SLOTCODE m_ItemCode;
#endif //_NA_0_20091208_VENDOR_ITEM_SEARCH
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_SEARCH_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_SEARCH_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//상점 리스트 종료
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_LIST_END_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_LIST_END_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_LIST_END_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//!~_NA_005988_20120901_VENDOR_SEARCH_SYSTEM
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_ENHANCED_SEARCH_SYN )
TCHAR search_items[MAX_ITEMNAME_LENGTH+1];
int page;
PACKET_CG_FWD_CLOSE;
#ifdef _NA_005988_20120901_VENDOR_SEARCH_SYSTEM
PACKET_CG_FWD_OPEN( CG_VENDOR, CG_VENDOR_ENHANCED_SEARCH_ACK )
BYTE m_byErrorCode;
ENHANCED_VENDOR_SEARCH_RESULT search_result;
void clear()
{
m_byErrorCode = 0;
memset(&search_result, 0, sizeof(search_result));
};
PACKET_CG_FWD_CLOSE;
#endif //_NA_005988_20120901_VENDOR_SEARCH_SYSTEM
//~!_NA_005988_20120901_VENDOR_SEARCH_SYSTEM
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 필드 아이템 줍기,버리기
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PICK_MONEY_SYN )
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T1(142));
PACKET_RND_SHRBLK64_CONT(DWORD, m_dwFieldItemObjectKey);
PACKET_RND_SHRBLK64_END();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PICK_MONEY_ACK )
MONEY m_Money;
WORD m_BonusRatio; // 추가 퍼센트
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ITEM, CG_ITEM_PICK_MONEY_NAK )
DWORD m_dwErrorCode;
DWORD m_dwFieldItemObjectKey;
PACKET_CG_FWD_CLOSE;
struct MSG_CG_ITEM_DROP_MONEY_SYN : public MSG_BASE_FORWARD
{
DWORD m_dwDropMoney;
};
struct MSG_CG_ITEM_DROP_MONEY_NAK : public MSG_BASE_FORWARD
{
DWORD m_dwErrorCode;
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 창고
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_START_SYN )
CODETYPE m_NPCCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_START_ACK )
enum eINVEN_LOCK_MODE { ENABLE = 0, EMPTY_PWD = 0, EXIST_PWD = 1, DISABLED = 2,
ENABLEnEMPTY = ENABLE|EMPTY_PWD, ENABLEnEXIST = ENABLE|EXIST_PWD, DISABLEDnEXIST = DISABLED|EXIST_PWD, };
BYTE m_byWarehouseLock;
MONEY m_WarehouseMoney;
enum { _MAX_BINARY_SIZE = sizeof(RENDER_ITEMSTREAMEX)*(WAREHOUSE_TOTAL_INFO::MAX_SLOT_NUM),};
WORD m_Size;
BYTE m_BitStreamBuffer[_MAX_BINARY_SIZE];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_BitStreamBuffer);
return static_cast<uint16_t>(kMinSize + sizeof(m_BitStreamBuffer[0]) * m_Size);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_START_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_MONEY_SYN )
enum { PUTMONEY = 0, GETMONEY = 1, };
BYTE m_byType;
MONEY m_Money;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_MONEY_ACK )
MONEY m_InventoryMoney;
MONEY m_WarehouseMoney;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_MONEY_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_END_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_END_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_END_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 창고, 인벤토리 잠금 (패스워드)관련
// 관련 매크로 : __TASK_WAREHOUSE_N_INVENTORY_LOCK_BY_PWD__
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <TYPE DEFINITIONs>
typedef util::cSTRING_BUFFER<MAX_WAREHOUSE_INVENTORY_PWD_LENGTH+1> sPWD_STREAM;
typedef util::cSTRING_BUFFER<MAX_SSN_STREAM_LENGTH> sSSN_STREAM;
/* */
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_PWD_CHECK_SYN )
enum eREQ_CODE // <REQUEST CODE>
{
SYNC_FIRST , // 첫번째 요청 (무조건 이것부터 보낸다)
SYNC_CLEAR , // 비번 초기화 요청시
SYNC_CANCEL , // 비번 설정 과정 자체를 취소할 때,
SYNC_WITH_PWD , // ~_ACK::eRET_CODE::NEED_PWD | INVALID_PWD 수신시
SYNC_WITH_SSN , // ~_ACK::eRET_CODE::NEED_SSN | INVALID_SSN 수신시
};
BYTE m_ReqCode;
sSSN_STREAM m_PWDnSSN;
// <METHODs>
static WORD MINSIZE() { return (WORD)(sizeof(MSG_CG_WAREHOUSE_PWD_CHECK_SYN) - sizeof(sSSN_STREAM)); }
inline BYTE& ReqCode() { return m_ReqCode; }
inline VOID SetFirstSync() { ReqCode() = SYNC_FIRST; };
inline VOID SetClearSync() { ReqCode() = SYNC_CLEAR; };
inline VOID SetCancelSync() { ReqCode() = SYNC_CANCEL; };
inline VOID SetPassword( const TCHAR* ptszPWD )
{
ReqCode() = static_cast<uint8_t>(ptszPWD ? SYNC_WITH_PWD : SYNC_CANCEL);
if( ptszPWD )
m_PWDnSSN.CopyFrom( ptszPWD );
};
inline VOID SetSSN( const TCHAR* ptsSSN )
{
ReqCode() = static_cast<uint8_t>(ptsSSN ? SYNC_WITH_SSN : SYNC_CANCEL);
if( ptsSSN )
m_PWDnSSN.CopyFrom( ptsSSN );
}
inline TCHAR* GetPassword() { return m_PWDnSSN.GetBUFFER(); };
inline BYTE* GetSSN() { return (BYTE*)m_PWDnSSN.GetBUFFER(); }
inline WORD GetSize()
{
switch( ReqCode() )
{
case SYNC_FIRST:
case SYNC_CLEAR:
case SYNC_CANCEL:
return MINSIZE();
case SYNC_WITH_PWD:
case SYNC_WITH_SSN:
return (WORD)sizeof(*this);
}
return 0; // 0으로 보내면, 서버는 해당 클라 동작 멈추게 만든다. ㅋㅋㅋ
}
PACKET_CG_FWD_CLOSE;
/* */
struct MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN : MSG_CG_WAREHOUSE_PWD_CHECK_SYN
{
MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN() { m_byCategory = CG_ITEM; m_byProtocol = CG_ITEM_INVENTORY_PWD_CHECK_SYN; }
};
/* */
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_PWD_CHECK_ACK )
enum eRET_CODE
{ // <RESULT_CODE>
RET_FAIL , // 부적절한 상황, 서버의 문제 등등시 실패 코드
RET_SUCCESS , // 비번 변경 성공시
RET_SUCCESS_CLEAR , // 비번 초기화 성공시
RET_CANCELED , // 비번 설정 과정 자체 취소된 상태 (~_SYN::SYNC_CANCEL 에 의한 응답)
RET_NEED_PWD , // 비번 요구
RET_INVALID_PWD , // 조건에 맞지 않는 비번이다
RET_NEED_SSN , // 비번 변경 인증을 위한 SSN 요구
RET_INVALID_SSN , // 잘못된 SSN이다
};
// <FIELD>
BYTE m_byRetCode;
//
// <METHODs>
inline BYTE& ReturnCode() { return m_byRetCode; }
PACKET_CG_FWD_CLOSE;
/* */
struct MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK : MSG_CG_WAREHOUSE_PWD_CHECK_ACK
{
MSG_CG_ITEM_INVENTORY_PWD_CHECK_ACK() { m_byCategory = CG_ITEM; m_byProtocol = CG_ITEM_INVENTORY_PWD_CHECK_ACK; }
};
/* */
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_PWD_CHECK_NAK )
PACKET_CG_FWD_CLOSE;
/* */
struct MSG_CG_ITEM_INVENTORY_PWD_CHECK_NAK : MSG_CG_WAREHOUSE_PWD_CHECK_NAK
{
MSG_CG_ITEM_INVENTORY_PWD_CHECK_NAK() { m_byCategory = CG_ITEM; m_byProtocol = CG_ITEM_INVENTORY_PWD_CHECK_NAK; }
};
/* */
struct MSG_CG_WAREHOUSE_PWD_SETTING_SYN : MSG_CG_WAREHOUSE_PWD_CHECK_SYN
{
MSG_CG_WAREHOUSE_PWD_SETTING_SYN() { m_byCategory = CG_WAREHOUSE; m_byProtocol = CG_WAREHOUSE_PWD_SETTING_SYN; }
};
/* */
struct MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN : MSG_CG_WAREHOUSE_PWD_SETTING_SYN
{
MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN() { m_byCategory = CG_ITEM; m_byProtocol = CG_ITEM_INVENTORY_PWD_SETTING_SYN; }
};
/* */
struct MSG_CG_WAREHOUSE_PWD_SETTING_ACK : MSG_CG_WAREHOUSE_PWD_CHECK_ACK
{
MSG_CG_WAREHOUSE_PWD_SETTING_ACK() { m_byCategory = CG_WAREHOUSE; m_byProtocol = CG_WAREHOUSE_PWD_SETTING_ACK; }
};
/* */
struct MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK : MSG_CG_WAREHOUSE_PWD_SETTING_ACK
{
MSG_CG_ITEM_INVENTORY_PWD_SETTING_ACK() { m_byCategory = CG_ITEM; m_byProtocol = CG_ITEM_INVENTORY_PWD_SETTING_ACK; }
};
/* */
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_PWD_SETTING_NAK )
PACKET_CG_FWD_CLOSE;
/* */
struct MSG_CG_ITEM_INVENTORY_PWD_SETTING_NAK : MSG_CG_WAREHOUSE_PWD_SETTING_NAK
{
MSG_CG_ITEM_INVENTORY_PWD_SETTING_NAK() { m_byCategory = CG_ITEM; m_byProtocol = CG_ITEM_INVENTORY_PWD_SETTING_NAK; }
};
/* */
// 잠금상태->잠금해제, 잠금해제->잠금상태 토글 요청 패킷 구조체
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_PWD_LOCKING_SYN )
PACKET_CG_FWD_CLOSE;
/* */
struct MSG_CG_ITEM_INVENTORY_PWD_LOCKING_SYN : MSG_CG_WAREHOUSE_PWD_LOCKING_SYN
{
MSG_CG_ITEM_INVENTORY_PWD_LOCKING_SYN() { m_byCategory = CG_ITEM; m_byProtocol = CG_ITEM_INVENTORY_PWD_LOCKING_SYN; }
};
/* */
// 기존 비번있고, 임시 잠금 해제상태일 경우, 잠금상태로 전환되는 경우만 있다.
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_PWD_LOCKING_ACK )
enum eRET_CODE
{
RET_SUCCESS_LOCKED , // 잠금해제->잠금상태 전환
RET_NEED_PWD_FOR_LOCKING , // 기존 비번이 존재하지 않아서 잠금을 하기 위한 비번 요구
RET_NEED_PWD_FOR_UNLOCKING , // 잠금상태에서 잠금해제상태로 전환하기 위해 비번 요구
};
BYTE m_byRetCode;
// <METHODs>
inline BYTE& ReturnCode() { return m_byRetCode; }
PACKET_CG_FWD_CLOSE;
/* */
struct MSG_CG_ITEM_INVENTORY_PWD_LOCKING_ACK : MSG_CG_WAREHOUSE_PWD_LOCKING_ACK
{
MSG_CG_ITEM_INVENTORY_PWD_LOCKING_ACK() { m_byCategory = CG_ITEM; m_byProtocol = CG_ITEM_INVENTORY_PWD_LOCKING_ACK; }
};
/* */
// CG_WAREHOUSE_PWD_LOCKING_ACK 이외의 상황, 그 상황은 해당 RET_CODE에 존재
PACKET_CG_FWD_OPEN( CG_WAREHOUSE, CG_WAREHOUSE_PWD_LOCKING_NAK )
enum eERR_CODE
{
IRREGULAR_LOCKING_POLICYMENT , // 창고,인벤 잠금 플로에서 있어서는 안되는 상황이 발생
};
BYTE m_byErrCode;
// <METHODs>
inline BYTE& ErrorCode() { return m_byErrCode; }
PACKET_CG_FWD_CLOSE;
/* */
struct MSG_CG_ITEM_INVENTORY_PWD_LOCKING_NAK : MSG_CG_WAREHOUSE_PWD_LOCKING_NAK
{
MSG_CG_ITEM_INVENTORY_PWD_LOCKING_NAK() { m_byCategory = CG_ITEM; m_byProtocol = CG_ITEM_INVENTORY_PWD_LOCKING_NAK; }
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// TRIGGER 관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
struct MSG_CG_TRIGGER_CLICK_OBJECT_SYN : public MSG_BASE_FORWARD
{
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T2(141));
PACKET_RND_SHRBLK64_CONT(DWORD, m_dwClickedObjectKey);
PACKET_RND_SHRBLK64_END();
};
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_CLICK_OBJECT_BRD )
DWORD m_dwClickedUserObjectKey;
DWORD m_dwClickedObjectKey;
PACKET_CG_FWD_CLOSE;
struct MSG_CG_TRIGGER_ENTER_AREA_SYN : public MSG_BASE_FORWARD
{
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T3(151));
PACKET_RND_SHRBLK64_CONT(int, m_iAreaID);
PACKET_RND_SHRBLK64_END();
};
struct MSG_CG_TRIGGER_LEAVE_AREA_SYN : public MSG_BASE_FORWARD
{
int m_iAreaID;
};
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_DO_ACTION_BRD )
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG16_T3(152));
PACKET_RND_SHRBLK64_CONT(DWORD, m_dwTriggerID);
PACKET_RND_SHRBLK64_END();
PACKET_CG_FWD_CLOSE;
struct MSG_CG_TRIGGER_ACTION_NAK : public MSG_BASE_FORWARD
{
DWORD m_dwErrorCode;
};
struct MSG_CG_TRIGGER_REFLECTDAMAGE_BRD : public MSG_BASE_FORWARD
{
DWORD m_dwObjectKey;
DAMAGETYPE m_wDamage;
DWORD m_dwHP;
};
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_AREADAMAGE_BRD )
DWORD m_dwObjectKey;
DAMAGETYPE m_wDamage;
DWORD m_dwHP;
#ifdef _NA_008804_20160502_COMBAT_LOG
time_t m_SvrTime;
#endif //(_NA_008804_20160502_COMBAT_LOG)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_TRIGGER, CG_TRIGGER_PORTAL_ACK)
enum eLeaveType { eLeaveType_Default, eLeaveType_Target, eLeaveType_Count };
BYTE m_LeaveType; //eLeaveType
//if(m_LeaveType == eLeaveType_Target) then goto target Village | Field
CODETYPE m_MapCode;
CODETYPE m_FieldCode;
void Encode();
void Decode();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_REWARD_WINDOW_CMD )
PACKET_RND_SHRBLK64_START(GETRNDNO_RNG32_T3(152));
PACKET_RND_SHRBLK64_CONT(WORD, m_RewardCode); // (RewardInfoList.txt) 보상 스크립트 번호
PACKET_RND_SHRBLK64_END();
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_REWARD_SYN )
WORD m_Num; //< (RewardInfoList.txt) 보상 스크립트 번호
//BYTE m_Num; //< 보상스크립트의 번호
//BYTE m_Type; //< 0 or 1
enum
{
ITEM1_SELECTED = (1<<0),
ITEM2_SELECTED = (1<<1),
ITEM3_SELECTED = (1<<2),
ITEM4_SELECTED = (1<<3),
ITEM5_SELECTED = (1<<4), //_NA_0_20101130_REWARD_ITEM_COUNT_INCREASE
};
BYTE m_SelectedItem; //< 선택한 아이템들
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_REWARD_ACK )
MONEY m_Money;
EXPTYPE m_i64Exp; // 최종 경험치
BYTE m_byFatigueType; //피로도 타입.
#ifdef _NA_20081121_ABUMAN_NIJOT_EVENT
bool m_bGuildBounsExp; //길드보너스 경험치
#endif
BOOLEAN m_bPortalMission; // Portal통한 입장인지 여부
INVENTORY_TOTAL_INFO m_ItemInfo;
int GetSize()
{
return ( sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM - m_ItemInfo.m_InvenCount - m_ItemInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_REWARD_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_DONE_ACTION_INFO_CMD )
enum { MAX_DONE_TRIGGER_ID_NUM = 100, };
BYTE m_byCount;
DWORD m_dwDoneTriggerID[MAX_DONE_TRIGGER_ID_NUM];
int GetSize()
{
return (sizeof(*this) - (MAX_DONE_TRIGGER_ID_NUM-m_byCount)*sizeof(DWORD));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_PLAY_EVENT_CMD )
int m_nEventIndex; // 플레이할 이벤트 인덱스
PACKET_CG_FWD_CLOSE;
//__NA000357_070322_TRIGGER_SHOW_THE_FLOOR__
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_SHOW_THE_FLOOR_CMD )
DWORD m_dwPlayerKey; // 해당 액션을 수행하는 플레이어, 파티들도 수신받으며, 이 경우 해당 플레이어의 층정보를 처리한다.
BYTE m_byFloor; // 몇 층인가?
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_PLAY_MUSIC_CMD )
BYTE m_byTarget; // 타켓 정보(개인,파티)
INT m_nMusCode; // 뮤직 정보
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_DISPLAY_MSGBOX_CMD )
INT m_nTextID; // 텍스트 정보
PACKET_CG_FWD_CLOSE;
//_NA_0_20100222_UNIT_TRIGGERS_ADD
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_DISPLAY_BALLOON_MSGBOX_CMD )
DWORD m_dwObjectKey; // 텍스트 보여줄 위치 (유닛 말풍선)
DWORD m_dwMessageCode; // 출력할 메시지코드
PACKET_CG_FWD_CLOSE;
//_NA_0_20100525_ADD_TIMER_ACTION_TRIGGER
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_CONTROL_TIMER_CMD )
DWORD m_dwTime; // 시간 (ms), 생성시 초기시간, 파괴시 유지 시간(delay)
BYTE m_byControlType; // 변동 eTIMER_CONTROL_TYPE
PACKET_CG_FWD_CLOSE; // (0:역방향 생성(감소), 1:정방향 생성(증가), 2:파괴 )
//_NA_006619_20130422_ADD_ACTION_TRIGGER_CHANGE_RADAR_MAP
PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_CHANGE_RADAR_MAP_CMD )
WzID sub_map_id;
PACKET_CG_FWD_CLOSE;
//////////////////////////////////////////////////////////////////////////
//__NA000405_070406_LAST_OBJSTATE_APPLICATION__
// 이걸 CG_TRIGGER_DONE_ACTION_INFO_CMD 대신에 보내려고 만들긴 했다.
// 이유는 두개의 트리거가 서로 상대방에서 반대 속성을 가지는 상태 변경을 수행할 경우 둘 중 하나는
// 정상적으로 동작할 수 없게 되기 때문이다. 하지만, 이렇게 되면 너무 많은 패킷을 보내는 등 문제가 커진다.
// 일단은 참고사항으로 남겨두고 넘어가자.
// struct sOBJECT_STATE_INFO_BASE
// {
// // TriggerType 참조 (통일할 필요는 있다)
// // Client (ProgramCommon/TriggerHeader.h) eTRIGGER_ACTION_TYPE
// // Server (GameServer/TriggerCommon.h) eACTION_TYPE
// WORD m_wTriggerType;
// DWORD m_dwObjectID;
// INT m_iValue;
//
// sOBJECT_STATE_INFO_BASE() : m_wTriggerType(0), m_dwObjectID(0), m_iValue(0) {}
// ~sOBJECT_STATE_INFO_BASE() {}
//
// inline WORD& TRIGGER_TYPE() { return m_wTriggerType; }
// inline DWORD& OBJECT_ID() { return m_dwObjectID; }
// inline INT& VALUE() { return m_iValue; }
// };
//
// PACKET_CG_FWD_OPEN( CG_TRIGGER, CG_TRIGGER_LAST_OBJECT_STATE_CMD )
// enum { MAX_LAST_OBJECT_STATE_INFO = 100, };
// BYTE m_byCounts;
// sOBJECT_STATE_INFO_BASE m_pObjStateInfo[MAX_LAST_OBJECT_STATE_INFO];
//
// inline WORD GetSize() { return (WORD)( (sizeof(*this) - sizeof(m_pObjStateInfo)) + (sizeof(sOBJECT_STATE_INFO_BASE) * m_byCounts) ); };
// PACKET_CG_FWD_CLOSE;
//__NA000405_070406_LAST_OBJSTATE_APPLICATION__
//////////////////////////////////////////////////////////////////////////
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 캐릭터 상태, 속성, 수치 변경 관련
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// AG_STATUS_LEVEL_UP_BRD 프로토콜을 추가
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_LEVEL_UP_BRD )
DWORD m_dwObjectKey; // 누구
LEVELTYPE m_Level; // 업된 레벨
WORD m_wRemainStat; // 남은 스탯포인트
WORD m_wRemainSkill; // 남은 스킬포인트
DWORD m_dwCurHP; // 현재 HP(레벨업시 HP, MP를 채워준다.)
DWORD m_dwCurMP; // 현재 MP
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_LEVEL_UP_CMD )
LEVELTYPE m_Level; // 업된 레벨
WORD m_wRemainStat; // 남은 스탯포인트
WORD m_wRemainSkill; // 남은 스킬포인트
DWORD m_dwCurHP; // 현재 HP(레벨업시 HP, MP를 채워준다.)
DWORD m_dwCurMP; // 현재 MP
DWORD m_dwCurSD; // 현재 SD
PACKET_CG_FWD_CLOSE;
// HP 변화
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CHANGE_HP_BRD )
DWORD m_dwObjectKey; // 누구
DWORD m_dwTargetHP; // 최종값
DWORD m_dwReserveHP; // 적립된 HP
PACKET_CG_FWD_CLOSE;
// MP 변화
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CHANGE_MP_BRD )
DWORD m_dwObjectKey; // 누구
DWORD m_dwTargetMP; // 최종값
PACKET_CG_FWD_CLOSE;
//_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
//FP변화
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CHANGE_FP_CMD )
DWORD object_key;
PLAYERFP m_dwTargetFP; // 최종값
PACKET_CG_FWD_CLOSE;
//FP이펙트 갱신을 위한 패킷
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CHANGE_FP_EFFECT_BRD )
DWORD object_key;
PLAYERFP current_fp;
PACKET_CG_FWD_CLOSE;
// HP, MP 변화
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RECOVER_ATTR_BRD )
DWORD m_dwObjectKey; // 누구
DWORD m_dwTargetHP; // 최종값
DWORD m_dwTargetMP; // 최종값
PACKET_CG_FWD_CLOSE;
// SD 변화(자신)
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CHANGE_SD_CMD )
DWORD m_dwSD; // 최종값
PACKET_CG_FWD_CLOSE;
// 부활 요청
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RESURRECTION_SYN )
PACKET_CG_FWD_CLOSE;
// 부활 실패
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RESURRECTION_NAK )
DWORD m_dwObjectKey; // 누구
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// 부활 브로드
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RESURRECTION_BRD )
DWORD m_dwObjectKey; // 누구
DWORD m_dwHP; // 최종값
DWORD m_dwMP; // 최종값
WzVector m_wvCurPos; // 부활 위치
DWORD m_dwReserveHP;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_TITLE_CHANGED_CMD )
DWORD m_PlayerTitle; //< ePLAYER_TITLE 참조
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_TITLE_CHANGED_BRD )
DWORD m_dwPlayerKey;
DWORD m_PlayerTitle; //< ePLAYER_TITLE 참조
PACKET_CG_FWD_CLOSE;
// 사망
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_DEAD_BRD )
DWORD m_dwObjectKey; // 누구
WzVector m_wvCurPos; // 죽은 위치
EXPTYPE m_i64Exp; // 최종 경험치
PACKET_CG_FWD_CLOSE;
// 사망 정보
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_DEAD_INFO_SYN )
BYTE m_Dead_Type;
DWORD m_Data;
PACKET_CG_FWD_CLOSE;
// 경험치 변경
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_EXP_CMD )
DWORD m_dwTargetObjKey; // 타겟 오브젝트 키
EXPTYPE m_i64Exp; // 최종 경험치
WORD m_BonusRatio; // 추가 퍼센트(0~500)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_GROUPEXP_CMD )
DWORD m_dwTargetObjKey; // 타겟 오브젝트 키
EXPTYPE m_i64Exp; // 최종 경험치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_GROUPMONEY_BRD )
CHAR ptszMemeberName[MAX_CHARNAME_LENGTH+1];
MONEY bonusMoney;
PACKET_CG_FWD_CLOSE;
// 수치 변경
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_ATTR_CHANGE_BRD )
DWORD m_dwObjKey;
BYTE m_AttrType; // eATTR_TYPE
DWORD m_dwValue; // value
PACKET_CG_FWD_CLOSE;
// 스탯 업
#ifdef _NA_0_20110216_STATUS_STAT_POINT_SIMULATION
// eATTR_STR = 1, 스탯(힘)
// eATTR_DEX = 2, 스탯(민첩)
// eATTR_VIT = 3, 스탯(체력)
// eATTR_INT = 4, 스탯(지력)
// eATTR_SPR = 5, 스탯(정신력)
// eATTR_BASE_STAT_START_INDEX = eATTR_STR,
// eATTR_BASE_STAT_COUNT = eATTR_SPR + 1,
PACKET_CG_FWD_OPEN(CG_STATUS, CG_STATUS_STAT_APPLY_SYN)
void Clear()
{
// CHANGES: f110305.3L
ZeroMemory(stat_point, sizeof(stat_point));
}
//
ushort stat_point[eATTR_BASE_STAT_COUNT];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STATUS, CG_STATUS_STAT_APPLY_ACK)
void Clear()
{
ZeroMemory(stat_point, sizeof(stat_point));
}
//
uint object_key;
uint remain_stat_point;
ushort stat_point[eATTR_BASE_STAT_COUNT];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_STATUS, CG_STATUS_STAT_APPLY_NAK)
uint result_code;
PACKET_CG_FWD_CLOSE;
#endif
// 스탯 업
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_STAT_SELECT_SYN )
BYTE m_AttrType; // eATTR_TYPE
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_STAT_SELECT_ACK )
DWORD m_dwObjKey;
BYTE m_AttrType; // eATTR_TYPE
DWORD m_dwValue; // value
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_STAT_SELECT_NAK )
BYTE m_AttrType; // eATTR_TYPE
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
// 캐릭터 상태 변경
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CONDITION_CHANGE_SYN )
BYTE m_byConditionType; // 캐릭터의 상태 타입(eCHAR_CONDITION)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CONDITION_CHANGE_BRD )
DWORD m_dwObjectKey; // 누구
BYTE m_byConditionType; // 캐릭터의 상태 타입(eCHAR_CONDITION)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CONDITION_CHANGE_NAK )
BYTE m_byErrorCode; // eCONDITION_RESULT
PACKET_CG_FWD_CLOSE;
// 상태 추가
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_ADD_BRD )
DWORD m_dwTargetKey; // 상태 추가 대상
WORD m_wStatusCode; // 상태 코드
PACKET_CG_FWD_CLOSE;
// 상태 해제
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_REMOVE_BRD )
DWORD m_dwTargetKey; // 상태 해제 대상
DWORD m_dwStatusCode; // 상태 코드
int GetSize() { return sizeof(*this); };
PACKET_CG_FWD_CLOSE;
// 캐릭터 이모션
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_EMOTION_SYN )
BYTE m_byEmotionType; // 캐릭터의 이모션 타입(환호,한숨,감사,웃음,울음 등등)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_EMOTION_BRD )
DWORD m_dwObjectKey; // 누구
BYTE m_byEmotionType; // 캐릭터의 이모션 타입
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_EMOTION_NAK )
BYTE m_byErrorCode; // eSTATUS_RESULT
PACKET_CG_FWD_CLOSE;
// 몬스터 상태 변경
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_NPC_STATE_CHANGE_CMD )
DWORD m_dwObjectKey; // 누구
BYTE m_byState; // NPC의 상태 타입(eNPC_STATE)
PACKET_CG_FWD_CLOSE;
// 렌더링 옵션 설정
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RENDER_OPTION_SYN )
enum
{
eRENDER_HELMET_OPTION = 0,
eRENDER_CAPE_OPTION,
eRENDER_WING_OPTION,
eRENDER_COSTUME_OPTION, // _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME
};
BYTE m_byRenderOptionType; // 렌더링 옵션 종류
BYTE m_byOptionLevel; // 옵션단계
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RENDER_OPTION_BRD )
DWORD m_dwObjectKey; // 누구
BYTE m_byRenderOptionType; // 렌더링 옵션 종류
BYTE m_byOptionLevel; // 옵션단계
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CHANGE_MONSTER_ABILITY )
float m_fHPRatio; // 몬스터 HP 배수
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_FATIGUE_CHANGE_CMD )
WORD m_wPlayingTime; // 현재 플레이 시간(분단위)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RESURRECTION_TO_SAFEZONE_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RESURRECTION_TO_SAFEZONE_NAK )
BYTE m_byErrorCode; // eSTATUS_RESULT 참조
PACKET_CG_FWD_CLOSE;
// 플레이어 상태정보
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_ALL_STATEINFO_CMD )
STATE_TOTAL_INFO m_StateTotalInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_StateTotalInfo);
return static_cast<uint16_t>(kMinSize + m_StateTotalInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
// designed by __NA_001290_20090525_SHIELD_SYSTEM_NOTIFY_NOTABILITY_STATE
// 플레이어 ETC상태정보
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_ETC_STATEINFO_CMD )
ETC_STATE_TOTAL_INFO m_stEtcStateTotalInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_stEtcStateTotalInfo);
return static_cast<uint16_t>(kMinSize + m_stEtcStateTotalInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
// 드래곤 변신
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_START_DRAGON_FORMATION_BRD )
DWORD m_dwObjKey;
SLOTCODE m_SkillCode;
WORD m_wStatusCode;
int m_iStatusTime;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_END_DRAGON_FORMATION_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_END_DRAGON_FORMATION_BRD )
DWORD m_dwObjKey;
SLOTCODE m_SkillCode;
WORD m_wStatusCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_END_DRAGON_FORMATION_NAK )
BYTE m_byErrorCode; // eSTATUS_RESULT 참조
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_REBIRTH_ON_VILLAGE_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_REBIRTH_ON_VILLAGE_BRD )
DWORD m_dwObjectKey; // 누구
DWORD m_dwHP; // 최종값
DWORD m_dwMP; // 최종값
WzVector m_wvCurPos; // 부활 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_REBIRTH_ON_VILLAGE_NAK )
DWORD m_dwErrorCode; //< eSTATUS_RESULT
PACKET_CG_FWD_CLOSE;
//귓말, 거래 차단
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_INTERCEPTION_SYN )
eINTERCEPTION_TYPE m_byInterceptionCode;
BOOL m_bRequestFlag;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_INTERCEPTION_ACK )
eINTERCEPTION_TYPE m_byInterceptionCode;
BOOL m_bRequestFlag;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_INTERCEPTION_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_FREE_INIT_STAT_UNDER_20_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_FREE_INIT_STAT_UNDER_20_ACK )
BYTE m_byFreeInitCount;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_FREE_INIT_STAT_UNDER_20_NAK )
BYTE m_ResultCode; //eSTATUS_RESULT
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_CHAGNE_RENDER_EFFECT_SYN )
enum eSYN_TYPE {
EFFECT_ADD = PROTOCOL_GENERATOR_STATUS_201, // 효과 추가
EFFECT_DEL = PROTOCOL_GENERATOR_STATUS_202, // 효과 제거
};
BYTE m_SynType;
DWORD m_SpecialEffect; // BitStream : eSPECIAL_RENDER_EFFECT
// <USAGE>
// MSG_CG_STATUS_RENDER_OPTION_SYN msgSYN;
// --- 기존 코드 사용시
// // 기존 형식
// // msgSYN.m_byRenderOptionType = MSG_CG_STATUS_RENDER_OPTION_SYN::eRENDER_HELMET_OPTION;
// // msgSYN.m_byOptionLevel = level;
// // 변경 형식
// msgSYN.SetPartialInfo( MSG_CG_STATUS_RENDER_OPTION_SYN::eRENDER_HELMET_OPTION, level );
// --- 특수 추가 정보 입력시
// msgSYN.SetSpecialInfo( eSPECIAL_RENDER_EFFECT_SOLO_BADGE );
// SendPacket( &msgSYN, sizeof(msgSYN) );
inline VOID SetInfo( eSYN_TYPE cmd, DWORD specialEffect )
{
m_SynType = static_cast<uint8_t>(cmd);
m_SpecialEffect = specialEffect;
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_INHERIT_OPEN( CG_STATUS, CG_STATUS_CHAGNE_RENDER_EFFECT_BRD, MSG_CG_STATUS_CHAGNE_RENDER_EFFECT_SYN )
DWORD m_ObjectKey; // 누구
inline VOID SetInfo( eSYN_TYPE cmd, DWORD specialEffect, DWORD target )
{
MSG_CG_STATUS_CHAGNE_RENDER_EFFECT_SYN::SetInfo( cmd, specialEffect );
m_ObjectKey = target;
}
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RENDER_EFFECT_ITEM_LIST_SYN )
PACKET_CG_FWD_CLOSE;
struct sMSG_RENDER_EFFECT_ITEM_LIST
{
enum { MAX_EFFECT_ITEMS = 10, };
DWORD m_PlayerKey; // _NA_007810_20141112_MODIFY_MSG_RENDER_EFFECT_ITEM_LIST_PACKET
eSPECIAL_RENDER_EFFECT m_BitRender; // 아이템이 아닌 특수 이펙트
BYTE m_ItemCount;
SLOTCODE m_ItemCodes[MAX_EFFECT_ITEMS];
inline WORD GetSize()
{
return (WORD)( sizeof(*this)-( sizeof(SLOTCODE)*( MAX_EFFECT_ITEMS-m_ItemCount ) ) );
}
};
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_RENDER_EFFECT_ITEM_LIST_BRD )
enum { _MAX_PLAYER_INFO_SIZE = MSG_CG_SYNC_ALLPLAYERS_CMD::_MAX_PLAYER_INFO_SIZE, };
BYTE m_Count;
// "sMSG_RENDER_EFFECT_ITEM_LIST" 가 m_Count만큼 추가된다. 각 노드들 역시 variable size
inline WORD GetSize() { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_INHERIT_OPEN( CG_STATUS, CG_STATUS_RENDER_EFFECT_ITEM_LIST_CMD, MSG_CG_STATUS_RENDER_EFFECT_ITEM_LIST_BRD )
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_DELETE_CHAR_STATE_SYN )
eCHAR_STATE_TYPE m_eCharStateType;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_DELETE_CHAR_STATE_ACK )
BYTE m_bResult; // TRUE or FALSE
eCHAR_STATE_TYPE m_eCharStateType;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_STATUS, CG_STATUS_ETHER_ATTACK_SPEED_CMD )
INT m_AttackSpeedValue;
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 파티관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_CREATE_CMD )
WORD m_PartyKey;
DWORD m_MasterKey;
DWORD m_TargetKey;
BYTE m_DistributionType; // eITEM_DISTRIBUTION_TYPE
PARTY_MEMBER_TOTAL_INFO m_MemberTotalInfo;
int GetSize()
{
return ( sizeof(MSG_CG_PARTY_CREATE_CMD) - (PARTY_MEMBER_TOTAL_INFO::MAX_SLOT_NUM-m_MemberTotalInfo.m_Count)*sizeof(PARTY_MEMBER_TOTAL_INFO::SLOT_TYPE) );
}
PACKET_CG_FWD_CLOSE;
// 파티원 한명 정보가m_byHPRatio 바꼈을 때
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_LEVEL_UP_BRD )
DWORD m_dwObjKey; // 레벨업한 파티원
LEVELTYPE m_wLevel; // 현재 레벨
BYTE m_byHPRatio; // 현재 HP 비율
BYTE m_byMPRatio; // 현재 MP 비율
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_HP_CHANGE_BRD )
struct Node {
WORD objectKey;
BYTE ratio;
};
BYTE m_NumberOfNodes;
Node m_Nodes[MAX_PARTYMEMBER_NUM];
inline WORD GetSize() const
{
const WORD MinSize = sizeof(*this) - sizeof(m_Nodes);
return MinSize + WORD(sizeof(Node) * m_NumberOfNodes);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_MP_CHANGE_BRD )
struct Node {
WORD objectKey;
BYTE ratio;
};
BYTE m_NumberOfNodes;
Node m_Nodes[MAX_PARTYMEMBER_NUM];
inline WORD GetSize() const
{
const WORD MinSize = sizeof(*this) - sizeof(m_Nodes);
return MinSize + WORD(sizeof(Node) * m_NumberOfNodes);
}
PACKET_CG_FWD_CLOSE;
#ifdef _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_SD_CHANGE_BRD )
struct Node {
WORD object_key;
BYTE ratio;
};
BYTE number_of_nodes;
Node nodes[MAX_PARTYMEMBER_NUM];
inline WORD GetSize() const
{
const WORD MinSize = sizeof(*this) - sizeof(nodes);
return MinSize + WORD(sizeof(Node) * number_of_nodes);
}
PACKET_CG_FWD_CLOSE;
#endif // _NA_006638_20120415_ADD_SHIELD_INFO_IN_TARGET_INFO
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_FP_CHANGE_BRD )
struct Node {
WORD object_key;
};
BYTE number_of_nodes;
Node nodes[MAX_PARTYMEMBER_NUM];
inline WORD GetSize() const
{
const WORD MinSize = sizeof(*this) - sizeof(nodes);
return MinSize + WORD(sizeof(Node) * number_of_nodes);
}
PACKET_CG_FWD_CLOSE;
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_STATUS_CHANGE_BRD )
DWORD m_dwObjKey; // 상태가 변한 파티원
bool m_bAdd; // 상태 추가/해제
WORD m_wStateCode; // 상태 코드
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_DEAD_BRD )
DWORD m_dwObjKey;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_RESURRECTION_BRD )
DWORD m_dwObjKey;
BYTE m_byHPRatio; // 현재 HP 비율
BYTE m_byMPRatio; // 현재 MP 비율
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_CHAO_STATE_CHANGE_BRD )
DWORD m_dwObjKey;
BYTE m_byChaoState; // 카오상태(eCHAO_STATE)
PACKET_CG_FWD_CLOSE;
// 파티가입 요청
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_JOIN_SYN )
char m_TargetCharName[MAX_CHARNAME_LENGTH];// // 파티가입을 요청하는 상대
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_JOIN_BRD )
WORD m_PartyKey;
_PARTY_MEMBER_INFO m_NewMemberInfo;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_JOIN_NAK )
BYTE m_byErrorCode; // 파티가입 요청 실패 원인(ePARTY_RESULT)
ePLAYER_BEHAVE_STATE m_ePlayerState;
PACKET_CG_FWD_CLOSE;
// 파티가입 응답
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_JOIN_RESPONSE_SYN )
char m_szMasterName[MAX_CHARNAME_LENGTH];// 가입을 요청한 파티장 ID
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_JOIN_RESPONSE_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_JOIN_RESPONSE_NAK )
PACKET_CG_FWD_CLOSE;
// 파티탈퇴 요청
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_LEAVE_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_FORCED_EXPULSION_SYN )
DWORD m_dwObjKey; // 강제추방할려는 대상의 오브젝트 키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_LEAVE_BRD )
BYTE m_byReason; // eREASON_LEAVE_PARTY
DWORD m_dwObjKey; // 탈퇴한 파티원의 오브젝트 키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_LEAVE_NAK )
BYTE m_byErrorCode; // 파티탈퇴 실패 원인(ePARTY_RESULT)
PACKET_CG_FWD_CLOSE;
// 파티장 변경 요청
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_CHANGE_MASTER_SYN )
DWORD m_dwObjKey; // 변경할 멤버 오브젝트키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_CHANGE_MASTER_BRD )
DWORD m_dwObjKey; // 변경된 파티장 오브젝트키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_CHANGE_MASTER_NAK )
BYTE m_byErrorCode; // 파티장 변경 실패 원인(ePARTY_RESULT)
PACKET_CG_FWD_CLOSE;
// 파티해체 요청
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_DESTROY_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_DESTROY_BRD )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_DESTROY_NAK )
BYTE m_byErrorCode; // 파티해체 실패 원인(ePARTY_RESULT)
PACKET_CG_FWD_CLOSE;
// 파티 타겟팅
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_SELECT_TARGET_SYN )
DWORD m_dwObjectKey; // 타겟으로 삼을 몬스터 오브젝트키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_SELECT_TARGET_BRD )
DWORD m_dwObjectKey; // 타겟으로 지정된 오브젝트키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_SELECT_TARGET_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// 파티장 근처로 워프(최종 워프는 CG_MAP_TELEPORT_BRD로 보냄)
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_WARP_REQ_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_WARP_REQ_NAK )
BYTE m_byErrorCode; // ePARTY_RESULT
PACKET_CG_FWD_CLOSE;
// 파티원 소환(최종 소환은 CG_MAP_TELEPORT_BRD로 보냄)
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_SUMMON_REQ_SYN )
DWORD m_dwObjKey; // 소환할 파티원 오브젝트키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_SUMMON_REQ_NAK )
BYTE m_byErrorCode; // ePARTY_RESULT
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_SUMMON_REQ_CMD )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_SUMMON_RES_SYN )
BYTE m_byResultCode; // ePARTY_RESULT
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MEMBER_SUMMON_RES_NAK )
BYTE m_byErrorCode; // ePARTY_RESULT
PACKET_CG_FWD_CLOSE;
// 파티 미니맵 포인팅
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MINIMAP_POINTING_SYN )
float m_fx;
float m_fy;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MINIMAP_POINTING_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_MINIMAP_POINTING_BRD )
float m_fx;
float m_fy;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_ITEM_DISTRIBUTION_CHANGE_SYN )
BYTE m_byItemDistributionType;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_ITEM_DISTRIBUTION_CHANGE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_ITEM_DISTRIBUTION_CHANGE_BRD )
BYTE m_byItemDistributionType;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_RETURN_C2G_LEADER_QUERY_ACK )
enum eANSWER {
ACCEPT_JOIN = PROTOCOL_GENERATOR_091, // 파티참가 허용
REJECT_JOIN = PROTOCOL_GENERATOR_054, // 파티참가 불허
THINKING_HUMMMM = PROTOCOL_GENERATOR_034, // 파티장 고민중
};
BYTE m_byAnswer;
DWORD m_dwPlayerKey;
inline BYTE& ANSWER() { return m_byAnswer; }
inline DWORD& PLAYER_KEY() { return m_dwPlayerKey; };
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_RETURN_G2C_MEMBER_QUERY_CMD )
WORD m_wPartyKey;
inline WORD& PARTY_KEY() { return m_wPartyKey; }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_RETURN_C2G_MEMBER_QUERY_ACK )
enum eANSWER {
ACCEPT_JOIN = PROTOCOL_GENERATOR_029, // 파티참가 OK
REJECT_JOIN = PROTOCOL_GENERATOR_147, // 파티참가 NO
};
BYTE m_byAnswer;
WORD m_wPartyKey;
inline BYTE& ANSWER() { return m_byAnswer; }
inline WORD& PARTY_KEY() { return m_wPartyKey; }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_RETURN_G2C_MEMBER_REMOVE_CMD )
sSTRING_BUFFER_CHAR_NAME m_CharName;
inline CHAR* CHAR_NAME() { return m_CharName.GetBUFFER(); }
inline VOID CopyFrom( const TCHAR* ptszCharName ) // 안정화된 문자열
{
m_CharName.CopyFrom( ptszCharName ); // NULL 포함
}
inline WORD GetSize()
{
return sizeof(*this);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PARTY, CG_PARTY_RETURN_A2C_MEMBER_REJECT_CMD )
sSTRING_BUFFER_CHAR_NAME m_CharName;
inline CHAR* CHAR_NAME() { return m_CharName.GetBUFFER(); }
inline VOID CopyFrom( TCHAR* ptszCharName ) // 안정화된 문자열
{
m_CharName.CopyFrom( ptszCharName ); // NULL 포함
}
inline WORD GetSize()
{
return sizeof(*this);
}
PACKET_CG_FWD_CLOSE;
//{__NA001336_090514_PARTY_NAVI_SUPPORT__
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_NAVI_INFO_BRD)
enum eOption {
OPTION_NULL = 0,
OPTION_PARTY_NAVI = 1 << 0,
// 1 << 7이 Max
MAX_OBJECT_ARRAY_SIZE = MAX_PARTYMEMBER_NUM,
};
struct Node {
WORD objectKey; // Player Object Key
FIELDCODE fieldCode; // FIELDCODE
short posX, posY, posZ; // X,Y,Z좌표: 소수점 이하 제거 수치
// NOTE: posZ is added to support _NA_0_20100722_AUTO_SYSTEM
};
BYTE m_CodeType; // eOption
BYTE m_NumberOfNodes; // Max = MAX_OBJECT_ARRAY_SIZE
Node m_Nodes[MAX_OBJECT_ARRAY_SIZE];
inline WORD GetSize() const
{
const WORD MinSize = WORD(sizeof(*this) - sizeof(m_Nodes));
return MinSize + WORD(sizeof(Node)) * m_NumberOfNodes;
}
PACKET_CG_FWD_CLOSE;
//__}
//////////////////////////////////////////////////////////////////////////
//_NA_20110630_BATTLE_ZONE_RENEWAL
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_BATTLE_ZONE_INFO_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_BATTLE_ZONE_INFO_ACK)
BYTE all_page_num_;//리스트 전체 페이지 수
BYTE number_of_list_;//현재 전달되는 리스트 수
PartyRoomInfo party_room_info_[MAX_PARTYROOM_LIST];//리스트 정보
WORD GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(party_room_info_);
return static_cast<uint16_t>(MinSize + sizeof(party_room_info_[0]) * number_of_list_);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_ROOM_LIST_SYN)
BYTE request_page_;//요청 페이지
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_ROOM_LIST_ACK)
BYTE all_page_num_;//리스트 전체 페이지 수
BYTE number_of_list_;//현재 전달되는 리스트 수
PartyRoomInfo party_room_info_[MAX_PARTYROOM_LIST];//리스트 정보
uint16_t GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(party_room_info_);
return static_cast<uint16_t>(MinSize + sizeof(party_room_info_[0]) * number_of_list_);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CREATE_ROOM_SYN)
BasePartyRoomInfo party_room_info_;//파티룸 기본 정보 구조체
SLOTCODE require_item_;//파티룸 생성에 필요한 아이템
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CREATE_ROOM_ACK)
RC::ePARTY_RESULT result_code_;//결과값
PartyRoomInfo party_room_info_;//생성된 방 정보
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_JOIN_ROOM_SYN)
WORD join_party_key_;//Join하려는 파티 키값
bool is_private_room_;//비밀방 여부
TCHAR password_[MAX_ROOMPASSWORD_LENGTH+1];//파티룸 비밀 번호
uint16_t GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(password_);
if (is_private_room_ == true)
{
return static_cast<uint16_t>(MinSize + sizeof(password_[0]) * _countof(password_));
}
else
{
return static_cast<uint16_t>(MinSize);
}
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_JOIN_ROOM_ACK)
RC::ePARTY_RESULT result_code_;//결과 값
PartyRoomInfo party_room_info_;//들어가려는 방의 정보
uint16_t GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(party_room_info_);
if (result_code_ == RC::RC_PARTY_SUCCESS)
{
return static_cast<uint16_t>(MinSize + sizeof(party_room_info_));
}
else
{
return static_cast<uint16_t>(MinSize);
}
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_JOIN_ROOM_BRD)
uint16_t GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_LEAVE_ROOM_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_LEAVE_ROOM_ACK)
RC::ePARTY_RESULT result_value_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_LEAVE_ROOM_BRD)
DWORD member_key_;//파티룸을 떠나는 Object Key
#ifdef _NA_20111220_CHANGE_DISCONNECTED_USER_PROCESS
BYTE reason_to_leave_;//eREASON_LEAVE_PARTY
#endif
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CHANGE_ROOM_OPTION_SYN)
BasePartyRoomInfo change_party_room_info_;//변경 요청 옵션 구조체
SLOTCODE require_item_;//파티룸 생성에 필요한 아이템
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CHANGE_ROOM_OPTION_ACK)
RC::ePARTY_RESULT result_code_;//결과 값
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CHANGE_ROOM_OPTION_BRD)
BasePartyRoomInfo change_party_room_info_;//변경 되는 옵션 구조체
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CHANGE_MAX_PLAYER_COUNT_SYN)
BYTE max_count_;//변경하려는 Max count
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CHANGE_MAX_PLAYER_COUNT_ACK)
RC::ePARTY_RESULT result_code_;//결과 코드
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CHANGE_MAX_PLAYER_COUNT_BRD)
BYTE max_count_;//변경되는 Max count
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_STANDBY_ROOM_SYN)
BYTE number_of_mission_;//예약한 미션의 갯수
MAPCODE map_code_[MAX_MISSION_COUNT];
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(map_code_);
return static_cast<uint16_t>(kMinSize + sizeof(map_code_[0]) * number_of_mission_);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_STANDBY_ROOM_ACK)
bool result_value_;//결과 값
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_ASK_JOIN_ROOM_BRD)
MAPCODE map_code_;//참가 가능한 미션 코드
WORD party_key_;//참가 가능한 파티 키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_READY_STATE_SYN)
bool ready_state_;//준비 상태
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_READY_STATE_ACK)
RC::ePARTY_RESULT result_code_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_READY_STATE_BRD)
DWORD member_key_;//준비 상태 변경을 요청한 케릭터 guid
bool ready_state_;//준비 상태
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_PLAYER_MOVE_FIELD_BRD)
DWORD member_key_;//맵 이동을 한 케릭터 guid
MAPCODE map_code_;//이동한뒤 해당 케릭터의 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CHECK_ROOM_SYN)
enum CheckType{
CheckCreateType,
CheckStanByType,
};
CheckType check_type_;//체크 타입
BYTE select_mission_num_;//예약을 원하는 미션의 갯수
MAPCODE map_code_[MAX_MISSION_COUNT];//예약을 원하는 미션 코드 배열
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(map_code_);
return static_cast<uint16_t>(kMinSize + sizeof(map_code_[0]) * select_mission_num_);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_CHECK_ROOM_ACK)
enum CheckType{
CheckCreateType,
CheckStanByType,
};
CheckType check_type_;//체크 타입
WORD find_party_key_;//조건이 맞는 파티 키
MAPCODE map_code_;//찾은 룸의 맵코드
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_ALLPLAYERS_CMD)
enum { MAX_PLAYER_COUNT = 10, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_ALLPLAYERS_EQUIPINFO_CMD)
enum { MAX_PLAYER_COUNT = MSG_CG_PARTY_ALLPLAYERS_CMD::MAX_PLAYER_COUNT, };
BYTE m_byCount;
int GetSize() const { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_RENDER_EFFECT_ITEM_LIST_CMD )
enum { MAX_PLAYER_COUNT = MSG_CG_PARTY_ALLPLAYERS_CMD::MAX_PLAYER_COUNT, };
BYTE m_Count;
inline WORD GetSize() { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_ROOM_FORCE_LEAVE_SYN)
DWORD member_key_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_ROOM_START_SYN)
SLOTCODE require_item_;//파티룸 생성에 필요한 아이템
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_ROOM_START_ACK)
RC::ePARTY_RESULT result_code_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_SELECT_TEAM_SYN)
BYTE select_team_;//현재 0:아무런 팀 선택 하지 않음, 1:첫번째 팀 2:두번째 팀
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_SELECT_TEAM_ACK)
RC::ePARTY_RESULT result_code_;//팀선택 결과 값
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_SELECT_TEAM_BRD)
DWORD member_key_;//팀을 선택한 유저의 object key
BYTE select_team_;//선택한 팀
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_REQUEST_MEMBER_INFO_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_FIND_ROOM_BY_CHARID_SYN)
TCHAR find_char_name_[MAX_CHARNAME_LENGTH+1];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_FIND_ROOM_BY_CHARID_ACK)
RC::ePARTY_RESULT result_code_;//결과 값
PartyRoomInfo party_room_info_;//들어가려는 방의 정보
uint16_t GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(party_room_info_);
if (result_code_ == RC::RC_PARTY_SUCCESS)
{
return static_cast<uint16_t>(MinSize + sizeof(party_room_info_));
}
else
{
return static_cast<uint16_t>(MinSize);
}
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_FIND_ROOM_BY_ROOMNUMBER_SYN)
WORD find_room_key_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_FIND_ROOM_BY_ROOMNUMBER_ACK)
RC::ePARTY_RESULT result_code_;//결과 값
PartyRoomInfo party_room_info_;//들어가려는 방의 정보
uint16_t GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(party_room_info_);
if (result_code_ == RC::RC_PARTY_SUCCESS)
{
return static_cast<uint16_t>(MinSize + sizeof(party_room_info_));
}
else
{
return static_cast<uint16_t>(MinSize);
}
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_RESET_READY_STATE_CMD)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_STANDBY_PAUSE_SYN)
bool set_value_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_STANDBY_PAUSE_ACK)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_REQUEST_RENDER_INFO_SYN)
WORD request_party_key_;
DWORD request_member_key_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_START_ROOM_COUNT_BRD)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_FIND_WAITING_ROOM_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_FIND_WAITING_ROOM_ACK)
BYTE number_of_list_;//현재 전달되는 리스트 수
PartyRoomInfo party_room_info_[MAX_PARTYROOM_SEARCH_LIST];//리스트 정보
uint16_t GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(party_room_info_);
return static_cast<uint16_t>(MinSize + sizeof(party_room_info_[0]) * number_of_list_);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_FIND_ROOM_BY_MISSION_NAME_SYN)
MAPCODE request_map_code_;//요청 미션 맵 코드
PartyZoneType party_room_type_;//요청 미션 타입
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_FIND_ROOM_BY_MISSION_NAME_ACK)
BYTE number_of_list_;//현재 전달되는 리스트 수
PartyRoomInfo party_room_info_[MAX_PARTYROOM_SEARCH_LIST];//리스트 정보
uint16_t GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(party_room_info_);
return static_cast<uint16_t>(MinSize + sizeof(party_room_info_[0]) * number_of_list_);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_INVITE_PARTY_ROOM_REQ)
WORD invite_party_key_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_INVITE_PARTY_ROOM_ANS)
bool member_response_;
WORD join_party_key_;
PACKET_CG_FWD_CLOSE;
#ifdef _NA_20111220_CHANGE_DISCONNECTED_USER_PROCESS
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_RETURN_G2C_MEMBER_REMOVE_SYN)
WORD request_party_key_;
char leave_member_name_[MAX_CHARNAME_LENGTH+1];
PACKET_CG_FWD_CLOSE;
#endif
#ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_DICECAST_RESULT_CMD)
DWORD item_object_key;
SLOTCODE item_code;
DWORD winner_key;
_DICECAST_RESULT result[MAX_PARTYMEMBER_NUM];
PACKET_CG_FWD_CLOSE;
#endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING
#ifdef _NA_004204_20120131_BATTLE_ZONE_PARTY_OBTAIN
PACKET_CG_FWD_OPEN(CG_PARTY, CG_PARTY_ON_ENTER_GAME_ROOM_BRD)
bool zone_policy_item_obtain_all_party_member_;
PACKET_CG_FWD_CLOSE;
#endif //_NA_004204_20120131_BATTLE_ZONE_PARTY_OBTAIN
//////////////////////////////////////////////////////////////////////////
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// GM 명령어 관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 몬스터 생성 및 제거
struct MSG_CG_GM_MONSTER_CREATE_SYN : public MSG_BASE_FORWARD
{
MONSTERCODE m_dwMonsterCode;
BYTE m_byMonsterCnt;
float m_fPos[3]; // 생성하고 싶은 좌표
};
struct MSG_CG_GM_MONSTER_DESTROYALL_SYN : public MSG_BASE_FORWARD
{
};
struct MSG_CG_GM_MONSTER_DESTROYNEAR_SYN : public MSG_BASE_FORWARD
{
};
// 옵져버 모드로 전환
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_OBSERVER_SYN )
BYTE m_byObserverOn; // On(1) or Off(0)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_OBSERVER_BRD )
DWORD m_dwObjectKey;
BYTE m_byObserverOn; // On(1) or Off(0)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_OBSERVER_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
// 무적상태로 전환
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_UNDEAD_MODE_SYN )
BOOL m_bUndeadOn; // On(1) or Off(0)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_UNDEAD_MODE_ACK )
BOOL m_bUndeadOn; // On(1) or Off(0)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_UNDEAD_MODE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
// 캐릭터의 정보 요청
struct MSG_CG_GM_CHARINFO_SYN : public MSG_BASE_FORWARD
{
DWORD m_dwUserID; // CharName으로 검색할 때는 0 값을 셋팅한다.
char m_szCharName[MAX_CHARNAME_LENGTH+1];
};
struct MSG_CG_GM_CHARINFO_ACK : public MSG_BASE_FORWARD
{
char m_pszAccountID[ID_MAX_LEN+1]; // 계정 아이디.
eCHAR_TYPE m_eCharType; // 캐릭터 클래스
WORD m_wLevel; // 레벨
MONEY m_Money; // 가진 돈
KEYTYPE m_RoomKey; // 방키
CODETYPE m_MapCode; // 맵코드
WzVector m_vCurPos; // 현재 위치
char m_szGuildName[MAX_GUILDNAME_LENGTH+1]; // 길드이름
};
struct MSG_CG_GM_CHARINFO_NAK : public MSG_BASE_FORWARD
{
DWORD m_dwErrorCode; // eGM_RESULT
};
// 일반 아이템 생성
struct MSG_CG_GM_CREATE_ITEM_SYN : public MSG_BASE_FORWARD
{
SLOTCODE m_ItemCode; // 아이템 코드
DWORD m_dwItemCount; // 아이템 개수(1 ~ GM_MAX_CREATE_ITEM_NUM)
};
// 인첸트 아이템 생성
struct MSG_CG_GM_CREATE_ENCHANT_ITEM_SYN : public MSG_BASE_FORWARD
{
SLOTCODE m_ItemCode; // 아이템 코드
DWORD m_dwItemCount; // 아이템 개수
BYTE m_byEnchant; // 인첸트등급
};
// 일정반경의 필드 아이템을 모두 제거
struct MSG_CG_GM_DESTROY_ITEM_AROUND_SYN : public MSG_BASE_FORWARD
{
};
// 필드에 돈 생성
struct MSG_CG_GM_CREATE_MONEY_SYN : public MSG_BASE_FORWARD
{
MONEY m_Money; // 생성할 액수(1 ~ GM_MAX_CREATE_MONEY)
};
// 레벨 업
struct MSG_CG_GM_LEVEL_UP_SYN : public MSG_BASE_FORWARD
{
WORD m_wBonusLevel; // 상승시킬 레벨수치(현재 레벨 + 상승시킬 레벨수치 = 최종 레벨)
};
// 스텟 업
struct MSG_CG_GM_STAT_UP_SYN : public MSG_BASE_FORWARD
{
DWORD m_dwBonusStat; // -GM_MAX_STAT_UP_VALUE ~ GM_MAX_STAT_UP_VALUE
};
struct MSG_CG_GM_STAT_UP_ACK : public MSG_BASE_FORWARD
{
DWORD m_dwRemainStat; // 남은 스탯포인트
};
// 스킬포인트 업
struct MSG_CG_GM_SKILLPOINT_UP_SYN : public MSG_BASE_FORWARD
{
DWORD m_dwBonusSkill; // -GM_MAX_SKILLPOINT_UP_VALUE ~ GM_MAX_SKILLPOINT_UP_VALUE
};
struct MSG_CG_GM_SKILLPOINT_UP_ACK : public MSG_BASE_FORWARD
{
DWORD m_dwRemainSkill; // 남은 스킬포인트
};
//GM 부활 SYN
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_RESURRECTION_SYN )
PACKET_CG_FWD_CLOSE;
//GM 부활 NAK
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_RESURRECTION_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
//GM 부활 BRD
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_RESURRECTION_BRD )
DWORD m_dwObjectKey; // 누구
DWORD m_dwHP; // 최종값
DWORD m_dwMP; // 최종값
WzVector m_wvCurPos; // 부활 위치
PACKET_CG_FWD_CLOSE;
//GM 회복 SYN
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_RECOVERY_SYN )
PACKET_CG_FWD_CLOSE;
//GM 회복 NAK
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_RECOVERY_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
//GM 회복 BRD
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_RECOVERY_BRD )
DWORD m_dwObjectKey; // 누구
DWORD m_dwHP; // 최종값
DWORD m_dwMP; // 최종값
PACKET_CG_FWD_CLOSE;
//GM 속도 SYN
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_SET_SPEED_SYN )
BYTE m_byMoveLevel; // 속도레벨 0~5까지 있음.
PACKET_CG_FWD_CLOSE;
//GM 속도 BRD
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_SET_SPEED_BRD )
DWORD m_dwObjectKey; // GM의 objectKey
BYTE m_byMoveLevel; // 속도레벨
FLOAT m_fSpeedRatio; // 속도에 따른 증가비율
PACKET_CG_FWD_CLOSE;
//GM 속도 NAK
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_SET_SPEED_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
//GM 입장 SYN
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_ENTRANCE_SYN )
PACKET_CG_FWD_CLOSE;
//GM 입장 NAK
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_ENTRANCE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
//GM 접속종료 SYN
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_FORCE_DISCONNECT_SYN )
DWORD m_dwUserKey;
PACKET_CG_FWD_CLOSE;
//ACK
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_FORCE_DISCONNECT_ACK )
DWORD m_dwUserKey;
PACKET_CG_FWD_CLOSE;
//NAK
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_FORCE_DISCONNECT_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
//특정 몬스터 제거(아이템, 경험치 없음)
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_MONSTER_DESTROYONE_SYN )
DWORD m_dwMonsterKey;
PACKET_CG_FWD_CLOSE;
//NAK
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_MONSTER_DESTROYONE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
//특정 몬스터를 정상적으로 죽임(아이템, 경험치 있음)
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_MONSTER_KILLONE_SYN )
DWORD m_dwMonsterKey;
PACKET_CG_FWD_CLOSE;
//NAK
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_MONSTER_KILLONE_NAK )
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_RELOAD_DATA_CMD )
PACKET_CG_FWD_CLOSE;
// 방정보
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_ROOMINFO_SYN )
KEYTYPE m_RoomKey; // 키값이 0이면 현재 소속된 방의 정보를 보여준다.
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_ROOMINFO_ACK )
enum { _MAX_PLAYER_INFO_SIZE = 10 };
char m_szMasterName[MAX_CHARNAME_LENGTH+1]; // 방 개설자 이름
BYTE m_byCount;
GM_CHARINFO m_pPlayerInfo[_MAX_PLAYER_INFO_SIZE];
int GetSize()
{
return sizeof(*this) - (sizeof(GM_CHARINFO)*(_MAX_PLAYER_INFO_SIZE - m_byCount));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_ROOMINFO_NAK )
DWORD m_dwErrorCode; // eGM_RESULT
PACKET_CG_FWD_CLOSE;
// 채널정보
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_CHANNELINFO_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_CHANNELINFO_ACK )
DWORD m_dwChannelUserNum; // 현재 채널 접속자수
WORD m_wHuntingRoomCount; // 헌팅룸 개수(로비포함)
WORD m_wMissionRoomCount; // 미션룸 개수(로비포함)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_CHANNELINFO_NAK )
DWORD m_dwErrorCode; // eGM_RESULT
PACKET_CG_FWD_CLOSE;
// 워프 기능
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_WARP_SYN )
char m_szCharName[MAX_CHARNAME_LENGTH]; // 이동시킬 대상이름
bool m_bWatch; // 감시켬
KEYTYPE m_RoomKey; // 방번호(마을의 경우 0으로 셋팅)
CODETYPE m_MapCode; // 맵코드(마을이 아닌 경우 0으로 셋팅)
WzVector m_vDestPos; // 이동하고자하는 목적지 좌표
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_WARP_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_WARP_NAK )
BYTE m_byErrorCode; // eGM_RESULT
PACKET_CG_FWD_CLOSE;
// 스트링 명령어(서버쪽에서 파싱해서 처리하는 명령어)
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_STRING_CMD_SYN )
enum { MAX_STRING_CMD_LENGTH = 100 };
char m_szStringCmd[MAX_STRING_CMD_LENGTH+1]; // 스트링 명령어
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_SERVER_BACK_CMD )
enum { MAX_STRING_CMD_LENGTH = 100 };
char m_szStringCmd[MAX_STRING_CMD_LENGTH+1]; // 스트링 명령어
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_STRING_CMD_ACK )
enum { MAX_STRING_CMD_LENGTH = 100 };
char m_szCommand[MAX_STRING_CMD_LENGTH+1];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_STRING_CMD_NAK )
BYTE m_byErrorCode; // eGM_RESULT
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_ACCOUNT_MODE_ACK )
BOOL m_bTurnOn;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_CHANGE_ROOMTITLE_ACK )
KEYTYPE m_RoomKey;
TCHAR m_szRoomTitle[MAX_ROOMTITLE_LENGTH]; // 바꿀 룸제목
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_CHANGE_ROOMTITLE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//가기 GM명령어
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_GO_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//추적 GM명령어
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_TRACKING_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_VERSION_ACK )
BYTE m_byErrorCode;
BYTE m_byVersionType;
BYTE m_byScriptCode;
TCHAR m_szVersion[MAX_VERSION_SIZE];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_PICKUP_ACK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GM, CG_GM_SERVER_TIME_CMD )
DWORD64 m_CurTime;
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 기타 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_ETC, CG_ETC_DEBUGINFO_CMD )
enum { _MAX_CHATMSG_SIZE = 255 };
DWORD m_dwObjectKey;
BYTE m_byMsgLength;
char m_pszChatMsg[ _MAX_CHATMSG_SIZE+1 ];
uint16_t GetSize() {
const size_t kMinSize = sizeof(*this) - sizeof(m_pszChatMsg);
// NOTE: the usage case is not standard.
// this null-terminated process is based on received message process case
int len = min(m_byMsgLength, _countof(m_pszChatMsg) - 1);
m_pszChatMsg[len] = '\0';
m_byMsgLength = static_cast<BYTE>(len + 1);
return static_cast<uint16_t>(kMinSize + sizeof(m_pszChatMsg[0]) * m_byMsgLength);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ETC, CG_ETC_PET_SUMMON_RETURN_BRD )
DWORD m_dwObjectKey;
BYTE m_bIsSummon; // 1이면 소환 0이면 해제
BYTE m_byFullness;
BYTE m_Intimacy;
BYTE m_bSetPetName;
TCHAR m_PetName[MAX_PET_NAME_LENGTH];
WORD m_wPetIndex;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ETC, CG_ETC_PET_STATUS_CHANGE_BRD )
DWORD m_dwObjectKey;
POSTYPE m_ItemPos; // 인벤토리의 펫아이템 위치
BYTE m_bIsFullness; // 1이면 포만감 0이면 친밀도
BYTE m_byValue;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ETC, CG_ETC_PET_RETURN_CMD )
POSTYPE m_ItemPos; // 인벤토리의 펫아이템 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ETC, CG_ETC_PET_SET_NAME_BRD)
DWORD m_dwObjectKey;
TCHAR m_PetName[MAX_PET_NAME_LENGTH];
PACKET_CG_FWD_CLOSE;
#ifdef _NA_0_20110329_GAMEOPTION_SETTING
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GAMEOPTION_LOAD_SYN)
GameOption::Type option_type_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GAMEOPTION_LOAD_ACK)
GameOption game_option_;
//
uint16_t GetSize() const
{ // f110609.8L, fixed the invalid size calcuation spot.
const size_t kMinSize = sizeof(*this) - sizeof(game_option_);
return static_cast<uint16_t>(kMinSize + game_option_.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GAMEOPTION_LOAD_NAK)
int error_code_;
uint option_type_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GAMEOPTION_SAVE_SYN)
GameOption game_option_;
//
uint16_t GetSize() const
{ // f110609.8L, fixed the invalid size calcuation spot.
const size_t kMinSize = sizeof(*this) - sizeof(game_option_);
return static_cast<uint16_t>(kMinSize + game_option_.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GAMEOPTION_SAVE_ACK)
GameOption::Type option_type_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GAMEOPTION_SAVE_NAK)
int error_code_;
GameOption::Type option_type_;
PACKET_CG_FWD_CLOSE;
#endif //_NA_0_20110329_GAMEOPTION_SETTING
//------------------------------------------------------------------------------
//_NA_000000_20120410_SPEEDHACK
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_MEMORY_HACK_CMD)
PACKET_CG_FWD_CLOSE;
//!~ _NA004034_20120102_GUILD_POINT_SYSTEM
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GUILD_RANKINGINFO_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GUILD_RANKINGINFO_ACK)
INT guild_ranking_info_count_;
GUILD_RANKING_INFO guild_ranking_info_[GUILD_RANKING_INFO::MAX_GUILD_RANKING_INFO];
void init()
{
guild_ranking_info_count_ = 0;
memset(guild_ranking_info_, 0, sizeof(guild_ranking_info_));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GUILDINFO_SYN)
GUILDGUID guid_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GUILDINFO_ACK)
GUILDGUID guid_;
GAME_GUILD_INFO game_guild_info_;
#ifdef _NA004034_20120102_GUILD_POINT_SYSTEM
GUILD_INFO_EXTRA guild_info_extra_;
#endif //_NA004034_20120102_GUILD_POINT_SYSTEM
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
eGUILD_JOIN_REQUEST request_state_;
#endif //_NA_007330_20140620_GUILD_SYSTEM_EXTENSION
void init()
{
guid_ = 0;
memset(&game_guild_info_, 0, sizeof(game_guild_info_));
#ifdef _NA004034_20120102_GUILD_POINT_SYSTEM
memset(&guild_info_extra_, 0, sizeof(guild_info_extra_));
#endif //_NA004034_20120102_GUILD_POINT_SYSTEM
}
PACKET_CG_FWD_CLOSE;
//~! _NA004034_20120102_GUILD_POINT_SYSTEM
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// PVP 관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_INFO_CMD )
struct {
BYTE m_Team :3; //< 나의 팀 정보
BYTE m_Count :5; //< 다른 사람의 팀 정보 수
};
struct PVP_TEAM_INFO
{
DWORD m_dwPlayerKey;
BYTE m_Team;
} m_Info[MAX_PARTYMEMBER_NUM];
int GetSize()
{
return sizeof(*this) - sizeof(PVP_TEAM_INFO)*(MAX_PARTYMEMBER_NUM-m_Count);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_INFO_BRD )
DWORD m_dwPlayerKey;
BYTE m_Team;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_PRESS_KEY_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_PRESS_KEY_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_PRESS_KEY_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_MATCHLESS_MODE_START_CMD )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_MATCH_MODE_FIRST_START_CMD ) //< 처음 pvp
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_MATCH_MODE_START_CMD ) //< 자기자신
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_MATCH_MODE_START_BRD ) //< 다른 사람
DWORD m_dwPlayerKey;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_SCORE_CMD )
DWORD m_Score;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_RESULT_BRD )
DWORD m_KillerKey;
DWORD m_DierKey;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_PVP, CG_PVP_END_BRD )
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 경쟁헌팅 관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 새로운 파티 등장
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_ENTER_NEW_PARTY_BRD )
PACKET_CG_FWD_CLOSE;
// 경쟁 시작
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_START_COMPETITION_BRD )
PACKET_CG_FWD_CLOSE;
// 승리
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_WIN_COMPETITION_BRD )
WORD m_wWinPoint; // 승리 포인트
EXPTYPE m_i64Exp; // 최종 경험치
MONEY m_CurMoney; // 현재 하임
WORD m_PlusPVPPoint; // 획득 PVP 포인트
INVENTORY_TOTAL_INFO m_ItemInfo; // 획득 아이템
int GetSize()
{
return (sizeof(MSG_CG_CHUNTING_WIN_COMPETITION_BRD) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_ItemInfo.m_InvenCount-m_ItemInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX));
}
PACKET_CG_FWD_CLOSE;
// 패배
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_LOSE_COMPETITION_BRD )
PACKET_CG_FWD_CLOSE;
// 무승부
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_TIE_COMPETITION_BRD )
PACKET_CG_FWD_CLOSE;
// 킬포인트 갱신
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_UPDATE_KILLPOINT_BRD )
WORD m_wTeamKey;
WORD m_wKillPoint; // 팀의 킬포인트
PACKET_CG_FWD_CLOSE;
// 포션개수 갱신
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_UPDATE_POTIONCOUNT_BRD )
BYTE m_byAvailablePotion; // 이용가능한 포션개수
PACKET_CG_FWD_CLOSE;
// 팀정보
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_TEAM_INFO_CMD )
WORD m_wTeamKey;
PACKET_CG_FWD_CLOSE;
// 개인 경쟁인포 요청
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_POINT_INFO_SYN )
PACKET_CG_FWD_CLOSE;
struct CompetitionPoint
{
DWORD m_dwObjKey;
WORD m_wKillPoint; // 내가 획득한 킬포인트
BYTE m_byDieNum; // 죽은 횟수
BYTE m_byCombo; // 콤보(연승횟수)
};
PACKET_CG_FWD_OPEN( CG_CHUNTING, CG_CHUNTING_POINT_INFO_ACK )
BYTE m_byCount;
CompetitionPoint m_Point[CHUNTING_MAX_MEMBER_NUM*2];
int GetSize()
{
return ( sizeof(MSG_CG_CHUNTING_POINT_INFO_ACK) - (CHUNTING_MAX_MEMBER_NUM*2 - m_byCount)*sizeof(CompetitionPoint) );
}
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_SUMMON
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 공격정지
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_SUMMON_COMMAND_SYN )
DWORD m_dwTargetKey; // 타겟 키(공격지시일 경우에만 유효함)
BYTE m_byAttackPropensity : 2; // 강제공격 여부
BYTE m_byCommand : 6; // 명령타입(eSUMMON_COMMAND)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_SUMMON_COMMAND_ACK )
BYTE m_byCommand;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_SUMMON_COMMAND_NAK )
BYTE m_byCommand;
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// 스킬구사
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_SUMMON_SKILL_ACTION_SYN )
DWORD m_dwSummonedObjKey; // 소환체 오브젝트키
SLOTCODE m_SkillCode; // Skill 코드
DWORD m_dwClientSerial; // Skill 이벤트에 대한 고유 번호
WzVector m_wvCurPos; // 클라이언트가 주는 소환체의 현재 좌표
WzVector m_wvDestPos; // 소환체의 목적지 좌표
DWORD m_dwMainTargetKey; // 주공격대상의 오브젝트 키
WzVector m_wvMainTargetPos; // 주공격대상의 위치
BYTE m_byAttackPropensity; // 강제공격 여부
int GetSize() { return sizeof(MSG_CG_SUMMON_SKILL_ACTION_SYN); };
PACKET_CG_FWD_CLOSE;
// 소환체 생성
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_SUMMON_CURRENT_MP_CMD )
DWORD m_dwSummonedObjKey; // 소환체 오브젝트키
DWORD m_dwMaxMP;
DWORD m_dwMP;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_SUMMON_CURRENT_HP_CMD )
DWORD m_dwSummonedObjKey;
DWORD m_dwMaxHP;
DWORD m_dwHP;
DWORD m_dwSpeedRatio;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_SUMMON_CURRENT_HP_BRD )
DWORD m_dwSummonedObjKey;
DWORD m_dwMaxHP;
DWORD m_dwHP;
DWORD m_dwSpeedRatio;
PACKET_CG_FWD_CLOSE;
// _NA001385_20090924_DOMINATION_SKILL
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_CRYSTALWARP_COMMAND_SYN )
WzVector m_wvPos; // Create 명령에서 생성 위치
DWORD m_dwCrystalWarpObjKey; // 타겟 키 (명령을 받는 크리스탈오브젝트키, 생성시 == 0)
BYTE m_byCommand; // 명령타입(eCRYSTALWARP_COMMAND)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_CRYSTALWARP_COMMAND_BRD )
BYTE m_byCommand;
DWORD m_dwObjKey;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_SUMMON, CG_CRYSTALWARP_COMMAND_NAK )
BYTE m_byCommand;
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_GUILD 길드 관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 길드 생성
// 조건 :
// 1. 유저 레벨 100 이상
// 2. 길드 창립 자금 XX하임 소요
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_SYN )
char m_tszGuildName[MAX_GUILDNAME_LENGTH];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_ACK )
GUILDGUID m_GuildGuid;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_BRD )
PLAYERKEY m_MasterPlayerKey; //< 길드 창설한 플레이어 키
char m_tszGuildName[MAX_GUILDNAME_LENGTH];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// 길드 해체
// 길드장만 가능
// 이권(아이템,돈,각종이득)잃음
// 길드원->일반인으로 등급변경
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_BRD )
PLAYERKEY m_MasterPlayerKey; //< 길드 해산한 플레이어 키
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_JOIN_FAILED_CMD ) //< 길드 가입을 실패 했습니다.
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//길드 초대
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_INVITE_SYN )
char m_TargetCharName[MAX_CHARNAME_LENGTH]; //< 초대할 플레이어 캐릭터 이름
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_INVITE_CMD )
CHARGUID m_OperUserKey; //초대 요청한 캐릭터 인덱스
char m_OperCharName[MAX_CHARNAME_LENGTH]; //초대 요청한 플레이어 이름
#ifdef _NA_003923_20120130_GUILD_RENEWAL
char m_OperGuildName[MAX_GUILDNAME_LENGTH + 1];
#endif
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_INVITE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//길드 초대 응답
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_INVITE_ANSWER_SYN )
CHARGUID m_OperUserKey;
BOOL m_bInveite;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_INVITE_ANSWER_CMD )
PLAYERKEY m_TargetObjKey;
BOOL m_bInveite;
char m_TargetCharName[MAX_CHARNAME_LENGTH];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_INVITE_ANSWER_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//길드 가입
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_JOIN_SYN )
PLAYERKEY m_TargetObjKey;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_JOIN_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_JOIN_CMD )
DWORD m_GuildGuid;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_JOIN_BRD )
GUILD_MEMBER_INFO m_MemberInfo;
PACKET_CG_FWD_CLOSE; //길드원들에게 통보
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_JOIN_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// 길드 정보
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_TOTALINFO_REQ_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_TOTALINFO_REQ_ACK )
GUILD_INFO m_GuildInfo;
#ifdef _NA004034_20120102_GUILD_POINT_SYSTEM
GUILD_INFO_EXTRA guild_info_extra_;
#endif //_NA004034_20120102_GUILD_POINT_SYSTEM
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
GUILD_JOIN_REQUEST_TOTAL_INFO m_GuildJoinRequestTotalInfo;
#endif //_NA_007330_20140620_GUILD_SYSTEM_EXTENSION
GUILD_CORPS_TOTAL_INFO m_CorpsTotalInfo;
GUILD_MEMBER_TOTAL_INFO m_MemberTotalInfo;
int GetSize()
{
return ( sizeof(MSG_CG_GUILD_TOTALINFO_REQ_ACK) - ( sizeof(GUILD_MEMBER_TOTAL_INFO) - m_MemberTotalInfo.GetSize() ) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_TOTALINFO_REQ_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_GM_GUILD_POINT_BRD )
GUILDGUID m_GuildGuid;
UPTYPE m_UP;
GPTYPE m_GP;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_GM_GUILD_POINT_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_WITHDRAW_SYN ) //< 길드 탈퇴
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_WITHDRAW_ACK )
BYTE m_byPenaltyType;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_WITHDRAW_BRD )
TCHAR m_szCharName[MAX_CHARNAME_LENGTH];
BYTE m_byPenaltyType;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_WITHDRAW_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// 길드장이 길드 멤버 강제 탈퇴
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_KICKPLAYER_SYN )
char m_ptszKickCharName[MAX_CHARNAME_LENGTH+1]; // 탈퇴시킬 길드원
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_KICKPLAYER_CMD )
PACKET_CG_FWD_CLOSE;
// 길드장에 의해 추방되었음을 알림(탈퇴 당시 해당 멤버가 온라인일 경우에만 전송)
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_KICKPLAYER_BRD )
TCHAR m_szCharName[MAX_CHARNAME_LENGTH+1]; // 강퇴당한 캐릭터이름
PACKET_CG_FWD_CLOSE;
// 강제 탈퇴 실패(길드장에게만 전송)
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_KICKPLAYER_NAK )
char m_ptszKickCharName[MAX_CHARNAME_LENGTH+1];
DWORD m_dwErrorCode; // 에러코드(ResultCode)
PACKET_CG_FWD_CLOSE;
///////////////
// 길드 포인트 관련 패킷들
// 길드에 UP 헌납
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DONATE_UP_SYN )
UPTYPE m_DonateUP; // 헌납할 UP
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DONATE_UP_ACK )
UPTYPE m_RemainUP; // 헌납하고 남은 UP
UPTYPE m_GuildUP; // 헌납 결과로 늘어난 길드의 총 UP
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DONATE_UP_BRD )
UPTYPE m_GuildUP; // 헌납 결과로 늘어난 길드의 총 UP
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DONATE_UP_NAK )
BYTE m_byErrorCode;
PACKET_CG_CLOSE;
// 길드장이 UP->GP로 변환
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CONVERT_UP2GP_SYN )
GPTYPE m_ConvertGP; // 변환할 GP
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CONVERT_UP2GP_ACK )
UPTYPE m_RemainUP; // 변환하고 남은 UP
GPTYPE m_NowGP; // 변환 결과로 늘어난 총 GP
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CONVERT_UP2GP_BRD )
UPTYPE m_RemainUP; // 변환하고 남은 UP
GPTYPE m_NowGP; // 변환 결과로 늘어난 총 GP
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CONVERT_UP2GP_NAK )
BYTE m_byErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RANKUP_BRD )
BYTE m_byNowLevel; // 랭크업한 레벨
GPTYPE m_RemainGP; // 남은 GP
UPTYPE m_RemainUP; // 남은 UP
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_ADD_INFO_SYN )
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_ADD_INFO_ACK )
BYTE m_byRelCnt;
BYTE m_byCorpsCnt;
BASE_GUILD_ADD_INFO m_AddInfo;
uint16_t GetSize() const {
// TODO: f110506.6L, calculates accurate size
return static_cast<uint16_t>( sizeof(MSG_CG_GUILD_ADD_INFO_ACK)
- ((MAX_ALLIENCE_GUILD_NUM + MAX_HOSTILITY_GUILD_NUM + MAX_ONE_SIDE_HOSTILITY_NUM) - m_byRelCnt) * sizeof(GUILD_RELATION));
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_ADD_INFO_NAK )
BYTE m_byErrorCode;
PACKET_CG_CLOSE;
// 길드 관계
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_SYN )
eGUILD_RELATION m_eType;
CHAR m_szRelationGuildName[MAX_GUILDNAME_LENGTH + 1];
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_REQUEST_CMD )
eGUILD_RELATION m_eType;
CHARGUID m_RequestUserKey;
CHAR m_RequestGuildName[MAX_GUILDNAME_LENGTH + 1];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_ANSWER_SYN )
eGUILD_ANSWER m_eAnswerType;
eGUILD_RELATION m_eRelationType;
CHARGUID m_RequestUserKey;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_REJECT_ACK )
char m_szRelGuildName[MAX_GUILDNAME_LENGTH + 1];
eGUILD_RELATION m_eRelationType;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_DELETE_SYN )
eGUILD_RELATION m_eType;
GUILDGUID m_eDeleteGuildGuid;
CHAR m_szGuildName[MAX_GUILDNAME_LENGTH + 1];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_DELETE_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_BOTH_AGAINST_SYN )
GUILDGUID m_BothAgainstGuildGuid;
CHAR m_szRelationGuildName[MAX_GUILDNAME_LENGTH + 1];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_BRD )
DWORD m_dwPlayerKey;
GUILD_RELATION m_stRELGuild;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_DELETE_BRD )
DWORD m_dwPlayerKey;
GUILDGUID m_RelGuildGuid;
eGUILD_RELATION m_eRelType;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_BOTH_AGAINST_BRD )
DWORD m_dwPlayerKey;
GUILDGUID m_BothGuildGuid;
eGUILD_RELATION m_eDELType;
eGUILD_RELATION m_eMOVType;
#ifdef _NA_003923_20120130_GUILD_RENEWAL
DWORD64 m_RelationApplyTime;
DWORD64 m_RelationChangeTime;
#endif
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_RELATION_MOVE_BRD)
DWORD m_dwPlayerKey;
GUILDGUID m_GuildGuid;
eGUILD_RELATION m_eDELType;
eGUILD_RELATION m_eMOVType;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
//길드 군단 생성
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_CORPS_SYN )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH];
PACKET_CG_CLOSE;
//PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_CORPS_ACK )
// BYTE m_byCorpsNum;
//PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_CORPS_BRD )
BYTE m_byCorpsNum;
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_CORPS_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
//길드 군단 해산
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_CORPS_SYN )
BYTE m_byCorpsNum;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_CORPS_BRD )
BYTE m_byCorpsNum;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_CORPS_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
//비어있는 군단 정보
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_EMPTY_COMMANDER_INFO_SYN )
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_EMPTY_COMMANDER_INFO_ACK )
BYTE m_byEmptyCommanderCount;
BYTE m_byCorpsNum[MAX_GUILD_CORPS_NUM];
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(m_byCorpsNum);
return static_cast<uint16_t>(kMinSize + sizeof(m_byCorpsNum[0]) * m_byEmptyCommanderCount);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_EMPTY_COMMANDER_INFO_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
//군단장 변경
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_COMMANDER_SYN )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH];
BYTE m_byCorpsNum;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_COMMANDER_BRD )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH];
BYTE m_byCorpsNum;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_COMMANDER_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
//군단이동
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_CORPS_SYN )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH];
BYTE m_byCorpsNum;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_CORPS_BRD )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH];
BYTE m_byCorpsNum;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_CORPS_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
//길드 육성 캠프 창설
//육성 캠프는 군단장만이 쓸수 있는 기능이다.
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_REAR_CAMP_SYN )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH];
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_REAR_CAMP_ACK )
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_REAR_CAMP_BRD )
BYTE m_byCorpsNum;
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CREATE_REAR_CAMP_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
//길드 육성 캠프 해산
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_REAR_CAMP_SYN )
BYTE m_byCorpsNum;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_REAR_CAMP_ACK )
BYTE m_byCorpsNum;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_REAR_CAMP_NAK )
BYTE m_byErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_DESTROY_REAR_CAMP_BRD )
BYTE m_byCorpsNum;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
// 로그인/아웃/레벨업
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_LOGIN_CHAR_BRD )
TCHAR m_szCharName[MAX_CHARNAME_LENGTH];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_LOGIN_CHAR_CMD )
GUILD_INFO m_GuildInfo;
GUILD_CORPS_TOTAL_INFO m_CorpsTotalInfo;
GUILD_MEMBER_INFO m_MemberInfo;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_LOGOUT_CHAR_BRD )
TCHAR m_szCharName[MAX_CHARNAME_LENGTH];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHAR_LEVELUP_BRD )
TCHAR m_szCharName[MAX_CHARNAME_LENGTH];
LEVELTYPE m_Level;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_CHAOSTATE_BRD )
TCHAR m_szCharName[MAX_CHARNAME_LENGTH];
BYTE m_byChaoState; // 카오 상태(eCHAO_STATE)
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
/////////// 길드 직책 변경 ////////////////
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_DUTY_SYN )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH + 1];
BYTE m_byDuty;
BYTE m_byCorpsNum;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_DUTY_ACK )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH + 1];
BYTE m_byDuty;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_DUTY_BRD )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH + 1];
BYTE m_byDuty;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN( CG_GUILD, CG_GUILD_CHANGE_DUTY_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
///////// 길드 권한 위임 목록 요청 ////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RIGHT_DELEGATION_LIST_SYN )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH + 1];
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RIGHT_DELEGATION_LIST_ACK )
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH + 1];
GUILD_RIGHT_USE_INFO m_DelegateRight[MAX_GUILD_DELEGATE_RIGHT];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RIGHT_DELEGATION_LIST_NAK )
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
///////// 길드 권한 위임 ////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RIGHT_DELEGATION_SYN)
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH + 1];
GUILD_RIGHT_USE_INFO m_DelegateRight[MAX_GUILD_DELEGATE_RIGHT];
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RIGHT_DELEGATION_ACK)
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH + 1];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RIGHT_DELEGATION_CMD)
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RIGHT_DELEGATION_NAK)
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
/////// 길드장 변경 //////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_CHANGE_MASTER_SYN)
TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH + 1];
PACKET_CG_CLOSE;
//PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_CHANGE_MASTER_ACK)
// TCHAR m_szTargetCharName[MAX_CHARNAME_LENGTH + 1];
//PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_CHANGE_MASTER_BRD)
TCHAR m_szOldMasterName[MAX_CHARNAME_LENGTH + 1];
TCHAR m_szNewMasterName[MAX_CHARNAME_LENGTH + 1];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_CHANGE_MASTER_NAK)
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_LEAVE_BRD)
PLAYERKEY m_LeaverObjectKey; //< 길드 탈퇴한 플레이어 키
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
////////////////길드 해산/복구 ////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_DESTROY_WAIT_ACK)
GUILDGUID m_GuildGuid;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RECOVERY_GUILD_SYN)
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RECOVERY_GUILD_ACK)
GUILDGUID m_GuildGuid;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_RECOVERY_GUILD_NAK)
BYTE m_byErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_DESTROY_WAIT_BRD)
DWORD m_dwPlayerKey;
GUILDGUID m_RelGuildGuid;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
////////////////길드 마크 등록////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_REGISTER_SYN)
SLOTIDX m_SlotIndex;
POSTYPE m_SlotPos;
GUILDGUID m_GuildIndex;
GUILDMARKIDX m_BackGroundIndex;
GUILDMARKIDX m_PatternIndex;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_REGISTER_ACK)
GUILDGUID m_GuildIndex;
GUILDMARKIDX m_BackGroundIndex;
GUILDMARKIDX m_PatternIndex;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_REGISTER_BRD)
DWORD m_dwPlayerKey;
GUILDGUID m_GuildIndex;
GUILDMARKIDX m_BackGroundIndex;
GUILDMARKIDX m_PatternIndex;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_REGISTER_SECTOR_BRD)
DWORD m_dwPlayerKey;
GUILDGUID m_GuildIndex;
GUILDMARKIDX m_BackGroundIndex;
GUILDMARKIDX m_PatternIndex;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
////////////////길드 마크 삭제////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_DELETE_SYN)
GUILDGUID m_GuildIndex;
GUILDMARKIDX m_BackGroundIndex;
GUILDMARKIDX m_PatternIndex;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_DELETE_ACK)
GUILDGUID m_GuildIndex;
GUILDMARKIDX m_BackGroundIndex;
GUILDMARKIDX m_PatternIndex;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_DELETE_BRD)
DWORD m_dwPlayerKey;
GUILDGUID m_GuildIndex;
GUILDMARKIDX m_BackGroundIndex;
GUILDMARKIDX m_PatternIndex;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_DELETE_SECTOR_BRD)
DWORD m_dwPlayerKey;
GUILDGUID m_GuildIndex;
GUILDMARKIDX m_BackGroundIndex;
GUILDMARKIDX m_PatternIndex;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
////////////////길드 마크 실패 응답////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_REGISTER_NAK)
BYTE m_bErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_GUILDMARK_DELETE_NAK)
BYTE m_bErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
////////////////길드 창고 오픈////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_OPEN_SYN)
BYTE m_NPCCode;
GUILDGUID m_GuildIndex;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_OPEN_ACK)
enum { _MAX_BINARY_SIZE =
sizeof(RENDER_ITEMSTREAMEX) * (GUILDWAREHOUSE_TOTAL_INFO::MAX_SLOT_NUM),
};
WORD m_Size;
MONEY m_WarehouseMoney;
BYTE m_SlotTabNum;
BYTE m_BitStreamBuffer[_MAX_BINARY_SIZE];
int GetSize()
{
return ( sizeof(*this) - (sizeof(m_BitStreamBuffer)-m_Size) );
}
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_OPEN_NAK)
DWORD m_bErrorCode;
PACKET_CG_CLOSE;
////////////////길드 창고 닫기////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_CLOSE_SYN)
BYTE m_NPCCode;
GUILDGUID m_GuildIndex;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_CLOSE_ACK)
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_CLOSE_NAK)
DWORD m_bErrorCode;
PACKET_CG_CLOSE;
////////////////길드 창고 돈 입출금///////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_MONEY_SYN)
enum { PUTMONEY = 0, GETMONEY = 1, };
BYTE m_byType;
MONEY m_Money;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_MONEY_ACK)
MONEY m_InventoryMoney;
MONEY m_WarehouseMoney;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_MONEY_NAK)
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
////////////////길드 창고 슬롯 확장///////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_TAPEX_ACK)
BYTE m_SlotTabNum;
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_WAREHOUSE_TAPEX_NAK)
BYTE m_bErrorCode;
PACKET_CG_CLOSE;
//{__NA000000_20081106_GUILD_NAME_CHANGE
///////////////길드명 변경 ///////////////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_NAME_CHANGE_SYN)
SLOTIDX m_atIndex;
POSTYPE m_atPos;
TCHAR m_tszGuildName[MAX_GUILDNAME_LENGTH+1]; // 변경할 길드명
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_NAME_CHANGE_BRD)
TCHAR m_tszGuildName[MAX_GUILDNAME_LENGTH + 1]; // 변경된 길드명
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_NAME_CHANGE_SECTOR_BRD)
DWORD m_dwPlayerKey; // 변경 길드원
TCHAR m_tszGuildName[MAX_GUILDNAME_LENGTH+1];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_NAME_CHANGE_RELATION_BRD)
BYTE m_RelationType;
GUILDGUID m_GuildGuid; // 변경 길드
TCHAR m_tszGuildName[MAX_GUILDNAME_LENGTH + 1];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_NAME_CHANGE_NAK)
DWORD m_bErrorCode;
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_CLOSE;
//}__NA000000_20081106_GUILD_NAME_CHANGE
#ifdef _NA_003923_20120130_GUILD_RENEWAL
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_IN_GAME_GUILD_LOG_LIST_REQ)
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_IN_GAME_GUILD_LOG_LIST_ANS)
BYTE log_category_;//GuildInGameLogCategory
BYTE log_count_;
GuildInGameLogData log_data_[MAX_IN_GAME_GUILD_LOG];
WORD GetSize() const
{
const size_t min_size = sizeof(*this) - sizeof(log_data_);
return static_cast<WORD>(min_size + (sizeof(GuildInGameLogData) * log_count_));
}
PACKET_CG_CLOSE;
#endif
#ifdef _NA_004034_20120102_GUILD_INTRODUCTION
///////////////길드소개 ///////////////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_INTRODUCTION_SAVE_SYN)
GUILD_INTRODUCTIONS guild_introductions_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_INTRODUCTION_SAVE_ACK)
DWORD result_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_INTRODUCTION_CHANGE_BRD)
CHAR introduction_strings_[MAX_GUILD_INTRODUCTION_LENGTH+1];
PACKET_CG_FWD_CLOSE;
#endif
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
///////////////길드 가입 요청 ///////////////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_JOIN_REQUEST_SYN)
GUILDGUID guild_guid;
eGUILD_JOIN_REQUEST request_type;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_JOIN_REQUEST_ACK)
GUILDGUID guild_guid;
DWORD result_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_JOIN_REQUEST_BRD)
GUILD_JOIN_REQUEST_INFO request_info;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_JOIN_REQUEST_APPROVE_SYN)
CHARGUID char_guid;
TCHAR char_name[MAX_CHARNAME_LENGTH + 1];
BYTE char_class;
LEVELTYPE char_level;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_JOIN_REQUEST_REJECT_SYN)
CHARGUID char_guid;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_JOIN_REQUEST_REJECT_ACK)
void Init()
{
memset(&guild_name, 0, sizeof(guild_name));
}
TCHAR guild_name[MAX_GUILDNAME_LENGTH + 1];
GUILDGUID guild_guid;
DWORD result_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_JOIN_REQUEST_REJECT_BRD)
CHARGUID char_guid;
PACKET_CG_FWD_CLOSE;
///////////////길드 시설 ///////////////////////////
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_FACILITY_UPGRADE_SYN)
FCODE facility_code;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_FACILITY_UPGRADE_ACK)
FCODE facility_code;
DWORD result;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_FACILITY_UPGRADE_BRD)
GUILD_FACILITY_INFO facility_info;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_FACILITY_ACTIVE_SYN)
FCODE facility_code;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_FACILITY_ACTIVE_ACK)
FCODE facility_code;
DWORD result;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_FACILITY_TOTALINFO_ACK)
GUILD_FACILITY_TOTAL_INFO guild_facility_total_info;
PACKET_CG_FWD_CLOSE;
#endif //_NA_007330_20140620_GUILD_SYSTEM_EXTENSION
#ifdef _NA_008334_20150608_SONNENSCHEIN
PACKET_CG_FWD_OPEN(CG_GUILD, CG_GUILD_SONNENSCHEIN_UPDATE_CMD)
DWORD m_dwPlayerKey;
BYTE sonnenschein_phase;
uint16_t GetSize() const {return static_cast<uint16_t>(sizeof(*this));}
PACKET_CG_FWD_CLOSE;
#endif //_NA_008334_20150608_SONNENSCHEIN
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_EVENT 이벤트 인벤토리 관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_SELECT_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_SELECT_ACK )
EVENT_ITEM_TOTAL_INFO m_TotalInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_TotalInfo);
return static_cast<uint16_t>(kMinSize + m_TotalInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_SELECT_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_MOVE_ITEM_TO_INVEN_SYN )
POSTYPE m_ItemPos; //< 인벤토리로 옮기고자 하는 아이템의 이벤트 인벤토리 위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_MOVE_ITEM_TO_INVEN_ACK )
JUST_INVENTORY_TOTAL_INFO m_TotalInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_TotalInfo);
return static_cast<uint16_t>(kMinSize + m_TotalInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_MOVE_ITEM_TO_INVEN_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
// <Waverix><Working Packet>
// 이벤트 아이템 등록 상태 조회 요청
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_ITEM_STATUS_SYN )
PACKET_CG_FWD_CLOSE;
// <Waverix><Working Packet>
// 이벤트 아이템 등록 상태
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_ITEM_STATUS_ACK )
WORD m_wEventNum; // 이벤트 개수
EVENT_STATUS m_EventStatus[_MAX_EVENT_ROW_NUM]; //
int GetSize()
{
//ASSERT( m_wEventNum < _MAX_EVENT_ROW_NUM );
return (int)( ( sizeof(MSG_CG_EVENT_ITEM_STATUS_ACK) - sizeof(m_EventStatus) ) + sizeof(EVENT_STATUS)*m_wEventNum );
}
PACKET_CG_FWD_CLOSE;
// <Waverix><Working Packet>
// 등록 상태 조회 실패
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_ITEM_STATUS_NAK )
CODETYPE m_dwEventID;
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
// <Waverix><Working Packet>
// 이벤트 아이템 등록 요청
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_ITEM_REG_SYN )
DWORD m_dwEventID;
PACKET_CG_FWD_CLOSE;
// <Waverix><Working Packet>
// 이벤트 아이템 등록 성공(경품 응모)
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_ITEM_REG_ACK )
DWORD m_dwEventID;
PACKET_CG_FWD_CLOSE;
// <Waverix><Working Packet>
// 이벤트 아이템 등록 실패
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_ITEM_REG_NAK )
//enum // errorCode;
//{
// _ERR_DEFAULT,
// _ERR_INVALID_EVENT, // 이벤트 중이 아니다
// _ERR_ITEM_NUM_OVERFLOW, // 이벤트 아이템 등록 제한 개수를 넘었다
// _ERR_NOTEXISTITEM, // 이벤트에 응모할 아이템이 없다
// _ERR_CANT_OBTAIN, // 보상 아이템을 넣을 수가 없다
//};
CODETYPE m_dwEventID;
DWORD m_dwErrorCode;
INVENTORY_TOTAL_INFO m_TotalInfo; // 날아간 아이템 다시 보상
inline WORD GetSize()
{ return (WORD)( (sizeof(*this)-sizeof(INVENTORY_TOTAL_INFO)) + m_TotalInfo.GetSize() ); }
PACKET_CG_FWD_CLOSE;
// 이벤트 아이템 보상 받음(W->C) - 아이템 보상
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_ITEM_REWARD_CMD )
CODETYPE m_dwEventID;
MONEY m_Money;
INVENTORY_TOTAL_INFO m_TotalInfo;
inline WORD GetSize()
{ return (WORD)( (sizeof(*this)-sizeof(INVENTORY_TOTAL_INFO)) + m_TotalInfo.GetSize() ); }
PACKET_CG_FWD_CLOSE;
// 이벤트용 누적시간 전달 - 처음 캐릭터 선택할 때 전송
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_TIME_CMD )
int m_EventUseTime; // 이벤트 누적 시간
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_QUERY_EXIST_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_QUERY_EXIST_ACK )
enum eEXIST_RESULT {
EMPTY = PROTOCOL_GENERATOR_EVENT_081,
EXIST = PROTOCOL_GENERATOR_EVENT_096,
DISABLED = PROTOCOL_GENERATOR_EVENT_100,
// DISABLED - 현재 이벤트 인벤토리 서비스 플로를 위반한 경우
// 방식은 CG_EVENT_SELECT_SYN 과 동일하게 처리하면 된다.
};
BYTE m_bExist;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_TIME_PERIOD_SYN )
PACKET_CG_FWD_CLOSE; // 서버시간 요청
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_TIME_PERIOD_ACK )
time_t time;
explicit MSG_CG_EVENT_TIME_PERIOD_ACK(const time_t& t)
: time(t)
{
m_byCategory = CG_EVENT;
m_byProtocol = CG_EVENT_TIME_PERIOD_ACK;
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_TIME_PERIOD_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE; // 서버시간 요청 에러
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_REQUEST_ITEM_SYN )
CODETYPE m_EventID;
BYTE m_RequestItemIndex; // (0,2) <- EVENT_INFO::m_dwRewardIndex의 인덱스
inline VOID SetInfo( const CODETYPE eventID, const BYTE requestItemIndex )
{ m_EventID = eventID; m_RequestItemIndex = requestItemIndex; }
PACKET_CG_FWD_CLOSE;
struct MSG_CG_EVENT_REQUEST_ITEM_BADGEMAN_SYN : MSG_CG_EVENT_REQUEST_ITEM_SYN
{
enum eSELECT_TYPE { SOLO_BADGE = 0, COUPLE_BADGE, INVALID_INDEX }; //m_RequestItemIndex에 넣을 값
};
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_REQUEST_ITEM_NAK )
CODETYPE m_EventID;
DWORD m_ErrorCode;
inline VOID SetInfo( const CODETYPE eventID, DWORD errorCode ) { m_EventID=eventID; m_ErrorCode = errorCode; }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_DONATION_HEIM_SYN )
CODETYPE m_EventID;
MONEY m_DonatedHeims;
inline VOID SetInfo( const CODETYPE eventID, const MONEY donatedHeims )
{ m_EventID = eventID; m_DonatedHeims = donatedHeims; }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_DONATION_HEIM_ACK )
//enum eRESULT {
// ERR_DEFAULT = 0, // 기본 에러,
// ERR_INSUFFICIENT_HEIM , // 기부하려던 금액을 가지고 있지 못하다.
// ERR_DONATION_HEIM_LIMIT , // 최소 기부해야 할 금액에서 모자르다.
// ERR_CANT_OBTAIN_ITEM , // 보상 받을 수 있는데, 아이템을 획득하지 못하다.
// SUCCESS , // 일반 성공 (보상 조건 만족시 EVENT_REWARD_ITEM으로 전송됨)
//};
CODETYPE m_EventID;
BYTE m_ErrorCode;
MONEY m_TotalHeims; // 지금까지 누적된 액수
inline VOID SetInfo( const CODETYPE eventID, RC::eEVENT_RESULT errorCode ) { m_EventID=eventID; m_ErrorCode = (BYTE)errorCode; }
inline VOID SetTotalHeim( const MONEY totalHeim ) { m_TotalHeims = totalHeim; }
inline WORD GetSize()
{ return (RC::RC_EVENT_SUCCESS == m_ErrorCode) ? sizeof(*this) : sizeof(*this)-sizeof(m_TotalHeims); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_BUFF_EVENT_SYN )
// 특수 타입을 지원하기로 한다. 클라가 EventID를 선택하려면 클라에서 시간을 계산해서 요청해야 한다.
// 기존에는 안됐겠지만, 지금은 NPC ID가 존재하므로 NPC ID를 보내는 형태로 하자.
MONSTERCODE m_NpcCode;
inline VOID SetInfo( const MONSTERCODE npcCode ) { m_NpcCode = npcCode; }
inline WORD GetSize() { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_BUFF_EVENT_ACK )
// m_ResultCode = RC::eEVENT_RESULT
// - RC::RC_EVENT_SUCCESS (기존)-기존 상태 부여 패킷이 추가로 갈 수도 있다. 이건 좀더 따지자.
// - RC::RC_EVENT_FAILED (기존:기타 이유로 실패시)
// - RC::RC_EVENT_CANT_BUFF_GRANTED (신규:이미 부여되어 있을 경우)
// - RC::RC_EVENT_INVALID_EVENT (기존)
// - RC::RC_EVENT_UNQUALIFIED (신규:보상을 받을 수 없다. 자격이 안되서) + 추가 사유 기재 필요
// m_AddinInfo = eRET_UNQUALIFIED
enum eRET_UNQUALIFIED
{
RUC_EMPTY , // 자격 요건 제한에 걸리지 않음.
RUC_LEVEL_LOWERBOUND , // LEVEL 하한 조건
RUC_LEVEL_UPPERBOUND , // LEVEL 상한 조건
RUC_CLASS_MISMATCH , // 캐릭터 클래스 (RESERVED)
RUC_MORAL , // 캐릭터 성향 (RESERVED)
};
BYTE m_ResultCode;
union {
// EventID가 존재하는 결과
struct {
CODETYPE m_EventID; // 활성화된 EventID
BYTE m_AddinInfo; // RESERVED
} RESULT_SUCCESS;
struct {
} RESULT_FAIL; // 이벤트 중이 아니거나 서버 내부의 이유로 실패시
struct {
CODETYPE m_EventID; // 활성화된 EventID
} RESULT_CANT_BUFF_GRANTED;
struct {
CODETYPE m_EventID; // 활성화된 EventID
BYTE m_AddinInfo; // eRET_UNQUALIFIED 추가 사유 기재
} RESULT_UNQUALIFIED;
};
// 기초값 설정 : 추가 정보는 해당 코드에 맞게 설정할 것.
// m_ResultCode에 따라 입력하는 인자가 다르다.
inline VOID SetInfo_SUCCESS( const CODETYPE eventID, const BYTE reserved = 0 )
{ m_ResultCode = RC::RC_EVENT_SUCCESS; RESULT_SUCCESS.m_EventID = eventID; RESULT_SUCCESS.m_AddinInfo = reserved; }
inline VOID SetInfo_FAIL()
{ m_ResultCode = RC::RC_EVENT_FAILED; }
inline VOID SetInfo_INVALID()
{ m_ResultCode = RC::RC_EVENT_INVALID_EVENT; }
inline VOID SetInfo_CANT_BUFF_GRANTED( const CODETYPE eventID )
{ m_ResultCode = RC::RC_EVENT_CANT_BUFF_GRANTED; RESULT_CANT_BUFF_GRANTED.m_EventID = eventID; }
inline VOID SetInfo_UNQUALIFIED( const CODETYPE eventID, const eRET_UNQUALIFIED reason )
{ m_ResultCode = RC::RC_EVENT_UNQUALIFIED; RESULT_UNQUALIFIED.m_EventID = eventID; RESULT_UNQUALIFIED.m_AddinInfo = (BYTE)reason; }
inline WORD GetSize()
{
const WORD MIN_SIZE = sizeof(MSG_BASE_FORWARD)+sizeof(BYTE);
const WORD FAIL_SIZE = MIN_SIZE+sizeof(RESULT_FAIL);
switch( m_ResultCode )
{
case RC::RC_EVENT_SUCCESS: return MIN_SIZE+sizeof(RESULT_SUCCESS);
case RC::RC_EVENT_FAILED:
case RC::RC_EVENT_INVALID_EVENT: return FAIL_SIZE;
case RC::RC_EVENT_CANT_BUFF_GRANTED: return MIN_SIZE+sizeof(RESULT_CANT_BUFF_GRANTED);
case RC::RC_EVENT_UNQUALIFIED: return MIN_SIZE+sizeof(RESULT_UNQUALIFIED);
}
#ifdef _DEBUG
__debugbreak();
#endif
SetInfo_FAIL();
return FAIL_SIZE;
}
PACKET_CG_FWD_CLOSE;
// CG_EVENT_INVITATE~ protocols are used by _KR_0_20091021_FIRENDINVITATION_EXTEND
// 친구 초대 이벤트에 대한 보상 목록 요청
PACKET_CG_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_REWARD_LIST_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_REWARD_LIST_NAK )
enum {DB_FAIL = 1, DBPROXY_FAIL = 2};
BYTE byErrorCode; //1: DB 시스템 오류, 2: DB Proxy 서버 접속 불가
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_REWARD_LIST_ACK )
DURATYPE m_Count; //보상 아이템 목록 개수
InvitateFriendRewardInfo RewardInfo[MAX_FRIENDINVITATE_REWARD_NUM];
int GetSize()
{
return ( sizeof(MSG_CG_EVENT_INVITATEFRIEND_REWARD_LIST_ACK) - ((MAX_FRIENDINVITATE_REWARD_NUM - m_Count) * sizeof(InvitateFriendRewardInfo)) );
}
PACKET_CG_CLOSE;
// END 친구 초대 이벤트에 대한 보상 목록 요청
// 친구 초대 이벤트에 대한 보상 받기 요청
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_REWARD_SYN )
CHARGUID FriendGUID;//친구 GUID
BYTE ReWardType;//보상 타입
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_REWARD_ACK )
INVENTORY_TOTAL_INFO m_TotalInfo;
int GetSize()
{
return (sizeof(MSG_CG_EVENT_INVITATEFRIEND_REWARD_ACK) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_TotalInfo.m_InvenCount-m_TotalInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX));
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_REWARD_NAK )
enum {DB_FAIL = 1, DBPROXY_FAIL = 2, RECEV_REWARDED = 3, NOTOBTAIN_INVEN = 4};
BYTE m_byErrorCode;
/*
1: DB 시스템 오류
2: DB PROXY 서버 연결 불량
3: 이미 보상 받았음
4: 인벤에 넣을수 없음
*/
PACKET_CG_FWD_CLOSE;
// END 친구 초대 이벤트에 대한 보상 받기 요청
// 친구의 리콜 (C->A->D)
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_RECALL_SYN )
CHARGUID FriendGUID; //소환할 친구의 GUID
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_RECALL_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_RECALL_NAK )
enum {
SUCCEEDED = 0,
DB_FAIL, // EVENT START
DBPROXY_FAIL , // EVENT END
OTHER_CHNNEL,
RECALLTIME_SHORTAGE,
OTHERZONE_ME,
OTHERZONE_FRIEND,
TERMINATE_EVENT,
NOTFOUND_USER,
SENDFAIL,
FRIEND_REJECT,
OTHERREQUESTEXIST,
};
BYTE m_byErrorCode; //에러코드
DWORD64 m_LeftTime; //에러코드가 RECALLTIME_SHORTAGE 경우 소환하기까지 남은 시간 YYYYMMDDHHmmSS 한시간 남았다면 10000
/*
1: DB 시스템 오류
2: DB PROXY 서버 연결 불량
3: 다른 채널에 있음
4: 소환 잔여시간 부족
5: 소환이 불가능한 위치에 있음(내가)
6: 소환이 불가능한 위치에 있음(소환하려는 애가)
7: 이벤트 종료 되었음
8: 소환할 유저 찾을수 없음
9: 친구에게 전송 실패
10: 친구가 거절
*/
PACKET_CG_FWD_CLOSE;
// 친구의 리콜에 응할것인지 파악한다.
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_RECALL_QUESTION_SYN )
CHARGUID FriendGUID; //소환 요청한 캐릭 GUID
TCHAR FriendName[MAX_CHARNAME_LENGTH+1]; //소환 요청한 캐릭 이름
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_RECALL_QUESTION_ACK )
CHARGUID FriendGUID; //소환 요청한 캐릭 GUID
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_INVITATEFRIEND_RECALL_QUESTION_NAK )
CHARGUID FriendGUID; //소환 요청한 캐릭 GUID
PACKET_CG_FWD_CLOSE;
//
#ifdef _NA_20100420_CHANGE_SYSTEM_MEMO_LOGIC
//지역 점령전 경매 입찰 아이템을 유저에게 보상
PACKET_CG_FWD_OPEN(CG_EVENT, CG_EVENT_DOMINATION_REWARD_CMD)
MEMOGUID memo_guid_;// 메모Guid
TCHAR memo_subject_[MAX_MEMO_LENGTH + 1];//쪽지 제목 내용
PACKET_CG_FWD_CLOSE;
//하임 로또 당첨금을 유저에게 보상
PACKET_CG_FWD_OPEN(CG_EVENT, CG_EVENT_LOTTO_REWARD_CMD)
MEMOGUID memo_guid_;// 메모Guid
INT64 lotto_entry_index_;//로또 인덱스
PACKET_CG_FWD_CLOSE;
//해당 메모에 대한 보상 결과 값을 유저에게 알려준다.
PACKET_CG_FWD_OPEN(CG_EVENT, CG_EVENT_ITEM_REWARD_RESULT_CMD)
MEMOGUID memo_guid_;//메모Guid
bool result_value_;//보상 결과값 true / false
PACKET_CG_FWD_CLOSE;
#endif//_NA_20100420_CHANGE_SYSTEM_MEMO_LOGIC
//_NA_20100812_INTEGRATE_SYSTEM_MEMO_DOMINATION
PACKET_CG_FWD_OPEN(CG_EVENT, CG_EVENT_SYSTEMMEMO_ITEM_REWARD_REQ)
MEMOGUID memo_guid_;
TCHAR memo_contents_[MAX_MEMO_LENGTH + 1];//게임 로그를 위한 자료로 사용
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_EVENT, CG_EVENT_SYSTEMMEMO_ITEM_REWARD_ANS)
MEMOGUID memo_guid_;
RC::eITEM_RESULT result_value_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_ETC, CG_ETC_BUFF_EVENT_TIME_CONTROL_BRD )
CODETYPE m_EventID;
enum eTIME_CONTROL {
TC_START , // EVENT START
TC_END , // EVENT END
};
BYTE m_TimeControl;
inline VOID SetInfo( const CODETYPE eventID, const eTIME_CONTROL timeCtrl )
{ m_EventID = eventID; m_TimeControl = (BYTE)timeCtrl; }
PACKET_CG_FWD_CLOSE;
//_NA_007919_20141211_ADD_GMCOMMAND_EVENT
PACKET_CG_FWD_OPEN( CG_EVENT, CG_EVENT_PEAKTIME_NOTIFY_BRD)
ePEAKTIME_EVENT_NOTIFY notify_type;
//시작
BYTE start_day; // 시작일 (day)
DWORD start_time; // 시작시간 (hhmm)
//종료
BYTE end_day; // 종료일 (day)
DWORD end_time; // 종료날짜 (hhmm)
float exp_ratio; // 경험치비율 (100%증가 -> 1)
MSG_CG_EVENT_PEAKTIME_NOTIFY_BRD(ePEAKTIME_EVENT_NOTIFY n_type, BYTE s_day, BYTE s_time, BYTE e_day, BYTE e_time, WORD ratio)
: notify_type(n_type), start_day(s_day), start_time(s_time), end_day(e_day), end_time(e_time), exp_ratio(ratio) {}
PACKET_CG_FWD_CLOSE;
//_NA_007919_20141211_ADD_GMCOMMAND_EVENT
PACKET_CG_FWD_OPEN(CG_EVENT, CG_GMEVENT_PEAKTIME_EVENTLIST_CMD)
static const int event_data_max_count = 10;
struct PeakTimeEventData
{
__time64_t start_date;
__time64_t end_date;
FLOAT exp_ratio;
};
PeakTimeEventData event_data[event_data_max_count];
int data_count;
PACKET_CG_FWD_CLOSE;
//_NA_007919_20141211_ADD_GMCOMMAND_EVENT
//처음 들어온 플레이어에게 진행중인 이벤트의 경험치정보를 전달해준다
PACKET_CG_FWD_OPEN(CG_EVENT, CG_GMEVENT_PEAKTIME_PROGRESS_EVENTINFO_CMD)
FLOAT exp_ratio;
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_QUEST 퀘스트 관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_STREAM_CMD )
int GetSize() { return sizeof(*this); }
//QUEST_COMPL_TOTAL_INFO의 GetSize()만큼
//QUEST_PROGR_TOTAL_INFO의 GetSize()만큼
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_ACCEPT_SYN )
WORD m_QuestCode;
//{__NA_0_QUEST_ACCEPT_ITEM_IMPROVEMENT
BYTE m_byIsItemAccept; // NPC 수락 : 0 , 아이템 수락 : 1
POSTYPE m_QuestItemPos;
//}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_ACCEPT_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_ACCEPT_NAK )
BYTE m_byErrorCode;
//{__NA_0_QUEST_ACCEPT_ITEM_IMPROVEMENT
BYTE m_byIsItemResult; // Quest result : 0 , ItemResult : 1
//}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_ACCEPT_CMD )
WORD m_QuestCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_COMPLETE_SYN )
WORD m_QuestCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_COMPLETE_ACK )
WORD m_QuestCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_COMPLETE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_INCOMPLETE_SYN )
WORD m_QuestCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_INCOMPLETE_ACK )
WORD m_QuestCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_INCOMPLETE_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_CHANGEofCLASS_CMD )
PROPERTY<BYTE> m_ChangeOfClassCode; // eCHAREX_TYPE
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_REWARD_SYN )
WORD m_QuestCode;
enum
{
ITEM1_SELECTED = (1<<0),
ITEM2_SELECTED = (1<<1),
ITEM3_SELECTED = (1<<2),
ITEM4_SELECTED = (1<<3),
ITEM5_SELECTED = (1<<4), //_NA_0_20101130_REWARD_ITEM_COUNT_INCREASE
};
BYTE m_SelectedItem; //< 선택한 아이템들
PACKET_CG_FWD_CLOSE;
// 강제 보상 (GM)
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_REWARD_CMD )
EXPTYPE m_i64Exp; // 최종 경험치
MONEY m_Money;
SLOTCODE m_SkillCode;
BYTE m_byFatigueType; //피로도 타입.
WORD m_wQuestCode;
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
WORD m_wAccumulatePoint;
#endif
int GetSize() { return sizeof(*this); }
PACKET_CG_FWD_CLOSE;
// 보상처리는 미션의 보상스크립트로 처리할 가능성이 많다
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_REWARD_ACK )
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
int m_BunusExpRatio; //추가 경험치 비율
#endif //_NA_007330_20140620_GUILD_SYSTEM_EXTENSION
EXPTYPE m_i64Exp; // 최종 경험치
MONEY m_Money;
SLOTCODE m_SkillCode;
BYTE m_byFatigueType; //피로도 타입.
WORD m_wQuestCode;
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
WORD m_wAccumulatePoint;
#endif
INVENTORY_TOTAL_INFO m_ItemInfo;
int GetSize()
{
return ( sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM - m_ItemInfo.m_InvenCount - m_ItemInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_REWARD_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_FAILED_SYN )
WORD m_QuestCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_FAILED_ACK )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_FAILED_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_ABANDON_SYN )
WORD m_QuestCode;
BYTE m_Force; //1: 강제 포기[타임퀘스트 시간 완료], 0: 유저포기
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_ABANDON_ACK )
BYTE m_Force;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_ABANDON_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_MONSTER_KILL_CMD )
WORD m_QuestCode;
WORD m_MonsterCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_MONSTER_KILL_GRADE_CMD )
WORD m_QuestCode;
BYTE m_MonsterGrade;
WORD m_MonsterLevel;
PACKET_CG_FWD_CLOSE;
//{__NA001277_090205_NAVI_SYSTEM_SUPPORT__
PACKET_CG_FWD_OPEN(CG_QUEST, CG_QUEST_OBJECT_NAVI_POS_CMD)
enum eOption {
OPTION_NULL = 0,
OPERATION_ALL_INFO = 1 << 0, // 전체 정보 보낼 경우 (EnterZone)
OPERATION_ADD_INFO = 1 << 1, // 퀘스트 수락시와 같은 기존 정보 + a
CODETYPE_NPC = 1 << 4, //
// 1 << 7이 Max
MAX_OBJECT_ARRAY_SIZE = 100,
};
struct Node {
WORD questCode; // QCODE
WORD npcCode;
short posX; // 소수점 이하 제거 수치
short posY; // 소수점 이하 제거 수치
};
BYTE m_CodeType; // eOption
BYTE m_NumberOfNodes;
Node m_Nodes[MAX_OBJECT_ARRAY_SIZE];
inline WORD GetSize() const
{
const WORD MinSize = WORD(sizeof(*this) - sizeof(m_Nodes));
return MinSize + WORD(sizeof(Node)) * m_NumberOfNodes;
}
PACKET_CG_FWD_CLOSE;
//}
PACKET_CG_FWD_OPEN(CG_QUEST, CG_QUEST_ITEM_OBTAIN_CMD)
WORD m_QuestCode;
JUST_INVENTORY_TOTAL_INFO m_TotalInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_TotalInfo);
return static_cast<uint16_t>(kMinSize + m_TotalInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_QUEST, CG_QUEST_ITEM_DELETE_CMD)
WORD m_QuestCode;
INVEN_DELETE_TOTAL_INFO m_TotalInfo;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_TotalInfo);
return static_cast<uint16_t>(kMinSize + m_TotalInfo.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_EVENT_AREA_SYN )
WORD m_QuestCode;
DWORD m_AreaID;
WzVector m_wvCurPos; // 클라이언트가 주는 플레이어의 현재 좌표 (검증용)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_EVENT_AREA_ACK )
DWORD m_AreaID;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_EVENT_AREA_NAK )
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
#ifdef _NA_003027_20111013_HONOR_SYSTEM
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_DAILYQUEST_PACKET )
BYTE packet_type;
PACKET_CG_FWD_CLOSE;
#endif //_NA_003027_20111013_HONOR_SYSTEM
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
PACKET_CG_FWD_OPEN( CG_QUEST, CG_QUEST_MISSION_CLEAR_CMD )
WORD quest_code;
MAPCODE map_code;
PACKET_CG_FWD_CLOSE;
#endif //_NA_006607_20130402_ADD_QUESTTYPE
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_MISSION 미션 관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_STREAM_CMD)
MISSION_TOTAL_INFO m_TotalInfo;
int GetSize()
{
return (sizeof(MSG_BASE_FORWARD)+m_TotalInfo.GetSize());
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RECORD_ELAPSEDTIME_CMD)
DWORD m_MissionElapsedTimePerSecond; //< 미션 경과된 시간(초단위)
DWORD m_MissionBestClearTimePerSecond; //< 현재주 미션 최고 기록
PACKET_CG_FWD_CLOSE;
//// this packet will be deprecated!!!!!!!
//PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RECORD_CLEARTIME_CMD)
// DWORD m_MissionClearTime; //< 미션 클리어한 시간(초단위)
//PACKET_CG_FWD_CLOSE;
#ifdef _NA_008012_20150130_RANKING_SYSTEM
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_INFO_SYN)
BYTE m_Type; //< eRANKING_TYPE 참조
#ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM
RANKINGID m_RankingID;
#else
RANKINGNO m_MissionNo;
#endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM
BYTE m_Page; //< page : 0 ~ 4 ( 총 10개씩 5페이지 )
PACKET_CG_FWD_CLOSE;
// 가변 패킷
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_INFO_ACK)
#ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM
WORD myranking;
#else
DWORD m_SettledDate; //< 20050923
#endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM
enum { MAX_BUFFER_SIZE = 4096, };
WORD m_Size;
BYTE m_pBUFFER[MAX_BUFFER_SIZE];
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(m_pBUFFER);
return static_cast<uint16_t>(kMinSize + m_Size);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_INFO_NAK)
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_MEMBER_INFO_SYN)
BYTE m_Type; //< eRANKING_TYPE 참조
RANKINGNO m_MissionNo;
RANKINGKEY m_Key;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_MEMBER_INFO_ACK)
enum { MAX_BUFFER_SIZE = 4096, };
WORD m_Size;
BYTE m_pBUFFER[MAX_BUFFER_SIZE];
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(m_pBUFFER);
return static_cast<uint16_t>(kMinSize + m_Size);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_MEMBER_INFO_NAK)
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_TIMER_CHANGED_BRD)
// DWORD m_MissionElapsedTimePerSecond; //< 타이머가 변경되고 난뒤의 현재 경과된 시간(초단위)
WORD m_TotalMonsterKillNum; //< 누적된 몬스터 킬수
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_CLEAR_RECORD_CMD)
DWORD m_MonsterKillNum_General;
DWORD m_MonsterKillNum_Leader;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_SUCCESS_BRD)
RANKINGKEY m_Key; //< 파티키 and 랭킹키
DWORD m_ClearTime;
WORD m_Ranking; //< 랭킹
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_FAILED_BRD)
DWORD m_ClearTime;
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_REWARD_SYN)
#ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM
RANKINGID ranking_id;
#else
RANKINGNO m_MissionNo;
#endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM
RANKINGKEY m_Key; //< 보상받기를 원하는 지난주랭킹의 키(일련번호)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_REWARD_ACK)
#ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM
RANKINGID ranking_id;
BYTE reward_ranking;
MONEY rewarded_money;
WORD hime_bonus_ratio;
#endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM
INVENTORY_TOTAL_INFO m_ItemInfo;
int GetSize()
{
return ( sizeof(*this)-
(INVENTORY_TOTAL_INFO::MAX_SLOT_NUM-m_ItemInfo.m_InvenCount-m_ItemInfo.m_TmpInvenCount)
*sizeof(INVENTORY_TOTAL_INFO::SLOT_TYPE) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_REWARD_NAK)
DWORD m_dwErrorCode;
PACKET_CG_FWD_CLOSE;
#ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM
//랭킹 결산일 패킷
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_SETTLEDDATE_INFO_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_SETTLEDDATE_INFO_ACK)
//미션랭킹 항목이 늘어나면 수치를 바꿔주도록 한다.
//MAX_REWARDABLE_MISSION_LIST_SIZE는 랭킹미션리스트의 3배로 한다
enum { MAX_MISSION_RANKING_LIST_NUMBER = 8,
MAX_REWARDABLE_MISSION_LIST_SIZE = 24, };
REWARDABLE_MISSION_LIST reward_mission_list[MAX_REWARDABLE_MISSION_LIST_SIZE];
DWORD settled_date; //< 20050923
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_RANKING_SETTLEDDATE_INFO_NAK)
DWORD error_code;
PACKET_CG_FWD_CLOSE;
#endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM
//------------------------------------------------
// 랭킹 관련
//------------------------------------------------
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_GET_MISSION_POINT_BRD)
DWORD m_dwPoint;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_MISSION, CG_MISSION_POINT_CANNOT_REGISTER_BRD)
PACKET_CG_FWD_CLOSE;
#endif // _NA_008012_20150130_RANKING_SYSTEM
//----------------------------------------------------------------------------
// <TUTORIAL MISSION 관련>
PACKET_CG_OPEN( CG_MISSION, CG_MISSION_SET_CLEAR_COUNT_CMD )
MAPCODE m_MapCode;
WORD m_ClearCount;
PACKET_CG_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_AREACONQUEST AC 관련 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN(CG_AREACONQUEST,CG_AREACONQUEST_STREAM_CMD)
//C_NA_0_20100520_ACSYSTEM_CHANGED
Character_Achievements achievement_info_;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(achievement_info_);
return static_cast<uint16_t>(kMinSize + achievement_info_.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_AREACONQUEST,CG_AREACONQUEST_VALUE_CHANGE_CMD)
//C_NA_0_20100520_ACSYSTEM_CHANGED
WORD index_number_;
WORD location_code;
BYTE object_index_;
WORD object_value_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_AREACONQUEST,CG_AREACONQUEST_REWARD_SYN)
//C_NA_0_20100520_ACSYSTEM_CHANGED
WORD index_number_;
WORD location_code_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_AREACONQUEST,CG_AREACONQUEST_REWARD_ACK)
//C_NA_0_20100520_ACSYSTEM_CHANGED
WORD index_; //업적 인덱스
WORD m_accomplishment_ratio; //추가된 달성률
WORD location_code_;
EXPTYPE m_i64Exp; // 최종 경험치
MONEY m_Money;
SLOTCODE m_SkillCode;
#ifdef _NA_003027_20111013_HONOR_SYSTEM
WORD honor_title;
#endif //_NA_003027_20111013_HONOR_SYSTEM
INVENTORY_TOTAL_INFO m_ItemInfo;
int GetSize()
{
return ( sizeof(*this) - (INVENTORY_TOTAL_INFO::MAX_SLOT_NUM - m_ItemInfo.m_InvenCount - m_ItemInfo.m_TmpInvenCount)*sizeof(ITEMSLOTEX) );
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_AREACONQUEST,CG_AREACONQUEST_REWARD_NAK)
BYTE m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_AREACONQUEST AC 관련 패킷 끝
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_WAYPOINT_INFO_LOAD_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_WAYPOINT_INFO_LOAD_ACK)
WAYPOINT_TOTAL_INFO m_Info;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_Info);
return static_cast<uint16_t>(kMinSize + m_Info.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_WAYPOINT_INFO_LOAD_NAK)
DWORD m_dwErrorCode; //< ResultCode.h의 eWP_RESULT 참조
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_WAYPOINT_INFO_SAVE_SYN)
//현재 맵 번호를 웨이 포인트에 저장한다.
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_WAYPOINT_INFO_SAVE_ACK)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_WAYPOINT_INFO_SAVE_NAK)
DWORD m_dwErrorCode; //< ResultCode.h의 eWP_RESULT 참조
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 개인 웨이 포인트
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_CHAR_WAYPOINT_INFO_LOAD_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_CHAR_WAYPOINT_INFO_LOAD_ACK)
CHAR_WAYPOINT_TOTAL_INFO m_Info;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_Info);
return static_cast<uint16_t>(kMinSize + m_Info.GetSize());
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_CHAR_WAYPOINT_INFO_SAVE_SYN)
//현재 맵 번호, 좌표를 웨이 포인트에 저장한다.
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_CHAR_WAYPOINT_INFO_SAVE_ACK)
//저장된 index, 맵 번호, 좌표를 전송한다.
WAYPOINTSLOT m_Info;
int GetSize()
{
return sizeof(MSG_BASE_FORWARD) + sizeof(WAYPOINTSLOT);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_CHAR_WAYPOINT_INFO_DEL_SYN)
//삭제할 index
DWORD m_IdxWayPoint;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_CHAR_WAYPOINT_INFO_DEL_ACK)
//삭제된 index
DWORD m_IdxWayPoint;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_CHAR_WAYPOINT_INFO_EXE_CMD)
//실행할 index
DWORD m_IdxWayPoint;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_WAYPOINT,CG_CHAR_WAYPOINT_INFO_NAK)
DWORD m_dwErrorCode; //< ResultCode.h의 eWP_RESULT 참조
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 카오 시스템
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_CHAO, CG_CHAO_CHANGE_BORADORI_STATE_BRD )
DWORD m_dwObjKey;
bool m_bBoradori; // 보라돌이 상태 적용/해제
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_CHAO, CG_CHAO_CHANGE_CHAO_STATE_BRD )
DWORD m_dwObjKey;
BYTE m_byChaoState; // 카오상태(eCHAO_STATE)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_CHAO, CG_CHAO_ASK_REVENGE_ADDITION_CMD )
char m_ptszRevengeName[MAX_CHARNAME_LENGTH+1]; // 리벤지 리스트에 추가할 대상 Name
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_CHAO, CG_CHAO_ADD_REVENGE_CHAR_SYN )
char m_ptszRevengeName[MAX_CHARNAME_LENGTH+1]; // 리벤지 리스트에 추가할 대상 Name
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_CHAO, CG_CHAO_ADD_REVENGE_CHAR_ACK )
char m_ptszRevengeName[MAX_CHARNAME_LENGTH+1]; // 리벤지 리스트에 추가된 대상 이름(상세정보는 World에서 넘겨준다)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_CHAO, CG_CHAO_ADD_REVENGE_CHAR_NAK )
BYTE m_byErrorCode; // RC:eREVENGE_RESULT
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_CHAO, CG_CHAO_NOTIFIY_CHAO_TIME_CMD )
DWORD m_dwLeavedTime;
PACKET_CG_FWD_CLOSE;
// 리벤지 대상으로 워프(추적)
PACKET_CG_FWD_OPEN( CG_CHAO, CG_CHAO_TRACK_REVENGE_CHAR_SYN )
char m_ptszRevengeName[MAX_CHARNAME_LENGTH+1];
POSTYPE m_atItemPos; // 복수의 돌 슬롯위치
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_CHAO, CG_CHAO_TRACK_REVENGE_CHAR_NAK )
BYTE m_byErrorCode; // RC:eREVENGE_RESULT
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 샵 패킷
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
// programcommon\resultcode.h
// 캐시샵 버젼 요청
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_VERSION_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_VERSION_ACK)
SalesZoneScriptVersion sales_version_;
BannerZoneScriptVersion banner_version_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_VERSION_NAK)
int error_code_; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
// 캐시 요청
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_CASH_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_CASH_ACK)
CashInfo cash_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_CASH_NAK)
int error_code_; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
// 캐시샵 오픈
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_OPEN_SYN)
SalesZoneScriptVersion sales_version_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_OPEN_ACK)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_OPEN_NAK)
int error_code_; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
// 캐시샵 종료
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_CLOSE_NTF)
int error_code_;
PACKET_CG_FWD_CLOSE;
// 아이템 보관함 요청
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_BUY_STORAGE_LIST_SYN)
int page_;
int item_count_per_page_; // MAX_STORAGE_ITEM_PER_PAGE 이하.
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_BUY_STORAGE_LIST_ACK)
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(item_info_);
return static_cast<uint16_t>(kMinSize + sizeof(item_info_[0]) * item_count_);
}
int page_; // 현재 페이지
int total_page_; // 전체 페이지 수
int total_item_count_; // 전체 상품 수
int item_count_; // 현재 페이지 상품 수
StorageItemInfoBuy item_info_[BUY_STORAGE_ITEM_PER_PAGE];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_BUY_STORAGE_LIST_NAK)
int error_code_;
PACKET_CG_FWD_CLOSE;
// 선물 보관함 요청
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_GIFT_STORAGE_LIST_SYN)
int page_;
int item_count_per_page_; // MAX_STORAGE_ITEM_PER_PAGE 이하.
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_GIFT_STORAGE_LIST_ACK)
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(item_info_);
return static_cast<uint16_t>(kMinSize + sizeof(item_info_[0]) * item_count_);
}
int page_;
int total_page_;
int total_item_count_;
int item_count_;
StorageItemInfoGift item_info_[GIFT_STORAGE_ITEM_PER_PAGE];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_GIFT_STORAGE_LIST_NAK)
int error_code_;
PACKET_CG_FWD_CLOSE;
// 구매하기
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_BUY_ITEM_SYN)
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(item_info_);
return static_cast<uint16_t>(kMinSize + sizeof(item_info_[0]) * item_count_);
}
uint item_count_;
ShopItemInfo item_info_[SHOP_MAX_ITEM_BUY_COUNT];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_BUY_ITEM_ACK)
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(item_info_);
return static_cast<uint16_t>(kMinSize + sizeof(item_info_[0]) * item_count_);
}
uint item_count_;
ShopItemInfoEx item_info_[SHOP_MAX_ITEM_BUY_COUNT];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_BUY_ITEM_NAK)
int error_code_;
PACKET_CG_FWD_CLOSE;
// 선물하기
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_SEND_GIFT_SYN)
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(item_info_);
return static_cast<uint16_t>(kMinSize + sizeof(item_info_[0]) * item_count_);
}
char recv_character_name_[MAX_CHARNAME_LENGTH+1];
char gift_message_[GIFT_MESSAGE_LENGTH];
uint item_count_;
ShopItemInfo item_info_[SHOP_MAX_ITEM_GIFT_COUNT];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_SEND_GIFT_ACK)
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(item_info_);
return static_cast<uint16_t>(kMinSize + sizeof(item_info_[0]) * item_count_);
}
char recv_character_name_[MAX_CHARNAME_LENGTH+1];
uint item_count_;
ShopItemInfoEx item_info_[SHOP_MAX_ITEM_GIFT_COUNT];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_SEND_GIFT_NAK)
int error_code_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_SEND_GIFT_NTF)
PACKET_CG_FWD_CLOSE;
// 보관함의 아이템 사용
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_USE_STORAGE_ITEM_SYN)
UseStorageItem use_item_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_USE_STORAGE_ITEM_ACK)
UseStorageItem use_item_;
INVENTORY_TOTAL_INFO inventory_info_;
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(inventory_info_);
return static_cast<uint16_t>(kMinSize + inventory_info_.GetSize());
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_USE_STORAGE_ITEM_NAK)
int error_code_;
PACKET_CG_FWD_CLOSE;
// 캐릭터 이름 체크
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_CHAR_NAME_CHECK_SYN)
char character_name_[MAX_CHARNAME_LENGTH + 1];
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_CHAR_NAME_CHECK_ACK)
char character_name_[MAX_CHARNAME_LENGTH + 1];
char guild_name_[MAX_GUILDNAME_LENGTH + 1];
int character_level_;
int character_class_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_CHAR_NAME_CHECK_NAK)
int error_code_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_EXIST_GIFT_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_EXIST_GIFT_ACK)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_EXIST_GIFT_NAK)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_EXIST_GIFT_NTF)
PACKET_CG_FWD_CLOSE;
#else //_NA_0_20110613_GAME_SHOP_RENEWAL
// 샵 UI를 처음 오픈했을 때
// 카테고리 혹은 페이지가 달라졌을 때
#ifdef _NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_LIST_REQ_SYN)
uchar partition_index; //< 파티션
uchar category_index; //< 카테고리 번호
uchar request_page; //< 요청 페이지 번호 (0번 부터 시작)
ushort item_filter; //< 필터
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_LIST_REQ_ACK)
enum { MAX_BUFFER_SIZE = 4096, MAX_GUID = 10, };
uchar partition_index; //< 파티션
uchar category_index; //< 카테고리 번호
ushort item_filter; //< 필터
uchar answer_page; //< 응답 페이지 번호 (0번 부터 시작, 요청된 페이지 번호가 전체 페이지수를 넘어설경우 마지막 페이지 번호로 바뀐다.)
uchar page_count; //< 요청한 아이템의 전체 페이지 수
ushort buffer_size; //< 버퍼 사이즈
ushort guid_count;
uint shopitem_guid[MAX_GUID];
uchar buffer[MAX_BUFFER_SIZE]; //< 버퍼
int GetSize() { return sizeof(*this)-(MAX_BUFFER_SIZE-buffer_size); }
PACKET_CG_FWD_CLOSE;
#else //_NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_LIST_REQ_SYN)
BYTE m_byCategoryIndex; //< 카테코리 번호
BYTE m_byPage; //< 페이지 번호
BYTE m_byCategorySeperate; //< eSHOP_CATEGORY_SEPERATE
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_LIST_REQ_ACK)
BYTE m_TotalPageNum;
enum { MAX_BUFFER_SIZE = 4096, };
WORD m_Size;
BYTE m_pBUFFER[MAX_BUFFER_SIZE];
int GetSize() { return sizeof(*this)-(MAX_BUFFER_SIZE-m_Size); }
PACKET_CG_FWD_CLOSE;
#endif //_NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_LIST_REQ_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
// 샵 UI를 처음 오픈했을 때
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_CASH_REQ_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_CASH_REQ_ACK)
CashData cash_info_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_CASH_REQ_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
// 아이템 구매를 할때
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_BUY_SYN)
enum { _MAX_BUY_LIST_NUM = 32, };
BYTE m_Count;
SLOTIDX m_SlotIndex;
POSTYPE m_SlotPos; // 기간연장 아이템 구입일 경우 연장할 아이템의 인벤토리 슬롯Pos
enum { PURCHASE_DEFAULT = 0, PURCHASE_PPCASH };
BYTE m_PurchaseType; // ~_PPCARD = { pp card }, ~_DEFAULT = { cash, mileage, heim, etc... }
INT m_PriceGuid[_MAX_BUY_LIST_NUM];
int GetSize() const
{
#if 1 //replace calculation
const size_t ZeroCountSize = sizeof(*this) - sizeof(m_PriceGuid);
assert(_MAX_BUY_LIST_NUM >= m_Count);
return static_cast<int>(ZeroCountSize + sizeof(m_PriceGuid[0]) * m_Count);
#else
return (sizeof(*this)-(_MAX_BUY_LIST_NUM-m_Count)*sizeof(INT));
#endif
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_BUY_ACK)
MONEY m_UserMoney;
CashData m_CashData;
INT m_ExtendItemCode; // 기간연장 아이템에 대한 아이템코드
JUST_INVENTORY_TOTAL_INFO m_TotalInfo;
int GetSize() const
{
const size_t NoStreamSize = sizeof(*this) - sizeof(m_TotalInfo);
return static_cast<WORD>(NoStreamSize + m_TotalInfo.GetSize());
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_BUY_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
DWORD m_PriceGuid; //< m_PriceGuid = 0 이면 모든 상품 실패
PACKET_CG_FWD_CLOSE;
// 아이템 구매이력 탭을 처음으로 볼때
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_BUY_HISTORY_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_BUY_HISTORY_ACK)
enum { MAX_BUFFER_SIZE = 4096, };
WORD m_Size;
BYTE m_pBUFFER[MAX_BUFFER_SIZE];
int GetSize() { return sizeof(*this)-(MAX_BUFFER_SIZE-m_Size); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_BUY_HISTORY_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_REQ_SYN)
INT m_ItemGuid;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_REQ_ACK)
// ShopItem의 Seriailize()
enum { MAX_BUFFER_SIZE = 4096, };
WORD m_Size;
BYTE m_pBUFFER[MAX_BUFFER_SIZE];
int GetSize() { return sizeof(*this)-(MAX_BUFFER_SIZE-m_Size); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ITEM_REQ_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
//// 아이템 구매를 할때
//PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_PACKAGE_BUY_SYN)
// enum { _MAX_BUY_LIST_NUM = 32, };
// BYTE m_Count;
// INT m_PriceGuid[_MAX_BUY_LIST_NUM];
// int GetSize()
// {
// return (sizeof(*this)-(_MAX_BUY_LIST_NUM-m_Count)*sizeof(INT));
// }
//PACKET_CG_FWD_CLOSE;
//
//PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_PACKAGE_BUY_ACK)
// MONEY m_UserMoney;
// CASH m_UserCash;
// JUST_INVENTORY_TOTAL_INFO m_TotalInfo;
// int GetSize()
// {
// return sizeof(MSG_BASE_FORWARD)+
// sizeof(m_UserMoney)+
// sizeof(m_UserCash)+
// m_TotalInfo.GetSize();
// }
//PACKET_CG_FWD_CLOSE;
//
//PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_PACKAGE_BUY_NAK)
// BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
// DWORD m_PriceGuid; //< m_PriceGuid = 0 이면 모든 상품 실패
//PACKET_CG_FWD_CLOSE;
//
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_CHECK_CHAR_NAME_SYN)
char m_tszCharName[MAX_CHARNAME_LENGTH+1]; //< 캐릭터 이름 체크
WORD GetSize()
{
return (WORD)(sizeof(*this) - ((MAX_CHARNAME_LENGTH+1)-(int)strlen(m_tszCharName))) ;
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_CHECK_CHAR_NAME_ACK)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_CHECK_CHAR_NAME_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_SEND_GIFT_SYN)
enum { SINGLEITEM=1, PACKAGEITEM=2,};
enum { MAX_GIFT_MESSAGE_LEN = 512, };
BYTE m_ItemType; //< enum { SINGLEITEM=1, PACKAGEITEM=2,};
INT m_PriceGuid; //< 판매 가격 고유 번호
enum {
PURCHASE_DEFAULT = MSG_CG_SHOP_ITEM_BUY_SYN::PURCHASE_DEFAULT,
PURCHASE_PPCASH = MSG_CG_SHOP_ITEM_BUY_SYN::PURCHASE_PPCASH
};
BYTE m_PurchaseType; // ~_PPCARD = { pp card }, ~_DEFAULT = { cash, mileage, heim, etc... }
char m_tszCharName[MAX_CHARNAME_LENGTH+1]; //< 캐릭터 이름 체크
char m_tszGiftMessage[MAX_GIFT_MESSAGE_LEN]; //< 선물 메세지
PACKET_CG_FWD_CLOSE;
#ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__
PACKET_CG_FWD_OPEN(CG_SHOP, CG_SHOP_SEND_GIFT_RELAY_SYN)
enum {
SINGLEITEM = MSG_CG_SHOP_SEND_GIFT_SYN::SINGLEITEM,
PACKAGEITEM = MSG_CG_SHOP_SEND_GIFT_SYN::PACKAGEITEM,
MAX_GIFT_MESSAGE_LEN = MSG_CG_SHOP_SEND_GIFT_SYN::MAX_GIFT_MESSAGE_LEN,
PURCHASE_DEFAULT = MSG_CG_SHOP_SEND_GIFT_SYN::PURCHASE_DEFAULT,
PURCHASE_PPCASH = MSG_CG_SHOP_SEND_GIFT_SYN::PURCHASE_PPCASH,
};
BYTE item_type_; //< enum { SINGLEITEM=1, PACKAGEITEM=2,};
int price_guid_; //< 판매 가격 고유 번호
BYTE purchase_type_; // ~_PPCARD = { pp card }, ~_DEFAULT = { cash, mileage, heim, etc... }
char gift_message_[MAX_GIFT_MESSAGE_LEN]; //< 선물 메세지
//
QueryUserIdInfo user_info_;
inline WORD GetSize() const {
return sizeof(*this);
}
PACKET_CG_FWD_CLOSE;
#endif
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_SEND_GIFT_ACK)
MONEY m_UserMoney;
CashData m_CashData;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_SEND_GIFT_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
// 선물을 받음 통지 패킷
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_SEND_GIFT_NTF)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ACTION_RECV_GIFT_SYN)
enum { OBTAIN=1, REJECT=2, DISCARD=3, };
enum { MAX_GIFT_MESSAGE_LEN = 512, };
BYTE m_ActionType; //< enum { OBTAIN=1, REJECT=2, DISCARD=3, };
DWORD m_GiftGuid; //< 선물Guid
//char m_tszThanksMessage[MAX_GIFT_MESSAGE_LEN+1];
//int GetSize()
//{
// switch(m_ActionType)
// {
// case OBTAIN:
// return sizeof(MSG_BASE_FORWARD)+(MAX_GIFT_MESSAGE_LEN-strlen(m_tszThanksMessage));
// }
// return sizeof(MSG_BASE_FORWARD)+sizeof(m_ActionType)+sizeof(m_GiftGuid);
//}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ACTION_RECV_GIFT_ACK)
enum { OBTAIN=1, REJECT=2, DISCARD=3, };
BYTE m_ActionType; //< enum { OBTAIN=1, REJECT=2, DISCARD=3, };
JUST_INVENTORY_TOTAL_INFO m_TotalInfo;
int GetSize()
{
switch(m_ActionType)
{
case OBTAIN:
return sizeof(MSG_BASE_FORWARD)+
m_TotalInfo.GetSize();
}
return sizeof(MSG_BASE_FORWARD)+sizeof(m_ActionType);
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_ACTION_RECV_GIFT_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_IS_RECV_GIFT_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_IS_RECV_GIFT_ACK)
DWORD m_GiftCount;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_IS_RECV_GIFT_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_RECV_GIFT_LIST_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_RECV_GIFT_LIST_ACK)
enum { MAX_BUFFER_SIZE = 4096, };
WORD m_Size;
BYTE m_pBUFFER[MAX_BUFFER_SIZE];
int GetSize() { return sizeof(*this)-(MAX_BUFFER_SIZE-m_Size); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_SHOP,CG_SHOP_RECV_GIFT_LIST_NAK)
BYTE m_byErrorCode; //< ShopDefine.h의 eSHOP_RESULT 참조
PACKET_CG_FWD_CLOSE;
#endif //_NA_0_20110613_GAME_SHOP_RENEWAL
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 인스턴스 던전
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_INSTANCE_DUNGEON_REQUEST_SYN )
POSTYPE m_ItemPos;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_INSTANCE_DUNGEON_REQUEST_RESULT_NAK )
BYTE m_byKind; //0 이면 eITEM_RESULT 1이면 eROOM_RESULT
DWORD m_dwErrorCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_INSTANCE_DUNGEON_JOIN_ACK )
MAPCODE m_MapCode;
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_INSTANCE_DUNGEON_JOIN_NAK )
PACKET_CG_CLOSE;
// for compatible
PACKET_CG_INHERIT_OPEN( CG_ZONE, CG_ZONE_CREATE_TOP_OF_TRIAL_SYN, MSG_CG_ZONE_INSTANCE_DUNGEON_REQUEST_SYN )
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_INHERIT_OPEN( CG_ZONE, CG_ZONE_CREATE_TOP_OF_TRIAL_NAK, MSG_CG_ZONE_INSTANCE_DUNGEON_REQUEST_RESULT_NAK )
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_INHERIT_OPEN( CG_ZONE, CG_ZONE_JOIN_TOP_OF_TRIAL_ACK, MSG_CG_ZONE_INSTANCE_DUNGEON_JOIN_ACK )
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_INHERIT_OPEN( CG_ZONE, CG_ZONE_JOIN_TOP_OF_TRIAL_NAK, MSG_CG_ZONE_INSTANCE_DUNGEON_JOIN_NAK )
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_INSTANCE_DUNGEON_LEAVE_SYN )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_INSTANCE_DUNGEON_LEAVE_ACK )
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE, CG_ZONE_INSTANCE_DUNGEON_LEAVE_NAK )
DWORD m_dwErrorCode; //< eITEM_RESULT
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_ONEDAYS_GUILD_MISSION_TRIGGER_ACTIVE_STATUS_CMD )
BYTE m_bErrorCode; //< eITEM_RESULT
PACKET_CG_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_BATTLE_OPEN_TIME_NOTICE_BY_CODE_BRD)
DWORD m_NoticeCode;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GET_BATTLE_OPEN_TIME_SYN)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN(CG_ETC, CG_ETC_GET_BATTLE_OPEN_TIME_ACK)
// 저탑 정보
struct {
eJION_TOP_STATE m_eJoinState;
DWORD m_JoinOverTime;
};
// 타락 정보
nsSSQ::SSQTicketInfo m_SSQTicketInfo;
PACKET_CG_FWD_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 타락한 사원 프로토콜 정의 <- 세부 정의는 ProgramCommon/SSQ/SSQInfoStruct.hxx에 존재
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//─────────────────────────────────────────
//
//
PACKET_CG_OPEN(CG_STATUS, CG_STATUS_SSQ_INFO_BRD) // variable size packet
WAR_MSG_HDR m_Header[1]; // Stream Header, next pointer is data stream
uint16_t GetSize() const
{ return static_cast<uint16_t>(sizeof(*this) + m_Header->size); }
PACKET_CG_CLOSE;
PACKET_CG_INHERIT_OPEN( CG_ZONE_EX, CG_ZONE_EX_SSQ_ROOM_CTRL_CMD, MSG_CG_STATUS_SSQ_INFO_BRD )
PACKET_CG_INHERIT_CLOSE;
// 아마 이건 사용하지 않을 가능성이 크다. C->G 형태이므로
PACKET_CG_INHERIT_OPEN( CG_ZONE_EX, CG_ZONE_EX_SSQ_ROOM_INFO_SYN, MSG_CG_STATUS_SSQ_INFO_BRD )
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_INHERIT_OPEN( CG_ZONE_EX, CG_ZONE_EX_SSQ_ROOM_INFO_BRD, MSG_CG_STATUS_SSQ_INFO_BRD )
PACKET_CG_INHERIT_CLOSE;
//
//─────────────────────────────────────────
//
//
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_SSQ_JOIN_INFO_SYN)
POSTYPE m_ItemPos; // 사용하는 Item의 슬롯 위치
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_SSQ_JOIN_INFO_ACK)
enum eRESULT { FAIL = PROTOCOL_GENERATOR_ZONE_EX_091, SUCCESS = PROTOCOL_GENERATOR_ZONE_EX_054 };
enum eFAIL_RC_CODE { RET_ITEM = PROTOCOL_GENERATOR_ZONE_EX_044, RET_ROOM = PROTOCOL_GENERATOR_ZONE_EX_116 };
BYTE m_Result; // eRESULT
struct sRETINFO_FAIL {
BYTE m_Kind; // eFAIL_RC_CODE { RET_ITEM 이면 eITEM_RESULT, RET_ROOM이면 eROOM_RESULT }
DWORD m_ErrorCode;
};
struct sRETINFO_SUCCESS {
MAPCODE m_CodeOfSSQ;
};
union {
sRETINFO_FAIL RETINFO_FAIL; //
sRETINFO_SUCCESS RETINFO_SUCCESS; //
};
inline VOID SetFailResult( const BYTE kind, const DWORD errorCode )
{
m_Result = FAIL;
sRETINFO_FAIL& ref = RETINFO_FAIL;
ref.m_Kind = kind;
ref.m_ErrorCode = errorCode;
}
inline VOID SetSuccessResult( const MAPCODE CodeOfSSQ )
{
m_Result = SUCCESS;
RETINFO_SUCCESS.m_CodeOfSSQ = CodeOfSSQ;
}
// for Client 성공 여부 판단용
inline BOOL IsSuccess() { return SUCCESS == m_Result; }
inline WORD GetSize()
{
const WORD DEF_SIZE = sizeof(MSG_BASE_FORWARD) + sizeof(BYTE);
return SUCCESS == m_Result ? DEF_SIZE + sizeof(RETINFO_SUCCESS) : DEF_SIZE + sizeof(RETINFO_FAIL);
}
PACKET_CG_CLOSE;
PACKET_CG_INHERIT_OPEN( CG_ZONE_EX, CG_ZONE_EX_SSQ_JOIN_SYN, MSG_CG_ZONE_EX_SSQ_JOIN_INFO_SYN )
DWORD m_CodeOfSSQ;
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_INHERIT_OPEN( CG_ZONE_EX, CG_ZONE_EX_SSQ_JOIN_ACK, MSG_CG_ZONE_EX_SSQ_JOIN_INFO_ACK )
PACKET_CG_INHERIT_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_SSQ_REWARD_OR_REFUND_INFO_CMD ) //G->C 마을|필드 입장후 통지 관련 정보 + 환불시 환불 정보
SSQ_RESERVED_REWARD_INFO m_RewardInfo;
struct RefundInfo {
RC::eITEM_RESULT Result; // 환불시 아이템 처리 실패 가능성 있으므로...
MONEY ChangedTotalHeim;
INVENTORY_TOTAL_INFO TotalInfo;
} m_Refund; // 환불시 사용
inline BOOLEAN IsWinnerReward() const { return eEVENT_MULTIUSE_SSQ_WINNER_REWARD == m_RewardInfo.m_SharedInfo.EventID; }
inline BOOLEAN IsQuestFail() const { return eEVENT_MULTIUSE_SSQ_QUEST_FAIL_INFO == m_RewardInfo.m_SharedInfo.EventID; }
inline BOOLEAN IsRefund() const { return eEVENT_MULTIUSE_SSQ_REFUND == m_RewardInfo.m_SharedInfo.EventID; }
inline WORD GetSize() /*const*/
{
const SIZE_T min_size = sizeof(*this)-sizeof(m_Refund);
return !IsRefund()
? (WORD)( min_size )
: (WORD)( min_size
+ ( sizeof(m_Refund)-sizeof(m_Refund.TotalInfo) )
+ m_Refund.TotalInfo.GetSize() )
;
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_SSQ_WINNER_REWARD_CMD ) //G->C 승자에 대한 인벤토리의 아이템 보상
RC::eITEM_RESULT m_Result;
INVENTORY_TOTAL_INFO m_TotalInfo;
inline WORD GetSize() /*const*/
{
const SIZE_T min_size = (sizeof(*this)-sizeof(m_TotalInfo));
return (WORD)( min_size + m_TotalInfo.GetSize() );
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN( CG_ZONE_EX, CG_ZONE_EX_SSQ_OBSERVER_SYN )
BYTE Request; //nsSSQ::Observer::Info::eRequest
union {
struct {
BYTE PressedKey; //nsSSQ::Observer::Info::eKeyCmd
} ObserverCmd;
};
PACKET_CG_CLOSE;
//{__NA001283_20090221_COLLECTION_PACKET
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// CG_COLLECT
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_ALLCOLLECTIVE_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_ALLCOLLECTIVE_CMD )
enum { _MAX_FIELDCOLLECT_INFO_SIZE = 50 };
BYTE m_byCount;
COLLECT_RENDER_INFO m_CollectiveInfo[_MAX_FIELDCOLLECT_INFO_SIZE];
int GetSize() { return (sizeof(*this)-(_MAX_FIELDCOLLECT_INFO_SIZE-m_byCount)*sizeof(COLLECT_RENDER_INFO)); }
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_LEAVE_SECTOR_CMD )
enum { _MAX_FIELDCOLLECT_INFO_SIZE = 50 };
BYTE m_byCount;
C_COLLECTKEY m_ObjKeyCollection[_MAX_FIELDCOLLECT_INFO_SIZE];
int GetSize() { return (sizeof(*this)-(_MAX_FIELDCOLLECT_INFO_SIZE-m_byCount)*sizeof(C_COLLECTKEY)); }
PACKET_CG_FWD_CLOSE;
//.//
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_ACTION_SYN )
S_COLLECTKEY m_ObjKeyCollection; // 채집물품
WzVector m_wvCurPos; // 클라이언트가 주는 플레이어의 현재 좌표 (검증용)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_CANCEL_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_SUCCESS_SYN )
PACKET_CG_FWD_CLOSE;
//.//
// CHANGES: f110425.1L, moved to sync
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_ACTION_BRD )
C_COLLECTKEY m_dwObjectKey; // 채집물품.
WzID m_CollectionID; // 채집물품ID.
DWORD m_Collector; // 채집자.
PACKET_CG_FWD_CLOSE;
// CHANGES: f110425.1L, moved to sync
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_CANCEL_BRD )
C_COLLECTKEY m_dwObjectKey; // 채집물품.
WzID m_CollectionID; // 채집물품ID.
DWORD m_Collector; // 채집자.
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_ACTIVE_BRD )
C_COLLECTKEY m_dwObjectKey; // 채집물품.
WzID m_CollectionID; // 채집물품ID.
PACKET_CG_FWD_CLOSE;
//.//
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_ACTION_NAK )
DWORD m_byErrorCode;
PACKET_CG_FWD_CLOSE;
//.//
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_OBTAIN_CMD )
#ifdef _NA_000000_20120416_COLLECT_OBTAIN_QUESTCODE
WORD quest_code_;
#endif
INVENTORY_TOTAL_INFO m_tagInventory;
int GetSize()
{
#ifdef _NA_000000_20120416_COLLECT_OBTAIN_QUESTCODE
return (sizeof(MSG_BASE_FORWARD) + sizeof(quest_code_) + m_tagInventory.GetSize());
#else
return (sizeof(MSG_BASE_FORWARD)+m_tagInventory.GetSize());
#endif
}
PACKET_CG_FWD_CLOSE;
#ifdef _NA_004777_20120428_ADD_COMPLETE_COLLECTION_TRIGGER
PACKET_CG_FWD_OPEN( CG_COLLECT, CG_COLLECT_DEACTIVE_BRD )
enum { _MAX_FIELDCOLLECT_INFO_SIZE = 10 };
BYTE m_byCount;
C_COLLECTKEY m_ObjKeyCollection[_MAX_FIELDCOLLECT_INFO_SIZE];
int GetSize() { return (sizeof(*this)-(_MAX_FIELDCOLLECT_INFO_SIZE-m_byCount)*sizeof(C_COLLECTKEY)); }
PACKET_CG_FWD_CLOSE;
#endif _NA_004777_20120428_ADD_COMPLETE_COLLECTION_TRIGGER
//}__NA001283_20090221_COLLECTION_PACKET
//
//─────────────────────────────────────────
//{__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
// 포탈 생성 명령 (임시로 생성되는 포탈 형태)
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_QUEST_PORTAL_CREATE_CMD)
QuestPortalInfo questPortalInfo;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_QUEST_PORTAL_CLOSE_CMD)
KEYTYPE portalKey; //
PACKET_CG_CLOSE;
// MapEnterancePortal.txt에 의한 고정 포탈형 미션 ||
// QuestPortalCreate에 의해 임시 생성된 포탈 진입 요청
// (Note) 기존 MISSION_CREATE, INST~_CREATE등등을 대체할 수도 있다.
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN)
enum eSYNC { eSYNC_TEMP_PORTAL, eSYNC_FIXED_PORTAL, eSYNC_COUNT };
BYTE syncType; // eSYNC
KEYTYPE portalKey;
WORD mapEnterancePortalIndex;
inline WORD GetSize() const
{
return WORD(sizeof(*this));
}
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_QUEST_PORTAL_ENTER_NAK)
enum eRESULT_TYPE { eRESULT_ROOM, eRESULT_ITEM, eRESULT_COUNT };
BYTE errorType; //eRESULT_TYPE
WORD errorCode; //::eROOM_RESULT | ::eITEM_RESULT
PACKET_CG_CLOSE;
//}__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
//_NA003129_QUEST_PORTAL_CONVENIENCE_EXTENTION = {
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_QUEST_PORTAL_FIXEDPORTAL_STATEINFO_CMD)
enum eOpenState {
eOpenState_None = 0,
eOpenState_Created, // create fixed portal
eOpenState_Countdown,
eOpenState_Closed,
//
eOpenState_Counts
};
KEYTYPE portal_key;
uint8_t open_state;
ulong portal_lifetime;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_QUEST_PORTAL_WITHDRAW_MEMBER_SYN)
KEYTYPE portal_key;
PACKET_CG_CLOSE;
PACKET_CG_INHERIT_OPEN(CG_ZONE_EX, CG_ZONE_EX_QUEST_PORTAL_WITHDRAW_MEMBER_NAK,
MSG_CG_ZONE_EX_QUEST_PORTAL_WITHDRAW_MEMBER_SYN)
RC::eROOM_RESULT error_code; // < result != RC::RC_ROOM_SUCCESS
PACKET_CG_INHERIT_CLOSE;
//}_NA003129_QUEST_PORTAL_CONVENIENCE_EXTENTION
PACKET_CG_OPEN(CG_ZONE_EX, CG_ZONE_EX_ROOM_MEMBER_STATUS_BRD)
enum eRESULT_TYPE { RET_FAIL, RET_SUCCESS };
struct MemberInfo
{
WORD objectKey;
WORD roomResult; //RC::eROOM_RESULT
};
BYTE m_Result; //eRESULT_TYPE
BYTE m_NumberOfMembers;
MemberInfo m_Members[max(MAX_FIELD_PARTYMEMBER_NUM, MAX_PARTYMEMBER_NUM)];
inline void Clear()
{
m_Result = RET_FAIL;
m_NumberOfMembers = 0;
ZeroMemory(m_Members, sizeof(m_Members));
}
inline WORD GetSize() const
{
const WORD MinSize = WORD(sizeof(*this) - sizeof(m_Members));
if(m_Result == RET_SUCCESS)
return MinSize;
return MinSize + WORD(sizeof(MemberInfo) * m_NumberOfMembers);
}
PACKET_CG_CLOSE;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 보안강화 관련 처리 패킷 정의 (MOLA 2차, 5차 Update)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// __NA000630_070817_MOLA_5th_UPDATE
// eCG_CONNECTION_PROTOCOL
// CG_SECURE_QUERY_RESOURCE_CHK_T1_CMD = PROTOCOL_GENERATOR_026,
// CG_SECURE_QUERY_RESOURCE_CHK_T1_ACK = PROTOCOL_GENERATOR_027,
// CG_SECURE_QUERY_BUILTIN_CHK_CMD = PROTOCOL_GENERATOR_028,
// CG_SECURE_QUERY_BUILTIN_CHK_ACK = PROTOCOL_GENERATOR_029,
// eCG_CHARINFO_PROTOCOL
// CG_SECURE_QUERY_RESOURCE_CHK_T2_CMD = PROTOCOL_GENERATOR_026,
// CG_SECURE_QUERY_RESOURCE_CHK_T2_ACK = PROTOCOL_GENERATOR_027,
// eCG_MAP_PROTOCOL
// CG_SECURE_QUERY_RESOURCE_CHK_NTF1_SYN = PROTOCOL_GENERATOR_003,
// eCG_BATTLE_PROTOCOL
// CG_SECURE_QUERY_RESOURCE_CHK_T3_CMD = PROTOCOL_GENERATOR_016,
// CG_SECURE_QUERY_RESOURCE_CHK_T3_ACK = PROTOCOL_GENERATOR_017,
// eCG_STYLE_PROTOCOL
// CG_SECURE_QUERY_RESOURCE_CHK_T4_CMD = PROTOCOL_GENERATOR_013,
// CG_SECURE_QUERY_RESOURCE_CHK_T4_ACK = PROTOCOL_GENERATOR_014,
// CG_SECURE_QUERY_RESOURCE_CHK_NTF2_SYN = PROTOCOL_GENERATOR_015,
PACKET_CG_OPEN(CG_CONNECTION, CG_SECURE_QUERY_BUILTIN_CHK_CMD)
BYTE m_dwBuiltinCMD[8/* +a */];
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_SECURE_QUERY_BUILTIN_CHK_ACK)
BYTE m_dwBuiltinACK[8/* +b */];
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_SECURE_QUERY_RESOURCE_CHK_T1_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CONNECTION, CG_SECURE_QUERY_RESOURCE_CHK_T1_ACK)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_SECURE_QUERY_RESOURCE_CHK_T2_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_SECURE_QUERY_RESOURCE_CHK_T2_ACK)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_MAP, CG_SECURE_QUERY_RESOURCE_CHK_NTF1_SYN)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_BATTLE, CG_SECURE_QUERY_RESOURCE_CHK_T3_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_BATTLE, CG_SECURE_QUERY_RESOURCE_CHK_T3_ACK)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_STYLE, CG_SECURE_QUERY_RESOURCE_CHK_T4_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_STYLE, CG_SECURE_QUERY_RESOURCE_CHK_T4_ACK)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_STYLE, CG_SECURE_QUERY_RESOURCE_CHK_NTF2_SYN)
PACKET_CG_CLOSE;
// __NA070212_ENHANCED_SECURE_POLICYMENT__
// CG_SYNC
// CG_SECURE_POLICY_PATTERN01_SIMPLEX_SNK_CMD = PROTOCOL_GENERATOR_061,
// CG_SECURE_POLICY_PATTERN01_SIMPLEX_SNK_ACK = PROTOCOL_GENERATOR_062,
//#ifdef __NA000630_070817_MOLA_5th_UPDATE
// CG_SECURE_POLICY_PATTERN02_SIMPLEX_SNK_CMD = PROTOCOL_GENERATOR_065,
// CG_SECURE_POLICY_PATTERN02_SIMPLEX_SNK_ACK = PROTOCOL_GENERATOR_066,
//#else __NA000630_070817_MOLA_5th_UPDATE
// CG_SKILL
// CG_SECURE_POLICY_PATTERN02_SIMPLEX_SNK_CMD = PROTOCOL_GENERATOR_024,
// CG_SECURE_POLICY_PATTERN02_SIMPLEX_SNK_ACK = PROTOCOL_GENERATOR_025,
//#endif //__NA000630_070817_MOLA_5th_UPDATE
// CG_ITEM
// CG_SECURE_POLICY_PATTERN03_SIMPLEX_SNK_CMD = PROTOCOL_GENERATOR_137,
// CG_SECURE_POLICY_PATTERN03_SIMPLEX_SNK_ACK = PROTOCOL_GENERATOR_138,
// CG_TRADE
// CG_SECURE_POLICY_PATTERN04_SIMPLEX_SNK_CMD = PROTOCOL_GENERATOR_059,
// CG_SECURE_POLICY_PATTERN04_SIMPLEX_SNK_ACK = PROTOCOL_GENERATOR_060,
// CG_VENDOR
// CG_SECURE_POLICY_PATTERN05_QUERY_MOLA_CMD = PROTOCOL_GENERATOR_077,
// CG_SECURE_POLICY_PATTERN05_QUERY_MOLA_ACK = PROTOCOL_GENERATOR_078,
// CG_WAREHOUSE
// CG_SECURE_POLICY_PATTERN06_CONFIGURE_MOLA_CMD = PROTOCOL_GENERATOR_016,
// CG_SECURE_POLICY_PATTERN06_CONFIGURE_MOLA_ACK = PROTOCOL_GENERATOR_017,
// CG_PARTY
// CG_SECURE_POLICY_PATTERN07_CONFIGURE_HEARTBEAT_CMD = PROTOCOL_GENERATOR_054,
// CG_SECURE_POLICY_PATTERN07_CONFIGURE_HEARTBEAT_ACK = PROTOCOL_GENERATOR_055,
// CG_STATUS
// CG_SECURE_POLICY_PATTERN08_DUPLEX_SNK_KEY = PROTOCOL_GENERATOR_046,
// CG_SECURE_POLICY_PATTERN08_DUPLEX_SNK_ACK = PROTOCOL_GENERATOR_047,
// CG_SECURE_POLICY_PATTERN08_DUPLEX_SNK_CMD = PROTOCOL_GENERATOR_048,
//////////////////////////////////////////////////////////////////////////
PACKET_CG_OPEN(CG_SYNC, CG_SECURE_POLICY_PATTERN01_SIMPLEX_SNK_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_SYNC, CG_SECURE_POLICY_PATTERN01_SIMPLEX_SNK_ACK)
PACKET_CG_CLOSE;
//////////////////////////////////////////////////////////////////////////
PACKET_CG_OPEN(CG_SYNC, CG_SECURE_POLICY_PATTERN02_SIMPLEX_SNK_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_SYNC, CG_SECURE_POLICY_PATTERN02_SIMPLEX_SNK_ACK)
PACKET_CG_CLOSE;
//////////////////////////////////////////////////////////////////////////
PACKET_CG_OPEN(CG_ITEM, CG_SECURE_POLICY_PATTERN03_SIMPLEX_SNK_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_ITEM, CG_SECURE_POLICY_PATTERN03_SIMPLEX_SNK_ACK)
PACKET_CG_CLOSE;
//////////////////////////////////////////////////////////////////////////
PACKET_CG_OPEN(CG_TRADE, CG_SECURE_POLICY_PATTERN04_SIMPLEX_SNK_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_TRADE, CG_SECURE_POLICY_PATTERN04_SIMPLEX_SNK_ACK)
PACKET_CG_CLOSE;
//////////////////////////////////////////////////////////////////////////
PACKET_CG_OPEN(CG_VENDOR, CG_SECURE_POLICY_PATTERN05_QUERY_MOLA_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_VENDOR, CG_SECURE_POLICY_PATTERN05_QUERY_MOLA_ACK)
PACKET_CG_CLOSE;
//////////////////////////////////////////////////////////////////////////
PACKET_CG_OPEN(CG_WAREHOUSE, CG_SECURE_POLICY_PATTERN06_CONFIGURE_MOLA_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_WAREHOUSE, CG_SECURE_POLICY_PATTERN06_CONFIGURE_MOLA_ACK)
PACKET_CG_CLOSE;
//////////////////////////////////////////////////////////////////////////
PACKET_CG_OPEN(CG_PARTY, CG_SECURE_POLICY_PATTERN07_CONFIGURE_HEARTBEAT_CMD)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_PARTY, CG_SECURE_POLICY_PATTERN07_CONFIGURE_HEARTBEAT_ACK)
PACKET_CG_CLOSE;
//////////////////////////////////////////////////////////////////////////
PACKET_CG_OPEN(CG_STATUS, CG_SECURE_POLICY_PATTERN08_DUPLEX_SNK_KEY)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_STATUS, CG_SECURE_POLICY_PATTERN08_DUPLEX_SNK_ACK)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_STATUS, CG_SECURE_POLICY_PATTERN08_DUPLEX_SNK_CMD)
PACKET_CG_CLOSE;
// <END>
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
/************************************************************************/
/* 지역 점령전 관련 패킷 */
/************************************************************************/
//"점령전 참여하기" 버튼 클릭시
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_APPLY_SYN )
MAPCODE m_MapCode; //요청 지역 맵코드
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_APPLY_ACK )
RC::eDOMINATION_RESULT m_ResultCode; //작업 결과값 코드
BOOL m_CheckBatting; //배팅이 가능한지 불가능한지 체크
BYTE m_DataNum; //경매 리스트 갯수
DOMINATION_ACTION_INFO m_ActionList[MAX_DOMINATION_ACTIONLIST]; //경매 게시판 리스트(2009.09.21 현재 Max값 10개)
uint16_t GetSize() const
{
assert(m_DataNum <= _countof(m_ActionList));
const size_t kMinSize = sizeof(*this) - sizeof(m_ActionList);
return static_cast<uint16_t>(kMinSize + sizeof(m_ActionList[0]) * m_DataNum);
}
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//"점령전 참여하기" -> "배팅하기" 버튼 클릭시
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_BATTING_HEIM_SYN )
MAPCODE m_MapCode; //요청 지역 맵코드
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_BATTING_HEIM_ACK )
RC::eDOMINATION_RESULT m_ResultCode; //작업 결과값 코드
ULONGLONG m_RemainCost; //현재 남아있는 길드 하임
#ifdef _NA_000000_20130429_DOMINATION_PENALTY
DWORD penalty_time;
#endif //_NA_000000_20130429_DOMINATION_PENALTY
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//"배팅하기" 창에서 확인 버튼 눌렀을 경우
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_ACCEP_HEIM_SYN )
MAPCODE m_MapCode; //요청 지역 맵코드
POSTYPE m_TokenPos; //배팅 아이템 인벤토리 위치
BYTE betting_item_count_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_ACCEP_HEIM_ACK )
RC::eDOMINATION_RESULT m_ResultCode; //작업 결과값, 기존 점령전 참여가 있었는지 확인하는 값 추가
POSTYPE m_TokenPos;
BYTE betting_item_count_;
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//"점령전관리" 버튼을 눌렀을 경우
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MANAGE_SYN )
MAPCODE m_MapCode; //요청 지역 맵코드
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MANAGE_ACK )
RC::eDOMINATION_RESULT m_ResultCode; //작업 결과값 코드
BYTE m_TotalPoint; //디펜스 포인트 총갯수
BYTE m_DefenseWall[MAX_DOMINATION_DEFENSEWALL_NUM]; //현제 지역 점령전 방어벽 별 방어력(2009.09.21 현재 Max값 3개)
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//"점령전관리"창에서 확인을 눌렀을 경우
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_SAVE_GATESTAT_SYN )
MAPCODE m_MapCode; //요청 지역 맵코드
BYTE m_DefenseWall[MAX_DOMINATION_DEFENSEWALL_NUM]; //현제 지역 점령전 방어벽 별 방어력(2009.09.21 현재 Max값 3개)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_SAVE_GATESTAT_ACK )
RC::eDOMINATION_RESULT m_ResultCode; //작업 결과값 코드
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//"점령전관리" 방벽 포인트 추가 버튼을 눌렀을 경우
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_ADD_DEFFENSEWALL_POINT_SYN )
MAPCODE map_code_; //요청 지역 맵코드
SLOTCODE item_code_; //방벽 증가 아이템 코드
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_ADD_DEFFENSEWALL_POINT_ACK )
RC::eDOMINATION_RESULT result_code_; //작업 결과값 코드
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//점령전 종료후 유저들에게 점령전 종료후 미니맵변경 이벤트 플레그 세팅 알림
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MINIMAP_SET_BRD )
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//미니맵에 길드 표시 자료 요청
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MINIMAP_LIST_SYN )
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MINIMAP_LIST_ACK )
RC::eDOMINATION_RESULT m_ResultCode;//작업 결과값 코드
BYTE m_NumDominationGuild;//지역을 점령한 길드 숫자
DOMINATION_GUILD_INFO m_GuildInfo[MAX_DOMINATION_MAP];//점령 길드 정보
uint16_t GetSize() const
{
assert(m_NumDominationGuild <= _countof(m_GuildInfo));
return (sizeof(*this) - sizeof(m_GuildInfo)) + //고정 크기
(sizeof(m_GuildInfo[0]) * m_NumDominationGuild); //가변 크기
}
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//지역 점령 타워를 클릭했을때
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_NOTICE_SYN )
MAPCODE m_MapCode; //특정 지역 MapCode
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_NOTICE_ACK )
RC::eDOMINATION_RESULT m_ResultCode; //작업 결과값 코드
BOOL m_EnterFlag; //입장버튼 활성화 flag
BOOL m_AuctionFlag; //경매버튼 활성화 flag
BOOL m_ManageFlag; //관리버튼 활성화 flag
//_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN
BOOL m_JoinFlag; //점령전 참여 활성화 flag
DOMINATION_GUILD_INFO m_GuildInfo; //공격에 선정된 길드 정보
PACKET_CG_FWD_CLOSE;
//_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN
/************************************************************************/
//참여 멤버 리스트 알림
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MEMBERLIST_NTF )
bool is_delete_member_;
MAPCODE map_code_;
BYTE data_count_;
DominationMemberInfo member_list_[MAX_DOMINATION_MEMBER*2];
uint16_t GetSize() const
{
assert(data_count_ <= _countof(member_list_));
const size_t kMinSize = sizeof(*this) - sizeof(member_list_);
return static_cast<uint16_t>(kMinSize + sizeof(member_list_[0]) * data_count_);
}
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//점령전 멤버로 참여 요청
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MEMBER_JOIN_SYN )
MAPCODE map_code_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MEMBER_JOIN_ACK )
RC::eDOMINATION_RESULT result_code_;
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//점령전 멤버 참여 취소
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MEMBER_LEAVE_SYN )
MAPCODE map_code_;
CHARGUID memeber_guid_;
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_MEMBER_LEAVE_ACK )
RC::eDOMINATION_RESULT result_code_;
CHARGUID memeber_guid_;
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//점령전 리스트 새로 고침 요청
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_REFRESH_MEMBERLIST_REQ )
MAPCODE map_code_;
PACKET_CG_FWD_CLOSE;
/************************************************************************/
//지역 점령전 공격길드에 선정 되었을 경우
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_SELECTED_BRD )
MAPCODE m_DominationFieldCode; //점령전을 실행할 지역 코드
PACKET_CG_FWD_CLOSE;
//.//
//_NA001385_20090924_DOMINATION_ETC
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_AREA_INFO_CMD ) // 플레이어 점령지 정보 변경 공지 (자신과 주위에)
//_NA_0_20100208_DOMINATION_AREA_INFO
DWORD m_dwPlayerKey; // 변경 길드원 ObjectKey
DOMINATION_STATE_TOTAL_INFO m_stateTotalInfo; // 점령전 상태 정보
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_stateTotalInfo);
return static_cast<uint16_t>(kMinSize + m_stateTotalInfo.GetSize());
}
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_TIME_SYNC_BRD ) // 점령전 시작시 또는 중간 시간 동기화시 해당 맵 유저에게
DWORD m_dwRemainedTime; // ms (최대: 3600000)
BYTE m_byEventState; // 점령전 진행여부. (eDOMINATION_EVENT_STATE)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_COUNT_NOSES_BRD ) // 점령전 맵에 입.퇴장시 맵 전체 유저에게 카운팅 발송
BYTE m_byCount; // 해당 길드 인원수 (현재/최대)
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_KICK_NOTIFY_BRD ) // 점령전 시스템 준비를 위해 타워 입구로 강제 이동 (10초전)
PACKET_CG_FWD_CLOSE;
#ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_TURNOVER_BRD ) // 점령전 턴오버시 클라이언트에게 알림
GUILDGUID m_winGuid; // 각인 성공 길드
MAPCODE m_mapCode; // 점령지역
char win_guild_name[MAX_GUILDNAME_LENGTH+1];
uint16_t GetSize() const
{
return sizeof(*this);
};
PACKET_CG_FWD_CLOSE;
#endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_START_NOTIFY_BRD ) // 점령전 시작 전 알림 (점령전이 시작될 예정입니다. ~~)
//_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN
eDOMINATION_NOTIFY_TIME notify_type; // 알림 메시지 타입
BYTE m_byTime; // 분
#ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION
eDOMINATION_TYPE m_domination_type; // 점령전 종류
#endif
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_CRYSTALWARP_STATE_BRD ) // 수정 워프 소환, 소환 해재, 파괴 알림.
DWORD m_dwCrystalWarpKey; // 수정 워프 오브젝트키
BYTE m_byState; // 상태
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_FWD_CLOSE;
//.//
//_NA001385_20090924_DOMINATION_STAMP
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_BEGIN_STAMP_BRD ) // 점령전 각인 시작시 해당 맵 공격길드원에게
WzID m_nStampID; // 채집물품ID.
#ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION
char m_stamp_guild_name[MAX_GUILDNAME_LENGTH+1];//각인 길드 이름
#endif
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_CANCLE_STAMP_BRD ) // 점령전 각인 실패시 해당 맵 공격길드원에게 (클라 cancle 패킷에 의한 BRD)
WzID m_nStampID; // 채집물품ID.
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_RESULT_BRD ) // 점령전 결과
GUILDGUID m_winGuid; // 승
GUILDGUID m_loseGuid; // 패
MAPCODE m_mapCode; // 점령지역
#ifdef _NA_006826_20130722_DOMINATION_RENEWAL
char win_guild_name[MAX_GUILDNAME_LENGTH+1];
#endif // _NA_006826_20130722_DOMINATION_RENEWAL
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_FWD_CLOSE;
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_UPDATE_GUILDINFO_BRD )
WORD domination_map_count_; // 점령지역 수
WORD domination_join_count_; // 점령전 참여 횟수
WORD domination_defense_count_; // 점령전 방어 성공 횟수
WORD domination_hunting_count_; // 점령전 보스 사냥 횟수
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_FWD_CLOSE;
#ifdef _NA_006826_20130722_DOMINATION_RENEWAL
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_DOMINATION_DEFENSE_GUILD_ALLIENCE_LIST_BRD )
GUILDGUID allience_list[MAX_ALLIENCE_GUILD_NUM];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_CG_FWD_CLOSE;
#endif // _NA_006826_20130722_DOMINATION_RENEWAL
/**********************지역 점령전 관련 패킷 END*************************/
#ifdef _NA_0_20100819_AGGRO_RENEWAL
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_AGGRO_VALUES_CMD )
BYTE aggro_player_count_; //몬스터가 어글 포인트를 가지고 있는 플레이어 수
AggroValueInfo aggor_info_[MAX_TARGET_NUM];
int GetSize() const
{
return ( sizeof(MSG_CG_AGGRO_VALUES_CMD) -
((MAX_TARGET_NUM - aggro_player_count_) * sizeof(AggroValueInfo)) );
}
PACKET_CG_FWD_CLOSE;
#endif //_NA_0_20100819_AGGRO_RENEWAL
#ifdef _NA_20100322_AGGRO_DISPLAY
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_ARRGO_DISPLAY_CMD )
enum {MAX_AGGRO_DISPLAY = 5,};
BYTE aggro_player_count_; //몬스터가 어글 포인트를 가지고 있는 플레이어 수
AggroValueInfo aggor_info_[MAX_AGGRO_DISPLAY];
int GetSize() const
{
return ( sizeof(MSG_CG_ARRGO_DISPLAY_CMD) -
((MAX_AGGRO_DISPLAY - aggro_player_count_) * sizeof(AggroValueInfo)) );
}
PACKET_CG_FWD_CLOSE;
#endif //_NA_20100322_AGGRO_DISPLAY
#ifdef _NA_20100322_AGGRO_DISPLAY
PACKET_CG_FWD_OPEN( CG_BATTLE, CG_MONSTER_SELECT_INFO_SYN )
DWORD monster_key;
PACKET_CG_FWD_CLOSE;
#endif
#ifdef _NA_003027_20111013_HONOR_SYSTEM
PACKET_CG_FWD_OPEN( CG_CHARINFO, CG_HONORSYSTEM_PACKET )
BYTE packet_type;
PACKET_CG_FWD_CLOSE;
#endif //_NA_003027_20111013_HONOR_SYSTEM
#ifdef _NA004034_20120102_POINT_WALLET_SYSTEM
PACKET_CG_OPEN(CG_CHARINFO, CG_POINTWALLET_PACKET)
BYTE packet_type;
PACKET_CG_CLOSE;
#endif //_NA004034_20120102_POINT_WALLET_SYSTEM
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARNAME_CHANGE_REQUEST_ACK)
BYTE result;
PACKET_CG_CLOSE;
//!~ _NA_000000_20140120_SMART_NPC_SYSTEM
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_SMARTNPC_PACKET)
BYTE packet_type;
DWORD CID;
DWORD NID;
DWORD EID;
DWORD STEP;
PACKET_CG_CLOSE;
//~! _NA_000000_20140120_SMART_NPC_SYSTEM
#ifdef _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_ATTENDANCE_INFO_PACKET)
AttendanceInfo attendance_infos;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_GET_ATTENDANCE_REWARD_PACKET)
PACKET_CG_CLOSE;
#endif // _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM
#ifdef _NA_008404_20150712_MINIGAME_SYSTEM
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_MINIGAME_BINGO_INFO_PACKET)
MiniGameBingoInfos minigame_bingo_infos;
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_GET_MINIGAME_BINGO_REWARD_PACKET)
PACKET_CG_CLOSE;
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_MINIGAME_NAK)
int result_code;
PACKET_CG_CLOSE;
#endif // _NA_008404_20150712_MINIGAME_SYSTEM
#ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_SUN_RANKING_GRADE_PACKET)
eSUN_RANKING_TYPE ranking_type;
eSUN_RANKING_GRADE_TYPE grade;
PACKET_CG_CLOSE;
// 랭킹 요청 패킷
PACKET_CG_OPEN(CG_ETC, CG_ETC_SUN_RANKING_SYN)
eSUN_RANKING_TYPE ranking_type;
bool is_guild_ranking;
PACKET_CG_CLOSE;
// 랭킹 요청 결과 패킷
PACKET_CG_OPEN(CG_ETC, CG_ETC_SUN_RANKING_ACK)
enum { MAX_INFO_COUNT = 50, };
SunRankingInfoForClient infos[MAX_INFO_COUNT]; //상위 랭커 정보
int my_ranking;
SCORE my_score;
PACKET_CG_CLOSE;
// 랭킹 요청 실패 패킷
PACKET_CG_OPEN(CG_ETC, CG_ETC_SUN_RANKING_NAK)
int error_code;
PACKET_CG_CLOSE;
// 동상 정보 패킷
PACKET_CG_OPEN(CG_ETC, CG_ETC_STATUE_INFO_ACK)
StatueInfo info;
PACKET_CG_CLOSE;
// 랭킹 정산 정보 요청 패킷
PACKET_CG_OPEN(CG_ETC, CG_ETC_SUN_RANKING_SETTLE_INFO_SYN)
PACKET_CG_CLOSE;
// 랭킹 정산 정보 패킷
PACKET_CG_OPEN(CG_ETC, CG_ETC_SUN_RANKING_SETTLE_INFO_ACK)
BYTE type;
BYTE day;
WORD time;
PACKET_CG_CLOSE;
#endif // _NA_008012_20150204_SUN_RANKING_SYSTEM
/************************************************************************/
//전장 시스템
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
PACKET_CG_OPEN(CG_PARTY, CG_CHAOS_ZONE_PACKET)
BYTE category_type;
PACKET_CG_CLOSE;
//!~ _NA_007086_20140318_MONSTERBOOK
PACKET_CG_OPEN(CG_CHARINFO, CG_CHARINFO_MONSTERBOOK_PACKET)
BYTE packet_type;
PACKET_CG_CLOSE;
//~! _NA_007086_20140318_MONSTERBOOK
#pragma warning(pop)
#pragma pack(pop)
#endif // __PACKETSTRUCT_CG_H__