Files
Sun1602/RankingLib/RankingMember.cpp
T
2022-10-26 12:25:11 +08:00

169 lines
4.9 KiB
C++

#include "stdafx.h"
#include "./RankingMember.h"
#include <ArchiveOfStream.h>
#include "./MissionRankingRecord.h"
//==================================================================================================
__IMPL_CUSTOMPOOL_PTR(RankingMember);
//==================================================================================================
bool RankingMember::DoReward()
{
if (transaction_) {
return false;
};
BeginTransaction();
return true;
}
void RankingMember::SetCharName(const TCHAR* name)
{
_tcsncpy(char_name_, name, _countof(char_name_));
char_name_[_countof(char_name_) - 1] = _T('\0');
if (char_name_[0] == _T('\0')) {
char_name_hash_ = 0;
return;
};
char_name_hash_ = MakeCharNameHashKey(char_name_);
}
// CHANGES: f110525.6L
DWORD RankingMember::MakeCharNameHashKey(const char* char_name)
{
if (char_name == NULL || char_name[0] == '\0') {
return 0;
};
TCHAR lower_char_name[_countof(((RankingMember*)0)->char_name_)];
CopyMemory(lower_char_name, char_name, sizeof(lower_char_name));
_tcslwr(lower_char_name);
DWORD char_name_hash = util::StreamHashKey::GetStringHashKey(lower_char_name);
return char_name_hash;
}
void RankingMember::Serialize(_MISSION_RANK_MEMBER_INFO& member_info, eSERIALIZE se)
{
if (se == SERIALIZE_STORE)
{
this->Release();
class_type_ = member_info.m_Class;
level_ = member_info.m_LV;
_tcsncpy(char_name_, member_info.m_tszCharName, _countof(char_name_));
char_name_[_countof(char_name_) - 1] = '\0';
_tcsncpy(guild_name_, member_info.m_tszGuildName, _countof(guild_name_));
guild_name_[_countof(guild_name_) - 1] = '\0';
//
char_name_hash_ = MakeCharNameHashKey(char_name_);
}
else if (se == SERIALIZE_LOAD)
{
member_info.m_Class = class_type_;
member_info.m_LV = level_;
_tcsncpy(member_info.m_tszCharName, char_name_, _countof(member_info.m_tszCharName));
member_info.m_tszCharName[_countof(member_info.m_tszCharName) - 1] = '\0';
_tcsncpy(member_info.m_tszGuildName, guild_name_, _countof(member_info.m_tszGuildName));
member_info.m_tszGuildName[_countof(member_info.m_tszGuildName) - 1] = '\0';
}
}
void RankingMember::Serialize(ArchiveOfStream& ar, eRANKING_SERIALIZE se)
{
switch (se)
{
case RANKING_SERIALIZE_SAVE:
// for server
this->Release();
//
ar >> rewarded_;
ar >> class_type_;
ar >> level_;
assert((level_ <= UCHAR_MAX) && "Check 'RANKING_SERIALIZE_CLIENT_~' level part");
;{
BYTE len = 0;
ar >> len;
ar.Read(char_name_, len);
char_name_[len] = '\0';
};
;{
BYTE len = 0;
ar >> len;
ar.Read(guild_name_, len);
guild_name_[len] = '\0';
};
char_name_hash_ = MakeCharNameHashKey(char_name_);
break;
case RANKING_SERIALIZE_LOAD:
// for server
ar << rewarded_;
ar << class_type_;
ar << level_;
assert((level_ <= UCHAR_MAX) && "Check 'RANKING_SERIALIZE_CLIENT_~' level part");
;{
BYTE len = (BYTE)_tcslen(char_name_);
ar << len;
ar.Write(char_name_, len);
};
;{
BYTE len = (BYTE)_tcslen(guild_name_);
ar << len;
ar.Write(guild_name_, len);
};
break;
//------------------------------------------------------------------------------------------
case RANKING_SERIALIZE_CLIENT_SAVE:
// for client
// NOTE: f110512.2L, warns, level_type is resized to 1byte
this->Release();
// in client, the next fields is not control. fields = { rewarded_, class_type_ };
;{
BYTE level = 0;
ar >> level; // f110512.2L
level_ = level;
};
;{
BYTE len = 0;
ar >> len;
ar.Read(char_name_, len);
char_name_[len] = _T('\0');
};
;{
BYTE len=0;
ar >> len;
ar.Read(guild_name_, len);
guild_name_[len] = _T('\0');
};
char_name_hash_ = MakeCharNameHashKey(char_name_);
break;
case RANKING_SERIALIZE_CLIENT_LOAD:
// for client
ar << BYTE(level_);
;{
BYTE len = BYTE(_tcslen(char_name_));
ar << len;
ar.Write(char_name_, len);
};
;{
BYTE len = BYTE(_tcslen(guild_name_));
ar << len;
ar.Write(guild_name_, len);
};
break;
}; //end 'switch'
}
#ifdef _SERVER
void RankingMember::Display() const
{
CONSOLELOG(eCRITICAL_LOG,
_T(" Class=%d, Reward=%d, Level=%d, CharName='%s', GuildName='%s'"),
class_type_, rewarded_, level_, char_name_, guild_name_);
}
#endif //_SERVER