#pragma once //#include #include #include "SkillBase.h" #include "SMessage.h" #include "SNetMessage.h" #include "SNetMessageBill.h" #include "K3DTypes.h" #include "Util.h" #include "Enc.h" #pragma pack( 1 ) struct SMSG_AC_RESULT : public SGameMessage { SMSG_AC_RESULT() : SGameMessage(MSG_AC_RESULT) { request_msg_id = 0; result = 0; value = 0; } unsigned short request_msg_id; unsigned short result; int value; }; /// 2011.05.20 GNE 인증 방식 - prodongi struct SMSG_AC_RESULT_WITH_STRING : public SGameMessage { SMSG_AC_RESULT_WITH_STRING() : SGameMessage(MSG_AC_RESULT_WITH_STRING) { request_msg_id = 0; result = 0; value = 0; str = NULL; } virtual ~SMSG_AC_RESULT_WITH_STRING() { SAFE_DELETE_ARRAY(str); } unsigned short request_msg_id; unsigned short result; int value; char* str; }; struct SMSG_AC_SERVER_LIST : public SGameMessage { SMSG_AC_SERVER_LIST() : SGameMessage(MSG_AC_SERVER_LIST) { count = 0; m_pServerInfo = NULL; } ~SMSG_AC_SERVER_LIST() { SAFE_DELETE_ARRAY( m_pServerInfo ); } unsigned short last_login_server_idx; unsigned short count; struct TS_SERVER_INFO * m_pServerInfo; ///< 이 아래로 TS_SERVER_INFO 들이 붙게 됨 }; struct SMSG_AC_SELECT_SERVER : public SGameMessage { SMSG_AC_SELECT_SERVER() : SGameMessage(MSG_AC_SELECT_SERVER) { result = 0; one_time_key_en_len = 0; memset( one_time_key, 0, sizeof( one_time_key ) ); pending_time = 0; } unsigned short result; size_t one_time_key_en_len; unsigned char one_time_key[sizeof( __int64 ) + GameRule::MAX_CRYPTO_BLOCK_LEN]; AR_TIME pending_time; ///< 대기 할 시간 }; struct SMSG_AC_UPDATE_PENDING_TIME : public SGameMessage { SMSG_AC_UPDATE_PENDING_TIME() : SGameMessage(MSG_AC_UPDATE_PENDING_TIME) { pending_time = 0; } AR_TIME pending_time; ///< 대기 할 시간 }; struct SMSG_RESULT : public SGameMessage { SMSG_RESULT() : SGameMessage(MSG_RESULT) { request_msg_id = 0; result = 0; value = 0; } unsigned short request_msg_id; unsigned short result; int value; }; struct SMSG_SECRET_KEY : public SGameMessage { SMSG_SECRET_KEY() : SGameMessage(MSG_SECRET_KEY) { nEncryptSize = 0; pEncryptData = NULL; } ~SMSG_SECRET_KEY() { delete pEncryptData; } size_t nEncryptSize; unsigned char* pEncryptData; }; struct SMSG_ACCOUNT_INFO : public SGameMessage { SMSG_ACCOUNT_INFO() : SGameMessage(MSG_ACCOUNT_INFO) { } ~SMSG_ACCOUNT_INFO() { } std::string strAccount; int user_no; // 유럽 db 통합 account id 중복 버그 방지위해 크루샵에서 사용할 고유값 }; struct SMSG_MOVE : public SGameMessage { SMSG_MOVE() : SGameMessage(MSG_MOVE) { handle = 0; start_time = 0; bReqMove = false; pos_target = K3DVector(0,0,0); speed = 0; } ~SMSG_MOVE() { m_vecMoveInfo.clear(); } AR_HANDLE handle; AR_TIME start_time; bool bReqMove; K3DVector pos_target; ///< 이동 할 위치 unsigned char speed; std::vector< ArPosition > m_vecMoveInfo; }; /// Local Player 이동 응답 struct SMSG_MOVE_ACK : public SGameMessage { SMSG_MOVE_ACK() : SGameMessage(MSG_MOVE_ACK) { time = 0; speed = 0; } AR_TIME time; unsigned char speed; }; struct SMSG_REGION_ACK : public SGameMessage { SMSG_REGION_ACK() : SGameMessage(MSG_REGION_ACK) { rx = 0; ry = 0; } unsigned rx; unsigned ry; }; struct SMSG_LOGIN : public SGameMessage { SMSG_LOGIN() : SGameMessage(MSG_LOGIN) { // 2010.05.20 - prodongi result = 0; //bIsAccepted = 0; handle = 0; x=y=z = 0; layer = 0; region_size = 0; hp = 0; mp = 0; max_hp = 0; max_mp = 0; race = 0; skin_color = 0; ZeroMemory( szName, sizeof(szName) ); cell_size = 6; // 2010.05.20 - prodongi hideEquipInfo = 0; } //char bIsAccepted; //unsigned short bIsAccepted; unsigned short result; AR_HANDLE handle; AR_UNIT x,y,z; unsigned char layer; float face_direction; ///< 보고있는 방향 int region_size; // blow is game conetents int hp; int mp; int max_hp; int max_mp; int sex; int race; unsigned long skin_color; ItemBase::ItemCode faceid; ItemBase::ItemCode hairid; int hairColorIndex; unsigned long hairColorRGB; // 2010.05.20 - prodongi unsigned int hideEquipInfo; char szName[19]; int cell_size; int guild_id; int back_board; }; struct SMSG_CHARLIST : public SGameMessage { SMSG_CHARLIST() : SGameMessage( MSG_CHARLIST ), current_server_time(0), nCharCount( 0 ), pCharInfo( NULL ) { } ~SMSG_CHARLIST() { SAFE_DELETE_ARRAY( pCharInfo ); } unsigned int current_server_time; ///< 1970년 1월 1일 0시 0분 0초로부터 몇초가 경과되었는지를 알려줌. // ( CRT 의 time() 리턴값임) unsigned short last_login_index; int nCharCount; LOBBY_CHARACTER_INFO* pCharInfo; }; struct SMSG_LEAVE : public SGameMessage { SMSG_LEAVE() : SGameMessage(MSG_LEAVE) { handle = 0; } AR_HANDLE handle; }; struct SMSG_ENTER : public SGameMessage { SMSG_ENTER() : SGameMessage(MSG_ENTER) { type = 0; handle = 0; x=y=z = 0; layer = 0; // blow is game conetents ObjType = 0; } unsigned char type; AR_HANDLE handle; AR_UNIT x,y,z; unsigned char layer; // below is game conetents unsigned char ObjType; struct TS_ITEM_PICK_UP_ORDER { AR_TIME drop_time; AR_HANDLE hPlayer[ 3 ]; int nPartyID[ 3 ]; }; struct ItemInfo { ENC_INT code; ///< code 가 0인것은 돈임. 액수는 cnt __int64 cnt; TS_ITEM_PICK_UP_ORDER pick_up_order; }; struct SkillInfo { AR_HANDLE caster; AR_TIME start_time; int skill_num; }; struct CreatureInfo { enum { FLAG_BATTLE_MODE = 1 << 0, FLAG_INVISIBLE = 1 << 1, }; unsigned status; float face_direction; ///< 보고있는 방향 int hp; int max_hp; int mp; int max_mp; int level; unsigned char race; unsigned long skin_color; bool is_first_enter; int energy; }; struct MonsterInfo : CreatureInfo { enum { FLAG_DEAD = 1 << 8, // 2010.07.15 - prodongi FLAG_DUNGEON_ORIGINAL_OWNER = 1 << 15, FLAG_DUNGEON_ORIGINAL_SIEGER = 1 << 17, }; //int monster_id; ENC_INT monster_id; bool is_tamed; ///< 테이밍 되었는지 여부 }; struct SummonInfo: CreatureInfo { AR_HANDLE master_handle; ENC_INT summon_code; char szName[19]; unsigned char enhance; }; struct PetInfo : CreatureInfo ///< sonador 10.2.1 팻 시스템 구현 { enum { FLAG_SHOVELING_SEARCH = 1 << 18, FLAG_SHOVELING_APPROACH = 1 << 19, FLAG_SHOVELING_DIG = 1 << 20, }; AR_HANDLE master_handle; ENC_INT pet_code; char szName[ 19 ]; }; struct NPCInfo: CreatureInfo { enum { FLAG_HAS_STARTABLE_QUEST = 1 << 8, FLAG_HAS_IN_PROGRESS_QUEST = 1 << 9, FLAG_HAS_FINISHABLE_QUEST = 1 << 10, }; ENC_INT npc_id; }; struct PlayerInfo: CreatureInfo { enum { FLAG_SITDOWN = 1 << 8, FLAG_BUY_BOOTH = 1 << 9, FLAG_SELL_BOOTH = 1 << 10, FLAG_PK_ON = 1 << 11, FLAG_BLOODY = 1 << 12, FLAG_DEMONIAC = 1 << 13, FLAG_GM = 1 << 14, FLAG_DUNGEON_ORIGINAL_OWNER = 1 << 15, FLAG_WALKING = 1 << 16, FLAG_DUNGEON_ORIGINAL_SIEGER = 1 << 17, }; unsigned char sex; ItemBase::ItemCode faceId; int faceTextureId; // 2010.06.18 deco index이다, 변수명이 너무 헷깔린다. - prodongi ItemBase::ItemCode hairId; int hairColorIndex; unsigned long hairColorRGB; // 2010.05.20 - prodongi unsigned int hideEquipFlag; char szName[19]; unsigned short job_id; AR_HANDLE ride_handle; int guild_id; int title_code; // 2012. 5. 30 - marine int back_board; }; struct FieldPropInfo { int prop_id; float fZOffset; float fRotateX, fRotateY, fRotateZ; float fScaleX, fScaleY, fScaleZ; bool bLockHeight; float fLockHeight; }; }; struct SMSG_ATTACK_DOUBLE : public SGameMessage { SMSG_ATTACK_DOUBLE() : SGameMessage(MSG_ATTACK_DOUBLE) { attacker_handle = 0; target_handle = 0; right_hand_damage = 0; left_hand_damage = 0; attack_speed = 0; hp_percentage = 0; pos_target = K3DVector(0,0,0); flag = 0; memset( right_hand_elemental_damage, 0, sizeof( right_hand_elemental_damage ) ); memset( left_hand_elemental_damage, 0, sizeof( left_hand_elemental_damage ) ); } AR_HANDLE attacker_handle; AR_HANDLE target_handle; short right_hand_damage; short left_hand_damage; unsigned short attack_speed; ///< ms unsigned char hp_percentage; ///< HP % unsigned short flag; unsigned char right_hand_elemental_damage[ CreatureElemental::COUNT ]; ///< 추가데미지 unsigned char left_hand_elemental_damage[ CreatureElemental::COUNT ]; ///< 추가데미지 K3DVector pos_target; ///< 이동 할 위치 }; struct SMSG_ATTACK : public SGameMessage { SMSG_ATTACK() : SGameMessage(MSG_ATTACK) { attacker_handle = 0; target_handle = 0; // pTarget = NULL; pos_target = K3DVector(0,0,0); attack_speed = 0; count = 0; nTypeBow = 0; } ~SMSG_ATTACK() { m_vAttackInfoList.clear(); } AR_HANDLE attacker_handle; AR_HANDLE target_handle; unsigned short attack_speed; ///< ms unsigned short attack_delay; ///< ms char attack_action; char attack_flag; unsigned char count; int nTypeBow; ///< 활 공격 종류 ItemClass 참조~ // class SGameObject * pTarget; //공격 대상 K3DVector pos_target; ///< 이동 할 위치 std::vector< ATTACK_INFO > m_vAttackInfoList; }; struct SMSG_CANT_ATTACK : public SGameMessage { SMSG_CANT_ATTACK() : SGameMessage(MSG_CANT_ATTACK) { attacker_handle = 0; target_handle = 0; // tx = 0; // ty = 0; // attack_range = 0; } AR_HANDLE attacker_handle; AR_HANDLE target_handle; // AR_UNIT tx,ty; // AR_UNIT attack_range; int reason; }; struct SMSG_DAMAGE : public SGameMessage { enum { NORMAL_DAMAGE = 0, SKILL_DAMAGE, DOT_DAMAGE, }; enum { FIRE_SKILL = 0, REGION_FIRE_SKILL, }; SMSG_DAMAGE() : SGameMessage(MSG_DAMAGE) { nDamage = 0; flag = 0; nHittingAdd_FxID = 0; attacker_handle = 0; target_handle = 0; memset( elemental_damage, 0 ,sizeof(elemental_damage) ); skillresult.damage.type = SkillResult::NOT_USE; bSphereDamage = false; bBowAttack = false; nSkillID = 0; nSkillLevel = 0; // TODO: Change later skill levels everywhere to short or char because it actually can't be higher than 255 strTargetName.clear(); attack_action = 0; attack_flag = 0; nDamage_Type = NORMAL_DAMAGE; strCasterName = "Somebody"; strTargetName = "Somebody"; skill_type = FIRE_SKILL; chainCaster = 0; /// 2011.03.25 - prodongi } AR_HANDLE attacker_handle; AR_HANDLE target_handle; bool bSphereDamage; ///< 범위데미지 bool bBowAttack; ///< 활 공격이냐 int nHittingAdd_FxID; ///<부가 FX ID int nDamage; ///<데미지 unsigned char flag; int elemental_damage[ CreatureElemental::COUNT ]; ///< 추가데미지 int nSkillID; int nSkillLevel; std::string strCasterName; std::string strTargetName; SkillResult skillresult; char attack_action; char attack_flag; short nDamage_Type; int skill_type; AR_HANDLE chainCaster; /// 2011.03.25 - prodongi }; struct SMSG_STAT_INFO : public SGameMessage { SMSG_STAT_INFO() : SGameMessage(MSG_STAT_INFO) { handle = 0; memset( &stat , 0, sizeof(stat) ); memset( &attribute, 0, sizeof(attribute) ); type = 0; } AR_HANDLE handle; CreatureStat stat; CreatureAttribute attribute; unsigned char type; }; struct SMSG_GOLD_UPDATE : public SGameMessage { SMSG_GOLD_UPDATE() : SGameMessage(MSG_GOLD_UPDATE), gold(0) { } money_t gold; ///< [sonador][3.4.1]소지금 한도 증가 관련 서버 메시지 변경 int chaos; }; struct SMSG_LEVEL_UPDATE : public SGameMessage { SMSG_LEVEL_UPDATE() : SGameMessage(MSG_LEVEL_UPDATE), handle(0), level(0), job_level(0) { } AR_HANDLE handle; int level; int job_level; }; struct SMSG_EXP_UPDATE : public SGameMessage { SMSG_EXP_UPDATE() : SGameMessage(MSG_EXP_UPDATE), handle(0), exp(0), jp(0) { } AR_HANDLE handle; __int64 exp; __int64 jp; /// 2011.04.29 int -> __int64 - prodongi }; struct SMSG_BONUS_EXP_JP : public SGameMessage { SMSG_BONUS_EXP_JP() : SGameMessage(MSG_BONUS_EXP_JP) { } std::vector< TS_SC_BONUS_EXP_JP::BONUS_INFO > m_vBonusInfo; }; struct SMSG_STATUS_CHANGE : public SGameMessage { SMSG_STATUS_CHANGE() : SGameMessage(MSG_STATUS_CHANGE) { handle = 0; status = 0; } AR_HANDLE handle; unsigned status; }; struct SMSG_WATCH_BOOTH : public SGameMessage { SMSG_WATCH_BOOTH( AR_HANDLE h = NULL, bool bIsStart = false ) : SGameMessage( MSG_WATCH_BOOTH ), hTarget( h ), bIsStartWatch( bIsStart ) {} AR_HANDLE hTarget; bool bIsStartWatch; }; struct SMSG_BOOTH_NAME_CHANGED : public SGameMessage { SMSG_BOOTH_NAME_CHANGED( AR_HANDLE h, const std::string & name ) : SGameMessage( MSG_BOOTH_NAME_CHANGED ), hTarget( h ), strBoothName( name ) {} AR_HANDLE hTarget; std::string strBoothName; }; struct SMSG_BOOTH_CLOSED : public SGameMessage { SMSG_BOOTH_CLOSED( AR_HANDLE h ) : SGameMessage( MSG_BOOTH_CLOSED ), hTarget( h ) {} AR_HANDLE hTarget; }; struct SMSG_BOOTH_INFO : public SGameMessage { SMSG_BOOTH_INFO() : SGameMessage( MSG_BOOTH_INFO ) { bIsWatch = false;} bool bIsWatch; bool bIsSell; AR_HANDLE hTarget; std::vector< TS_SC_WATCH_BOOTH::TS_BOOTH_ITEM_INFO > vList; }; struct SMSG_BOOTH_TRADE_INFO : public SGameMessage { SMSG_BOOTH_TRADE_INFO() : SGameMessage( MSG_BOOTH_TRADE_INFO ) {} AR_HANDLE hTarget; bool bIsSell; std::vector< TS_BOOTH_TRADE_ITEM_INFO > vList; }; struct SMSG_BOOTH_NAME : public SGameMessage { SMSG_BOOTH_NAME() : SGameMessage( MSG_BOOTH_NAME ) {} std::vector< TS_SC_GET_BOOTHS_NAME::TS_BOOTH_NAME > vBoothName; }; struct SMSG_STATE : public SGameMessage { enum { OWNER_NONE = 0, OWNER_LOCAL_PLAYER, OWNER_LOCAL_CREATURE, OWNER_LOCAL_PARTY, OWNER_LOCAL_GUILD, }; SMSG_STATE() : SGameMessage(MSG_STATE) { handle = 0; state_handle = 0; state_code = 0; state_level = 0; end_time = 0; start_time = 0; state_value = 0; data_owner = OWNER_NONE; isToggle = false; /// 2011.07.28 redmine #16797 - prodongi disguiseEnhance = 0; isNewState = false; } AR_HANDLE handle; ///< 대상 크리쳐 unsigned short state_handle; ///< 상태이상 핸들 unsigned int state_code; ///< 상태이상 종류 unsigned short state_level; ///< 상태이상의 레벨 (0이면 풀리는 메세지임) AR_TIME end_time; ///< 끝나는 시간 (0이면 영원히) AR_TIME start_time; unsigned short data_owner; int state_value; ///< 지속효과 관련 추가값 std::string state_string_value; /// 2011.07.28 redmine #16797 - prodongi int disguiseEnhance; /// 변신할 크리처의 강화 정보 bool isToggle; ///< 토글형 스킬? bool isNewState; /// 2012.02.01 새로 걸리는 버프인지 아닌지(기존 버프가 존재하지 않거나 기존에 걸려 있는 버프와의 레벨이 틀리는 경우) - prodongi }; /* struct SMSG_HP : public SGameMessage { SMSG_HP() : SGameMessage(MSG_HP) { handle = 0; hp = 0; hp_percentage = 0; } AR_HANDLE handle; int hp; unsigned char hp_percentage; }; struct SMSG_MP : public SGameMessage { SMSG_MP() : SGameMessage(MSG_MP) { handle = 0; mp = 0; } AR_HANDLE handle; int mp; }; */ struct SMSG_SP : public SGameMessage { SMSG_SP() : SGameMessage(MSG_SP) { handle = 0; sp = 0; max_sp = 0; } AR_HANDLE handle; short sp; short max_sp; }; struct SMSG_REGEN_HPMP : public SGameMessage { SMSG_REGEN_HPMP() : SGameMessage( MSG_REGEN_HPMP ) { handle = 0; hp_regen = 0; mp_regen = 0; hp = 0; mp = 0; } AR_HANDLE handle; int hp_regen; int mp_regen; int hp; int mp; }; struct SMSG_PROPERTY : public SGameMessage { enum { PROPERTY_HP, ///< "hp" PROPERTY_MP, ///< "mp" PROPERTY_MAX_HP, ///< "max_hp" PROPERTY_MAX_MP, ///< "max_mp" PROPERTY_LOGIN, ///< "login" PROPERTY_ACCOUNT, ///< "account" PROPERTY_NAME, ///< "name" PROPERTY_GOLD, ///< "gold" PROPERTY_EXP, ///< "exp" PROPERTY_JP, ///< "jp" PROPERTY_JOB_LEVEL, ///< "job_level" PROPERTY_JOB, ///< "job" PROPERTY_JOB_0, ///< "job_0" PROPERTY_JLV_0, ///< "jlv_0" PROPERTY_JOB_1, ///< "job_1" PROPERTY_JLV_1, ///< "jlv_1" PROPERTY_JOB_2, ///< "job_2" PROPERTY_JLV_2, ///< "jlv_2" PROPERTY_LEVEL, ///< "level" PROPERTY_WEIGHT, ///< "weight" PROPERTY_STR, ///< "str" PROPERTY_AGI, ///< "agi" PROPERTY_DEX, ///< "dex" PROPERTY_INT, ///< "int" PROPERTY_LUCK, ///< "luck" PROPERTY_VITAL, ///< "vital" PROPERTY_MENTAL, ///< "mental" PROPERTY_PERMISSION, ///< "permission" PROPERTY_PK_COUNT, ///< "pk_count" PROPERTY_DK_COUNT, ///< "dkc" PROPERTY_RACE, ///< "race" PROPERTY_CHARISMA, ///< "charisma" PROPERTY_MORAL, ///< "moral" PROPERTY_LOGIN_TIME, ///< "login_time" PROPERTY_SEX, ///< "sex" PROPERTY_X, ///< "x" PROPERTY_Y, ///< "y" PROPERTY_SPEED, ///< "speed" PROPERTY_SP, ///< "sp" ( 소환수에게 온다. ) PROPERTY_STORAGE_GOLD, ///< "storage_gold" 창고에 저장된 금액 PROPERTY_STAMINA, ///< "stamina" PROPERTY_CHAOS, ///< "chaos" PROPERTY_MAX_CHAOS, ///< "max_chaos" PROPERTY_MAX_STAMINA, ///< "max_stamina" PROPERTY_CHANNEL, ///< "channel" PROPERTY_STAMINA_REGEN_RATE, ///< "stamina_regen" PROPERTY_PLAYTIME, ///< "playtime" PROPERTY_PLAYTIME_LIMIT1, ///< "playtime_limit1" PROPERTY_PLAYTIME_LIMIT2, ///< "playtime_limit2" PROPERTY_HUNTAHOLIC_ENT, ///< "huntaholic_ent" PROPERTY_ETHEREAL_STONE_DURABILITY, ///< "ethereal_stone_durability" PROPERTY_HUNTAHOLICPOINT, // "huntaholicpoint" PROPERTY_TP, /// 2011.03.28 "tp" 특성 포인트 - prodongi PROPERTY_AP, /// 2012.06.08 "ap" 아레나 포인트 - prodongi PROPERTY_ALIAS, /// 아레나 별칭 PROPERTY_CLIENT_INFO, ///< "client_info" PROPERTY_QUICK_SLOT, ///< "quick_slot" PROPERTY_CURRENT_KEY, ///< "current_key_info" PROPERTY_SAVED_KEY, ///< "saved_key_info" }; SMSG_PROPERTY( AR_HANDLE han, int nType, const char* szValue ) : SGameMessage(MSG_PROPERTY), handle(han), nPropertyType( nType ), strValue( szValue ) { } AR_HANDLE handle; int nPropertyType; ///< 위의 프로퍼티 타입 참조 std::string strValue; }; struct SMSG_HPMP : public SGameMessage { SMSG_HPMP() : SGameMessage(MSG_HPMP) { handle = 0; add_hp = 0; hp = 0; max_hp = 0; add_mp = 0; mp = 0; max_mp = 0; } AR_HANDLE handle; int add_hp; int hp; int max_hp; int add_mp; int mp; int max_mp; bool need_to_display; }; struct SMSG_TARGET : public SGameMessage { SMSG_TARGET() : SGameMessage(MSG_TARGET) { target = 0; } AR_HANDLE target; }; struct SMSG_SHOW_CREATE_GUILD : public SGameMessage { SMSG_SHOW_CREATE_GUILD() : SGameMessage(MSG_SHOW_CREATE_GUILD) { } }; struct SMSG_SHOW_CREATE_ALLIANCE : public SGameMessage { SMSG_SHOW_CREATE_ALLIANCE() : SGameMessage(MSG_SHOW_CREATE_ALLIANCE) {} }; struct SMSG_SEND_DATA : public SGameMessage { SMSG_SEND_DATA( int n ) : SGameMessage( MSG_SEND_DATA ), nNumber( n ) { } SMSG_SEND_DATA( const char *pszMessage ) : SGameMessage( MSG_SEND_DATA ), strMessage( pszMessage ) { } SMSG_SEND_DATA( const char *pszMessage, const char *pszData ) : SGameMessage( MSG_SEND_DATA ), strMessage( pszMessage ), strData( pszData ){ } SMSG_SEND_DATA( int n, const char *pszMessage ) : SGameMessage( MSG_SEND_DATA ), nNumber( n ), strMessage( pszMessage ) { } SMSG_SEND_DATA( int n, const char *pszMessage, const char *pszData ) : SGameMessage( MSG_SEND_DATA ), nNumber( n ), strMessage( pszMessage ), strData( pszData ) { } SMSG_SEND_DATA( int n, const char *pszMessage, int n2, int n3, const char *pszData ) : SGameMessage( MSG_SEND_DATA ), nNumber( n ), strMessage( pszMessage ), nNumber2( n2 ), nNumber3( n3 ), strData( pszData ) { } SMSG_SEND_DATA( int n, const char *pszMessage, int n2, int n3, int n4, const char *pszData ) : SGameMessage( MSG_SEND_DATA ), nNumber( n ), strMessage( pszMessage ), nNumber2( n2 ), nNumber3( n3 ), nNumber4(n4), strData( pszData ) { } std::string strMessage; std::string strData; int nNumber; int nNumber2; int nNumber3; int nNumber4; }; struct SMSG_ADD_SUMMON_INFO : public SGameMessage { SMSG_ADD_SUMMON_INFO() : SGameMessage(MSG_ADD_SUMMON_INFO) { card_handle = 0; summon_handle = 0; memset( name, 0, sizeof(name) ); code = 0; // 이하 정보 필요 level = 0; sp = 0; }; AR_HANDLE card_handle; AR_HANDLE summon_handle; char name[19]; int code; ///< 소환수 코드 // 이하 정보 필요 int level; int sp; }; struct SMSG_REMOVE_SUMMON_INFO : public SGameMessage { SMSG_REMOVE_SUMMON_INFO() : SGameMessage(MSG_REMOVE_SUMMON_INFO) { card_handle = 0; }; AR_HANDLE card_handle; }; struct SMSG_EQUIP_SUMMON : public SGameMessage { SMSG_EQUIP_SUMMON() : SGameMessage(MSG_EQUIP_SUMMON) { for( int i(0); 6>i; i++ ) card_handle[i] = 0; }; bool open_dialog; AR_HANDLE card_handle[ 6 ]; }; struct SMSG_REQUEST_EQUIP_SUMMON : public SGameMessage { SMSG_REQUEST_EQUIP_SUMMON() : SGameMessage(MSG_REQUEST_EQUIP_SUMMON) { card_handle = 0; }; AR_HANDLE card_handle; }; struct SMSG_CHAT_COMMAND : public SGameMessage { enum { CHAT_NONE, CHAT_CASHSTORAGE_OPEN, ///< 캐쉬 창고 열기 CHAT_CASHSHOP_OPEN, ///< 캐쉬 샵 열기 }; SMSG_CHAT_COMMAND( int mode ) : SGameMessage(MSG_CHAT_COMMAND), nMode(mode) { } int nMode; }; struct SMSG_AURA : public SGameMessage { enum { OWNER_NONE = 0, OWNER_LOCAL_PLAYER, OWNER_LOCAL_CREATURE, }; SMSG_AURA() : SGameMessage(MSG_AURA) { caster = 0; skill_id = 0; status = false; data_owner = OWNER_NONE; } AR_HANDLE caster; int skill_id; bool status; unsigned short data_owner; }; struct SMSG_REQ_GUILD_ICON : public SGameMessage { SMSG_REQ_GUILD_ICON( int guild_id ) : SGameMessage(MSG_REQ_GUILD_ICON), nGuild_id(guild_id) { } int nGuild_id; }; struct SMSG_CHANGE_NAME : public SGameMessage { SMSG_CHANGE_NAME() : SGameMessage(MSG_CHANGE_NAME) { handle = 0; IsLocal = false; status = 0; } AR_HANDLE handle; std::string m_name; bool IsLocal; unsigned status; }; struct SMSG_OPEN_URL : public SGameMessage { SMSG_OPEN_URL() : SGameMessage(MSG_OPEN_URL) , width( 0 ) , height( 0 ) { } bool wait_for_event_scene; std::string m_strURL; int width; int height; }; struct SMSG_RQ_SUMMON : public SGameMessage { SMSG_RQ_SUMMON() : SGameMessage(MSG_RQ_SUMMON) { is_summon = 0; ///< 1이면 소환, 0이면 역소환 card_handle = 0; } unsigned char is_summon; ///< 1이면 소환, 0이면 역소환 AR_HANDLE card_handle; }; struct SMSG_UNSUMMON : public SGameMessage { SMSG_UNSUMMON() : SGameMessage(MSG_UNSUMMON) { summon_handle = 0; } AR_HANDLE summon_handle; }; struct SMSG_UNSUMMON_NOTICE : public SGameMessage { SMSG_UNSUMMON_NOTICE() : SGameMessage(MSG_UNSUMMON_NOTICE) { summon_handle = 0; unsummon_duration = 0; } AR_HANDLE summon_handle; AR_TIME unsummon_duration; }; struct SMSG_SUMMON_EVOLUTION : public SGameMessage { SMSG_SUMMON_EVOLUTION() : SGameMessage( MSG_SUMMON_EVOLUTION ) { card_handle = 0; summon_handle = 0; memset( name, 0, sizeof(name) ); code = 0; } AR_HANDLE card_handle; AR_HANDLE summon_handle; char name[19]; int code; }; struct SMSG_TAMING_INFO : public SGameMessage { SMSG_TAMING_INFO() : SGameMessage(MSG_TAMING_INFO) { mode = 0; tamer_handle = 0; target_handle = 0; } enum { START = 0, ///< tamer 가 target 에게 테이밍 스킬을 걸었음 CLEAR = 1, ///< 테이밍이 초기화됨 (tamer_handle 은 0) SUCCESS = 2, ///< target 이 죽어서 tamer 에게 테이밍됨. FAILED = 3, ///< target 이 죽었지만 테이밍은 실패! }; unsigned char mode; AR_HANDLE tamer_handle; AR_HANDLE target_handle; }; struct SMSG_MOUNT_SUMMON : public SGameMessage { SMSG_MOUNT_SUMMON() : SGameMessage(MSG_MOUNT_SUMMON) { handle = 0; summon_handle = 0; x = 0; y = 0; success = true; } AR_HANDLE handle; AR_HANDLE summon_handle; AR_UNIT x, y; bool success; }; struct SMSG_UNMOUNT_SUMMON : public SGameMessage { SMSG_UNMOUNT_SUMMON() : SGameMessage(MSG_UNMOUNT_SUMMON) { handle = 0; summon_handle = 0; flag = NORMAL; } AR_HANDLE handle; AR_HANDLE summon_handle; enum { NORMAL = 0, FALL = 1, UNSUMMON = 2, }; char flag; }; struct SMSG_SUMMON_NAME_CHANGE : public SGameMessage { SMSG_SUMMON_NAME_CHANGE() : SGameMessage(MSG_SUMMON_NAME_CHANGE) { summon_handle = 0; } AR_HANDLE summon_handle; }; struct SMSG_SUMMON_CARD : public SGameMessage { SMSG_SUMMON_CARD() : SGameMessage(MSG_SUMMON_CARD) { card_handle = 0; } AR_HANDLE card_handle; }; // 2010.08.06 - prodongi struct SMSG_BOSS_MONSTER_CARD : public SGameMessage { SMSG_BOSS_MONSTER_CARD() : SGameMessage(MSG_BOSS_MONSTER_CARD) { card_handle = 0; } AR_HANDLE card_handle; }; struct SMSG_SKILL_LIST : public SGameMessage { SMSG_SKILL_LIST() : SGameMessage(MSG_SKILL_LIST) { dwTime = 0; target = 0; ///< 플레이어 혹은 크리쳐 count = 0; modification_type = 0; /// 2011.07.04 - prodongi pSkillInfo = NULL; } virtual ~SMSG_SKILL_LIST() { SAFE_DELETE_ARRAY( pSkillInfo ); } struct SkillInfo { int skill_id; ///< 스킬 ID unsigned char base_skill_level; ///< 기본 스킬 레벨 unsigned char current_skill_level; ///< 현재 스킬 레벨 AR_TIME total_cool_time; // AR_TIME remain_cool_time; ///< 남은 쿨타임 시간 1/100 초 }; /// 2011.07.04 - prodongi // 이후 따라오는 스킬 리스트가 어떤 의미를 가지는가를 의미하는열거형 enum ModificationType { UPDATE = 0, // 스킬이 업데이트됨 (기존 reset = false) REFRESH = 1, // 스킬 리스트를 갱신 (기존 reset = true) }; bool isUpdate() const { return modification_type == UPDATE; } bool isRefresh() const { return modification_type == REFRESH; } DWORD dwTime; ///< 발생 현재 시간 AR_HANDLE target; ///< 플레이어 혹은 크리쳐 unsigned short count; /// 2011.07.04 - prodongi unsigned char modification_type; // enum ModificationType SkillInfo * pSkillInfo; }; struct SMSG_SKILL_EVENT : public SGameMessage { enum { OWNER_NONE = 0, OWNER_LOCAL_PLAYER, OWNER_LOCAL_CREATURE, }; SMSG_SKILL_EVENT() : SGameMessage(MSG_SKILL_EVENT) { skill_id = 0; skill_level = 0; caster = 0; target = 0; x = 0; y = 0; z = 0; layer = 0; status_type = 0; hp_cost = 0; mp_cost = 0; caster_hp = 0; caster_mp = 0; data_owner = OWNER_NONE; //target_name.clear(); // Fraun performance tweak } int skill_id; char skill_level; AR_HANDLE caster; AR_HANDLE target; AR_UNIT x,y,z; unsigned char layer; char status_type; int hp_cost; int mp_cost; int caster_hp; int caster_mp; short data_owner; //std::string target_name; // Fraun performance tweak struct CancelType { // 내용 없음 }; struct CompleteType { // 내용 없음 }; /// Casting 이거나 Casting_update일 경우 날아감. struct CastType { AR_TIME tm; ///< 캐스팅 타임 unsigned short nErrorCode; ///< 성공 여부 ( 0이면 성공 ) }; /// Region Fire일 경우에도 얘가 날아감. struct FireType { bool bMultiple; ///< true 실시간 연타 AR_UNIT range; ///< 스킬 효과 범위 unsigned char target_count; unsigned char fire_count; unsigned short count; }; union { CancelType cancel; CompleteType complete; CastType cast; FireType fire; }; // Fire나 Region Fire일 경우 추가로 뒤에 SkillResult 가 count 만큼 따라간다 std::vector vSkillResult; }; //struct SMSG_SKILL_EFFECT : public SGameMessage //{ // SMSG_SKILL_EFFECT() : SGameMessage(MSG_SKILL_EFFECT) // { // caster = 0; // target = 0; // // skill_id = 0; // skill_level = 0; // // var = 0; // var2 = 0; // } // // AR_HANDLE caster; // AR_HANDLE target; // // int skill_id; // unsigned char skill_level; // // int var; // unsigned char var2; //}; //struct SMSG_SKILL_CASTING_TIME : public SGameMessage //{ // SMSG_SKILL_CASTING_TIME() : SGameMessage(MSG_SKILL_CASTING_TIME) // { // caster = 0; // tm = 0; // } // // AR_HANDLE caster; // AR_TIME tm; //}; //========================================================================================== struct SMSG_UPDATE_ITEM_COUNT : public SGameMessage { SMSG_UPDATE_ITEM_COUNT() : SGameMessage(MSG_UPDATE_ITEM_COUNT) { item_handle = 0; count = count_t( 0 ); } AR_HANDLE item_handle; count_t count; }; struct SMSG_TRADE : public SGameMessage { SMSG_TRADE() : SGameMessage(MSG_TRADE) { rq_mode = false; target_player = 0; mode = 0; memset( &item_info, 0, sizeof(item_info) ); bLocalPlyaer = false; bIncoming = false; } int rq_mode; AR_HANDLE target_player; std::string target_Name; bool bLocalPlyaer; bool bIncoming; ///< TRADE::REQUEST의 애매함 때문에 추가 (내가 신청하는 메시지나 신청받는 메시지나 똑같이 REQUEST임) - true면 신청 받는 (서버에서 오는) 메시지 char mode; TS_ITEM_INFO item_info; }; struct SMSG_REQUEST_BOOTH_NAME : public SGameMessage { SMSG_REQUEST_BOOTH_NAME() : SGameMessage( MSG_REQUEST_BOOTH_NAME ) { } std::vector< AR_HANDLE > *pvBoothList; }; struct SMSG_UI_BOOTH : public SGameMessage { SMSG_UI_BOOTH() : SGameMessage( IMSG_UI_BOOTH ) { nMode = 0; } enum BOOTH_TYPE { START_BOOTH = 0, END_BOOTH = 1, }; int nBoothType; std::string strBoothName; std::vector< money_t > vPriceList; std::vector< count_t > vCountList; std::vector< AR_HANDLE > vItemList; int nMode; ///< 0이면 판매, 1이면 구매 }; struct SMSG_USE_ITEM_RESULT : public SGameMessage { SMSG_USE_ITEM_RESULT() : SGameMessage(MSG_USE_ITEM_RESULT) { item_handle = 0; target_handle = 0; } AR_HANDLE item_handle; AR_HANDLE target_handle; }; struct SMSG_TAKE_ITEM_RESULT : public SGameMessage { SMSG_TAKE_ITEM_RESULT() : SGameMessage( MSG_TAKE_ITEM_RESULT ) { item_handle = 0; item_taker = 0; } AR_HANDLE item_handle; AR_HANDLE item_taker; }; struct SMSG_SKILLCARD_INFO : public SGameMessage { SMSG_SKILLCARD_INFO() : SGameMessage(MSG_SKILLCARD_INFO) { item_handle = 0; target_handle = 0; } AR_HANDLE item_handle; AR_HANDLE target_handle; ///< 0 이면 장착해지 }; struct SMSG_OPEN_STORAGE : public SGameMessage { SMSG_OPEN_STORAGE() : SGameMessage(MSG_OPEN_STORAGE) { maxStorageItemCount = 0; } int maxStorageItemCount; }; struct SMSG_OPEN_JEWEL_EQUIP : public SGameMessage { SMSG_OPEN_JEWEL_EQUIP() : SGameMessage(MSG_OPEN_JEWEL_EQUIP){} }; struct SMSG_OPEN_SOUL_REPAIR : public SGameMessage { SMSG_OPEN_SOUL_REPAIR() : SGameMessage(MSG_OPEN_SOUL_REPAIR){} }; struct SMSG_CHANGE_STORAGE : public SGameMessage { SMSG_CHANGE_STORAGE() : SGameMessage(MSG_CHANGE_STORAGE) { hItem = 0; nCount = count_t( 1 ); nMode = 0; } AR_HANDLE hItem; count_t nCount; int nMode; }; struct SMSG_MIX_RESULT : public SGameMessage { SMSG_MIX_RESULT() : SGameMessage(MSG_MIX_RESULT) { count = 0; pArHandle = NULL; } ~SMSG_MIX_RESULT() { SAFE_DELETE_ARRAY( pArHandle ); } unsigned count; ///< 이하 AR_HANDLE 이 count 만큼 붙게 됨. count 가 0 이면 조합 실패. unsigned char type; AR_HANDLE * pArHandle; }; struct SMSG_ITEM_DESTROY : public SGameMessage { SMSG_ITEM_DESTROY() : SGameMessage(MSG_ITEM_DESTROY) { item_handle = 0; } AR_HANDLE item_handle; }; // 아이템파괴 응답. struct SMSG_ERASE_ITEM : public SGameMessage { struct EraseItemInfo { //ItemBase::ItemCode code; AR_HANDLE handle; __int64 count; }; unsigned char item_count; EraseItemInfo * pItemInfo; SMSG_ERASE_ITEM() : SGameMessage(MSG_ITEM_ERASE) {} ~SMSG_ERASE_ITEM() { SAFE_DELETE_ARRAY( pItemInfo ); } }; struct SMSG_ITEM_INVEN : public SGameMessage { SMSG_ITEM_INVEN() : SGameMessage(MSG_ITEM_INVEN) { nItemCnt = 0; pItemInfo = NULL; } virtual ~SMSG_ITEM_INVEN() { SAFE_DELETE_ARRAY( pItemInfo ); } int nItemCnt; TS_ITEM_INFO * pItemInfo; AR_HANDLE handle; }; struct SMSG_ITEM_WEAR : public SGameMessage { SMSG_ITEM_WEAR() : SGameMessage(MSG_ITEM_WEAR) { handle = 0; for( int i(0); ItemBase::MAX_ITEM_SPARE_WEAR>i; i++ ) { nItemCode[i] = -1; nItemEnhance[i] = -1; nItemLevel[i] = -1; nAppearanceItemCode[i] = -1; } } AR_HANDLE handle; ItemBase::ItemCode nItemCode[ItemBase::MAX_ITEM_SPARE_WEAR]; int nItemEnhance[ItemBase::MAX_ITEM_SPARE_WEAR]; int nItemLevel[ItemBase::MAX_ITEM_SPARE_WEAR]; unsigned char elemental_effect_type[ItemBase::MAX_ITEM_SPARE_WEAR]; ItemBase::ItemCode nAppearanceItemCode[ItemBase::MAX_ITEM_SPARE_WEAR]; // 2012. 7. 24 - marine }; struct SMSG_ITEM_WEAR_INFO : public SGameMessage { SMSG_ITEM_WEAR_INFO() : SGameMessage(MSG_ITEM_WEAR_INFO) { item_handle = 0; wear_position = -1; target_handle = 0; enhance = -1; appearance_code = 0; } AR_HANDLE item_handle; short wear_position; ///< -1이면 장착 안된 아이템, 소환수의 경우는 순서대로 +1000 * n (n은 슬롯 번호) AR_HANDLE target_handle; ///< 크리처 핸들 int enhance; unsigned char elemental_effect_type; ItemBase::ItemCode appearance_code; }; struct SMSG_ITEM_DROP : public SGameMessage { SMSG_ITEM_DROP() : SGameMessage(MSG_ITEM_DROP_RESULT) { item_handle = 0; isAccepted = true; } AR_HANDLE item_handle; bool isAccepted; }; struct SMSG_ITEM_DROP_INFO : public SGameMessage { SMSG_ITEM_DROP_INFO() : SGameMessage(MSG_ITEM_DROP_INFO) { monster_handle = 0; item_handle = 0; } AR_HANDLE monster_handle; AR_HANDLE item_handle; }; struct SMSG_ITEM_TAKE : public SGameMessage { SMSG_ITEM_TAKE() : SGameMessage(MSG_ITEM_TAKE_RESULT) {} TS_ITEM_INFO item_info; }; //========================================================================================== //struct SMSG_SKILL_RESULT : public SGameMessage //{ // SMSG_SKILL_RESULT() : SGameMessage(MSG_SKILL_RESULT) // { // pSrc = NULL;//Src // pDst = NULL;//Dest // dwStartTime = 0; //Cur Time // fSpeed = 1.f; //Speed // nCount = 0; //Count // } // // SGameObject * pSrc; //Src // SGameObject * pDst; //Dest // DWORD dwStartTime; //Cur Time // float fSpeed; //Speed // unsigned int nCount; //Count // std::string strProjectile;//발사체 // std::string strAniName; //Animation Type //}; // //struct SMSG_SPELL_RESULT : public SGameMessage //{ // SMSG_SPELL_RESULT() : SGameMessage(MSG_SPELL_RESULT) // { // pSrc = NULL;//Src // pDst = NULL;//Dest // dwStartTime = 0; //Cur Time // fSpeed = 1.f; //Speed // nCount = 0; //Count // nProcessType = 0; //연출 Type // } // // SGameObject * pSrc; //Src // SGameObject * pDst; //Dest // DWORD dwStartTime; //Cur Time // float fSpeed; //Speed // unsigned int nCount; //Count // std::string strProjectile;//발사체 // unsigned int nProcessType; //연출 Type //}; struct SMSG_CMD_RESULT : public SGameMessage { SMSG_CMD_RESULT() : SGameMessage(MSG_CMD_RESULT) { } std::string strAniName; ///< Animation Type }; //========================================================================================== struct SMSG_CHATTING : public SGameMessage { SMSG_CHATTING() : SGameMessage(MSG_CHATTING) { handle = 0; len = 0; nChatType = 0; ///< CHAT_NORMAL; nNoticeOnly = 0; } AR_HANDLE handle; unsigned short len; int nChatType; std::string szSender; std::string strText; int nNoticeOnly; ///< 공지 채팅만 출력할 것인지 체크, kappamind. }; struct SMSG_CHATTING_REQUEST : public SGameMessage { SMSG_CHATTING_REQUEST() : SGameMessage(MSG_CHATTING_REQUEST) { memset( szTarget, 0, sizeof(szTarget) ); request_id = 0; type = 0; ///< CHAT_NORMAL; nSize = sizeof( *this ); } char szTarget[21]; unsigned char request_id; unsigned char type; std::string strText; }; struct SMSG_MARKET : public SGameMessage { SMSG_MARKET() : SGameMessage(MSG_MARKET) { item_count = 0; ///< 수 만큼 ItemInfo이 뒤에 붙음. pItemInfo = NULL; } ~SMSG_MARKET() { SAFE_DELETE_ARRAY( pItemInfo ); } struct ItemInfo { ItemBase::ItemCode code; __int64 price; int huntaholic_point; // #2.1.2.11.1 int arena_point; /// 2012.07.20 아레나 포인트 - prodongi }; AR_HANDLE npc_handle; ///< NULL 일수도 있음. ( NPC가 보내지 않은 특수한 경우 ) unsigned short item_count; ItemInfo * pItemInfo; }; struct SMSG_NPC_DIALOG : public SGameMessage { SMSG_NPC_DIALOG() : SGameMessage(MSG_NPC_DIALOG) { npc_handle = 0; nQuestCode = 0; nQuestTextID = 0; } enum { BUTTON_NORMAL = 0, BUTTON_QUEST_STARTABLE, BUTTON_QUEST_INPROGRESS, BUTTON_QUEST_FINISHABLE, BUTTON_DUNGEON_STONE, BUTTON_DONATION_PROP, }; struct DLGMENU { std::string strMenuName; std::string strTrigger; int nButtonType; DLGMENU( const char* szMenuName, const char* szTrigger, int nType = BUTTON_NORMAL ) : strMenuName( szMenuName ), strTrigger( szTrigger ), nButtonType( nType ) { } }; int nDialogType; AR_HANDLE npc_handle; ///< NULL 일수도 있음. ( NPC가 보내지 않은 특수한 경우 ) int nQuestCode; ///< Quest code... int nQuestTextID; ///< Quest text... std::string strTitle; STRING_VECTOR vtTexts; std::vector vtMenus; }; struct SMSG_TOOFAR_AS_CONTACTEDNPC : public SGameMessage { SMSG_TOOFAR_AS_CONTACTEDNPC() : SGameMessage( MSG_TOOFAR_AS_CONTACTEDNPC ) { } }; struct SMSG_CAMERA_EFFECT : public SGameMessage { SMSG_CAMERA_EFFECT() : SGameMessage(MSG_CAMERA_EFFECT) { nEffect = 0; fDeltaX = fDeltaY = 0.f; dwKeepTime = 0; }; int nEffect; float fDeltaX; float fDeltaY; DWORD dwKeepTime; }; //=================================================================================================== /// 시스템 메시지 struct STMSG_TIMESYNC : public SGameMessage { STMSG_TIMESYNC() : SGameMessage(TMSG_TIMESYNC) { time = 0; } AR_TIME time; }; struct STMSG_CHANGEAVATAR : public SGameMessage { STMSG_CHANGEAVATAR( AR_HANDLE hPlayer ) : SGameMessage( TMSG_CHANGEAVATAR ), handle( hPlayer ) { } AR_HANDLE handle; }; struct STMSG_REQ_CLOSE : public SGameMessage { STMSG_REQ_CLOSE( bool bByWndMsg = true ) : SGameMessage( TMSG_REQ_CLOSE ), m_bByWndMsg( bByWndMsg ) { } bool m_bByWndMsg; }; struct STMSG_REQ_CLOSE_EX : public SGameMessage { STMSG_REQ_CLOSE_EX() : SGameMessage( TMSG_REQ_CLOSE_EX ) { } }; struct STMSG_SYSTEM_OPTION : public SGameMessage { enum _OPTION_TYPE { SYSOPTION_BLOOMEFFECT, SYSOPTION_TEXQUALITY, SYSOPTION_BACKGROUND, SYSOPTION_BGSOUND, SYSOPTION_EFFECTSOUND, // 차후 추가 SYSOPTION_RESOLUTION, SYSOPTION_SCREENBIT, SYSOPTION_BRIGHT, SYSOPTION_MODELING, SYSOPTION_SHADOW, SYSOPTION_CHARACTER, SYSOPTION_PROP, SYSOPTION_MAINSOUND, SYSOPTION_SURROUNDSOUND, SYSOPTION_FACECUT, SYSOPTION_MINIMAP, SYSOPTION_ZOOM, }; STMSG_SYSTEM_OPTION( _OPTION_TYPE Type, int nOption ) : SGameMessage( TMSG_SYSTEM_OPTION ), m_Type( Type ), m_nOption( nOption ) { } _OPTION_TYPE m_Type; int m_nOption; }; struct STMSG_REQ_SYSTEM_OPTION : public SGameMessage { STMSG_REQ_SYSTEM_OPTION( STMSG_SYSTEM_OPTION::_OPTION_TYPE Type ) : SGameMessage( TMSG_REQ_SYSTEM_OPTION ), m_Type( Type ), m_nGetOption( 0 ) { } STMSG_SYSTEM_OPTION::_OPTION_TYPE m_Type; int m_nGetOption; }; //=================================================================================================== /// Cheating 메세지 struct SCMSG_WARP : public SGameMessage { SCMSG_WARP() : SGameMessage(CMSG_WARP) { x = y = z = 0; layer = 0; } AR_UNIT x,y,z; unsigned char layer; }; struct SMSG_CONSOLE_BUILDER : public SGameMessage { SMSG_CONSOLE_BUILDER() : SGameMessage(MSG_CONSOLE_BUILDER), m_nValueCount( 0 ), m_bOut( false ), m_nCommandType( 0 ) {} ~SMSG_CONSOLE_BUILDER() { m_vecValueList.clear(); } enum KEY_TYPE { TYPE_GAME = 0, TYPE_OPTION, TYPE_DEBUG, TYPE_LUA, TYPE_DB, }; bool m_bOut; int m_nCommandType; std::string m_strKey; int m_nValueCount; std::vector m_vecValueList; }; ////////////////////////////////////////////////////////////////////////// /// 지역 관련 struct SMSG_CHANGE_LOCATION : public SGameMessage { SMSG_CHANGE_LOCATION() : SGameMessage( MSG_CHANGE_LOCATION ) { prev_location_id = 0; cur_location_id = 0; } int prev_location_id; int cur_location_id; }; ////////////////////////////////////////////////////////////////////////// /// 날씨 관련 struct SMSG_GET_WEATHER_INFO : public SGameMessage { SMSG_GET_WEATHER_INFO() : SGameMessage( MSG_GET_WEATHER_INFO ) { region_id = 0; } unsigned int region_id; }; struct SMSG_WEATHER_INFO : public SGameMessage { SMSG_WEATHER_INFO() : SGameMessage( MSG_WEATHER_INFO ) { region_id = 0; weather_id = 0; } enum { CLEAR = 0, CLOUDY = 1, FOGGY = 2, DRIZZLINGLY = 3, RAINY = 4, SNOWY = 5, }; unsigned int region_id; unsigned short weather_id; }; struct SMSG_TURN_ON_PK_MODE : public SGameMessage { SMSG_TURN_ON_PK_MODE() : SGameMessage( MSG_TURN_ON_PK_MODE ) {} }; struct SMSG_TURN_OFF_PK_MODE : public SGameMessage { SMSG_TURN_OFF_PK_MODE() : SGameMessage( MSG_TURN_OFF_PK_MODE ) {} }; struct SMSG_EMOTION : public SGameMessage { SMSG_EMOTION() : SGameMessage( MSG_EMOTION ) { handle = 0; emotion = 0; } AR_HANDLE handle; int emotion; }; struct SMSG_GAME_TIME : public SGameMessage { SMSG_GAME_TIME() : SGameMessage( MSG_GAME_TIME ) { t = 0; game_time = 0; } AR_TIME t; time_t game_time; }; // sonador 3.10.2 PC 방 혜택 관련 라크 획득 시스템 메시지 변경 struct SMSG_GET_CHAOS : public SGameMessage { SMSG_GET_CHAOS() : SGameMessage( MSG_GET_CHAOS ) { hPlayer = 0; hCorpse = 0; nChaos = 0; nBonusType = CHAOS_BONUS_NONE; nBonusPercent = 0; nBonus = 0; } enum CHAOS_BONUS_TYPE { CHAOS_BONUS_NONE = 0, CHAOS_BONUS_PCBANG = 1, CHAOS_BONUS_PREMIUM_PCBANG = 2, }; AR_HANDLE hPlayer; AR_HANDLE hCorpse; int nChaos; char nBonusType; unsigned char nBonusPercent; int nBonus; }; /// 기공 struct SMSG_ENERGY : public SGameMessage { SMSG_ENERGY() : SGameMessage( MSG_ENERGY ) { handle = 0; energy = 0; } AR_HANDLE handle; short energy; }; struct SMSG_ITEM_COOL_TIME : public SGameMessage { SMSG_ITEM_COOL_TIME() : SGameMessage( MSG_ITEM_COOL_TIME ) {} AR_TIME cool_time[TS_SC_ITEM_COOL_TIME::MAX_ITEM_COOLTIME_GROUP]; }; struct SMSG_STATE_RESULT : public SGameMessage { SMSG_STATE_RESULT() : SGameMessage( MSG_STATE_RESULT ) {} AR_HANDLE caster_handle; AR_HANDLE target_handle; int code; unsigned short level; unsigned short result_type; ///< 위의 enum 값 중 하나 int value; ///< enum에 해당하는 종류의 수치 int target_value; ///< 처리 후 target의 해당 수치 bool final; int total_amount; /* AR_HANDLE caster_handle; AR_HANDLE target_handle; int target_hp; int code; unsigned short level; int damage; bool final; int total_damage;*/ }; struct SMSG_PARTY_COMMAND : public SGameMessage { enum { PARTY_NONE, PARTY_CREATE, ///< 파티 생성 PARTY_INVITE, ///< 파티 초대 PARTY_KICK, ///< 파티 추방 PARTY_DESTROY, ///< 파티 파괴 PARTY_LEAVE, ///< 파티 탈퇴 PARTY_TRANSFER, ///< 파티 양도 PARTY_OPTION, ///< 파티 옵션 }; SMSG_PARTY_COMMAND() : SGameMessage( MSG_PARTY_COMMAND ) { mode = PARTY_NONE; } SMSG_PARTY_COMMAND( int _mode, const char * pStrName ) : SGameMessage( MSG_PARTY_COMMAND ), mode( _mode ), strName( pStrName ) { } int mode; std::string strName; }; struct SMSG_FRIEND_COMMAND : public SGameMessage { enum { FRIEND_NONE, FRIEND_ADD, ///< 친구 추가 FRIEND_DELETE, ///< 친구 삭제 CUT_ADD, ///< 차단 추가 CUT_DELETE, ///< 차단 삭제 }; SMSG_FRIEND_COMMAND( int nmode, const char* lpName ) : SGameMessage( MSG_FRIEND_COMMAND ), strName(lpName), mode(nmode) , target( 0 ) {} int mode; std::string strName; AR_HANDLE target; }; struct SMSG_ALLIANCE_COMMAND : public SGameMessage { enum { ALLIANCE_NONE, ALLIANCE_ADD, ///< 친구 추가 ALLIANCE_DELETE, ///< 친구 삭제 }; SMSG_ALLIANCE_COMMAND( int nmode, const char* lpName ) : SGameMessage( MSG_ALLIANCE_COMMAND ), strName(lpName), mode(nmode){} int mode; std::string strName; }; struct SMSG_CHAT_RESULT : public SGameMessage { SMSG_CHAT_RESULT() : SGameMessage( MSG_CHAT_RESULT ) {} unsigned char type; unsigned char percentage; int result; int reserved; }; struct SMSG_SCRIPT_SHOW_WINDOW : public SGameMessage { SMSG_SCRIPT_SHOW_WINDOW() : SGameMessage( MSG_SCRIPT_SHOW_WINDOW ) { } std::string strWindow; ///< 윈도우 열어라 std::string strTrigger; ///< 트리거 std::string strArgument; ///< 이름이나, 기타 등등 }; struct SMSG_TAKEOUT_COMMERCIAL_ITEM : public SGameMessage { SMSG_TAKEOUT_COMMERCIAL_ITEM() : SGameMessage( MSG_TAKEOUT_COMMERCIAL_ITEM ) { commercial_item_uid = 0; count = 0; } unsigned int commercial_item_uid; ///< 꺼낼아이템cuid unsigned short count; ///< 꺼낼갯수 }; struct SMSG_BELT_SLOT_INFO : public SGameMessage { SMSG_BELT_SLOT_INFO() : SGameMessage( MSG_BELT_SLOT_INFO ) { } AR_HANDLE handle[8]; }; struct SMSG_COMMERCIAL_STORAGE_INFO : public SGameMessage { SMSG_COMMERCIAL_STORAGE_INFO() : SGameMessage( MSG_COMMERCIAL_STORAGE_INFO ) { total_item_count = 0; new_item_count = 0; } unsigned short total_item_count; unsigned short new_item_count; }; struct SMSG_COMMERCIAL_STORAGE_LIST : public SGameMessage { SMSG_COMMERCIAL_STORAGE_LIST() : SGameMessage( MSG_COMMERCIAL_STORAGE_LIST ) { } unsigned short count; std::vector vItemList; }; struct SMSG_QUEST_UPDATA : public SGameMessage { SMSG_QUEST_UPDATA() : SGameMessage( MSG_QUEST_UPDATA ) {} int nQuestID; int nStatus[QuestInstance::MAX_STATUS]; std::string strOldQuest; unsigned char nProgress; }; // 2011.07.12 - servantes struct SMSG_END_QUEST : public SGameMessage { SMSG_END_QUEST( int _code, unsigned char _nOptionalReward ) : SGameMessage( MSG_END_QUEST ), quest_code(_code), nOptionalReward(_nOptionalReward) {} int quest_code; unsigned char nOptionalReward; }; struct SMSG_RESURRECTION : public SGameMessage { SMSG_RESURRECTION( AR_HANDLE owner, int useitem, bool compete, bool deathmatch = false ) : SGameMessage( IMSG_RESURRECTION ) , hOwner( owner ) , nUseItem( useitem ) , bCompete( compete ) , bDeathmatch( deathmatch ) { } AR_HANDLE hOwner; // Normal resurrection int nUseItem; // Resurrection by an item bool bCompete; // After duel bool bDeathmatch; // When dead in deathmatch }; /// 플레이어가 타 플레이어에게 대련 요청 struct SMSG_CS_COMPETE_REQUEST : public SGameMessage { SMSG_CS_COMPETE_REQUEST() : SGameMessage( MSG_CS_COMPETE_REQUEST ) { } unsigned char compete_type; ///< _COMPETE_TYPE 값이 사용됨 char requestee[ 31 ]; ///< 도전 받은 플레이어 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨) }; /// 대련 요청받은 플레이어에게 요청 전달 struct SMSG_SC_COMPETE_REQUEST : public SGameMessage { SMSG_SC_COMPETE_REQUEST() : SGameMessage( MSG_SC_COMPETE_REQUEST ) { } unsigned char compete_type; ///< _COMPETE_TYPE 값이 사용됨 char requester[ 31 ]; ///< 도전 받은 플레이어 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨) }; /// 대련 요청받은 플레이어가 응답 struct SMSG_CS_COMPETE_ANSWER : public SGameMessage { SMSG_CS_COMPETE_ANSWER() : SGameMessage( MSG_CS_COMPETE_ANSWER ) { } unsigned char compete_type; ///< _COMPETE_TYPE 값이 사용됨 unsigned char answer_type; ///< _COMPETE_ANSWER_TYPE 값이 사용됨 }; /// 최초 대련 요청에 대한 결과 전달(수락/거부/자동거부) struct SMSG_SC_COMPETE_ANSWER : public SGameMessage { SMSG_SC_COMPETE_ANSWER() : SGameMessage( MSG_SC_COMPETE_ANSWER ) { } unsigned char compete_type; ///< _COMPETE_TYPE 값이 사용됨 unsigned char answer_type; ///< _COMPETE_ANSWER_TYPE 값이 사용됨 char requestee[ 31 ]; ///< 도전 받은 플레이어 }; /// 대련 시작 전 카운트 다운 개시 struct SMSG_SC_COMPETE_COUNTDOWN : public SGameMessage { SMSG_SC_COMPETE_COUNTDOWN() : SGameMessage( MSG_SC_COMPETE_COUNTDOWN ) { } unsigned char compete_type; ///< _COMPETE_TYPE 값이 사용됨 char competitor[ 31 ]; ///< 도전 받은 플레이어 AR_HANDLE handle_competitor; ///< 상대방플레이어핸들(1:1 PVP에서만 사용됨) }; /// 대련 시작 struct SMSG_SC_COMPETE_START : public SGameMessage { SMSG_SC_COMPETE_START() : SGameMessage( MSG_SC_COMPETE_START ) { } unsigned char compete_type; ///< _COMPETE_TYPE 값이 사용됨 char competitor[ 31 ]; ///< 도전 받은 플레이어 }; /// 대련 종료(결과 방송) struct SMSG_SC_COMPETE_END : public SGameMessage { SMSG_SC_COMPETE_END() : SGameMessage( MSG_SC_COMPETE_END ) { } unsigned char compete_type; ///< _COMPETE_TYPE 값이 사용됨 unsigned char end_type; ///< _COMPETE_END_TYPE 값이 사용됨 char winner[ 31 ]; ///< 승자 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨) char loser[ 31 ]; ///< 패자 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨) }; struct SMSG_CS_RANKING_TOP_RECORD : public SGameMessage { SMSG_CS_RANKING_TOP_RECORD() : SGameMessage( MSG_CS_RANKING_TOP_RECORD ) { } unsigned char ranking_type; ///< _RANKING_TYPE 값이 사용됨 }; struct SMSG_SC_RANKING_TOP_RECORD : public SGameMessage { SMSG_SC_RANKING_TOP_RECORD() : SGameMessage( MSG_SC_RANKING_TOP_RECORD ) { } unsigned char ranking_type; ///< _RANKING_TYPE 값이 사용됨 unsigned short requester_rank; ///< 요청자 랭크(0이면 랭킹 미등록) __int64 requester_score; ///< 요청자 점수 struct RANKING_RECORD { unsigned short rank; char ranker_name[ 31 ]; __int64 score; }; unsigned short record_count; RANKING_RECORD ranking_record[10]; }; struct SMSG_SC_CREATE_SECURITY_NO : public SGameMessage { SMSG_SC_CREATE_SECURITY_NO() : SGameMessage( MSG_SC_CREATE_SECURITY_NO ) {} }; struct SMSG_REQUEST_SECURITY_NO : public SGameMessage { SMSG_REQUEST_SECURITY_NO() : SGameMessage( MSG_REQUEST_SECURITY_NO ) {} enum { SC_NONE, SC_OPEN_STORAGE }; int mode; ///< 0 - None, 1 - Storage open }; struct SMSG_SECURITY_NO : public SGameMessage { SMSG_SECURITY_NO() : SGameMessage( MSG_SECURITY_NO ) {} int mode; ///< 0 - None, 1 - Storage open char security_no[19]; }; struct SMSG_CS_CREATE_SECURITY_NO : public SGameMessage { SMSG_CS_CREATE_SECURITY_NO() : SGameMessage( MSG_CS_CREATE_SECURITY_NO ) {} char password[19]; char security_no[19]; }; struct SMSG_CHANGE_SECURITY_NO : public SGameMessage { SMSG_CHANGE_SECURITY_NO() : SGameMessage( MSG_CHANGE_SECURITY_NO ) {} char security_no_old[19]; char security_no[19]; }; struct SMSG_CS_REQUEST_SECURITY_NO_CHANGE : public SGameMessage { SMSG_CS_REQUEST_SECURITY_NO_CHANGE() : SGameMessage( MSG_CS_REQUEST_SECURITY_NO_CHANGE ) {} }; struct SMSG_CS_REQUEST_CLEAR_SECURITY_NO : public SGameMessage { SMSG_CS_REQUEST_CLEAR_SECURITY_NO() : SGameMessage( MSG_CS_REQUEST_CLEAR_SECURITY_NO ) {} }; struct SMSG_SC_CLEAR_SECURITY_NO : public SGameMessage { SMSG_SC_CLEAR_SECURITY_NO() : SGameMessage( MSG_SC_CLEAR_SECURITY_NO ) { } bool clearable; }; struct SMSG_CS_CLEAR_SECURITY_NO : public SGameMessage { SMSG_CS_CLEAR_SECURITY_NO() : SGameMessage( MSG_CS_CLEAR_SECURITY_NO ) { } char password[19]; char security_no[19]; }; /* const int MSG_CS_REQUEST_CLEAR_SECURITY_NO = 141; const int MSG_SC_CLEAR_SECURITY_NO = 142; const int MSG_CS_CLEAR_SECURITY_NO = 143; */ struct SMSG_SC_CHANGE_SECURITY_NO : public SGameMessage { SMSG_SC_CHANGE_SECURITY_NO() : SGameMessage( MSG_SC_CHANGE_SECURITY_NO ) { } }; struct SMSG_NPC_TRADE_INFO : public SGameMessage { SMSG_NPC_TRADE_INFO() : SGameMessage( MSG_NPC_TRADE_INFO ) { } bool is_sell; ItemBase::ItemCode code; count_t count; money_t price; money_t huntaholic_point; // #2.1.2.11.1 money_t arena_point; AR_HANDLE target; void operator = ( const TS_SC_NPC_TRADE_INFO& rhs ) { this->is_sell = rhs.is_sell; this->code = rhs.code; this->count = count_t( rhs.count ); this->price = money_t( rhs.price ); this->huntaholic_point = money_t( rhs.huntaholic_point ); // #2.1.2.11.1 this->arena_point = money_t(rhs.arena_point); this->target = rhs.target; } }; //1:1 대련 관련 챗팅 메시지 수정 // 2009-01-30:hunee // struct SMSG_WHISPER_ADDONWND : public SGameMessage // { // SMSG_WHISPER_ADDONWND() : SGameMessage( MSG_WHISPER_ADDONWND ) // { // } // // AR_HANDLE target; // // struct Challenge // { // }; // // struct Whisper // { // }; // }; // 2009.02.24 대련 수정 struct SMSG_COMMAND_BY_ADDONWND : public SGameMessage { enum COMMAND_TYPE { COMMAND_CHALLENGE = 0, COMMAND_WHISPER, COMMAND_MAX, }; COMMAND_TYPE command_type; SMSG_COMMAND_BY_ADDONWND( COMMAND_TYPE type ) : SGameMessage( MSG_COMMAND_BY_ADDONWND ) , command_type( type ) { } AR_HANDLE target; struct Challenge { }; struct Whisper { }; }; struct SMSG_GAME_OUT : public SGameMessage { SMSG_GAME_OUT() : SGameMessage( MSG_GAME_OUT ) , character_select( false ) {} bool character_select; ///< true캐릭 선택 화면 false면 게임 종료 }; /// sonador 1.8.5 자동 따라가기 구현 struct SMSG_AUTO_FOLLOW : public SGameMessage { SMSG_AUTO_FOLLOW() : SGameMessage( MSG_AUTO_FOLLOW ) {} }; // sonador 10.2.1 팻 시스템 구현 /**---------------------------------------------------------------------------------------- @struct SMSG_UNSUMMON_PET @brief unsummon pet @author sonador ----------------------------------------------------------------------------------------*/ struct SMSG_UNSUMMON_PET : public SGameMessage { SMSG_UNSUMMON_PET() : SGameMessage( MSG_UNSUMMON_PET ) { pet_handle = 0; } AR_HANDLE pet_handle; }; /**---------------------------------------------------------------------------------------- @struct SMSG_ADD_PET_INFO @brief add a information about pet to game @author sonador -----------------------------------------------------------------------------------------*/ struct SMSG_ADD_PET_INFO : public SGameMessage { SMSG_ADD_PET_INFO() : SGameMessage( MSG_ADD_PET_INFO ) { pet_handle = 0; code = 0; memset( name, 0, sizeof(name) ); }; AR_HANDLE pet_handle; //!< pet handle AR_HANDLE cage_handle; //= 0 && nPropIndex < 9 ); return static_cast< _PROP_STATE >( ( status >> ( nPropIndex * 2 ) ) & 0x3 ); } bool IsActivatedBingoLine( int nLineIndex ) { assert( nLineIndex >= 0 && nLineIndex < 8 ); return ( ( status >> 24 ) & ( 1 << nLineIndex ) ) != 0; } int status; }; struct SMSG_BATTLE_ARENA_BATTLE_SCORE : public SGameMessage { SMSG_BATTLE_ARENA_BATTLE_SCORE() : SGameMessage(MSG_BATTLE_ARENA_BATTLE_SCORE) { playerScore = NULL; } ~SMSG_BATTLE_ARENA_BATTLE_SCORE() { SAFE_DELETE_ARRAY(playerScore); } struct sTeamScore { short totalKillCount; // 각 팀별 킬 수 총합 short totalDeathCount; // 각 팀별 데스 수 총합 short score; // 각 팀별 현재 점수 }; struct sPlayerScore { char name[ 19 ]; short killCount; short deathCount; short propActivateCount; int totalGainAP; }; sTeamScore teamScore[ 2 /* GameRule::BATTLE_ARENA_MAX_TEAM_COUNT */ ]; unsigned char playerScoreCount; sPlayerScore* playerScore; }; struct SMSG_BATTLE_ARENA_JOIN_BATTLE : public SGameMessage { SMSG_BATTLE_ARENA_JOIN_BATTLE() : SGameMessage(MSG_BATTLE_ARENA_JOIN_BATTLE) {} int teamNo; AR_HANDLE handle; int jobID; char name[ 19 ]; }; struct SMSG_BATTLE_ARENA_DISCONNECT_BATTLE : public SGameMessage { SMSG_BATTLE_ARENA_DISCONNECT_BATTLE() : SGameMessage(MSG_BATTLE_ARENA_DISCONNECT_BATTLE) {} AR_HANDLE handle; }; struct SMSG_BATTLE_ARENA_RECONNECT_BATTLE : public SGameMessage { SMSG_BATTLE_ARENA_RECONNECT_BATTLE() : SGameMessage(MSG_BATTLE_ARENA_RECONNECT_BATTLE) {} // 유저가 로그아웃되었다가 다시 접속될 경우 서버에서 AR_HANDLE값이 재부여되기 때문에 // 클라이언트에서는 기존의 AR_HANDLE 값을 사용하면 안되고 이 패킷으로 받은 값으로 갱신해서 사용해야 함 // 이 경우 어떤 유저가 재접속했는지는 szName을 기준으로 처리해야 함 char name[ 19 ]; AR_HANDLE newHandle; }; struct SMSG_BATTLE_ARENA_RESULT : public SGameMessage { SMSG_BATTLE_ARENA_RESULT() : SGameMessage(MSG_BATTLE_ARENA_RESULT), mvp(NULL) {} ~SMSG_BATTLE_ARENA_RESULT() { SAFE_DELETE_ARRAY(mvp); } /* // 아레나 경기 종료 타입 enum _ARENA_END_TYPE { AET_UNKNOWN = 0, AET_ONE_TEAM_NO_MEMBER = 1, // 한 팀의 멤버가 모두 이탈하여 경기 종료(종료 유형이지만 보상이 없다는 내용도 포함) AET_MAX_SCORE_REACHED = 2, // 목표 점수 도달로 경기 종료 AET_TIME_OVER = 3, // 시간 초과로 경기 종료 }; // 아레나 경기 보상 타입 enum _ARENA_REWARD_TYPE { ART_UNKNOWN = 0, ART_FULL_REWARD = 1, // 값 없음(지정 안하면 이거) ART_HALF_REWARD_BY_FEW_MEMBER = 2, // 한 팀의 멤버 수가 팀 최대 인원의 50% 미만이어서 보상이 절반으로 감소 ART_NO_REWARD_BY_NO_MEMBER = 3, // 한 팀의 멤버가 모두 이탈해서 경기가 중단되어 보상 없음 ART_NO_REWARD_BY_MIN_TIME = 4, // 최소 경기 시간 미달로 인해 보상 없음 ART_NO_REWARD_BY_EXERCISE = 5, // 연습 경기는 보상 없음 }; */ _ARENA_END_TYPE endType; _ARENA_REWARD_TYPE rewardType; int winnerTeamNo; // 0: 연합군, 1:마녀군 struct sMvp { char name[19]; }; unsigned char mvpCount; sMvp* mvp; }; struct SMSG_BATTLE_ARENA_ABSENCE_CHECK : public SGameMessage { SMSG_BATTLE_ARENA_ABSENCE_CHECK() : SGameMessage(MSG_BATTLE_ARENA_ABSENCE_CHECK) {} AR_TIME limitTime; }; struct SMSG_BATTLE_ARENA_PENALTY_INFO : public SGameMessage { SMSG_BATTLE_ARENA_PENALTY_INFO() : SGameMessage(MSG_BATTLE_ARENA_PENALTY_INFO) {} AR_TIME blockTime; int penaltyCount; AR_TIME penaltyCountTime; }; struct SMSG_BATTLE_ARENA_UPDATE_WAIT_USER_COUNT : public SGameMessage { SMSG_BATTLE_ARENA_UPDATE_WAIT_USER_COUNT() : SGameMessage(MSG_BATTLE_ARENA_UPDATE_WAIT_USER_COUNT) {} int waitUserCount; }; struct SMSG_BATTLE_ARENA_PROMOTE : public SGameMessage { SMSG_BATTLE_ARENA_PROMOTE() : SGameMessage(MSG_BATTLE_ARENA_PROMOTE) {} }; struct SMSG_KMOVE : public SGameMessage { SMSG_KMOVE() : SGameMessage(MSG_KMOVE) { handle = 0; start_time = 0; bReqMove = false; pos_target = K3DVector(0,0,0); speed = 0; } ~SMSG_KMOVE() { m_vecMoveInfo.clear(); } AR_HANDLE handle; AR_TIME start_time; bool bReqMove; K3DVector pos_target; ///< 이동 할 위치 unsigned char speed; std::vector< ArPosition > m_vecMoveInfo; }; struct SMSG_DECOMPOSE_DO : public SGameMessage { SMSG_DECOMPOSE_DO() : SGameMessage( IMSG_DECOMPOSE_DO ) { } struct IN_DATA { IN_DATA() { _handle = 0; _count = 1; } AR_HANDLE _handle; unsigned int _count; }; vector m_vecItemData; }; struct SMSG_DECOMPOSE_RESULT : public SGameMessage { SMSG_DECOMPOSE_RESULT() : SGameMessage( IMSG_DECOMPOSE_RESULT ) { } typedef struct stDecomposeInfo { AR_HANDLE m_hItem; UINT m_nItemCount; stDecomposeInfo() : m_hItem( NULL ) , m_nItemCount( NULL ) { } }DECOMPOSE_INFO, *PDECOMPOSE_INFO; vector m_vecItemInfo; }; struct SMSG_CHANGE_SKIN_COLOR : public SGameMessage { SMSG_CHANGE_SKIN_COLOR() : SGameMessage( MSG_CHANGE_SKIN_COLOR ) , hPlayer( NULL ) , dwSkinColor( NULL ) { } AR_HANDLE hPlayer; DWORD dwSkinColor; }; struct SMSG_PARTYMATCH_MEMBER : public SGameMessage { SMSG_PARTYMATCH_MEMBER(): SGameMessage( MSG_PARTYMATCH_MEMBER ) { } int nRoom; AR_HANDLE nMaster; // master ID 아래에 pMeber중 하나가 이와 같은 값이다. STRUCT_PARTYMATCH_MEMBER pMember[PARTYMATCH_MEMBER_MAX]; }; struct SMSG_PARTYMATCH_LIST : public SGameMessage { SMSG_PARTYMATCH_LIST() : SGameMessage( MSG_PARTYMATCH_LIST ) { } int nPage; int nRoomTotal; STRUCT_PARTYMATCH_ROOM pRoom[PARTYMATCH_ROOM_PAGE]; }; struct SMSG_PARTYMATCH_ACTION : public SGameMessage { SMSG_PARTYMATCH_ACTION() : SGameMessage( MSG_PARTYMATCH_ACTION ) { } int nAction; int nPage; AR_HANDLE nMaster; // master ID 아래에 pMeber중 하나가 이와 같은 값이다. STRUCT_PARTYMATCH_ROOM stRoom; }; #pragma pack()