Files
Sun1602/Server/Common/PacketStruct_AG.h
T
2022-10-26 12:25:11 +08:00

1927 lines
62 KiB
C++

#ifndef __PACKETSTRUCT_AG_H__
#define __PACKETSTRUCT_AG_H__
#include <ServerStruct.h>
#include <PacketStruct.h>
#include <Protocol_AG.h>
#include <PacketStruct_CG.h>
#pragma pack(push,1)
#define PACKET_AG_OPEN( c, p ) struct MSG_##p : public MSG_BASE_FORWARD { MSG_##p(){ m_byCategory = c; m_byProtocol = p; }
#define PACKET_AG_CLOSE };
#define PACKET_AG_INHERIT_OPEN( c, p, b ) struct MSG_##p : public b { MSG_##p(){ m_byCategory = c; m_byProtocol = p; }
#define PACKET_AG_INHERIT_CLOSE };
// _NA000000_DBQUERY_REVERSAL_STATE_PREVENTION
PACKET_AG_OPEN(AG_CONNECTION, AG_CONNECTION_DBCONNECT_UPDATE_CMD)
int db_connector_index_;
PACKET_AG_CLOSE;
PACKET_AG_OPEN( AG_CONNECTION, AG_CONNECTION_DISCONNECT_CMD )
//_NA_0_20091118_GAMEROOM_BATTLE_RESULT
BYTE m_AbNormalExit; // 0 : NormalExit, else AbNormalExit
PACKET_AG_CLOSE
/*
PACKET_AG_OPEN( AG_CONNECTION, AG_CONNECTION_UNREGISTER_SYN )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CONNECTION, AG_CONNECTION_UNREGISTER_ACK )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CONNECTION, AG_CONNECTION_UNREGISTER_NAK )
DWORD m_dwErrorCode;
PACKET_AG_CLOSE
*/
PACKET_AG_OPEN( AG_CONNECTION, AG_CONNECTION_UNREGISTER_CMD )
BYTE m_byDisonnectCode;
PACKET_AG_CLOSE
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
PACKET_AG_OPEN(AG_CONNECTION, AG_CONNECTION_SERVER_SELECT_CONTROL_SYN)
enum eControl {
eControl_StartTransaction, // need ack - side effect - can't change behave state
eControl_StopTransaction, // notify
};
BYTE m_Control;
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_CONNECTION, AG_CONNECTION_SERVER_SELECT_CONTROL_ACK)
DWORD m_Result; // RC::eROOM_RESULT
PACKET_AG_CLOSE
#endif
PACKET_AG_OPEN( AG_CONNECTION, AG_WORLDSERVER_INFO_CMD )
BYTE m_bIsConnectedWorld; // 월드서버와의 접속유무를 알려준다.
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_CONNECTION, AG_CONNECTION_SERVER_INFO_CMD)
BYTE pvp_enabled_; // pvp enable mode control by a agent server
BYTE channel_id_; // (CHANGES) (f100424.3L) add channel id to synchronize or debug
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CONNECTION, AG_CONNECTION_DISCONNECT_SERVER_CMD )
eSERVER_TYPE m_ServerType;
BYTE m_byDisonnectCode;
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_SYNC, AG_SYNC_PLAYER_ENTER_SYN)
// (f100623.1L) change a data types
EngineFileChecksum checksum_list_;
uint8_t is_dummy_client_test_; // to support the agent server dummy client
uint8_t tail_guard_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_SYNC, AG_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_;
DOMINATION_GUILD_INFO m_GuildInfo;
#ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION
sDOMINATION_CONTINENT_LORD_INFO m_ContinentLordInfo; //대륙 영주 정보
#endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_SYNC, AG_SYNC_PLAYER_ENTER_NAK )
DWORD m_dwErrorCode;
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_SYNC, AG_SYNC_PLAYER_WARP_SYN)
// (f100623.1L) change a data types
EngineFileChecksum checksum_list_;
uint8_t is_dummy_client_test_; // to support the agent server dummy client
uint8_t tail_guard_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_SYNC, AG_SYNC_PLAYER_WARP_ACK )
float m_fPos[3];
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_SYNC, AG_SYNC_PLAYER_WARP_NAK )
DWORD m_dwErrorCode;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CONNECTION, AG_WORLDSERVER_ABUSING_USER_VERIFY_QUERY_CMD )
CHARGUID m_CharGuid;
eABUSE_SUB_TYPE m_eAbuseSubType;
PACKET_AG_CLOSE
//----------------------------------------------------------------------------------
// CHARINFO
//----------------------------------------------------------------------------------
PACKET_AG_OPEN( AG_CHARINFO, AG_CHARINFO_CHAR_CMD )
PLAYERHP m_MaxHP;
PLAYERHP m_HP;
MPTYPE m_MaxMP;
MPTYPE m_MP;
INT m_dwCHuntingVCount; // 경쟁헌팅 승리횟수
INT m_dwCHuntingTotCount; // 경쟁헌팅 참여횟수
BYTE m_byChaoState; // 카오상태
PLAYERSD m_MaxSD;
PLAYERSD m_SD;
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
PLAYERFP max_FP;
PLAYERFP cur_FP;
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CHARINFO, AG_CHARINFO_FIELD_POS_FOR_RETURN_PARTY_CMD )
WzVector m_ReturnPos;
FIELDCODE m_ReturnFieldCode;
eZONETYPE m_ReturnZoneType;
ZONEKEY m_ReturnZoneKey;
WORD m_PartyKey;
CHARGUID m_CharGUID;
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_CHARINFO, AG_CHARINFO_PCBANG_BILL_CMD)
DWORD m_PcRoomId; // ReservedValue
PACKET_AG_CLOSE
//!~ _NA_006413_20130201_PREMIUMSERVICE_ITEM
PACKET_AG_OPEN(AG_CHARINFO, AG_CHARINFO_PREMIUMSERVICE_BILL_CMD)
DWORD premiumservice_;
PACKET_AG_CLOSE
//~! _NA_006413_20130201_PREMIUMSERVICE_ITEM
//----------------------------------------------------------------------------------
//
// ZONE
//
//----------------------------------------------------------------------------------
// 로비 생성
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_LOBBY_CREATE_CMD )
MAPCODE m_MapCode;
KEYTYPE m_RoomKey;
TCHAR m_pszRoomTitle[MAX_ROOMTITLE_LENGTH];
TCHAR m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
BASE_ROOMINFO m_RoomInfo; //< 생성할 방 정보
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_HUNTING_CREATE_CMD )
MAPCODE m_MapCode;
KEYTYPE m_RoomKey;
TCHAR m_pszRoomTitle[MAX_ROOMTITLE_LENGTH];
TCHAR m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
BASE_ROOMINFO m_RoomInfo; //< 생성할 방 정보
ADDITIONAL_ROOMINFO m_AdditionalInfo;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_MISSION_CREATE_CMD )
MAPCODE m_MapCode;
KEYTYPE m_RoomKey;
eZONE_RULESET::eRules m_Rules; //__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
//
TCHAR m_pszRoomTitle[MAX_ROOMTITLE_LENGTH];
TCHAR m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
BASE_ROOMINFO m_RoomInfo; //< 생성할 방 정보
PartyZoneType party_zone_type; //_NA_003649_20111115_BATTLE_ZONE_HARDMODE
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_PVP_CREATE_CMD )
MAPCODE m_MapCode;
KEYTYPE m_RoomKey;
TCHAR m_pszRoomTitle[MAX_ROOMTITLE_LENGTH];
TCHAR m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
BASE_ROOMINFO m_RoomInfo; //< 생성할 방 정보
ADDITIONAL_PVPINFO m_AdditionalPVPInfo;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_CHUNTION_CREATE_CMD )
MAPCODE m_MapCode;
KEYTYPE m_RoomKey;
TCHAR m_pszRoomTitle[MAX_ROOMTITLE_LENGTH];
TCHAR m_pszRoomPWD[MAX_ROOMPASSWORD_LENGTH];
BASE_ROOMINFO m_RoomInfo; //< 생성할 방 정보
ADDITIONAL_CHUNTINGINFO m_AdditionalInfo;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_PVP_INFO_CMD )
KEYTYPE m_RoomKey;
BYTE m_Count;
struct PVP_TEAM_INFO
{
DWORD m_dwPlayerKey;
BYTE m_Team;
} m_Info[MAX_PARTYMEMBER_NUM];
uint16_t GetSize() const
{
const size_t kMinSize = sizeof(*this) - sizeof(m_Info);
return static_cast<uint16_t>(kMinSize + sizeof(m_Info[0]) * m_Count);
}
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_VILLAGE_CREATE_CMD )
MAPCODE m_MapCode;
KEYTYPE m_RoomKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_FIELD_CREATE_CMD )
MAPCODE m_MapCode;
KEYTYPE m_RoomKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_DOMINATION_FIELD_CREATE_CMD )
MAPCODE m_MapCode;
KEYTYPE m_RoomKey;
PACKET_AG_CLOSE
//_NA_008069_20150210_ADD_SPA_SYSTEM
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_SPAFIELD_CREATE_CMD)
MAPCODE map_code;
KEYTYPE room_key;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_DOMINATION_FIELD_INFO_SYN )
KEYTYPE m_RoomKey;
eDOMINATION_EVENT_STATE m_byEventState;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_DOMINATION_FIELD_INFO_ACK )
KEYTYPE m_RoomKey;
GUILDGUID m_offenceGuild;
GUILDGUID m_defenceGuild;
eDOMINATION_EVENT_TYPE m_eSetType;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_DOMINATION_FIELD_INFO_NAK )
KEYTYPE m_RoomKey;
DWORD m_dwErrorCode;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_DOMINATION_REQ_KICK_CMD )
MAPCODE m_mapCode;
USERGUID m_userGuid;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_ROOM_DESTROY_CMD )
KEYTYPE m_RoomKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_ROOM_JOIN_CMD )
//BYTE m_byRoomType;
KEYTYPE m_RoomKey;
MAPCODE m_wFieldCode;
DWORD m_dwAreaID;
WzVector m_vStartPos;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_ROOM_JOIN_SYN )
BYTE m_byRoomType; //< eZONETYPE
DWORD m_dwPlayerKey;
BYTE m_bySelectedCharIndex;
#ifdef __CH1305_090303_ACCOUNT_ID_LENGTH_EXTENTION__
TCHAR m_pszUserID[ID_MAX_LEN + 1];
#else
TCHAR m_pszUserID[ID_MAX_LEN];
#endif
char m_pszUserIP[IP_MAX_LEN];
DWORD m_dwCharGUID;
KEYTYPE m_RoomKey;
DWORD m_dwReservedValue; // 예약 (0:일반사용자, 나머지값은 PC방 접속자 UID)
BYTE m_bySts; // 유저상태(100이상은 GM등급)
time_t m_LoginTime_t;
MAPCODE m_wFieldCode;
DWORD m_dwAreaID;
WzVector m_vStartPos;
bool m_bIsFirstJoin;
BYTE m_PCRoomSts;
#ifdef __CN_OO0510__FATIGUE_MATCHING_UPDATE
BYTE m_byAge;
BYTE m_byRealNameAuth;
#endif //__CN_OO0510__FATIGUE_MATCHING_UPDATE
BYTE m_byApplyFieldCode; // 특수한 경우 제외하고, FieldCode 적용하지 않는 경우를 변경시키기 위한 코드 0, 1(apply)
GUILDGUID m_GuildGuid;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_ROOM_JOIN_ACK )
//로딩 중 비정상 종료를 위한 값들...
WzVector ReturnPos;
FIELDCODE ReturnFieldCode;
eZONETYPE ReturnZoneType;
KEYTYPE ReturnZoneKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_ROOM_JOIN_NAK )
DWORD m_dwErrorCode;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_ROOM_LEAVE_CMD )
KEYTYPE m_RoomKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_ROOM_LEAVE_SYN )
BYTE m_byRoomType; //< eZONETYPE
KEYTYPE m_RoomKey;
BYTE m_ToRoomType; //나가서 가려는 방타입.
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_ROOM_LEAVE_ACK )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_ROOM_LEAVE_NAK )
DWORD m_dwErrorCode;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_MASTER_CHANGED_CMD )
KEYTYPE m_RoomKey;
DWORD m_dwMasterKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_MISSION_LEAVE_CMD )
enum eLeaveType { eLeaveType_Default, eLeaveType_Target, eLeaveType_Count };
BYTE m_LeaveType; //eLeaveType
MAPCODE m_ReturnMapCode; //if(m_LeaveType == eLeaveType_Target)
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_CHUNTING_LEAVE_CMD )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_CHUNTING_COMPETITION_END_CMD )
KEYTYPE m_RoomKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_PORTAL_FIELD_MOVE_SYN )
WORD m_wIndex;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_PORTAL_FIELD_MOVE_ACK )
WORD m_wIndex;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_PORTAL_FIELD_MOVE_NAK )
BYTE m_byErrorCode;
PACKET_AG_CLOSE
// 필드에서 죽었을대, 마을로 이동 패킷.
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_RETURN_VILLAGE_SYN )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_RETURN_VILLAGE_ACK )
WORD m_wMapCode;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_RETURN_VILLAGE_NAK )
BYTE m_byErrorCode;
PACKET_AG_CLOSE
// 방의 SpecialType이 바뀜
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_CHANGE_SPECIALTYPE_CMD )
KEYTYPE m_RoomKey;
BYTE m_SpecialType; // eROOM_SPECIAL_TYPE
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_TUTORIAL_SKIP_SYN )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_TUTORIAL_SKIP_ACK )
PACKET_AG_CLOSE
// 방장이 있는 필드,위치등을 요청
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_RETURN_TO_ROOM_INFO_SYN )
DWORD m_dwRequestUserKey;
WORD m_wPartyKey;
inline DWORD& REQUEST_USER_KEY() { return m_dwRequestUserKey; }
inline WORD& PARTY_KEY() { return m_wPartyKey; }
PACKET_AG_CLOSE
// 방장이 있는 필드,위치등을 요청에 대한 응답 (TRUE, FALSE 포함)
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_RETURN_TO_ROOM_INFO_ACK )
enum eRESULT { FAIL = 0, SUCCESS = 1, };
BYTE m_byResult;
DWORD m_dwRequestUserKey;
//----- if m_byResult is FAIL, at this point, message size is end. -----
WORD m_wPartyKey;
KEYTYPE m_ktZONETYPE;
MAPCODE m_mcMAPCODE;
FIELDCODE m_fcFIELDCODE;
WzVector m_wvRndPosOfMaster;
inline BYTE RESULT() { return m_byResult; }
inline DWORD& REQUEST_USER_KEY() { return m_dwRequestUserKey; }
inline WORD& PARTY_KEY() { return m_wPartyKey; }
inline KEYTYPE& ZONE_KEY() { return m_ktZONETYPE; }
inline MAPCODE& MAP_CODE() { return m_mcMAPCODE; }
inline FIELDCODE& FIELD_CODE() { return m_fcFIELDCODE; }
inline WzVector& RNDPOSofMASTER() { return m_wvRndPosOfMaster; }
uint16_t GetSize() const {
if (m_byResult == this->SUCCESS) {
return sizeof(*this);
};
return static_cast<uint16_t>((uint8_t*)&m_wPartyKey - (uint8_t*)this);
};
PACKET_AG_CLOSE
//AG_ZONE_RETURN_TO_ROOM_SYN ,
//AG_ZONE_RETURN_TO_ROOM_ACK
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_SSQ_JOIN_INFO_SYN, MSG_CG_ZONE_EX_SSQ_JOIN_INFO_SYN )
DWORD m_CodeOfSSQ;
inline WORD GetSize() const { return sizeof(*this); }
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_SSQ_JOIN_INFO_ACK, MSG_CG_ZONE_EX_SSQ_JOIN_INFO_ACK )
SLOTCODE m_ItemCode; // Addin
inline VOID SetSuccessResult( const MAPCODE CodeOfSSQ, const SLOTCODE itemCode )
{
m_Result = SUCCESS;
RETINFO_SUCCESS.m_CodeOfSSQ = CodeOfSSQ;
m_ItemCode = itemCode;
}
inline WORD GetSize() const
{
const WORD DEF_SIZE = sizeof(MSG_BASE_FORWARD) + sizeof(BYTE);
return SUCCESS == m_Result
? (WORD)( DEF_SIZE + max( sizeof(RETINFO_SUCCESS), sizeof(RETINFO_FAIL) ) + sizeof(m_ItemCode) )
: (WORD)( DEF_SIZE + sizeof(RETINFO_FAIL) )
;
}
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_SSQ_JOIN_SYN, MSG_CG_ZONE_EX_SSQ_JOIN_SYN )
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_SSQ_JOIN_ACK, MSG_CG_ZONE_EX_SSQ_JOIN_ACK )
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_SSQ_ROOM_CTRL_CMD, MSG_CG_STATUS_SSQ_INFO_BRD )
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_SSQ_ROOM_INFO_BRD, MSG_CG_STATUS_SSQ_INFO_BRD )
PACKET_AG_INHERIT_CLOSE
//{__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
//G->A
PACKET_AG_INHERIT_OPEN(AG_ZONE, AG_ZONE_QUEST_PORTAL_REQUEST_SYN,
MSG_CG_ZONE_EX_QUEST_PORTAL_CREATE_CMD)
PACKET_AG_INHERIT_CLOSE
//A->G
PACKET_AG_OPEN(AG_ZONE, AG_ZONE_QUEST_PORTAL_CONTROL_CMD)
enum eCMD { eCMD_CREATE, eCMD_CLOSE, eCMD_COUNT, };
eCMD command; // eCMD
QuestPortalInfo portalInfo;
PACKET_AG_CLOSE
//A->G
PACKET_AG_INHERIT_OPEN(AG_ZONE, AG_ZONE_QUEST_PORTAL_ENTER_SYN,
MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN)
MAPCODE enterableMapCode;
WORD questCode;
WzVector portalPosision;
inline WORD GetSize() const
{ // 세부 옵션이 추가될 것이다.
return static_cast<WORD>(sizeof(*this));
}
PACKET_AG_INHERIT_CLOSE
//G->A (SUCCESS|FAIL)
PACKET_AG_INHERIT_OPEN(AG_ZONE, AG_ZONE_QUEST_PORTAL_ENTER_ACK,
MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_NAK)
BYTE syncType; // eSYNC
KEYTYPE portalKey;
WORD mapEnterancePortalIndex;
PACKET_AG_INHERIT_CLOSE
//}__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
PACKET_AG_OPEN(AG_ZONE, AG_ZONE_CHANGE_MONSTER_ABILITY_CMD)
KEYTYPE roomKey;
WORD number_of_players;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_SPA_ENTER_SYN)
CODETYPE item_code;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_SPA_ENTER_ACK)
MAPCODE spa_mapcode;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_SPA_LEAVE_SYN)
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_SPA_LEAVE_ACK)
MAPCODE village_map_code;
PACKET_AG_CLOSE
//----------------------------------------------------------------------------------
// Party
//----------------------------------------------------------------------------------
// 파티 생성
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_CREATE_CMD )
WORD m_wPartykey;
DWORD m_MasterKey;
BYTE m_byItemDistributionType;
//_NA_20110630_BATTLE_ZONE_RENEWAL
ePARTY_TYPE m_PartyType;
PACKET_AG_CLOSE
// 파티 소멸
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_DESTROY_CMD )
WORD m_wPartykey;
PACKET_AG_CLOSE
// 파티 가입
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_JOIN_CMD )
WORD m_wPartykey;
bool m_bMaster;
_PARTY_MEMBER_INFO m_MemberInfo;
PACKET_AG_CLOSE
// 파티 탈퇴
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_LEAVE_CMD )
WORD m_wPartykey;
DWORD m_dwMemberKey;
PACKET_AG_CLOSE
// 파티장 변경
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_CHANGE_MASTER_CMD )
WORD m_wPartykey;
DWORD m_dwMemberKey;
PACKET_AG_CLOSE
// 파티 아이템분배 방식 변경
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_ITEM_DISTRIBUTION_CHANGE_CMD )
WORD m_wPartykey;
BYTE m_byItemDistributionType;
PACKET_AG_CLOSE
//__NA_0_20080416_PARTY_JOIN_PACKET_CHANGE [
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_JOIN_SYN )
//_NA_0_20100616_PARTY_JOIN_HOSTILITY_RELATION_BUG
enum
{
ENABLE_REQUEST = 0,
ENABLE_RESPONSE = 1,
};
DWORD m_dwFlag;
DWORD m_dwReqMemberKey;
DWORD m_dwRecvMemberKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_JOIN_ACK )
//_NA_0_20100616_PARTY_JOIN_HOSTILITY_RELATION_BUG
DWORD m_dwFlag;
DWORD m_dwReqMemberKey;
DWORD m_dwRecvMemberKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_JOIN_NAK )
//_NA_0_20100616_PARTY_JOIN_HOSTILITY_RELATION_BUG
DWORD m_dwFlag;
DWORD m_dwRecvMemberKey;
DWORD m_dwReqMemberKey;
DWORD m_dwErrorCode;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_LEAVE_BY_GUILDRELATION_SYN )
WORD m_wPartykey;
DWORD m_dwMemberKey;
BYTE m_bReason;
PACKET_AG_CLOSE
//__NA_0_20080416_PARTY_JOIN_PACKET_CHANGE ]
//{__NA001336_090514_PARTY_NAVI_SUPPORT__
PACKET_AG_INHERIT_OPEN(AG_PARTY, AG_PARTY_NAVI_INFO_BRD, MSG_CG_PARTY_NAVI_INFO_BRD)
inline WORD GetSize() const
{
const WORD MinSize = WORD(sizeof(*this) - sizeof(m_Nodes));
return MinSize + WORD(sizeof(Node)) * m_NumberOfNodes;
}
PACKET_AG_INHERIT_CLOSE
PACKET_AG_OPEN(AG_STATUS, AG_STATUS_CHAR_STAT_CHANGE_CMD)
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
enum eEvent { eEvent_None, eEvent_ChangedHP, eEvent_ChangedMP, eEvent_ChangedSD, eEvent_ChangedFP, eEvent_Count };
#else
enum eEvent { eEvent_None, eEvent_ChangedHP, eEvent_ChangedMP, eEvent_ChangedSD, eEvent_Count };
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
struct SharedInfo { BYTE event; WORD objectKey; };
union uNode {
struct HP : SharedInfo { DWORD maxHP, currentHP, reservedHP; } m_HP;
struct MP : SharedInfo { DWORD maxMP, currentMP; } m_MP;
struct SD : SharedInfo { DWORD maxSD, currentSD; } m_SD;
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
struct FP : SharedInfo { PLAYERFP maxFP, currentFP; } m_FP;
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
};
BYTE m_NumberOfNodes;
#ifdef _NA_007825_20141118_MODIFY_PARTY_CHARACTER_STATUSUPDATE
BYTE user_count_; // 이 패킷에 몇명의 유저정보가 들어있는가
#endif //_NA_007825_20141118_MODIFY_PARTY_CHARACTER_STATUSUPDATE
uNode m_Nodes[MAX_PARTYMEMBER_NUM*(eEvent_Count-1)]; // 한 사람이 HP,MP,SD세 정보를 모두 가지는 경우,
inline WORD GetSize() const
{
#ifdef _NA_007825_20141118_MODIFY_PARTY_CHARACTER_STATUSUPDATE
const WORD MinSize = WORD(sizeof(*this) - sizeof(m_Nodes)) + user_count_;
#else
const WORD MinSize = WORD(sizeof(*this) - sizeof(m_Nodes));
#endif //_NA_007825_20141118_MODIFY_PARTY_CHARACTER_STATUSUPDATE
return MinSize + WORD(sizeof(uNode)) * m_NumberOfNodes;
}
PACKET_AG_CLOSE
//}__NA001336_090514_PARTY_NAVI_SUPPORT__
//_NA_20110630_BATTLE_ZONE_RENEWAL
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_CAN_CHANGE_OPTION_SYN )
BasePartyRoomInfo party_room_info_;
WORD party_key_;
DWORD master_key_;
SLOTCODE require_item_;//파티룸 생성에 필요한 아이템
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_CAN_CHANGE_OPTION_ACK )
enum eStatus {
eStatus_PartialFail,// 해당 플레이어 정의되어 있지 않은 다른 이유로 실패
eStatus_PartialOk,// 해당 플레이어 제약 조건 통과
eStatus_Transaction,// 해당 플레이어 존 트랜잭션 (기타 상태 위배 Fail)
eStatus_LevelViolation,// 해당 플레이어 레벨 조건 위반
eStatus_RequireQuestClear,// 해당 플레이어 선행 Quest 완료 필요
eStatus_RequireMissionClear,// 해당 플레이어 선행 Mission 완료 필요
};
struct MemberState
{
WORD object_key_;
WORD status_;
};
RC::ePARTY_RESULT result_code_;
DWORD master_key_;
BasePartyRoomInfo party_room_info_;
BYTE number_of_partymember_;
MemberState member_state_[MAX_PARTYMEMBER_NUM];
inline void Clear()
{
result_code_ = RC::RC_PARTY_SUCCESS;
master_key_ = 0;
number_of_partymember_ = 0;
ZeroMemory(&member_state_, sizeof(member_state_));
}
inline WORD GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(member_state_);
return static_cast<uint16_t>(MinSize + sizeof(member_state_[0]) * number_of_partymember_);
}
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_CAN_CREATE_ROOM_SYN )
DWORD master_key_;
BasePartyRoomInfo party_room_info_;
SLOTCODE require_item_;//파티룸 생성에 필요한 아이템
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_CAN_CREATE_ROOM_ACK )
RC::ePARTY_RESULT result_code_;
DWORD master_key_;
BasePartyRoomInfo party_room_info_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_READY_STATE_SYN )
bool ready_state_;
WORD party_key_;
DWORD member_key_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_READY_STATE_ACK )
DWORD member_key_;
RC::ePARTY_RESULT result_code_;
bool ready_state_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_NOTIFY_PARTY_MEMBER_INFO_CMD )
WORD party_key_;
DWORD member_key_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_PARTYROOM_ITEM_DELETE_CMD )
DWORD member_key_;
SLOTCODE require_item_;
#ifdef _NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION
PartyZoneType party_zone_type_;
#endif //_NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_RESET_READY_STATE_CMD )
DWORD master_key_;
WORD party_key_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_CAN_JOIN_ROOM_SYN )
MAPCODE map_code_;
eZONETYPE party_room_type_;
WORD join_party_key_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_CAN_JOIN_ROOM_ACK )
RC::ePARTY_RESULT result_code_;
WORD join_party_key_;
DWORD request_user_key_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_PARTY, AG_PARTY_SEND_MEMBER_RENDER_INFO_CMD )
WORD request_party_key_;
DWORD request_user_key_;
DWORD target_user_key_;
PACKET_AG_CLOSE
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
PACKET_AG_OPEN( AG_PARTY, AG_CHAOS_ZONE_PACKET )
BYTE category_type;
PACKET_AG_CLOSE
//----------------------------------------------------------------------------------
// Status
//----------------------------------------------------------------------------------
// 레벨업
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_LEVEL_UP_CMD )
LEVELTYPE m_Level; // 업된 레벨
WORD m_wRemainStat; // 남은 스탯포인트
WORD m_wRemainSkill; // 남은 스킬포인트
DWORD m_dwCurHP; // 현재 HP(레벨업시 HP, MP를 채워준다.)
DWORD m_dwMaxMP; // 최대 MP
DWORD m_dwCurMP; // 현재 MP
DWORD m_dwMaxAndCurSD; // 현재 SD(레벨업시 SD를 Max로 채워준다.)
PACKET_AG_CLOSE
// HP 변화
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_MAXHP_CHANGE_CMD )
DWORD m_dwMaxHP;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_HP_CHANGE_CMD )
DWORD m_dwCurHP;
DWORD m_dwReserveHP;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_MP_CHANGE_CMD )
DWORD m_dwCurMP;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_DEAD_CMD )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_RESURRECTION_CMD )
DWORD m_dwCurHP;
DWORD m_dwCurMP;
DWORD m_dwCurSD;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_MAXMP_CHANGE_CMD )
DWORD m_dwMaxMP;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_MAXSD_CHANGE_CMD )
DWORD m_dwMaxSD;
PACKET_AG_CLOSE
// 내구도 감소
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_DECREASE_DURA_CMD )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_CHANGE_STATE_CMD )
ePLAYER_BEHAVE_STATE m_eBehaveState;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_PLAYING_TUTORIAL_CMD )
BOOL m_bIsPlayingTutorial;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_INTERCEPTION_SYN )
eINTERCEPTION_TYPE m_byInterceptionCode;
BOOL m_bRequestFlag;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_INTERCEPTION_ACK )
BYTE m_byInterceptionCode;
BOOL m_bRequestFlag;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_INTERCEPTION_NAK )
BYTE m_byInterceptionCode;
BYTE m_byErrorCode;
PACKET_AG_CLOSE
// declared by __NA_001359_20090619_HEIM_LOTTO_SYSTEM
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_LOTTO_REWARD_SYN )
CHARGUID m_CharGuid;
MONEY m_Prize;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_LOTTO_REWARD_ACK)
enum eRESULT_CODE {
RESULT_OK = 0,
ERROR_CHAR_NOT_ONLINE
};
INT32 m_iResult;
CHARGUID m_CharGuid;
MONEY m_Prize;
PACKET_AG_CLOSE
#ifdef _NA_0_20100115_HEIM_LOTTO_TICKET_PURCHASE
// 하임 로또 복권용지 직접 구입 요청
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_LOTTO_TICKET_PURCHASE_SYN )
CHARGUID iCharGuid; // 캐릭터 ID
WORD wDrawNum; // 회차
BYTE bAuto; // 자동 여부
BYTE bPickedNum[LOTTO_NUM_PICKS]; // 응모 번호
INT64 i64TicketPrice; // 복권용지 가격
PACKET_AG_CLOSE
// 하임 로또 복권용지 직접 구입 응답
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_LOTTO_TICKET_PURCHASE_ACK )
enum eRC_LOTTO_TICKET_PURCHASE
{
RESULT_OK = 0,
ERROR_NOT_ENOUGH_MONEY = 1,
ERROR_CHAR_NOT_ONLINE = 2
};
INT32 iResult; // 결과 코드
CHARGUID iCharGuid; // 캐릭터 ID
WORD wDrawNum; // 회차
BYTE bAuto; // 자동 여부
BYTE bPickedNum[LOTTO_NUM_PICKS]; // 응모 번호
PACKET_AG_CLOSE
#endif // _NA_0_20100115_HEIM_LOTTO_TICKET_PURCHASE
//__KR_001355_20090608_GROUPINGSYSTEM_GW
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_GROUP_ADDEXP_CMD )
CHARGUID m_CharGuid; // 캐릭터 Guid
EXPTYPE m_Amount; // 경험치량
TCHAR m_szCharName[MAX_CHARNAME_LENGTH+1];//Low memeber name
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_GROUP_ADDMONEY_CMD )
CHARGUID m_CharGuid; // 캐릭터 Guid
MONEY m_Amount; // 보너스 하임
TCHAR m_szCharName[MAX_CHARNAME_LENGTH+1];//Hight memeber name
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_GROUP_EXP_ACQUISITION_CMD )
CHARGUID m_CharGuid; // 캐릭터 ID
BYTE m_byAcquisitionType; // 획득 사유 (eHEIM_ACQUISITION_TYPE)
EXPTYPE m_Amount; // 경험치량
PACKET_AG_CLOSE
//__NA_0_20090627_HEIM_ACQUISITION_S2S_NOTIFICATION
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_HEIM_ACQUISITION_NTF )
CHARGUID m_CharGuid; // 캐릭터 ID
BYTE m_byAcquisitionType; // 획득 사유 (eHEIM_ACQUISITION_TYPE)
MONEY m_Amount; // 하임 금액
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_HEIM_CONSUMPTION_NTF )
CHARGUID m_CharGuid; // 캐릭터 ID
BYTE m_byConsumptionType; // 소비 사유 (eHEIM_CONSUMPTION_TYPE)
MONEY m_Amount; // 하임 금액
//_NA_0_20091119_HEIM_LOTTO_ACCUM_CTRL_BY_SHOP
int m_LottoAccumRatio; // 하임 행운 적립율
PACKET_AG_CLOSE
// __KR_001355_20090608_GROUPINGSYSTEM_GW
PACKET_AG_OPEN( AG_STATUS, AG_STATUS_GROUP_SET_MEMBERINFO_CMD )
CHARGUID m_CharGuid;
eGROUP_STAT m_HighGroupInfo;
eGROUP_STAT m_LowGroupInfo;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_STATUS, AG_USER_DOMINATION_RETURNHIEM_CMD )
CHARGUID m_CharGuid; // 캐릭터 Guid
eSYSTEM_MEMO_TYPE m_Type; // 타입
ULONGLONG m_TenderCost; // 입찰가 하임 | 왕의 증표
PACKET_AG_CLOSE
//----------------------------------------------------------------------------------
// GM 명령어
//----------------------------------------------------------------------------------
PACKET_AG_OPEN( AG_GM, AG_GM_TELEPORT_CMD )
WzVector m_vDestPos; // 이동시킬 위치
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_WHISPER_SET_CMD )
BOOL m_bOn; // FALSE: 귓말 끔 TRUE: 귓말 켬
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_USERCHAT_BLOCK_CMD )
//__NA_000313_20070223_REALTIME_CHAT_BLOCK
CHARGUID m_CharGuid; // 해당 사용자 CharGuid
BOOL m_bBlock; // FALSE: 채팅 허용 TRUE: 채팅 금지
DWORD m_dwBlockTime; // 채팅 금지일 경우 제한시간(분 단위)
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_ROOM_INFO_CMD ) //방정보
DWORD m_dwRoomKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_CHAR_INFO_CMD ) //캐릭터 정보
TCHAR m_szCharName[MAX_CHARNAME_LENGTH + 1];
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_CHAR_INFO_SYN ) //캐릭터 정보 요청
DWORD m_dwGMUserKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_CHAR_INFO_ACK ) //캐릭터 정보 요청
DWORD m_dwGMUserKey;
TCHAR 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; // 현재 위치
TCHAR m_szGuildName[MAX_GUILDNAME_LENGTH]; // 길드이름
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_CHAR_INFO_NAK ) //캐릭터 정보 요청 실패
BYTE m_byErrorCode;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_CHANNEL_INFO_CMD ) //채널정보 요청
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_CHANGE_ROOMTITLE_CMD ) //채널정보 요청
KEYTYPE m_dwRoomKey; // 방키
TCHAR m_szRoomTitle[MAX_ROOMTITLE_LENGTH]; // 바꿀 룸제목
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_FORCE_DISCONNECT_CMD ) // 사용자 강제 종료
TCHAR m_szCharName[MAX_CHARNAME_LENGTH+1]; // 종료시킬 캐릭터 이름
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_FORCE_DISCONNECT_SYN ) // 사용자 강제 종료
DWORD m_dwGMUserKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_FORCE_DISCONNECT_ACK ) // 사용자 강제 종료
DWORD m_dwGMUserKey;
DWORD m_dwDisconnectUserKey;
PACKET_AG_CLOSE
//몽앴실츰룐뵀 by:枷쟁팃숲 2021-06-28
PACKET_AG_OPEN( AG_GM, AG_GM_FORCE_BLOCKUSER_CMD )
TCHAR m_szCharName[MAX_CHARNAME_LENGTH+1];
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_FORCE_BLOCKUSER_SYN )
DWORD m_dwGMUserKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_FORCE_BLOCKUSER_ACK )
DWORD m_dwGMUserKey;
DWORD m_dwDisconnectUserKey;
PACKET_AG_CLOSE
/*********************************************************************/
PACKET_AG_OPEN( AG_GM, AG_GM_SERVER_SHUTDOWN_CMD ) // 사용자 강제 종료
DWORD m_dwStringCode;
BYTE m_byShutdownTime;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_GO_CMD )
TCHAR m_szCharName[MAX_CHARNAME_LENGTH+1]; // 이동시킬 대상이름(본인이 될 수도 있음)
KEYTYPE m_RoomKey; // 방번호(0이면 필드간 이동임)
FIELDCODE m_FieldCode; // 필드코드
WzVector m_vCurPos; // 현재 좌표
WzVector m_vDestPos; // 이동하고자하는 목적지 좌표
BYTE m_PortalType; // ePORTAL_TYPE
POSTYPE m_atItemPos;
SLOTCODE m_atItemCode; // 해당 포지션의 아이템.
BOOL IsRevenge() { return m_PortalType == ePORTAL_TYPE_REVENGE; }
BOOL IsFriendInvitatedEvent() { return m_PortalType == ePORTAL_TYPE_FIRENDINVITATED_EVENT; }
BOOL IsItem() { return (m_PortalType == ePORTAL_TYPE_ITEM || m_PortalType == ePORTAL_TYPE_ITEM_EX); }
PACKET_AG_CLOSE
//추적
PACKET_AG_OPEN( AG_GM, AG_GM_TRACKING_CMD )
WzVector m_vCurPos;
TCHAR m_szCharName[MAX_CHARNAME_LENGTH+1];
BYTE m_PortalType;
POSTYPE m_atItemPos;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_TRACKING_REQUEST_INFO_SYN )
WzVector m_vCurPos;
TCHAR m_szGMCharName[MAX_CHARNAME_LENGTH+1];
BYTE m_PortalType;
POSTYPE m_atItemPos;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_NOTICE_CMD)
eNOTICE_TYPE m_eType;
WORD m_wLen;
TCHAR m_tszNoticeMsg[MAX_NOTICE_LEN + 1];
uint16 GetSize() const
{ // CHANGES: f101210.2L
const size_t kMinSize = sizeof(*this) - sizeof(m_tszNoticeMsg);
return static_cast<uint16_t>(kMinSize + m_wLen * sizeof(m_tszNoticeMsg[0]));
}
PACKET_AG_CLOSE
// declared by __NA_001359_20090619_HEIM_LOTTO_SYSTEM
PACKET_AG_OPEN( AG_GM, AG_GM_LOTTO_NUM_CMD )
DWORD dwUserKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_LOTTO_SETTLE_CMD )
DWORD dwUserKey;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_LOTTO_FUND_CMD )
DWORD user_key;
INT64 amount_delta;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GM, AG_GM_DOMINATION_INIT_CMD )
enum {time = 0, observer = 1};
BYTE m_flag; // 0:시간 이벤트, 1:gm observer
BOOL m_bMode;
sDOMINATION_EVENT_INFO m_Info;
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_GM, AG_GM_GUILD_RANKING_REFRESH)
PACKET_AG_CLOSE
// _NA_006620_20130402_GM_BATTLE_GROUND_EVENT_GAME
PACKET_AG_OPEN(AG_GM, AG_GM_BATTLE_GROUND_CMD)
int cmd_mode;
ChaosZoneTeam team_key;
CHARGUID char_guid;
KEYTYPE zone_key;
char gm_cmd_str[100+1];
#ifdef _NA_007191_20140428_MODIFY_GM_COMMAND
MAPCODE map_code;
#endif //_NA_007191_20140428_MODIFY_GM_COMMAND
PACKET_AG_CLOSE
//_NA_008334_20150608_SONNENSCHEIN
PACKET_AG_OPEN(AG_GM, AG_GM_SONNENSCHEIN_CMD)
char gm_cmd[16];
PACKET_AG_CLOSE
// _NA_008543_20151027_ONE_DAYS_GUILD_MISSION
PACKET_AG_OPEN(AG_GM, AG_GM_ONEDAYSGUILDMISSION_CMD)
char gm_cmd[16];
PACKET_AG_CLOSE
//----------------------------------------------------------------------------------
// GUILD 관련 프로토콜
//----------------------------------------------------------------------------------
PACKET_AG_OPEN( AG_GUILD, AG_GUILD_CREATE_ACK )
GUILDGUID m_GuildGuid;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GUILD, AG_GUILD_DESTROY_ACK )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GUILD, AG_GUILD_JOIN_SUCCESS_CMD )
GUILDGUID m_GuildGuid;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_GUILD, AG_GUILD_WITHDRAW_ACK )
PACKET_AG_CLOSE
// 길드원 강제탈퇴
PACKET_AG_OPEN( AG_GUILD, AG_GUILD_KICKPLAYER_ACK )
TCHAR m_ptszCharName[MAX_CHARNAME_LENGTH+1];
CHARGUID m_CharGuid; // 탈퇴시'킨' CharGuid
PACKET_AG_CLOSE
//----------------------------------------------------------------------------------
// AG_CHUNTING 관련 프로토콜
//----------------------------------------------------------------------------------
PACKET_AG_OPEN( AG_CHUNTING, AG_CHUNTING_ENTER_TEAM_CMD )
KEYTYPE m_RoomKey;
BYTE m_byReadyPlayerNum; // 입장하려는 플레이어 수
GUILDGUID m_GuildGuid;
DWORD m_UserKeyList[CHUNTING_MAX_MEMBER_NUM];
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(m_UserKeyList);
return static_cast<uint16_t>(kMinSize + sizeof(m_UserKeyList[0]) * m_byReadyPlayerNum);
};
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CHUNTING, AG_CHUNTING_WIN_CMD )
DWORD m_WinCount; // 경쟁헌팅 총 승리횟수
DWORD m_TotCount; // 경쟁헌팅 총 전적
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CHUNTING, AG_CHUNTING_START_COMPETITION_CMD )
DWORD m_TotCount; // 경쟁헌팅 총 전적
PACKET_AG_CLOSE
//----------------------------------------------------------------------------------
// AG_MISSION 관련 프로토콜
//----------------------------------------------------------------------------------
PACKET_AG_OPEN(AG_MISSION, AG_MISSION_STREAM_CMD)
MISSION_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_AG_CLOSE
PACKET_AG_OPEN( AG_MISSION, AG_MISSION_CLEAR_CMD )
BYTE m_MissionNo;
PACKET_AG_CLOSE
//----------------------------------------------------------------------------------
// AG_CHAO 관련 프로토콜
//----------------------------------------------------------------------------------
// 리벤지(나쁜친구) 리스트 추가 요청
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_ADD_REVENGE_CHAR_SYN )
TCHAR m_ptszRevengeName[MAX_CHARNAME_LENGTH+1]; // 리벤지 리스트에 추가할 대상 Name
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_ADD_REVENGE_CHAR_ACK )
DWORD m_dwRevengeCharGuid;
TCHAR m_ptszRevengeName[MAX_CHARNAME_LENGTH+1];
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_ADD_REVENGE_CHAR_NAK )
DWORD m_dwCharGuid; // 요청하는 본인 CharGuid
BYTE m_byErrorCode; // eREVENGE_RESULT 참고
PACKET_AG_CLOSE
// 리벤지 정보 요청
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_REQUEST_REVENGEINFO_SYN )
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_REQUEST_REVENGEINFO_ACK )
BYTE m_byRevengePoint; // 남은 Revenge Point
BYTE m_byRevengeStatNum; // 등록된 캐릭터 수
STRUCT_REVENGE_INFO m_sRevengeUserInfo[MAX_REVENGE_STAT_NUM]; // 등록된 캐릭터 목록
uint16_t GetSize() const {
const size_t kMinSize = sizeof(*this) - sizeof(m_sRevengeUserInfo);
return static_cast<uint16_t>(kMinSize + sizeof(m_sRevengeUserInfo[0]) * m_byRevengeStatNum);
};
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_REQUEST_REVENGEINFO_NAK )
DWORD m_dwCharGuid; // 요청하는 본인 CharGuid
BYTE m_byErrorCode; // eREVENGE_RESULT 참고
PACKET_AG_CLOSE
// 리벤지 정보 삭제 - 유저가 선택(A->G)
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_REMOVE_REVENGE_CHAR_CMD )
DWORD m_dwRevengeCharGuid; // 삭제할 리벤지(나쁜친구) CharGuid
PACKET_AG_CLOSE
// 리벤지 성공 - 해당 정보 삭제 요청(G->A)
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_REMOVE_REVENGE_CHAR_SYN )
DWORD m_dwRevengeCharGuid; // 삭제할 리벤지(나쁜친구) CharGuid
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_REMOVE_REVENGE_CHAR_ACK )
DWORD m_dwRevengeCharGuid; // 삭제할 리벤지(나쁜친구) CharGuid
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_REMOVE_REVENGE_CHAR_NAK )
DWORD m_dwCharGuid; // 요청하는 본인 CharGuid
BYTE m_byErrorCode; // eREVENGE_RESULT 참고
PACKET_AG_CLOSE
// 카오상태 변경
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_CHANGE_CHAO_STATE_CMD )
DWORD m_dwObjKey;
BYTE m_byChaoState; // 카오상태(eCHAO_STATE)
PACKET_AG_CLOSE
// 리벤지 대상 추적 성공
PACKET_AG_OPEN( AG_CHAO, AG_CHAO_TRACK_REVENGE_CHAR_ACK )
POSTYPE m_atItemPos; // 복수의 돌 위치
PACKET_AG_CLOSE
//----------------------------------------------------------------------------------
// AG_ITEM 관련 프로토콜
//----------------------------------------------------------------------------------
// 아이템을 이용한 좌표이동 성공
PACKET_AG_OPEN( AG_ITEM, AG_ITEM_PORTAL_ACK )
POSTYPE m_PortalPos;
SLOTCODE m_ItemCode;
PACKET_AG_CLOSE
// 스페셜 아이템 소유 변경
PACKET_AG_OPEN( AG_ITEM, AG_ITEM_CHANGE_SPECIAL_ITEM_OWN_CMD )
BYTE m_Apply;
WORD m_ItemType;
WORD m_Count;
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_ITEM, AG_ITEM_UNLOCK_CMD)
// (f100528.2L) prevent a locked state after an instance dungeon moving transaction failed
enum ePostAction {
eAction_None = 0,
eAction_MoveFailed, // cancel an operation if the player plan on leave
eAction_Counts
};
SLOTIDX m_ItemIndex;
POSTYPE m_ItemPos;
uint8_t post_action_;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ITEM, AG_ITEM_DECREASE_UNLOCK_CMD )
SLOTIDX m_ItemIndex;
POSTYPE m_ItemPos;
PACKET_AG_CLOSE
//
PACKET_AG_OPEN(AG_ITEM, AG_ITEM_USE_DECREE_ITEM_SYN)
CHARGUID m_CharGuid;
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_ITEM, AG_ITEM_USE_DECREE_ITEM_ACK)
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_ITEM, AG_ITEM_USE_DECREE_ITEM_NAK)
BYTE m_byErrorCode;
PACKET_AG_CLOSE
#ifdef _NA_20101011_HEIM_LOTTO_CASH_TICKET
// G->A 하임행운 캐시 응모권 사용 요청
PACKET_AG_OPEN(AG_ITEM, AG_ITEM_USE_HEIM_LOTTO_TICKET_SYN)
CHARGUID char_guid; // 캐릭터 ID
SLOTIDX index;
POSTYPE pos;
PACKET_AG_CLOSE
// A->G 하임행운 캐시 응모권 사용 응답
PACKET_AG_OPEN(AG_ITEM, AG_ITEM_USE_HEIM_LOTTO_TICKET_ACK)
WORD result_code; // 결과 코드 : eITEM_RESULT
CHARGUID char_guid; // 캐릭터 ID
SLOTIDX index;
POSTYPE pos;
PACKET_AG_CLOSE
#endif // _NA_20101011_HEIM_LOTTO_CASH_TICKET
//----------------------------------------------------------------------------------
// AG_INSTANCE 관련 프로토콜
//----------------------------------------------------------------------------------
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_CAN_CREATE_INSTANCE_DUNGEON_SYN )
POSTYPE m_ItemPos;
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_CAN_CREATE_INSTANCE_DUNGEON_ACK )
MAPCODE m_MapCode;
BOOL m_UseCharge; // 캐시 사용여부 필드였지만, 재정의한다. 시간 제약 없는 경우의 플랙
PACKET_AG_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_CAN_CREATE_INSTANCE_DUNGEON_NAK )
enum eRet { eErr_ItemRC, eErr_RoomRC };
BYTE m_ErrorKind;
DWORD m_dwErrorCode;
PACKET_AG_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_CAN_CREATE_TOP_OF_TRIAL_SYN, MSG_AG_ZONE_CAN_CREATE_INSTANCE_DUNGEON_SYN )
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_CAN_CREATE_TOP_OF_TRIAL_ACK, MSG_AG_ZONE_CAN_CREATE_INSTANCE_DUNGEON_ACK )
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_CAN_CREATE_TOP_OF_TRIAL_NAK, MSG_AG_ZONE_CAN_CREATE_INSTANCE_DUNGEON_NAK )
PACKET_AG_INHERIT_CLOSE
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_INSTANCE_CREATE_CMD)
MAPCODE m_MapCode;
KEYTYPE m_RoomKey;
BYTE m_TypeOfIndun;
BASE_ROOMINFO m_RoomInfo; //< 생성할 방 정보
#ifdef _NA_004204_20120131_BATTLE_ZONE_PARTY_OBTAIN
PartyZoneType party_zone_info_;
#endif //_NA_004204_20120131_BATTLE_ZONE_PARTY_OBTAIN
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
ChaosZoneType chaos_zone_type_;
PACKET_AG_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_CAN_CREATE_100LEVEL_QUEST_MISSION_SYN, MSG_CG_ZONE_EX_CAN_CREATE_100LEVEL_QUEST_MISSION_SYN )
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN( AG_ZONE, AG_ZONE_CAN_JOIN_100LEVEL_QUEST_MISSION_ACK, MSG_CG_ZONE_EX_CAN_JOIN_100LEVEL_QUEST_MISSION_ACK )
PACKET_AG_INHERIT_CLOSE
//_NA_20110630_BATTLE_ZONE_RENEWAL
PACKET_AG_OPEN(AG_ZONE, AG_ZONE_CAN_CREATE_ROOM_OF_PARTY_SYN)
WORD party_key_;
MAPCODE map_code_;
PartyZoneType party_room_type_;
SLOTCODE require_item_;//파티룸 생성에 필요한 아이템
PACKET_AG_CLOSE
PACKET_AG_OPEN(AG_ZONE, AG_ZONE_CAN_CREATE_ROOM_OF_PARTY_ACK)
enum eResult {
eResult_NoMemberFail,// 플레이어 검사 자체를 못한 상황임.
eResult_InvalidMap,// 요청된 맵이 없거나 입장가능 타입이 아니다.
eResult_CheckedMembers,// 해당 플레이어들의 검사까지 수행했다.
eResult_FailCheckTerms,//필요 아이템이 룸 생성 조건에 맞지 않다.
eResult_RequireQuestClear,//선행 퀘스트를 진행해야 한다.
eResult_RequireMissionClear,//선행 미션을 진행해야 한다.
};
enum eStatus {
eStatus_PartialFail,// 해당 플레이어 정의되어 있지 않은 다른 이유로 실패
eStatus_PartialOk,// 해당 플레이어 제약 조건 통과
eStatus_Transaction,// 해당 플레이어 존 트랜잭션 (기타 상태 위배 Fail)
eStatus_LevelViolation,// 해당 플레이어 레벨 조건 위반
eStatus_RequireQuestClear,// 해당 플레이어 선행 Quest 완료 필요
eStatus_RequireMissionClear,// 해당 플레이어 선행 Mission 완료 필요
};
struct MemberInfo
{
WORD object_key_;
WORD status_;
};
BYTE result_value_;
MAPCODE map_code_;
WORD party_key_;
BYTE number_of_partymember_;
bool is_cash_item_;
SLOTCODE require_item_;
MemberInfo member_info_[MAX_PARTYMEMBER_NUM];
inline void Clear()
{
result_value_ = eResult_NoMemberFail;
map_code_ = 0;
party_key_ = 0;
number_of_partymember_ = 0;
is_cash_item_ = 0;
ZeroMemory(&member_info_, sizeof(member_info_));
}
inline WORD GetSize() const
{
const size_t MinSize = sizeof(*this) - sizeof(member_info_);
return static_cast<uint16_t>(MinSize + sizeof(member_info_[0]) * number_of_partymember_);
}
PACKET_AG_INHERIT_CLOSE
//{__NA001281_BATTLEZONE_ENTER_CONSTRAINTS_CHANGE_IN_LOBBY__
PACKET_AG_OPEN(AG_ZONE, AG_ZONE_CAN_CREATE_ROOM_SYN)
enum eCheckMethod {
eCheck_None ,
eCheck_Party = eCheck_None, // 파티 기준 파티원들의 제약조건 검사
eCheck_Members , // 첨부되는 플레이어들의 제약 조건 검사
};
enum eResult {
eResult_NoMemberFail , // 플레이어 검사 자체를 못한 상황임.
eResult_InvalidMap , // 요청된 맵이 없거나 입장가능 타입이 아니다.
eResult_CheckedMembers , // 해당 플레이어들의 검사까지 수행했다.
};
enum eStatus {
eStatus_PartialFail , // 해당 플레이어 정의되어 있지 않은 다른 이유로 실패
eStatus_PartialOk , // 해당 플레이어 제약 조건 통과
eStatus_Transaction , // 해당 플레이어 존 트랜잭션 (기타 상태 위배 Fail)
eStatus_LevelViolation , // 해당 플레이어 레벨 조건 위반
eStatus_RequireQuestClear , // 해당 플레이어 선행 Quest 완료 필요
eStatus_RequireMissionClear , // 해당 플레이어 선행 Mission 완료 필요
};
struct MemberInfo
{
WORD objectKey;
WORD status; // eResult
};
struct CheckArgParty
{
// SYN->ACK passing arg: GameServer는 해당 파티대상으로 MemberResult를 구축한다.
WORD partyKey;
};
struct CheckArgMembers : public CheckArgParty
{
// {partyKey, roomKey} Member들의 조사대상. 해당 (파티원/존) 목록에서 검사 수행.
WORD roomKey; // SYN->ACK passing arg
// 반드시 해당 배열(members)를 초기화 하고 설정할 것. 0이면 end
MemberInfo members[max(MAX_FIELD_PARTYMEMBER_NUM, MAX_PARTYMEMBER_NUM)];
};
//////////////////////////////////////////////////////////////////////////
BYTE m_CheckMethod; // eCheckMethod 검사 방법
BYTE m_Result; // eResult
MAPCODE m_MapCode; // Enter MapCode
union
{
CheckArgParty m_CheckArgParty;
CheckArgMembers m_CheckArgMembers;
};
inline void Clear()
{
m_CheckMethod = eCheck_None;
m_Result = eResult_NoMemberFail;
m_MapCode = 0;
const size_t argSize = max(sizeof(m_CheckArgParty), sizeof(m_CheckArgMembers));
ZeroMemory(&m_CheckArgMembers, argSize);
}
inline WORD GetSize() const
{
const size_t MinSize = sizeof(*this) - max(sizeof(m_CheckArgParty), sizeof(m_CheckArgMembers));
if(m_CheckMethod == eCheck_Members)
{
return WORD(sizeof(*this));
}
if(m_CheckMethod == eCheck_Party)
{
//gamelulu's note : 기존 Party관련 부분 처리가 없었다. 엄밀히 Member부분 체크에 있어서도
//정확한 가변 패킷은 아닌 상태지만 좀더 살펴볼 필요가 있어서 기존 로직과 동일하게 처리
return WORD(sizeof(*this));
}
return WORD(MinSize); // Assert Violation...
}
PACKET_AG_CLOSE
PACKET_AG_INHERIT_OPEN(AG_ZONE, AG_ZONE_CAN_CREATE_ROOM_ACK, MSG_AG_ZONE_CAN_CREATE_ROOM_SYN)
// Ack도 SYN내용과 동일하게 처리한다. 개별 조건으로 보내므로 m_CheckMethod == eCheck_Members;
inline WORD GetSize() const { return MSG_AG_ZONE_CAN_CREATE_ROOM_SYN::GetSize(); }
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN(AG_ZONE, AG_ZONE_LOBBY_CREATE_SYN, MSG_CG_ZONE_LOBBY_CREATE_SYN)
inline WORD GetSize() const { return WORD(sizeof(*this)); }
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN(AG_ZONE, AG_ZONE_LOBBY_CREATE_ACK, MSG_AG_ZONE_LOBBY_CREATE_SYN)
RC::eROOM_RESULT m_1stCheckResultInGameServer;
inline WORD GetSize() const { return WORD(sizeof(*this)); }
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN(AG_ZONE, AG_ZONE_LOBBY_JOIN_SYN, MSG_CG_ZONE_LOBBY_JOIN_SYN)
MAPCODE m_MapCode; // by Agent Setting
inline WORD GetSize() const { return WORD(sizeof(*this)); }
PACKET_AG_INHERIT_CLOSE
PACKET_AG_INHERIT_OPEN(AG_ZONE, AG_ZONE_LOBBY_JOIN_ACK, MSG_AG_ZONE_LOBBY_JOIN_SYN)
RC::eROOM_RESULT m_1stCheckResultInGameServer;
inline WORD GetSize() const { return WORD(sizeof(*this)); }
PACKET_AG_INHERIT_CLOSE
//}__NA001281_BATTLEZONE_ENTER_CONSTRAINTS_CHANGE_IN_LOBBY__
PACKET_AG_OPEN(AG_ZONE, AG_ZONE_CHECK_MISSION_ROOM_LIST_SYN)
enum { kMaxRoomCount = 40 };
BYTE current_room_count_;
MISSION_ROOMINFO room_info_list_[kMaxRoomCount];
int GetSize() const
{
return sizeof(*this) - (kMaxRoomCount - current_room_count_) * sizeof(MISSION_ROOMINFO);
}
PACKET_AG_CLOSE
PACKET_AG_INHERIT_OPEN(AG_ZONE, AG_ZONE_CHECK_MISSION_ROOM_LIST_ACK, MSG_AG_ZONE_CHECK_MISSION_ROOM_LIST_SYN)
PACKET_AG_INHERIT_CLOSE
#ifdef _NA_006826_20130722_DOMINATION_RENEWAL
PACKET_AG_OPEN( AG_ZONE, AG_ZONE_DOMINATION_NOTIFIER_BRD )
GUILDGUID win_guild_guid; // 승
GUILDGUID lose_guild_guid; // 패
MAPCODE map_code; // 점령지역
char win_guild_name[MAX_GUILDNAME_LENGTH+1];
uint16_t GetSize() const {
return sizeof(*this);
};
PACKET_AG_CLOSE
#endif // _NA_006826_20130722_DOMINATION_RENEWAL
PACKET_AG_INHERIT_OPEN( AG_EVENT, AG_EVENT_BUFF_EVENT_TIME_CONTROL_SYN, MSG_CG_ETC_BUFF_EVENT_TIME_CONTROL_BRD )
PACKET_AG_INHERIT_CLOSE
//W->A 초대한 캐릭터 목록 (가변)
//_KR_0_20091021_FIRENDINVITATION_EXTEND
PACKET_AG_OPEN( AG_EVENT, AG_EVENT_FRIENDINVITATE_INVITATELIST_CMD)
INVITATEFRIENDLIST_INFO m_InvitateFriendListInfo;
WORD GetSize() const
{ // (CHANGES) (f100624.2L)
const WORD kMinSize = sizeof(*this) - sizeof(m_InvitateFriendListInfo);
return static_cast<WORD>(kMinSize + m_InvitateFriendListInfo.GetSize());
//return ( sizeof(MSG_AW_EVENT_FRIENDINVITATE_INVITATELIST_CMD) - ( (MAX_FRIEND_STAT_NUM - m_InvitateFriendListInfo.m_byListCount) * sizeof(DWORD) ) );
}
PACKET_AG_INHERIT_CLOSE
//_KR_0_20091021_FIRENDINVITATION_EXTEND
PACKET_AG_OPEN( AG_EVENT, AG_EVENT_RECALL_ACK) //에인전트에서 게임 서버로 리콜 결과를 전송
CHARGUID CalleeGUID;
PACKET_AG_INHERIT_CLOSE
//_KR_0_20091021_FIRENDINVITATION_EXTEND
PACKET_AG_OPEN( AG_EVENT, AG_EVENT_RECALL_NAK) //에인전트에서 게임 서버로 리콜 결과를 전송
BYTE ErrorCode;
PACKET_AG_INHERIT_CLOSE
//_NA_20100812_INTEGRATE_SYSTEM_MEMO_DOMINATION
PACKET_AG_OPEN( AG_EVENT, AG_EVENT_SYSTEMMEMO_SEND_CMD)
DWORD system_memo_list_num_;//시스템 메모 갯수
BasicSystemMemoInfo system_memo_info_[MAX_SYSTEM_MEMO_LIST];//시스템 메모 정보 리스트
DWORD GetSize() const
{
assert(system_memo_list_num_ <= _countof(system_memo_info_));
return (sizeof(*this) - sizeof(system_memo_info_)) + //고정 크기
(sizeof(system_memo_info_[0]) * system_memo_list_num_);//가변 크기
}
#ifdef _NA_008012_20150204_SUN_RANKING_SYSTEM
void Clear()
{
system_memo_list_num_ = 0;
memset(system_memo_info_, 0, sizeof(BasicSystemMemoInfo) * _countof(system_memo_info_));
}
#endif // _NA_008012_20150204_SUN_RANKING_SYSTEM
PACKET_AG_INHERIT_CLOSE
#ifdef _NA_003027_20111013_HONOR_SYSTEM
PACKET_AG_OPEN( AG_EVENT, AG_EVENT_TODAYQUEST_INFO_BRD )
WORD count_;
QUEST_TODAY_QUEST_INFO today_quest_info[MAX_TODAYQUEST_COUNT];
PACKET_AG_CLOSE
#endif //_NA_003027_20111013_HONOR_SYSTEM
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//
// <PACKET BROADCAST FUNCTIONs>
//
//
//
#include <VarPacket.h>
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 전송시 사용하는 패킷 형태 (고정 패킷 입력시)
//
template<typename _TYPE>
struct MSG_PACKET_BROADCASTER_ONEtoN : MSG_BASE_FORWARD
{
MSG_PACKET_BROADCASTER_ONEtoN() { Init(); }
//////////////////////////////////////////////////////////////////////////
// <FIELDs>
enum { MAX_USER_COUNT = 255 };
BYTE m_byUserCount;
WORD msgBODY_SZ;
_TYPE msgBODY;
DWORD m_dwUserKeys[MAX_USER_COUNT];
//////////////////////////////////////////////////////////////////////////
// <METHODs>
inline VOID Init()
{
m_byCategory = AG_CONNECTION;
m_byProtocol = AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN;
m_byUserCount = 0;
msgBODY_SZ = (WORD)sizeof(msgBODY);
}
inline DWORD AddUser( DWORD dwUserKey )
{
if( MAX_USER_COUNT == m_byUserCount )
return 0;
m_dwUserKeys[m_byUserCount++] = dwUserKey;
return (DWORD)m_byUserCount;
}
inline WORD GetSize()
{
const WORD SZofBASE_ZEROUSER = sizeof(*this) - sizeof(m_dwUserKeys);
return SZofBASE_ZEROUSER + (WORD)(sizeof(DWORD)*m_byUserCount);
}
//inline WORD GetRecvSize()
//{
// // type size
// const WORD cwSize = sizeof(MSG_BASE_FORWARD) + sizeof(msgBODY_SZ) + sizeof(m_byUserCount);
// WORD SZofSENDINGMSG = cwSize + (WORD)(msgBODY_SZ + sizeof(DWORD)*m_byUserCount);
// return SZofSENDINGMSG;
//}
};
//==================================================================================================
//==================================================================================================
//==================================================================================================
// CHANGES: f110601.1L, remove the broadcast upper boundary limitation using 1toN broadcaster
PACKET_AG_OPEN(AG_CONNECTION, AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN)
enum { MAX_USER_COUNT = 5000, };
struct MsgBodyInfo
{
MSG_BASE_FORWARD* msg_send;
uint16_t msg_send_size;
uint16_t number_of_users;
// NOTE: f080704.x, waverix, changes user_key to object_key
// changed by __NA000000_0806XX_CODE_REFINE_FOR_PERFORMANCE_TUNEUP_NO04__
uint16_t* user_object_keys;
};
//
uint16_t number_of_users;
uint16_t msg_body_size;
// msg_body stream[msg_body_size]
// - alignment
// user key stream[number_of_users]
//
void Init(MSG_BASE_FORWARD* msg, uint16_t msg_size);
void InitByArray(uint8_t** msg_array, uint16_t* msg_size_array, ulong number_of_arrays);
// Init, InitByArray 이후, AddUser호출 이전에 추가시키는 방식이다.
void AppendMsg(uint8_t* msg, uint16_t msg_size);
MSG_BASE_FORWARD* GetBrdPacketPtr();
uint16_t* GetUsersStartPtr();
uint16_t AddUser(uint16_t* const user_begin, DWORD object_key);
uint16_t GetSendingSize() const;
// <패킷 수신시 사용하는 METHOD>
// <returns>
// size of variable msg - <WARNING> 이 값을 실제 수신된 값과 비교해서 일치하지 않으면 처리해선 안된다.
// MsgBodyInfo.msg_send = BROADCASTING MSG
// MsgBodyInfo.msg_send_size = BROADCASTING MSG SIZE
uint16_t GetPacketInfo(MsgBodyInfo* result_info) const;
PACKET_AG_CLOSE;
//==================================================================================================
inline void MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN::Init(
MSG_BASE_FORWARD* msg, uint16_t msg_size)
{
m_byCategory = AG_CONNECTION;
m_byProtocol = AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN;
number_of_users = 0;
msg_body_size = msg_size;
CopyMemory(GetBrdPacketPtr(), msg, msg_size);
}
inline void MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN::InitByArray(
uint8_t** msg_array, uint16_t* msg_size_array, ulong number_of_arrays)
{
m_byCategory = AG_CONNECTION;
m_byProtocol = AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN;
number_of_users = 0;
msg_body_size = 0;
uint8_t* offset = reinterpret_cast<uint8_t*>(GetBrdPacketPtr());
for (ulong index = 0; index < number_of_arrays; ++index, ++msg_array, ++msg_size_array)
{
uint16_t msg_size = *msg_size_array;
msg_body_size += msg_size;
CopyMemory(offset, *msg_array, msg_size);
offset += msg_size;
};
}
inline void MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN::AppendMsg(
uint8_t* msg, uint16_t msg_size)
{
uint8_t* writing_pos = reinterpret_cast<uint8_t*>((uint16_t*)(&msg_body_size) + 1);
; writing_pos += msg_body_size;
CopyMemory(writing_pos, msg, msg_size);
msg_body_size += msg_size;
}
inline MSG_BASE_FORWARD* MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN::GetBrdPacketPtr()
{
MSG_BASE_FORWARD* offset = reinterpret_cast<MSG_BASE_FORWARD*>((uint16_t*)(&msg_body_size) + 1);
return offset;
}
inline uint16_t* MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN::GetUsersStartPtr()
{
uint16_t* user_begin = reinterpret_cast<uint16_t*>(
reinterpret_cast<uint8_t*>(GetBrdPacketPtr()) + msg_body_size);
return user_begin;
}
inline uint16_t MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN::AddUser(
uint16_t* const user_begin, DWORD object_key)
{
if (number_of_users == MAX_USER_COUNT) {
return 0;
};
user_begin[number_of_users++] = static_cast<uint16_t>(object_key);
return number_of_users;
}
inline uint16_t MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN::GetSendingSize() const
{
const size_t kMinSize = sizeof(*this);
size_t total_size = kMinSize + msg_body_size + (sizeof(uint16_t) * number_of_users);
return static_cast<uint16_t>(total_size);
}
inline uint16_t MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN::GetPacketInfo(
MsgBodyInfo* result_info) const
{
const size_t kMinSize = sizeof(*this);
ZeroMemory(result_info, sizeof(*result_info));
uint8_t* offset = reinterpret_cast<uint8_t*>((uint16_t*)(&msg_body_size) + 1);
result_info->msg_send = reinterpret_cast<MSG_BASE_FORWARD*>(offset);
result_info->msg_send_size = msg_body_size;
offset += msg_body_size;
result_info->number_of_users = number_of_users;
result_info->user_object_keys = reinterpret_cast<uint16_t*>(offset);
size_t total_msg_size = kMinSize + msg_body_size;
; total_msg_size += (sizeof(uint16_t) * number_of_users);
return static_cast<uint16_t>(total_msg_size);
}
//==================================================================================================
#if SUN_CODE_BACKUP
//==================================================================================================
// 송/수신시 사용하는 패킷 형태 (가변 패킷)
// 송신시 패킷은 특정 버퍼를 기준으로 사용해야 한다.
PACKET_AG_OPEN( AG_CONNECTION, AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN )
//////////////////////////////////////////////////////////////////////////
// <FIELDs>
enum { MAX_USER_COUNT = 255 };
struct MSG_INFO
{
MSG_BASE_FORWARD* pMSG_BODY;
WORD wSIZE;
WORD wUSER_COUNT;
DWORD* pUSERs; // (WAVERIX)(080704) - UserKey가 아니라 ObjectKey로 변경 <-__NA000000_0806XX_CODE_REFINE_FOR_PERFORMANCE_TUNEUP_NO04__ 적용시
};
BYTE m_byUserCount;
WORD msgBODY_SZ;
// ~~
// ~~
// <패킷 제작시 사용하는 METHODs>
inline VOID Init( MSG_BASE_FORWARD* pMsg, WORD wBrdPacketSize )
{
m_byCategory = AG_CONNECTION;
m_byProtocol = AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN;
m_byUserCount = 0;
msgBODY_SZ = wBrdPacketSize;
CopyMemory( GetBrdPacketPtr(), pMsg, msgBODY_SZ );
}
inline VOID InitByArray( BYTE** ppMsg, WORD* pwBrdPacketSize, DWORD dwMsgArrayCnt )
{
m_byCategory = AG_CONNECTION;
m_byProtocol = AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN;
m_byUserCount = 0;
msgBODY_SZ = 0;
BYTE* pOffset = (BYTE*)GetBrdPacketPtr();
for( DWORD i=0 ; i<dwMsgArrayCnt ; ++i )
{
WORD wSize = pwBrdPacketSize[i];
msgBODY_SZ += wSize;
CopyMemory( pOffset, ppMsg[i], wSize );
pOffset += wSize;
}
}
// Init, InitByArray 이후, AddUser호출 이전에 추가시키는 방식이다.
inline VOID AppendMsg( BYTE* const pMsg, const WORD msg_size )
{
BYTE* pIt = (BYTE*)(((WORD*)&msgBODY_SZ)+1);
pIt += msgBODY_SZ;
CopyMemory( pIt, pMsg, msg_size );
msgBODY_SZ += msg_size;
}
inline MSG_BASE_FORWARD* GetBrdPacketPtr()
{
MSG_BASE_FORWARD* pOFFSET = (MSG_BASE_FORWARD*)(((WORD*)&msgBODY_SZ)+1);
return pOFFSET;
}
inline DWORD* GetUsersStartPtr()
{
DWORD* pStartPtr = (DWORD*) ( ((BYTE*)GetBrdPacketPtr()) + msgBODY_SZ );
return pStartPtr;
}
inline DWORD AddUser( DWORD* pUserStartPtr, DWORD dwUserKey )
{
if( MAX_USER_COUNT == m_byUserCount )
return 0;
pUserStartPtr[m_byUserCount++] = dwUserKey;
return (DWORD)m_byUserCount;
}
inline WORD GetSendingSize() const
{
const WORD cwMIN_SZ = sizeof(MSG_BASE_FORWARD) + sizeof(msgBODY_SZ) + sizeof(m_byUserCount);
WORD wSIZE = cwMIN_SZ + msgBODY_SZ + (WORD)(sizeof(DWORD)*m_byUserCount);
return wSIZE;
}
// <패킷 수신시 사용하는 METHOD>
// <returns>
// size of variable msg - <WARNING> 이 값을 실제 수신된 값과 비교해서 일치하지 않으면 처리해선 안된다.
// MSG_INFO.pMSG_BODY = BROADCASTING MSG
// MSG_INFO.wSIZE = BROADCASTING MSG SIZE
inline WORD GetPacketInfo( MSG_INFO& rINFO )
{
//
const WORD cwMIN_SZ = sizeof(MSG_BASE_FORWARD) + sizeof(msgBODY_SZ) + sizeof(m_byUserCount);
BYTE* pOFFSET = (BYTE*)(((WORD*)&msgBODY_SZ)+1);
rINFO.pMSG_BODY = (MSG_BASE_FORWARD*)pOFFSET; //최소한 보내고자 했던 메시지 정보는 확인 가능
rINFO.wSIZE = msgBODY_SZ;
WORD wSIZE = cwMIN_SZ + msgBODY_SZ;
pOFFSET += msgBODY_SZ;
rINFO.wUSER_COUNT = (WORD)m_byUserCount;
rINFO.pUSERs = (DWORD*)pOFFSET;
wSIZE = wSIZE + (WORD)(sizeof(DWORD)*m_byUserCount) ;
return wSIZE;
}
PACKET_AG_CLOSE;
#endif //!SUN_CODE_RENEWAL
//==================================================================================================
//==================================================================================================
//==================================================================================================
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <TYPE DEFINITIONs>
//
// <MSG_ONEtoN_BROADCASTER><EXAMPLE>
// MSG_CG_CONNECTION_HEARTBEAT_SYN msgSYN;
// MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN& msgBRD = PACKET_ONEtoN_BROADCASTER::InstanceOfBase( FALSE );
// msgBRD.Init( &msgSYN, sizeof(msgSYN) );
// DWORD* pStartPtr = msgBRD.GetUsersStartPtr();
//------(이 부분의 유저 입력은 필요에 따라 수정해야 한다)
// for( DWORD i=0 ; i<MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN::MAX_USER_COUNT ; ++i )
// msgBRD.AddUser( pStartPtr, i+1 );
//------(선택)
// PACKET_ONEtoN_BROADCASTER::AddOffset( msgBRD.GetSendingSize() );
//------(위와 같은 경우 둘의 크기는 반드시 같다. 보내는 크기 역시 둘 중에 하나 사용이 가능하다)
// ASSERT( PACKET_ONEtoN_BROADCASTER::GetTotalSize() == msgBRD.GetSendingSize() );
//
//------(Render정보와 같은 한명에게 여러 정보가 가변으로 집산되는 경우 다음과 같은 처리가 가능하다)
// // _1_에 디폴트 값은 TRUE, 내부적으로 옵셋이 자동계산된다.
// PLAYER_RENDER_INFO& rRENDER = PACKET_ONEtoN_BROADCASTER::InstanceOf<PLAYER_RENDER_INFO>( _1_ );
//------(따라서 위의 Assert와 다른 반대의 결과가 취해진다)
// ASSERT( PACKET_ONEtoN_BROADCASTER::GetTotalSize() != msgBRD.GetSendingSize() );
//
typedef VARMSG_EX<VARMSG_T01, MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN> MSG_ONEtoN_BROADCASTER;
typedef MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN MSG_AG_CONNECTION_PACKET_UNICASTER;
typedef VARMSG_EX<VARMSG_T02, MSG_AG_CONNECTION_PACKET_UNICASTER> MSG_COMPOSE_UNICASTER;
typedef VARMSG_EX<VARMSG_T03, MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN> MSG_ONEtoN_BROADCASTER_INTERNAL;
//typedef VARMSG_EX<MSG_AG_CONNECTION_PACKET_BROADCASTER_ONEtoN_SYN> PACKET_NtoONE_UNICASTER;
#pragma pack(pop)
#endif // __PACKETSTRUCT_AG_H__