DragonNest/Server/DNGameServer/DNDLGameRoom.cpp

183 lines
5.9 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DNDLGameRoom.h"
#include "DnGameTask.h"
#include "DnItemTask.h"
#include "DnDropItem.h"
#include "DnDLGameTask.h"
#include "DNUserSession.h"
#include "DNDBConnectionManager.h"
#include "DNDBConnection.h"
#include "DNGameDataManager.h"
#include "TaskManager.h"
CDNDLGameRoom::CDNDLGameRoom( CDNRUDPGameServer* pServer, unsigned int iRoomID, MAGAReqRoomID* pPacket )
: CDNGameRoom( pServer, iRoomID, pPacket )
{
m_iProtectionKey = 0;
m_bRecvRankQueryData = false;
m_pRankQueryResultInfo = NULL;
#if defined(PRE_FIX_69108)
m_bSendRankQueryData = false;
#endif
}
CDNDLGameRoom::~CDNDLGameRoom()
{
SAFE_DELETE( m_pRankQueryResultInfo );
}
void CDNDLGameRoom::MakeRankQueryData()
{
m_iProtectionKey = _roomrand(this)%INT_MAX;
memset( &m_RankQueryData, 0, sizeof(m_RankQueryData) );
m_RankQueryData.cWorldSetID = GetWorldSetID();
m_RankQueryData.iProtectionKey = m_iProtectionKey;
m_RankQueryData.iMapIndex = m_pGameTask->GetMapTableID();
#if defined(PRE_ADD_CHALLENGE_DARKLAIR)
if( ((CDnDLGameTask*)m_pGameTask)->IsChallengeDarkLair() )
m_RankQueryData.iMapIndex += DarkLair::TopFloorAbstractMapIndex;
#endif
m_RankQueryData.unPlayRound = ((CDnDLGameTask*)m_pGameTask)->GetRound();
m_RankQueryData.uiPlaySec = GetDungeonPlayTime() / 1000;
m_RankQueryData.iRoomID = GetRoomID();
m_RankQueryData.cPartyUserCount = (BYTE)GetUserCount();
if( GetStartMemberCount() == 1 && wcslen( GetPartyName() ) < 1 && GetUserData(0) )
{
// <20><>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> %s<><73><EFBFBD><EFBFBD> <20><>Ƽ <20>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD>
// DB SP<53><50><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>ؼ<EFBFBD> <20>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD><EFBFBD> ó<><C3B3>
WCHAR wszTemp[MAX_PATH];
#if defined(PRE_ADD_MULTILANGUAGE)
//<2F><>Ƽ<EFBFBD≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̼<EFBFBD><CCBC><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>
swprintf_s( wszTemp, GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 3416, MultiLanguage::eDefaultLanguage ), GetUserData(0)->GetStatusData()->wszCharacterName );
#else //#if defined(PRE_ADD_MULTILANGUAGE)
swprintf_s( wszTemp, GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 3416 ), GetUserData(0)->GetStatusData()->wszCharacterName );
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
_wcscpy( m_RankQueryData.wszPartyName, _countof(m_RankQueryData.wszPartyName), wszTemp, static_cast<int>(wcslen(wszTemp)) );
}
else
{
// <20><>Ƽ<EFBFBD≯<EFBFBD><CCB8><EFBFBD> %s %d <20><> <20><><EFBFBD>Ե<EFBFBD> <20><><EFBFBD><EFBFBD> invalid param error <20>߻<EFBFBD><DFBB>Ͽ<EFBFBD> wcscpy <20><> <20><>ü.
_wcscpy( m_RankQueryData.wszPartyName, _countof(m_RankQueryData.wszPartyName), GetPartyName(), (int)wcslen(GetPartyName()) );
//swprintf_s( m_RankQueryData.wszPartyName, GetPartyName() );
}
for( DWORD i=0; i<GetUserCount(); i++ ) {
CDNUserSession *pSession = GetUserData(i);
if( !pSession ) continue;
m_RankQueryData.sUserData[i].bUpdate = false;
m_RankQueryData.sUserData[i].i64CharacterDBID = pSession->GetCharacterDBID();
m_RankQueryData.sUserData[i].iJobIndex = pSession->GetUserJob();
m_RankQueryData.sUserData[i].unLevel = pSession->GetLevel();
}
m_bRecvRankQueryData = false;
#if defined(PRE_FIX_69108)
m_bSendRankQueryData = false;
#endif
}
void CDNDLGameRoom::UpdateResultRankQueryData()
{
m_RankQueryData.unPlayRound = ((CDnDLGameTask*)m_pGameTask)->GetRound();
m_RankQueryData.uiPlaySec = GetDungeonPlayTime() / 1000;
}
void CDNDLGameRoom::UpdateResultRankMapIndex()
{
if( m_RankQueryData.iMapIndex >= DarkLair::TopFloorAbstractMapIndex )
return;
const TDLMapData* pMapData = g_pDataManager->GetDLMapData( m_RankQueryData.iMapIndex );
if( pMapData == NULL )
return;
if( pMapData->nFloor != 1 )
return;
m_RankQueryData.iMapIndex += DarkLair::TopFloorAbstractMapIndex;
}
void CDNDLGameRoom::SetUpdateRankData( CDNUserSession *pSession )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ԵǹǷ<C7B9> Query<72><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> üũ<C3BC>غ<EFBFBD><D8BA><EFBFBD>.
for( int j=0; j<m_RankQueryData.cPartyUserCount; j++ ) {
if( m_RankQueryData.sUserData[j].i64CharacterDBID == pSession->GetCharacterDBID() ) {
m_RankQueryData.sUserData[j].bUpdate = true;
break;
}
}
}
void CDNDLGameRoom::RequestRankQueryData()
{
#if defined(PRE_FIX_69108)
if(m_bSendRankQueryData) return;
m_bSendRankQueryData = true;
#endif
UpdateResultRankQueryData();
BYTE cThreadID;
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
pDBCon->QueryUpdateDarkLairResult( cThreadID, &m_RankQueryData, sizeof(m_RankQueryData) - sizeof(m_RankQueryData.sUserData) + ( sizeof(SDarkLairUpdateUserData) * m_RankQueryData.cPartyUserCount ) );
SAFE_DELETE( m_pRankQueryResultInfo );
}
void CDNDLGameRoom::OnDBMessageProcess(int iMainCmd, int iSubCmd, char *pData, int iLen)
{
switch( iMainCmd )
{
case MAINCMD_DARKLAIR: OnDBRecvDarkLair(iSubCmd, pData, iLen); break;
}
CDNGameRoom::OnDBMessageProcess( iMainCmd, iSubCmd, pData, iLen );
}
void CDNDLGameRoom::OnDBRecvDarkLair(int nSubCmd, char *pData, int iLen)
{
switch (nSubCmd)
{
case QUERY_UPDATE_DARKLAIR_RESULT:
{
TAUpdateDarkLairResult* pPacket = reinterpret_cast<TAUpdateDarkLairResult*>(pData);
if( pPacket->iProtectionKey != m_iProtectionKey )
{
_DANGER_POINT();
return;
}
m_pRankQueryResultInfo = new TAUpdateDarkLairResult;
memcpy( m_pRankQueryResultInfo, pPacket, iLen );
m_bRecvRankQueryData = true;
return;
}
}
CDNGameRoom::OnDBRecvDarkLair(nSubCmd, pData);
}
void CDNDLGameRoom::OnDie( DnActorHandle hActor, DnActorHandle hHitter )
{
//rlkt
wprintf(L" !!! CDNDLGameRoom::OnDie : %ws killed %ws \n",hActor->GetName(),hHitter->GetName());
__super::OnDie( hActor, hHitter );
}
void CDNDLGameRoom::OnDelPartyMember( UINT iDelMemberSessionID, char cKickKind )
{
CDNGameRoom::OnDelPartyMember( iDelMemberSessionID, cKickKind );
if( m_pGameTask ) {
DnActorHandle hActor = CDnActor::FindActorFromUniqueID( this, iDelMemberSessionID );
((CDnDLGameTask*)m_pGameTask)->CheckAndRequestDungeonClear( hActor );
}
}
#ifdef PRE_MOD_DARKLAIR_RECONNECT
void CDNDLGameRoom::OnSuccessBreakInto( CDNUserSession* pGameSession )
{
CDNGameRoom::OnSuccessBreakInto( pGameSession );
// <20><><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ߴٴ<DFB4> <20>̺<EFBFBD>Ʈ Ʈ<><C6AE><EFBFBD><EFBFBD> <20>߻<EFBFBD>
GetWorld()->OnTriggerEventCallback( "CPvPGameMode::OnSuccessBreakInto", 0, 0 );
}
#endif // PRE_MOD_DARKLAIR_RECONNECT