2024-12-21 10:04:04 +08:00
|
|
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "PvPScoreSystem.h"
|
|
|
|
|
|
#include "DnActor.h"
|
|
|
|
|
|
#include "DnSkill.h"
|
|
|
|
|
|
#include "PvPCaptainScoreSystem.h"
|
|
|
|
|
|
#include "PvPRespawnModeScoreSystem.h"
|
|
|
|
|
|
#include "PvPRoundModeScoreSystem.h"
|
|
|
|
|
|
#include "DnMonsterActor.h"
|
|
|
|
|
|
#include "PvPAllKillScoreSystem.h"
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
#include "DNUserSession.h"
|
|
|
|
|
|
#include "DNGameRoom.h"
|
|
|
|
|
|
#include "DNDBConnection.h"
|
|
|
|
|
|
#include "DNDBConnectionManager.h"
|
|
|
|
|
|
#include "PvPGameMode.h"
|
|
|
|
|
|
#include "DnPlayerActor.h"
|
|
|
|
|
|
#include "DNLogConnection.h"
|
|
|
|
|
|
#include "DNGameDataManager.h"
|
|
|
|
|
|
#include "DNPvPPlayerAggroSystem.h"
|
|
|
|
|
|
#include "DNPvPGameRoom.h"
|
|
|
|
|
|
#include "LadderStats.h"
|
|
|
|
|
|
#else
|
|
|
|
|
|
#include "DnInterface.h"
|
|
|
|
|
|
#include "DnLocalPlayerActor.h"
|
|
|
|
|
|
#include "DnTableDB.h"
|
|
|
|
|
|
#include "DnPVPBaseHud.h"
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
|
|
|
|
|
|
#include "DnTotalLevelSkillBlows.h"
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if !defined( USE_BOOST_MEMPOOL )
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif // #if !defined( USE_BOOST_MEMPOOL )
|
|
|
|
|
|
|
|
|
|
|
|
CPvPScoreSystem::CPvPScoreSystem()
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
m_bCreateXPScorePacket = false;
|
|
|
|
|
|
memset( &m_XPScorePacket, 0, sizeof(m_XPScorePacket) );
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::ClearAllScore()
|
|
|
|
|
|
{
|
|
|
|
|
|
SetGameModeScore( 0,0 );
|
|
|
|
|
|
m_mScore.clear();
|
|
|
|
|
|
m_mCount.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::OnFinishRound( DnActorHandle hActor, const bool bIsWin )
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreDataIfnotInsert( hActor );
|
|
|
|
|
|
if( !pMyScore )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( bIsWin )
|
|
|
|
|
|
++pMyScore->uiWinRound;
|
|
|
|
|
|
else
|
|
|
|
|
|
++pMyScore->uiLoseRound;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CPvPScoreSystem::AddUserScore( DnActorHandle hActor, const void* pData )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->GetName() )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TPvPUserScore* pUserScore = static_cast<const TPvPUserScore*>(pData);
|
|
|
|
|
|
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreDataIfnotInsert( hActor );
|
|
|
|
|
|
if( !pMyScore )
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
pMyScore->uiKillScore = pUserScore->uiKillScore;
|
|
|
|
|
|
pMyScore->uiAssistScore = pUserScore->uiAssistScore;
|
|
|
|
|
|
for( UINT i=0 ; i<PvPCommon::Common::MaxClass ; ++i )
|
|
|
|
|
|
{
|
|
|
|
|
|
pMyScore->sKillClassScore.uiScore[i] = pUserScore->uiKillClassScore[i];
|
|
|
|
|
|
pMyScore->sKilledClassScore.uiScore[i] = pUserScore->uiKilledClassScore[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if !defined( _GAMESERVER )
|
|
|
|
|
|
|
|
|
|
|
|
bool CPvPScoreSystem::SetCount( DnActorHandle hActor, const void* pData )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->GetName() || !hActor->IsPlayerActor() )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TPvPUserCount* pUserCount = static_cast<const TPvPUserCount*>(pData);
|
|
|
|
|
|
|
|
|
|
|
|
std::map<std::wstring,SCount>::iterator itor = m_mCount.find( hActor->GetName() );
|
|
|
|
|
|
if( itor == m_mCount.end() )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_mCount.insert( std::make_pair( hActor->GetName(), SCount(pUserCount->uiKillCount, pUserCount->uiDieCount,pUserCount->uiContinuousKillCount)) );
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
(*itor).second.uiKillCount = pUserCount->uiKillCount;
|
|
|
|
|
|
(*itor).second.uiDieCount = pUserCount->uiDieCount;
|
|
|
|
|
|
(*itor).second.uiContinuousKillCount = pUserCount->uiContinuousKillCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif // #if !defined( _GAMESERVER )
|
|
|
|
|
|
|
|
|
|
|
|
IPVPGameModeScoreSystem* CPvPScoreSystem::CreatePvPGameModeScoreSystem( const UINT uiGameMode )
|
|
|
|
|
|
{
|
|
|
|
|
|
switch( uiGameMode )
|
|
|
|
|
|
{
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_Respawn:
|
|
|
|
|
|
return new CPvPRespawnModeScoreSystem();
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_Round:
|
|
|
|
|
|
return new IBoostPoolPvPRoundModeScoreSystem();
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_Captain:
|
|
|
|
|
|
return new IBoostPoolPvPRoundModeScoreSystem(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ھ<EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_IndividualRespawn:
|
|
|
|
|
|
return new IPVPGameModeScoreSystem(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><> <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD> ScoreSystem <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20>׳<EFBFBD> NullInterface <20><> IPvPGameModeScoreSystem() <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_Zombie_Survival:
|
|
|
|
|
|
return new IPVPGameModeScoreSystem(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ھ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> < <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> >
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_GuildWar:
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_Occupation:
|
|
|
|
|
|
return new IPVPGameModeScoreSystem();
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_AllKill:
|
|
|
|
|
|
return new CPvPAllKillModeScoreSystem(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ھ<EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
|
|
|
|
|
#if defined( PRE_ADD_RACING_MODE)
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_Racing:
|
|
|
|
|
|
return new IPVPGameModeScoreSystem();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if defined(PRE_ADD_PVP_TOURNAMENT)
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_Tournament:
|
|
|
|
|
|
return new IPVPGameModeScoreSystem();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if defined( PRE_ADD_PVP_COMBOEXERCISE )
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_ComboExercise:
|
|
|
|
|
|
return new IPVPGameModeScoreSystem();
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_PVP_COMBOEXERCISE )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT CPvPScoreSystem::GetKillCount( DnActorHandle hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->GetName() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<std::wstring,SCount>::iterator itor = m_mCount.find( hActor->GetName() );
|
|
|
|
|
|
if( itor == m_mCount.end() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
return (*itor).second.uiKillCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT CPvPScoreSystem::GetKillCount( const WCHAR * pName )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pName == NULL || pName[0] == '\0')
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<std::wstring,SCount>::iterator itor = m_mCount.find(pName);
|
|
|
|
|
|
if( itor == m_mCount.end() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
return (*itor).second.uiKillCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT CPvPScoreSystem::GetDeathCount( DnActorHandle hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->GetName() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<std::wstring,SCount>::iterator itor = m_mCount.find( hActor->GetName() );
|
|
|
|
|
|
if( itor == m_mCount.end() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
return (*itor).second.uiDieCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT CPvPScoreSystem::GetTotalScore( DnActorHandle hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreData( hActor->GetName() );
|
|
|
|
|
|
if( !pMyScore )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
return pMyScore->uiKillScore + pMyScore->uiAssistScore;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT CPvPScoreSystem::GetKillScore( DnActorHandle hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreData( hActor->GetName() );
|
|
|
|
|
|
if( !pMyScore )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
return pMyScore->uiKillScore;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT CPvPScoreSystem::GetAssistScore( DnActorHandle hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreData( hActor->GetName() );
|
|
|
|
|
|
if( !pMyScore )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
return pMyScore->uiAssistScore;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT CPvPScoreSystem::GetXPScore( DnActorHandle hActor, const UINT uiWinTeam )
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
CDNGameRoom* pGameRoom = hActor->GetGameRoom();
|
|
|
|
|
|
if( !pGameRoom )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
CPvPGameMode* pPvPGameMode = pGameRoom->GetPvPGameMode();
|
|
|
|
|
|
if( !pPvPGameMode )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
// PlayTime <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
UINT uiPlayTimeSec = pPvPGameMode->GetPlayTime( hActor->GetName() );
|
|
|
|
|
|
if( uiPlayTimeSec == 0 )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
int iPlayRound = pPvPGameMode->GetPlayRound();
|
|
|
|
|
|
if( iPlayRound <= 0 )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
UINT uiTotalPlayTime = iPlayRound * pPvPGameMode->GetSelectPlayTime();
|
|
|
|
|
|
UINT uiPlayTimePercent = uiPlayTimeSec * 100 / uiTotalPlayTime;
|
|
|
|
|
|
|
|
|
|
|
|
UINT uiDefaultExp = 0;
|
|
|
|
|
|
UINT uiBonusExp = 0;
|
|
|
|
|
|
|
|
|
|
|
|
uiDefaultExp = hActor->GetTeam() == uiWinTeam ? m_uiVictoryExp : m_uiDefeatExp;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( PRE_MOD_PVP_ROUNDMODE_PENALTY )
|
|
|
|
|
|
UINT uiPenaltyPercent = 0;
|
|
|
|
|
|
pPvPGameMode->GetFinishRoundPenalty( uiWinTeam, uiPenaltyPercent );
|
|
|
|
|
|
uiDefaultExp = uiDefaultExp * (100 - uiPenaltyPercent) / 100;
|
|
|
|
|
|
#endif // #if defined( PRE_MOD_PVP_ROUNDMODE_PENALTY )
|
|
|
|
|
|
|
|
|
|
|
|
if (m_uiGameMode == PvPCommon::GameMode::PvP_Occupation)
|
|
|
|
|
|
{
|
|
|
|
|
|
if( hActor->GetTeam() == uiWinTeam )
|
|
|
|
|
|
uiBonusExp = GetMyOccupationScore(hActor->GetName()) * m_uiVictoryBonusRate /100;
|
|
|
|
|
|
else
|
|
|
|
|
|
uiBonusExp = GetMyOccupationScore(hActor->GetName()) * m_uiDefeatBonusRate / 100;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreData( hActor->GetName() );
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>̰<EFBFBD><CCB0><EFBFBD> <20><>
|
|
|
|
|
|
if( hActor->GetTeam() == uiWinTeam )
|
|
|
|
|
|
uiBonusExp = pMyScore->GetScore() * m_uiVictoryBonusRate /100;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
else
|
|
|
|
|
|
uiBonusExp = pMyScore->GetScore() * m_uiDefeatBonusRate / 100;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
uiDefaultExp = uiDefaultExp * uiPlayTimePercent / 100;
|
|
|
|
|
|
uiBonusExp = (uiBonusExp > uiDefaultExp ) ? uiDefaultExp : uiBonusExp;
|
|
|
|
|
|
|
|
|
|
|
|
return uiDefaultExp + uiBonusExp;
|
|
|
|
|
|
|
|
|
|
|
|
#else // #ifdef _GAMESERVER
|
|
|
|
|
|
|
|
|
|
|
|
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> XP<58><50> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD> XP<58><50> <20>˸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
#endif // #ifdef _GAMESERVER
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const void* CPvPScoreSystem::GetScoreStruct( const WCHAR* pwszCharName )
|
|
|
|
|
|
{
|
|
|
|
|
|
const void* pScoreStruct = FindMyScoreData( pwszCharName );
|
|
|
|
|
|
return pScoreStruct;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_MOD_PVP_LADDER_XP)
|
|
|
|
|
|
UINT CPvPScoreSystem::CalcXPScore( CDNUserSession* pGameSession, const UINT uiWinTeam, PvPCommon::QueryUpdatePvPDataType::eCode Type )
|
|
|
|
|
|
{
|
|
|
|
|
|
DnActorHandle hActor = pGameSession->GetActorHandle();
|
|
|
|
|
|
if(!hActor) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
if( Type != PvPCommon::QueryUpdatePvPDataType::FinishGameMode )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
|
|
|
|
|
bool IsPwRoom = static_cast<CDNPvPGameRoom*>(pGameSession->GetGameRoom())->bIsPWRoom();
|
|
|
|
|
|
if( IsPwRoom )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
// PvP_XP
|
|
|
|
|
|
UINT uiAddXP = GetXPScore( hActor, uiWinTeam );
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( _CH )
|
|
|
|
|
|
if( pGameSession->GetFCMState() == FCMSTATE_HALF)
|
|
|
|
|
|
uiAddXP /= 2;
|
|
|
|
|
|
else if( pGameSession->GetFCMState() == FCMSTATE_ZERO)
|
|
|
|
|
|
uiAddXP = 0;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
int nEventID = 0;
|
|
|
|
|
|
nEventID = static_cast<CDNPvPGameRoom*>(pGameSession->GetGameRoom())->GetEventRoomIndex();
|
|
|
|
|
|
// <20>̺<EFBFBD>Ʈ <20><> <20><><EFBFBD><EFBFBD> ( <20>ݷμ<DDB7><CEBC><EFBFBD> XP 10% )
|
|
|
|
|
|
if( nEventID > 0 )
|
|
|
|
|
|
uiAddXP += (uiAddXP/10);
|
|
|
|
|
|
|
|
|
|
|
|
int nGuildRewardValue = pGameSession->GetGuildRewardItemValue( GUILDREWARDEFFECT_TYPE_EXTRAPVPEXP );
|
|
|
|
|
|
if( nGuildRewardValue > 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
uiAddXP += (int)(uiAddXP * (nGuildRewardValue * 0.01));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return uiAddXP;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::SendScore( CDNUserSession* pGameSession )
|
|
|
|
|
|
{
|
|
|
|
|
|
UINT uiATeamScore,uiBTeamScore;
|
|
|
|
|
|
GetGameModeScore( uiATeamScore, uiBTeamScore );
|
|
|
|
|
|
|
|
|
|
|
|
if( m_mScore.size() > PvPCommon::Common::MaxPlayer )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( m_mCount.size() > PvPCommon::Common::MaxPlayer )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
SCPVP_MODE_SCORE TxPacket;
|
|
|
|
|
|
memset( &TxPacket, 0, sizeof(TxPacket) );
|
|
|
|
|
|
|
|
|
|
|
|
TxPacket.unATeamScore = static_cast<USHORT>(uiATeamScore);
|
|
|
|
|
|
TxPacket.unBTeamScore = static_cast<USHORT>(uiBTeamScore);
|
|
|
|
|
|
TxPacket.cScoreCount = static_cast<BYTE>(m_mScore.size());
|
|
|
|
|
|
TxPacket.cCount = static_cast<BYTE>(m_mCount.size());
|
|
|
|
|
|
|
|
|
|
|
|
char* pStartBuffer = reinterpret_cast<char*>(TxPacket.sPvPUserScore);
|
|
|
|
|
|
char* pBuffer = pStartBuffer;
|
|
|
|
|
|
|
|
|
|
|
|
for( std::map<std::wstring,SMyScore>::iterator itor=m_mScore.begin() ; itor!=m_mScore.end() ; ++itor )
|
|
|
|
|
|
{
|
|
|
|
|
|
TPvPUserScore* pUserScore = reinterpret_cast<TPvPUserScore*>(pBuffer);
|
|
|
|
|
|
|
|
|
|
|
|
pUserScore->uiSessionID = (*itor).second.uiSessionID;
|
|
|
|
|
|
pUserScore->uiKillScore = (*itor).second.uiKillScore;
|
|
|
|
|
|
pUserScore->uiAssistScore = (*itor).second.uiAssistScore;
|
|
|
|
|
|
for( UINT i=0 ; i<PvPCommon::Common::MaxClass ; ++i )
|
|
|
|
|
|
{
|
|
|
|
|
|
pUserScore->uiKillClassScore[i] = (*itor).second.sKillClassScore.uiScore[i];
|
|
|
|
|
|
pUserScore->uiKilledClassScore[i] = (*itor).second.sKilledClassScore.uiScore[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pBuffer += sizeof(TPvPUserScore);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for( std::map<std::wstring,SCount>::iterator itor=m_mCount.begin() ; itor!=m_mCount.end() ; ++itor )
|
|
|
|
|
|
{
|
|
|
|
|
|
TPvPUserCount* pCount = reinterpret_cast<TPvPUserCount*>(pBuffer);
|
|
|
|
|
|
|
|
|
|
|
|
pCount->uiSessionID = (*itor).second.uiSessionID;
|
|
|
|
|
|
pCount->uiKillCount = (*itor).second.uiKillCount;
|
|
|
|
|
|
pCount->uiDieCount = (*itor).second.uiDieCount;
|
|
|
|
|
|
pCount->uiContinuousKillCount = (*itor).second.uiContinuousKillCount;
|
|
|
|
|
|
|
|
|
|
|
|
pBuffer += sizeof(TPvPUserCount);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int iSize = static_cast<int>(sizeof(SCPVP_MODE_SCORE)-sizeof(TxPacket.sPvPUserScore)-sizeof(TxPacket.sPvPUserCount)+(pBuffer-pStartBuffer));
|
|
|
|
|
|
|
|
|
|
|
|
pGameSession->AddSendData( SC_PVP, ePvP::SC_MODE_SCORE, reinterpret_cast<char*>(&TxPacket), iSize );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::SendXPScore( CDNGameRoom* pGameRoom, CDNUserSession* pGameSession )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !m_bCreateXPScorePacket )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_mScore.size() > PvPCommon::Common::MaxPlayer )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int Seq;
|
|
|
|
|
|
|
|
|
|
|
|
char* pStartBuffer = reinterpret_cast<char*>(m_XPScorePacket.sXPScoreArr);
|
|
|
|
|
|
char* pBuffer = pStartBuffer;
|
|
|
|
|
|
|
|
|
|
|
|
for( std::map<std::wstring,SMyScore>::iterator itor=m_mScore.begin() ; itor!=m_mScore.end() ; ++itor )
|
|
|
|
|
|
{
|
|
|
|
|
|
TPvPUserXPScore* pXPScore = reinterpret_cast<TPvPUserXPScore*>(pBuffer);
|
|
|
|
|
|
|
|
|
|
|
|
CDNGameRoom::PartyStruct* pStruct = pGameRoom->GetPartyDatabySessionID( (*itor).second.uiSessionID, Seq );
|
|
|
|
|
|
if( !pStruct )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
DnActorHandle hActor = pStruct->pSession->GetActorHandle();
|
|
|
|
|
|
if( !hActor )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
pXPScore->uiSessionID = (*itor).second.uiSessionID;
|
|
|
|
|
|
if( pGameRoom->bIsLadderRoom() )
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(PRE_ADD_DWC)
|
|
|
|
|
|
CDNPvPGameRoom *pPvPGameRoom = static_cast<CDNPvPGameRoom*>(pGameRoom);
|
|
|
|
|
|
if(pPvPGameRoom->bIsDWCMatch())
|
|
|
|
|
|
{
|
|
|
|
|
|
if(pPvPGameRoom->GetPvPLadderMatchType() == LadderSystem::MatchType::_3vs3_DWC)
|
|
|
|
|
|
{
|
|
|
|
|
|
pXPScore->iAddLadderGradePoint = pPvPGameRoom->GetDWCStatsRepositoryPtr()->GetAddGradePoint( pStruct->pSession->GetTeam() );
|
|
|
|
|
|
pXPScore->uiResultLadderGradePoint = pPvPGameRoom->GetDWCStatsRepositoryPtr()->GetResultGradePoint( pStruct->pSession->GetTeam() );
|
|
|
|
|
|
pXPScore->uiGainMedalCount = 0;
|
|
|
|
|
|
#if defined(PRE_MOD_PVP_LADDER_XP)
|
|
|
|
|
|
pXPScore->uiAddLadderXPScore = 0;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
pXPScore->iAddLadderGradePoint = 0;
|
|
|
|
|
|
pXPScore->uiResultLadderGradePoint = 0;
|
|
|
|
|
|
pXPScore->uiGainMedalCount = 0;
|
|
|
|
|
|
pXPScore->uiAddLadderXPScore = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
#endif
|
|
|
|
|
|
pXPScore->iAddLadderGradePoint = static_cast<CDNPvPGameRoom*>(pGameRoom)->GetLadderStatsRepositoryPtr()->GetAddGradePoint( pStruct->pSession->GetCharacterDBID() );
|
|
|
|
|
|
pXPScore->uiResultLadderGradePoint = static_cast<CDNPvPGameRoom*>(pGameRoom)->GetLadderStatsRepositoryPtr()->GetResultGradePoint( pStruct->pSession->GetCharacterDBID() );
|
|
|
|
|
|
pXPScore->uiGainMedalCount = 0;
|
|
|
|
|
|
#if defined(PRE_MOD_PVP_LADDER_XP)
|
|
|
|
|
|
pXPScore->uiAddLadderXPScore = (*itor).second.uiAddXP;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if defined(PRE_ADD_DWC)
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
pXPScore->uiAddXPScore = (*itor).second.uiAddXP;
|
|
|
|
|
|
pXPScore->uiGainMedalCount = (*itor).second.uiGainMedalCount;
|
|
|
|
|
|
pXPScore->uiResultXPScore = pStruct->pSession->GetPvPData()->uiXP;
|
|
|
|
|
|
#if defined(PRE_MOD_PVP_LADDER_XP)
|
|
|
|
|
|
pXPScore->uiAddLadderXPScore = 0;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
pBuffer += sizeof(TPvPUserXPScore);
|
|
|
|
|
|
++m_XPScorePacket.cCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_bCreateXPScorePacket = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int iSize = static_cast<int>(sizeof(SCPVP_XPSCORE)-sizeof(m_XPScorePacket.sXPScoreArr)+m_XPScorePacket.cCount*sizeof(TPvPUserXPScore));
|
|
|
|
|
|
|
|
|
|
|
|
pGameSession->AddSendData( SC_PVP, ePvP::SC_XPSCORE, reinterpret_cast<char*>(&m_XPScorePacket), iSize );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CPvPScoreSystem::QueryUpdatePvPData( const UINT uiWinTeam, CDNUserSession* pGameSession, PvPCommon::QueryUpdatePvPDataType::eCode Type )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !pGameSession || !pGameSession->GetPvPData() || !g_pDBConnectionManager || !pGameSession->GetGameRoom() )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool bIsLadderRoom = false;
|
|
|
|
|
|
bIsLadderRoom = pGameSession->GetGameRoom()->bIsLadderRoom();
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_ADD_DWC)
|
|
|
|
|
|
if(bIsLadderRoom && static_cast<CDNPvPGameRoom*>(pGameSession->GetGameRoom())->bIsDWCMatch())
|
|
|
|
|
|
return true;
|
|
|
|
|
|
CPvPGameMode * pPvPGameMode = pGameSession->GetGameRoom()->GetPvPGameMode();
|
|
|
|
|
|
if( pPvPGameMode && pPvPGameMode->GetPvPChannelType() == PvPCommon::RoomType::dwc )
|
|
|
|
|
|
return true;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// ActorHandle <20><>ȿ<EFBFBD><C8BF> <20>˻<EFBFBD>
|
|
|
|
|
|
DnActorHandle hActor = pGameSession->GetActorHandle();
|
|
|
|
|
|
if( !hActor )
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ߺ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
if( std::find( m_listQueryCharacterDBID.begin(), m_listQueryCharacterDBID.end(), pGameSession->GetCharacterDBID() ) != m_listQueryCharacterDBID.end() )
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( PRE_FIX_76282 )
|
|
|
|
|
|
// <20>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ҵ<EFBFBD><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>װ<EFBFBD> <20><EFBFBD><DFBB>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>.(#81131)
|
|
|
|
|
|
if( PvPCommon::QueryUpdatePvPDataType::Disconnect == Type )
|
|
|
|
|
|
{
|
|
|
|
|
|
CPvPGameMode * pPvPGameMode = pGameSession->GetGameRoom()->GetPvPGameMode();
|
|
|
|
|
|
if( pPvPGameMode && ( pPvPGameMode->bIsZombieMode() || pPvPGameMode->bIsRacingMode() || pPvPGameMode->bIsComboExerciseMode() ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
g_Log.Log( LogType::_ERROR, pGameSession->GetWorldSetID(), pGameSession->GetAccountDBID(), pGameSession->GetCharacterDBID(), pGameSession->GetSessionID(), L"[ADBID:%u CDBID:%u SID:%u] QueryUpdatePvPData when Disconnect!!\r\n", pGameSession->GetAccountDBID(), pGameSession->GetCharacterDBID(), pGameSession->GetSessionID() );
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif // #if defined( PRE_FIX_76282 )
|
|
|
|
|
|
|
|
|
|
|
|
CDNDBConnection* pDBCon = pGameSession->GetDBConnection();
|
|
|
|
|
|
if( !pDBCon)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log( LogType::_ERROR, pGameSession->GetWorldSetID(), pGameSession->GetAccountDBID(), pGameSession->GetCharacterDBID(), pGameSession->GetSessionID(), L"[ADBID:%u CDBID:%u SID:%u] QueryUpdatePvPData DBConnection NULL!!\r\n", pGameSession->GetAccountDBID(), pGameSession->GetCharacterDBID(), pGameSession->GetSessionID() );
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( bIsLadderRoom == true )
|
|
|
|
|
|
return _QueryUpdateLadderData( pDBCon, pGameSession, uiWinTeam, Type );
|
|
|
|
|
|
else
|
|
|
|
|
|
return _QueryUpdatePvPData( pDBCon, pGameSession, uiWinTeam, Type );
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CPvPScoreSystem::_QueryUpdatePvPData( CDNDBConnection* pDBCon, CDNUserSession* pGameSession, UINT uiWinTeam, PvPCommon::QueryUpdatePvPDataType::eCode Type )
|
|
|
|
|
|
{
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreData( pGameSession->GetCharacterName() );
|
|
|
|
|
|
TPvPGroup* pPvPData = pGameSession->GetPvPData();
|
|
|
|
|
|
|
|
|
|
|
|
DnActorHandle hActor = pGameSession->GetActorHandle();
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_MOD_PVP_LADDER_XP)
|
|
|
|
|
|
// PvP_XP
|
|
|
|
|
|
UINT uiAddXP = CalcXPScore( pGameSession, uiWinTeam, Type );
|
|
|
|
|
|
|
|
|
|
|
|
pPvPData->uiXP += uiAddXP;
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
pMyScore->uiAddXP = uiAddXP;
|
|
|
|
|
|
|
|
|
|
|
|
// PvP_Level
|
|
|
|
|
|
pGameSession->UpdatePvPLevel();
|
|
|
|
|
|
|
|
|
|
|
|
bool IsPwRoom = static_cast<CDNPvPGameRoom*>(pGameSession->GetGameRoom())->bIsPWRoom();
|
|
|
|
|
|
int nEventID = static_cast<CDNPvPGameRoom*>(pGameSession->GetGameRoom())->GetEventRoomIndex();
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
// PvP_XP
|
|
|
|
|
|
UINT uiAddXP = GetXPScore( hActor, uiWinTeam );
|
|
|
|
|
|
if( Type != PvPCommon::QueryUpdatePvPDataType::FinishGameMode )
|
|
|
|
|
|
uiAddXP = 0;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( _CH )
|
|
|
|
|
|
if( pGameSession->GetFCMState() == FCMSTATE_HALF)
|
|
|
|
|
|
uiAddXP /= 2;
|
|
|
|
|
|
else if( pGameSession->GetFCMState() == FCMSTATE_ZERO)
|
|
|
|
|
|
uiAddXP = 0;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
|
|
|
|
|
bool IsPwRoom = static_cast<CDNPvPGameRoom*>(pGameSession->GetGameRoom())->bIsPWRoom();
|
|
|
|
|
|
if( IsPwRoom )
|
|
|
|
|
|
uiAddXP = 0;
|
|
|
|
|
|
|
|
|
|
|
|
int nEventID = 0;
|
|
|
|
|
|
nEventID = static_cast<CDNPvPGameRoom*>(pGameSession->GetGameRoom())->GetEventRoomIndex();
|
|
|
|
|
|
#if defined( PRE_WORLDCOMBINE_PVP )
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PVP<56>뵵 <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȥ<><C8A4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ʋ<><C6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE>и<EFBFBD><D0B8>ؾ<EFBFBD><D8BE><EFBFBD>
|
|
|
|
|
|
if( pGameSession->GetGameRoom()->bIsWorldPvPRoom() )
|
|
|
|
|
|
nEventID = 1;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
// <20>̺<EFBFBD>Ʈ <20><> <20><><EFBFBD><EFBFBD> ( <20>ݷμ<DDB7><CEBC><EFBFBD> XP 10% )
|
|
|
|
|
|
if( nEventID > 0 )
|
|
|
|
|
|
uiAddXP += (uiAddXP/10);
|
|
|
|
|
|
|
|
|
|
|
|
int nGuildRewardValue = pGameSession->GetGuildRewardItemValue( GUILDREWARDEFFECT_TYPE_EXTRAPVPEXP );
|
|
|
|
|
|
if( nGuildRewardValue > 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
uiAddXP += (int)(uiAddXP * (nGuildRewardValue * 0.01));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pPvPData->uiXP += uiAddXP;
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
pMyScore->uiAddXP = uiAddXP;
|
|
|
|
|
|
|
|
|
|
|
|
// PvP_Level
|
|
|
|
|
|
for( UINT i=pPvPData->cLevel ; i<PvPCommon::Common::MaxRank ; ++i )
|
|
|
|
|
|
{
|
|
|
|
|
|
const TPvPRankTable* pPvPRankTable = g_pDataManager->GetPvPRankTable( i );
|
|
|
|
|
|
if( !pPvPRankTable )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PRE_MOD_PVPRANK
|
|
|
|
|
|
if (pPvPRankTable->cType != PvPCommon::RankTable::ExpValue)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
if( pPvPData->uiXP >= pPvPRankTable->uiXP )
|
|
|
|
|
|
#if defined(PRE_ADD_PVPLEVEL_MISSION)
|
|
|
|
|
|
pGameSession->SetPvPLevel(static_cast<BYTE>(i+1));
|
|
|
|
|
|
#else
|
|
|
|
|
|
pPvPData->cLevel = static_cast<BYTE>(i+1);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
else
|
|
|
|
|
|
break;
|
|
|
|
|
|
#else //#ifdef PRE_MOD_PVPRANK
|
|
|
|
|
|
if( pPvPData->uiXP >= pPvPRankTable->uiXP )
|
|
|
|
|
|
#if defined(PRE_ADD_PVPLEVEL_MISSION)
|
|
|
|
|
|
pGameSession->SetPvPLevel(static_cast<BYTE>(i+1));
|
|
|
|
|
|
#else
|
|
|
|
|
|
pPvPData->cLevel = static_cast<BYTE>(i+1);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
else
|
|
|
|
|
|
break;
|
|
|
|
|
|
#endif //#ifdef PRE_MOD_PVPRANK
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#if defined(PRE_MOD_PVP_LADDER_XP)
|
|
|
|
|
|
|
|
|
|
|
|
// PvP_GamePlayTimeSec
|
|
|
|
|
|
CPvPGameMode* pPvPGameMode = pGameSession->GetGameRoom()->GetPvPGameMode();
|
|
|
|
|
|
if( pPvPGameMode == NULL )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
pPvPData->uiPlayTimeSec += pPvPGameMode->GetPlayTime( pGameSession->GetCharacterName() );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>...
|
|
|
|
|
|
if( Type == PvPCommon::QueryUpdatePvPDataType::FinishGameMode )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>¸<EFBFBD><C2B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
if( pPvPGameMode->GetPvPGameModeTable()->uiGameMode == PvPCommon::GameMode::PvP_IndividualRespawn )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( uiWinTeam != PvPCommon::Team::Max )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( uiWinTeam == hActor->GetTeam() )
|
|
|
|
|
|
++pPvPData->uiWin;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// PvP_Win,PvP_Lose,PvP_Draw
|
|
|
|
|
|
if( uiWinTeam == PvPCommon::Team::Max )
|
|
|
|
|
|
++pPvPData->uiDraw;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if( uiWinTeam == hActor->GetTeam() )
|
|
|
|
|
|
++pPvPData->uiWin;
|
|
|
|
|
|
else
|
|
|
|
|
|
++pPvPData->uiLose;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// PvP_GiveUpCount
|
|
|
|
|
|
++pPvPData->uiGiveUpCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
{
|
|
|
|
|
|
// PvP_KO_*,PvP_KO_by_*
|
|
|
|
|
|
for( UINT i=0 ; i<PvPCommon::Common::MaxClass ; ++i )
|
|
|
|
|
|
{
|
|
|
|
|
|
pPvPData->uiKOClassCount[i] += pMyScore->sKillClassScore.uiScore[i];
|
|
|
|
|
|
pPvPData->uiKObyClassCount[i] += pMyScore->sKilledClassScore.uiScore[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// PvP_KillPoint
|
|
|
|
|
|
pPvPData->biTotalKillPoint += pMyScore->uiKillScore;
|
|
|
|
|
|
// PvP_AssistPoint
|
|
|
|
|
|
pPvPData->biTotalAssistPoint += pMyScore->uiAssistScore;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool bQuery = true;
|
|
|
|
|
|
if( pPvPGameMode->bIsZombieMode() )
|
|
|
|
|
|
bQuery = false;
|
|
|
|
|
|
#if defined( PRE_ADD_RACING_MODE)
|
|
|
|
|
|
if( pPvPGameMode->bIsRacingMode() )
|
|
|
|
|
|
bQuery = false;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if defined( PRE_ADD_PVP_COMBOEXERCISE )
|
|
|
|
|
|
if( pPvPGameMode->bIsComboExerciseMode() )
|
|
|
|
|
|
bQuery = false;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_PVP_COMBOEXERCISE )
|
|
|
|
|
|
|
|
|
|
|
|
if( bQuery && pDBCon->QueryUpdatePvPData( pGameSession->GetDBThreadID(), pGameSession, Type ) == false )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( bQuery )
|
|
|
|
|
|
m_listQueryCharacterDBID.push_back( pGameSession->GetCharacterDBID() );
|
|
|
|
|
|
|
|
|
|
|
|
const TPvPGameModeTable* pPvPGameModeTable = pPvPGameMode->GetPvPGameModeTable();
|
|
|
|
|
|
int nSubmitCount = 0;
|
|
|
|
|
|
bool bFatigueMedal = false;
|
|
|
|
|
|
int nGainExp = 0, nGainMedal = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ƿε<C7B7> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
if( !IsPwRoom && pGameSession->GetPvPFatigueOption() && pPvPGameModeTable && pPvPGameModeTable->nFatigueConTime > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
|
|
|
|
|
UINT uiPlayTime = pPvPGameMode->GetPlayTime( pGameSession->GetCharacterName() );
|
|
|
|
|
|
nSubmitCount = uiPlayTime / (pPvPGameModeTable->nFatigueConTime*60);
|
|
|
|
|
|
int nNeedFatigue = nSubmitCount*pPvPGameModeTable->nFatigueConValue;
|
|
|
|
|
|
int nAllFatigue = pGameSession->GetAllFatigue();
|
|
|
|
|
|
if( nSubmitCount > 0 && nAllFatigue > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if( nNeedFatigue > nAllFatigue && pPvPGameModeTable->nFatigueConValue ) // <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ°<D6B4> <20><> <20><><EFBFBD><EFBFBD> <20>ּҴ<D6BC><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
{
|
|
|
|
|
|
nSubmitCount = (nAllFatigue/pPvPGameModeTable->nFatigueConValue)+1;
|
|
|
|
|
|
nNeedFatigue = nAllFatigue;
|
|
|
|
|
|
}
|
|
|
|
|
|
float fPercent = (pPvPGameModeTable->nFatigueConExp*nSubmitCount)/1000.f;
|
|
|
|
|
|
nGainExp = static_cast<int>(GetPlayerLevelTable().GetValue( hActor->OnGetJobClassID(), hActor->GetLevel(), CPlayerLevelTable::LevelDExp ) * fPercent);
|
|
|
|
|
|
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>(hActor.GetPointer());
|
|
|
|
|
|
TExpData ExpData;
|
|
|
|
|
|
ExpData.set( (float)nGainExp );
|
|
|
|
|
|
pPlayerActor->CmdAddExperience(ExpData, DBDNWorldDef::CharacterExpChangeCode::PvP, 0);
|
|
|
|
|
|
pGameSession->DecreaseFatigue(nNeedFatigue);
|
|
|
|
|
|
bFatigueMedal = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
if( pGameSession->GetItem() )
|
|
|
|
|
|
{
|
|
|
|
|
|
const TPvPGameModeTable* pGameModeTable = pPvPGameMode->GetPvPGameModeTable();
|
|
|
|
|
|
_ASSERT( pGameModeTable );
|
|
|
|
|
|
#if defined(PRE_ADD_PVP_TOURNAMENT)
|
|
|
|
|
|
int nRewardItemID = 0;
|
|
|
|
|
|
int nRewardItemCount = 0;
|
|
|
|
|
|
#endif //#if defined(PRE_ADD_PVP_TOURNAMENT)
|
|
|
|
|
|
#if defined(PRE_ADD_RACING_MODE)
|
|
|
|
|
|
int iCount = 0;
|
|
|
|
|
|
if( pPvPGameMode->bIsRacingMode() )
|
|
|
|
|
|
{
|
|
|
|
|
|
BYTE cRank = pPvPGameMode->GetRacingRanking(pGameSession->GetSessionID());
|
|
|
|
|
|
if( cRank != 0 && pGameModeTable->nDefaultRewardValue > 0 )
|
|
|
|
|
|
iCount = pGameModeTable->nDefaultRewardValue;
|
|
|
|
|
|
if( cRank != 0 && cRank <= 8 && cRank <= pPvPGameModeTable->vRankRewardValue.size() ) // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8<><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pPvPGameModeTable->vRankRewardValue[cRank-1] > 0 )
|
|
|
|
|
|
iCount += pPvPGameModeTable->vRankRewardValue[cRank-1];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#if defined(PRE_ADD_PVP_TOURNAMENT)
|
|
|
|
|
|
else if( pPvPGameMode->bIsTournamentMode() )
|
|
|
|
|
|
{
|
|
|
|
|
|
BYTE cRank = pPvPGameMode->GetTournamentRanking(pGameSession->GetSessionID());
|
|
|
|
|
|
if( cRank != 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
// ų<><C5B3><EFBFBD><EFBFBD> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
|
|
|
|
|
if( pPvPGameModeTable->vRankRewardItem[cRank-1] > 0 && GetKillCount(pGameSession->GetActorHandle()) > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
nRewardItemID = pPvPGameModeTable->vRankRewardItem[cRank-1];
|
|
|
|
|
|
if( pPvPGameModeTable->vRankRewardValue[cRank-1] > 0 )
|
|
|
|
|
|
nRewardItemCount += pPvPGameModeTable->vRankRewardValue[cRank-1];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_PVP_TOURNAMENT)
|
|
|
|
|
|
else
|
|
|
|
|
|
iCount = uiAddXP/pGameModeTable->uiMedalExp;
|
|
|
|
|
|
#else // #if defined(PRE_ADD_RACING_MODE)
|
|
|
|
|
|
int iCount = uiAddXP/pGameModeTable->uiMedalExp;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// #17383 [PVP] ų <20><><EFBFBD><EFBFBD> 1<>̻<EFBFBD><CCBB><EFBFBD> <20><> ȹ<><C8B9> <20><EFBFBD><DEB4><EFBFBD> 0<><30> <20>ƴ<EFBFBD> 1<><31> <20><><EFBFBD><EFBFBD> <20><>û
|
|
|
|
|
|
if( iCount <= 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( GetKillCount(pGameSession->GetActorHandle()) > 0 )
|
|
|
|
|
|
iCount = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#if defined(PRE_ADD_REVENGE)
|
|
|
|
|
|
if( pMyScore && pMyScore->bRevengeSucess ) // #62999 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD> <20>߰<EFBFBD> ȹ<><C8B9> (<28>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
iCount += Revenge::RevengeRewardMedalCount;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
// <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEB4><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
|
|
|
|
|
if( IsPwRoom )
|
|
|
|
|
|
iCount = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>( <20><EFBFBD>ȹ<EFBFBD> 50% <20><><EFBFBD><EFBFBD> )
|
|
|
|
|
|
if( nEventID > 0 )
|
|
|
|
|
|
iCount += (iCount/2);
|
|
|
|
|
|
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
|
|
|
|
|
|
if (hActor && hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_261))
|
|
|
|
|
|
{
|
|
|
|
|
|
DNVector(DnBlowHandle) vlBlows;
|
|
|
|
|
|
int nTotalLevelSkillAddMedal = 0;
|
|
|
|
|
|
hActor->GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_261, vlBlows);
|
|
|
|
|
|
|
|
|
|
|
|
int nBlowCount = (int)vlBlows.size();
|
|
|
|
|
|
for (int i = 0; i < nBlowCount; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
DnBlowHandle hBlow = vlBlows[i];
|
|
|
|
|
|
if (hBlow && hBlow->IsEnd() == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnAddMedalBlow* pMedalBlow = static_cast<CDnAddMedalBlow*>(hBlow.GetPointer());
|
|
|
|
|
|
nTotalLevelSkillAddMedal += pMedalBlow->GetAddMedal();
|
|
|
|
|
|
int nTotalLevelSkillLimitMedal = pMedalBlow->GetLimitMedal();
|
|
|
|
|
|
if( pGameSession->GetTotalLevelSkillMedalCount() + nTotalLevelSkillAddMedal > nTotalLevelSkillLimitMedal )
|
|
|
|
|
|
{
|
|
|
|
|
|
nTotalLevelSkillAddMedal = nTotalLevelSkillLimitMedal - pGameSession->GetTotalLevelSkillMedalCount();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(nTotalLevelSkillAddMedal > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
iCount += nTotalLevelSkillAddMedal;
|
|
|
|
|
|
pGameSession->AddTotalLevelSkillMedalCount(nTotalLevelSkillAddMedal);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
if( bFatigueMedal )
|
|
|
|
|
|
{
|
|
|
|
|
|
nGainMedal = pPvPGameModeTable->nFatigueConMedal*nSubmitCount;
|
|
|
|
|
|
iCount += nGainMedal;
|
|
|
|
|
|
}
|
|
|
|
|
|
if( iCount > 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
|
|
|
|
if (pPvPGameMode->GetPvPChannelType() == PvPCommon::RoomType::beginner)
|
|
|
|
|
|
iCount *= PvPCommon::Common::PvPBeginnerMedalMultipleFactor;
|
|
|
|
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
pMyScore->uiGainMedalCount = iCount;
|
|
|
|
|
|
pGameSession->GetItem()->CreateInvenItem1( pPvPGameMode->GetPvPGameModeTable()->iRewardItemID, iCount, -1, -1, DBDNWorldDef::AddMaterializedItem::PvPReward, 0 );
|
|
|
|
|
|
}
|
|
|
|
|
|
#if defined(PRE_ADD_PVP_TOURNAMENT)
|
|
|
|
|
|
if( Type == PvPCommon::QueryUpdatePvPDataType::FinishGameMode && nRewardItemID > 0 && nRewardItemCount > 0)
|
|
|
|
|
|
pGameSession->GetItem()->CreateInvenItem1( nRewardItemID, nRewardItemCount, -1, -1, DBDNWorldDef::AddMaterializedItem::PvPReward, 0 );
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_PVP_TOURNAMENT)
|
|
|
|
|
|
if( bFatigueMedal )
|
|
|
|
|
|
pGameSession->SendPvPFatigueReward(nGainExp, nGainMedal);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_QueryPvPEndLog( pDBCon, pGameSession, pPvPGameMode, pMyScore, Type );
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CPvPScoreSystem::_QueryUpdateLadderData( CDNDBConnection* pDBCon, CDNUserSession* pGameSession, UINT uiWinTeam, PvPCommon::QueryUpdatePvPDataType::eCode Type )
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(PRE_ADD_DWC)
|
|
|
|
|
|
if(static_cast<CDNPvPGameRoom*>(pGameSession->GetGameRoom())->bIsDWCMatch())
|
|
|
|
|
|
return true;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_MOD_PVP_LADDER_XP)
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreData( pGameSession->GetCharacterName() );
|
|
|
|
|
|
TPvPGroup* pPvPData = pGameSession->GetPvPData();
|
|
|
|
|
|
|
|
|
|
|
|
// PvP_XP
|
|
|
|
|
|
UINT uiAddXP = CalcXPScore( pGameSession, uiWinTeam, Type );
|
|
|
|
|
|
|
|
|
|
|
|
pPvPData->uiXP += uiAddXP;
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
pMyScore->uiAddXP = uiAddXP;
|
|
|
|
|
|
|
|
|
|
|
|
// PvP_Level
|
|
|
|
|
|
pGameSession->UpdatePvPLevel();
|
|
|
|
|
|
|
|
|
|
|
|
if( pDBCon->QueryUpdatePvPData( pGameSession->GetDBThreadID(), pGameSession, PvPCommon::QueryUpdatePvPDataType::FinishLadder ) == false )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
//return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
LadderSystem::CStatsRepository* pStatsRepository = static_cast<CDNPvPGameRoom*>(pGameSession->GetGameRoom())->GetLadderStatsRepositoryPtr();
|
|
|
|
|
|
bool bRet = pStatsRepository->QueryUpdateResult( pGameSession, uiWinTeam, Type );
|
|
|
|
|
|
|
|
|
|
|
|
#if !defined(PRE_MOD_PVP_LADDER_XP)
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreData( pGameSession->GetCharacterName() );
|
|
|
|
|
|
#endif
|
|
|
|
|
|
CPvPGameMode* pPvPGameMode = pGameSession->GetGameRoom()->GetPvPGameMode();
|
|
|
|
|
|
if( pPvPGameMode == NULL )
|
|
|
|
|
|
{
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_listQueryCharacterDBID.push_back( pGameSession->GetCharacterDBID() );
|
|
|
|
|
|
|
|
|
|
|
|
// PvP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>ͺ<EFBFBD> PvP <20><><EFBFBD><EFBFBD> <20>α<EFBFBD>
|
|
|
|
|
|
_QueryPvPEndLog( pDBCon, pGameSession, pPvPGameMode, pMyScore, Type );
|
|
|
|
|
|
|
|
|
|
|
|
return bRet;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::_QueryPvPEndLog( CDNDBConnection* pDBCon, CDNUserSession* pGameSession, CPvPGameMode* pPvPGameMode, SMyScore* pMyScore, PvPCommon::QueryUpdatePvPDataType::eCode Type )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pDBCon == NULL )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
INT64 biSNMain = 0;
|
|
|
|
|
|
int nSNSub = 0;
|
|
|
|
|
|
pGameSession->GetGameRoom()->GetPvPSN(biSNMain, nSNSub);
|
|
|
|
|
|
|
|
|
|
|
|
DBDNWorldDef::PvPResultCode::eCode ResultCode = static_cast<DBDNWorldDef::PvPResultCode::eCode>(0);
|
|
|
|
|
|
if( pPvPGameMode->GetWinTeam() == PvPCommon::Team::Max )
|
|
|
|
|
|
ResultCode = DBDNWorldDef::PvPResultCode::Draw;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ResultCode = (pPvPGameMode->GetWinTeam() == pGameSession->GetTeam()) ? DBDNWorldDef::PvPResultCode::Win : DBDNWorldDef::PvPResultCode::Lose;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Type != PvPCommon::QueryUpdatePvPDataType::FinishGameMode)
|
|
|
|
|
|
ResultCode = DBDNWorldDef::PvPResultCode::GiveUp;
|
|
|
|
|
|
BYTE cOccupationWinType = pPvPGameMode->GetFinishReason() == PvPCommon::FinishReason::OpponentTeamResourceLimit ? PvPCommon::OccupationLogWinType::LimitResource : PvPCommon::OccupationLogWinType::TimeOut;
|
|
|
|
|
|
pDBCon->QueryAddPvPResultLog(pGameSession->GetDBThreadID(), pGameSession->GetWorldSetID(), pGameSession->GetAccountDBID(), biSNMain, nSNSub, pGameSession->GetCharacterDBID(),
|
|
|
|
|
|
pGameSession->GetTeam() == PvPCommon::Team::A ? DBDNWorldDef::PvPTeamCode::A : DBDNWorldDef::PvPTeamCode::B, pGameSession->bIsBreakIntoSession(),
|
|
|
|
|
|
ResultCode, pPvPGameMode->GetPlayTime( pGameSession->GetCharacterName()),
|
|
|
|
|
|
pMyScore ? pMyScore->uiKillScore : 0, pMyScore ? pMyScore->uiAssistScore : 0, 0,
|
|
|
|
|
|
pMyScore ? pMyScore->sKillClassScore.uiScore : NULL, pMyScore ? pMyScore->sKilledClassScore.uiScore : NULL, GetOccupationAcquireScore(pGameSession->GetActorHandle()), cOccupationWinType);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif // #ifdef _GAMESERVER
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::OnDamage( DnActorHandle hActor, DnActorHandle hHitter, const INT64 iDamage )
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::OnDie( DnActorHandle hActor, DnActorHandle hHitter )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
if( hHitter && hHitter->IsMonsterActor() )
|
|
|
|
|
|
{
|
|
|
|
|
|
DnActorHandle hMaster = static_cast<CDnMonsterActor*>(hHitter.GetPointer())->GetSummonerPlayerActor();
|
|
|
|
|
|
if( hMaster && hMaster->IsPlayerActor() )
|
|
|
|
|
|
hHitter = hMaster;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( m_pGameModeScoreSystem )
|
|
|
|
|
|
m_pGameModeScoreSystem->OnDie( hActor, hHitter );
|
|
|
|
|
|
|
|
|
|
|
|
_UpdateCount( hActor, hHitter );
|
|
|
|
|
|
|
|
|
|
|
|
// KillScore
|
|
|
|
|
|
UINT uiAddKillScore = 0;
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreDataIfnotInsert( hHitter );
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
{
|
|
|
|
|
|
uiAddKillScore = GetPlayerLevelTable().GetValue( hHitter->OnGetJobClassID(), hHitter->GetLevel(), CPlayerLevelTable::KillScore );
|
|
|
|
|
|
pMyScore->uiKillScore += uiAddKillScore;
|
|
|
|
|
|
|
|
|
|
|
|
// ClassScore
|
|
|
|
|
|
UINT uiActorType = hActor->GetActorType();
|
|
|
|
|
|
if( uiActorType < PvPCommon::Common::MaxClass )
|
|
|
|
|
|
++(pMyScore->sKillClassScore.uiScore[uiActorType]);
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OnNotify( hHitter, ScoreType::KillScore, uiAddKillScore );
|
|
|
|
|
|
|
|
|
|
|
|
pMyScore = FindMyScoreDataIfnotInsert( hActor );
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
{
|
|
|
|
|
|
// ClassScore
|
|
|
|
|
|
if( hHitter )
|
|
|
|
|
|
{
|
|
|
|
|
|
UINT uiActorType = hHitter->GetActorType();
|
|
|
|
|
|
if( uiActorType < PvPCommon::Common::MaxClass )
|
|
|
|
|
|
++(pMyScore->sKilledClassScore.uiScore[uiActorType]);
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::OnCmdAddStateEffect( const CDnSkill::SkillInfo* pSkillInfo )
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::OnLeaveUser( DnActorHandle hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->GetName() || !hActor->IsPlayerActor() )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
CDnPlayerActor* pActor = static_cast<CDnPlayerActor*>(hActor.GetPointer() );
|
|
|
|
|
|
if( pActor && pActor->GetUserSession() )
|
|
|
|
|
|
m_listQueryCharacterDBID.remove( pActor->GetUserSession()->GetCharacterDBID() );
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
m_mScore.erase( hActor->GetName() );
|
|
|
|
|
|
m_mCount.erase( hActor->GetName() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::OnNotify( DnActorHandle hActor, const UINT uiScoreType, const UINT uiScore )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
switch( m_uiGameMode )
|
|
|
|
|
|
{
|
|
|
|
|
|
case PvPCommon::GameMode::PvP_IndividualRespawn:
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AssistPoint <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
|
|
|
|
|
if( uiScoreType == IScoreSystem::ScoreType::AssistScore )
|
|
|
|
|
|
return;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
|
|
|
|
|
|
if( uiScoreType == IScoreSystem::ScoreType::AssistScore )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom* pRoom = hActor->GetGameRoom();
|
|
|
|
|
|
if( !pRoom )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for( UINT i=0 ; i<pRoom->GetUserCount() ; ++i )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNUserSession* pSession = pRoom->GetUserData( i );
|
|
|
|
|
|
if( !pSession )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
pSession->SendPvPAddPoint( hActor->GetSessionID(), uiScoreType, uiScore );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
|
|
WCHAR wszMessage[256];
|
|
|
|
|
|
SecureZeroMemory(wszMessage,sizeof(wszMessage));
|
|
|
|
|
|
|
|
|
|
|
|
switch( uiScoreType )
|
|
|
|
|
|
{
|
|
|
|
|
|
case ScoreType::KillScore:
|
|
|
|
|
|
{
|
|
|
|
|
|
wsprintf(wszMessage,GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 120407 ),uiScore);
|
|
|
|
|
|
//GetInterface().AddPVPGameScore( hActor->GetUniqueID() , uiScore ) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case ScoreType::AssistScore:
|
|
|
|
|
|
{
|
|
|
|
|
|
wsprintf(wszMessage,GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 120408 ),uiScore);
|
|
|
|
|
|
//GetInterface().AddPVPGameScore( hActor->GetUniqueID() , 0 ,uiScore) ;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( CDnActor::s_hLocalActor && hActor == CDnActor::s_hLocalActor )
|
|
|
|
|
|
GetInterface().AddMessageText( wszMessage , textcolor::PVP_F_PLAYER );
|
|
|
|
|
|
|
|
|
|
|
|
#endif // #ifdef _GAMESERVER
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::OnStartRound()
|
|
|
|
|
|
{
|
|
|
|
|
|
for( std::map<std::wstring,SCount>::iterator itor=m_mCount.begin() ; itor!=m_mCount.end() ; ++itor )
|
|
|
|
|
|
{
|
|
|
|
|
|
(*itor).second.uiContinuousKillCount = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_ADD_REVENGE) && defined(_GAMESERVER)
|
|
|
|
|
|
void CPvPScoreSystem::OnRevengeSuccess(DnActorHandle hHitter)
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hHitter || !hHitter->IsPlayerActor() )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreDataIfnotInsert( hHitter );
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
pMyScore->bRevengeSucess = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
CPvPScoreSystem::SMyScore* CPvPScoreSystem::FindMyScoreData( const WCHAR* pwszName )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !pwszName )
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<std::wstring,SMyScore>::iterator itor = m_mScore.find( pwszName );
|
|
|
|
|
|
if( itor == m_mScore.end() )
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
return &itor->second;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CPvPScoreSystem::SMyScore* CPvPScoreSystem::FindMyScoreDataIfnotInsert( DnActorHandle hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() )
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
wchar_t* pwszName = hActor->GetName();
|
|
|
|
|
|
if( !pwszName )
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
SMyScore* pMyScore = FindMyScoreData( pwszName );
|
|
|
|
|
|
if( pMyScore )
|
|
|
|
|
|
return pMyScore;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
UINT uiSessionID = hActor->GetSessionID();
|
|
|
|
|
|
if( uiSessionID == 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::pair<std::map<std::wstring,SMyScore>::iterator,bool> Ret = m_mScore.insert( std::make_pair(pwszName,SMyScore(uiSessionID) ) );
|
|
|
|
|
|
#else
|
|
|
|
|
|
std::pair<std::map<std::wstring,SMyScore>::iterator,bool> Ret = m_mScore.insert( std::make_pair(pwszName,SMyScore() ) );
|
|
|
|
|
|
#endif
|
|
|
|
|
|
if( Ret.second )
|
|
|
|
|
|
return &Ret.first->second;
|
|
|
|
|
|
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::_UpdateCount( DnActorHandle hActor, DnActorHandle hHitter )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
wchar_t* pwszName = hActor->GetName();
|
|
|
|
|
|
if( !pwszName )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
UINT uiSessionID = hActor->GetSessionID();
|
|
|
|
|
|
if( uiSessionID == 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// DieCount
|
|
|
|
|
|
std::map<std::wstring,SCount>::iterator itor = m_mCount.find( pwszName );
|
|
|
|
|
|
if( itor == m_mCount.end() )
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
m_mCount.insert( std::make_pair(pwszName,SCount(uiSessionID,0,1,0)) );
|
|
|
|
|
|
#else
|
|
|
|
|
|
m_mCount.insert( std::make_pair(pwszName,SCount(0,1,0)) );
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
++((*itor).second.uiDieCount);
|
|
|
|
|
|
(*itor).second.uiContinuousKillCount = 0; // <20><><EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( _GAMESERVER )
|
|
|
|
|
|
_UpdateAssistPoint( hActor, hHitter );
|
|
|
|
|
|
#endif // #if defined( _GAMESERVER )
|
|
|
|
|
|
|
|
|
|
|
|
// KillCount
|
|
|
|
|
|
if( hHitter && hHitter->GetName() && hHitter->IsPlayerActor() )
|
|
|
|
|
|
{
|
|
|
|
|
|
int iUpdateKillCount = 1;
|
|
|
|
|
|
int iUpdateContinuousKillCount = 1;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<std::wstring,SCount>::iterator Localitor = m_mCount.find( hHitter->GetName() );
|
|
|
|
|
|
if( Localitor == m_mCount.end() )
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
m_mCount.insert( std::make_pair(hHitter->GetName(),SCount(hHitter->GetSessionID(),1,0,1)) );
|
|
|
|
|
|
#else
|
|
|
|
|
|
m_mCount.insert( std::make_pair(hHitter->GetName(),SCount(1,0,1)) );
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
iUpdateKillCount = ++((*Localitor).second.uiKillCount);
|
|
|
|
|
|
iUpdateContinuousKillCount = ++((*Localitor).second.uiContinuousKillCount);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _GAMESERVER
|
|
|
|
|
|
// <20>켱<EFBFBD><ECBCB1> <20><><EFBFBD>忡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. <20>㿡 <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD>ϸ<EFBFBD>, <20>Ļ<EFBFBD><C4BB>Ƽ<DEBE> <20><><EFBFBD>忡 <20><><EFBFBD><EFBFBD> <20><EFBFBD> ó<><C3B3><EFBFBD>ϸ<EFBFBD> <20><> <20><>.
|
|
|
|
|
|
if( CDnActor::s_hLocalActor && hHitter == CDnActor::s_hLocalActor )
|
|
|
|
|
|
GetInterface().GetHUD()->ShowKillMark( iUpdateContinuousKillCount, CDnPVPBaseHUD::KILLMARK_SHOW_TIME );
|
|
|
|
|
|
|
|
|
|
|
|
if( iUpdateContinuousKillCount >= 5 ) {
|
|
|
|
|
|
WCHAR wszTemp[128];
|
|
|
|
|
|
swprintf_s( wszTemp, _countof(wszTemp), GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 121048 ), hHitter->GetName(), iUpdateContinuousKillCount );
|
|
|
|
|
|
GetInterface().AddChatMessage( CHATTYPE_SYSTEM, L"", wszTemp, false );
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif // #ifndef _GAMESERVER
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( _GAMESERVER )
|
|
|
|
|
|
|
|
|
|
|
|
void CPvPScoreSystem::_UpdateAssistPoint( DnActorHandle hActor, DnActorHandle hHitter )
|
|
|
|
|
|
{
|
|
|
|
|
|
_ASSERT( dynamic_cast<CDNPvPPlayerAggroSystem*>(hActor->GetAggroSystem()) != NULL );
|
|
|
|
|
|
|
|
|
|
|
|
CDNPvPPlayerAggroSystem* pAggroSystem = static_cast<CDNPvPPlayerAggroSystem*>(hActor->GetAggroSystem());
|
|
|
|
|
|
pAggroSystem->Die( this, hHitter );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif // #if defined( _GAMESERVER )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UINT CPvPScoreSystem::_GetDieCount( DnActorHandle hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() || !hActor->GetName() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<std::wstring,SCount>::iterator itor = m_mCount.find( hActor->GetName() );
|
|
|
|
|
|
if( itor == m_mCount.end() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
return (*itor).second.uiDieCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT CPvPScoreSystem::_GetContinuousKillCount( DnActorHandle hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || !hActor->IsPlayerActor() || !hActor->GetName() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<std::wstring,SCount>::iterator itor = m_mCount.find( hActor->GetName() );
|
|
|
|
|
|
if( itor == m_mCount.end() )
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
|
|
return (*itor).second.uiContinuousKillCount;
|
|
|
|
|
|
}
|