152 lines
No EOL
4.3 KiB
C++
152 lines
No EOL
4.3 KiB
C++
|
|
#include "Stdafx.h"
|
|
#include "OccupationScoreSystem.h"
|
|
#if defined( _GAMESERVER )
|
|
#include "DnActor.h"
|
|
#include "PvPGameMode.h"
|
|
#include "PvPOccupationMode.h"
|
|
#include "PvPOccupationSystem.h"
|
|
#include "DNGameRoom.h"
|
|
#include "DNUserSession.h"
|
|
#else // #if defined( _GAMESERVER )
|
|
#include "DnPlayerActor.h"
|
|
#include "DnMonsterActor.h"
|
|
#endif // #if defined( _GAMESERVER )
|
|
|
|
COccupationScoreSystem::COccupationScoreSystem()
|
|
{
|
|
}
|
|
|
|
COccupationScoreSystem::~COccupationScoreSystem()
|
|
{
|
|
}
|
|
|
|
UINT COccupationScoreSystem::GetOccupationAcquireScore(DnActorHandle hActor)
|
|
{
|
|
if (!hActor || !hActor->IsPlayerActor())
|
|
return 0;
|
|
|
|
SMyOccupationCount * pScore = GetMyOccupationCount(hActor->GetName());
|
|
if (pScore)
|
|
return pScore->nAcquireCount;
|
|
return 0;
|
|
}
|
|
|
|
UINT COccupationScoreSystem::GetOccupationStealScore(DnActorHandle hActor )
|
|
{
|
|
if (!hActor || !hActor->IsPlayerActor())
|
|
return 0;
|
|
|
|
SMyOccupationCount * pScore = GetMyOccupationCount(hActor->GetName());
|
|
if (pScore)
|
|
return pScore->nStealAcquireCount;
|
|
return 0;
|
|
}
|
|
|
|
void COccupationScoreSystem::OnDamage( DnActorHandle hActor, DnActorHandle hHitter, const INT64 iDamage )
|
|
{
|
|
}
|
|
|
|
void COccupationScoreSystem::OnDie(DnActorHandle hActor, DnActorHandle hHitter)
|
|
{
|
|
CPvPScoreSystem::OnDie(hActor, hHitter);
|
|
}
|
|
|
|
bool COccupationScoreSystem::OnTryAcquirePoint(DnActorHandle hActor, int AreaID, LOCAL_TIME Localtime)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void COccupationScoreSystem::OnLeaveUser( DnActorHandle hActor )
|
|
{
|
|
CPvPScoreSystem::OnLeaveUser(hActor);
|
|
std::map<std::wstring, SMyOccupationCount>::iterator ii = m_mOccupationScore.find(hActor->GetName());
|
|
if (ii != m_mOccupationScore.end())
|
|
m_mOccupationScore.erase(ii);
|
|
}
|
|
|
|
#if defined( _GAMESERVER )
|
|
void COccupationScoreSystem::SendScore( CDNUserSession* pGameSession )
|
|
{
|
|
CPvPScoreSystem::SendScore(pGameSession);
|
|
_SendOccupationScore(pGameSession);
|
|
}
|
|
#endif // #if defined( _GAMESERVER )
|
|
|
|
COccupationScoreSystem::SMyOccupationCount * COccupationScoreSystem::GetMyOccupationCount(const WCHAR * pName)
|
|
{
|
|
if (pName == NULL)
|
|
return NULL;
|
|
|
|
std::map<std::wstring, SMyOccupationCount>::iterator ii = m_mOccupationScore.find(pName);
|
|
if (ii != m_mOccupationScore.end())
|
|
return &(*ii).second;
|
|
|
|
if (AddMyOccupationScore(pName))
|
|
return GetMyOccupationCount(pName);
|
|
return NULL;
|
|
}
|
|
|
|
bool COccupationScoreSystem::AddMyOccupationScore(const WCHAR * pName)
|
|
{
|
|
if (pName == NULL) return false;
|
|
|
|
SMyOccupationCount Score;
|
|
std::wstring wstrName = pName;
|
|
|
|
std::pair<std::map<std::wstring, SMyOccupationCount>::iterator, bool> iret = m_mOccupationScore.insert(std::make_pair(wstrName, Score));
|
|
return iret.second;
|
|
}
|
|
|
|
void COccupationScoreSystem::OnOccupationTeamScore(int nTeam, int nType)
|
|
{
|
|
AddOccupationTeamScore(nTeam, nType);
|
|
}
|
|
|
|
void COccupationScoreSystem::AddOccupationTeamScore(DnActorHandle hActor, int nType)
|
|
{
|
|
AddOccupationTeamScore(hActor->GetTeam(), nType);
|
|
}
|
|
|
|
#if defined( _GAMESERVER )
|
|
void COccupationScoreSystem::_SendOccupationScore(CDNUserSession* pSession)
|
|
{
|
|
if( !pSession )
|
|
return;
|
|
|
|
CDNGameRoom* pGameRoom = pSession->GetGameRoom();
|
|
if( !pGameRoom )
|
|
return;
|
|
|
|
if(m_mOccupationScore.size() > PvPCommon::Common::MaxPlayer)
|
|
{
|
|
_DANGER_POINT();
|
|
return;
|
|
}
|
|
|
|
TPvPOccupationScore packet;
|
|
memset(&packet, 0, sizeof(TPvPOccupationScore));
|
|
|
|
for (int i = 0; i < PvPCommon::TeamIndex::Max; i++)
|
|
{
|
|
packet.TeamScoreInfo[i].nTeamID = (i == 0 ? PvPCommon::Team::A : PvPCommon::Team::B);
|
|
GetOccupationTeamScore(packet.TeamScoreInfo[i].nTeamID, packet.TeamScoreInfo[i]);
|
|
}
|
|
|
|
for(std::map<std::wstring, SMyOccupationCount>::iterator ii = m_mOccupationScore.begin(); ii != m_mOccupationScore.end() ;ii++)
|
|
{
|
|
CDNGameRoom::PartyStruct* pStruct = pGameRoom->GetPartyData( const_cast<WCHAR*>((*ii).first.c_str()) );
|
|
if( !pStruct || !pStruct->pSession )
|
|
continue;
|
|
|
|
packet.Info[packet.cCount].nSessionID = pStruct->pSession->GetSessionID();
|
|
packet.Info[packet.cCount].nTryAcquireCount = (*ii).second.nTryAcquireCount;
|
|
packet.Info[packet.cCount].nAcquireCount = (*ii).second.nAcquireCount;
|
|
packet.Info[packet.cCount].cBossKillCount = (*ii).second.cBossKillCount;
|
|
packet.Info[packet.cCount].nStealAquireCount = (*ii).second.nStealAcquireCount;
|
|
packet.cCount++;
|
|
}
|
|
|
|
pSession->AddSendData(SC_PVP, ePvP::SC_OCCUPATIONSCORE, reinterpret_cast<char*>(&packet), sizeof(packet) - sizeof(packet.Info) + (sizeof(TPvPOccupationScoreInfo) * packet.cCount));
|
|
}
|
|
#endif // #if defined( _GAMESERVER )
|