259 lines
No EOL
6.4 KiB
C++
259 lines
No EOL
6.4 KiB
C++
#include "Stdafx.h"
|
||
#if defined(PRE_ADD_DWC)
|
||
#include "DnDWCSystem.h"
|
||
#include "DNDWCTeam.h"
|
||
#include "DNWorldUserState.h"
|
||
#include "TimeSet.h"
|
||
|
||
CDNDWCSystem * g_pDWCTeamManager = NULL;
|
||
|
||
CDNDWCSystem::CDNDWCSystem() : m_bInit(false), m_bIsIncludeDWCVillage(false), m_bCloseMatchByCheat(false)
|
||
{
|
||
memset(&m_DWCChannelInfo, 0, sizeof(m_DWCChannelInfo));
|
||
m_MapDWCTeamList.clear();
|
||
m_MapDWCCharacter.clear();
|
||
m_VecLadderTime.clear();
|
||
}
|
||
|
||
CDNDWCSystem::~CDNDWCSystem()
|
||
{
|
||
for( TMapDWCTeams::iterator iter = m_MapDWCTeamList.begin() ; iter != m_MapDWCTeamList.end() ; )
|
||
{
|
||
delete iter->second;
|
||
m_MapDWCTeamList.erase(iter++);
|
||
}
|
||
|
||
m_MapDWCTeamList.clear();
|
||
m_MapDWCCharacter.clear();
|
||
}
|
||
|
||
CDnDWCTeam * CDNDWCSystem::GetDWCTeam(UINT nDWCTeamID)
|
||
{
|
||
TMapDWCTeams::iterator iter = m_MapDWCTeamList.find(nDWCTeamID);
|
||
if(iter != m_MapDWCTeamList.end())
|
||
return iter->second;
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CDnDWCTeam * CDNDWCSystem::AddDWCTeamResource(UINT nDWCTeamID, TDWCTeam *pTeamInfo)
|
||
{
|
||
CDnDWCTeam *pDWCTeam = new CDnDWCTeam(nDWCTeamID, pTeamInfo, this);
|
||
m_MapDWCTeamList.insert( std::make_pair(nDWCTeamID, pDWCTeam) );
|
||
return pDWCTeam;
|
||
}
|
||
|
||
bool CDNDWCSystem::RegistDWCCharacter(INT64 biCharacterDBID, UINT nTeamID)
|
||
{
|
||
CDnDWCTeam *pDWCTeam = GetDWCTeam(nTeamID);
|
||
if(!pDWCTeam)
|
||
return false;
|
||
|
||
sWorldUserState aWorldUserState;
|
||
if( !g_pWorldUserState->GetUserState(biCharacterDBID, &aWorldUserState))
|
||
return false;
|
||
|
||
TMapDWCCharacter::iterator iter = m_MapDWCCharacter.find(biCharacterDBID);
|
||
if(iter == m_MapDWCCharacter.end())
|
||
m_MapDWCCharacter.insert( std::make_pair(biCharacterDBID, nTeamID) );
|
||
else
|
||
iter->second = nTeamID;
|
||
|
||
TCommunityLocation Location;
|
||
Location.Reset();
|
||
Location.cServerLocation = aWorldUserState.nLocationState;
|
||
Location.nChannelID = aWorldUserState.nChannelID;
|
||
Location.nMapIdx = aWorldUserState.nMapIdx;
|
||
pDWCTeam->ChangeDWCTeamMemberState(biCharacterDBID, &Location);
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNDWCSystem::RemoveDWCCharacter(INT64 biCharacterDBID)
|
||
{
|
||
TMapDWCCharacter::iterator iter = m_MapDWCCharacter.find(biCharacterDBID);
|
||
if(iter == m_MapDWCCharacter.end())
|
||
return false;
|
||
|
||
m_MapDWCCharacter.erase(iter);
|
||
return true;
|
||
}
|
||
|
||
bool CDNDWCSystem::ChangeDWCTeamMemberState(INT64 biCharacterDBID, bool bDel, int nLocation, int nChannelID, int nMapIdx)
|
||
{
|
||
TMapDWCCharacter::iterator iter = m_MapDWCCharacter.find(biCharacterDBID);
|
||
if(iter == m_MapDWCCharacter.end())
|
||
return false;
|
||
|
||
CDnDWCTeam *pDWCTeam = GetDWCTeam(iter->second);
|
||
if(!pDWCTeam)
|
||
return false;
|
||
|
||
TCommunityLocation Location;
|
||
Location.Reset();
|
||
Location.cServerLocation = nLocation;
|
||
Location.nChannelID = nChannelID;
|
||
Location.nMapIdx = nMapIdx;
|
||
pDWCTeam->ChangeDWCTeamMemberState(biCharacterDBID, &Location);
|
||
|
||
if(bDel)
|
||
{
|
||
if( pDWCTeam->CheckRemoveResource() )
|
||
DelDWCTeamResource(pDWCTeam->GetTeamID());
|
||
else
|
||
m_MapDWCCharacter.erase(iter);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
UINT CDNDWCSystem::IsRegisterdCharacter(INT64 biCharacterDBID)
|
||
{
|
||
TMapDWCCharacter::iterator iter = m_MapDWCCharacter.find(biCharacterDBID);
|
||
if(iter == m_MapDWCCharacter.end())
|
||
return 0;
|
||
|
||
return iter->second;
|
||
}
|
||
|
||
CDnDWCTeam* CDNDWCSystem::UpdateDWCTeamResource(TAGetDWCTeamInfo *pPacket)
|
||
{
|
||
return UpdateDWCTeamResource(pPacket->nTeamID, &pPacket->Info);
|
||
}
|
||
|
||
CDnDWCTeam* CDNDWCSystem::UpdateDWCTeamResource(UINT nTeamID, TDWCTeam *Info)
|
||
{
|
||
CDnDWCTeam *pDWCTeam = GetDWCTeam(nTeamID);
|
||
|
||
if (!pDWCTeam) // <20><> <20>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD>°<EFBFBD><C2B0><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD>)
|
||
{
|
||
pDWCTeam = new CDnDWCTeam(nTeamID, Info, this);
|
||
m_MapDWCTeamList.insert( std::make_pair(nTeamID, pDWCTeam) );
|
||
|
||
}
|
||
else // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
pDWCTeam->UpdateTeamInfo(Info);
|
||
|
||
return pDWCTeam;
|
||
}
|
||
|
||
CDnDWCTeam* CDNDWCSystem::UpdateTeamMember(TAGetDWCTeamMember *pPacket)
|
||
{
|
||
return UpdateTeamMember(pPacket->nTeamID, pPacket->cCount, pPacket->MemberList);
|
||
}
|
||
|
||
CDnDWCTeam* CDNDWCSystem::UpdateTeamMember(int nTeamID, int nCount, TDWCTeamMember *MemberList )
|
||
{
|
||
CDnDWCTeam *pDWCTeam = GetDWCTeam(nTeamID);
|
||
|
||
if (pDWCTeam)
|
||
pDWCTeam->UpdateMemberList(nCount, MemberList);
|
||
|
||
return pDWCTeam;
|
||
}
|
||
|
||
const WCHAR * CDNDWCSystem::GetDWCTeamName(UINT nDWCTeamID)
|
||
{
|
||
TMapDWCTeams::iterator iter = m_MapDWCTeamList.find(nDWCTeamID);
|
||
if(iter != m_MapDWCTeamList.end())
|
||
{
|
||
return (*iter->second).GetDWCTeamName();
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
bool CDNDWCSystem::DelDWCTeamResource(UINT nDWCTeamID)
|
||
{
|
||
TMapDWCTeams::iterator iter = m_MapDWCTeamList.find(nDWCTeamID);
|
||
if(iter == m_MapDWCTeamList.end())
|
||
return false;
|
||
|
||
iter->second->RemoveDWCCharacters();
|
||
|
||
delete iter->second;
|
||
m_MapDWCTeamList.erase(iter);
|
||
|
||
return true;
|
||
}
|
||
|
||
void CDNDWCSystem::SetDWCMatchTimeForCheat(bool bSet)
|
||
{
|
||
m_bCloseMatchByCheat = bSet;
|
||
}
|
||
|
||
void CDNDWCSystem::Initialize(TAGetDWCChannelInfo* pPacket)
|
||
{
|
||
if(pPacket->nRetCode != ERROR_NONE)
|
||
return;
|
||
|
||
m_DWCChannelInfo = pPacket->ChannelInfo;
|
||
m_VecLadderTime.clear();
|
||
|
||
for(int i = 0 ; i < 2 ; i ++) //TAGetDWCChannelInfo <20><>Ŷ<EFBFBD><C5B6> nLadderTime <20>迭 ũ<>Ⱑ 2
|
||
{
|
||
if( pPacket->ChannelInfo.nLadderTime[i] > 0 )
|
||
{
|
||
int nStartTime = pPacket->ChannelInfo.nLadderTime[i] / 10000;
|
||
int nEndTime = pPacket->ChannelInfo.nLadderTime[i] % 10000;
|
||
|
||
if( nStartTime <= 0 || nEndTime <= 0 )
|
||
{
|
||
DN_ASSERT(0 ,"Invalid Matching Time");
|
||
continue;
|
||
}
|
||
|
||
MatchDuration matchDuration = {0,};
|
||
matchDuration.cStartHour = nStartTime / 100;
|
||
matchDuration.cStartMin = nStartTime % 100;
|
||
matchDuration.cEndHour = nEndTime / 100;
|
||
matchDuration.cEndMin = nEndTime % 100;
|
||
|
||
m_VecLadderTime.push_back(matchDuration);
|
||
}
|
||
}
|
||
|
||
m_bInit = true;
|
||
}
|
||
|
||
bool CDNDWCSystem::CheckDWCSeason()
|
||
{
|
||
if(!m_bInit)
|
||
return false;
|
||
|
||
if( m_DWCChannelInfo.cStatus != DWC::STATUS_NORMAL && m_DWCChannelInfo.cStatus != DWC::STATUS_PAUSE)
|
||
return false;
|
||
|
||
CTimeSet CurTime;
|
||
__time64_t tCurTime = CurTime.GetTimeT64_LC();
|
||
if( tCurTime < m_DWCChannelInfo.tStartDate || tCurTime > m_DWCChannelInfo.tEndDate )
|
||
return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNDWCSystem::CheckDWCMatchTime(LadderSystem::MatchType::eCode MatchType)
|
||
{
|
||
if( !CheckDWCSeason() )
|
||
return false;
|
||
|
||
if( MatchType == LadderSystem::MatchType::_3vs3_DWC )
|
||
{
|
||
if( m_DWCChannelInfo.cStatus != DWC::STATUS_NORMAL || m_bCloseMatchByCheat )
|
||
return false;
|
||
|
||
CTimeSet LocalSet;
|
||
int nCurTimeCalcByMin = ((LocalSet.GetHour() * 60) + LocalSet.GetMinute());
|
||
for(int i = 0 ; i < m_VecLadderTime.size() ; i++)
|
||
{
|
||
if( nCurTimeCalcByMin >= (((int)m_VecLadderTime[i].cStartHour * 60) + m_VecLadderTime[i].cStartMin) &&
|
||
nCurTimeCalcByMin < (((int)m_VecLadderTime[i].cEndHour * 60) + m_VecLadderTime[i].cEndMin) )
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
#endif |