222 lines
No EOL
11 KiB
C++
222 lines
No EOL
11 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)
|