#pragma once #ifndef DBPROXY_DBCHARARACTER_H #define DBPROXY_DBCHARARACTER_H //================================================================================================== /// DBCharacter class /** @author Kim Min Wook < taiyo@webzen.com > @since 2006. 6. 26~ @description - DBUser¿¡¼­ ºÐ¸® : ¸®ÆÑÅ丵 @history - 09.05.13|waverix|ÄÚµåÁ¤¸® - 10.04.16|waverix|fit in coding style - 10.04.18|waverix|reorder data fields based on member size and access rates */ //================================================================================================== #include #include #include #include "QueryObjects/StructInQuery.h" #include "ProxyNodes/DBQueryProxyNode.h" //================================================================================================== // (f100804.6L) remove DB_SI_~ enumeration // because of ambigous enumeration type has caused an invalid usage /* enum { DB_SI_TEMPINVENTORY = 0, DB_SI_INVENTORY, DB_SI_EQUIPMENT, DB_SI_SKILL, DB_SI_QUICK, DB_SI_STYLE, DB_SI_MAX, }; */ class DBUser; class WayPoint; class CharWayPoint; class Query_Char_Update; class Query_Char_Update_Inventory; class Query_Warehouse_Update; class GuildWarehouseInfo; class CollectedList; struct SERVER_CHARACTER_PART; //================================================================================================== class DBCharacter { enum { _DBP_UPDATE_CYCLE_DELAY = 1000 * 60 * 5, //< Àӽà : 5ºÐ µô·¹ÀÌ }; public: DBCharacter(void); virtual ~DBCharacter(void); BASE_PLAYERINFO* GetInfo() const; void SetInfo(BASE_PLAYERINFO* player_info); CHARGUID GetCharGuid() const; const TCHAR* GetCharName() const; void SetCharName(char* char_name); LEVELTYPE GetLV() const; BYTE GetClassCode() const; // (f100730.4L) export field... DBUser* GetParentDBUser() const; #ifdef _JP_0_20100723_GAMECHU_AUTHFLOW_ GAMECHUUSN GetGameChuUSN() const; VOID SetGameChuUSN(GAMECHUUSN gamechu_usn); #endif #ifdef _NA_20100307_BETAKEY_SYSTEM BETAKEY GetBetaKey() const; VOID SetBetakey(BETAKEY betakey); #endif #ifdef _NA_20100307_BETAKEY_SYSTEM #endif //C_NA_0_20100520_ACSYSTEM_CHANGED inline DBCharacter_Achievements* GetAchievementInfo(); void SerializeAchievementInfo(Character_Achievements& achievement_info, eSERIALIZE eType); #ifdef _NA_20100106_REPURCHAS_BUGFIX_2496 void SerializeRepurchasItemInfo(REPURCHASITEM_TOTAL_INFO& RepurchasItems, eSERIALIZE eType); #endif // //_KR_0_20091021_FIRENDINVITATION_EXTEND void SerializeFriendListInfo(CHAR_INVITATEDFRIEND_INFOs& Invitatedfriend_count, eSERIALIZE serialize_type); void SerializeCharInfo(BASE_PLAYERINFO& rCharInfo, eSERIALIZE eType); void SerializeMissionStream(BYTE* pMissionStream, WORD wSize, eSERIALIZE se); void SerializeStateInfo(STATE_DETAIL_TOTAL_INFO& INOUT rStateTotalInfo, STATE_GM_INFO& INOUT rStateGMInfo, eSERIALIZE se); // CHANGES, f100817.2L, split a composed SerializeItemStream method to it of load and it of store void SerializeItemStreamLoad(SLOTIDX slot_index, ITEMSLOTEX_INSERVER* INOUT slot_array, POSTYPE* result_number_of_slots); void SerializeItemStreamStore(SLOTIDX slot_index, const ITEMSLOTEX_INSERVER* slot_array, POSTYPE number_of_slots); void SetExtraInfoQueried(bool queried) { extra_info_.queried_ = queried; }; bool GetExtraInfoQueried() { return extra_info_.queried_; }; void SetExtraInfoModified(bool modified) { extra_info_.modified_ = modified; }; bool GetExtraInfoModified() { return extra_info_.modified_; }; #ifdef _NA_006372_20130108_BADGE_ITEM ToggleItemInfos& GetToggleItemInfo() { return extra_info_.toggle_item_info_; }; #endif //_NA_006372_20130108_BADGE_ITEM // _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND BattleGroundRecordInfos& GetBattleGroundRecordInfos() { return extra_info_.battle_ground_record_infos_; } #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH GoldRushRecordInfos& GetGoldRushRecordInfos() { return extra_info_.goldrush_record_infos_; } #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH CTime GetDailyQuestResetTime(); void SetDailyQuestResetTime(CTime _daily_quest_reset_item_use_time); #ifdef _NA_007086_20140318_MONSTERBOOK MonsterBook& GetMonsterBook() { return monster_book_; }; #endif //_NA_007086_20140318_MONSTERBOOK #ifdef _NA_008404_20150712_MINIGAME_SYSTEM MiniGameBingoInfos& GetMiniGameBingoInfos() { return extra_info_.minigame_bingo_infos; } #endif //_NA_008404_20150712_MINIGAME_SYSTEM // µðºñ¿¡¼­ ij¸¯ÅÍ Á¤º¸¸¦ °¡Á® ¿ÔÀ» ¶§ void OnInit(DBUser* db_user); void OnRelease(); void OnConnect(); void OnDisconnect(); void Updatea(); //void UpdateByGuildWarehouse(GuildWarehouseInfo*); void ReleaseGuildWarehouse(); void BindGuildWarehouse(GuildWarehouseInfo* p); GuildWarehouseInfo* GetGuildWarehouse() const; void Serialize(SERVER_CHARACTER_PART& part, eSERIALIZE se); bool OnSetInfo(const sQUERY_CHARACTER* queried_char_info); // (CHANGES) (f100324.1L) (WAVERIX) add interface for inventory stream alignment function \ // detached from 'OnSetInfo'. // (WARNING) don't call directly on the current version (100324) bool OnSetInfoInventory(const sQUERY_CHARACTER* queried_char_info); // f100928.2L, this routine support a nested data synchronization on all loaded data bool SynchronizeDataBeforeSendCharInfo(SERVER_CHARACTER_PART* const player_part); bool UpdateCharInfo(); bool UpdateInventory(); bool UpdateSubData(); // skill & perk, ... // void MakeQuery_Char_Update(Query_Char_Update* query); void MakeQuery_Char_Update_Inventory(Query_Char_Update_Inventory* query); void SendAllDataToGameServer(); WayPoint* GetWayPoint() const; CharWayPoint* GetCharWayPoint() const; CollectedList* GetCollectedList() const; int GetEventUseTime() const; void SetLoginTime(time_t t); time_t GetLoginTime() const; void OnDelete(); void OnRecover(); bool IsDeleted() const; #ifdef _JP_20110222_INGAME_CHARNAME_CHANGE void SetReNameStatus(const int rename_status); int GetReNameStatus() const; #endif DWORD& InventoryFlagStream(); char* GetInventoryPassword(); void SetInventoryPassword(char psPassword[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH]); inline sPASSWORD_BLOCK_IN_DBPROXY* GetTempInventoryPassword() const; inline void SetTempInventoryPassword(sPASSWORD_BLOCK_IN_DBPROXY* temp_password_block); bool AlarmInvalidState(TCHAR* pszPath); // ij¸¯ÅÍ »óŰ¡ ÀÌ»óÇÑ °æ¿ì(¼öÄ¡ÀÌ»ó) ·Î±×¸¦ ³²±ä´Ù. // __KR_001355_20090608_GROUPINGSYSTEM_DATA = { EXPTYPE GetAccumEXP() const; void SetAccumEXP(EXPTYPE AccumEXP); EXPTYPE AddAccumEXP(EXPTYPE AccumEXP); CHARGUID GetHighMemberGuid() const; void SetHighMemberGuid(CHARGUID GroupHighMember); eGROUP_STAT GetStatHighMember() const; void SetStatHighMember(eGROUP_STAT eStatHighMember); eGROUP_STAT GetStatLowMember() const; void SetStatLowMember(eGROUP_STAT eStatLowMember); // }; end of '__KR_001355_20090608_GROUPINGSYSTEM_DATA' // (CHANGES) (f100324.3L) default added by _NA000023_090323_ENHANCED_INVENTORY_SLOT_FUNCTIONALITY_ const nsSlot::InventoryConfig& inventory_config() const; // update all inventory insert rule configures void update_inventory_config(const nsSlot::InventoryConfig& configure); // update separated inventory insert rule configure bool update_inventory_config_tab(int tab_index, const nsSlot::InventoryConfig::SetType set_value); nsQuery::DBQueryProxyCharNode* db_query_node(); const nsQuery::DBQueryProxyCharNode* db_query_node() const; #if DBPROXY_TYPE_SELECTOR == DBPROXY_TYPE_UNIT BYTE* GetACRawStream() const; #endif bool IsReleased() const { return is_released_; } private: void Clear(); //---------------------------------------------------------------------------------------------- DBUser* db_user_; // (CHANGES) (f100324.2L) change to first member BASE_PLAYERINFO* player_info_; // (NOTE) types of SI_WAREHOUSE and SI_GUILDWAREHOUSE don't use in a db character WayPoint* way_point_; CharWayPoint* char_way_point_; CollectedList* collected_list_; nsQuery::DBQueryProxyCharNode db_query_node_; GuildWarehouseInfo* my_guild_warehouse_; bool is_released_; //---------------------------------------------------------------------------------------------- // NOTE: f100928.2L, the below block is processed by operation of fill zero memory. // WARNING: should be don't declare non-pod fields in this ranges. char pod_fields_start_[1]; BYTE delete_checked_; TCHAR delete_date_[MAX_SMALLDATETIME_SIZE+1]; // // Playtime (in PCroom or Normal) ŸÀÓ°ü·Ã ¸É¹ö DWORD db_last_updated_tick_; // DB ¾÷µ¥ÀÌÆ® ó¸® time_t login_time_; // ij¸¯Åͺ° ·Î±×ÀÎ ½Ã°£ time_t play_time_after_last_updated_; // ij¸¯Åͺ° ¸¶Áö¸· Ç÷¹ÀÌ ½Ã°£(¸Å ¾÷µ¥ÀÌÆ® ½Ã¸¶´Ù ÃʱâÈ­) time_t event_last_updated_time_; // ¸¶Áö¸· ¾÷µ¥ÀÌÆ®ÇÑ ½Ã°¢(À̺¥Æ®¿ë) int event_use_time_; int event_use_time_normal_; //__NA000000_090506_EVENT_TYPE_MODIFICATION__ #ifdef _JP_20110222_INGAME_CHARNAME_CHANGE int rename_status_; //1: ij¸¯ÅÍ¸í º¯°æ °¡´É, 1ÀÌ¿ÜÀǰª: º¯°æ ºÒ°¡´É #endif // // (NOTE) related to inventory control DWORD inventory_flag_stream_; sPASSWORD_BLOCK_IN_DBPROXY* temp_password_; // // __KR_001355_20090608_GROUPINGSYSTEM_DATA = { EXPTYPE accumulated_exp_; //±×·ì ½Ã½ºÅÛ¿¡¼­ °æÇèÄ¡¸¦ ½×´Â ¿ªÇÒÀ» ÇÏ´Â º¯¼ö CHARGUID group_high_member_; //±×·ì ¸Î±â ½Ã½ºÅÛ¿¡ °æÇèÄ¡¸¦ ½×±â À§ÇØ ÀúÀåµÇ¾î¾ß ÇÏ´Â ±×·ì »óÀ§ ¸â¹ö Guid eGROUP_STAT state_high_member_; //±×·ìÀÇ »óÀ§ ¸â¹ö »óÅ eGROUP_STAT state_low_member_; //±×·ìÀÇ ÇÏÀ§ ¸â¹ö »óÅ // }; int log_counter_; // // (CHANGES) (f100324.3L) default added by _NA000023_090323_ENHANCED_INVENTORY_SLOT_FUNCTIONALITY_ nsSlot::InventoryConfig inventory_config_; // //C_NA_0_20100520_ACSYSTEM_CHANGED //typedef STLX_HASH_MAP ACHIEVEMENT_PART_MAP; DBCharacter_Achievements achievement_info_; #ifdef _NA_20100106_REPURCHAS_BUGFIX_2496 REPURCHASITEM_TOTAL_INFO repurchase_items_; #endif //_NA_20100106_REPURCHAS_BUGFIX_2496 //_KR_0_20091021_FIRENDINVITATION_EXTEND CHAR_INVITATEDFRIEND_INFOs Invitatedfriend_count_; // BYTE mission_stream_[MAX_MISSIONSTREAM_SIZE]; BYTE ac_stream_[MAX_ACSTREAM_SIZE]; STATE_GM_INFO state_gm_info_; struct { #ifdef _NA_006372_20130108_BADGE_ITEM ToggleItemInfos toggle_item_info_; #endif //_NA_006372_20130108_BADGE_ITEM // _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND BattleGroundRecordInfos battle_ground_record_infos_; #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH GoldRushRecordInfos goldrush_record_infos_; #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH CTime daily_quest_reset_item_use_time; #ifdef _NA_008404_20150712_MINIGAME_SYSTEM MiniGameBingoInfos minigame_bingo_infos; #endif //_NA_008404_20150712_MINIGAME_SYSTEM bool queried_; bool modified_; } extra_info_; #ifdef _NA_007086_20140318_MONSTERBOOK MonsterBook monster_book_; #endif //_NA_007086_20140318_MONSTERBOOK // #ifdef _NA_007932_20150106_USER_EXTRA_INFO public: void SetUserExtraInfoQuery(bool queried); bool GetUserExtraInfoQuery(); void SetUserExtraInfoModify(bool modified); bool GetUserExtraInfoModify(); #ifdef _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM AttendanceInfo& GetAttendanceInfos(); #endif // _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM private: struct USER_EXTRA_INFO { // UserExtraInfo Ãß°¡½Ã ¼öÁ¤ #ifdef _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM AttendanceInfo attendance_infos; #endif // _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM bool queried_; bool modified_; } user_extra_info_; #endif // _NA_007932_20150106_USER_EXTRA_INFO char pod_fields_end_[1];// f100928.2L }; //================================================================================================== // implementation in a header #ifdef _JP_0_20100723_GAMECHU_AUTHFLOW_ inline GAMECHUUSN DBCharacter::GetGameChuUSN() const { return player_info_->gamechu_usn_; }; inline VOID DBCharacter::SetGameChuUSN(GAMECHUUSN gamechu_usn) { player_info_->gamechu_usn_ = gamechu_usn; }; #endif #ifdef _NA_20100307_BETAKEY_SYSTEM inline BETAKEY DBCharacter::GetBetaKey() const { return player_info_->beta_key_; }; inline VOID DBCharacter::SetBetakey(BETAKEY betakey) { player_info_->beta_key_ = betakey; }; #endif // (f100730.4L) export field... inline DBUser* DBCharacter::GetParentDBUser() const { if (impl::IsValidUser(db_user_, __FUNCTION__, __LINE__) == false) { return NULL; } return db_user_; } inline BASE_PLAYERINFO* DBCharacter::GetInfo() const { return player_info_; } inline void DBCharacter::SetInfo(BASE_PLAYERINFO* player_info) { *player_info_ = *player_info; } inline CHARGUID DBCharacter::GetCharGuid() const { return player_info_->m_CharGuid; } inline const TCHAR* DBCharacter::GetCharName() const { return player_info_->m_tszCharName; } inline void DBCharacter::SetCharName(char* char_name) { strncpy(player_info_->m_tszCharName, char_name, MAX_CHARNAME_LENGTH+1); player_info_->m_tszCharName[MAX_CHARNAME_LENGTH] = '\0'; } inline LEVELTYPE DBCharacter::GetLV() const { return player_info_->m_LV; } inline BYTE DBCharacter::GetClassCode() const { return player_info_->m_byClassCode; } inline void DBCharacter::SetLoginTime(time_t t) { login_time_ = t; } inline time_t DBCharacter::GetLoginTime() const { return login_time_; } inline void DBCharacter::ReleaseGuildWarehouse() { my_guild_warehouse_ = NULL; } inline void DBCharacter::BindGuildWarehouse(GuildWarehouseInfo* p) { my_guild_warehouse_ = p; } inline GuildWarehouseInfo* DBCharacter::GetGuildWarehouse() const { return my_guild_warehouse_; } inline WayPoint* DBCharacter::GetWayPoint() const { return way_point_; } inline CharWayPoint* DBCharacter::GetCharWayPoint() const { return char_way_point_; } inline CollectedList* DBCharacter::GetCollectedList() const { return collected_list_; } inline bool DBCharacter::IsDeleted() const { return delete_checked_ == 3; } inline DWORD& DBCharacter::InventoryFlagStream() { return inventory_flag_stream_; } inline sPASSWORD_BLOCK_IN_DBPROXY* DBCharacter::GetTempInventoryPassword() const { return temp_password_; } inline void DBCharacter::SetTempInventoryPassword(sPASSWORD_BLOCK_IN_DBPROXY* temp_password_block) { temp_password_ = temp_password_block; } inline EXPTYPE DBCharacter::GetAccumEXP() const { return min(INT_MAX, accumulated_exp_); } inline void DBCharacter::SetAccumEXP(EXPTYPE AccumEXP) { accumulated_exp_ = AccumEXP; } inline EXPTYPE DBCharacter::AddAccumEXP(EXPTYPE AccumEXP) { return accumulated_exp_ = accumulated_exp_ + AccumEXP; } inline CHARGUID DBCharacter::GetHighMemberGuid() const { return group_high_member_; } inline void DBCharacter::SetHighMemberGuid(CHARGUID GroupHighMember) { group_high_member_ = GroupHighMember; } inline eGROUP_STAT DBCharacter::GetStatHighMember() const { return state_high_member_; } inline void DBCharacter::SetStatHighMember(eGROUP_STAT eStatHighMember) { state_high_member_ = eStatHighMember; } inline eGROUP_STAT DBCharacter::GetStatLowMember() const { return state_low_member_; } inline void DBCharacter::SetStatLowMember(eGROUP_STAT eStatLowMember) { state_low_member_ = eStatLowMember; } #if DBPROXY_TYPE_SELECTOR == DBPROXY_TYPE_UNIT inline BYTE* DBCharacter::GetACRawStream() const { return const_cast(ac_stream_); } #endif ////////////////////////////////////////////////////////////////////////// //C_NA_0_20100520_ACSYSTEM_CHANGED inline DBCharacter_Achievements* DBCharacter::GetAchievementInfo() { return &achievement_info_; } // (CHANGES) (f100324.3L) default added by _NA000023_090323_ENHANCED_INVENTORY_SLOT_FUNCTIONALITY_ inline const nsSlot::InventoryConfig& DBCharacter::inventory_config() const { return inventory_config_; } //-------------------------------------------------------------------------------------------------- inline nsQuery::DBQueryProxyCharNode* DBCharacter::db_query_node() { return &db_query_node_; } inline const nsQuery::DBQueryProxyCharNode* DBCharacter::db_query_node() const { return &db_query_node_; } #ifdef _JP_20110222_INGAME_CHARNAME_CHANGE inline void DBCharacter::SetReNameStatus(const int rename_status) { rename_status_ = rename_status; } inline int DBCharacter::GetReNameStatus() const { return rename_status_; } #endif #endif //DBPROXY_DBCHARARACTER_H