DragonNest/Server/ServerCommon/DNBestFriend.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

222 lines
No EOL
5.5 KiB
C++

#include "stdafx.h"
#include "DNBestFriend.h"
#include "DNUserSession.h"
#include "DNDBConnection.h"
#include "TimeSet.h"
#include "DNWorldUserState.h"
#include "DNGameDataManager.h"
#include "DNAppellation.h"
#include "DNCashRepository.h"
#if defined(_VILLAGESERVER)
#include "DNUserSessionManager.h"
#endif
#if defined (PRE_ADD_BESTFRIEND)
CDNBestFriend::CDNBestFriend(CDNUserSession* pSession)
{
m_pUserSession = pSession;
Reset();
}
CDNBestFriend::~CDNBestFriend()
{
}
void CDNBestFriend::LoadData(const TAGetBestFriend* pData)
{
m_Info = pData->Info;
if (!pData->bSend)
return;
CheckAndSendData();
}
void CDNBestFriend::CheckAndSendData()
{
if (m_Info.biCharacterDBID == 0)
return;
// 등록한 기간 계산
CalcRegistTime();
// 보상체크
CheckReward();
#if defined (_VILLAGESERVER)
// 삭제 체크
CheckStatus();
#endif
// 절친 정보 전송
SendGetBestFriendInfo();
}
void CDNBestFriend::SendGetBestFriendInfo()
{
sWorldUserState State;
if (g_pWorldUserState->GetUserState(m_Info.wszName, m_Info.biCharacterDBID, &State))
{
m_Info.Location.cServerLocation = State.nLocationState;
m_Info.Location.nChannelID = State.nLocationState == _LOCATION_VILLAGE ? State.nChannelID : -1;
m_Info.Location.nMapIdx = State.nMapIdx;
}
else
m_Info.Location.cServerLocation = _LOCATION_NONE;
#if defined(_VILLAGESERVER)
CDNUserSession* pSession = g_pUserSessionManager->FindUserSessionByName(m_Info.wszName);
if (pSession)
m_Info.nSessionID = pSession->GetSessionID();
#endif // #if defined(_VILLAGESERVER)
m_pUserSession->SendGetBestFriend(ERROR_NONE, m_Info);
}
bool CDNBestFriend::IsRegistered()
{
if (m_Info.biCharacterDBID != 0)
return true;
return false;
}
void CDNBestFriend::CalcRegistTime()
{
CTimeSet LocalSet;
CTimeSet StartSet(m_Info.tStartDate, true);
INT64 biRegistSecond = LocalSet - StartSet;
if (biRegistSecond <= 0)
biRegistSecond = 1;
m_Info.nDay = (int)(biRegistSecond / (60 * 60 * 24)) + 1;
}
void CDNBestFriend::CheckStatus(bool bCheat)
{
CTimeSet LocalSet;
CTimeSet EndSet(m_Info.tEndDate, true);
INT64 biDiffSecond = LocalSet - EndSet;
if (BESTFRIEND_CLOSETIME > biDiffSecond)
m_Info.biWaitingTimeForDelete = BESTFRIEND_CLOSETIME - biDiffSecond;
if (m_Info.bStatus || bCheat)
{
if (biDiffSecond > BESTFRIEND_CLOSETIME || bCheat)
{
m_pUserSession->GetDBConnection()->QueryCloseBestFriend(m_pUserSession);
return;
}
}
}
void CDNBestFriend::ChangeName(const WCHAR* pwszName)
{
_wcscpy(m_Info.wszName, _countof(m_Info.wszName), pwszName, (int)wcslen(pwszName));
SendGetBestFriendInfo();
}
void CDNBestFriend::ChangeLevel(BYTE cLevel)
{
m_Info.cLevel = cLevel;
SendGetBestFriendInfo();
}
void CDNBestFriend::ChangeMemo(bool bMine, const WCHAR* pwszName)
{
if(bMine)
_wcscpy(m_Info.wszMyMemo, _countof(m_Info.wszMyMemo), pwszName, (int)wcslen(pwszName));
else
_wcscpy(m_Info.wszFriendMemo, _countof(m_Info.wszFriendMemo), pwszName, (int)wcslen(pwszName));
}
void CDNBestFriend::ExecuteReward(int nItemID)
{
m_pUserSession->ModCommonVariableData(CommonVariable::Type::BESTFRIEND_GIFTBOXID, 0);
TItemData* pItemData = g_pDataManager->GetItemData(nItemID);
if (!pItemData)
{
_DANGER_POINT();
g_Log.Log(LogType::_BESTFRIEND, m_pUserSession, L"CDNBestFriend::ExecuteReward Invalid Item [%d] \r\n", nItemID);
return;
}
// 아이템
CDNUserItem* pItem = m_pUserSession->GetItem();
pItem->CreateCashInvenItem(pItemData->nTypeParam[0], 1, DBDNWorldDef::AddMaterializedItem::Trigger, -1, 0, 0, 0, DBDNWorldDef::PayMethodCode::BestFriend);
// 칭호
int nAppellationID = pItemData->nTypeParam[1] - 1;
if( m_pUserSession->GetAppellation()->IsExistAppellation( nAppellationID ) )
{
// 절친 칭호가 이미 존재하면 버그임
g_Log.Log(LogType::_BESTFRIEND, m_pUserSession, L"CDNBestFriend::ExecuteReward Exist Appellation [%d] \r\n", nAppellationID);
}
else
m_pUserSession->GetAppellation()->RequestAddAppellation( nAppellationID );
// 버프 스킬
int nBuffItemID = pItemData->nTypeParam[2];
TItemData* pBuffItemData = g_pDataManager->GetItemData(nBuffItemID);
if (!pBuffItemData)
{
_DANGER_POINT();
g_Log.Log(LogType::_BESTFRIEND, m_pUserSession, L"CDNBestFriend::ExecuteReward Invalid BuffItem [%d] \r\n", nBuffItemID);
return;
}
CSUseItem pPacket;
memset(&pPacket, 0, sizeof(pPacket));
pPacket.biInvenSerial = m_pUserSession->GetItem()->MakeItemSerial();
m_pUserSession->GetItem()->ApplyPartyEffectSkillItemData(&pPacket, pBuffItemData, m_pUserSession->GetSessionID(), EffectSkillNameSpace::ShowEffectType::NONEEFFECT, true, false);
}
void CDNBestFriend::CheckReward()
{
INT64 biItemID = 0;
m_pUserSession->GetCommonVariableDataValue(CommonVariable::Type::BESTFRIEND_GIFTBOXID, biItemID);
if (biItemID == 0)
return;
ExecuteReward((int)biItemID);
}
void CDNBestFriend::RemoveReward()
{
if (m_Info.biCharacterDBID != 0)
return;
// 절친 선물박스 삭제
m_pUserSession->GetItem()->UseCashItemByType(ITEMTYPE_GIFTBOX, 1, true);
// 절친 칭호 삭제
m_pUserSession->GetAppellation()->DelAppellation( AppellationType::Type::BestFriend, true ); //칭호 삭제
// 절친 버프 삭제
m_pUserSession->GetEffectRepository()->DelEffectItemType( ITEMTYPE_BESTFRIENDBUFFITEM );
std::vector<TEffectSkillData> vEffectSkill;
vEffectSkill.clear();
m_pUserSession->GetItem()->GetEffectSkillItem( vEffectSkill );
m_pUserSession->SendEffectSkillItemData(m_pUserSession->GetSessionID(), vEffectSkill, false);
}
void CDNBestFriend::Reset()
{
memset (&m_Info, 0, sizeof(m_Info));
m_biRegistSerial = 0;
}
void CDNBestFriend::Close()
{
Reset();
RemoveReward();
}
#endif // #if defined (PRE_ADD_BESTFRIEND)