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

417 lines
13 KiB
C++

#ifndef __STRUCT_IN_QUERY_H__
#define __STRUCT_IN_QUERY_H__
#pragma once
#include <QueryResult.h>
#include <SafeMemoryPoolFactory.h>
#include <SCSlotHeader.h>
#include <QuestDefine.h>
#include "QueryStringBuffer.h"
//==================================================================================================
// (NOTE) ...
template<class QueryT>
struct DBResultConvert
{
//TODO : 가변인자 가능하도록 해야함
static const int ErrorCode[];
int GetGuildResult(int result_by_db) {
return QueryT::ErrorCode[result_by_db];
}
};
class QueryForUser : public QueryResult
{
public:
void SetUserKey(DWORD user_guid) {
user_guid_ = user_guid;
}
DWORD GetUserKey() const {
return user_guid_;
}
void SetProtocol(BYTE c, BYTE p) {
SetIndex(MAKEDWORD(WORD(c), WORD(p)));
}
private:
DWORD user_guid_;
};
class QueryForCharTransaction : public QueryForUser
{
public:
void set_char_guid(DWORD char_guid) { char_guid_ = char_guid; };
DWORD char_guid() const { return char_guid_; }
virtual const nsQuery::ProxyTransaction::eTransaction transaction_type() const = 0;
private:
DWORD char_guid_;
//
};
//==================================================================================================
// r101007.3L
struct sQUERY_CHARACTER
{
USERGUID m_UserGuid;
short m_bySlot; // uint8_t
short m_byClass; // uint8_t
CHARGUID m_CharGuid;
//
short m_byHeight; // uint8_t
short m_byFace; // uint8_t
short m_byHair; // uint8_t
//
short m_LV; // LEVELTYPE(WORD)
//
short m_sStrength;
short m_sDexterity;
short m_sVitality;
short m_sInteligence;
short m_sSpirit;
//
short m_sSkillStat1;
short m_sSkillStat2;
int m_UserPoint; // UPTYPE(int)
//
int64 m_i64Exp; // EXPTYPE(__int64)
//
int m_iMaxHP;
int m_iHP;
int m_iMaxMP;
int m_iMP;
//
int64 m_Money; // MONEY(ULONGLONG)
//
int m_iRemainStat;
int m_iRemainSkill;
// NOTE: DB에서는 int로 가진다 : 스타일 코드가 6만번부터 시작하기 때문에 사용할때는 WORD로 캐스팅해서 사용한다.
int m_iSelectStyleCode;
//
short m_byPKState; // uint8_t:3bit
short m_byCharState; // uint8_t:7bit
int64 m_StateTime;
//
int m_iRegion;
short m_sX;
short m_sY;
short m_sZ;
int m_iPreRegion;
//
int64 m_TitleTime;
//
short m_byInvisibleOpt; // uint8_t
//
uint8_t m_bInventoryLock;
//
short m_iCHuntingDisCount;
short m_iCHuntingVCount;
short m_iCHuntingLCount;
short m_iCHuntingTotCount;
//
short m_byChaoState; // uint8_t 'ChaoGrade'
int64 m_i64ChaoTime;
//
int m_iPlayLimitedTime;
//----------------------------------------------------------------------------------------------
// NOTE: reference table = { T_PVP }
int m_iPVPPoint;
int m_iPVPScore;
short m_byPVPGrade; // uint8_t
int m_iPVPDraw;
int m_iPVPSeries;
int m_iPVPKill;
int m_iPVPDie;
int m_iPVPMaxKill;
int m_iPVPMaxDie;
//----------------------------------------------------------------------------------------------
// NOTE: reference table = { T_GuildInfo, T_GuildMember }
GUILDGUID m_GuildGuid;
short m_eGuildDuty; // uint8_t eGUILD_DUTY
//----------------------------------------------------------------------------------------------
// NOTE: reference table = { T_CharUseTime }
int m_EventUseTime; // accumulated value of playing time in pc room
// NOTE: reference table = { T_CharUseTime_General }
int m_EventUseTimeNormal; //__NA000000_090506_EVENT_TYPE_MODIFICATION__
//
short m_byDelChk; // uint8_t
//
short m_byExtraInventoryTabCount; // uint8_t
//
short m_ExtraEquipCashSlotCount; // uint8_t
//
uint8_t m_bTradeFlag;
uint8_t m_bWhisperFlag;
short m_byFreeInitCount; // uint8_t
short m_ChangeOfClassStep;
//
uint8_t m_bSummonedPet;
uint8_t m_bMAXIntimacy;
short m_PetItemPos; // POSTYPE
int m_bMAXOptionRemainTime; // ?
//
uint8_t m_bActiveEther; //__NA_1165_ETHER_DEVICE_SAVE_DB
short m_byEtherBulletPos; // POSTYPE
//{__NA_001290_20090525_SHIELD_SYSTEM
int m_iMaxSD;
int m_iSD;
//}
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
short m_wAccumulateYear; // WORD: 플레이 시간 적립 년도.
int m_dwAccumulateTime; // DWORD: 적립 시간 (값:0000000초)
short m_wAccumulatePoint; // WORD: 적립 포인트
#endif
//
#ifdef _NA_002050_20110216_ADD_GENDER
uint8_t gender; // 성별
#endif
#ifdef _NA_003027_20111013_HONOR_SYSTEM
short honor_title;
#endif //_NA_003027_20111013_HONOR_SYSTEM
//_NA_004035_20120227_COSTUME_ITEM
uint8_t is_equipped_costume; // 코스튬 활성화 여부
short costume_item_pos; // 코스튬 인벤토리 위치
int costume_item_code; // 코스튬 아이템 번호
#ifdef _NA_008610_20160104_ADD_DECORATECOSTUME
uint8_t is_equipped_deco_costume; // 데코 코스튬 활성화 여부
short deco_costume_item_pos; // 데코 코스튬 인벤토리 위치
int deco_costume_item_code; // 데코 코스튬 아이템 번호
#endif //_NA_008610_20160104_ADD_DECORATECOSTUME
//{_NA000023_090323_ENHANCED_INVENTORY_SLOT_FUNCTIONALITY_DB_
uint8_t config_version; // tiny int
short config01; // smallint
short config02; // smallint
short config03; // smallint
short config04; // smallint
short config05; // smallint
short config06; // smallint
short config07; // smallint
short config08; // smallint
short config09; // smallint
short config10; // smallint
//}
#pragma pack(push, 1)
#pragma warning(push)
#pragma warning(disable: 4201)
union {
struct {
char param_info_char_name_[MAX_CHARNAME_LENGTH];
char param_info_char_name_null_terminate_[1];
char param_info_title_id_[MAX_TITLEID_LENGTH];
char param_info_title_id_null_terminate_[1];
char param_info_guild_name_[MAX_GUILDNAME_LENGTH];
char param_info_guild_name_null_terminate_[1];
char param_info_guild_nick_name_[14];
char param_info_guild_nick_name_null_terminate_[1];
char param_info_create_time_[MAX_TIMEDATA_SIZE];
char param_info_create_time_null_terminate_[1];
char param_info_del_date_[MAX_TIMEDATA_SIZE];
char param_info_del_date_null_terminate_[1];
char param_info_password_[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH];
char param_info_password_null_terminate_[1];
};
struct {
char result_info_char_name_[MAX_CHARNAME_LENGTH + 1];
char result_info_title_id_[MAX_TITLEID_LENGTH + 1];
char result_info_guild_name_[MAX_GUILDNAME_LENGTH + 1];
char result_info_guild_nick_name_[14 + 1];
char result_info_create_time_[MAX_TIMEDATA_SIZE + 1];
char result_info_del_date_[MAX_TIMEDATA_SIZE + 1];
char result_info_password_[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH + 1];
};
};
#pragma warning(pop)
#pragma pack(pop)
//----------------------------------------------------------------------------------------------
// CHANGES: f101007.4L, add forced boundary checker
void SetSafeBound()
{
assert(param_info_char_name_ == result_info_char_name_ &&
param_info_title_id_ == result_info_title_id_ &&
param_info_guild_name_ == result_info_guild_name_ &&
param_info_guild_nick_name_ == result_info_guild_nick_name_ &&
param_info_create_time_ == result_info_create_time_ &&
param_info_del_date_ == result_info_del_date_ &&
param_info_password_ == result_info_password_);
param_info_char_name_null_terminate_[0] = 0;
param_info_title_id_null_terminate_[0] = 0;
param_info_guild_name_null_terminate_[0] = 0;
param_info_guild_nick_name_null_terminate_[0] = 0;
param_info_create_time_null_terminate_[0] = 0;
param_info_del_date_null_terminate_[0] = 0;
param_info_password_null_terminate_[0] = 0;
}
/*
// CHANGES: remove boundary modifier
inline void SetSafeBound()
{
m_tszCharName[_countof(m_tszCharName) - 1] = _T('\0');
m_tszTitleID[_countof(m_tszTitleID) - 1] = _T('\0');
m_tszGuildName[_countof(m_tszGuildName) - 1] = _T('\0');
m_tszGuildNickName[_countof(m_tszGuildNickName) - 1] = _T('\0');
m_tszCreateTime[_countof(m_tszCreateTime) - 1] = _T('\0');
m_tszDelDate[_countof(m_tszDelDate) - 1] = _T('\0');
}
*/
// (WAVERIX) (090513) (CHANGES) 버퍼 초기화 관련
// (CHANGES) (f100414.1L) removed because of use the pool is supported cleared stream node
//inline void Clear()
//{ // no virtual,
// ZeroMemory(this, sizeof(*this));
//}
};
//==================================================================================================
// (CHANGES) (NOTE) changes by __NA001374_090708_CACHE_ITEM_BUFF_EXTENTION__
// |target=m_AbilityIndex|reference=SkillOption in the GameServer/Skill_Info.h|
struct sQUERY_CHARSTATE
{
CHARGUID m_CharGuid;
SHORT m_StateCode; // 상태코드
WORD m_SkillCode; // 스킬코드
BYTE m_AbilityIndex; // 어빌리티 인덱스
int m_RemainTime; // 남은시간
SHORT m_Interval; // 주기
};
//==================================================================================================
//= namespace nsQuery ==============================================================================
//==================================================================================================
namespace nsQuery {
;
#pragma warning(push)
#pragma warning(disable:4201)
//==================================================================================================
struct PerkResultRecord
{
int group_code_;
short level_;
short link_code_;
int64 exp_;
};
struct ItemSlotResultRecord
{
// reference = SI_INVENTORY, SI_EQUIPMENT, reserve = { SI_WAREHOUSE, SI_GUILDWAREHOUSE }
// read sequence = { slot_type_, pos_, serial_, code_, dura_or_num_, version_, option_stream_ }
//
uint8_t slot_type_;
uint8_t version_;
short pos_; // POSTYPE
short dura_or_num_; // DURATYPE
int code_;
__int64 serial_;
uint8_t option_stream_[sizeof(OPTIONPART)];
};
struct SlotResultRecord
{
static const int kMaxNumberOfSlots = 8;
//
short slot_index_; // reference : SI_SKILL, SI_QUICK, and that.
short tab_order_;
union {
int slot_array_[kMaxNumberOfSlots];
struct {
int slot01_;
int slot02_;
int slot03_;
int slot04_;
int slot05_;
int slot06_;
int slot07_;
int slot08_;
};
};
};
struct QuestResultRecord
{
int quest_version_;
BYTE quest_stream_progress_[MAX_PROGR_QUESTSTREAM_SIZE];
BYTE quest_stream_complete_[MAX_COMPL_QUESTSTREAM_SIZE];
};
struct BattleRecordsResultRecord
{
// PVP
int pvp_point_;
int pvp_score_;
short pvp_grade_; // uint8_t
int pvp_max_series_;
int pvp_max_kills_;
int pvp_max_die_;
int pvp_number_of_kills_;
int pvp_number_of_dead_;
int pvp_number_of_draws_;
// 경쟁헌팅 전적
int hunting_number_of_fails_; //< 경쟁헌팅 Dis 횟수
int hunting_number_of_victories_; //< 경쟁헌팅 승리횟수
int hunting_number_of_defeats_; //< 경쟁헌팅 패배횟수
int hunting_number_of_joins_; //< 경쟁헌팅 참여횟수
};
// reference: STATE_DETAIL_INFO
struct CharStateResultRecord
{
short state_code_;
int skill_code_;
// bit spec. idx|option
// 000|00000
short ability_index_with_option_; // uint8_t
int remained_time_; // seconds, infinite time = '-1'
short interval_;
};
struct GuildWarehouseResultRecord
{
int64_t money_;
//uint8_t number_of_slot_tabs_;
};
//
//C_NA_0_20100520_ACSYSTEM_CHANGED
struct CharAchievementResultRecord : public Character_Achievement
{
};
// CHANGES: f101112.5L, change query data types,
// you should be use long or short type if a sql data type is smallint on push c-types
struct CharAchievementInputParam //: public CharAchievement_Info
{
short index_number_;
uint8_t is_reward_;
short object_value_[MAX_ACHIEVEMENT_OBJECT];
};
struct MissionResultRecord
{
short code; // mission code ranges = (0, 255]
short state;
short point;
short hidden; // not used, reserved field
};
#pragma warning(pop)
}; //end of namespace
//==================================================================================================
//= end of namespace nsQuery =======================================================================
//==================================================================================================
#endif // __STRUCT_IN_QUERY_H__