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

270 lines
12 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "HeroData.h"
#include "Hero.h"
#include <../ProgramCommon/ItemInfoParser.h>
#include <../ProgramCommon/SkillInfoParser.h>
#include "CooltimeManager.h"
cHeroData::cHeroData()
{
memset(&m_HeroInfo, 0, sizeof(m_HeroInfo) );
}
cHeroData::~cHeroData()
{
}
void cHeroData::Initialize()
{
}
void cHeroData::Release()
{
SAFE_DELETE_ARRAY(m_HeroInfo.m_pItemStream);
}
void cHeroData::SetSkillTotalInfo( const SKILL_TOTAL_INFO* pSkillTotalInfo )
{
memcpy( &m_HeroInfo.m_SkillTotalInfo, pSkillTotalInfo, pSkillTotalInfo->GetSize() );
}
void cHeroData::SetQuickTotalInfo( const QUICK_TOTAL_INFO* pQuickTotalInfo )
{
memcpy( &m_HeroInfo.m_QuickTotalInfo, pQuickTotalInfo, pQuickTotalInfo->GetSize() );
}
void cHeroData::SetEquipItemInfo( const EQUIP_ITEM_INFO* pEquipItemInfo )
{
memcpy( &m_HeroInfo.m_EquiptItemInfo, pEquipItemInfo, pEquipItemInfo->GetSize() );
}
void cHeroData::SetItemStream( const BYTE* pStreamBuffer, int StreamLength )
{
SAFE_DELETE_ARRAY( m_HeroInfo.m_pItemStream );
m_HeroInfo.m_pItemStream = new BYTE[MSG_CG_CHARINFO_CHAR_ITEM_CMD::_MAX_BINARY_SIZE];
memcpy( m_HeroInfo.m_pItemStream, pStreamBuffer, StreamLength );
m_HeroInfo.m_wStreamLength = StreamLength;
}
void cHeroData::SetHeroInfo( const CLIENT_CHARACTER_PART& CharacterPart, const PLAYERINFO_FOR_PACKET& PlayerInfo )
{
m_BadgeItemData.Reset();
m_PCBangItemData.Reset();
// CLIENT_CHARACTER_PART
m_HeroInfo.m_CharInfo.m_byClassCode = CharacterPart.m_byClass;
m_HeroInfo.m_CharInfo.gender = CharacterPart.gender;
m_HeroInfo.m_CharInfo.m_byFace = CharacterPart.m_byFace;
m_HeroInfo.m_CharInfo.m_byHair = CharacterPart.m_byHair;
m_HeroInfo.m_CharInfo.m_byHeight = CharacterPart.m_byHeight;
m_HeroInfo.m_CharInfo.m_bySlot = CharacterPart.m_bySlot;
StrnCopy(m_HeroInfo.m_CharInfo.m_tszCharName, CharacterPart.m_tszCharName, MAX_CHARNAME_LENGTH);
m_HeroInfo.m_CharInfo.m_tszCharName[_countof(m_HeroInfo.m_CharInfo.m_tszCharName) - 1] = '\0';
m_HeroInfo.m_CharInfo.m_iRegion = CharacterPart.m_iRegion;
m_HeroInfo.m_CharInfo.m_LV = CharacterPart.m_LV;
m_HeroInfo.m_CharInfo.m_ChangeOfClassStep.Set(CharacterPart.m_ChangeOfClassStep);
// BASE_PLAYERINFO
m_HeroInfo.m_CharInfo.m_i64Exp = PlayerInfo.m_i64Exp;
m_HeroInfo.m_CharInfo.m_iMaxHP = PlayerInfo.m_MaxHP;
m_HeroInfo.m_CharInfo.m_iHP = PlayerInfo.m_HP;
m_HeroInfo.m_CharInfo.m_iMaxMP = PlayerInfo.m_MaxMP;
m_HeroInfo.m_CharInfo.m_iMP = PlayerInfo.m_MP;
m_HeroInfo.m_CharInfo.m_Money = PlayerInfo.m_Money;
m_HeroInfo.m_CharInfo.m_iRemainStat = PlayerInfo.m_dwRemainStat;
m_HeroInfo.m_CharInfo.m_iRemainSkill = PlayerInfo.m_dwRemainSkill;
m_HeroInfo.m_CharInfo.m_iSelectStyleCode = PlayerInfo.m_SelectStyleCode;
m_HeroInfo.m_CharInfo.m_byPKState = PlayerInfo.m_byPKState;
m_HeroInfo.m_CharInfo.m_byCharState = PlayerInfo.m_byCharState;
StrnCopy(m_HeroInfo.m_CharInfo.m_tszTitleID,PlayerInfo.m_tszTitleID, MAX_TITLEID_LENGTH);
m_HeroInfo.m_CharInfo.m_iInventoryLock = PlayerInfo.m_iInventoryLock;
m_HeroInfo.m_CharInfo.m_sStrength = PlayerInfo.m_sStrength;
m_HeroInfo.m_CharInfo.m_sDexterity = PlayerInfo.m_sDexterity;
m_HeroInfo.m_CharInfo.m_sVitality = PlayerInfo.m_sVitality;
m_HeroInfo.m_CharInfo.m_sInteligence = PlayerInfo.m_sInteligence;
m_HeroInfo.m_CharInfo.m_sSpirit = PlayerInfo.m_sSpirit;
m_HeroInfo.m_CharInfo.m_sSkillStat1 = PlayerInfo.m_sSkillStat1;
m_HeroInfo.m_CharInfo.m_sSkillStat2 = PlayerInfo.m_sSkillStat2;
m_HeroInfo.m_CharInfo.m_Money = PlayerInfo.m_Money;
m_HeroInfo.m_CharInfo.m_bWhisperFlag = PlayerInfo.m_bWhisperFlag;
m_HeroInfo.m_CharInfo.m_bTradeFlag = PlayerInfo.m_bTradeFlag;
#ifdef _NA_003027_20111013_HONOR_SYSTEM
m_HeroInfo.m_CharInfo.honor_title_ = PlayerInfo.m_wHonorTitle;
#endif //_NA_003027_20111013_HONOR_SYSTEM
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
m_HeroInfo.m_CharInfo.cur_FP_ = PlayerInfo.cur_FP;
m_HeroInfo.m_CharInfo.max_FP_ = PlayerInfo.max_FP;
#endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
m_HeroInfo.m_CharInfo.m_PlayLimitedTime = PlayerInfo.m_PlayLimitedTime;
StrnCopy(m_HeroInfo.m_CharInfo.m_tszGuildName, PlayerInfo.m_tszGuildName, MAX_GUILDNAME_LENGTH );
m_HeroInfo.m_CharInfo.m_eGuildDuty = (eGUILD_DUTY)PlayerInfo.m_GuildDuty;
m_HeroInfo.m_CharInfo.m_GuildGuid = PlayerInfo.m_GuildGuid;
m_HeroInfo.m_GuildRenderInfo.m_GuildDuty = m_HeroInfo.m_CharInfo.m_eGuildDuty;
m_HeroInfo.m_GuildRenderInfo.m_GuildGuid = m_HeroInfo.m_CharInfo.m_GuildGuid;
m_HeroInfo.m_CharInfo.m_UserPoint = PlayerInfo.m_UserPoint;
m_HeroInfo.m_byGMGrade = PlayerInfo.m_byGMGrade;
#ifdef _NA_000000_20120420_EQUIPMENTS_VISIBLE_WING
m_HeroInfo.m_bHideHelmet = PlayerInfo.VisibleOptionFlag.m_Helmet;
m_HeroInfo.m_bHideWing = PlayerInfo.VisibleOptionFlag.m_Wing;
#else
m_HeroInfo.m_bHideHelmet = PlayerInfo.m_byInvisibleOptFlag;
#endif//_NA_000000_20120420_EQUIPMENTS_VISIBLE_WING
#ifdef _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME
m_HeroInfo.m_bHideCostume = PlayerInfo.VisibleOptionFlag.m_Costume;
#endif
m_HeroInfo.m_byPCBang = PlayerInfo.m_byPCBangUser;
m_HeroInfo.m_byBlockPCBang = PlayerInfo.m_byPCRoomSts;
m_HeroInfo.m_CharInfo.m_ChaoState = PlayerInfo.m_ChaoState;
m_HeroInfo.m_CharInfo.m_ExtraInventoryTabCount = PlayerInfo.m_ExtraInventoryTabCount;
m_HeroInfo.m_CharInfo.m_ExtraEquipCashSlotCount = PlayerInfo.m_ExtraEquipCashSlotCount;
m_HeroInfo.m_CharInfo.m_bSummonedPet = PlayerInfo.m_bSummonedPet;
m_HeroInfo.m_CharInfo.m_bMAXIntimacy = PlayerInfo.m_bMAXIntimacy;
m_HeroInfo.m_CharInfo.m_PetItemPos = PlayerInfo.m_PetItemPos;
m_HeroInfo.m_CharInfo.m_bMAXOptionRemainTime = PlayerInfo.m_bMAXOptionRemainTime;
m_HeroInfo.m_CharInfo.m_bActiveEtherDevice = PlayerInfo.m_bActiveEtherDevice;
m_HeroInfo.m_CharInfo.m_byEtherBulletPos = PlayerInfo.m_byEtherBulletPos;
m_HeroInfo.m_CharInfo.m_iMaxSD = PlayerInfo.m_MaxSD;
m_HeroInfo.m_CharInfo.m_iSD = PlayerInfo.m_SD;
#ifdef _PCBANG_POLICY_CHANGE_POST_EXPIRED
m_HeroInfo.m_bPCBangStatus = 0;
#endif //_PCBANG_POLICY_CHANGE_POST_EXPIRED
m_HeroInfo.m_CharInfo.m_byFreeInitCount = PlayerInfo.m_byFreeInitCount;
#ifdef _NA_004035_20120227_COSTUME_ITEM
m_HeroInfo.m_CharInfo.is_equipped_costume_ = CharacterPart.is_equipped_costume;
m_HeroInfo.m_CharInfo.costume_item_pos_ = CharacterPart.costume_item_pos;
m_HeroInfo.m_CharInfo.costume_item_code_ = CharacterPart.costume_item_code;
if( m_HeroInfo.m_CharInfo.is_equipped_costume_ == false )
{
m_HeroInfo.m_CharInfo.costume_item_pos_ = INVALID_SLOT_POS;
m_HeroInfo.m_CharInfo.costume_item_code_ = 0;
}
#endif//_NA_004035_20120227_COSTUME_ITEM
#ifdef _NA_008633_20160104_ADD_DECORATECOSTUME
m_HeroInfo.m_CharInfo.is_equipped_decorate_costume_ = CharacterPart.is_equipped_decorate_costume;
m_HeroInfo.m_CharInfo.decorate_costume_item_pos_ = CharacterPart.decorate_costume_item_pos;
m_HeroInfo.m_CharInfo.decorate_costume_item_code_ = CharacterPart.decorate_costume_item_code;
if ( m_HeroInfo.m_CharInfo.is_equipped_decorate_costume_ == false )
{
m_HeroInfo.m_CharInfo.decorate_costume_item_pos_ = INVALID_SLOT_POS;
m_HeroInfo.m_CharInfo.decorate_costume_item_code_ = 0;
}
#endif // _NA_008633_20160104_ADD_DECORATECOSTUME
m_HeroInfo.m_FightEnergy = 0;
#ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_GRADE
m_HeroInfo.client_player_ranking_grade_info_.ranking_type = eSUN_RANKING_TYPE_END;
m_HeroInfo.client_player_ranking_grade_info_.grade = eSUN_RANKING_GRADE_NONE;
#endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_GRADE
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
m_HeroInfo.m_special_scene_item_code = 0;
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
}
void cHeroData::SaveHero( Hero* pHero )
{
m_HeroInfo.m_dwKey = pHero->GetObjectKey();
m_HeroInfo.m_MakeType = pHero->GetPlayerType();
memcpy(&m_HeroInfo.m_CharInfo, pHero->GetCharInfo(), sizeof(m_HeroInfo.m_CharInfo));
pHero->GetEquipItemTotalInfo(m_HeroInfo.m_EquiptItemInfo);
pHero->GetInventoryTotalInfo(m_HeroInfo.m_pItemStream, m_HeroInfo.m_wStreamLength);
pHero->GetQuickTotalInfo(m_HeroInfo.m_QuickTotalInfo);
m_HeroInfo.m_byGMGrade = pHero->GetGMGrade();
m_HeroInfo.m_bHideHelmet = pHero->IsHideHelmet();
#ifdef _NA_000000_20120420_EQUIPMENTS_VISIBLE_WING
m_HeroInfo.m_bHideWing = pHero->IsHideWing();
#endif//_NA_000000_20120420_EQUIPMENTS_VISIBLE_WING
m_HeroInfo.m_byPCBang = pHero->Player::GetPCBangMode();
m_HeroInfo.m_bObserverMode = pHero->IsObserverMode();
#ifdef _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME
m_HeroInfo.m_bHideCostume = pHero->isHideCostume();
#endif
//===============================
// 펫관련 정보 저장
//===============================
m_HeroInfo.m_CharInfo.m_bSummonedPet = pHero->IsPetReturn();
m_HeroInfo.m_CharInfo.m_PetItemPos = pHero->GetPetItemPos();
//===============================
// 에테르 탄환정보 저장
//===============================
//에테르5차개선안
m_HeroInfo.m_CharInfo.m_bActiveEtherDevice = pHero->GetEthreInfo().byEtherIndex;
m_HeroInfo.m_CharInfo.m_byEtherBulletPos = pHero->GetEthreInfo().byEtherChargePos;
pHero->SetEtherItemLock(TRUE,FALSE);
memcpy(&m_HeroInfo.m_GuildRenderInfo, &pHero->GetGuildRenderInfo(), sizeof(PLAYER_GUILD_RENDER_INFO));
STLX_VECTOR<MAPCODE>& domination_state_info = pHero->GetDominationStateInfo();
BYTE size_of_info = domination_state_info.size();
m_HeroInfo.m_GuildRenderInfo.m_stateTotalInfo.m_Count = size_of_info;
for (BYTE index = 0; index < size_of_info; ++index)
{
m_HeroInfo.m_GuildRenderInfo.m_stateTotalInfo.m_Slot[index].m_wDominationCode = domination_state_info[index];
}
#ifdef _PCBANG_POLICY_CHANGE_POST_EXPIRED
m_HeroInfo.m_bPCBangStatus = pHero->GetPCRoomStatus();
#endif //_PCBANG_POLICY_CHANGE_POST_EXPIRED
m_HeroInfo.m_FightEnergy = pHero->GetFightingEnergy();
// 2012.07.03 naklu / 용변신 상태에서 맵 이동한 경우 스타일이 초기화 되지 않던 문제 수정
// SaveHero() 중 용변신 상태면 용변신 이전 스타일로 저장함
if (m_HeroInfo.m_CharInfo.m_byClassCode == eCHAR_DRAGON)
{
if ((m_HeroInfo.m_CharInfo.m_iSelectStyleCode == eSTYLE_DRAGON_TRANSFORM1) ||
(m_HeroInfo.m_CharInfo.m_iSelectStyleCode == eSTYLE_DRAGON_TRANSFORM2))
{
m_HeroInfo.m_CharInfo.m_iSelectStyleCode = m_HeroInfo.m_OldAttackStyle;
}
}
#ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_GRADE
pHero->ClearClientPlayerRankingGradeInfo();
CLIENT_PLAYER_RANKING_GRADE_INFO player_ranking_grade_info;
player_ranking_grade_info.ranking_type = m_HeroInfo.client_player_ranking_grade_info_.ranking_type;
player_ranking_grade_info.grade = m_HeroInfo.client_player_ranking_grade_info_.grade;
pHero->SetClientPlayerRankingGradeInfo(&player_ranking_grade_info);
#endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_GRADE
#ifdef _NA_004035_20120227_COSTUME_ITEM
m_HeroInfo.m_special_scene_item_code = pHero->GetSpecialSceneItemCode();
#endif //_NA_004035_20120227_COSTUME_ITEM
}
//------------------------------------------------------------------------------
void cHeroData::ReleaseGuildInfo()
{
ZeroMemory(&m_HeroInfo.m_GuildRenderInfo, sizeof(GUILD_RENDER_INFO));
}
#ifdef _NA_008016_20150203_SUN_RANKING_SYSTEM_GRADE
void cHeroData::SetClientPlayerRankingGrade( const CLIENT_PLAYER_RANKING_GRADE_INFO& client_player_ranking_grade_info )
{
CopyMemory(&m_HeroInfo.client_player_ranking_grade_info_, &client_player_ranking_grade_info, sizeof(CLIENT_PLAYER_RANKING_GRADE_INFO));
}
#endif // _NA_008016_20150203_SUN_RANKING_SYSTEM_GRADE