#include "Stdafx.h" #include "ReputationSystemEventHandlerForServer.h" #include "ReputationSystemRepository.h" #include "DNUserSession.h" #include "DNDBConnection.h" #include "NpcReputationSystem.h" #include "DNGameDataManager.h" #include "TimeSet.h" #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM ) CServerReputationSystemEventHandler::CServerReputationSystemEventHandler( CDNUserSession* pSession ) :m_pSession(pSession) { } void CServerReputationSystemEventHandler::OnComplete( IReputationSystem* pReputation, IReputationSystem::eType Type ) { switch( Type ) { case IReputationSystem::NpcMalice: { #if defined( PRE_REMOVE_NPCREPUTATION_MALICE ) #else CReputationSystemRepository* pRepository = m_pSession->GetReputationSystem(); _ASSERT( pRepository ); _ASSERT( dynamic_cast(pReputation) ); CNpcReputationSystem* pNpcReputaion = static_cast(pReputation); // 당사자 pRepository->SetNpcReputation( pNpcReputaion->GetNpcID(), IReputationSystem::NpcFavor, 0 ); // 호의 초기화 pRepository->SetNpcReputation( pNpcReputaion->GetNpcID(), Type, 0 ); // 악의 초기화 TReputeTableData* pReputationTable = g_pDataManager->GetReputeTableData( pNpcReputaion->GetNpcID() ); if (!pReputationTable) break; // 친한사람 for( UINT i=0 ; ivFavorNpcID.size() ; ++i ) { REPUTATION_TYPE value = pRepository->GetNpcReputation( pReputationTable->vFavorNpcID[i], IReputationSystem::NpcFavor ); value = value*pReputationTable->iFavorGroupBomb/100; pRepository->AddNpcReputation( pReputationTable->vFavorNpcID[i], IReputationSystem::NpcFavor, -value ); // 호감도 하락 } // 싫어하는사람 for( UINT i=0 ; ivMaliceNpcID.size() ; ++i ) { REPUTATION_TYPE value = pRepository->GetNpcReputation( pReputationTable->vMaliceNpcID[i], IReputationSystem::NpcFavor ); value = value*pReputationTable->iMaliceGroupBomb/100; pRepository->AddNpcReputation( pReputationTable->vMaliceNpcID[i], IReputationSystem::NpcFavor, value ); // 호감도 상승 } #endif // #if defined( PRE_REMOVE_NPCREPUTATION_MALICE ) break; } } } void CServerReputationSystemEventHandler::OnChange( IReputationSystem::eType Type ) { } #if defined( PRE_ADD_REPUTATION_EXPOSURE ) void CServerReputationSystemEventHandler::OnCommit( std::map& Reputation, bool bClientSend ) { if( m_pSession == NULL || m_pSession->GetDBConnection() == NULL || m_pSession->GetReputationSystem() == NULL ) return; std::vector vData; m_pSession->GetReputationSystem()->GetCommitData( vData ); if( vData.empty() ) return; // DB M/W 전송 CDNDBConnection* pDBCon = m_pSession->GetDBConnection(); pDBCon->QueryModNpcReputation( m_pSession, vData ); // 유저 전송 if( bClientSend ) m_pSession->SendModReputation( vData ); } #else void CServerReputationSystemEventHandler::OnCommit( std::map& Reputation, bool bClientSend ) { if( m_pSession == NULL || m_pSession->GetDBConnection() == NULL || m_pSession->GetReputationSystem() == NULL ) return; std::vector vData; m_pSession->GetReputationSystem()->GetCommitData( vData ); if( vData.empty() ) return; // DB M/W 전송 CDNDBConnection* pDBCon = m_pSession->GetDBConnection(); pDBCon->QueryModNpcReputation( m_pSession, vData ); // 유저 전송 if( bClientSend ) m_pSession->SendModReputation( vData ); } #endif // #if defined( PRE_ADD_REPUTATION_EXPOSURE ) void CServerReputationSystemEventHandler::OnConnect( __time64_t tTime, bool bSend ) { std::vector vNpcData; std::vector vNpcReputation; CReputationSystemRepository* pReputationSystem = m_pSession->GetReputationSystem(); pReputationSystem->GetAllNpcData( vNpcData ); for( UINT i=0 ; i(pReputationSystem->GetNpcReputation(vNpcData[i],IReputationSystem::NpcFavor)), static_cast(pReputationSystem->GetNpcReputation(vNpcData[i],IReputationSystem::NpcMalice)) ) ); } #if defined( _VILLAGESERVER ) // 1일당 깍이는 수치 if( bSend == false && m_pSession->GetLastServerType() == SERVERTYPE_LOGIN ) { CTimeSet timeSet; __time64_t tLocalTime = timeSet.GetTimeT64_LC(); INT64 GapSec = tLocalTime-tTime; int GapDay = static_cast(GapSec/(60*60*24)); //if( GapDay > 0 ) // 해당기능 임시 비활성화 if(0) { for( UINT i=0 ; iGetReputeTableData( vNpcData[i] ); if( pReputationTable == NULL ) continue; #if defined( _WORK ) iBeforeFavor = static_cast(pReputationSystem->GetNpcReputation(vNpcData[i],IReputationSystem::NpcFavor)); iBeforeMalice = static_cast(pReputationSystem->GetNpcReputation(vNpcData[i],IReputationSystem::NpcMalice)); #endif // #if defined( _WORK ) pReputationSystem->AddNpcReputation( vNpcData[i], IReputationSystem::NpcFavor, pReputationTable->iTakeFavorPerDay*GapDay*-1, false ); pReputationSystem->AddNpcReputation( vNpcData[i], IReputationSystem::NpcMalice, pReputationTable->iAddMalicePerDay*GapDay, false ); for( UINT j=0 ; j(pReputationSystem->GetNpcReputation(vNpcData[i],IReputationSystem::NpcFavor)); vNpcReputation[j].iMalicePoint = static_cast(pReputationSystem->GetNpcReputation(vNpcData[i],IReputationSystem::NpcMalice)); } } #if defined( _WORK ) iAfterFavor = static_cast(pReputationSystem->GetNpcReputation(vNpcData[i],IReputationSystem::NpcFavor)); iAfterMalice = static_cast(pReputationSystem->GetNpcReputation(vNpcData[i],IReputationSystem::NpcMalice)); wsprintf( wszBuf, L"[NPC:%d] %d일 접속지나 Favor:%d->%d Malice:%d->%d", vNpcData[i], GapDay, iBeforeFavor, iAfterFavor, iBeforeMalice, iAfterMalice ); m_pSession->SendDebugChat( wszBuf ); #endif // #if defined( _WORK ) } pReputationSystem->Commit( false ); } } #endif // #if defined( _VILLAGESERVER ) if( bSend ) { m_pSession->SendReputationList( vNpcReputation ); m_pSession->SendUnionMembershipList(m_pSession->GetItem()); #if defined (_VILLAGESERVER) m_pSession->SendUnionPoint(); #endif // #if defined (_VILLAGESERVER) } } #endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )