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

514 lines
17 KiB
C++

#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 <QuestDefine.h>
#include <SCStream.h>
#include <SCSlotHeader.h>
#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
// 디비에서 캐릭터 정보를 가져 왔을 때
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); // 캐릭터 상태가 이상한 경우(수치이상) 로그를 남긴다.
// __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_; // 캐릭터별 로그인 시간
time_t play_time_after_last_updated_; // 캐릭터별 마지막 플레이 시간(매 업데이트 시마다 초기화)
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: 캐릭터명 변경 가능, 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<WORD, AchievementPart> 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<BYTE*>(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