DragonNest/Server/DNGameServer/DNDLGameRoom.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

183 lines
No EOL
5.9 KiB
C++

#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) )
{
// 다크레어 관련해서 %s님의 파티 할때 오버런이 발생
// DB SP까지 바껴야 해서 뒤에 글자 짤리게 처리
WCHAR wszTemp[MAX_PATH];
#if defined(PRE_ADD_MULTILANGUAGE)
//파티이름은 디폴트 네이션으로 처리
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
{
// 파티이름에 %s %d 이 포함될 경우 invalid param error 발생하여 wcscpy 로 대체.
_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 )
{
// 나간녀셕은 리스트가 비게되므로 Query날릴때 다시 돌아서 체크해본다.
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 );
// 난입성공했다는 이벤트 트리거 발생
GetWorld()->OnTriggerEventCallback( "CPvPGameMode::OnSuccessBreakInto", 0, 0 );
}
#endif // PRE_MOD_DARKLAIR_RECONNECT