6048 lines
No EOL
175 KiB
C++
6048 lines
No EOL
175 KiB
C++
#include "stdafx.h"
|
||
#include "DnGameRoom.h"
|
||
#include "DNUserSession.h"
|
||
#include "TaskManager.h"
|
||
#include "DnGameTask.h"
|
||
#include "DnPvPGameTask.h"
|
||
#include "DnDLGameTask.h"
|
||
#include "DnItemTask.h"
|
||
#include "DnPartyTask.h"
|
||
#include "DnDLPartyTask.h"
|
||
#include "DnGuildTask.h"
|
||
#include "DnPvPPartyTask.h"
|
||
#include "DnSkillTask.h"
|
||
#include "DnWorld.h"
|
||
#include "PerfCheck.h"
|
||
#include "GameListener.h"
|
||
#include "DNGameServerManager.h"
|
||
#include "DNRUDPGameServer.h"
|
||
#include "DNBackGroundLoader.h"
|
||
#include "EtCollisionMng.h"
|
||
#include "GameSendPacket.h"
|
||
#include "DnSkill.h"
|
||
#include "DNUserTcpConnection.h"
|
||
#include "DNIocpManager.h"
|
||
#include "DnWorldSector.h"
|
||
#include "DnWorldActProp.h"
|
||
#include "DNLogConnection.h"
|
||
#include "DNBreakIntoUserSession.h"
|
||
#include "DnBlow.h"
|
||
#include "ExceptionReport.h"
|
||
#include "DnWeapon.h"
|
||
#include "DnParts.h"
|
||
#include "DNServiceConnection.h"
|
||
#include "DnPlayerActor.h"
|
||
#include "NoticeSystem.h"
|
||
#if defined( STRESS_TEST )
|
||
#include "DNDBConnectionManager.h"
|
||
#endif // #if defined( STRESS_TEST )
|
||
#include "DNDBConnectionManager.h"
|
||
#ifdef _USE_VOICECHAT
|
||
#include "DNVoiceChat.h"
|
||
#endif
|
||
#include "DnTaskFactory.hpp"
|
||
#include "DNMissionSystem.h"
|
||
#include "DnMonsterActor.h"
|
||
#include "DNDBConnection.h"
|
||
#include "CloseSystem.h"
|
||
#include "DNFriend.h"
|
||
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
||
#include "ReputationSystemRepository.h"
|
||
#include "ReputationSystemEventHandler.h"
|
||
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
||
#include "MasterRewardSystem.h"
|
||
#include "DNMasterConnectionManager.h"
|
||
#include "DNMasterConnection.h"
|
||
#include "DNFarmUserSession.h"
|
||
#if defined (PRE_ADD_BESTFRIEND)
|
||
#include "DNBestFriend.h"
|
||
#endif
|
||
#ifdef PRE_ADD_BEGINNERGUILD
|
||
#include "DNGuildSystem.h"
|
||
#endif //#ifdef PRE_ADD_BEGINNERGUILD
|
||
#include "DNChatTask.h"
|
||
#include "DNChatRoom.h"
|
||
#include "DNTimeEventSystem.h"
|
||
#include "PvPGameMode.h"
|
||
#if defined( PRE_ADD_VIP_FARM )
|
||
#include "DNCashRepository.h"
|
||
#endif // #if defined( PRE_ADD_VIP_FARM )
|
||
#include "DNGameDataManager.h"
|
||
#if defined( _WORK )
|
||
#include <iostream>
|
||
#endif // #if defined( _WORK )
|
||
//rlkt addons
|
||
#include "FarmPVP.h"
|
||
|
||
CDNGameRoom::CDNGameRoom( CDNRUDPGameServer* pServer, unsigned int iRoomID, MAGAReqRoomID* pPacket )
|
||
: CMultiRoom( iRoomID )
|
||
{
|
||
#ifdef PRE_ADD_FRAMEDELAY_LOG
|
||
m_dwProcessElapsedTime = 0;
|
||
#endif //#ifdef PRE_ADD_FRAMEDELAY_LOG
|
||
m_bRoomCrash = false;
|
||
m_lRoomProcessInterLocked = 0;
|
||
|
||
// SmartPtr Manager <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽô<DDBD>.
|
||
CDnActor::ReleaseClass( this );
|
||
CDnDropItem::ReleaseClass( this );
|
||
CDnWeapon::ReleaseClass( this );
|
||
|
||
CDnParts::DeleteAllObject( this );
|
||
CEtObject::DeleteAllObject( this );
|
||
CDnBlow::DeleteAllObject( this );
|
||
CDnSkill::DeleteAllObject( this );
|
||
CDnWorldProp::DeleteAllObject( this );
|
||
|
||
/////////////////////////////////////////
|
||
m_pGameServer = pServer;
|
||
m_iWorldID = 0;
|
||
|
||
|
||
#if defined( PRE_PARTY_DB )
|
||
m_PartyStructData = pPacket->PartyData;
|
||
#else
|
||
memset(m_wszPartyPass, 0, sizeof(m_wszPartyPass));
|
||
memset(m_wszPartyName, 0, sizeof(m_wszPartyName));
|
||
_wcscpy( m_wszPartyName, _countof(m_wszPartyName), pPacket->wszPartyName, (int)wcslen(pPacket->wszPartyName) );
|
||
m_nUserLvMin = pPacket->cUserLvLimitMin;
|
||
m_nTargetMapIdx = pPacket->nTargetMapIdx;
|
||
m_PartyDifficulty = pPacket->PartyDifficulty;
|
||
m_nMemberMax = pPacket->cMemberMax;
|
||
#endif // #if defined( PRE_PARTY_DB )
|
||
|
||
m_GameTaskType = pPacket->GameTaskType;
|
||
m_cReqGameIDType = pPacket->cReqGameIDType;
|
||
m_InstanceID = pPacket->InstanceID;
|
||
m_iPartMemberCnt = pPacket->cMemberCount;
|
||
m_iMapIdx = pPacket->nMapIndex;
|
||
#if defined(PRE_ADD_RENEW_RANDOM_MAP)
|
||
m_iRootMapIndex = pPacket->nMapIndex;
|
||
#endif
|
||
m_iGateIdx = pPacket->cGateNo;
|
||
m_iGateSelect = pPacket->cGateSelect;
|
||
m_StageDifficulty = pPacket->StageDifficulty;
|
||
m_iRandomSeed = pPacket->nRandomSeed;
|
||
#if defined(PRE_FIX_INITSTATEANDSYNC)
|
||
m_bInitStateAndSyncReserved = false;
|
||
m_nReservedMapIdx = 0;
|
||
m_nReservedGateIdx = 0;
|
||
m_nReservedRandomSeed = 0;
|
||
m_ReservedStageDifficulty = TDUNGEONDIFFICULTY::Easy;
|
||
m_bReservedDirectConnect = false;
|
||
m_bReservedGateSelect = 0;
|
||
#endif
|
||
#if defined( PRE_PARTY_DB )
|
||
#else
|
||
m_ItemLootRule = pPacket->ItemLootRule;
|
||
m_ItemLootRank = pPacket->ItemLootRank;
|
||
#endif
|
||
m_nMeritBonusID = pPacket->nMeritBonusID;
|
||
m_bDirectConnect = pPacket->bDirectConnect;
|
||
m_nChannelID = pPacket->nChannelID;
|
||
|
||
#if defined( PRE_PARTY_DB )
|
||
#else
|
||
m_nUserLvMax = pPacket->cUserLvLimitMax;
|
||
m_cIsJobDice = pPacket->cIsJobDice;
|
||
_wcscpy( m_wszPartyPass, _countof(m_wszPartyPass), pPacket->wszPartyPass, (int)wcslen(pPacket->wszPartyPass) );
|
||
#endif // #if defined( PRE_PARTY_DB )
|
||
|
||
m_nEventRoomIndex = 0;
|
||
|
||
m_nCompleteExperience = 0;
|
||
m_dwDungeonPlayerTime = 0;
|
||
m_nDungeonGateID = 0;
|
||
|
||
memset(m_nKickedMemberList, 0, sizeof(m_nKickedMemberList));
|
||
|
||
//test
|
||
m_ActorSendTick = 0;
|
||
m_ActorTick = DEFAULT_ACTOR_BROADTICK;
|
||
m_nCullingDistance = DEFAULT_PACKETCULLING_DISTANCE;
|
||
|
||
m_pWorld = NULL;
|
||
m_pTaskMng = NULL;
|
||
m_pGameTask = NULL;
|
||
m_pPartyTask = NULL;
|
||
m_pItemTask = NULL;
|
||
m_pSkillTask = NULL;
|
||
m_pGuildTask = NULL;
|
||
m_pCollisionMng = NULL;
|
||
m_iPivotTick = timeGetTime();
|
||
m_iNextGameState = 0;
|
||
m_nCurItemLooterInOrder = 0;
|
||
|
||
if (m_cReqGameIDType == REQINFO_TYPE_FARM)
|
||
m_GameState = _GAME_STATE_FARM_NONE;
|
||
else
|
||
m_GameState = _GAME_STATE_READY2CONNECT;
|
||
|
||
m_pRandom = new CRandom( this );
|
||
_srand( this, timeGetTime() );
|
||
|
||
m_pCollisionMng = new CEtCollisionMng( this );
|
||
|
||
m_VecMember.reserve( PvPCommon::Common::MaxPlayer );
|
||
m_DeleteList.reserve( PvPCommon::Common::MaxPlayer );
|
||
#if defined( PRE_FIX_49129 )
|
||
m_MapFirstPartyMember.clear();
|
||
#endif
|
||
#ifdef _USE_VOICECHAT
|
||
memset(&m_nVoiceChannelID, 0, sizeof(m_nVoiceChannelID));
|
||
m_nTalkingTick = 0;
|
||
if (g_pVoiceChat)
|
||
{
|
||
for (int i = 0; i < PvPCommon::TeamIndex::Max; i++)
|
||
{
|
||
if (pPacket->nVoiceChannelID[i] <= 0) continue;
|
||
if (g_pVoiceChat->CreateVoiceChannel(pPacket->nVoiceChannelID[i]))
|
||
{
|
||
m_nVoiceChannelID[i] = pPacket->nVoiceChannelID[i];
|
||
m_nTalkingTick = timeGetTime();
|
||
}
|
||
else
|
||
_DANGER_POINT();
|
||
}
|
||
}
|
||
#endif // #ifdef _USE_VOICECHAT
|
||
|
||
#if defined( PRE_TRIGGER_LOG )
|
||
// test
|
||
m_dTriggerTime = 0.f;
|
||
m_dProcessTime = 0.f;
|
||
if( pServer )
|
||
{
|
||
#if !defined( _FINAL_BUILD )
|
||
m_bLog = true;
|
||
#else // #if !defined( _FINAL_BUILD )
|
||
m_bLog = (pServer->GetServerID() == 1);
|
||
#endif // #if !defined( _FINAL_BUILD )
|
||
if( m_bLog )
|
||
QueryPerformanceFrequency(&m_liFrequency);
|
||
}
|
||
else
|
||
{
|
||
m_bLog = false;
|
||
}
|
||
#endif // #if defined( PRE_TRIGGER_LOG )
|
||
|
||
_CalcDBConnection( iRoomID );
|
||
|
||
m_cSeqLevel = 0;
|
||
|
||
m_bStageStargLog = false;
|
||
m_bStageEndLog = false;
|
||
m_bGotoVillageFlag = false;
|
||
#if defined( PRE_ADD_DIRECTNBUFF )
|
||
m_DirectPartyBuffItemList.clear();
|
||
#endif
|
||
m_iHackPenalty = 0;
|
||
m_bForceDestroyRoom = false;
|
||
m_bFinalizeRoom = false;
|
||
m_i64RoomLogIndex = (static_cast<INT64>(g_Config.nManagedID)<<32)|((iRoomID&0xFFFF)<<16)|(rand()&0xFFFF);
|
||
#if defined( PRE_PARTY_DB )
|
||
#else
|
||
m_nUpkeepCount = pPacket->cUpkeepCount;
|
||
#endif
|
||
|
||
memset(m_nPartyMemberIndex, 0, sizeof(m_nPartyMemberIndex));
|
||
memset(m_wszInvitedCharacterName, 0, sizeof(m_wszInvitedCharacterName));
|
||
m_nInivitedTime = 0;
|
||
|
||
m_pMasterRewardSystem = new MasterSystem::CRewardSystem( this );
|
||
|
||
m_bCheckTick = false;
|
||
#if defined( PRE_THREAD_ROOMDESTROY )
|
||
m_lRoomDestroyInterLocked = eRoomDestoryStep::None;
|
||
#endif // #if defined( PRE_THREAD_ROOMDESTROY )
|
||
|
||
m_mtRandom.srand(timeGetTime());
|
||
|
||
#if defined( PRE_ADD_36870 )
|
||
m_iDungeonClearRound = 0;
|
||
#endif // #if defined( PRE_ADD_36870 )
|
||
#ifdef _GPK
|
||
m_bGPKCodeFlag = false;
|
||
#endif //#ifdef _GPK
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
m_eWorldReqRoom = pPacket->eWorldReqType;
|
||
m_nWorldPvPRoomDBIndex = 0;
|
||
m_bWorldPvPRoomStart = 0;
|
||
m_nCreateGMAccountDBID = 0;
|
||
memset(&m_tPvPRoomDBData, 0, sizeof(m_tPvPRoomDBData));
|
||
#endif
|
||
#if defined(PRE_ADD_ACTIVEMISSION)
|
||
m_bIsFirstInitializeDungeon = false;
|
||
#endif
|
||
#if defined( PRE_ALTEIAWORLD_EXPLORE )
|
||
m_bAlteiaWorld = false;
|
||
m_bAlteiaWorldMap = false;
|
||
m_dwAlteiaWorldStartTime = 0;
|
||
m_dwAlteiaWorldPlayTime = 0;
|
||
#endif
|
||
#if defined(PRE_ADD_CP_RANK)
|
||
memset(&m_sLegendClearBest, 0, sizeof(m_sLegendClearBest));
|
||
memset(&m_sMonthlyClearBest, 0, sizeof(m_sMonthlyClearBest));
|
||
#endif //#if defined(PRE_ADD_CP_RANK)
|
||
#if defined( PRE_PVP_GAMBLEROOM )
|
||
m_nGambleRoomDBID = 0;
|
||
#endif
|
||
}
|
||
|
||
CDNGameRoom::~CDNGameRoom()
|
||
{
|
||
SAFE_DELETE( m_pMasterRewardSystem );
|
||
}
|
||
|
||
void CDNGameRoom::FinalizeGameRoom()
|
||
{
|
||
m_bFinalizeRoom = true;
|
||
|
||
#if defined( PRE_PARTY_DB )
|
||
DelPartyDB();
|
||
#endif
|
||
|
||
#if !defined( PRE_PARTY_DB )
|
||
// <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>α<EFBFBD>
|
||
if( GetGameType() == REQINFO_TYPE_PARTY && !GetGoToVillageFlag() )
|
||
{
|
||
BYTE cThreadID;
|
||
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
|
||
if( pDBCon )
|
||
pDBCon->QueryAddPartyEndLog( cThreadID, GetWorldSetID(), 0, GetPartyLogIndex() );
|
||
}
|
||
#endif
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD>
|
||
if( GetStageStartLogFlag() && !GetStageEndLogFlag() )
|
||
{
|
||
BYTE cThreadID;
|
||
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
|
||
if( pDBCon )
|
||
{
|
||
pDBCon->QueryAddStageEndLog( cThreadID, GetWorldSetID(), 0, GetRoomLogIndex(), static_cast<DBDNWorldDef::WhereToGoCode::eCode>(0) );
|
||
}
|
||
}
|
||
|
||
#if defined( PRE_ALTEIAWORLD_EXPLORE )
|
||
if( bIsAlteiaWorld() )
|
||
{
|
||
GetDBConnection()->QueryAddStageEndLog( GetDBThreadID(), GetWorldSetID(), 0, GetRoomLogIndex(), DBDNWorldDef::WhereToGoCode::Village );
|
||
}
|
||
#endif
|
||
|
||
#if defined( PRE_ADD_58761 )
|
||
if( GetDungeonGateID() > 0 )
|
||
EndDungeonGateTime( GetDungeonGateID() );
|
||
#endif
|
||
|
||
|
||
#ifdef _USE_VOICECHAT
|
||
if (g_pVoiceChat)
|
||
{
|
||
for (int i = 0; i < PvPCommon::TeamIndex::Max; i++)
|
||
{
|
||
if (m_nVoiceChannelID[i] <= 0) continue;
|
||
g_pVoiceChat->DestroyVoiceChannel(m_nVoiceChannelID[i]);
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if( bIsWorldPvPRoom() && !bIsWorldPvPRoomStart() )
|
||
{
|
||
GetDBConnection()->QueryDelWorldPvPRoom( GetWorldSetID(), GetWorldPvPRoomDBIndex() );
|
||
}
|
||
#endif
|
||
|
||
std::list<CDNUserSession*>::iterator ii;
|
||
for (ii = m_UserList.begin(); ii != m_UserList.end(); ii++)
|
||
(*ii)->DetachConnection(L"~CDNGameRoom()");
|
||
|
||
FinalizeProcess();
|
||
TcpProcess();
|
||
Process();
|
||
|
||
if( m_pTaskMng )
|
||
m_pTaskMng->RemoveAllTask();
|
||
|
||
SAFE_DELETE( m_pTaskMng );
|
||
SAFE_DELETE( m_pWorld );
|
||
SAFE_DELETE( m_pRandom );
|
||
SAFE_DELETE( m_pCollisionMng );
|
||
SAFE_DELETE_VEC( m_GameListener );
|
||
|
||
for( ii = m_UserList.begin() ; ii != m_UserList.end() ; ++ii )
|
||
{
|
||
delete *ii;
|
||
}
|
||
|
||
#if defined( PRE_TRIGGER_LOG )
|
||
if( m_bLog && m_dProcessTime >= 1.f )
|
||
{
|
||
wchar_t szBuf[MAX_PATH];
|
||
wsprintf( szBuf, L"[Map:%d] Total %.3f ms Trigger %.3f ms rate=%d%%\r\n", m_iMapIdx, m_dProcessTime, m_dTriggerTime, static_cast<int>(m_dTriggerTime/m_dProcessTime*100) );
|
||
g_TriggerLog.Log( LogType::_FILELOG, szBuf );
|
||
}
|
||
#endif // #if defined( PRE_TRIGGER_LOG )
|
||
|
||
//<2F><><EFBFBD><EFBFBD> Ŭ<><C5AC>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20>ƴѵ<C6B4>
|
||
if (bIsFarmRoom())
|
||
{
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ٸ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־ <20><EFBFBD><D7B7>°Ž<C2B0><C5BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD> ó<><C3B3><EFBFBD>ǰ<EFBFBD><C7B0>Ѵ<EFBFBD>.
|
||
g_pMasterConnectionManager->SendFarmIntendedDestroy(GetWorldSetID(), GetFarmIndex());
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::_CalcDBConnection( UINT uiRoomID )
|
||
{
|
||
// RootRoom <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
|
||
if( m_pGameServer == NULL )
|
||
{
|
||
m_pDBConnection = NULL;
|
||
m_cDBThreadID = 0;
|
||
return;
|
||
}
|
||
|
||
m_pDBConnection = g_pDBConnectionManager->GetDBConnection( uiRoomID, m_cDBThreadID );
|
||
|
||
if( !m_pDBConnection || !m_pDBConnection->GetActive() )
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> Ƚ<><C8BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Active <20><> DBConnection <20><> ã<>´<EFBFBD>.
|
||
for( int i=0 ; i<(int)g_pDBConnectionManager->GetCount()*2 ; ++i )
|
||
{
|
||
m_pDBConnection = g_pDBConnectionManager->GetDBConnection( m_cDBThreadID );
|
||
|
||
// Active <20><> DBConnection <20><> ã<><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~~~.
|
||
if( m_pDBConnection && m_pDBConnection->GetActive() )
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
bool CDNGameRoom::bIsBreakIntoUser( CDNUserSession* pGameSession )
|
||
{
|
||
std::list<CDNUserSession*>::iterator itor = std::find( m_BreakIntoUserList.begin(), m_BreakIntoUserList.end(), pGameSession );
|
||
return (itor!=m_BreakIntoUserList.end());
|
||
}
|
||
|
||
void CDNGameRoom::GetBreakIntoUserTeamCount( int& iATeam, int& iBTeam )
|
||
{
|
||
iATeam = 0;
|
||
iBTeam = 0;
|
||
for( std::list<CDNUserSession*>::iterator itor=m_BreakIntoUserList.begin() ; itor!=m_BreakIntoUserList.end() ; ++itor )
|
||
{
|
||
CDNUserSession* pSession = (*itor);
|
||
|
||
// m_VecMember <20><> <20><><EFBFBD><EFBFBD> Push <20>ȵȾָ<C8BE>
|
||
if( GetUserSession( pSession->GetSessionID() ) == NULL )
|
||
{
|
||
if( pSession->GetTeam() == PvPCommon::Team::A )
|
||
++iATeam;
|
||
else if( pSession->GetTeam() == PvPCommon::Team::B )
|
||
++iBTeam;
|
||
}
|
||
}
|
||
}
|
||
|
||
CDNUserSession* CDNGameRoom::CreateBreakIntoGameSession( WCHAR* wszAccountName, const WCHAR * pwszChracterName, UINT nAccountDBID, UINT nSessionID, INT64 biCharacterDBID, int iTeam, int nWorldID, int nVillageID,
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
bool bAdult, char cPCBangGrade, int BreakIntoType, char cSelectedLanguage )
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
bool bAdult, char cPCBangGrade, int BreakIntoType )
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
{
|
||
CDNUserSession* pSession = NULL;
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> _GAME_STATE_PLAY <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||
if( m_GameState == _GAME_STATE_PLAY )
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
if (GetGameType() == REQINFO_TYPE_PARTY && GetPartyIndex() > 0 && (BreakIntoType==BreakInto::Type::WorldZoneParty || BreakIntoType==BreakInto::Type::PartyJoin) )
|
||
#else
|
||
if (GetGameType() == REQINFO_TYPE_PARTY && GetPartyIndex() > 0 && BreakIntoType==BreakInto::Type::WorldZoneParty )
|
||
#endif // #if defined( PRE_PARTY_DB )
|
||
{
|
||
//Ȥ<>ó<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>츦 <20><><EFBFBD>ƺ<EFBFBD><C6BA>ڲٳ<DAB2>~
|
||
if ((int)m_VecMember.size() >= GetPartyMemberMax())
|
||
return NULL; //<2F>ƽ<EFBFBD>ī<EFBFBD><C4AB>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
|
||
#if defined( PRE_PARTY_DB )
|
||
if ((int)(m_VecMember.size()+m_BreakIntoUserList.size()) >= GetPartyMemberMax())
|
||
return NULL; //<2F><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƽ<EFBFBD>ī<EFBFBD><C4AB>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
#endif // #if defined( PRE_PARTY_DB )
|
||
if ( (BreakIntoType==BreakInto::Type::WorldZoneParty) && IsInvitingUser(pwszChracterName) == false)
|
||
return NULL; //<2F>ʴ<EFBFBD><CAB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>~
|
||
|
||
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> Ȯ<><C8AE>
|
||
if (CDnWorld::GetInstance(this).GetMapType() != GlobalEnum::eMapTypeEnum::MAP_WORLDMAP)
|
||
return NULL;
|
||
}
|
||
|
||
if( bIsFarmRoom() )
|
||
pSession = new CDNFarmUserSession( nSessionID, m_pGameServer, this );
|
||
else
|
||
pSession = new IBoostPoolDNBreakIntoUserSession( nSessionID, m_pGameServer, this );
|
||
if( pSession )
|
||
{
|
||
pSession->SetDBConInfo( m_pDBConnection, m_cDBThreadID );
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
pSession->PreInitializeUser( wszAccountName, nAccountDBID, nSessionID, biCharacterDBID, iTeam, nWorldID, nVillageID, false, bAdult, cPCBangGrade, cSelectedLanguage );
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
pSession->PreInitializeUser( wszAccountName, nAccountDBID, nSessionID, biCharacterDBID, iTeam, nWorldID, nVillageID, false, bAdult, cPCBangGrade );
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
}
|
||
else
|
||
return pSession;
|
||
|
||
m_BreakIntoUserList.push_back( pSession );
|
||
m_UserList.push_back(pSession);
|
||
}
|
||
else
|
||
g_Log.Log(LogType::_ERROR, nWorldID, nAccountDBID, biCharacterDBID, nSessionID, _T("Connect|GameStart Flow err [state:addmember]\n"));
|
||
|
||
return pSession;
|
||
}
|
||
|
||
void CDNGameRoom::OnSendPartyMemberInfo( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( !pBreakIntoSession )
|
||
return;
|
||
|
||
SCROOM_SYNC_MEMBERINFO TxPacket;
|
||
memset( &TxPacket, 0, sizeof(TxPacket) );
|
||
|
||
TxPacket.bIsStart = true;
|
||
TxPacket.bIsBreakInto = true;
|
||
|
||
UINT uiSendCount = 0;
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
m_VecMember[i].pSession->GetPartyMemberInfo( TxPacket.Member[i-uiSendCount] );
|
||
++TxPacket.nCount;
|
||
|
||
// Page<67>ϼ<EFBFBD>
|
||
if( TxPacket.nCount%_countof(TxPacket.Member) == 0 )
|
||
{
|
||
pBreakIntoSession->AddSendData( SC_ROOM, eRoom::SC_SYNC_MEMBERINFO, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
|
||
|
||
uiSendCount += _countof(TxPacket.Member);
|
||
TxPacket.nCount = 0;
|
||
TxPacket.bIsStart = false;
|
||
}
|
||
}
|
||
|
||
if( TxPacket.nCount > 0 )
|
||
{
|
||
int iSize = sizeof(TxPacket)-sizeof(TxPacket.Member)+TxPacket.nCount*sizeof(TxPacket.Member[0]);
|
||
|
||
pBreakIntoSession->AddSendData( SC_ROOM, eRoom::SC_SYNC_MEMBERINFO, reinterpret_cast<char*>(&TxPacket), iSize );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::OnSetLoad2SyncState( const int iCurTick )
|
||
{
|
||
SendConnectedResult();
|
||
|
||
#if defined(_HSHIELD)
|
||
SendMakeReq(); // CRC <20><>û
|
||
#endif //#elif defined(_GPK)
|
||
|
||
m_GameState = _GAME_STATE_LOAD2SYNC; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̵<EFBFBD><CCB5>մϴ<D5B4>.
|
||
m_iNextGameState = iCurTick + WAIT_FOR_LOAD_TIME_LIMIT;
|
||
}
|
||
|
||
// On <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>.
|
||
void CDNGameRoom::SetSync2SyncStateTemplateMethod( const int iCurTick, CDNUserSession* pBreakIntoSession/*=NULL*/)
|
||
{
|
||
InitRoomState( pBreakIntoSession );
|
||
OnSendPartyMemberInfo( pBreakIntoSession );
|
||
OnSendTeamData( pBreakIntoSession ); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||
SendEquipData( pBreakIntoSession );
|
||
SendSkillData( pBreakIntoSession );
|
||
SendEtcData( pBreakIntoSession );
|
||
SendSecondAuthInfo( pBreakIntoSession );
|
||
SendMaxLevelCharacterCount( pBreakIntoSession );
|
||
SendHPSP( pBreakIntoSession );
|
||
SendBattleMode( pBreakIntoSession );
|
||
#if !defined( PRE_FIX_BREAKINTO_BLOW_SYNC )
|
||
SendAddStateEffect( pBreakIntoSession );
|
||
#endif // #if !defined( PRE_FIX_BREAKINTO_BLOW_SYNC )
|
||
SendGuildData( pBreakIntoSession );
|
||
SendMasterSystemSimpleInfo( pBreakIntoSession );
|
||
SendMasterSystemCountInfo( pBreakIntoSession );
|
||
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
||
SendReputationList( pBreakIntoSession );
|
||
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
||
#if defined (PRE_ADD_BESTFRIEND)
|
||
SendBestFriendData( pBreakIntoSession );
|
||
#endif
|
||
#if defined( PRE_PARTY_DB )
|
||
AddPartyDB( pBreakIntoSession );
|
||
#endif
|
||
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
|
||
SendPartyEffectSkillItemData(pBreakIntoSession);
|
||
#endif
|
||
#if defined( PRE_ADD_NEWCOMEBACK )
|
||
ApplyJoinMemberAppellation( pBreakIntoSession );
|
||
#endif
|
||
SendCompleteGameReady( pBreakIntoSession ); // <20>̰<EFBFBD> <20>ݵ<EFBFBD><DDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD>.
|
||
if( !pBreakIntoSession )
|
||
{
|
||
m_GameState = bIsFarmRoom() ? _GAME_STATE_FARM_READY2LOAD : _GAME_STATE_SYNC2SYNC;
|
||
|
||
m_iNextGameState = iCurTick + GOGO_SING_TO_PLAY_FOR_WAIT_TIME_LIMIT;
|
||
}
|
||
else
|
||
{
|
||
pBreakIntoSession->SendSeqLevel(m_cSeqLevel);
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SetSync2PvPModeStateTemplateMethod(const int iCurTick)
|
||
{
|
||
if (m_VecMember.empty()) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20>Ϸ<EFBFBD> <20>ٷ<EFBFBD> <20>Ѿ<EFBFBD><D1BE>´<EFBFBD>
|
||
m_GameState = _GAME_STATE_PVP_SYNC2GAMEMODE;
|
||
}
|
||
|
||
void CDNGameRoom::OnSetPlayState()
|
||
{
|
||
if (m_GameState == _GAME_STATE_DESTROYED) return;
|
||
|
||
m_pGameTask->SetSyncComplete( true );
|
||
m_pPartyTask->RequestPartyMember();
|
||
m_pPartyTask->RequestSyncStart();
|
||
|
||
//g_Log.LogA( _GREEN, "Member : %d\r\n", m_VecMember.size() );
|
||
|
||
__time64_t _tNow, _tOderedTime, _tCloseTime;
|
||
if (g_pCloseSystem)
|
||
{
|
||
_tNow = 0;
|
||
if (g_pCloseSystem->IsClosing(_tOderedTime, _tCloseTime))
|
||
time(&_tNow);
|
||
}
|
||
|
||
TNoticeInfo Notice;
|
||
memset(&Notice, 0, sizeof(Notice));
|
||
|
||
if (g_pNoticeSystem)
|
||
g_pNoticeSystem->GetNotice(0, 0, Notice);
|
||
|
||
for( DNVector(PartyStruct)::iterator itor=m_VecMember.begin() ; itor!=m_VecMember.end() ; ++itor )
|
||
{
|
||
if( (*itor).pSession->GetState() != SESSION_STATE_READY_TO_PLAY )
|
||
continue;
|
||
|
||
(*itor).pSession->SetLoadingComplete( true );
|
||
if( (*itor).pSession->IsConnected() )
|
||
{
|
||
(*itor).pSession->SetSessionState( SESSION_STATE_GAME_PLAY );
|
||
(*itor).pSession->SetSecurityUpdateFlag( true );
|
||
|
||
if (Notice.nCreateTime > 0)
|
||
(*itor).pSession->SendNotice(Notice.wszMsg, (int)wcsnlen(Notice.wszMsg, CHATLENMAX), Notice.TypeInfo.nSlideShowSec);
|
||
|
||
if (_tNow > 0)
|
||
(*itor).pSession->SendCloseService(_tNow, _tOderedTime, _tCloseTime);
|
||
#if defined(PRE_ADD_MISSION_COUPON)
|
||
if( (*itor).pSession->GetExpiredPetID() )
|
||
{
|
||
(*itor).pSession->GetEventSystem()->OnEvent( EventSystem::OnPetExpired, 1, EventSystem::ItemID, (*itor).pSession->GetExpiredPetID() );
|
||
(*itor).pSession->SetExpiredPetID(0);
|
||
}
|
||
#endif
|
||
#if defined(_WORK)
|
||
wstring wszString = FormatW(L"<EFBFBD><EFBFBD> <20>̵<EFBFBD> -> ID:[%d]\r\n", (*itor).pSession->GetStatusData()->nMapIndex);
|
||
(*itor).pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
||
#endif
|
||
}
|
||
}
|
||
#ifdef _GPK
|
||
SendGPKCode();
|
||
#endif //#ifdef _GPK
|
||
|
||
#ifdef _USE_PEERCONNECT
|
||
ConnectPeerRequest(); //Peer Connect Request
|
||
#endif
|
||
|
||
UpdateAppliedEventValue();
|
||
|
||
m_GameState = _GAME_STATE_PLAY;
|
||
m_iNextGameState = 0;
|
||
#if defined( STRESS_TEST )
|
||
m_iNextGameState = timeGetTime();
|
||
#endif
|
||
|
||
if( GetMasterRewardSystem() )
|
||
GetMasterRewardSystem()->RequestRefresh();
|
||
|
||
#if defined(PRE_ADD_ACTIVEMISSION)
|
||
if(GetIsFirstInitializeDungeon())
|
||
InitActiveMission();
|
||
#endif
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if(m_nCreateGMAccountDBID > 0)
|
||
{
|
||
int nPvPIndex = (GetWorldPvPRoomDBIndex() % 100) + WorldPvPMissionRoom::Common::GMWorldPvPRoomStartIndex;
|
||
g_pMasterConnectionManager->SendWorldPvPRoomGMCreateResult( GetWorldSetID(), ERROR_NONE, m_nCreateGMAccountDBID, &m_tPvPRoomDBData, nPvPIndex );
|
||
}
|
||
#endif
|
||
|
||
// <20><>Ŷ<EFBFBD><C5B6> <20>Ƶξ<C6B5><CEBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GenerateMonster<65><72> SC_Slave_OF <20><> <20><><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> , SC_SLAVE_OF <20><> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B6A7><EFBFBD><EFBFBD> <20><><EFBFBD>Ⱑ Ʋ<><C6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>
|
||
// <20><EFBFBD><D7B7><EFBFBD> <20>ùٸ<C3B9><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
||
for( DWORD i=0; i<GetUserCount(); i++ )
|
||
{
|
||
CDNGameRoom::PartyStruct* pPartyMember = GetPartyData( i );
|
||
CDnPlayerActor* pPlayerActor = pPartyMember->pSession->GetPlayerActor();
|
||
if( pPlayerActor )
|
||
pPlayerActor->OnInitializeNextStageFinished();
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::OnDie( DnActorHandle hActor, DnActorHandle hHitter )
|
||
{
|
||
if (!hActor || !hActor->IsPlayerActor())
|
||
return;
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ. (<28>̽<EFBFBD><CCBD><EFBFBD>ȣ #2422)
|
||
if( hActor )
|
||
hActor->ResetSkillCoolTime();
|
||
|
||
bool bCallMissionEvent = false;
|
||
|
||
// <20>̼<EFBFBD>ó<EFBFBD><C3B3>
|
||
if( hHitter && hHitter->IsMonsterActor() )
|
||
{
|
||
CDnMonsterActor* pMonster = (CDnMonsterActor *)hHitter.GetPointer();
|
||
|
||
if( hActor )
|
||
{
|
||
CDNUserSession* pSession = GetUserSession( hActor->GetSessionID() );
|
||
if( pSession )
|
||
{
|
||
pSession->GetEventSystem()->OnEvent( EventSystem::OnDie, 1, EventSystem::MonsterID, pMonster->GetMonsterClassID() );
|
||
bCallMissionEvent = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
if( bCallMissionEvent == false && hActor->IsPlayerActor() )
|
||
{
|
||
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>(hActor.GetPointer());
|
||
if( pPlayerActor->GetUserSession() )
|
||
pPlayerActor->GetUserSession()->GetEventSystem()->OnEvent( EventSystem::OnDie );
|
||
}
|
||
|
||
//rlkt farm pvp!
|
||
FarmPVP::GetInstance().OnDie(hActor,hHitter);
|
||
|
||
}
|
||
|
||
void CDNGameRoom::OnSuccessBreakInto( CDNUserSession* pGameSession )
|
||
{
|
||
if( !pGameSession )
|
||
return;
|
||
|
||
DnActorHandle hActor = pGameSession->GetActorHandle();
|
||
if( !hActor )
|
||
return;
|
||
|
||
if( pGameSession->bIsGMTrace() )
|
||
{
|
||
hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_071, -1, NULL, true ); // <20>ൿ <20>Ұ<EFBFBD>
|
||
}
|
||
|
||
GetWorld()->OnTriggerEventCallback( "CPvPGameMode::OnSuccessBreakInto", 0, 0 );
|
||
}
|
||
|
||
void CDNGameRoom::OnSuccessBreakInto( std::list<CDNUserSession*>::iterator& itor )
|
||
{
|
||
itor = m_BreakIntoUserList.erase( itor );
|
||
}
|
||
|
||
void CDNGameRoom::_BreakIntoProcess()
|
||
{
|
||
if( m_BreakIntoUserList.empty() )
|
||
return;
|
||
|
||
for( std::list<CDNUserSession*>::iterator itor=m_BreakIntoUserList.begin() ; itor!=m_BreakIntoUserList.end() ; )
|
||
{
|
||
if( (*itor)->BreakIntoProcess() )
|
||
{
|
||
OnSuccessBreakInto( itor );
|
||
}
|
||
else
|
||
++itor;
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::InitEvent()
|
||
{
|
||
m_EventList.clear();
|
||
if( g_pEvent )
|
||
g_pEvent->GetEvent(m_iWorldID, m_iMapIdx, &m_EventList);
|
||
}
|
||
|
||
void CDNGameRoom::OnGameStatePlay(ULONG iCurTick)
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>
|
||
UINT uiTick = timeGetTime();
|
||
PROFILE_TIME_TEST( _BreakIntoProcess() );
|
||
if( timeGetTime()-uiTick >= 80 )
|
||
{
|
||
if( GetGameServer()->bIsFrameAlert() )
|
||
{
|
||
g_Log.Log(LogType::_GAMESERVERDELAY, L"[%d] OnGameStatePlay::_BreakIntoProcess() Delay RoomID:%d MapIndex=%d Delay=%d UserCount=%d\n", g_Config.nManagedID, GetRoomID(), m_iMapIdx, timeGetTime()-uiTick, m_BreakIntoUserList.size() );
|
||
if (g_pServiceConnection)
|
||
{
|
||
WCHAR wszBuf[GAMEDELAYSIZE] = {0,};
|
||
wsprintf( wszBuf, L"[%d] OnGameStatePlay::_BreakIntoProcess() Delay RoomID:%d MapIndex=%d Delay=%d UserCount=%d", g_Config.nManagedID, GetRoomID(), m_iMapIdx, timeGetTime()-uiTick, m_BreakIntoUserList.size() );
|
||
g_pServiceConnection->SendGameDelayedReport(wszBuf);
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20><><EFBFBD>´<EFBFBD>
|
||
for( std::list<CDNUserSession*>::iterator itor=m_BreakIntoUserList.begin() ; itor!=m_BreakIntoUserList.end() ; ++itor )
|
||
{
|
||
CDNUserSession* pSession = (*itor);
|
||
if( pSession )
|
||
{
|
||
g_Log.Log(LogType::_GAMESERVERDELAY, L"[%d] OnGameStatePlay::_BreakIntoProcess() Delay RoomID:%d MapIndex=%d CharName=%s JobID=%d UserState=%d\n", g_Config.nManagedID, GetRoomID(), m_iMapIdx, pSession->GetCharacterName(), (int)pSession->GetUserJob(), pSession->GetState() );
|
||
if (g_pServiceConnection)
|
||
{
|
||
WCHAR wszBuf[GAMEDELAYSIZE] = {0,};
|
||
wsprintf( wszBuf, L"[%d] OnGameStatePlay::_BreakIntoProcess() Delay RoomID:%d MapIndex=%d CharName=%s JobID=%d UserState=%d", g_Config.nManagedID, GetRoomID(), m_iMapIdx, pSession->GetCharacterName(), (int)pSession->GetUserJob(), pSession->GetState());
|
||
g_pServiceConnection->SendGameDelayedReport(wszBuf);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// TaskMng <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>
|
||
if( m_pTaskMng )
|
||
{
|
||
bool bResult;
|
||
PROFILE_TIME_TEST_BLOCK_START( "m_pTaskMng->Excute()" );
|
||
bResult = m_pTaskMng->Excute();
|
||
PROFILE_TIME_TEST_BLOCK_END();
|
||
if( !bResult )
|
||
OutputDebug( "Finalize Task\n" );
|
||
}
|
||
if( !m_vChangeMapQueue.empty() )
|
||
{
|
||
int iMapIndex = m_vChangeMapQueue.begin()->first;
|
||
int iGateNo = m_vChangeMapQueue.begin()->second;
|
||
m_vChangeMapQueue.clear();
|
||
m_pGameTask->RequestChangeMap( iMapIndex, static_cast<char>(iGateNo) );
|
||
}
|
||
FarmUpdate();
|
||
}
|
||
|
||
#ifdef _USE_VOICECHAT
|
||
void CDNGameRoom::OnInitVoice()
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->IsConnected())
|
||
m_VecMember[i].pSession->MakeMute();
|
||
}
|
||
}
|
||
#endif
|
||
|
||
void CDNGameRoom::OnDelPartyMember( UINT iDelMemberSessionID, char cKickKind )
|
||
{
|
||
// <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿣 REQINFO_TYPE_SINGLE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OnDelPartyMember() ȣ<><C8A3><EFBFBD>ȴ<EFBFBD>.
|
||
// SwapLeader <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǹǷ<C7B9> <20>Ʒ<EFBFBD> <20>ּ<EFBFBD>ó<EFBFBD><C3B3> <20><>. by <20><><EFBFBD><EFBFBD>
|
||
//if (m_cReqGameIDType == REQINFO_TYPE_SINGLE) return; //<2F>̱<EFBFBD><CCB1≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ<EFBFBD><C8B5><EFBFBD>.
|
||
|
||
UINT nNewLeaderSessionID = 0;
|
||
if (m_cReqGameIDType == REQINFO_TYPE_PARTY) //<2F><>Ƽ<EFBFBD>ΰ<EFBFBD><CEB0>쿡<EFBFBD><ECBFA1> <20><><EFBFBD>ο<CEBF><EEB8AE><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD>
|
||
{
|
||
bool bRet = SwapLeader( iDelMemberSessionID, nNewLeaderSessionID );
|
||
if (bRet == false) return; //<2F>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Դϴ<D4B4>.
|
||
}
|
||
|
||
if( m_pTaskMng )
|
||
{
|
||
CDnPartyTask* pPartyTask = (CDnPartyTask*)(m_pTaskMng->GetTask("PartyTask"));
|
||
if( pPartyTask )
|
||
pPartyTask->OutPartyMember( iDelMemberSessionID, nNewLeaderSessionID, cKickKind );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::OnRequestSyncStartMsg( CDNUserSession* pGameSession )
|
||
{
|
||
SendGameSyncStart( pGameSession );
|
||
if( pGameSession && pGameSession->GetTimeEventSystem() )
|
||
pGameSession->GetTimeEventSystem()->RequestSyncTimeEvent();
|
||
}
|
||
|
||
|
||
#if defined( STRESS_TEST )
|
||
|
||
void CDNGameRoom::OrgProcess()
|
||
{
|
||
#ifdef _FINAL_BUILD
|
||
__try {
|
||
#endif
|
||
|
||
//<2F><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>! <20><><EFBFBD>ӷ<EFBFBD><D3B7>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> ȣ<><C8A3><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD>!
|
||
unsigned long iCurTick = GetGameTick();
|
||
|
||
UserUpdate( iCurTick );
|
||
CheckRemovedMember();
|
||
CheckRudpDisconnectedMember();
|
||
|
||
switch (m_GameState)
|
||
{
|
||
case _GAME_STATE_READY2CONNECT:
|
||
{
|
||
int iConnectedCnt = 0;
|
||
|
||
/*PartyStruct * pStruct = &m_VecMember[100];
|
||
TUserData * pData = pStruct->pSession->GetUserData();
|
||
pData->Attribute.nExp = 1000;*/
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
if (m_VecMember[i].pSession->IsConnected())
|
||
iConnectedCnt++;
|
||
|
||
if (m_iPartMemberCnt == iConnectedCnt)
|
||
{
|
||
m_GameState = _GAME_STATE_CONNECT2LOAD; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̵<EFBFBD><CCB5>մϴ<D5B4>.
|
||
m_iNextGameState = 0;
|
||
break;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iConnectedCnt == 0 && bIsWorldCombineParty() == false && bIsWorldPvPRoom() == false )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iConnectedCnt == 0 && bIsWorldCombineParty() == false )
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if (iConnectedCnt == 0)
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
{
|
||
if (iCurTick > (GetPartyIndex() <= 0 ? RUDP_CONNECT_TIME_LIMIT_FOR_SINGLE : RUDP_CONNECT_TIME_LIMIT_FOR_PARTY))
|
||
{
|
||
g_Log.Log(LogType::_NORMAL, L"Destroy|READY2CONNECT\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (m_iNextGameState == 0) //<2F>Ѹ<EFBFBD><D1B8>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD>. <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD>.
|
||
m_iNextGameState = iCurTick + WAIT_FOR_ANOTHER_USER_TIME_LIMIT;
|
||
|
||
if (iConnectedCnt != 0 && iCurTick > m_iNextGameState)
|
||
{
|
||
m_GameState = _GAME_STATE_CONNECT2LOAD; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̵<EFBFBD><CCB5>մϴ<D5B4>.
|
||
m_iNextGameState = 0;
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_CONNECT2LOAD:
|
||
{
|
||
if (m_iNextGameState == 0)
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->IsConnected() == false)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Connection Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection( L"" ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
|
||
CheckRemovedMember();
|
||
OnInitGameRoomUser();
|
||
m_iNextGameState = iCurTick + WAIT_FOR_LOAD_TIME_LIMIT;
|
||
}
|
||
|
||
int iLoadedUser = 0;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
if (m_VecMember[i].pSession->GetState() == SESSION_STATE_LOADED)
|
||
iLoadedUser++;
|
||
|
||
if (m_iPartMemberCnt == iLoadedUser)
|
||
{
|
||
OnSetLoad2SyncState( iCurTick );
|
||
break;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iLoadedUser == 0 && bIsWorldCombineParty() == false && bIsWorldPvPRoom() == false )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iLoadedUser == 0 && bIsWorldCombineParty() == false )
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
#else
|
||
if (iLoadedUser == 0)
|
||
#endif
|
||
{
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|CONNECT2LOAD\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (iLoadedUser != 0 && iCurTick > m_iNextGameState)
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->GetState() != SESSION_STATE_LOADED)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Load Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection( L"" ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
|
||
OnSetLoad2SyncState( iCurTick );
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_LOAD2SYNC:
|
||
{
|
||
int iReadyUserCnt = 0;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
if (m_VecMember[i].pSession->GetState() == SESSION_STATE_READY_TO_SYNC)
|
||
iReadyUserCnt++;
|
||
|
||
if (m_iPartMemberCnt == iReadyUserCnt)
|
||
{
|
||
SetSync2SyncStateTemplateMethod( iCurTick );
|
||
break;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iReadyUserCnt == 0 && bIsWorldCombineParty() == false && bIsWorldPvPRoom() == false )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iReadyUserCnt == 0 && bIsWorldCombineParty() == false )
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
#else
|
||
if (iReadyUserCnt == 0)
|
||
#endif
|
||
{
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|LOAD2SYNC\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (iReadyUserCnt != 0 && iCurTick > m_iNextGameState)
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->GetState() != SESSION_STATE_READY_TO_SYNC)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Load Sync Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection( L"" ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
|
||
//<2F><> Ÿ<>ֿ̹<CCB9> <20>ε徲<CEB5><E5BEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DFBB><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> üŷ<C3BC>ؼ<EFBFBD> <20><>¥<EFBFBD><C2A5> <20>ڸ<EFBFBD><DAB8>ڿ<EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
CheckRemovedMember();
|
||
if (m_GameState != _GAME_STATE_DESTROYED) //Ȥ<>ó<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||
SetSync2SyncStateTemplateMethod( iCurTick );
|
||
else
|
||
_DANGER_POINT();
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_SYNC2SYNC:
|
||
{
|
||
if (g_pBackLoader->IsLoaded(m_iRoomID) == true)
|
||
{
|
||
if (g_pBackLoader->LoadConfirm(m_iRoomID) == false)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|DataLoad Failed CheckOut ResourceData roomID [%d]\n", m_iRoomID);
|
||
DestroyGameRoom();
|
||
break;
|
||
}
|
||
|
||
SyncProp( NULL );
|
||
|
||
m_pWorld->EnableTriggerEventCallback(true);
|
||
m_pWorld->OnTriggerEventCallback( "CDnGameTask::PostInitializeStage", 0, 0.f, false );
|
||
m_pWorld->EnableTriggerEventCallback(false);
|
||
|
||
m_GameState = _GAME_STATE_SYNC2PLAY;
|
||
break;
|
||
}
|
||
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|Delay Load SYNC2SYNC\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
m_iNextGameState = 0;
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_SYNC2PLAY:
|
||
{
|
||
int iConnectedCnt = 0;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->IsConnected() && m_VecMember[i].pSession->GetState() == SESSION_STATE_SYNC_READY_2_DELAY)
|
||
{
|
||
m_VecMember[i].pSession->FlushStoredPacket();
|
||
m_VecMember[i].pSession->FlushPacketQueue();
|
||
for( UINT i2=0 ; i2<m_VecMember.size() ; ++i2 )
|
||
SendGameSyncWait( m_VecMember[i2].pSession, m_VecMember[i2].pSession->GetSessionID() );
|
||
m_VecMember[i].pSession->SetSessionState(SESSION_STATE_READY_TO_PLAY);
|
||
}
|
||
|
||
if (m_VecMember[i].pSession->IsConnected() && m_VecMember[i].pSession->GetState() == SESSION_STATE_READY_TO_PLAY)
|
||
iConnectedCnt++;
|
||
}
|
||
|
||
if (m_iPartMemberCnt == iConnectedCnt)
|
||
{
|
||
OnSetPlayState();
|
||
break;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iConnectedCnt == 0 && bIsWorldCombineParty() == false && bIsWorldPvPRoom() == false )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iConnectedCnt == 0 && bIsWorldCombineParty() == false )
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
#else
|
||
if (iConnectedCnt == 0)
|
||
#endif
|
||
{
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|SYNC2PLAY\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->GetState() != SESSION_STATE_READY_TO_PLAY)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Sync Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection( L"" ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
|
||
CheckRemovedMember();
|
||
OnSetPlayState();
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_CANCEL_LOADING:
|
||
{
|
||
if (g_pBackLoader->LoadCancel(m_iRoomID))
|
||
m_GameState = _GAME_STATE_DESTROYED;
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_PLAY:
|
||
{
|
||
OnGameStatePlay(iCurTick);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/*
|
||
Windows SEH <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ܷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD>
|
||
Enable C++ Exceptions <20><EFBFBD><D7B8><EFBFBD> /EHa <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
|
||
*/
|
||
#ifdef _FINAL_BUILD
|
||
} // __try {
|
||
__except(CExceptionReport::GetInstancePtr()->Proc(GetExceptionInformation(), MiniDumpNormal)) {
|
||
{
|
||
// <20><> process <20><> <20><><EFBFBD>ܰ<EFBFBD> <20><EFBFBD> <20>ϸ<EFBFBD> <20><><EFBFBD>ӷ븸 <20>ݵ<EFBFBD><DDB5><EFBFBD> ó<><C3B3> <20>Ѵ<EFBFBD>.
|
||
g_Log.Log(LogType::_ROOMCRASH, L"[%d] Destroy|Process Crash RoomID=%d RoomState=%d\n", g_Config.nManagedID, m_iRoomID, m_GameState );
|
||
if (g_pBackLoader)
|
||
{
|
||
//for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
// m_VecMember[i].pSession->SetSessionState(SESSION_STATE_CRASH);
|
||
DestroyGameRoom();
|
||
}
|
||
|
||
//<2F><><EFBFBD>ܰ<EFBFBD> <20><EFBFBD><DFBB>ϸ<EFBFBD> SM<53><4D><EFBFBD><EFBFBD> <20><><EFBFBD>ܹ<DCB9><DFBB><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
|
||
#if !defined (_TH)
|
||
if (g_pServiceConnection)
|
||
g_pServiceConnection->SendDetectException(_EXCEPTIONTYPE_ROOMCRASH);
|
||
#endif // #if !defined (_TH)
|
||
}
|
||
#endif
|
||
}
|
||
|
||
#endif
|
||
|
||
void CDNGameRoom::DestroyGameRoom(bool bForce/* = false*/)
|
||
{
|
||
if (g_pBackLoader->LoadCancel(m_iRoomID) == false)
|
||
m_GameState = _GAME_STATE_CANCEL_LOADING;
|
||
else
|
||
{
|
||
if (bForce == false) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> üũ<C3BC>غ<EFBFBD><D8BA><EFBFBD>
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
||
//<2F><>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־ <20><><EFBFBD>δ<EFBFBD>
|
||
if( IsRoomCrash() == false && bIsExistBreakIntoUser() )
|
||
return;
|
||
}
|
||
|
||
m_GameState = _GAME_STATE_DESTROYED;
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::FinalizeProcess()
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
#ifdef _FINAL_BUILD
|
||
__try
|
||
{
|
||
#endif // #ifdef _FINAL_BUILD
|
||
|
||
m_VecMember[i].pSession->FinalUser();
|
||
GetGameServer()->RemoveConnection(GetRoomID(), m_VecMember[i].pSession->GetNetID(), m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID());
|
||
|
||
m_VecMember[i].ReleaseEquipInventory();
|
||
|
||
#ifdef _FINAL_BUILD
|
||
} // __try {
|
||
__except(CExceptionReport::GetInstancePtr()->Proc(GetExceptionInformation(), MiniDumpNormal))
|
||
{
|
||
m_bRoomCrash = true;
|
||
m_VecMember[i].pSession->SetSessionState(SESSION_STATE_DISCONNECTED);
|
||
g_Log.Log( LogType::_ROOMFINALIZECRASH, L"[%d] FinalizeProcess Crash RoomID=%d\n", g_Config.nManagedID, m_iRoomID );
|
||
}
|
||
#endif // #ifdef _FINAL_BUILD
|
||
}
|
||
|
||
m_DeleteList.clear();
|
||
m_VecMember.clear();
|
||
#if defined( PRE_FIX_49129 )
|
||
m_MapFirstPartyMember.clear();
|
||
#endif
|
||
}
|
||
|
||
void CDNGameRoom::_DeleteSession()
|
||
{
|
||
for( UINT i=0 ; i<m_vDeleteSession.size() ; ++i )
|
||
{
|
||
SAFE_DELETE( m_vDeleteSession[i] );
|
||
}
|
||
m_vDeleteSession.clear();
|
||
}
|
||
|
||
void CDNGameRoom::Process()
|
||
{
|
||
//#ifdef _FINAL_BUILD
|
||
__try {
|
||
//#endif
|
||
|
||
#if defined( STRESS_TEST )
|
||
if( m_cReqGameIDType == REQINFO_TYPE_PARTY )
|
||
return OrgProcess();
|
||
#endif
|
||
|
||
//<2F><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>! <20><><EFBFBD>ӷ<EFBFBD><D3B7>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> ȣ<><C8A3><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD>!
|
||
unsigned long iCurTick = GetGameTick();
|
||
unsigned long iCurTick2 = timeGetTime();
|
||
|
||
_DeleteSession();
|
||
UserUpdate( iCurTick2 );
|
||
CheckRemovedMember();
|
||
CheckRudpDisconnectedMember();
|
||
#ifdef _USE_VOICECHAT
|
||
TalkingUpdate(iCurTick2);
|
||
#endif
|
||
if (bIsGuildWarSystem() && m_VecMember.empty())
|
||
{
|
||
if (GetPvPGameMode() && GetPvPGameMode()->bIsFinishFlag())
|
||
DestroyGameRoom();
|
||
}
|
||
|
||
if (m_nEventRoomIndex > 0 &&
|
||
(iCurTick > 1000 * 60 * 60) && // 1<>ð<EFBFBD> <20>ʰ<EFBFBD><CAB0><EFBFBD>
|
||
!m_bCheckTick)
|
||
{
|
||
m_bCheckTick = true;
|
||
g_Log.Log(LogType::_PVPROOM, L"PVP OverTime [Index:%d][Room:%d][Event:%d][User:%d][Break:%d][Vec:%d][MID:%d][State:%d] \r\n",
|
||
GetPvPIndex(), GetRoomID(), m_nEventRoomIndex, m_UserList.size(), m_BreakIntoUserList.size(), m_VecMember.size(), g_Config.nManagedID, m_GameState);
|
||
|
||
for( m_ItorSession=m_BreakIntoUserList.begin() ; m_ItorSession!=m_BreakIntoUserList.end() ; ++m_ItorSession )
|
||
{
|
||
CDNUserSession* pSession = (*m_ItorSession);
|
||
if (pSession)
|
||
g_Log.Log(LogType::_PVPROOM, L"PVP OverTime MemberInfo [CHRID:%d][State:%d]\r\n", pSession->GetCharacterDBID(), pSession->GetState());
|
||
}
|
||
|
||
m_GameState = _GAME_STATE_DESTROYED; // <20><><EFBFBD>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
||
}
|
||
|
||
switch (m_GameState)
|
||
{
|
||
case _GAME_STATE_READY2CONNECT:
|
||
{
|
||
int iConnectedCnt = 0;
|
||
|
||
/*PartyStruct * pStruct = &m_VecMember[100];
|
||
TUserData * pData = pStruct->pSession->GetUserData();
|
||
pData->Attribute.nExp = 1000;*/
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
if (m_VecMember[i].pSession->IsConnected())
|
||
iConnectedCnt++;
|
||
|
||
#if defined( STRESS_TEST )
|
||
if(true)
|
||
#else
|
||
if (m_iPartMemberCnt == iConnectedCnt)
|
||
#endif
|
||
{
|
||
m_GameState = _GAME_STATE_CONNECT2CHECKAUTH; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̵<EFBFBD><CCB5>մϴ<D5B4>.
|
||
m_iNextGameState = timeGetTime();
|
||
#ifdef _USE_VOICECHAT
|
||
OnInitVoice();
|
||
#endif
|
||
break;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iConnectedCnt == 0 && bIsWorldCombineParty() == false && bIsWorldPvPRoom() == false )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iConnectedCnt == 0 && bIsWorldCombineParty() == false )
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if (iConnectedCnt == 0)
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
{
|
||
if (iCurTick > (GetPartyIndex() <= 0 ? RUDP_CONNECT_TIME_LIMIT_FOR_SINGLE : RUDP_CONNECT_TIME_LIMIT_FOR_PARTY))
|
||
{
|
||
g_Log.Log(LogType::_NORMAL, L"Destroy|READY2CONNECT\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (m_iNextGameState == 0) //<2F>Ѹ<EFBFBD><D1B8>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD>. <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD>.
|
||
m_iNextGameState = iCurTick + WAIT_FOR_ANOTHER_USER_TIME_LIMIT;
|
||
|
||
if (iConnectedCnt != 0 && iCurTick > m_iNextGameState)
|
||
{
|
||
m_GameState = _GAME_STATE_CONNECT2CHECKAUTH; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̵<EFBFBD><CCB5>մϴ<D5B4>.
|
||
m_iNextGameState = timeGetTime();
|
||
|
||
#ifdef _USE_VOICECHAT
|
||
OnInitVoice();
|
||
#endif
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD> <20>ݴϴ<DDB4>.
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->IsConnected() == false)
|
||
{
|
||
g_Log.Log(LogType::_GAMECONNECTLOG, m_VecMember[i].pSession, L"Connect|Connection Fail\n" );
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Connection Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection(L"_GAME_STATE_READY2CONNECT"); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_CONNECT2CHECKAUTH:
|
||
{
|
||
int iCertifiedCnt = 0;
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i ) {
|
||
if (false == m_VecMember[i].pSession->IsConnected()) {
|
||
continue;
|
||
}
|
||
if (true == m_VecMember[i].pSession->IsCertified()) {
|
||
++iCertifiedCnt;
|
||
}
|
||
}
|
||
|
||
#if defined( STRESS_TEST )
|
||
if( true ) {
|
||
#else
|
||
if (m_iPartMemberCnt == iCertifiedCnt) {
|
||
#endif
|
||
m_GameState = _GAME_STATE_CONNECT2LOAD; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̵<EFBFBD><CCB5>մϴ<D5B4>.
|
||
m_iNextGameState = 0;
|
||
break;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (0 == iCertifiedCnt && bIsWorldCombineParty() == false && bIsWorldPvPRoom() == false) {
|
||
#else // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (0 == iCertifiedCnt && bIsWorldCombineParty() == false ) {
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if (0 == iCertifiedCnt) {
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if (CHECKAUTHLIMITTERM < GetTickTerm(m_iNextGameState, iCurTick2)) {
|
||
g_Log.Log(LogType::_NORMAL, L"Destroy|CONNECT2CHECKAUTH\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (0 < iCertifiedCnt &&
|
||
CHECKAUTHLIMITTERM < GetTickTerm(m_iNextGameState, iCurTick2))
|
||
{
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20>ȵȳ༮<C8B3><E0BCAE> <20>߶<EFBFBD><DFB6>ִ<EFBFBD> ó<><C3B3> <20>߰<EFBFBD>
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->IsCertified() != true)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Certified Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection(L"_GAME_STATE_CONNECT2CHECKAUTH"); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߶<EFBFBD><DFB6>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
|
||
m_GameState = _GAME_STATE_CONNECT2LOAD; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̵<EFBFBD><CCB5>մϴ<D5B4>.
|
||
m_iNextGameState = 0;
|
||
}
|
||
break;
|
||
}
|
||
break;
|
||
|
||
case _GAME_STATE_CONNECT2LOAD:
|
||
{
|
||
if (m_iNextGameState == 0)
|
||
{
|
||
#if !defined( STRESS_TEST )
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->IsConnected() == false)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Connection Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection(L"_GAME_STATE_CONNECT2LOAD"); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
#endif
|
||
|
||
CheckRemovedMember();
|
||
OnInitGameRoomUser();
|
||
m_iNextGameState = iCurTick + WAIT_FOR_LOAD_TIME_LIMIT;
|
||
}
|
||
|
||
int iLoadedUser = 0;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
if (m_VecMember[i].pSession->GetState() == SESSION_STATE_LOADED)
|
||
iLoadedUser++;
|
||
|
||
#if defined( STRESS_TEST )
|
||
if( true )
|
||
#else
|
||
if (m_iPartMemberCnt == iLoadedUser)
|
||
#endif
|
||
{
|
||
OnSetLoad2SyncState( iCurTick );
|
||
break;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iLoadedUser == 0 && bIsWorldCombineParty() == false && bIsWorldPvPRoom() == false )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iLoadedUser == 0 && bIsWorldCombineParty() == false )
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if (iLoadedUser == 0)
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
{
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
g_Log.Log(LogType::_NORMAL, L"Destroy|CONNECT2LOAD\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (iLoadedUser != 0 && iCurTick > m_iNextGameState)
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->GetState() != SESSION_STATE_LOADED)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Load Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection(L"_GAME_STATE_CONNECT2LOAD"); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
|
||
OnSetLoad2SyncState( iCurTick );
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_LOAD2SYNC:
|
||
{
|
||
int iReadyUserCnt = 0;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
if (m_VecMember[i].pSession->GetState() == SESSION_STATE_READY_TO_SYNC)
|
||
iReadyUserCnt++;
|
||
|
||
#if defined( STRESS_TEST )
|
||
if( true )
|
||
#else
|
||
if (m_iPartMemberCnt == iReadyUserCnt)
|
||
#endif
|
||
{
|
||
SetSync2SyncStateTemplateMethod( iCurTick );
|
||
break;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iReadyUserCnt == 0 && bIsWorldCombineParty() == false && bIsWorldPvPRoom() == false)
|
||
#else // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iReadyUserCnt == 0 && bIsWorldCombineParty() == false )
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if (iReadyUserCnt == 0)
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
{
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
g_Log.Log(LogType::_NORMAL, L"Destroy|LOAD2SYNC\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (iReadyUserCnt != 0 && iCurTick > m_iNextGameState)
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->GetState() != SESSION_STATE_READY_TO_SYNC)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Load Sync Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection(L"_GAME_STATE_LOAD2SYNC"); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
|
||
//<2F><> Ÿ<>ֿ̹<CCB9> <20>ε徲<CEB5><E5BEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DFBB><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> üŷ<C3BC>ؼ<EFBFBD> <20><>¥<EFBFBD><C2A5> <20>ڸ<EFBFBD><DAB8>ڿ<EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
CheckRemovedMember();
|
||
if (m_GameState != _GAME_STATE_DESTROYED) //Ȥ<>ó<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||
SetSync2SyncStateTemplateMethod( iCurTick );
|
||
else
|
||
_DANGER_POINT();
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_SYNC2SYNC:
|
||
{
|
||
if (g_pBackLoader->IsLoaded(m_iRoomID) == true)
|
||
{
|
||
if (g_pBackLoader->LoadConfirm(m_iRoomID) == false)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, L"[%d] Destroy|DataLoad Failed CheckOut ResourceData roomID [%d]\n", g_Config.nManagedID, m_iRoomID);
|
||
DestroyGameRoom();
|
||
break;
|
||
}
|
||
|
||
// UpdateRoomCountInfo GameThread <20><> <20>ű<EFBFBD>.
|
||
if( m_pGameServer && m_pGameServer->GetServerManager() )
|
||
m_pGameServer->GetServerManager()->UpdateRoomCountInfo( GetRoomID(), m_iMapIdx );
|
||
|
||
SyncProp( NULL );
|
||
OnSync2Sync( NULL );
|
||
|
||
m_pWorld->EnableTriggerEventCallback(true);
|
||
m_pWorld->OnTriggerEventCallback( "CDnGameTask::PostInitializeStage", 0, 0.f, false );
|
||
m_pWorld->EnableTriggerEventCallback(false);
|
||
|
||
m_GameState = _GAME_STATE_SYNC2PLAY;
|
||
break;
|
||
}
|
||
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
g_Log.Log(LogType::_NORMAL, L"Destroy|Delay Load SYNC2SYNC\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
m_iNextGameState = 0;
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_SYNC2PLAY:
|
||
{
|
||
int iConnectedCnt = 0;
|
||
#if !defined( STRESS_TEST )
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->IsConnected() && m_VecMember[i].pSession->GetState() == SESSION_STATE_SYNC_READY_2_DELAY)
|
||
{
|
||
m_VecMember[i].pSession->FlushStoredPacket();
|
||
m_VecMember[i].pSession->FlushPacketQueue();
|
||
for( UINT i2=0 ; i2<m_VecMember.size() ; ++i2 )
|
||
SendGameSyncWait( m_VecMember[i2].pSession, m_VecMember[i].pSession->GetSessionID() );
|
||
m_VecMember[i].pSession->SetSessionState(SESSION_STATE_READY_TO_PLAY);
|
||
}
|
||
|
||
if (m_VecMember[i].pSession->IsConnected() && m_VecMember[i].pSession->GetState() == SESSION_STATE_READY_TO_PLAY)
|
||
iConnectedCnt++;
|
||
}
|
||
#endif
|
||
|
||
#if defined( STRESS_TEST )
|
||
if( true )
|
||
#else
|
||
if (m_iPartMemberCnt == iConnectedCnt)
|
||
#endif
|
||
{
|
||
OnSetPlayState();
|
||
break;
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iConnectedCnt == 0 && bIsWorldCombineParty() == false && bIsWorldPvPRoom() == false)
|
||
#else // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
if (iConnectedCnt == 0 && bIsWorldCombineParty() == false )
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PVP )
|
||
#else // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if (iConnectedCnt == 0)
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
{
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
g_Log.Log(LogType::_NORMAL, L"Destroy|SYNC2PLAY\n");
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20>ȴ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
DestroyGameRoom();
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if (m_VecMember[i].pSession->GetState() != SESSION_STATE_READY_TO_PLAY)
|
||
{
|
||
g_Log.Log(LogType::_ERROR, m_VecMember[i].pSession, L"Connect|Sync Fail AID[%d] SID[%d] CID[%I64d]\n", m_VecMember[i].pSession->GetAccountDBID(), m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetCharacterDBID());
|
||
m_VecMember[i].pSession->DetachConnection(L"_GAME_STATE_SYNC2PLAY"); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ©<><C2A9><EFBFBD>ݴϴ<DDB4>.
|
||
}
|
||
}
|
||
|
||
CheckRemovedMember();
|
||
OnSetPlayState();
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_FARM_READY2LOAD:
|
||
{
|
||
if (m_cReqGameIDType != REQINFO_TYPE_FARM)
|
||
{
|
||
_DANGER_POINT();
|
||
DestroyGameRoom();
|
||
break;
|
||
}
|
||
|
||
if (g_pBackLoader->IsLoaded(m_iRoomID) == true)
|
||
{
|
||
if (g_pBackLoader->LoadConfirm(m_iRoomID) == false)
|
||
{
|
||
g_Log.Log(LogType::_FARM, L"[%d] Destroy|DataLoad Failed CheckOut ResourceData roomID [%d]\n", g_Config.nManagedID, m_iRoomID);
|
||
DestroyGameRoom();
|
||
break;
|
||
}
|
||
|
||
QueryGetListField();
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_FARM_LOAD2PLAY:
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>츸 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if (iCurTick > m_iNextGameState)
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>쿡 <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
QueryGetListField();
|
||
}
|
||
}
|
||
break;
|
||
case _GAME_STATE_CANCEL_LOADING:
|
||
{
|
||
if (g_pBackLoader->LoadCancel(m_iRoomID))
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
||
if( bIsExistBreakIntoUser() )
|
||
break;
|
||
m_GameState = _GAME_STATE_DESTROYED;
|
||
}
|
||
break;
|
||
}
|
||
|
||
case _GAME_STATE_PLAY:
|
||
{
|
||
#if defined( PRE_TRIGGER_LOG )
|
||
if( m_bLog )
|
||
QueryPerformanceCounter(&m_liStartTime);
|
||
#endif // #if defined( PRE_TRIGGER_LOG )
|
||
|
||
OnGameStatePlay(iCurTick);
|
||
|
||
#if defined( PRE_TRIGGER_LOG )
|
||
if( m_bLog )
|
||
{
|
||
QueryPerformanceCounter(&m_liCurTime);
|
||
double dElapsed = (1000 * ( m_liCurTime.QuadPart - m_liStartTime.QuadPart ) / static_cast<double>( m_liFrequency.QuadPart ));
|
||
|
||
m_dProcessTime += dElapsed;
|
||
}
|
||
#endif // #if defined( PRE_TRIGGER_LOG )
|
||
|
||
#if defined( STRESS_TEST )
|
||
if( m_iRandomSeed > 0 )
|
||
{
|
||
if( timeGetTime()-m_iNextGameState >= static_cast<UINT>(m_iRandomSeed) )
|
||
{
|
||
if( m_VecMember[0].pSession )
|
||
m_VecMember[0].pSession->ChangeServerUserData();
|
||
DestroyGameRoom();
|
||
}
|
||
}
|
||
/*
|
||
else
|
||
{
|
||
if( timeGetTime()-m_iNextGameState >= 500 )
|
||
{
|
||
g_pDBConnectionManager->QueryLevelExp( m_VecMember[0].pSession->GetWorldSetID(), m_VecMember[0].pSession->GetCharacterDBID(), 1, 0 );
|
||
m_iNextGameState = timeGetTime();
|
||
}
|
||
}
|
||
*/
|
||
#endif
|
||
break;
|
||
}
|
||
}
|
||
|
||
#if defined(PRE_FIX_INITSTATEANDSYNC)
|
||
if(m_bInitStateAndSyncReserved)
|
||
InitStateAndSync();
|
||
#endif
|
||
|
||
/*
|
||
Windows SEH <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ܷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD>
|
||
Enable C++ Exceptions <20><EFBFBD><D7B8><EFBFBD> /EHa <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
|
||
*/
|
||
//#ifdef _FINAL_BUILD
|
||
} // __try {
|
||
__except(CExceptionReport::GetInstancePtr()->Proc(GetExceptionInformation(), MiniDumpNormal))
|
||
{
|
||
// <20><> process <20><> <20><><EFBFBD>ܰ<EFBFBD> <20><EFBFBD> <20>ϸ<EFBFBD> <20><><EFBFBD>ӷ븸 <20>ݵ<EFBFBD><DDB5><EFBFBD> ó<><C3B3> <20>Ѵ<EFBFBD>.
|
||
g_Log.Log(LogType::_ROOMCRASH, L"[%d] Destroy|Process Crash RoomID=%d RoomState=%d\n", g_Config.nManagedID, m_iRoomID, m_GameState );
|
||
|
||
if (g_pBackLoader)
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
// GameRoom <20><><EFBFBD><EFBFBD> <20><EFBFBD><DFBB><EFBFBD> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
m_VecMember[i].pSession->SetDecreaseFatigue(0);
|
||
//m_VecMember[i].pSession->SetSessionState(SESSION_STATE_CRASH);
|
||
}
|
||
m_bRoomCrash = true;
|
||
DestroyGameRoom();
|
||
}
|
||
|
||
//<2F><><EFBFBD>ܰ<EFBFBD> <20><EFBFBD><DFBB>ϸ<EFBFBD> SM<53><4D><EFBFBD><EFBFBD> <20><><EFBFBD>ܹ<DCB9><DFBB><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
|
||
#if !defined (_TH)
|
||
if (g_pServiceConnection)
|
||
g_pServiceConnection->SendDetectException(_EXCEPTIONTYPE_ROOMCRASH);
|
||
#endif
|
||
if (g_pMasterConnectionManager && bIsPvPRoom())
|
||
{
|
||
if (bIsPvPRoom() && bIsGuildWarSystem())
|
||
g_pMasterConnectionManager->SendPvPDetectCrash(GetWorldSetID(), GetRoomID(), GetPvPIndex());
|
||
}
|
||
}
|
||
//#endif
|
||
}
|
||
|
||
void CDNGameRoom::TcpProcess()
|
||
{
|
||
DNVector(PartyStruct)::iterator ii;
|
||
for (ii = m_VecMember.begin(); ii != m_VecMember.end(); ii++)
|
||
if ((*ii).pSession->GetTcpConnection() != NULL && (*ii).pSession->GetTcpConnection()->GetDelete() != true && (*ii).pSession->GetTcpConnection()->IsAttachedToSession() )
|
||
if ((*ii).pSession->GetTcpConnection()->FlushRecvData(0) == false)
|
||
RemoveMember((*ii).pSession, L"TcpProcess()");
|
||
}
|
||
|
||
void CDNGameRoom::InitRoomState( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( pBreakIntoSession )
|
||
return;
|
||
|
||
OutputDebug( "InitSession\n" );
|
||
|
||
// Task Initialize
|
||
if( m_pTaskMng ) m_pTaskMng->RemoveAllTask();
|
||
SAFE_DELETE( m_pTaskMng );
|
||
m_pTaskMng = new CTaskManager(this);
|
||
|
||
m_pWorld = new CDnWorld(this);
|
||
|
||
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||
m_pPartyTask = CDnTaskFactory::CreatePartyTask( m_GameTaskType, this );
|
||
m_pPartyTask->Initialize();
|
||
CTaskManager::GetInstance(this).AddTask( m_pPartyTask, "PartyTask", -1 );
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
m_pItemTask = new CDnItemTask( this );
|
||
m_pItemTask->Initialize();
|
||
CTaskManager::GetInstance(this).AddTask( m_pItemTask, "ItemTask", -1 );
|
||
// <20>κ<EFBFBD><CEBA>丮 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||
|
||
// <20><>ų <20>½<EFBFBD>ũ
|
||
m_pSkillTask = new CDnSkillTask( this );
|
||
m_pSkillTask->Initialize();
|
||
CTaskManager::GetInstance(this).AddTask( m_pSkillTask, "SkillTask", -1 );
|
||
|
||
// <20><> Ÿ<><C5B8><EFBFBD><EFBFBD>
|
||
m_pGameTask = CDnTaskFactory::CreateGameTask( m_GameTaskType, this );
|
||
m_pGameTask->Initialize();
|
||
CTaskManager::GetInstance(this).AddTask( m_pGameTask, "GameTask", -1 );
|
||
|
||
m_pGuildTask = new CDnGuildTask( this );
|
||
m_pGuildTask->Initialize();
|
||
CTaskManager::GetInstance(this).AddTask( m_pGuildTask, "GuildTask", -1 );
|
||
|
||
m_pChatTask = new CDnChatTask( this );
|
||
m_pChatTask->Initialize();
|
||
CTaskManager::GetInstance(this).AddTask( m_pChatTask, "ChatTask", -1 );
|
||
|
||
AddGameListener( m_pPartyTask );
|
||
AddGameListener( m_pItemTask );
|
||
AddGameListener( m_pGameTask );
|
||
AddGameListener( m_pSkillTask );
|
||
AddGameListener( m_pGuildTask );
|
||
AddGameListener( m_pChatTask );
|
||
|
||
// <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
|
||
|
||
if (g_pBackLoader != NULL)
|
||
{
|
||
InitEvent();
|
||
if (g_pBackLoader->PushToLoadProcess( this ) == false)
|
||
{
|
||
//<2F>̷<EFBFBD> <20>ȵ<EFBFBD><C8B5><EFBFBD>!<21><><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20>游 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|OnInitRoomState LoadError\n");
|
||
DestroyGameRoom();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|BackLoader Not Found\n");
|
||
DestroyGameRoom();
|
||
}
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if( !m_VecMember[i].pSession )
|
||
continue;
|
||
m_VecMember[i].pSession->SetLoadingComplete( false );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendSeqLevel()
|
||
{
|
||
m_cSeqLevel++; //<2F>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8>ԵǸ<D4B5> <20><><EFBFBD>̰<EFBFBD><CCB0><EFBFBD> <20><><EFBFBD>õǾ<C3B5><C7BE><EFBFBD><EFBFBD><EFBFBD>.(<28>ϴ<EFBFBD> <20><><EFBFBD>Ͱ<EFBFBD><CDB0><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.)
|
||
for( DWORD i=0; i<GetUserCount(); i++ )
|
||
GetUserData(i)->SendSeqLevel(m_cSeqLevel);
|
||
}
|
||
|
||
// GameRoom <20><> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>߿<EFBFBD> InitStateAndSync ȣ<><C8A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(ex:Ʈ<><C6AE><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD>) <20><EFBFBD><DFBB>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ذ<EFBFBD><D8B0>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
// ReserveInitStateAndSync <20><> <20>ξ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GameRoom <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>,ó<><C3B3> <20>ϴ<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
#if defined(PRE_FIX_INITSTATEANDSYNC)
|
||
void CDNGameRoom::ReserveInitStateAndSync(int iMapIdx, int iGateIdx, int iRandomSeed, TDUNGEONDIFFICULTY StageDifficulty, bool bDirectConnect, int iGateSelect)
|
||
{
|
||
m_bInitStateAndSyncReserved = true;
|
||
m_nReservedMapIdx = iMapIdx;
|
||
m_nReservedGateIdx = iGateIdx;
|
||
m_nReservedRandomSeed = iRandomSeed;
|
||
m_ReservedStageDifficulty = StageDifficulty;
|
||
m_bReservedDirectConnect = bDirectConnect;
|
||
m_bReservedGateSelect = iGateSelect;
|
||
}
|
||
|
||
void CDNGameRoom::ResetReservedStateAndSyncData()
|
||
{
|
||
m_bInitStateAndSyncReserved = false;
|
||
m_nReservedMapIdx = 0;
|
||
m_nReservedGateIdx = 0;
|
||
m_nReservedRandomSeed = 0;
|
||
m_ReservedStageDifficulty =TDUNGEONDIFFICULTY::Easy;
|
||
m_bReservedDirectConnect = false;
|
||
m_bReservedGateSelect = 0;
|
||
}
|
||
|
||
void CDNGameRoom::InitStateAndSync()
|
||
{
|
||
if (g_pBackLoader != NULL)
|
||
{
|
||
if (GetFarmIndex() > 0)
|
||
{
|
||
_DANGER_POINT();
|
||
return ;
|
||
}
|
||
|
||
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TMAP );
|
||
if( pSox && !pSox->IsExistItem( m_nReservedMapIdx ) ) {
|
||
DestroyGameRoom();
|
||
return;
|
||
}
|
||
|
||
InitEvent();
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
TEvent * pEvent = GetApplyEventType(WorldEvent::EVENT5);
|
||
#else
|
||
TEvent * pEvent = GetApplyEvent(_EVENT_1_DROPITEM);
|
||
#endif //#if defined(PRE_ADD_WORLD_EVENT)
|
||
|
||
for( DWORD i=0; i<GetUserCount(); i++ ) {
|
||
GetUserData(i)->SetMapIndex( m_nReservedMapIdx );
|
||
GetUserData(i)->SendStartStage( m_bReservedDirectConnect, m_nReservedMapIdx, m_nReservedGateIdx, m_nReservedRandomSeed, m_ReservedStageDifficulty, pEvent == NULL ? 0 : pEvent->nAtt1 );
|
||
GetUserData(i)->ChangeStageUserData();
|
||
GetUserData(i)->SetLoadingComplete(false);
|
||
|
||
//<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD>̵<EFBFBD><CCB5><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -2hogi
|
||
GetUserData(i)->SetSecurityUpdateFlag(false);
|
||
// GetUserData(i)->UpdateUserData();
|
||
}
|
||
|
||
m_iMapIdx = m_nReservedMapIdx;
|
||
m_iGateIdx = m_nReservedGateIdx;
|
||
m_iGateSelect = m_bReservedGateSelect;
|
||
m_StageDifficulty = m_ReservedStageDifficulty;
|
||
m_iRandomSeed = m_nReservedRandomSeed;
|
||
m_bDirectConnect = m_bReservedDirectConnect;
|
||
|
||
if (g_pBackLoader->PushToLoadProcess( this, true ) == false)
|
||
{
|
||
//<2F>̷<EFBFBD> <20>ȵ<EFBFBD><C8B5><EFBFBD>!<21><><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20>游 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|InitStateAndSync LoadError\n");
|
||
DestroyGameRoom();
|
||
}
|
||
else
|
||
{
|
||
m_GameState = _GAME_STATE_SYNC2SYNC;
|
||
m_iNextGameState = GetGameTick() + GOGO_SING_TO_PLAY_FOR_WAIT_TIME_LIMIT;
|
||
}
|
||
|
||
SendSeqLevel();
|
||
}
|
||
else
|
||
{
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|BackLoader Not Found\n");
|
||
DestroyGameRoom();
|
||
}
|
||
|
||
ResetReservedStateAndSyncData();
|
||
}
|
||
|
||
#else //#if defined(PRE_FIX_INITSTATEANDSYNC)
|
||
// <20><><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> iGateSelect<63><74><EFBFBD>Դϴ<D4B4>.
|
||
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, ġƮ <20><EFBFBD><D7B8><EFBFBD> Ʈ<><C6AE><EFBFBD>ŷ<EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>⺻<EFBFBD><E2BABB>(0)<29><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>մϴ<D5B4>.
|
||
void CDNGameRoom::InitStateAndSync(int iMapIdx, int iGateIdx, int iRandomSeed, TDUNGEONDIFFICULTY StageDifficulty, bool bDirectConnect, int iGateSelect)
|
||
{
|
||
if (g_pBackLoader != NULL)
|
||
{
|
||
if (GetFarmIndex() > 0)
|
||
{
|
||
_DANGER_POINT();
|
||
return ;
|
||
}
|
||
|
||
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TMAP );
|
||
if( pSox && !pSox->IsExistItem( iMapIdx ) ) {
|
||
DestroyGameRoom();
|
||
return;
|
||
}
|
||
|
||
InitEvent();
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
TEvent * pEvent = GetApplyEventType(WorldEvent::EVENT5);
|
||
#else
|
||
TEvent * pEvent = GetApplyEvent(_EVENT_1_DROPITEM);
|
||
#endif //#if defined(PRE_ADD_WORLD_EVENT)
|
||
|
||
for( DWORD i=0; i<GetUserCount(); i++ ) {
|
||
GetUserData(i)->SetMapIndex( iMapIdx );
|
||
GetUserData(i)->SendStartStage( bDirectConnect, iMapIdx, iGateIdx, iRandomSeed, StageDifficulty, pEvent == NULL ? 0 : pEvent->nAtt1 );
|
||
GetUserData(i)->ChangeStageUserData();
|
||
GetUserData(i)->SetLoadingComplete(false);
|
||
|
||
//<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD>̵<EFBFBD><CCB5><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -2hogi
|
||
GetUserData(i)->SetSecurityUpdateFlag(false);
|
||
// GetUserData(i)->UpdateUserData();
|
||
}
|
||
|
||
m_iMapIdx = iMapIdx;
|
||
m_iGateIdx = iGateIdx;
|
||
m_iGateSelect = iGateSelect;
|
||
m_StageDifficulty = StageDifficulty;
|
||
m_iRandomSeed = iRandomSeed;
|
||
m_bDirectConnect = bDirectConnect;
|
||
|
||
if (g_pBackLoader->PushToLoadProcess( this, true ) == false)
|
||
{
|
||
//<2F>̷<EFBFBD> <20>ȵ<EFBFBD><C8B5><EFBFBD>!<21><><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20>游 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|InitStateAndSync LoadError\n");
|
||
DestroyGameRoom();
|
||
}
|
||
else
|
||
{
|
||
m_GameState = _GAME_STATE_SYNC2SYNC;
|
||
m_iNextGameState = GetGameTick() + GOGO_SING_TO_PLAY_FOR_WAIT_TIME_LIMIT;
|
||
}
|
||
|
||
SendSeqLevel();
|
||
}
|
||
else
|
||
{
|
||
g_Log.Log(LogType::_ERROR, L"Destroy|BackLoader Not Found\n");
|
||
DestroyGameRoom();
|
||
}
|
||
}
|
||
#endif //#if defined(PRE_FIX_INITSTATEANDSYNC)
|
||
|
||
bool CDNGameRoom::LoadData(bool bContinue)
|
||
{//<2F>ܺο<DCBA><CEBF><EFBFBD> ȣ<><C8A3><EFBFBD>Ǹ<EFBFBD>, <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD> (<28><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>¦ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
bool bResult;
|
||
if (bContinue == false)
|
||
{
|
||
PROFILE_TICK_TEST_BLOCK_START( "LoadData" );
|
||
m_pItemTask->InitializePlayerItem();
|
||
bResult = m_pGameTask->InitializeStage( m_iMapIdx, m_iGateIdx, m_StageDifficulty, m_iRandomSeed, bContinue, m_bDirectConnect, m_iGateSelect );
|
||
if( !bResult )
|
||
{
|
||
g_Log.Log(LogType::_REMAINEDACTOR, _T("m_pGameTask->InitializeStage Failed\n"));
|
||
return false;
|
||
}
|
||
|
||
bResult = m_pGameTask->InitializePlayerActor();
|
||
if( !bResult )
|
||
{
|
||
g_Log.Log(LogType::_REMAINEDACTOR, _T("m_pGameTask->InitializePlayerActor Failed\n"));
|
||
return false;
|
||
}
|
||
bResult = m_pGameTask->PostInitializeStage( m_iRandomSeed );
|
||
if( !bResult )
|
||
{
|
||
g_Log.Log(LogType::_REMAINEDACTOR, _T("m_pGameTask->PostInitializeStage Failed\n"));
|
||
return false;
|
||
}
|
||
PROFILE_TICK_TEST_BLOCK_END();
|
||
}
|
||
else {
|
||
PROFILE_TICK_TEST_BLOCK_START( "LoadData" );
|
||
bResult = m_pGameTask->InitializeStage( m_iMapIdx, m_iGateIdx, m_StageDifficulty, m_iRandomSeed, bContinue, m_bDirectConnect, m_iGateSelect );
|
||
if( !bResult ){
|
||
g_Log.Log(LogType::_REMAINEDACTOR, _T("m_pGameTask->InitializeStage(bContinue==true) Failed\n"));
|
||
return false;
|
||
}
|
||
PROFILE_TICK_TEST_BLOCK_END();
|
||
}
|
||
return true;
|
||
}
|
||
|
||
CDNUserSession * CDNGameRoom::CreateGameSession(WCHAR * wszAccountName, UINT nAccountDBID, UINT nSessionID, INT64 biCharacterDBID, int iTeam, int nWorldID, int nVillageID, bool bIsMaster, bool bTutorial, bool bAdult,
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
char cPCBangGrade, char cSelectedLanguage, TMemberVoiceInfo * pInfo)
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
char cPCBangGrade, TMemberVoiceInfo * pInfo)
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
{
|
||
CDNUserSession * pSession = NULL;
|
||
if (m_GameState == _GAME_STATE_READY2CONNECT)
|
||
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20><><EFBFBD>Ŀ<EFBFBD> <20><>Ƽ<EFBFBD>γ༮<CEB3><E0BCAE> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <20><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>սô<D5BD>.(<28><><EFBFBD>ǰ<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
pSession = new IBoostPoolDNGameSession( nSessionID, m_pGameServer, this );
|
||
|
||
if (pSession)
|
||
{
|
||
#if defined(PRE_ADD_MULTILANGUAGE)
|
||
pSession->PreInitializeUser(wszAccountName, nAccountDBID, nSessionID, biCharacterDBID, iTeam, nWorldID, nVillageID, bTutorial, bAdult, cPCBangGrade, cSelectedLanguage, pInfo);
|
||
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
pSession->PreInitializeUser(wszAccountName, nAccountDBID, nSessionID, biCharacterDBID, iTeam, nWorldID, nVillageID, bTutorial, bAdult, cPCBangGrade, pInfo);
|
||
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
||
}
|
||
else
|
||
return pSession;
|
||
|
||
#if defined( STRESS_TEST )
|
||
PartyStruct Party;
|
||
Party.pSession = pSession;
|
||
Party.bLeader = bIsMaster;
|
||
|
||
if( nAccountDBID == 0 )
|
||
{
|
||
for( UINT i=0 ; i<4 ; ++i )
|
||
m_VecMember.push_back(Party);
|
||
}
|
||
else
|
||
{
|
||
m_VecMember.push_back(Party);
|
||
}
|
||
#else
|
||
AddPartyStruct( pSession, bIsMaster );
|
||
#endif
|
||
m_UserList.push_back(pSession);
|
||
}
|
||
else
|
||
g_Log.Log(LogType::_ERROR, nWorldID, nAccountDBID, biCharacterDBID, 0, _T("Connect|GameStart Flow err [state:addmember]\n"));
|
||
|
||
return pSession;
|
||
}
|
||
|
||
bool CDNGameRoom::VerifyMember(CDNUserSession * pSession)
|
||
{//<2F><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߰<EFBFBD> <20><>û<EFBFBD>ÿ<EFBFBD>
|
||
for (unsigned int i = 0; i < m_VecMember.size(); i ++)
|
||
if (m_VecMember[i].pSession == pSession)
|
||
return true;
|
||
return false;
|
||
}
|
||
|
||
void CDNGameRoom::RemoveMember(CDNUserSession * pSession, wchar_t * pwszIdent)
|
||
{//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
m_DeleteList.push_back(pSession->GetSessionID());
|
||
OnLeaveUser(pSession->GetSessionID());
|
||
|
||
g_Log.Log(LogType::_NORMAL, pSession, L"[%d] RemoveMember(%s) SessionState=%d RoomState=%d\r\n", g_Config.nManagedID, pwszIdent == NULL ? L"NULL" : pwszIdent, pSession->GetState(), GetRoomState());
|
||
}
|
||
|
||
void CDNGameRoom::CheckRemovedMember()
|
||
{
|
||
#ifdef STRESS_TEST
|
||
return;
|
||
#endif
|
||
if (m_DeleteList.empty() )
|
||
return;
|
||
|
||
// BackGround <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̽<EFBFBD><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD>ٷȴٰ<C8B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
//if( m_GameState == _GAME_STATE_SYNC2SYNC || m_GameState == _GAME_STATE_LOAD2SYNC )
|
||
if( g_pBackLoader && g_pBackLoader->IsLoading( GetRoomID() ) )
|
||
return;
|
||
|
||
DNVector(PartyStruct)::iterator ii;
|
||
for (int i = 0; i < (int)m_DeleteList.size(); i++)
|
||
{
|
||
bool bDelFalg = false; // m_VecMember.erase() <20>ߴ<EFBFBD><DFB4><EFBFBD> Flag
|
||
// m_VecMember <20><> pushback <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> disconnect <20><> session ó<><C3B3>
|
||
CDNUserSession* pDeleteSession = NULL;
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Disconnect ó<><C3B3>
|
||
for( std::list<CDNUserSession*>::iterator bi=m_BreakIntoUserList.begin() ; bi!=m_BreakIntoUserList.end() ; )
|
||
{
|
||
if( (*bi)->GetSessionID() == m_DeleteList[i] )
|
||
{
|
||
pDeleteSession = (*bi);
|
||
bi = m_BreakIntoUserList.erase( bi );
|
||
break;
|
||
}
|
||
else
|
||
++bi;
|
||
}
|
||
|
||
for (ii = m_VecMember.begin(); ii != m_VecMember.end(); ii++)
|
||
{
|
||
if ((*ii).pSession->GetSessionID() == m_DeleteList[i])
|
||
{
|
||
#ifndef _FINAL_BUILD
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> <20>־ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||
for( int j=EQUIP_FACE; j<=EQUIP_RING2; j++ ) {
|
||
if( !(*ii).pEquip[j] ) continue;
|
||
for( int k=0; k<INVENTORYMAX; k++ ) {
|
||
if( !(*ii).pInventory[k] ) continue;
|
||
if( (*ii).pEquip[j] == (*ii).pInventory[k] ) {
|
||
_ASSERT(0&&"<EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD> <20><><EFBFBD><EFBFBD>!!");
|
||
}
|
||
}
|
||
}
|
||
/////////////////////////////////////////////////////
|
||
#endif
|
||
pDeleteSession = NULL;
|
||
|
||
m_vDeleteSession.push_back( (*ii).pSession );
|
||
m_UserList.remove( (*ii).pSession );
|
||
(*ii).pSession->FinalUser();
|
||
GetGameServer()->RemoveConnection(GetRoomID(), (*ii).pSession->GetNetID(), (*ii).pSession->GetAccountDBID(), (*ii).pSession->GetSessionID());
|
||
|
||
(*ii).ReleaseEquipInventory();
|
||
|
||
CheckCurrentItemLooterIdx( &(*ii) );
|
||
std::map<INT64,CDNUserSession*>::iterator itor = m_mCharDBIDMember.find( (*ii).pSession->GetCharacterDBID() );
|
||
if( itor != m_mCharDBIDMember.end() )
|
||
m_mCharDBIDMember.erase( itor );
|
||
m_VecMember.erase(ii);
|
||
bDelFalg = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if( bDelFalg && GetMasterRewardSystem() )
|
||
GetMasterRewardSystem()->RequestRefresh();
|
||
|
||
if( bDelFalg == false && pDeleteSession == NULL )
|
||
{
|
||
for( std::list<CDNUserSession*>::iterator itor=m_UserList.begin() ; itor!=m_UserList.end() ; ++itor )
|
||
{
|
||
CDNUserSession* pZombieSession = (*itor);
|
||
if( pZombieSession )
|
||
{
|
||
if( pZombieSession->GetSessionID() == m_DeleteList[i] )
|
||
{
|
||
g_Log.Log( LogType::_ZOMBIEUSER, pZombieSession, L"[%d] RoomID:%d", g_Config.nManagedID, GetRoomID() );
|
||
pZombieSession->FinalUser();
|
||
GetGameServer()->RemoveConnection(GetRoomID(), pZombieSession->GetNetID(), pZombieSession->GetAccountDBID(), pZombieSession->GetSessionID());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if( pDeleteSession )
|
||
{
|
||
m_UserList.remove( pDeleteSession );
|
||
pDeleteSession->FinalUser();
|
||
GetGameServer()->RemoveConnection(GetRoomID(), pDeleteSession->GetNetID(), pDeleteSession->GetAccountDBID(), pDeleteSession->GetSessionID());
|
||
}
|
||
}
|
||
m_DeleteList.clear();
|
||
|
||
if( m_VecMember.empty() )
|
||
{
|
||
//<2F>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if (bIsFarmRoom() == false && CheckDestroyWorldCombineParty() == true )
|
||
#else
|
||
if (bIsFarmRoom() == false)
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
{
|
||
bool bDestroy = true;
|
||
if (bIsPvPRoom())
|
||
{
|
||
if (bIsGuildWarSystem() && m_bForceDestroyRoom == false)
|
||
{
|
||
if (GetPvPGameMode() && GetPvPGameMode()->bIsFinishFlag() == false)
|
||
bDestroy = false;
|
||
}
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
if( bIsWorldPvPRoom() && bIsWorldPvPRoomStart() == false && GetWorldPvPRoomReqType() != WorldPvPMissionRoom::Common::GMRoom )
|
||
bDestroy =false;
|
||
#endif
|
||
}
|
||
|
||
if (bDestroy)
|
||
DestroyGameRoom();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (m_pTaskMng)
|
||
{
|
||
CDnPartyTask * pPartyTask = (CDnPartyTask*)m_pTaskMng->GetTask("PartyTask");
|
||
if (pPartyTask)
|
||
pPartyTask->UpdateGateInfo();
|
||
else _DANGER_POINT();
|
||
}
|
||
|
||
#if defined( PRE_PARTY_DB )
|
||
if( GetUserCount() <= 1 ) m_PartyStructData.iUpkeepCount = 0;
|
||
#else
|
||
if( GetUserCount() <= 1 ) m_nUpkeepCount = 0;
|
||
#endif
|
||
UpdateAppliedEventValue();
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::CheckRudpDisconnectedMember()
|
||
{
|
||
//tcp<63><70> <20>ܳصǾ<D8B5> <20>ִµ<D6B4> rudp<64><70> <20><><EFBFBD><EFBFBD><EFBFBD>༮<EFBFBD>鿡<EFBFBD><E9BFA1> <20>翬<EFBFBD><E7BFAC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߶<EFBFBD> <20>ݴϴ<DDB4>.
|
||
DNVector(PartyStruct)::iterator ii;
|
||
for (ii = m_VecMember.begin(); ii != m_VecMember.end(); ii++)
|
||
if ((*ii).pSession->IsRudpDisconnected() && GetGameTick() - (*ii).pSession->GetRudpDisconnectedTick() > (5*1000)) //<2F><> 5<><35>?
|
||
(*ii).pSession->DetachConnection(L"CheckRudpDisconnectedMember");
|
||
}
|
||
|
||
void CDNGameRoom::UserUpdate( DWORD dwCurTick )
|
||
{
|
||
#ifdef PRE_MOD_INDUCE_TCPCONNECT
|
||
if (m_GameState == _GAME_STATE_SYNC2PLAY || m_GameState == _GAME_STATE_PLAY || \
|
||
m_GameState == _GAME_STATE_READY2CONNECT || m_GameState == _GAME_STATE_CONNECT2CHECKAUTH)
|
||
#else //#ifdef PRE_MOD_INDUCE_TCPCONNECT
|
||
if (m_GameState == _GAME_STATE_SYNC2PLAY || m_GameState == _GAME_STATE_PLAY)
|
||
#endif //#ifdef PRE_MOD_INDUCE_TCPCONNECT
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
CDNUserSession* pSession = m_VecMember[i].pSession;
|
||
if( pSession )
|
||
pSession->DoUpdate( dwCurTick );
|
||
}
|
||
}
|
||
|
||
if (m_nInivitedTime > 0 && m_nInivitedTime + (GAMEINVITEWAITTIME) < timeGetTime())
|
||
{
|
||
ResetInvite(ERROR_PARTY_INVITEFAIL);
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::AddGameListener(CGameListener * pListener)
|
||
{
|
||
m_GameListener.push_back(pListener);
|
||
}
|
||
|
||
void CDNGameRoom::RemoveGameListener(CGameListener * pListener)
|
||
{
|
||
std::vector <CGameListener*>::iterator ii;
|
||
for (ii = m_GameListener.begin(); ii != m_GameListener.end(); ii++)
|
||
{
|
||
if ((*ii) == pListener)
|
||
{
|
||
m_GameListener.erase(ii);
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::_AddPacketQueue( CDNUserSession* pSession, const DWORD dwUniqueID, const BYTE cSubCmd, const BYTE* pBuffer, const int iSize, const int iPrior )
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if( m_VecMember[i].pSession == pSession )
|
||
continue;
|
||
|
||
if( bIsFarmRoom() )
|
||
{
|
||
// <20><><EFBFBD>弼<EFBFBD><E5BCBC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Actor <20><>Ŷ<EFBFBD><C5B6> <20>ʹ<EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> unreachable <20>ɸ<EFBFBD><C9B8>°<EFBFBD> <20>ƴѰ<C6B4> <20>; SESSION_STATE_GAME_PLAY <20>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
if( m_VecMember[i].pSession->GetState() != SESSION_STATE_GAME_PLAY )
|
||
{
|
||
bool bSkip = false;
|
||
switch( cSubCmd )
|
||
{
|
||
case eActor::CS_FISHINGROD_CAST:
|
||
case eActor::CS_FISHINGROD_LIFT:
|
||
case eActor::CS_FISHINGROD_HIDE:
|
||
{
|
||
bSkip = true;
|
||
}
|
||
}
|
||
|
||
if( bSkip )
|
||
continue;
|
||
}
|
||
}
|
||
|
||
//#ifdef PRE_ADD_PACKETSIZE_CHECKER
|
||
// m_VecMember[i].pSession->AddPacketQueue( dwUniqueID, cSubCmd, pBuffer, iSize, iPrior, true );
|
||
//#else //#ifdef PRE_ADD_PACKETSIZE_CHECKER
|
||
m_VecMember[i].pSession->AddPacketQueue( dwUniqueID, cSubCmd, pBuffer, iSize, iPrior );
|
||
//#endif //#ifdef PRE_ADD_PACKETSIZE_CHECKER
|
||
}
|
||
}
|
||
|
||
int CDNGameRoom::OnDispatchMessage(CDNUserSession * pSession, int iMainCmd, int iSubCmd, char * pData, int iLen, BYTE cSeqLevel)
|
||
{
|
||
#ifdef _FINAL_BUILD
|
||
__try {
|
||
#endif
|
||
|
||
/*
|
||
if( g_pBackLoader && g_pBackLoader->IsLoading( GetRoomID() ) )
|
||
{
|
||
if( !(iMainCmd == CS_ACTOR && iSubCmd == eActor::CS_CMDSTOP) )
|
||
g_Log.Log( LogType::_ERROR, pSession, L"[%d] BackGroundLoading MCMD[%d] SCMD[%d]\n", g_Config.nManagedID, iMainCmd, iSubCmd );
|
||
}
|
||
*/
|
||
|
||
if (m_GameState == _GAME_STATE_DESTROYED) return ERROR_NONE;
|
||
if (m_GameState == _GAME_STATE_SYNC2SYNC)
|
||
{
|
||
bool bSkip = true;
|
||
switch( iMainCmd )
|
||
{
|
||
case CS_ROOM:
|
||
case CS_SYSTEM:
|
||
{
|
||
bSkip = false;
|
||
break;
|
||
}
|
||
case CS_ITEM:
|
||
{
|
||
if( iSubCmd == eItem::SC_REFRESHINVEN )
|
||
bSkip = false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if( bSkip )
|
||
{
|
||
//<2F><>Ÿ<EFBFBD>ֿ̹<CCB9> <20> <20><EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<>ο<EFBFBD>
|
||
//<2F>̺κ<CCBA><CEBA><EFBFBD> <20>о<EFBFBD> <20>ϴ°<CFB4> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>翡<EFBFBD><E7BFA1> <20>˷<EFBFBD><CBB7>ּ<EFBFBD><D6BC><EFBFBD>.
|
||
#ifndef _FINAL_BUILD
|
||
// if( !(iMainCmd == CS_ACTOR && iSubCmd == eActor::CS_CMDSTOP) )
|
||
// g_Log.Log( LogType::_ERROR, pSession, L"MapIndex[%d] MCMD[%d] SCMD[%d]\n", pSession->GetMapIndex(), iMainCmd, iSubCmd);
|
||
#endif
|
||
return ERROR_NONE;
|
||
}
|
||
}
|
||
|
||
if (iMainCmd == CS_ACTOR || iMainCmd == CS_ACTORBUNDLE)
|
||
{
|
||
//<2F><><EFBFBD><CDB8><DEBC><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̻<EFBFBD><CCBB>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>մϴ<D5B4>. <20>̵<EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾƾ<CABE><C6BE><EFBFBD> Ÿ<>ֿ̹<CCB9> <20>Ƽ<DEBE> <20><>ġ<EFBFBD><C4A1> Ʋ<><C6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.
|
||
if ((m_GameState != _GAME_STATE_PLAY) || cSeqLevel != m_cSeqLevel)
|
||
return ERROR_NONE;
|
||
}
|
||
|
||
switch (iMainCmd)
|
||
{
|
||
case CS_SYSTEM: return pSession->OnRecvSystemMessage(iSubCmd, pData, iLen);
|
||
case CS_FRIEND: return pSession->OnRecvFriendMessage(iSubCmd, pData, iLen);
|
||
case CS_ISOLATE: return pSession->OnRecvIsolateMessage(iSubCmd, pData, iLen);
|
||
case CS_GAMEOPTION: return pSession->OnRecvGameOptionMessage(iSubCmd, pData, iLen);
|
||
case CS_RADIO: return pSession->OnRecvRadioMessage(iSubCmd, pData, iLen);
|
||
case CS_ETC: return pSession->OnRecvEtcMessage(iSubCmd, pData, iLen);
|
||
// case CS_GUILD: return pSession->OnRecvGuildMessage(iSubCmd, pData, iLen); // <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> CDnGuildTask::OnRecvGuildMessage(...) <20><><EFBFBD><EFBFBD> ó<><C3B3> (20100210 b4nfter)
|
||
#ifdef _USE_VOICECHAT
|
||
case CS_VOICECHAT: return pSession->OnRecvVoiceChatMessage(iSubCmd, pData, iLen);
|
||
#endif
|
||
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
||
case CS_REPUTATION: return pSession->OnRecvReputationMessage( iSubCmd, pData, iLen );
|
||
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
||
case CS_MASTERSYSTEM: return pSession->OnRecvMasterSystemMessage( iSubCmd, pData, iLen );
|
||
#if defined( PRE_ADD_SECONDARY_SKILL )
|
||
case CS_SECONDARYSKILL: return pSession->OnRecvSecondarySkillMessage( iSubCmd, pData, iLen );
|
||
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
|
||
#if defined( PRE_PRIVATECHAT_CHANNEL )
|
||
case CS_PRIVATECHAT_CHANNEL: return pSession->OnRecvPrivateChatChannelMessage( iSubCmd, pData, iLen );
|
||
#endif
|
||
#if defined( PRE_ALTEIAWORLD_EXPLORE )
|
||
case CS_ALTEIAWORLD: return pSession->OnRecvWorldAlteiaMessage( iSubCmd, pData, iLen );
|
||
#endif
|
||
#if defined(PRE_ADD_CHAT_MISSION)
|
||
case CS_MISSION: return pSession->OnRecvMissionMessage(iSubCmd, pData, iLen);
|
||
#endif
|
||
case CS_ACTOR:
|
||
{
|
||
CSActorMessage * pActorMsg = reinterpret_cast<CSActorMessage*>(pData);
|
||
|
||
/*if (sizeof(CSActorMessage) - sizeof(pActorMsg->cBuf) + pActorMsg->cSize != iLen)
|
||
return ERROR_INVALIDPACKET;*/
|
||
|
||
_AddPacketQueue( pSession, pActorMsg->nSessionID, iSubCmd, reinterpret_cast<const BYTE*>(pActorMsg->cBuf), iLen, _FAST );
|
||
break;
|
||
}
|
||
case CS_ACTORBUNDLE:
|
||
{
|
||
CSActorBundleMessage *pBundlePacket = reinterpret_cast<CSActorBundleMessage*>(pData);
|
||
|
||
/*if (sizeof(CSActorBundleMessage) - sizeof(pBundlePacket->cBuf) + (pBundlePacket->cSize) != iLen)
|
||
return ERROR_INVALIDPACKET;*/
|
||
|
||
int nOffset = 0;
|
||
DWORD dwUniqueID;
|
||
BYTE cSubCmd;
|
||
WORD wSize;
|
||
void* pLocalData;
|
||
|
||
int iDataLen = iLen-sizeof(pBundlePacket->nSessionID);
|
||
if( iDataLen < 0 )
|
||
return ERROR_INVALIDPACKET;
|
||
|
||
for( int i=0; i<iSubCmd; ++i )
|
||
{
|
||
if( iDataLen < sizeof(DWORD) )
|
||
return ERROR_INVALIDPACKET;
|
||
memcpy( &dwUniqueID, pBundlePacket->cBuf+nOffset, sizeof(DWORD) ); nOffset += sizeof(DWORD);
|
||
iDataLen -= sizeof(DWORD);
|
||
|
||
if( iDataLen < sizeof(BYTE) )
|
||
return ERROR_INVALIDPACKET;
|
||
memcpy( &cSubCmd, pBundlePacket->cBuf+nOffset, sizeof(BYTE) ); nOffset += sizeof(BYTE);
|
||
iDataLen -= sizeof(BYTE);
|
||
|
||
if( iDataLen < sizeof(WORD) )
|
||
return ERROR_INVALIDPACKET;
|
||
memcpy( &wSize, pBundlePacket->cBuf+nOffset, sizeof(WORD) ); nOffset += sizeof(WORD);
|
||
iDataLen -= sizeof(WORD);
|
||
|
||
if( iDataLen < wSize )
|
||
return ERROR_INVALIDPACKET;
|
||
pLocalData = pBundlePacket->cBuf + nOffset; nOffset += wSize;
|
||
iDataLen -= wSize;
|
||
|
||
_AddPacketQueue( pSession, dwUniqueID, cSubCmd, static_cast<const BYTE*>(pLocalData), wSize, _FAST );
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
for (int i = 0; i < (int)m_GameListener.size(); i++)
|
||
m_GameListener[i]->OnDispatchMessage(pSession, iMainCmd, iSubCmd, pData, iLen);
|
||
|
||
/*
|
||
Windows SEH <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ܷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD>
|
||
Enable C++ Exceptions <20><EFBFBD><D7B8><EFBFBD> /EHa <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
|
||
*/
|
||
#ifdef _FINAL_BUILD
|
||
} // __try {
|
||
__except(CExceptionReport::GetInstancePtr()->Proc(GetExceptionInformation(), MiniDumpNormal))
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>ϴٰ<CFB4> <20><><EFBFBD>ܰ<EFBFBD> <20><EFBFBD><DFBB>ϸ<EFBFBD> <20><><EFBFBD>⼭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||
g_Log.Log(LogType::_SESSIONCRASH, L"[%d] Session Crash! RoomID=%d\n", g_Config.nManagedID, m_iRoomID );
|
||
pSession->SetDecreaseFatigue(0);
|
||
//pSession->SetSessionState(SESSION_STATE_CRASH);
|
||
pSession->DetachConnection(L"SESSION_STATE_CRASH");//L"SESSION_STATE_CRASH");
|
||
|
||
//<2F><><EFBFBD>ܰ<EFBFBD> <20><EFBFBD><DFBB>ϸ<EFBFBD> SM<53><4D><EFBFBD><EFBFBD> <20><><EFBFBD>ܹ<DCB9><DFBB><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
|
||
#if !defined (_TH)
|
||
if (g_pServiceConnection)
|
||
g_pServiceConnection->SendDetectException(_EXCEPTIONTYPE_SESSIONCRASH);
|
||
#endif
|
||
}
|
||
|
||
#endif
|
||
return ERROR_NONE;
|
||
}
|
||
|
||
CDNUserSession * CDNGameRoom::GetUserData(DWORD dwIndex)
|
||
{
|
||
if( dwIndex >= (DWORD)m_VecMember.size() )
|
||
return NULL;
|
||
return m_VecMember[dwIndex].pSession;
|
||
}
|
||
|
||
CDNUserSession * CDNGameRoom::GetUserSession(UINT nSessionID)
|
||
{
|
||
DNVector(PartyStruct)::iterator ii;
|
||
for (ii = m_VecMember.begin(); ii != m_VecMember.end(); ii++)
|
||
if ((*ii).pSession->GetSessionID() == nSessionID)
|
||
return (*ii).pSession;
|
||
return NULL;
|
||
}
|
||
|
||
|
||
//PartyData
|
||
bool CDNGameRoom::AddPartyStruct( CDNUserSession* pSession, bool bLeader)
|
||
{
|
||
if( bIsFarmRoom() == false )
|
||
{
|
||
UINT uiMax = bIsPvPRoom() ? PvPCommon::Common::MaxPlayer : PARTYCOUNTMAX;
|
||
|
||
if (pSession->bIsGMTrace())
|
||
uiMax = PARTYMAX;
|
||
|
||
if( m_VecMember.size() >= uiMax )
|
||
return false;
|
||
}
|
||
|
||
PartyStruct Party;
|
||
Party.pSession = pSession;
|
||
Party.bLeader = bLeader;
|
||
|
||
m_VecMember.push_back( Party );
|
||
m_mCharDBIDMember.insert( std::make_pair(pSession->GetCharacterDBID(),pSession) );
|
||
|
||
AddLastPartyDungeonInfo( pSession );
|
||
return true;
|
||
}
|
||
|
||
CDNGameRoom::PartyStruct * CDNGameRoom::GetPartyData(CDNUserSession * pSession)
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
if( m_VecMember[i].pSession == pSession)
|
||
return &m_VecMember[i];
|
||
return NULL;
|
||
}
|
||
|
||
CDNGameRoom::PartyStruct * CDNGameRoom::GetPartyData( WCHAR *pwszCharacterName )
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
if( __wcsicmp_l( m_VecMember[i].pSession->GetCharacterName(), pwszCharacterName ) == 0 )
|
||
return &m_VecMember[i];
|
||
return NULL;
|
||
}
|
||
|
||
CDNGameRoom::PartyStruct * CDNGameRoom::GetPartyDatabySessionID(UINT nSessionID, int &Seq)
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
if (m_VecMember[i].pSession->GetSessionID() == nSessionID)
|
||
{
|
||
Seq = i;
|
||
return &m_VecMember[i];
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
CDNUserSession* CDNGameRoom::GetUserSessionByCharDBID( INT64 biCharDBID )
|
||
{
|
||
std::map<INT64,CDNUserSession*>::iterator itor = m_mCharDBIDMember.find( biCharDBID );
|
||
if( itor != m_mCharDBIDMember.end() )
|
||
return (*itor).second;
|
||
|
||
return NULL;
|
||
}
|
||
|
||
bool CDNGameRoom::SwapLeader(UINT nDelSessionID, UINT &nNewLeaderSessionID)
|
||
{
|
||
bool bCheck, bNewLeader;
|
||
bCheck = bNewLeader = false;
|
||
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
if (m_VecMember[i].pSession->GetSessionID() == nDelSessionID)
|
||
{
|
||
if (m_VecMember[i].bLeader == true && m_VecMember.size() > 1)
|
||
{
|
||
m_VecMember[i].bLeader = false;
|
||
bNewLeader = true;
|
||
}
|
||
bCheck = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
#if defined( PRE_PARTY_DB )
|
||
CDNUserSession* pNewLeaderSession = NULL;
|
||
#endif // #if defined( PRE_PARTY_DB )
|
||
|
||
if (bNewLeader)
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
if (m_VecMember[i].pSession->GetSessionID() != nDelSessionID && nNewLeaderSessionID == 0 && m_VecMember[i].pSession->bIsGMTrace() == false && m_VecMember[i].pSession->GetOutedMember() == false)
|
||
{
|
||
m_VecMember[i].bLeader = true;
|
||
nNewLeaderSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
#if defined( PRE_PARTY_DB )
|
||
pNewLeaderSession = m_VecMember[i].pSession;
|
||
#endif // #if defined( PRE_PARTY_DB )
|
||
}
|
||
else
|
||
m_VecMember[i].bLeader = false;
|
||
}
|
||
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>
|
||
m_VecMember[i].pSession->SendUpdatePartyUI(nDelSessionID, false);
|
||
m_VecMember[i].pSession->SendUpdatePartyUI(nNewLeaderSessionID, true);
|
||
}
|
||
}
|
||
|
||
if( pNewLeaderSession )
|
||
{
|
||
m_PartyStructData.biLeaderCharacterDBID = pNewLeaderSession->GetCharacterDBID();
|
||
#if defined( PRE_PARTY_DB )
|
||
GetDBConnection()->QueryModPartyLeader( pNewLeaderSession, GetPartyIndex() );
|
||
#endif // #if defined( PRE_PARTY_DB )
|
||
}
|
||
|
||
return bCheck;
|
||
}
|
||
|
||
bool CDNGameRoom::IsPartyLeader(UINT nSessionID)
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
if (m_VecMember[i].pSession->GetSessionID() == nSessionID && m_VecMember[i].bLeader == true)
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
int CDNGameRoom::GetLeftMemberIndex()
|
||
{
|
||
for (int i = 0; i < PARTYMAX; i++)
|
||
{
|
||
if (m_nPartyMemberIndex[i] <= 0)
|
||
return i;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
bool CDNGameRoom::SetPartyMemberIndex(int nIdx, UINT nSessionID, int nTeam /*= -1*/)
|
||
{
|
||
if (GetPartyIndex() > 0)
|
||
m_nPartyMemberIndex[nIdx] = nSessionID;
|
||
else if (bIsPvPRoom() && bIsOccupationMode())
|
||
{
|
||
if (nTeam == -1) return false;
|
||
if (nTeam == PvPCommon::Team::A)
|
||
m_nPartyMemberIndex[nIdx] = nSessionID;
|
||
else
|
||
{
|
||
if (GetPvPMaxUser() <= 0)
|
||
{
|
||
_DANGER_POINT();
|
||
return false;
|
||
}
|
||
m_nPartyMemberIndex[nIdx+(GetPvPMaxUser()/2)] = nSessionID;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
bool CDNGameRoom::PartySwapMemberIndex(CSPartySwapMemberIndex * pPacket)
|
||
{
|
||
if( bIsFarmRoom() )
|
||
return true;
|
||
|
||
//verify count
|
||
#if defined( PRE_PARTY_DB )
|
||
if (pPacket->cCount > m_PartyStructData.nPartyMaxCount )
|
||
return false; //<2F>̷<EFBFBD><CCB7>ø<EFBFBD> <20>ƴϵ<C6B4><CFB5>ɴϴ<C9B4>.
|
||
#else
|
||
if (pPacket->cCount > m_nMemberMax)
|
||
return false; //<2F>̷<EFBFBD><CCB7>ø<EFBFBD> <20>ƴϵ<C6B4><CFB5>ɴϴ<C9B4>.
|
||
#endif
|
||
|
||
//verify index range
|
||
std::vector <BYTE> vDuplicate;
|
||
std::vector <BYTE>::iterator iDuplicater;
|
||
for (int i = 0; i < pPacket->cCount; i++)
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
if (pPacket->Index[i].cIndex > (m_PartyStructData.nPartyMaxCount-1))
|
||
return false;
|
||
#else
|
||
if (pPacket->Index[i].cIndex > (m_nMemberMax-1))
|
||
return false;
|
||
#endif
|
||
|
||
iDuplicater = std::find(vDuplicate.begin(), vDuplicate.end(), pPacket->Index[i].cIndex);
|
||
if (vDuplicate.end() != iDuplicater)
|
||
return false; //<2F>ߺ<EFBFBD><DFBA>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ<EFBFBD><C8B5>ڳ<EFBFBD>
|
||
|
||
vDuplicate.push_back(pPacket->Index[i].cIndex);
|
||
}
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>븸<EFBFBD><EBB8B8><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>
|
||
UINT nPartyMemberIndex[PARTYMAX];
|
||
memcpy(nPartyMemberIndex, m_nPartyMemberIndex, sizeof(m_nPartyMemberIndex));
|
||
memset(m_nPartyMemberIndex, 0, sizeof(m_nPartyMemberIndex));
|
||
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
bool bCheck = false;
|
||
for (int j = 0; j < PARTYMAX; j++)
|
||
{
|
||
if (pPacket->Index[j].nSessionID == m_VecMember[i].pSession->GetSessionID())
|
||
{
|
||
m_VecMember[i].pSession->SetPartyMemberIndex(pPacket->Index[j].cIndex);
|
||
m_nPartyMemberIndex[m_VecMember[i].pSession->GetPartyMemberIndex()] = m_VecMember[i].pSession->GetSessionID();
|
||
bCheck = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (bCheck == false)
|
||
{
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
memcpy(m_nPartyMemberIndex, nPartyMemberIndex, sizeof(m_nPartyMemberIndex));
|
||
for( DWORD h=0; h<m_VecMember.size(); h++ )
|
||
{
|
||
for (int k = 0; k < PARTYMAX; k++)
|
||
{
|
||
if (m_nPartyMemberIndex[k] == m_VecMember[h].pSession->GetSessionID())
|
||
{
|
||
m_VecMember[i].pSession->SetPartyMemberIndex(k);
|
||
break;
|
||
}
|
||
}
|
||
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
|
||
SendRefreshParty(0, NULL);
|
||
return true;
|
||
}
|
||
|
||
bool CDNGameRoom::IsRaidParty()
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
return m_PartyStructData.nPartyMaxCount >= RAIDPARTYCOUNTMIN ? true : false;
|
||
#else
|
||
return m_nMemberMax >= RAIDPARTYCOUNTMIN ? true : false;
|
||
#endif
|
||
}
|
||
|
||
void CDNGameRoom::SortMemberIndex(int nOutIndex)
|
||
{
|
||
//if (IsRaidParty() == false || nOutIndex < 0) return; //<2F><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>Ƽ<EFBFBD><C6BC> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||
if (nOutIndex < 0) return; //<2F><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>Ƽ<EFBFBD><C6BC> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||
#if defined( PRE_PARTY_DB )
|
||
if (nOutIndex < 0 || m_PartyStructData.nPartyMaxCount-1 < nOutIndex) return;
|
||
#else
|
||
if (nOutIndex < 0 || m_nMemberMax-1 < nOutIndex) return;
|
||
#endif
|
||
|
||
//<2F><>¥ <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>
|
||
if (m_nPartyMemberIndex[nOutIndex] != 0)
|
||
m_nPartyMemberIndex[nOutIndex] = 0;
|
||
else
|
||
return;
|
||
|
||
//<2F>븻<EFBFBD><EBB8BB>Ƽ<EFBFBD><C6BC> <20>ִ<EFBFBD><D6B4>ο<EFBFBD><CEBF><EFBFBD> <20>ɼ<EFBFBD>ī<EFBFBD><C4AB>Ʈ<EFBFBD>̴<EFBFBD>.
|
||
int nOffSetRemainIndex = (nOutIndex+1)%NORMPARTYCOUNTMAX;
|
||
if (nOffSetRemainIndex <= 0) return; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ī<EFBFBD><C4AB>Ʈ<EFBFBD><C6AE> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
int nOffSetIndex = (nOutIndex+1) > NORMPARTYCOUNTMAX ? (nOutIndex)/NORMPARTYCOUNTMAX : 0;
|
||
int nSortEnd = (nOffSetIndex*NORMPARTYCOUNTMAX) + NORMPARTYCOUNTMAX;
|
||
|
||
CDNUserSession * pSession = NULL;
|
||
for (int i = nOutIndex; i < (nSortEnd-1); i++)
|
||
{
|
||
if ((i+1) >= PARTYCOUNTMAX) break;
|
||
if (m_nPartyMemberIndex[i+1] <= 0) continue;
|
||
m_nPartyMemberIndex[i] = m_nPartyMemberIndex[i+1];
|
||
m_nPartyMemberIndex[i+1] = 0;
|
||
}
|
||
|
||
for (int h = 0; h < PARTYMAX; h++)
|
||
{
|
||
if (m_nPartyMemberIndex[h] <= 0) continue;
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
if (m_VecMember[i].pSession->GetSessionID() == m_nPartyMemberIndex[h])
|
||
m_VecMember[i].pSession->SetPartyMemberIndex(h);
|
||
}
|
||
}
|
||
}
|
||
|
||
#if defined( PRE_FATIGUE_DROPITEM_PENALTY )
|
||
int CDNGameRoom::GetFatigueDropRate()
|
||
{
|
||
int iUserCount = 0;
|
||
int iDropRate = 0;
|
||
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
CDNUserSession* pSession = m_VecMember[i].pSession;
|
||
|
||
if( pSession && pSession->GetState() == SESSION_STATE_GAME_PLAY )
|
||
{
|
||
++iUserCount;
|
||
|
||
if( pSession->bIsNoFatigueEnter() )
|
||
{
|
||
iDropRate += static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::FatigueDropItemPenalty_Rate )*100);
|
||
}
|
||
else
|
||
{
|
||
iDropRate += 100;
|
||
}
|
||
}
|
||
}
|
||
|
||
if( iUserCount <= 0 )
|
||
return 0;
|
||
|
||
return iDropRate/iUserCount;
|
||
}
|
||
|
||
#endif // #if defined( PRE_FATIGUE_DROPITEM_PENALTY )
|
||
|
||
int CDNGameRoom::GetPartyAvrLevel()
|
||
{
|
||
int nUserCnt, nMountLv;
|
||
nUserCnt = nMountLv = 0;
|
||
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
nMountLv += m_VecMember[i].pSession->GetLevel();
|
||
nUserCnt++;
|
||
}
|
||
return nUserCnt == 0 ? 0 : nMountLv / nUserCnt;
|
||
}
|
||
|
||
void CDNGameRoom::GetLeaderSessionID(UINT &nSessionID)
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
if (m_VecMember[i].bLeader)
|
||
{
|
||
nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SetLeaderSession(UINT nSessionID)
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
if (m_VecMember[i].pSession->GetSessionID() == nSessionID)
|
||
{
|
||
m_VecMember[i].bLeader = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendRefreshParty(UINT nSessionID, TProfile * pProfile)
|
||
{
|
||
if (GetPartyIndex() <= 0) return; //<2F><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> 0<>̴<EFBFBD>.
|
||
|
||
if (nSessionID > 0)
|
||
m_pPartyTask->RequestPartyMember();
|
||
|
||
SPartyMemberInfo Info[PARTYMAX];
|
||
memset(&Info, 0, sizeof(Info));
|
||
|
||
int nCount = 0;
|
||
UINT nLeaderSessionID = 0;
|
||
GetLeaderSessionID(nLeaderSessionID);
|
||
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
if (m_VecMember[i].pSession->GetOutedMember()) continue;
|
||
|
||
m_VecMember[i].pSession->GetPartyMemberInfo(Info[nCount]);
|
||
nCount++;
|
||
}
|
||
|
||
if (nCount <= 0 && nLeaderSessionID <= 0)
|
||
return;
|
||
|
||
bool bAvailable = false;
|
||
#ifdef _USE_VOICECHAT
|
||
bAvailable = m_nVoiceChannelID[0] > 0 ? true : false; //<2F>ϴ<EFBFBD><CFB4><EFBFBD>~ 0<><30><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>
|
||
#endif
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
int nWorldCombinePartyTableIndex = 0;
|
||
if(Party::bIsWorldCombineParty(m_PartyStructData.Type))
|
||
{
|
||
WorldCombineParty::WrldCombinePartyData* WorldCombinePartyData = g_pDataManager->GetCombinePartyData( m_PartyStructData.nPrimaryIndex );
|
||
if(WorldCombinePartyData)
|
||
nWorldCombinePartyTableIndex = WorldCombinePartyData->cIndex;
|
||
}
|
||
#endif
|
||
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if (m_VecMember[i].pSession->GetOutedMember())
|
||
continue;
|
||
m_VecMember[i].pSession->SendRefreshParty(nLeaderSessionID, nCount, bAvailable, Info, PARTYREFRESH_NONE, &m_PartyStructData, nWorldCombinePartyTableIndex );
|
||
#else
|
||
m_VecMember[i].pSession->SendRefreshParty(nLeaderSessionID, m_PartyStructData.wszPartyName, (BYTE)m_PartyStructData.nPartyMaxCount, m_PartyStructData.cMinLevel, nCount, m_PartyStructData.LootRule, m_PartyStructData.LootItemRank, bAvailable, m_PartyStructData.iTargetMapIndex, m_PartyStructData.TargetMapDifficulty, Info, PARTYREFRESH_NONE, m_PartyStructData.Type, m_PartyStructData.iBitFlag, m_PartyStructData.iPassword );
|
||
#endif
|
||
#else
|
||
m_VecMember[i].pSession->SendRefreshParty(nLeaderSessionID, m_wszPartyName, m_wszPartyPass, m_nMemberMax, m_nUserLvMin, m_nUserLvMax, nCount, m_ItemLootRule, m_ItemLootRank, bAvailable, m_nTargetMapIdx, m_PartyDifficulty, Info, PARTYREFRESH_NONE, m_cIsJobDice, m_nMemberMax >= RAIDPARTYCOUNTMIN ? _RAID_PARTY_8 : _NORMAL_PARTY);
|
||
#endif // #if defined( PRE_PARTY_DB )
|
||
|
||
if (pProfile)
|
||
m_VecMember[i].pSession->SendDisplayProfile(nSessionID, *pProfile);
|
||
}
|
||
}
|
||
|
||
bool CDNGameRoom::SetInviteCharacterName(const WCHAR * pwszInvitedCharacterName)
|
||
{
|
||
if (IsInviting())
|
||
return false;
|
||
|
||
_wcscpy(m_wszInvitedCharacterName, _countof(m_wszInvitedCharacterName), pwszInvitedCharacterName, (int)wcslen(pwszInvitedCharacterName));
|
||
m_nInivitedTime = timeGetTime();
|
||
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
m_VecMember[i].pSession->SendPartyIniviteNotice(pwszInvitedCharacterName, ERROR_NONE);
|
||
|
||
return true;
|
||
}
|
||
|
||
bool CDNGameRoom::IsInviting()
|
||
{
|
||
if (m_nInivitedTime == 0 || m_nInivitedTime + (GAMEINVITEWAITTIME) < timeGetTime()) //<2F>ʴ<EFBFBD><CAB4><EFBFBD><EFBFBD><EFBFBD> 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <20>ȿ<EFBFBD><C8BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
bool CDNGameRoom::IsInvitingUser(const WCHAR * pwszName)
|
||
{
|
||
if (!__wcsicmp_l(m_wszInvitedCharacterName, pwszName))
|
||
return true;
|
||
return false;
|
||
}
|
||
|
||
void CDNGameRoom::ResetInvite(int nRetCode, bool bNotice)
|
||
{
|
||
if (bNotice)
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
m_VecMember[i].pSession->SendPartyIniviteNotice(m_wszInvitedCharacterName, nRetCode);
|
||
}
|
||
|
||
memset(m_wszInvitedCharacterName, 0, sizeof(m_wszInvitedCharacterName));
|
||
m_nInivitedTime = 0;
|
||
}
|
||
|
||
int CDNGameRoom::AdjustBreakintoUser(const WCHAR * pwszName, UINT nSessionID, int nRetCode, bool bNotice)
|
||
{
|
||
int nIndex = -1;
|
||
if (GetPartyIndex() > 0)
|
||
{
|
||
ResetInvite(nRetCode, bNotice); //<2F>ι<EFBFBD><CEB9><EFBFBD>Ʈ <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20>ο<EFBFBD>
|
||
nIndex = GetLeftMemberIndex();
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD><CAB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>찡 <20>ִ<EFBFBD> <20><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD>
|
||
UINT nLeaderSessionID = 0;
|
||
GetLeaderSessionID(nLeaderSessionID);
|
||
|
||
if (nLeaderSessionID <= 0)
|
||
SetLeaderSession(nSessionID);
|
||
}
|
||
|
||
return nIndex;
|
||
}
|
||
|
||
// DropItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DropItem<65>ڵ<EFBFBD><DAB5><EFBFBD> <20>Ѱ<EFBFBD><D1B0>ش<EFBFBD>.
|
||
DnDropItemHandle CDNGameRoom::RequestItemDropTable( const UINT uiTableID, EtVector3* pPos )
|
||
{
|
||
DNVector(CDnItem::DropItemStruct) vDropItem;
|
||
CDnDropItem::CalcDropItemList( this, uiTableID, vDropItem );
|
||
|
||
DnDropItemHandle hDropItem;
|
||
|
||
for( UINT i=0 ; i<vDropItem.size() ; ++i )
|
||
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
||
hDropItem = m_pItemTask->RequestDropItem( vDropItem[i].dwUniqueID, *pPos, vDropItem[i].nItemID, vDropItem[i].nSeed, vDropItem[i].nCount, 0, -1, vDropItem[i].nEnchantID );
|
||
#else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
||
hDropItem = m_pItemTask->RequestDropItem( vDropItem[i].dwUniqueID, *pPos, vDropItem[i].nItemID, vDropItem[i].nSeed, vDropItem[i].nCount, 0 );
|
||
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
||
|
||
return hDropItem;
|
||
}
|
||
|
||
void CDNGameRoom::AddDropItem( const DWORD dwUniqueID, DnDropItemHandle hDropItem )
|
||
{
|
||
m_mDropItem.insert( std::make_pair(dwUniqueID, hDropItem) );
|
||
}
|
||
|
||
void CDNGameRoom::EraseDropItem( const DWORD dwUniqueID )
|
||
{
|
||
m_mDropItem.erase( dwUniqueID );
|
||
}
|
||
|
||
DnDropItemHandle CDNGameRoom::FindDropItem( const DWORD dwUniqueID )
|
||
{
|
||
std::map<const DWORD,DnDropItemHandle>::iterator itor = m_mDropItem.find( dwUniqueID );
|
||
if( itor == m_mDropItem.end() )
|
||
return CDnDropItem::Identity();
|
||
|
||
return itor->second;
|
||
}
|
||
|
||
void CDNGameRoom::RequestChangeMapFromTrigger( int iMapIndex, int iGateNo )
|
||
{
|
||
if( m_vChangeMapQueue.empty() )
|
||
{
|
||
m_vChangeMapQueue.push_back( std::make_pair(iMapIndex,iGateNo) );
|
||
}
|
||
else
|
||
{
|
||
_DANGER_POINT();
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendRefreshRebirthCoin(UINT nSessionID, BYTE cRebirthCoin, BYTE cPCBangRebirthCoin, short nCashRebirthCoin, BYTE cVIPRebirthCoin)
|
||
{
|
||
for(DWORD i=0; i < m_VecMember.size(); i++)
|
||
m_VecMember[i].pSession->SendRefreshRebirthCoin(nSessionID, cRebirthCoin, cPCBangRebirthCoin, nCashRebirthCoin, cVIPRebirthCoin);
|
||
}
|
||
|
||
#ifdef _USE_PEERCONNECT
|
||
void CDNGameRoom::ConnectPeerRequest()
|
||
{
|
||
std::vector<PartyStruct>::iterator i1, i2;
|
||
for (i1 = m_VecMember.begin(); i1 != m_VecMember.end(); i1++)
|
||
{
|
||
if ((*i1).pSession->IsConnected())
|
||
for (i2 = m_VecMember.begin(); i2 != m_VecMember.end(); i2++)
|
||
{
|
||
if ((*i1).pSession != (*i2).pSession && (*i2).pSession->IsConnected() &&
|
||
m_PeerManager.IsConnectedPeer((*i1).pSession->GetSessionID(), (*i2).pSession->GetSessionID()) == false)
|
||
{//<2F><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>˸<EFBFBD><CBB8><EFBFBD>.
|
||
//<2F>ϴ<EFBFBD><CFB4><EFBFBD> <20>پ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ǿ<C7BE><EEBFAC> <20><>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD> <20>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>⸦ <20>ϴ°<CFB4> <20><><EFBFBD>ڴ<EFBFBD>
|
||
SCPeerConnectRequest packet;
|
||
(*i2).pSession->GetUDPAddr(&packet.nDestAddrIP, &packet.nDestAddrPort);
|
||
packet.nSessionID[0] = (*i1).pSession->GetSessionID();
|
||
packet.nSessionID[1] = (*i2).pSession->GetSessionID();
|
||
|
||
(*i1).pSession->SendPacket(SC_SYSTEM, eSystem::SC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), _RELIABLE);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
void CDNGameRoom::OnInitGameRoomUser()
|
||
{
|
||
if (m_VecMember.empty()) return;
|
||
|
||
for(DWORD i=0; i < m_VecMember.size(); i++)
|
||
{
|
||
#if defined( STRESS_TEST )
|
||
if( true )
|
||
#else
|
||
if (m_VecMember[i].pSession->IsConnected())
|
||
#endif
|
||
m_VecMember[i].pSession->InitialUser();
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendConnectedResult()
|
||
{
|
||
if (m_VecMember.empty()) return;
|
||
|
||
for(DWORD i=0; i < m_VecMember.size(); i++)
|
||
if (m_VecMember[i].pSession->GetState() == SESSION_STATE_LOADED)
|
||
m_VecMember[i].pSession->SendConnectedResult();
|
||
}
|
||
|
||
void CDNGameRoom::SendEquipData( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( m_VecMember.empty() )
|
||
return;
|
||
|
||
std::vector<TPartyMemberDefaultParts> vDefaultParts;
|
||
std::vector<TPartyMemberWeaponOrder> vWeaponOreder;
|
||
std::vector<TPartyMemberEquip> vEquip;
|
||
std::vector<TPartyMemberCashEquip> vCashEquip;
|
||
std::vector<TPartyMemberGlyphEquip> vGlyphEquip;
|
||
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
||
std::vector<TPartyMemberTalismanEquip> vTalismanEquip;
|
||
#endif
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
std::vector<TPartyVehicle> vVehicle;
|
||
std::vector<TPartyVehicle> vPet;
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
std::vector<TVehicle> vVehicle;
|
||
std::vector<TVehicle> vPet;
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
|
||
vDefaultParts.reserve( m_VecMember.size() );
|
||
vWeaponOreder.reserve( m_VecMember.size() );
|
||
vEquip.reserve( m_VecMember.size() );
|
||
vCashEquip.reserve( m_VecMember.size() );
|
||
vGlyphEquip.reserve( m_VecMember.size() );
|
||
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
||
vTalismanEquip.reserve( m_VecMember.size() );
|
||
#endif
|
||
vVehicle.reserve( m_VecMember.size() );
|
||
vPet.reserve( m_VecMember.size() );
|
||
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
// DefaultParts
|
||
TPartyMemberDefaultParts DefaultParts;
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
DefaultParts.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
DefaultParts.iDefaultPartsIndex[0] = m_VecMember[i].pSession->GetDefaultBody();
|
||
DefaultParts.iDefaultPartsIndex[1] = m_VecMember[i].pSession->GetDefaultLeg();
|
||
DefaultParts.iDefaultPartsIndex[2] = m_VecMember[i].pSession->GetDefaultHand();
|
||
DefaultParts.iDefaultPartsIndex[3] = m_VecMember[i].pSession->GetDefaultFoot();
|
||
vDefaultParts.push_back( DefaultParts );
|
||
|
||
// WeaponOrder
|
||
TPartyMemberWeaponOrder WeaponOrder;
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
WeaponOrder.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
memcpy(WeaponOrder.cViewCashEquipBitmap, m_VecMember[i].pSession->GetViewCashEquipBitmap(), sizeof(WeaponOrder.cViewCashEquipBitmap));
|
||
vWeaponOreder.push_back( WeaponOrder );
|
||
|
||
// Equip
|
||
TPartyMemberEquip Equip;
|
||
memset( &Equip, 0, sizeof(Equip) );
|
||
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
Equip.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
|
||
for( int j=0 ; j<EQUIPMAX; ++j )
|
||
{
|
||
if( m_VecMember[i].pSession->GetItem()->GetEquip(j) == NULL )
|
||
continue;
|
||
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
Equip.EquipArray[Equip.cCount].cSlotIndex = j;
|
||
Equip.EquipArray[Equip.cCount].Item = *(m_VecMember[i].pSession->GetItem()->GetEquip(j));
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
Equip.EquipArray[Equip.cCount].cSlotIndex = j;
|
||
Equip.EquipArray[Equip.cCount].Item = *(m_VecMember[i].pSession->GetItem()->GetEquip(j));
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
|
||
++Equip.cCount;
|
||
}
|
||
vEquip.push_back( Equip );
|
||
|
||
// CashEquip
|
||
TPartyMemberCashEquip CashEquip;
|
||
memset( &CashEquip, 0, sizeof(CashEquip) );
|
||
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
CashEquip.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
|
||
for( int j=0 ; j<CASHEQUIPMAX ; ++j )
|
||
{
|
||
if( m_VecMember[i].pSession->GetItem()->GetCashEquip(j) == NULL )
|
||
continue;
|
||
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
CashEquip.EquipArray[CashEquip.cCount].cSlotIndex = j;
|
||
CashEquip.EquipArray[CashEquip.cCount].Item = *(m_VecMember[i].pSession->GetItem()->GetCashEquip(j));
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
CashEquip.EquipArray[CashEquip.cCount].cSlotIndex = j;
|
||
CashEquip.EquipArray[CashEquip.cCount].Item = *(m_VecMember[i].pSession->GetItem()->GetCashEquip(j));
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
|
||
CashEquip.cCount++;
|
||
}
|
||
vCashEquip.push_back( CashEquip );
|
||
|
||
// Glyph
|
||
TPartyMemberGlyphEquip GlyphEquip;
|
||
memset( &GlyphEquip, 0, sizeof(GlyphEquip) );
|
||
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
GlyphEquip.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
|
||
for( int j=0 ; j<GLYPHMAX ; ++j )
|
||
{
|
||
if( m_VecMember[i].pSession->GetItem()->GetGlyph(j) == NULL )
|
||
continue;
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
GlyphEquip.EquipArray[GlyphEquip.cCount].cSlotIndex = j;
|
||
GlyphEquip.EquipArray[GlyphEquip.cCount].Item = *(m_VecMember[i].pSession->GetItem()->GetGlyph(j));
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
GlyphEquip.EquipArray[GlyphEquip.cCount].cSlotIndex = j;
|
||
GlyphEquip.EquipArray[GlyphEquip.cCount].Item = *(m_VecMember[i].pSession->GetItem()->GetGlyph(j));
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
GlyphEquip.cCount++;
|
||
}
|
||
vGlyphEquip.push_back( GlyphEquip );
|
||
|
||
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
||
// Talisman
|
||
TPartyMemberTalismanEquip TalismanEquip;
|
||
memset( &TalismanEquip, 0, sizeof(TalismanEquip) );
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
TalismanEquip.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
for( int j=0 ; j<TALISMAN_MAX ; ++j )
|
||
{
|
||
if( m_VecMember[i].pSession->GetItem()->GetTalisman(j) == NULL )
|
||
continue;
|
||
TalismanEquip.TalismanArray[TalismanEquip.cCount].cSlotIndex = j;
|
||
TalismanEquip.TalismanArray[TalismanEquip.cCount].Item = *(m_VecMember[i].pSession->GetItem()->GetTalisman(j));
|
||
TalismanEquip.cCount++;
|
||
}
|
||
vTalismanEquip.push_back( TalismanEquip );
|
||
#endif //#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
||
|
||
// Vehicle
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
TPartyVehicle Vehicle;
|
||
memset( &Vehicle, 0, sizeof(Vehicle) );
|
||
Vehicle.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
if( m_VecMember[i].pSession->GetItem()->GetVehicleEquip() )
|
||
Vehicle.tVehicle = *(m_VecMember[i].pSession->GetItem()->GetVehicleEquip());
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
TVehicle Vehicle;
|
||
memset( &Vehicle, 0, sizeof(Vehicle) );
|
||
if( m_VecMember[i].pSession->GetItem()->GetVehicleEquip() )
|
||
Vehicle = *(m_VecMember[i].pSession->GetItem()->GetVehicleEquip());
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
vVehicle.push_back( Vehicle );
|
||
|
||
// Pet
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
TPartyVehicle Pet;
|
||
memset( &Pet, 0, sizeof(Pet) );
|
||
Pet.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
if( m_VecMember[i].pSession->GetItem()->GetPetEquip() )
|
||
Pet.tVehicle = *(m_VecMember[i].pSession->GetItem()->GetPetEquip());
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
TVehicle Pet;
|
||
memset( &Pet, 0, sizeof(Pet) );
|
||
if( m_VecMember[i].pSession->GetItem()->GetPetEquip() )
|
||
Pet = *(m_VecMember[i].pSession->GetItem()->GetPetEquip());
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
vPet.push_back( Pet );
|
||
}
|
||
|
||
if( pBreakIntoSession )
|
||
{
|
||
pBreakIntoSession->SendDefaultPartsData( vDefaultParts );
|
||
pBreakIntoSession->SendWeaponOrderData( vWeaponOreder );
|
||
pBreakIntoSession->SendEquipData( vEquip );
|
||
pBreakIntoSession->SendCashEquipData( vCashEquip );
|
||
pBreakIntoSession->SendGlyphEquipData( vGlyphEquip );
|
||
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
||
pBreakIntoSession->SendTalismanEquipData( vTalismanEquip );
|
||
#endif
|
||
pBreakIntoSession->SendVehicleEquipData( vVehicle );
|
||
pBreakIntoSession->SendPetEquipData(vPet);
|
||
}
|
||
else
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
m_VecMember[i].pSession->SendDefaultPartsData( vDefaultParts );
|
||
m_VecMember[i].pSession->SendWeaponOrderData( vWeaponOreder );
|
||
m_VecMember[i].pSession->SendEquipData( vEquip );
|
||
m_VecMember[i].pSession->SendCashEquipData( vCashEquip );
|
||
m_VecMember[i].pSession->SendGlyphEquipData( vGlyphEquip );
|
||
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
||
m_VecMember[i].pSession->SendTalismanEquipData( vTalismanEquip );
|
||
#endif
|
||
m_VecMember[i].pSession->SendVehicleEquipData( vVehicle );
|
||
m_VecMember[i].pSession->SendPetEquipData( vPet );
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void CDNGameRoom::SendSkillData( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( m_VecMember.empty() )
|
||
return;
|
||
|
||
std::vector<TPartyMemberSkill> vSkill;
|
||
vSkill.reserve( m_VecMember.size() );
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
TPartyMemberSkill MemberSkill;
|
||
memset( &MemberSkill, 0, sizeof(MemberSkill) );
|
||
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
MemberSkill.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
for( int j=0; j<SKILLMAX; j++ )
|
||
{
|
||
if( m_VecMember[i].pSession->GetSkillData()->SkillList[j].nSkillID <= 0 )
|
||
continue;
|
||
|
||
// <20><>ȣ<EFBFBD><C8A3> <20><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD>, <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>.
|
||
if( m_VecMember[i].pSession->GetSkillData()->SkillList[j].cSkillLevel < 1 )
|
||
continue;
|
||
|
||
//// <20>нú<D0BD> Ÿ<><C5B8> <20><> <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> <20><>.
|
||
//if( CDnSkill::GetSkillType( m_VecMember[i].pSession->GetSkillData()->SkillList[j].nSkillID ) != CDnSkill::Passive &&
|
||
// CDnSkill::GetSkillType( m_VecMember[i].pSession->GetSkillData()->SkillList[j].nSkillID ) != CDnSkill::EnchantPassive )
|
||
// continue;
|
||
|
||
MemberSkill.SkillArray[MemberSkill.cCount] = m_VecMember[i].pSession->GetSkillData()->SkillList[j];
|
||
++MemberSkill.cCount;
|
||
}
|
||
vSkill.push_back( MemberSkill );
|
||
}
|
||
|
||
if( pBreakIntoSession )
|
||
{
|
||
pBreakIntoSession->SendSkillData( vSkill );
|
||
}
|
||
else
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
m_VecMember[i].pSession->SendSkillData( vSkill );
|
||
}
|
||
}
|
||
|
||
|
||
void CDNGameRoom::SendEtcData( CDNUserSession *pBreakIntoSession )
|
||
{
|
||
if( m_VecMember.empty() )
|
||
return;
|
||
|
||
std::vector<TPartyEtcData> vEtcData;
|
||
vEtcData.reserve( m_VecMember.size() );
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
TPartyEtcData EtcData;
|
||
memset( &EtcData, 0, sizeof(EtcData) );
|
||
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
EtcData.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
EtcData.nSelectAppellation = m_VecMember[i].pSession->GetSelectAppellation();
|
||
EtcData.nCoverAppellation = m_VecMember[i].pSession->GetCoverAppellation();
|
||
EtcData.cGMTrace = m_VecMember[i].pSession->bIsGMTrace() ? 1 : 0;
|
||
#if defined(PRE_ADD_VIP)
|
||
EtcData.bVIP = m_VecMember[i].pSession->IsVIP();
|
||
#endif // #if defined(PRE_ADD_VIP)
|
||
EtcData.cAccountLevel = m_VecMember[i].pSession->GetAccountLevel();
|
||
vEtcData.push_back(EtcData);
|
||
}
|
||
|
||
if( pBreakIntoSession )
|
||
{
|
||
pBreakIntoSession->SendPartyEtcData( vEtcData );
|
||
#if defined( PRE_ADD_VIP_FARM )
|
||
if( pBreakIntoSession->GetEffectRepository() )
|
||
pBreakIntoSession->GetEffectRepository()->SendEffectItem();
|
||
#endif // #if defined( PRE_ADD_VIP_FARM )
|
||
}
|
||
else
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
m_VecMember[i].pSession->SendPartyEtcData( vEtcData );
|
||
#if defined( PRE_ADD_VIP_FARM )
|
||
if( m_VecMember[i].pSession->GetEffectRepository() )
|
||
m_VecMember[i].pSession->GetEffectRepository()->SendEffectItem();
|
||
#endif // #if defined( PRE_ADD_VIP_FARM )
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void CDNGameRoom::SendSecondAuthInfo( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( pBreakIntoSession )
|
||
{
|
||
pBreakIntoSession->SendSecondAuthInfo( pBreakIntoSession->bIsSetSecondAuthPW(), pBreakIntoSession->bIsSetSecondAuthLock() );
|
||
}
|
||
else
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
CDNUserSession* pSession = m_VecMember[i].pSession;
|
||
if( pSession )
|
||
{
|
||
pSession->SendSecondAuthInfo( pSession->bIsSetSecondAuthPW(), pSession->bIsSetSecondAuthLock() );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendMaxLevelCharacterCount( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( pBreakIntoSession )
|
||
{
|
||
pBreakIntoSession->SendMaxLevelCharacterCount( pBreakIntoSession->GetMaxLevelCharacterCount() );
|
||
}
|
||
else
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
CDNUserSession* pSession = m_VecMember[i].pSession;
|
||
if( pSession )
|
||
{
|
||
pSession->SendMaxLevelCharacterCount( pSession->GetMaxLevelCharacterCount() );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendCompleteGameReady( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( pBreakIntoSession )
|
||
{
|
||
if( bIsPvPRoom() )
|
||
{
|
||
pBreakIntoSession->SendStartStage( m_bDirectConnect, m_iMapIdx, m_iGateIdx, m_iRandomSeed, m_StageDifficulty, 0);
|
||
}
|
||
else
|
||
{
|
||
if( m_pGameTask)
|
||
{
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
TEvent * pEvent = GetApplyEventType(WorldEvent::EVENT5);
|
||
#else
|
||
TEvent * pEvent = GetApplyEvent(_EVENT_1_DROPITEM);
|
||
#endif //#if defined(PRE_ADD_WORLD_EVENT)
|
||
pBreakIntoSession->SendStartStage( true, m_pGameTask->GetMapTableID(), m_pGameTask->GetStartPositionIndex(), m_iRandomSeed, m_StageDifficulty, pEvent == NULL ? 0 : pEvent->nAtt1);
|
||
}
|
||
else
|
||
_DANGER_POINT();
|
||
}
|
||
#if defined(PRE_ADD_VIP)
|
||
pBreakIntoSession->SendVIPInfo(pBreakIntoSession->m_nVIPTotalPoint, pBreakIntoSession->m_tVIPEndDate, pBreakIntoSession->m_bVIPAutoPay, pBreakIntoSession->m_bVIP);
|
||
#endif // #if defined(PRE_ADD_VIP)
|
||
}
|
||
else
|
||
{
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
TEvent * pEvent = GetApplyEventType(WorldEvent::EVENT5);
|
||
#else
|
||
TEvent * pEvent = GetApplyEvent(_EVENT_1_DROPITEM);
|
||
#endif //#if defined(PRE_ADD_WORLD_EVENT)
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
m_VecMember[i].pSession->SendStartStage(m_bDirectConnect, m_iMapIdx, m_iGateIdx, m_iRandomSeed, m_StageDifficulty, pEvent == NULL ? 0 : pEvent->nAtt1);
|
||
|
||
#if defined(PRE_ADD_VIP)
|
||
GetUserData(i)->SendVIPInfo(GetUserData(i)->m_nVIPTotalPoint, GetUserData(i)->m_tVIPEndDate, GetUserData(i)->m_bVIPAutoPay, GetUserData(i)->m_bVIP);
|
||
#endif // #if defined(PRE_ADD_VIP)
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendGuildData( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if (m_VecMember.empty()) {
|
||
return;
|
||
}
|
||
|
||
std::vector<TPartyMemberGuild::TPartyMemberGuildView> vMemberGuildView;
|
||
vMemberGuildView.reserve( m_VecMember.size() );
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
TPartyMemberGuild::TPartyMemberGuildView MemberGuildView;
|
||
MemberGuildView.Set( m_VecMember[i].pSession->GetSessionID(), m_VecMember[i].pSession->GetGuildSelfView() );
|
||
vMemberGuildView.push_back( MemberGuildView );
|
||
}
|
||
|
||
if (pBreakIntoSession)
|
||
{
|
||
pBreakIntoSession->SendPartyGuildData( vMemberGuildView );
|
||
}
|
||
else
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
m_VecMember[i].pSession->SendPartyGuildData( vMemberGuildView );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendMasterSystemSimpleInfo( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( pBreakIntoSession )
|
||
{
|
||
pBreakIntoSession->SendMasterSystemSimpleInfo( const_cast<TMasterSystemSimpleInfo&>(pBreakIntoSession->GetMasterSystemData()->SimpleInfo) );
|
||
}
|
||
else
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
m_VecMember[i].pSession->SendMasterSystemSimpleInfo( const_cast<TMasterSystemSimpleInfo&>(m_VecMember[i].pSession->GetMasterSystemData()->SimpleInfo) );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendMasterSystemCountInfo( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
MasterSystem::CRewardSystem::TCountInfo CountInfo;
|
||
|
||
if( pBreakIntoSession )
|
||
{
|
||
m_pMasterRewardSystem->GetCountInfo( pBreakIntoSession, CountInfo );
|
||
pBreakIntoSession->SendMasterSystemCountInfo( CountInfo.iMasterCount, CountInfo.iPupilCount, CountInfo.iClassmateCount );
|
||
}
|
||
else
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
m_pMasterRewardSystem->GetCountInfo( m_VecMember[i].pSession, CountInfo );
|
||
m_VecMember[i].pSession->SendMasterSystemCountInfo( CountInfo.iMasterCount, CountInfo.iPupilCount, CountInfo.iClassmateCount );
|
||
}
|
||
}
|
||
}
|
||
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
||
void CDNGameRoom::SendReputationList( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( pBreakIntoSession )
|
||
{
|
||
_ASSERT( pBreakIntoSession->GetReputationSystem() && pBreakIntoSession->GetReputationSystem()->GetEventHandler() );
|
||
pBreakIntoSession->GetReputationSystem()->GetEventHandler()->OnConnect( 0, true );
|
||
}
|
||
else
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
_ASSERT( m_VecMember[i].pSession->GetReputationSystem() && m_VecMember[i].pSession->GetReputationSystem()->GetEventHandler() );
|
||
m_VecMember[i].pSession->GetReputationSystem()->GetEventHandler()->OnConnect( 0, true );
|
||
}
|
||
}
|
||
}
|
||
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
||
|
||
#if defined (PRE_ADD_BESTFRIEND)
|
||
void CDNGameRoom::SendBestFriendData( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if (m_VecMember.empty())
|
||
return;
|
||
|
||
std::vector<TPartyBestFriend> vMemberBestFriend;
|
||
vMemberBestFriend.reserve(m_VecMember.size());
|
||
|
||
for (UINT i=0; i<m_VecMember.size(); i++)
|
||
{
|
||
TPartyBestFriend MemberBestFriend = {0,};
|
||
MemberBestFriend.nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
|
||
TBestFriendInfo& Info = m_VecMember[i].pSession->GetBestFriend()->GetInfo();
|
||
MemberBestFriend.biBFItemSerial = Info.biItemSerial;
|
||
_wcscpy(MemberBestFriend.wszBFName, _countof(MemberBestFriend.wszBFName), Info.wszName, (int)wcslen(Info.wszName));
|
||
|
||
vMemberBestFriend.push_back( MemberBestFriend );
|
||
}
|
||
|
||
if (pBreakIntoSession)
|
||
{
|
||
pBreakIntoSession->SendPartyBestFriend( vMemberBestFriend );
|
||
}
|
||
else
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
m_VecMember[i].pSession->SendPartyBestFriend( vMemberBestFriend );
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
|
||
void CDNGameRoom::SendPartyEffectSkillItemData( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if ( !pBreakIntoSession || m_VecMember.empty())
|
||
return;
|
||
|
||
for (UINT i=0; i<m_VecMember.size(); i++)
|
||
{
|
||
if( m_VecMember[i].pSession && m_VecMember[i].pSession->GetSessionID() != pBreakIntoSession->GetSessionID() )
|
||
{
|
||
std::vector<TEffectSkillData> vEffectSkill;
|
||
vEffectSkill.clear();
|
||
m_VecMember[i].pSession->GetItem()->GetEffectSkillItem( vEffectSkill);
|
||
pBreakIntoSession->SendEffectSkillItemData(m_VecMember[i].pSession->GetSessionID(), vEffectSkill, false);
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
|
||
void CDNGameRoom::SendTotalLevelSkillInfo( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if ( !pBreakIntoSession || m_VecMember.empty())
|
||
return;
|
||
|
||
int* nTotalLevelSkillData = pBreakIntoSession->GetTotalLevelSkillData();
|
||
|
||
pBreakIntoSession->SendTotalLevel(pBreakIntoSession->GetSessionID(), pBreakIntoSession->GetTotalLevelSkillLevel());
|
||
for(int i=0;i<TotalLevelSkill::Common::MAXSLOTCOUNT;i++)
|
||
{
|
||
if(g_pDataManager->bIsTotalLevelSkillCashSlot(i))
|
||
pBreakIntoSession->SendTotalLevelSkillCashSlot(pBreakIntoSession->GetSessionID(), i, pBreakIntoSession->bIsTotalLevelSkillCashSlot(i), pBreakIntoSession->GetTotalLevelSkillCashSlot(i));
|
||
}
|
||
pBreakIntoSession->SendTotalLevelSkillList(pBreakIntoSession->GetSessionID(), nTotalLevelSkillData);
|
||
}
|
||
#endif
|
||
|
||
#if defined(_HSHIELD)
|
||
void CDNGameRoom::SendMakeReq()
|
||
{
|
||
if (m_VecMember.empty()) return;
|
||
|
||
for(DWORD i=0; i < m_VecMember.size(); i++){
|
||
if (m_VecMember[i].pSession->GetAccountLevel() != AccountLevel_Developer){ // <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20>ƴϸ<C6B4>
|
||
m_VecMember[i].pSession->SendMakeRequest(); // crc<72><63>û
|
||
}
|
||
}
|
||
}
|
||
|
||
#elif defined(_GPK)
|
||
void CDNGameRoom::SendGPKCode()
|
||
{
|
||
if (m_VecMember.empty()) return;
|
||
if (m_bGPKCodeFlag) return;
|
||
m_bGPKCodeFlag = true;
|
||
ULONG nCurTick = timeGetTime();
|
||
|
||
for(DWORD i=0; i < m_VecMember.size(); i++)
|
||
{
|
||
m_VecMember[i].pSession->SendGPKCode();
|
||
m_VecMember[i].pSession->SendGPKAuthData();
|
||
|
||
m_VecMember[i].pSession->SendGPKData();
|
||
m_VecMember[i].pSession->SetCheckGPKTick(nCurTick);
|
||
m_VecMember[i].pSession->SetRecvGPKTick(nCurTick);
|
||
}
|
||
}
|
||
#endif // _HSHIELD
|
||
|
||
float CDNGameRoom::GetEventExpWhenMonsterDie(float fExp, bool bFriendBonus, char cClassID, BYTE cJobID)
|
||
{
|
||
if( fExp <= 0.f )
|
||
return 0.f;
|
||
|
||
time_t Time;
|
||
time(&Time);
|
||
|
||
float fEvent = 0.0f;
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
DNVector(TEvent)::iterator ii;
|
||
for (ii = m_EventList.begin(); ii != m_EventList.end(); ii++)
|
||
{
|
||
if (Time >= (*ii)._tBeginTime && Time <= (*ii)._tEndTime)
|
||
{
|
||
switch ((*ii).nEventType2)
|
||
{
|
||
case WorldEvent::EVENT1 : //1. <20><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ(<28><>Ƽ)
|
||
{
|
||
if( (*ii).nEventType1 == 0 || (*ii).nEventType1 == cClassID )
|
||
{
|
||
if (GetUserCount() >= (DWORD)(*ii).nAtt1)
|
||
fEvent += (float)((fExp * (float)((float)((*ii).nAtt2)/100)) + 0.5f);
|
||
}
|
||
break;
|
||
}
|
||
case WorldEvent::EVENT2 : //2. <20><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ
|
||
{
|
||
if( (*ii).nEventType1 == 0 || (*ii).nEventType1 == cClassID )
|
||
{
|
||
fEvent += (float)((fExp * (float)((float)((*ii).nAtt1)/100)) + 0.5f);
|
||
}
|
||
break;
|
||
}
|
||
case WorldEvent::EVENT9 : //9. <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD>
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
if (m_PartyStructData.iUpkeepCount > 0)
|
||
#else
|
||
if (m_nUpkeepCount > 0)
|
||
#endif
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
int nRate = (*ii).nAtt1 * m_PartyStructData.iUpkeepCount;
|
||
#else
|
||
int nRate = (*ii).nAtt1 * m_nUpkeepCount;
|
||
#endif
|
||
nRate = nRate > (*ii).nAtt2 ? (*ii).nAtt2 : nRate;
|
||
fEvent += (float)((fExp * (float)((float)(nRate)/100)) + 0.5f);
|
||
}
|
||
break;
|
||
}
|
||
case WorldEvent::EVENT10 : //10. ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ
|
||
{
|
||
if (bFriendBonus){
|
||
int nFriendExp = (*ii).nAtt1;
|
||
fEvent += (float)((fExp * (float)((float)(nFriendExp)/100)) + 0.5f);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#else //#if defined(PRE_ADD_WORLD_EVENT)
|
||
DNVector(TEvent)::iterator ii;
|
||
for (ii = m_EventList.begin(); ii != m_EventList.end(); ii++)
|
||
{
|
||
if (Time >= (*ii)._tBeginTime && Time <= (*ii)._tEndTime && (*ii).nEventType1 == _EVENT_1_EXP && (*ii).nEventType2 == _EVENT_2_MONSTERDIE)
|
||
{
|
||
switch ((*ii).nEventType3)
|
||
{
|
||
case _EVENT_3_NONE: fEvent += (float)((fExp * (float)((float)((*ii).nAtt1)/100)) + 0.5f); break;
|
||
case _EVENT_3_PARTY:
|
||
{
|
||
if (GetUserCount() >= (DWORD)(*ii).nAtt1)
|
||
fEvent += (float)((fExp * (float)((float)((*ii).nAtt2)/100)) + 0.5f);
|
||
break;
|
||
}
|
||
case _EVENT_3_UPKEEPPARTY:
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
if (m_PartyStructData.iUpkeepCount > 0)
|
||
#else
|
||
if (m_nUpkeepCount > 0)
|
||
#endif
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
int nRate = (*ii).nAtt1 * m_PartyStructData.iUpkeepCount;
|
||
#else
|
||
int nRate = (*ii).nAtt1 * m_nUpkeepCount;
|
||
#endif
|
||
nRate = nRate > (*ii).nAtt2 ? (*ii).nAtt2 : nRate;
|
||
fEvent += (float)((fExp * (float)((float)(nRate)/100)) + 0.5f);
|
||
}
|
||
break;
|
||
}
|
||
case _EVENT_3_FRIENDPARTY:
|
||
{
|
||
if (bFriendBonus){
|
||
int nFriendExp = (*ii).nAtt1;
|
||
fEvent += (float)((fExp * (float)((float)(nFriendExp)/100)) + 0.5f);
|
||
}
|
||
break;
|
||
}
|
||
case _EVENT_3_CLASSEXP:
|
||
{
|
||
int nRate = 0;
|
||
// nAtt1 Ŭ<><C5AC><EFBFBD><EFBFBD> ID, nAtt2 Job ID, nAtt3 <20><><EFBFBD><EFBFBD>ġ %
|
||
if( cClassID == (*ii).nAtt1 )
|
||
{
|
||
if( (*ii).nAtt2 == 0 || cJobID == (*ii).nAtt2 )
|
||
nRate = (*ii).nAtt3;
|
||
}
|
||
if( nRate )
|
||
fEvent += (float)((fExp * (float)((float)(nRate)/100)) + 0.5f);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif // #if defined(PRE_ADD_WORLD_EVENT)
|
||
return fEvent;
|
||
}
|
||
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
int CDNGameRoom::GetEventType(int nType, char cClassID)
|
||
{
|
||
time_t Time;
|
||
time(&Time);
|
||
|
||
DNVector(TEvent)::iterator ii;
|
||
for (ii = m_EventList.begin(); ii != m_EventList.end(); ii++)
|
||
{
|
||
if (Time >= (*ii)._tBeginTime && Time <= (*ii)._tEndTime)
|
||
{
|
||
if ((*ii).nEventType2 == nType)
|
||
{
|
||
if( (*ii).nEventType1 == 0 || cClassID == 0 || (*ii).nEventType1 == cClassID )
|
||
return (*ii).nAtt1;
|
||
}
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
TEvent * CDNGameRoom::GetApplyEventType(int nType)
|
||
{
|
||
time_t Time;
|
||
time(&Time);
|
||
|
||
DNVector(TEvent)::iterator ii;
|
||
for (ii = m_EventList.begin(); ii != m_EventList.end(); ii++)
|
||
{
|
||
if (Time >= (*ii)._tBeginTime && Time <= (*ii)._tEndTime && (*ii).nEventType2 == nType)
|
||
return &(*ii);
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
#else
|
||
TEvent * CDNGameRoom::GetApplyEvent(int nEventType, int nEventType2, int nEventType3)
|
||
{
|
||
time_t Time;
|
||
time(&Time);
|
||
|
||
DNVector(TEvent)::iterator ii;
|
||
for (ii = m_EventList.begin(); ii != m_EventList.end(); ii++)
|
||
if (Time >= (*ii)._tBeginTime && Time <= (*ii)._tEndTime && (*ii).nEventType1 == nEventType && (*ii).nEventType2 == nEventType2 && (*ii).nEventType3 == nEventType3)
|
||
return &(*ii);
|
||
return NULL;
|
||
}
|
||
#endif
|
||
|
||
bool CDNGameRoom::GetExtendDropRateIgnoreTime(int &nRate)
|
||
{
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD>ó<EFBFBD><C3B3> GetEvent<6E><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<D1B4> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>;<EFBFBD><CDBE><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20>ð<EFBFBD><C3B0>˻縦 <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
||
DNVector(TEvent)::iterator ii;
|
||
for (ii = m_EventList.begin(); ii != m_EventList.end(); ii++)
|
||
{
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
if ((*ii).nEventType2 == WorldEvent::EVENT5)
|
||
#else
|
||
if ((*ii).nEventType1 == _EVENT_1_DROPITEM)
|
||
#endif
|
||
{
|
||
TEvent * pEvent = &(*ii);
|
||
nRate = pEvent->nAtt1;
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void CDNGameRoom::GetEventExpWhenStageClear(CDNUserSession * pSession, int nCalcVal, BYTE &cCount, sEventStageClearBonus * pBonus)
|
||
{
|
||
time_t Time;
|
||
time(&Time);
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
/*
|
||
#if defined(_CH)
|
||
// ekey, ecard
|
||
int nEkey = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::CLEAR_EXP_EKEYECARD );
|
||
if( nEkey > 0 )
|
||
{
|
||
if (pSession->CheckSndaAuthFlag(eChSndaAuthFlag_UseEKey) || pSession->CheckSndaAuthFlag(eChSndaAuthFlag_UseECard))
|
||
{
|
||
pBonus[cCount].nType = _EVENT_3_EKEYANDECARD;
|
||
pBonus[cCount].nClearEventBonusExperience = (int)(((float)nCalcVal * (float)((float)(nEkey)/100)) + 0.5f);
|
||
cCount++;
|
||
}
|
||
}
|
||
#endif //#if defined(_CH)
|
||
*/
|
||
DNVector(TEvent)::iterator ii;
|
||
for (ii = m_EventList.begin(); ii != m_EventList.end(); ii++)
|
||
{
|
||
if (Time >= (*ii)._tBeginTime && Time <= (*ii)._tEndTime )
|
||
{
|
||
switch ((*ii).nEventType2)
|
||
{
|
||
case WorldEvent::EVENT3 : //3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ
|
||
{
|
||
if( (*ii).nEventType1 == 0 || (*ii).nEventType1 == pSession->GetClassID() )
|
||
{
|
||
pBonus[cCount].nType = WorldEvent::EVENT3;
|
||
pBonus[cCount].nClearEventBonusExperience = (int)(((float)nCalcVal * (float)((float)((*ii).nAtt1)/100)) + 0.5f);
|
||
cCount++;
|
||
}
|
||
break;
|
||
}
|
||
case WorldEvent::EVENT8 ://8. 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
if( pSession->bIsSetSecondAuthPW() && ((*ii).nEventType1 == 0 || (*ii).nEventType1 == pSession->GetClassID()) )
|
||
{
|
||
pBonus[cCount].nType = WorldEvent::EVENT8;
|
||
pBonus[cCount].nClearEventBonusExperience = (int)(((float)nCalcVal * (float)((float)((*ii).nAtt1)/100)) + 0.5f);
|
||
cCount++;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#else // #if defined(PRE_ADD_WORLD_EVENT)
|
||
|
||
DNVector(TEvent)::iterator ii;
|
||
for (ii = m_EventList.begin(); ii != m_EventList.end(); ii++)
|
||
{
|
||
if (Time >= (*ii)._tBeginTime && Time <= (*ii)._tEndTime && (*ii).nEventType1 == _EVENT_1_EXP && (*ii).nEventType2 == _EVENT_2_CLEAR)
|
||
{
|
||
switch ((*ii).nEventType3)
|
||
{
|
||
case _EVENT_3_SECONDAUTH:
|
||
{
|
||
if (pSession->bIsSetSecondAuthPW())
|
||
{
|
||
pBonus[cCount].nType = _EVENT_3_SECONDAUTH;
|
||
pBonus[cCount].nClearEventBonusExperience = (int)(((float)nCalcVal * (float)((float)((*ii).nAtt1)/100)) + 0.5f);
|
||
cCount++;
|
||
}
|
||
break;
|
||
}
|
||
case _EVENT_3_EKEYANDECARD:
|
||
{
|
||
#if defined (_CH)
|
||
if (pSession->CheckSndaAuthFlag(eChSndaAuthFlag_UseEKey) || pSession->CheckSndaAuthFlag(eChSndaAuthFlag_UseECard))
|
||
{
|
||
pBonus[cCount].nType = _EVENT_3_EKEYANDECARD;
|
||
pBonus[cCount].nClearEventBonusExperience = (int)(((float)nCalcVal * (float)((float)((*ii).nAtt1)/100)) + 0.5f);
|
||
cCount++;
|
||
}
|
||
#endif
|
||
break;
|
||
}
|
||
case _EVENT_3_CLASSEXP:
|
||
{
|
||
|
||
int nRate = 0;
|
||
// nAtt1 Ŭ<><C5AC><EFBFBD><EFBFBD> ID, nAtt2 Job ID, nAtt3 <20><><EFBFBD><EFBFBD>ġ %
|
||
if( pSession->GetClassID() == (*ii).nAtt1 )
|
||
{
|
||
if( (*ii).nAtt2 == 0 || pSession->GetUserJob() == (*ii).nAtt2 )
|
||
nRate = (*ii).nAtt3;
|
||
}
|
||
if( nRate )
|
||
{
|
||
pBonus[cCount].nType = _EVENT_3_CLASSEXP;
|
||
pBonus[cCount].nClearEventBonusExperience = (int)(((float)nCalcVal * (float)((float)(nRate)/100)) + 0.5f);
|
||
cCount++;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (cCount >= EVENTCLEARBONUSMAX)
|
||
break;
|
||
}
|
||
}
|
||
#endif //#if defined(PRE_ADD_WORLD_EVENT)
|
||
}
|
||
|
||
|
||
void CDNGameRoom::GetAppliedEventValue(int &nDropRate, int &nUpkeepRate, int &nFriendBonusRate, bool * pUpkeepMax)
|
||
{
|
||
time_t Time;
|
||
time(&Time);
|
||
|
||
DNVector(TEvent)::iterator ii;
|
||
for (ii = m_EventList.begin(); ii != m_EventList.end(); ii++)
|
||
{
|
||
if (Time >= (*ii)._tBeginTime && Time <= (*ii)._tEndTime)
|
||
{
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
switch ((*ii).nEventType2)
|
||
{
|
||
case WorldEvent::EVENT5 : //5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>:
|
||
{
|
||
nDropRate = (*ii).nAtt1;
|
||
break;
|
||
}
|
||
case WorldEvent::EVENT9 : //9. <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD>_EVENT_1_EXP:
|
||
{
|
||
if (GetUserCount() > 1)
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
nUpkeepRate = (*ii).nAtt1 * m_PartyStructData.iUpkeepCount;
|
||
#else
|
||
nUpkeepRate = (*ii).nAtt1 * m_nUpkeepCount;
|
||
#endif
|
||
if (nUpkeepRate > (*ii).nAtt2)
|
||
{
|
||
if (pUpkeepMax)
|
||
*pUpkeepMax = true;
|
||
nUpkeepRate = (*ii).nAtt2;
|
||
}
|
||
}
|
||
else
|
||
nUpkeepRate = 0;
|
||
}
|
||
break;
|
||
case WorldEvent::EVENT10 : //10. ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ
|
||
{
|
||
nFriendBonusRate = (*ii).nAtt1;
|
||
}
|
||
break;
|
||
}
|
||
#else //#if defined(PRE_ADD_WORLD_EVENT)
|
||
switch ((*ii).nEventType1)
|
||
{
|
||
case _EVENT_1_DROPITEM:
|
||
{
|
||
nDropRate = (*ii).nAtt1;
|
||
break;
|
||
}
|
||
case _EVENT_1_EXP:
|
||
{
|
||
if ((*ii).nEventType2 == _EVENT_2_MONSTERDIE)
|
||
{
|
||
if ((*ii).nEventType3 == _EVENT_3_UPKEEPPARTY)
|
||
{
|
||
if (GetUserCount() > 1)
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
nUpkeepRate = (*ii).nAtt1 * m_PartyStructData.iUpkeepCount;
|
||
#else
|
||
nUpkeepRate = (*ii).nAtt1 * m_nUpkeepCount;
|
||
#endif
|
||
if (nUpkeepRate > (*ii).nAtt2)
|
||
{
|
||
if (pUpkeepMax)
|
||
*pUpkeepMax = true;
|
||
nUpkeepRate = (*ii).nAtt2;
|
||
}
|
||
}
|
||
else
|
||
nUpkeepRate = 0;
|
||
}
|
||
else if ((*ii).nEventType3 == _EVENT_3_FRIENDPARTY)
|
||
{
|
||
nFriendBonusRate = (*ii).nAtt1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif //#if defined(PRE_ADD_WORLD_EVENT)
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::CheckFriendBonus(UINT nDelSessionID)
|
||
{
|
||
//if (m_VecMember.size() <= 1) return;
|
||
#if defined(PRE_ADD_WORLD_EVENT)
|
||
if ( GetApplyEventType( WorldEvent::EVENT10 ) == NULL ) return;
|
||
#else
|
||
if (GetApplyEvent(_EVENT_1_EXP, _EVENT_2_MONSTERDIE, _EVENT_3_FRIENDPARTY) == NULL) return;
|
||
#endif
|
||
|
||
for(DWORD i=0; i < m_VecMember.size(); i++)
|
||
{
|
||
bool bCheck = false;
|
||
if (nDelSessionID != m_VecMember[i].pSession->GetSessionID()) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>༮<EFBFBD≯<EFBFBD> <20>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> false<73><65>
|
||
{
|
||
CDNFriend * pFriend = m_VecMember[i].pSession->GetFriend();
|
||
for(DWORD j=0; j < m_VecMember.size(); j++)
|
||
{
|
||
if (m_VecMember[j].pSession->GetSessionID() == nDelSessionID) continue; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>༮<EFBFBD><E0BCAE> <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20>о<EFBFBD>~
|
||
|
||
CDNFriend * pTempFriend = m_VecMember[j].pSession->GetFriend();
|
||
if (pTempFriend == NULL) continue;
|
||
|
||
if (pFriend->HasFriend(m_VecMember[j].pSession->GetCharacterDBID()) && pTempFriend->HasFriend(m_VecMember[i].pSession->GetCharacterDBID()))
|
||
{
|
||
bCheck = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
m_VecMember[i].pSession->SetFriendBonus(bCheck);
|
||
}
|
||
}
|
||
|
||
#ifdef PRE_ADD_BEGINNERGUILD
|
||
void CDNGameRoom::CheckBeginnerGuildBonus()
|
||
{
|
||
m_PartyStructData.bPartyBeginnerGuild = false;
|
||
|
||
CDNUserSession * pUser = NULL;
|
||
int nBegginerGuildCount = 0;
|
||
DNVector(PartyStruct)::iterator ii;
|
||
CDNGuildBase * pGuild = NULL;
|
||
for(ii = m_VecMember.begin(); ii != m_VecMember.end(); ii++)
|
||
{
|
||
pUser = (*ii).pSession;
|
||
if (pUser == NULL) continue;
|
||
if (pUser->bIsGMTrace()) continue;
|
||
|
||
pUser->m_bPartyBegginerGuild = false;
|
||
|
||
if (pUser->GetGuildUID().IsSet() == false)
|
||
continue;
|
||
|
||
pGuild = g_pGuildManager->At(pUser->GetGuildUID());
|
||
if (pGuild)
|
||
{
|
||
#if !defined( PRE_ADD_NODELETEGUILD )
|
||
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
|
||
if (TRUE == pGuild->IsEnable())
|
||
{
|
||
if (pGuild->GetInfo()->cGuildType == BeginnerGuild::Type::Beginner && pGuild->IsMemberExist(pUser->GetCharacterDBID()))
|
||
{
|
||
nBegginerGuildCount++;
|
||
pUser->m_bPartyBegginerGuild = true;
|
||
}
|
||
}
|
||
#else //#if !defined( PRE_ADD_NODELETEGUILD )
|
||
if (pGuild->GetInfo()->cGuildType == BeginnerGuild::Type::Beginner && pGuild->IsMemberExist(pUser->GetCharacterDBID()))
|
||
{
|
||
nBegginerGuildCount++;
|
||
pUser->m_bPartyBegginerGuild = true;
|
||
}
|
||
#endif //#if !defined( PRE_ADD_NODELETEGUILD )
|
||
}
|
||
}
|
||
|
||
if (nBegginerGuildCount >= 2)
|
||
m_PartyStructData.bPartyBeginnerGuild = true;
|
||
}
|
||
#endif //#ifdef PRE_ADD_BEGINNERGUILD
|
||
|
||
void CDNGameRoom::UpdateAppliedEventValue()
|
||
{
|
||
CheckFriendBonus();
|
||
#ifdef PRE_ADD_BEGINNERGUILD
|
||
int nDropRate = 0, nUpkeepRate = 0, nFriendRate = 0, nBeginnerGuildRate = 0;
|
||
#else //#ifdef PRE_ADD_BEGINNERGUILD
|
||
int nDropRate = 0, nUpkeepRate = 0, nFriendRate = 0;
|
||
#endif //#ifdef PRE_ADD_BEGINNERGUILD
|
||
bool bMax = false;
|
||
GetAppliedEventValue(nDropRate, nUpkeepRate, nFriendRate, &bMax);
|
||
#ifdef PRE_ADD_BEGINNERGUILD
|
||
CheckBeginnerGuildBonus();
|
||
nBeginnerGuildRate = m_PartyStructData.bPartyBeginnerGuild == true ? BeginnerGuild::Common::PartyBonusRate : 0;
|
||
#endif //#ifdef PRE_ADD_BEGINNERGUILD
|
||
|
||
for( DWORD i=0; i<GetUserCount(); i++ )
|
||
{
|
||
#ifdef PRE_ADD_BEGINNERGUILD
|
||
GetUserData(i)->SendPartyBonusValue(nUpkeepRate, nFriendRate, bMax, nBeginnerGuildRate);
|
||
#else //#ifdef PRE_ADD_BEGINNERGUILD
|
||
GetUserData(i)->SendPartyBonusValue(nUpkeepRate, nFriendRate, bMax);
|
||
#endif //#ifdef PRE_ADD_BEGINNERGUILD
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::ResetCompleteExperience()
|
||
{
|
||
m_nCompleteExperience = 0;
|
||
}
|
||
|
||
void CDNGameRoom::AddCompleteExperience( int nValue )
|
||
{
|
||
m_nCompleteExperience += nValue;
|
||
}
|
||
|
||
int CDNGameRoom::GetCompleteExperience()
|
||
{
|
||
return m_nCompleteExperience;
|
||
}
|
||
|
||
void CDNGameRoom::ResetDungeonPlayTime()
|
||
{
|
||
m_dwDungeonPlayerTime = 0;
|
||
}
|
||
|
||
void CDNGameRoom::AddDungeonPlayTime( DWORD dwValue )
|
||
{
|
||
m_dwDungeonPlayerTime += dwValue;
|
||
}
|
||
|
||
DWORD CDNGameRoom::GetDungeonPlayTime()
|
||
{
|
||
return m_dwDungeonPlayerTime;
|
||
}
|
||
|
||
#if defined( PRE_ADD_58761 )
|
||
void CDNGameRoom::StartDungeonGateTime(int nGateID)
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD>
|
||
GetDBConnection()->QueryAddNestGateStartLog( GetDBThreadID(), GetWorldSetID(), 0, GetRoomLogIndex(), static_cast<BYTE>(GetUserCount()), nGateID );
|
||
m_nDungeonGateID = nGateID;
|
||
}
|
||
|
||
void CDNGameRoom::EndDungeonGateTime(int nGateID, bool bClearFlag/*=false*/)
|
||
{
|
||
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD>
|
||
#if defined( _WORK )
|
||
if(m_nDungeonGateID != nGateID )
|
||
g_Log.Log( LogType::_ERROR, L"api_trigger_EndDungeonGateTime Error ServerGateNumber:%d ApiGateNumber:%d", m_nDungeonGateID, nGateID );
|
||
#endif
|
||
|
||
if (GetDBConnection())
|
||
{
|
||
CDNUserSession * pUser;
|
||
for (int i = 0; i < (int)GetUserCount(); i++)
|
||
{
|
||
pUser = GetUserData(i);
|
||
if (pUser == NULL) continue;
|
||
GetDBConnection()->QueryAddNestGateClearLog( GetDBThreadID(), GetWorldSetID(), 0, GetRoomLogIndex(), bClearFlag, pUser->GetCharacterDBID(), pUser->GetUserJob(), pUser->GetLevel());
|
||
}
|
||
|
||
GetDBConnection()->QueryAddNestGateEndLog( GetDBThreadID(), GetWorldSetID(), 0, GetRoomLogIndex(), static_cast<BYTE>(GetUserCount()));
|
||
}
|
||
// <20>ʱ<EFBFBD>ȭ
|
||
m_nDungeonGateID = 0;
|
||
}
|
||
|
||
void CDNGameRoom::NestDeathLog(CDNUserSession *pSession, int nMonsterID, int nSkillID, BYTE cCharacterJob, BYTE cCharacterLevel)
|
||
{
|
||
if (m_nDungeonGateID > 0)
|
||
GetDBConnection()->QueryNestDeathLog( pSession, GetRoomLogIndex(), nMonsterID, nSkillID, cCharacterJob, cCharacterLevel);
|
||
}
|
||
#endif
|
||
|
||
int CDNGameRoom::GetServerID() const
|
||
{
|
||
return m_pGameServer->GetServerID();
|
||
}
|
||
|
||
#ifdef _USE_VOICECHAT
|
||
void CDNGameRoom::GetUserTalking(TTalkingInfo * pInfo, int &nCount)
|
||
{
|
||
CDNUserSession * pSession = NULL;
|
||
DNVector(PartyStruct):: iterator ii;
|
||
for (ii = m_VecMember.begin(); ii != m_VecMember.end(); ii++)
|
||
{
|
||
pSession = (*ii).pSession;
|
||
if (pSession->IsTalking(&pInfo[nCount].cTalking))
|
||
{
|
||
pInfo[nCount].nSessionID = pSession->GetSessionID();
|
||
nCount++;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::TalkingUpdate(ULONG nCurTick)
|
||
{
|
||
if (m_nVoiceChannelID[0] <= 0) return;
|
||
if (m_nTalkingTick + VOICEUPDATETIME > nCurTick) return;
|
||
|
||
TTalkingInfo Info[PARTYMAX];
|
||
memset(&Info, 0, sizeof(Info));
|
||
int nCount = 0;
|
||
|
||
GetUserTalking(Info, nCount);
|
||
|
||
if (nCount > 0)
|
||
{
|
||
CDNUserSession * pSession = NULL;
|
||
DNVector(PartyStruct):: iterator ii;
|
||
for (ii = m_VecMember.begin(); ii != m_VecMember.end(); ii++)
|
||
{
|
||
pSession = (*ii).pSession;
|
||
pSession->SendTalkingUpdate(nCount, Info);
|
||
}
|
||
}
|
||
m_nTalkingTick = nCurTick;
|
||
}
|
||
|
||
void CDNGameRoom::SendRefreshVoiceInfo(UINT nOutAccountDBID)
|
||
{
|
||
if (m_nVoiceChannelID[0] <= 0) return;
|
||
TVoiceMemberInfo Info[PARTYMAX] = { 0, };
|
||
int nCount = 0;
|
||
|
||
CDNUserSession * pUser;
|
||
for(DWORD i=0; i<GetUserCount(); i++)
|
||
{
|
||
pUser = GetUserData(i);
|
||
if(pUser)
|
||
{
|
||
Info[nCount].nSessionID = pUser->GetSessionID();
|
||
Info[nCount].cVoiceAvailable = pUser->GetVoiceAvailable() == true ? 1 : 0;
|
||
nCount++;
|
||
|
||
if (nOutAccountDBID > 0)
|
||
pUser->SetVoiceMute(nOutAccountDBID, false);
|
||
}
|
||
}
|
||
|
||
UINT nMuteSessionList[PARTYCOUNTMAX];
|
||
CDNUserSession * pTempUser;
|
||
for(DWORD i=0; i<GetUserCount(); i++)
|
||
{
|
||
pUser = GetUserData(i);
|
||
if (pUser)
|
||
{
|
||
pTempUser = NULL;
|
||
memset(nMuteSessionList, 0, sizeof(nMuteSessionList));
|
||
for (int j = 0; j < PARTYCOUNTMAX; j++)
|
||
{
|
||
if (pUser->m_nVoiceMutedList[j] <= 0) continue;
|
||
for(DWORD h=0; h<GetUserCount(); h++)
|
||
{
|
||
pTempUser = GetUserData(h);
|
||
if (pTempUser->GetAccountDBID() == pUser->m_nVoiceMutedList[j])
|
||
nMuteSessionList[j] = pTempUser->GetSessionID();
|
||
}
|
||
}
|
||
pUser->SendVoiceMemberInfoRefresh(nCount, nMuteSessionList, Info);
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
DWORD CDNGameRoom::GetLiveUserCount()
|
||
{
|
||
DWORD dwCount = 0;
|
||
|
||
DnActorHandle hActor;
|
||
for( DWORD i=0; i<GetUserCount(); i++ ) {
|
||
hActor = GetUserData(i)->GetActorHandle();
|
||
if( hActor && !hActor->IsDie() ) dwCount++;
|
||
}
|
||
return dwCount;
|
||
}
|
||
|
||
DWORD CDNGameRoom::GetUserCountWithoutPartyOutUser()
|
||
{
|
||
DWORD dwCount = 0;
|
||
for (int i = 0; i < (int)m_VecMember.size(); i++)
|
||
{
|
||
if (m_VecMember[i].pSession->GetOutedMember() == false)
|
||
dwCount++;
|
||
}
|
||
return dwCount;
|
||
}
|
||
|
||
DWORD CDNGameRoom::GetUserCountWithoutGM()
|
||
{
|
||
DWORD dwCount = 0;
|
||
for (int i = 0; i < (int)m_VecMember.size(); i++)
|
||
{
|
||
if (m_VecMember[i].pSession->bIsGMTrace() == false)
|
||
dwCount++;
|
||
}
|
||
return dwCount;
|
||
}
|
||
|
||
DWORD CDNGameRoom::GetGMCount()
|
||
{
|
||
DWORD dwCount = 0;
|
||
for( DWORD i=0; i<GetUserCount(); i++ )
|
||
{
|
||
if( GetUserData(i) && GetUserData(i)->bIsGMTrace() )
|
||
++dwCount;
|
||
}
|
||
|
||
return dwCount;
|
||
}
|
||
|
||
DWORD CDNGameRoom::GetUserCount( int iTeam )
|
||
{
|
||
DWORD dwCount = 0;
|
||
for( DWORD i=0; i<GetUserCount(); i++ )
|
||
{
|
||
if( GetUserData(i) && GetUserData(i)->GetTeam() == iTeam )
|
||
++dwCount;
|
||
}
|
||
|
||
return dwCount;
|
||
}
|
||
|
||
bool CDNGameRoom::GetOutMemberExist()
|
||
{
|
||
DWORD dwCount = 0;
|
||
for( DWORD i=0; i<GetUserCount(); i++ )
|
||
{
|
||
if(GetUserData(i) && GetUserData(i)->GetOutedMember())
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
DWORD CDNGameRoom::GetPartyUserCount(eGetUserCountType type)
|
||
{
|
||
DWORD dwCount = 0, i = 0;
|
||
|
||
DnActorHandle hActor;
|
||
for (; i<GetUserCount(); i++)
|
||
{
|
||
if (type == ePICKUPITEM)
|
||
{
|
||
CDNUserSession *pSession = GetUserData(i);
|
||
if (pSession)
|
||
{
|
||
hActor = pSession->GetActorHandle();
|
||
if (hActor && !hActor->IsDie()
|
||
#ifdef _CH
|
||
&& (pSession->GetFCMState() == FCMSTATE_NONE) // 3<>ð<EFBFBD> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ޱ<EFBFBD> <20><><EFBFBD><EFBFBD> 090624
|
||
#endif
|
||
)
|
||
dwCount++;
|
||
}
|
||
}
|
||
}
|
||
return dwCount;
|
||
}
|
||
|
||
bool CDNGameRoom::IsItemLootUserValid(DWORD userIdx)
|
||
{
|
||
CDNUserSession *pSession = GetUserData(userIdx);
|
||
if (pSession)
|
||
{
|
||
if( pSession->bIsGMTrace() )
|
||
return false;
|
||
|
||
#ifdef _CH
|
||
if (pSession->GetFCMState() != FCMSTATE_NONE)
|
||
return false;
|
||
#endif
|
||
DnActorHandle hActor = pSession->GetActorHandle();
|
||
if( !hActor || hActor->IsDie() || hActor->bIsObserver() )
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
UINT CDNGameRoom::GetCurrentItemLooterIdx()
|
||
{
|
||
if (m_nCurItemLooterInOrder < 0 || m_nCurItemLooterInOrder >= static_cast<int>(GetUserCount()) || GetUserCount() == 0)
|
||
{
|
||
m_nCurItemLooterInOrder = 0;
|
||
return m_nCurItemLooterInOrder;
|
||
}
|
||
|
||
m_nCurItemLooterInOrder %= GetUserCount();
|
||
|
||
for( int i=m_nCurItemLooterInOrder; i<(int)(GetUserCount()+m_nCurItemLooterInOrder); i++ ) {
|
||
int nIndex = i % GetUserCount();
|
||
if( IsItemLootUserValid( nIndex ) ) {
|
||
m_nCurItemLooterInOrder = (nIndex+1) % GetUserCount();
|
||
return nIndex;
|
||
}
|
||
}
|
||
|
||
_ASSERT(0);
|
||
g_Log.Log(LogType::_ERROR, L"[PARTY] ITEM LOOTING ERROR! NO VALID USER TO LOOT!! party_idx:%d\n", GetPartyIndex());
|
||
return 0;
|
||
}
|
||
|
||
void CDNGameRoom::CheckCurrentItemLooterIdx( PartyStruct *pEraseUser )
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ ) {
|
||
if( pEraseUser == &m_VecMember[i] ) {
|
||
if( m_nCurItemLooterInOrder >= static_cast<int>(i) ) {
|
||
m_nCurItemLooterInOrder--;
|
||
if( m_nCurItemLooterInOrder < 0 ) m_nCurItemLooterInOrder = 0;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendNextVillageInfo(const char * pIP, USHORT nPort, int nMapIndex, int nNextMapIndex, char cNextGateNo, short nRet, INT64 nItemSerial)
|
||
{
|
||
#if defined( PRE_PARTY_DB )
|
||
//<2F><><EFBFBD>⼭ <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||
DelPartyDB();
|
||
#endif
|
||
if (nRet == ERROR_NONE)
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
if (m_VecMember[i].pSession->bIsGMTrace()) continue;
|
||
if (cNextGateNo > 0) m_VecMember[i].pSession->VerifyValidMap(nNextMapIndex);
|
||
|
||
if (!m_VecMember[i].pSession->DeleteWarpVillageItemByUse(nItemSerial))
|
||
continue;
|
||
|
||
m_VecMember[i].pSession->SetNextVillageData(pIP, nPort, nMapIndex, nNextMapIndex, cNextGateNo);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
m_VecMember[i].pSession->SendVillageInfo(pIP, nPort, nRet, 0, 0);
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendPvPUserState(UINT nAccountDBID, UINT uiUserState)
|
||
{
|
||
UINT nSessionID = 0;
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
{
|
||
if (m_VecMember[i].pSession->GetAccountDBID() == nAccountDBID)
|
||
{
|
||
nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
m_VecMember[i].pSession->SetPvPUserState(uiUserState);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (nSessionID > 0)
|
||
{
|
||
for( DWORD i=0; i<m_VecMember.size(); i++ )
|
||
m_VecMember[i].pSession->SendPvPUserState(nSessionID, uiUserState);
|
||
}
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
void CDNGameRoom::SendBreakIntoUser( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( !pBreakIntoSession )
|
||
return;
|
||
|
||
SCROOM_SYNC_MEMBER_BREAKINTO TxPacket;
|
||
memset( &TxPacket, 0, sizeof(TxPacket) );
|
||
|
||
char* pBuffer = reinterpret_cast<char*>(TxPacket.EquipArray);
|
||
char* pOrgBuffer = pBuffer;
|
||
|
||
pBreakIntoSession->GetPartyMemberInfo( TxPacket.Member );
|
||
TxPacket.usTeam = pBreakIntoSession->GetTeam();
|
||
TxPacket.cGMTrace = pBreakIntoSession->bIsGMTrace() ? 1: 0;
|
||
TxPacket.iDefaultPartsIndex[0] = pBreakIntoSession->GetDefaultBody();
|
||
TxPacket.iDefaultPartsIndex[1] = pBreakIntoSession->GetDefaultLeg();
|
||
TxPacket.iDefaultPartsIndex[2] = pBreakIntoSession->GetDefaultHand();
|
||
TxPacket.iDefaultPartsIndex[3] = pBreakIntoSession->GetDefaultFoot();
|
||
|
||
memcpy(TxPacket.cViewCashEquipBitmap, pBreakIntoSession->GetViewCashEquipBitmap(), sizeof(TxPacket.cViewCashEquipBitmap));
|
||
|
||
// ȣĪ
|
||
TxPacket.iSelectAppellation = pBreakIntoSession->GetSelectAppellation();
|
||
TxPacket.nCoverAppellation = pBreakIntoSession->GetCoverAppellation();
|
||
TxPacket.cAccountLevel = pBreakIntoSession->GetAccountLevel();
|
||
if( pBreakIntoSession->GetItem()->GetVehicleEquip() )
|
||
TxPacket.VehicleInfo.SetCompact( *pBreakIntoSession->GetItem()->GetVehicleEquip() );
|
||
if( pBreakIntoSession->GetItem()->GetPetEquip() )
|
||
TxPacket.PetInfo.SetCompact( *pBreakIntoSession->GetItem()->GetPetEquip() );
|
||
|
||
// <20><><EFBFBD><EFBFBD>
|
||
for( int i=0; i<EQUIPMAX ; ++i )
|
||
{
|
||
if( pBreakIntoSession->GetItem()->GetEquip(i) == NULL )
|
||
continue;
|
||
// SlotIndex
|
||
memcpy( pBuffer, &i, sizeof(char) );
|
||
pBuffer += sizeof(char);
|
||
// TItem
|
||
memcpy( pBuffer, pBreakIntoSession->GetItem()->GetEquip(i), sizeof(TItem) );
|
||
pBuffer += sizeof(TItem);
|
||
|
||
++TxPacket.nEquipCount;
|
||
}
|
||
|
||
// ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
for( int i=0 ; i<CASHEQUIPMAX ; ++i )
|
||
{
|
||
if( pBreakIntoSession->GetItem()->GetCashEquip(i) == NULL )
|
||
continue;
|
||
// SlotIndex
|
||
memcpy( pBuffer, &i, sizeof(char) );
|
||
pBuffer += sizeof(char);
|
||
// TItem
|
||
memcpy( pBuffer, pBreakIntoSession->GetItem()->GetCashEquip(i), sizeof(TItem) );
|
||
pBuffer += sizeof(TItem);
|
||
|
||
++TxPacket.nCashEquipCount;
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD>
|
||
for( int i=0; i<GLYPHMAX ; ++i )
|
||
{
|
||
if( pBreakIntoSession->GetItem()->GetGlyph(i) == NULL )
|
||
continue;
|
||
// SlotIndex
|
||
memcpy( pBuffer, &i, sizeof(char) );
|
||
pBuffer += sizeof(char);
|
||
// TItem
|
||
memcpy( pBuffer, pBreakIntoSession->GetItem()->GetGlyph(i), sizeof(TItem) );
|
||
pBuffer += sizeof(TItem);
|
||
|
||
++TxPacket.nGlyphCount;
|
||
}
|
||
|
||
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
||
// Ż<><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
for( int i=0; i<TALISMAN_MAX ; ++i )
|
||
{
|
||
if( pBreakIntoSession->GetItem()->GetTalisman(i) == NULL )
|
||
continue;
|
||
// SlotIndex
|
||
memcpy( pBuffer, &i, sizeof(char) );
|
||
pBuffer += sizeof(char);
|
||
// TItem
|
||
memcpy( pBuffer, pBreakIntoSession->GetItem()->GetTalisman(i), sizeof(TItem) );
|
||
pBuffer += sizeof(TItem);
|
||
|
||
++TxPacket.nTalismanCount;
|
||
}
|
||
#endif
|
||
|
||
// <20><>ų
|
||
for( int i=0 ; i<SKILLMAX ; ++i )
|
||
{
|
||
if( pBreakIntoSession->GetSkillData()->SkillList[i].nSkillID <= 0 )
|
||
continue;
|
||
|
||
// <20><>ȣ<EFBFBD><C8A3> <20><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD>, <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>.
|
||
|
||
if( pBreakIntoSession->GetSkillData()->SkillList[i].cSkillLevel < 1 )
|
||
continue;
|
||
|
||
|
||
//if( CDnSkill::GetSkillType( pBreakIntoSession->GetSkillData()->SkillList[i].nSkillID ) != CDnSkill::Passive &&
|
||
// CDnSkill::GetSkillType( pBreakIntoSession->GetSkillData()->SkillList[i].nSkillID ) != CDnSkill::EnchantPassive )
|
||
// continue;
|
||
|
||
memcpy( pBuffer, &(pBreakIntoSession->GetSkillData()->SkillList[i]), sizeof(TSkill) );
|
||
pBuffer += sizeof(TSkill);
|
||
++TxPacket.nSkillCount;
|
||
}
|
||
|
||
TxPacket.GuildSelfView = pBreakIntoSession->GetGuildSelfView();
|
||
|
||
int iSize = static_cast<int>(sizeof(TxPacket)-sizeof(TxPacket.EquipArray)-sizeof(TxPacket.SkillArray)+(pBuffer-pOrgBuffer));
|
||
for( UINT i=0; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if( m_VecMember[i].pSession == pBreakIntoSession )
|
||
continue;
|
||
m_VecMember[i].pSession->AddSendData( SC_ROOM, eRoom::SC_SYNC_MEMBER_BREAKINTO, reinterpret_cast<char*>(&TxPacket), iSize );
|
||
}
|
||
|
||
#if defined (PRE_ADD_BESTFRIEND)
|
||
//<2F><>ģ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
std::vector<TPartyBestFriend> vMemberBestFriend;
|
||
vMemberBestFriend.reserve(1);
|
||
|
||
TPartyBestFriend MemberBestFriend = {0,};
|
||
MemberBestFriend.nSessionID = pBreakIntoSession->GetSessionID();
|
||
|
||
TBestFriendInfo& Info = pBreakIntoSession->GetBestFriend()->GetInfo();
|
||
MemberBestFriend.biBFItemSerial = Info.biItemSerial;
|
||
_wcscpy(MemberBestFriend.wszBFName, _countof(MemberBestFriend.wszBFName), Info.wszName, (int)wcslen(Info.wszName));
|
||
|
||
vMemberBestFriend.push_back( MemberBestFriend );
|
||
|
||
for( UINT i=0; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if( m_VecMember[i].pSession == pBreakIntoSession )
|
||
continue;
|
||
m_VecMember[i].pSession->SendPartyBestFriend( vMemberBestFriend );
|
||
}
|
||
#endif // #if defined (PRE_ADD_BESTFRIEND)
|
||
}
|
||
|
||
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
|
||
void CDNGameRoom::SendCompleteBreakIntoUser( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if(!pBreakIntoSession)
|
||
return;
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> Ʋ<><C6B2>
|
||
CDnWorld *pWorld = GetWorld();
|
||
bool bDungeon = false;
|
||
if( pWorld && pWorld->GetMapType() == EWorldEnum::MapTypeDungeon )
|
||
{
|
||
bDungeon = true;
|
||
}
|
||
|
||
std::vector<TEffectSkillData> vEffectSkill;
|
||
vEffectSkill.clear();
|
||
pBreakIntoSession->GetItem()->GetEffectSkillItem( vEffectSkill );
|
||
CDNUserSession::ApplyEffectSkill(pBreakIntoSession->GetPlayerActor(), vEffectSkill , !bDungeon , pBreakIntoSession->GetGameRoom()->bIsPvPRoom() );
|
||
|
||
pBreakIntoSession->CheckEffectSkillItemData();
|
||
pBreakIntoSession->GetItem()->BroadcastEffectSkillItemData(false);
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if(bIsWorldCombineParty())
|
||
{
|
||
ApplyWorldCombinePartyBuff(pBreakIntoSession);
|
||
}
|
||
#endif
|
||
|
||
#if defined( PRE_ADD_DIRECTNBUFF )
|
||
if( pWorld && pWorld->GetMapType() == EWorldEnum::MapTypeDungeon && GetGameTaskType() != GameTaskType::Farm )
|
||
{
|
||
if( bIsDirectPartyBuff() )
|
||
{
|
||
ApplyDirectPartyBuff( true );
|
||
if( pBreakIntoSession->bIsDirectPartyBuff() )
|
||
SendDirectPartyBuffMsg(pBreakIntoSession);
|
||
}
|
||
}
|
||
#endif
|
||
|
||
SendPartyEffectSkillItemData(pBreakIntoSession);
|
||
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
|
||
SendTotalLevelSkillInfo(pBreakIntoSession);
|
||
#endif
|
||
#if defined( PRE_ADD_GUILDREWARDITEM )
|
||
pBreakIntoSession->SetGuildRewardItem();
|
||
pBreakIntoSession->ApplyGuildRewardSkill(bDungeon);
|
||
#endif
|
||
|
||
#if defined( PRE_FIX_BREAKINTO_BLOW_SYNC )
|
||
SendAddStateEffect( pBreakIntoSession );
|
||
#endif
|
||
|
||
}
|
||
#endif
|
||
|
||
void CDNGameRoom::SendHPSP( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( !pBreakIntoSession )
|
||
return;
|
||
|
||
SCROOM_SYNC_MEMBERHPSP TxPacket;
|
||
memset( &TxPacket, 0, sizeof(TxPacket) );
|
||
|
||
UINT uiSendCount = 0;
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
INT64 iHP = 0;
|
||
int iSP = 0;
|
||
|
||
if( m_VecMember[i].pSession && m_VecMember[i].pSession->GetActorHandle() )
|
||
{
|
||
if( m_VecMember[i].pSession == pBreakIntoSession )
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
PartyBackUpStruct BackupInfo;
|
||
if( GetBackupPartyInfo( pBreakIntoSession->GetCharacterDBID(), BackupInfo ) == true )
|
||
{
|
||
iHP = (INT64)(m_VecMember[i].pSession->GetActorHandle()->GetMaxHP() * BackupInfo.nHPPercent * 0.01);
|
||
iSP = m_VecMember[i].pSession->GetActorHandle()->GetSP();
|
||
}
|
||
else
|
||
{
|
||
iHP = m_VecMember[i].pSession->GetActorHandle()->GetHP();
|
||
iSP = m_VecMember[i].pSession->GetActorHandle()->GetSP();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
iHP = m_VecMember[i].pSession->GetActorHandle()->GetHP();
|
||
iSP = m_VecMember[i].pSession->GetActorHandle()->GetSP();
|
||
}
|
||
#if !defined( _FINAL_BUILD )
|
||
/*
|
||
WCHAR wszBuf[MAX_PATH];
|
||
wsprintf( wszBuf, L"[%s] HP:%d SP:%d\r\n", m_VecMember[i].pSession->GetActorHandle()->GetName(), iHP, iSP );
|
||
g_Log.Log( LogType::_NORMAL, pBreakIntoSession, wszBuf );
|
||
*/
|
||
#endif
|
||
}
|
||
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
TxPacket.tHPSP[TxPacket.cCount].nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
TxPacket.tHPSP[TxPacket.cCount].iHP = iHP;
|
||
TxPacket.tHPSP[TxPacket.cCount].iSP = iSP;
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
TxPacket.iHPSPArr[TxPacket.cCount*2] = (int)iHP;
|
||
TxPacket.iHPSPArr[(TxPacket.cCount*2)+1] = iSP;
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
++TxPacket.cCount;
|
||
|
||
// Page<67>ϼ<EFBFBD>
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
if( TxPacket.cCount%(_countof(TxPacket.tHPSP)) == 0 )
|
||
{
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
if( TxPacket.cCount%(_countof(TxPacket.iHPSPArr)/2) == 0 )
|
||
{
|
||
TxPacket.unStartIndex = static_cast<USHORT>(uiSendCount);
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
pBreakIntoSession->AddSendData( SC_ROOM, eRoom::SC_SYNC_MEMBERHPSP, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
|
||
|
||
uiSendCount += TxPacket.cCount;
|
||
TxPacket.cCount = 0;
|
||
}
|
||
}
|
||
|
||
if( TxPacket.cCount > 0 )
|
||
{
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
int iSize = sizeof(TxPacket)-sizeof(TxPacket.tHPSP)+TxPacket.cCount*sizeof(TSyncHPSP);
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
TxPacket.unStartIndex = static_cast<USHORT>(uiSendCount);
|
||
int iSize = sizeof(TxPacket)-sizeof(TxPacket.iHPSPArr)+TxPacket.cCount*sizeof(TxPacket.iHPSPArr[0])*2;
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
|
||
pBreakIntoSession->AddSendData( SC_ROOM, eRoom::SC_SYNC_MEMBERHPSP, reinterpret_cast<char*>(&TxPacket), iSize );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendBattleMode( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( !pBreakIntoSession )
|
||
return;
|
||
|
||
SCROOM_SYNC_MEMBERBATTLEMODE TxPacket;
|
||
memset( &TxPacket, 0, sizeof(TxPacket) );
|
||
|
||
UINT uiSendCount = 0;
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
BYTE cBattleMode = 0;
|
||
if( m_VecMember[i].pSession && m_VecMember[i].pSession->GetActorHandle() )
|
||
{
|
||
CDnPlayerActor* pActor = static_cast<CDnPlayerActor*>(m_VecMember[i].pSession->GetActorHandle().GetPointer() );
|
||
if( pActor )
|
||
cBattleMode = pActor->IsBattleMode() ? 1 : 0;
|
||
}
|
||
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
TxPacket.tBattleMode[TxPacket.cCount].nSessionID = m_VecMember[i].pSession->GetSessionID();
|
||
TxPacket.tBattleMode[TxPacket.cCount].cBattleMode = cBattleMode;
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
TxPacket.cBattleModeArr[TxPacket.cCount] = cBattleMode;
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
++TxPacket.cCount;
|
||
|
||
// Page<67>ϼ<EFBFBD>
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
if( TxPacket.cCount%_countof(TxPacket.tBattleMode) == 0 )
|
||
{
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
if( TxPacket.cCount%_countof(TxPacket.cBattleModeArr) == 0 )
|
||
{
|
||
TxPacket.unStartIndex = static_cast<USHORT>(uiSendCount);
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
pBreakIntoSession->AddSendData( SC_ROOM, eRoom::SC_SYNC_MEMBERBATTLEMODE, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
|
||
|
||
uiSendCount += TxPacket.cCount;
|
||
|
||
TxPacket.cCount = 0;
|
||
}
|
||
}
|
||
|
||
if( TxPacket.cCount > 0 )
|
||
{
|
||
#ifdef PRE_MOD_SYNCPACKET
|
||
int iSize = sizeof(TxPacket)-sizeof(TxPacket.tBattleMode)+TxPacket.cCount*sizeof(TBattleMode);
|
||
#else //#ifdef PRE_MOD_SYNCPACKET
|
||
TxPacket.unStartIndex = static_cast<USHORT>(uiSendCount);
|
||
int iSize = sizeof(TxPacket)-sizeof(TxPacket.cBattleModeArr)+TxPacket.cCount*sizeof(TxPacket.cBattleModeArr[0]);
|
||
#endif //#ifdef PRE_MOD_SYNCPACKET
|
||
|
||
pBreakIntoSession->AddSendData( SC_ROOM, eRoom::SC_SYNC_MEMBERBATTLEMODE, reinterpret_cast<char*>(&TxPacket), iSize );
|
||
}
|
||
}
|
||
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Blow <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||
void CDNGameRoom::SendAddStateEffect( CDNUserSession* pBreakIntoGameSession )
|
||
{
|
||
if( !pBreakIntoGameSession )
|
||
return;
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if( m_VecMember[i].pSession == pBreakIntoGameSession )
|
||
continue;
|
||
|
||
DnActorHandle hActor = m_VecMember[i].pSession->GetActorHandle();
|
||
if( hActor )
|
||
hActor->CmdSyncBlow( pBreakIntoGameSession );
|
||
}
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||
void CDNGameRoom::SendPosition( CDNUserSession* pBreakIntoGameSession )
|
||
{
|
||
if( !pBreakIntoGameSession )
|
||
return;
|
||
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if( m_VecMember[i].pSession == pBreakIntoGameSession )
|
||
{
|
||
DnActorHandle hActor = m_VecMember[i].pSession->GetActorHandle();
|
||
if( hActor )
|
||
hActor->CmdWarp( *hActor->GetPosition(), EtVec3toVec2( *hActor->GetLookDir() ) );
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DropItem <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||
void CDNGameRoom::SendDropItemList( CDNUserSession* pBreakIntoGameSession )
|
||
{
|
||
if( !pBreakIntoGameSession )
|
||
return;
|
||
|
||
DnActorHandle hActor = pBreakIntoGameSession->GetActorHandle();
|
||
if( !hActor )
|
||
return;
|
||
|
||
if( CDnDropItem::s_pVecProcessList[GetRoomID()].empty() )
|
||
return;
|
||
|
||
size_t stCount = CDnDropItem::s_pVecProcessList[GetRoomID()].size();
|
||
|
||
DNVector(DnDropItemHandle) vDropItem;
|
||
vDropItem.reserve( stCount );
|
||
|
||
for( UINT i=0 ; i<stCount ; ++i )
|
||
vDropItem.push_back( CDnDropItem::s_pVecProcessList[GetRoomID()][i]->GetMySmartPtr() );
|
||
|
||
//CDnDropItem::ScanItem( this, *hActor->GetPosition(), FLT_MAX, vDropItem );
|
||
|
||
//
|
||
SCROOM_SYNC_DROPITEMLIST TxPacket;
|
||
memset( &TxPacket, 0, sizeof(TxPacket) );
|
||
|
||
for( UINT i=0 ; i<vDropItem.size() ; ++i )
|
||
{
|
||
TDropItemSync* pDropItemSync = &TxPacket.sDropItemList[TxPacket.cCount];
|
||
|
||
pDropItemSync->nSessionID = vDropItem[i]->GetUniqueID();
|
||
pDropItemSync->fpos[0] = vDropItem[i]->GetPosition()->x;
|
||
pDropItemSync->fpos[1] = vDropItem[i]->GetPosition()->y;
|
||
pDropItemSync->fpos[2] = vDropItem[i]->GetPosition()->z;
|
||
pDropItemSync->nItemID = vDropItem[i]->GetItemID();
|
||
pDropItemSync->nRandomSeed = vDropItem[i]->GetRandomSeed();
|
||
pDropItemSync->nCount = vDropItem[i]->GetOverlapCount();
|
||
pDropItemSync->nRotate = vDropItem[i]->GetRotate();
|
||
pDropItemSync->uiLifeTime = static_cast<UINT>(vDropItem[i]->GetLifeTime()*1000);
|
||
pDropItemSync->fDistance = vDropItem[i]->GetDistance();
|
||
|
||
if( ++TxPacket.cCount >= SENDDROPITEMLISTMAX )
|
||
{
|
||
pBreakIntoGameSession->AddSendData( SC_ROOM, eRoom::SC_SYNC_DROPITEMLIST, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
|
||
memset( &TxPacket, 0, sizeof(TxPacket) );
|
||
}
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD> SEND
|
||
if( TxPacket.cCount > 0 )
|
||
{
|
||
UINT uiSize = sizeof(TxPacket)-sizeof(TxPacket.sDropItemList)+sizeof(TDropItemSync)*TxPacket.cCount;
|
||
pBreakIntoGameSession->AddSendData( SC_ROOM, eRoom::SC_SYNC_DROPITEMLIST, reinterpret_cast<char*>(&TxPacket), uiSize );
|
||
}
|
||
}
|
||
|
||
// Monster <20><><EFBFBD><EFBFBD>ȭ
|
||
void CDNGameRoom::SyncMonster( CDNUserSession* pBreakIntoGameSession )
|
||
{
|
||
DN_ASSERT( pBreakIntoGameSession != NULL, "CDNGameRoom::SyncMonster() pBreakIntoGameSession != NULL" );
|
||
DN_ASSERT( m_pGameTask != NULL, "CDNGameRoom::SyncMonster() m_pGameTask != NULL ");
|
||
|
||
m_pGameTask->SyncMonster( pBreakIntoGameSession );
|
||
}
|
||
|
||
void CDNGameRoom::SyncNpc( CDNUserSession* pBreakIntoGameSession )
|
||
{
|
||
DN_ASSERT( pBreakIntoGameSession != NULL, "CDNGameRoom::SyncNpc() pBreakIntoGameSession != NULL" );
|
||
DN_ASSERT( m_pGameTask != NULL, "CDNGameRoom::SyncNpc() m_pGameTask != NULL ");
|
||
|
||
m_pGameTask->SyncNpc( pBreakIntoGameSession );
|
||
}
|
||
|
||
// Prop <20><><EFBFBD><EFBFBD>ȭ
|
||
void CDNGameRoom::SyncProp( CDNUserSession* pBreakIntoGameSession )
|
||
{
|
||
CDnWorldSector* pSector = static_cast<CDnWorldSector*>(CDnWorld::GetInstance( this ).GetSector( 0.0f, 0.0f ));
|
||
for( UINT i=0 ; i<pSector->GetPropCount() ; ++i )
|
||
{
|
||
CEtWorldProp* pProp = pSector->GetPropFromIndex( i );
|
||
if( pProp )
|
||
{
|
||
if( static_cast<CDnWorldProp*>(pProp)->IsShow() )
|
||
pProp->OnSyncComplete( pBreakIntoGameSession );
|
||
else
|
||
static_cast<CDnWorldProp*>(pProp)->CmdShow( false, pBreakIntoGameSession );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::CheckDiePlayer( CDNUserSession* pBreakIntoGameSession )
|
||
{
|
||
if( !pBreakIntoGameSession )
|
||
return;
|
||
|
||
PartyBackUpStruct BackupInfo;
|
||
// <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
||
if( GetBackupPartyInfo( pBreakIntoGameSession->GetCharacterDBID(), BackupInfo ) == true )
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
||
DnActorHandle hActor = pBreakIntoGameSession->GetActorHandle();
|
||
if( hActor )
|
||
{
|
||
hActor->SetHP( 0 );
|
||
}
|
||
}
|
||
}
|
||
|
||
// Player <20><><EFBFBD><EFBFBD>ȭ
|
||
void CDNGameRoom::SyncPlayer( CDNUserSession* pBreakIntoGameSession )
|
||
{
|
||
if( !pBreakIntoGameSession )
|
||
return;
|
||
|
||
// <20><>Ƽ<EFBFBD>ο<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ȭ
|
||
++m_iPartMemberCnt;
|
||
|
||
// <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD>ȭ
|
||
if( !bIsPvPRoom() )
|
||
{
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if( !m_VecMember[i].pSession )
|
||
continue;
|
||
|
||
m_VecMember[i].pSession->SetFatigue( m_VecMember[i].pSession->GetFatigue(), m_VecMember[i].pSession->GetWeeklyFatigue(), m_VecMember[i].pSession->GetPCBangFatigue(),
|
||
m_VecMember[i].pSession->GetEventFatigue(), m_VecMember[i].pSession->GetVIPFatigue() );
|
||
}
|
||
}
|
||
|
||
PartyBackUpStruct BackupInfo;
|
||
// <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
||
if( GetBackupPartyInfo( pBreakIntoGameSession->GetCharacterDBID(), BackupInfo ) == true )
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
||
DnActorHandle hActor = pBreakIntoGameSession->GetActorHandle();
|
||
|
||
UINT uiSessionID = 0;
|
||
GetLeaderSessionID( uiSessionID );
|
||
if( uiSessionID > 0 )
|
||
{
|
||
int Seq;
|
||
PartyStruct* pLeader = GetPartyDatabySessionID( uiSessionID, Seq );
|
||
if( pLeader && pLeader->pSession )
|
||
{
|
||
DnActorHandle hLeader = pLeader->pSession->GetActorHandle();
|
||
if( hActor && hLeader )
|
||
hActor->CmdWarp( *hLeader->GetPosition(), EtVec3toVec2(*hLeader->GetLookDir()) );
|
||
}
|
||
}
|
||
|
||
Ghost::Type::eCode Type = ( BackupInfo.nHPPercent > 0 ) ? Ghost::Type::PartyRestore : Ghost::Type::Normal;
|
||
pBreakIntoGameSession->SendGhostType( pBreakIntoGameSession->GetSessionID(), Type );
|
||
|
||
// <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
|
||
if( hActor )
|
||
hActor->CmdRefreshHPSP( 0,0 );
|
||
|
||
// RebirthCoin <20><><EFBFBD><EFBFBD>
|
||
PartyStruct* pStruct = GetPartyData( pBreakIntoGameSession );
|
||
if( pStruct )
|
||
{
|
||
pStruct->nUsableRebirthCoin = BackupInfo.nUsableRebirthCoin;
|
||
for( std::list<int>::iterator itor = BackupInfo.ReverseItemList.begin(); itor != BackupInfo.ReverseItemList.end(); itor++ )
|
||
pStruct->ReverseItemList.push_back( (*itor) );
|
||
pStruct->nUsableRebirthItemCoin = BackupInfo.nUsableRebirthItemCoin;
|
||
pBreakIntoGameSession->SendRebirthCoin( ERROR_NONE, BackupInfo.nUsableRebirthCoin, _REBIRTH_SELF, pBreakIntoGameSession->GetSessionID());
|
||
for( std::list<int>::iterator itor = BackupInfo.ReverseItemList.begin(); itor != BackupInfo.ReverseItemList.end(); itor++ )
|
||
pBreakIntoGameSession->SendSpecialRebirthItem( *itor, BackupInfo.nUsableRebirthItemCoin);
|
||
#if defined( PRE_ADD_STAGE_USECOUNT_ITEM )
|
||
for( std::map<int,int>::iterator itor = BackupInfo.UseLimitItem.begin(); itor != BackupInfo.UseLimitItem.end(); itor++ )
|
||
{
|
||
pStruct->UseLimitItem.insert(make_pair(itor->first, itor->second));
|
||
pBreakIntoGameSession->SendStageUseLimitItem( itor->first, itor->second );
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
|
||
if( GetGameTask() )
|
||
GetGameTask()->SyncTimeAttack( pBreakIntoGameSession );
|
||
}
|
||
|
||
// Gate <20><><EFBFBD><EFBFBD>ȭ
|
||
void CDNGameRoom::SyncGate( CDNUserSession* pBreakIntoGameSession )
|
||
{
|
||
if( !pBreakIntoGameSession )
|
||
return;
|
||
|
||
DN_ASSERT( m_pGameTask != NULL, "CDNGameRoom::SyncGate() m_pGameTask != NULL" );
|
||
m_pGameTask->RequestGateInfo( pBreakIntoGameSession );
|
||
}
|
||
|
||
void CDNGameRoom::AddRequestGetReversionItem(const TItem& itemInfo, DnDropItemHandle hDropItem)
|
||
{
|
||
if (m_pPartyTask)
|
||
m_pPartyTask->AddRequestGetReversionItem(itemInfo, hDropItem);
|
||
else
|
||
_DANGER_POINT();
|
||
}
|
||
|
||
bool CDNGameRoom::IsEnableAddRequestGetReversionItem(DnDropItemHandle hDropItem) const
|
||
{
|
||
if (m_pPartyTask)
|
||
return m_pPartyTask->IsEnableAddRequestGetReversionItem(hDropItem);
|
||
else
|
||
_DANGER_POINT();
|
||
|
||
return false;
|
||
}
|
||
|
||
void CDNGameRoom::BroadcastChatRoomView(CDNUserSession* pSender, TChatRoomView& ChatRoomView)
|
||
{
|
||
CDNUserSession* pUserSession;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
pUserSession = m_VecMember[i].pSession;
|
||
if (pSender == pUserSession)
|
||
continue;
|
||
|
||
pUserSession->SendChatRoomView( pSender->GetSessionID(), ChatRoomView );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::BroadcastChatRoomEnterUser(CDNUserSession* pSender, CDNChatRoom* pChatRoom)
|
||
{
|
||
CDNUserSession* pUserSession;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
pUserSession = m_VecMember[i].pSession;
|
||
if (pSender == pUserSession)
|
||
continue;
|
||
|
||
pUserSession->SendChatRoomEnterUser( pChatRoom->GetChatRoomID(), pChatRoom->GetChatRoomType(), pSender->GetSessionID() );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::BroadcastChatRoomLeaveUser(CDNUserSession* pSender, int nErrorCode)
|
||
{
|
||
CDNUserSession* pUserSession;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
pUserSession = m_VecMember[i].pSession;
|
||
if (pSender == pUserSession)
|
||
continue;
|
||
|
||
pUserSession->SendChatRoomLeaveUser( pSender->GetSessionID(), nErrorCode );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SendChatRoomInfo(CDNUserSession* pBreakIntoGameSession)
|
||
{
|
||
m_ChatRoomManager.SendChatRoomInfo(pBreakIntoGameSession);
|
||
}
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
|
||
bool CDNGameRoom::CheckDestroyWorldCombineParty()
|
||
{
|
||
if( bIsWorldCombineParty() )
|
||
{
|
||
if( GetGameTask() )
|
||
{
|
||
const TMapInfo* pMapInfo = g_pDataManager->GetMapInfo( GetGameTask()->GetMapTableID() );
|
||
if( pMapInfo )
|
||
return pMapInfo->MapType != EWorldEnum::MapTypeWorldMap;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
void CDNGameRoom::ApplyWorldCombinePartyBuff( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if(!pBreakIntoSession)
|
||
return;
|
||
|
||
if( bIsWorldCombineParty() )
|
||
{
|
||
WorldCombineParty::WrldCombinePartyData* pCombinePartyData = g_pDataManager->GetCombinePartyData(GetWorldPartyPrimaryIndex());
|
||
if(pCombinePartyData)
|
||
{
|
||
// CSUseItem<65><6D> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD>
|
||
for( int i=0;i<WorldCombineParty::eType::MAXSKILLCOUNT;i++ )
|
||
{
|
||
if(pCombinePartyData->nSkillID[i] <= 0) continue;
|
||
|
||
CSUseItem pPacket;
|
||
memset(&pPacket, 0, sizeof(pPacket));
|
||
TItemData *pItemData = g_pDataManager->GetItemData(pCombinePartyData->nSkillID[i]);
|
||
|
||
bool bUseItem = true;
|
||
if (CDnWorld::GetInstance(this).GetMapType() == GlobalEnum::eMapTypeEnum::MAP_WORLDMAP)
|
||
bUseItem = false;
|
||
|
||
pBreakIntoSession->GetItem()->ApplyPartyEffectSkillItemData(&pPacket, pItemData, pBreakIntoSession->GetSessionID(), EffectSkillNameSpace::ShowEffectType::NONEEFFECT, false, bUseItem);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
|
||
|
||
bool CDNGameRoom::bIsIgnorePrefixSkill()
|
||
{
|
||
if( bIsLadderRoom() )
|
||
return false;
|
||
if( bIsGuildWarSystem() )
|
||
return false;
|
||
if( bIsLevelRegulation() )
|
||
return true;
|
||
|
||
return false;
|
||
}
|
||
|
||
CDNGameRoom::PartyBackUpStruct& CDNGameRoom::PartyBackUpStruct::operator=( CDNGameRoom::PartyStruct& Struct )
|
||
{
|
||
this->nUsableRebirthCoin = Struct.nUsableRebirthCoin;
|
||
for( std::list<int>::iterator itor = Struct.ReverseItemList.begin(); itor != Struct.ReverseItemList.end(); itor++ )
|
||
this->ReverseItemList.push_back( (*itor) );
|
||
|
||
this->nUsableRebirthItemCoin = Struct.nUsableRebirthItemCoin;
|
||
this->nHPPercent = 0;
|
||
this->nSPPercent = 0;
|
||
|
||
#if defined( PRE_ADD_STAGE_USECOUNT_ITEM )
|
||
|
||
for( std::map<int,int>::iterator itor = Struct.UseLimitItem.begin(); itor != Struct.UseLimitItem.end(); itor++ )
|
||
{
|
||
this->UseLimitItem.insert(make_pair(itor->first, itor->second));
|
||
}
|
||
#endif
|
||
|
||
if( Struct.pSession )
|
||
{
|
||
DnActorHandle hActor = Struct.pSession->GetActorHandle();
|
||
if( hActor )
|
||
{
|
||
this->nHPPercent = hActor->GetHPPercent();
|
||
this->nSPPercent = hActor->GetSPPercent();
|
||
|
||
if( this->nHPPercent == 0 )
|
||
{
|
||
if( hActor->IsDie() == false )
|
||
this->nHPPercent = 1;
|
||
}
|
||
}
|
||
}
|
||
return (*this);
|
||
}
|
||
|
||
void CDNGameRoom::AddLastPartyDungeonInfo( CDNUserSession* pSession )
|
||
{
|
||
if( pSession == NULL )
|
||
return;
|
||
|
||
bool bModDungeonInfo = false;
|
||
switch( m_cReqGameIDType )
|
||
{
|
||
case REQINFO_TYPE_PARTY:
|
||
{
|
||
bModDungeonInfo = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
INT64 biValue = 0;
|
||
if( bModDungeonInfo == true )
|
||
biValue = MAKELONG64( g_Config.nManagedID, GetRoomID() );
|
||
pSession->ModCommonVariableData( CommonVariable::Type::LastPartyDungeonInfo, biValue );
|
||
|
||
#if defined( _WORK )
|
||
std::cout << "[AddLastPartyDungeonInfo] AccountID:" << pSession->GetAccountDBID() << " ManagedID:" << g_Config.nManagedID << " RoomID:" << GetRoomID() << " Value:"<< biValue << std::endl;
|
||
#endif // #if defined( _WORK )
|
||
}
|
||
|
||
void CDNGameRoom::DelLastPartyDungeonInfo( CDNUserSession* pSession )
|
||
{
|
||
if( pSession == NULL )
|
||
return;
|
||
|
||
pSession->ModCommonVariableData( CommonVariable::Type::LastPartyDungeonInfo, 0 );
|
||
|
||
#if defined( _WORK )
|
||
std::cout << "[DelLastPartyDungeonInfo] AccountID:" << pSession->GetAccountDBID() << std::endl;
|
||
#endif // #if defined( _WORK )
|
||
}
|
||
|
||
void CDNGameRoom::AddBackupPartyInfo( CDNUserSession* pSession )
|
||
{
|
||
std::map<INT64,PartyBackUpStruct>::iterator itor = m_mPartyBackUp.find( pSession->GetCharacterDBID() );
|
||
if( itor != m_mPartyBackUp.end() )
|
||
{
|
||
if( itor->second.nHPPercent > 0 )
|
||
return;
|
||
}
|
||
|
||
INT64 biValue = 0;
|
||
if( pSession->GetCommonVariableDataValue( CommonVariable::Type::LastPartyDungeonInfo, biValue ) == false )
|
||
return;
|
||
|
||
if( biValue <= 0 )
|
||
return;
|
||
|
||
const TMapInfo* pMapInfo = g_pDataManager->GetMapInfo( pSession->GetMapIndex() );
|
||
if( pMapInfo == NULL || pMapInfo->bUserReturnSystem == false )
|
||
{
|
||
#if defined( _WORK )
|
||
std::cout << "[AddBackupPartyInfo] CharDBID:" << pSession->GetCharacterDBID() << " MapIndex:" << pSession->GetMapIndex() << " <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD><C9B8><EFBFBD> <20>ƴ<EFBFBD>" << std::endl;
|
||
#endif // #if defined( _WORK )
|
||
return;
|
||
}
|
||
|
||
PartyStruct* pStruct = GetPartyData( pSession );
|
||
m_mPartyBackUp[pSession->GetCharacterDBID()] = (*pStruct);
|
||
|
||
#if defined( _WORK )
|
||
std::cout << "[AddBackupPartyInfo] CharDBID:" << pSession->GetCharacterDBID() << std::endl;
|
||
#endif // #if defined( _WORK )
|
||
}
|
||
|
||
void CDNGameRoom::DelBackupPartyInfo()
|
||
{
|
||
m_mPartyBackUp.clear();
|
||
|
||
#if defined( _WORK )
|
||
std::cout << "[DelBackupPartyInfo] <20><><EFBFBD><EFBFBD> Backup <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ" << std::endl;
|
||
#endif // #if defined( _WORK )
|
||
}
|
||
|
||
void CDNGameRoom::DelBackupPartyInfo( INT64 biCharacterDBID )
|
||
{
|
||
if( m_mPartyBackUp.find( biCharacterDBID ) == m_mPartyBackUp.end() )
|
||
{
|
||
#if defined( _WORK )
|
||
std::cout << "[DelBackupPartyInfo] CharDBID=" << biCharacterDBID << " <20><><EFBFBD><EFBFBD>" << std::endl;
|
||
#endif // #if defined( _WORK )
|
||
return;
|
||
}
|
||
|
||
m_mPartyBackUp.erase( biCharacterDBID );
|
||
#if defined( _WORK )
|
||
std::cout << "[DelBackupPartyInfo] CharDBID=" << biCharacterDBID << " <20><><EFBFBD><EFBFBD>" << std::endl;
|
||
#endif // #if defined( _WORK )
|
||
}
|
||
|
||
bool CDNGameRoom::bIsBackupPartyInfo( INT64 biCharacterDBID )
|
||
{
|
||
if( m_mPartyBackUp.find( biCharacterDBID ) == m_mPartyBackUp.end() )
|
||
{
|
||
#if defined( _WORK )
|
||
std::cout << "[bIsBackupPartyInfo] CharDBID=" << biCharacterDBID << " <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD>" << std::endl;
|
||
#endif // #if defined( _WORK )
|
||
return false;
|
||
}
|
||
|
||
#if defined( _WORK )
|
||
std::cout << "[bIsBackupPartyInfo] CharDBID=" << biCharacterDBID << " <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << std::endl;
|
||
#endif // #if defined( _WORK )
|
||
return true;
|
||
}
|
||
|
||
bool CDNGameRoom::GetBackupPartyInfo( INT64 biCharacterDBID, PartyBackUpStruct& BackupInfo )
|
||
{
|
||
std::map<INT64,PartyBackUpStruct>::iterator itor = m_mPartyBackUp.find( biCharacterDBID );
|
||
if( itor == m_mPartyBackUp.end() )
|
||
return false;
|
||
|
||
BackupInfo = (*itor).second;
|
||
return true;
|
||
}
|
||
|
||
#if defined( PRE_FIX_49129 )
|
||
bool CDNGameRoom::AddFirstPartyStruct( CDNUserSession* pSession )
|
||
{
|
||
if( bIsFarmRoom() == false )
|
||
{
|
||
UINT uiMax = bIsPvPRoom() ? PvPCommon::Common::MaxPlayer : PARTYCOUNTMAX;
|
||
|
||
if (pSession->bIsGMTrace())
|
||
uiMax = PARTYMAX;
|
||
|
||
if( m_MapFirstPartyMember.size() >= uiMax )
|
||
return false;
|
||
}
|
||
else
|
||
return false;
|
||
|
||
PartyFirstStruct PartyFirst;
|
||
PartyFirst.biCharacterDBID = pSession->GetCharacterDBID();
|
||
|
||
PartyFirst.nIndex = (int)m_MapFirstPartyMember.size();
|
||
m_MapFirstPartyMember.insert( std::make_pair(PartyFirst.biCharacterDBID,PartyFirst) );
|
||
|
||
return true;
|
||
}
|
||
CDNGameRoom::PartyFirstStruct* CDNGameRoom::GetFirstPartyData( DWORD dwIndex )
|
||
{
|
||
std::map<INT64, PartyFirstStruct>::iterator itor = m_MapFirstPartyMember.begin();
|
||
for(;itor != m_MapFirstPartyMember.end(); itor++)
|
||
{
|
||
if( itor->second.nIndex == dwIndex )
|
||
return &itor->second;
|
||
}
|
||
return NULL;
|
||
}
|
||
CDNGameRoom::PartyFirstStruct* CDNGameRoom::GetFirstPartyData( INT64 biCharacterID )
|
||
{
|
||
std::map<INT64, PartyFirstStruct>::iterator itor = m_MapFirstPartyMember.find( biCharacterID );
|
||
if( itor == m_MapFirstPartyMember.end() )
|
||
return NULL;
|
||
return &itor->second;
|
||
}
|
||
#endif
|
||
|
||
#if defined( PRE_PARTY_DB )
|
||
void CDNGameRoom::SetPartyID( TPARTYID PartyID )
|
||
{
|
||
m_PartyStructData.PartyID = PartyID;
|
||
}
|
||
|
||
void CDNGameRoom::AddPartyDB( CDNUserSession* pBreakIntoSession )
|
||
{
|
||
if( GetTaskMng() )
|
||
{
|
||
CDnPartyTask* pPartyTask = (CDnPartyTask*)(GetTaskMng()->GetTask("PartyTask"));
|
||
if( pPartyTask )
|
||
pPartyTask->AddPartyDB( pBreakIntoSession );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::AddPartyMemberDB( CDNUserSession* pSession )
|
||
{
|
||
if( GetTaskMng() )
|
||
{
|
||
CDnPartyTask* pPartyTask = (CDnPartyTask*)(GetTaskMng()->GetTask("PartyTask"));
|
||
if( pPartyTask )
|
||
pPartyTask->AddPartyMemberDB( pSession );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::DelPartyDB()
|
||
{
|
||
if( GetTaskMng() )
|
||
{
|
||
CDnPartyTask* pPartyTask = (CDnPartyTask*)(GetTaskMng()->GetTask("PartyTask"));
|
||
if( pPartyTask )
|
||
pPartyTask->DelPartyDB();
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::DelPartyMemberDB( CDNUserSession *pSession )
|
||
{
|
||
#if defined( PRE_WORLDCOMBINE_PARTY )
|
||
if( bIsWorldCombineParty() == true )
|
||
return;
|
||
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
|
||
|
||
if( GetTaskMng() )
|
||
{
|
||
CDnPartyTask* pPartyTask = (CDnPartyTask*)(GetTaskMng()->GetTask("PartyTask"));
|
||
if( pPartyTask )
|
||
pPartyTask->DelPartyMemberDB( pSession );
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if defined (PRE_WORLDCOMBINE_PARTY)
|
||
bool CDNGameRoom::IsCloseTargetMap(int nMapIndex)
|
||
{
|
||
if( bIsWorldCombineParty() )
|
||
{
|
||
if (nMapIndex != GetPartyTargetMapID())
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
bool CDNGameRoom::bIsWorldCombineParty()
|
||
{
|
||
if (GetPartyIndex() > 0)
|
||
{
|
||
return Party::bIsWorldCombineParty( m_PartyStructData.Type );
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
#endif // #if defined (PRE_WORLDCOMBINE_PARTY)
|
||
|
||
#if defined( PRE_ADD_DIRECTNBUFF )
|
||
|
||
void CDNGameRoom::ApplyDirectPartyBuff( bool bUseItem/*=false*/ )
|
||
{
|
||
CDNUserSession * pSession = NULL;
|
||
for( std::list<int>::iterator itor = m_DirectPartyBuffItemList.begin();itor != m_DirectPartyBuffItemList.end(); itor++ )
|
||
{
|
||
for(int i=0;i<(int)GetUserCount();i++)
|
||
{
|
||
if( GetUserData(i) != NULL )
|
||
{
|
||
pSession = GetUserData(i);
|
||
CSUseItem pPacket;
|
||
memset(&pPacket, 0, sizeof(pPacket));
|
||
TItemData *pItemData = g_pDataManager->GetItemData(*itor);
|
||
if( g_pDataManager->IsUseItemAllowMapTypeCheck( pItemData->nItemID, m_iMapIdx ) )
|
||
{
|
||
TEffectSkillData* EffectSkill = pSession->GetItem()->GetEffectSkillItem( EffectSkillNameSpace::SearchType::SkillID, pItemData->nSkillID );
|
||
if( !EffectSkill )
|
||
{
|
||
pSession->GetItem()->ApplyPartyEffectSkillItemData(&pPacket, pItemData, pSession->GetSessionID(), EffectSkillNameSpace::ShowEffectType::NONEEFFECT, false, bUseItem);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::RemoveDirectPartyBuff( int nItemID, bool bAll /*= false*/ )
|
||
{
|
||
if(bAll)
|
||
{
|
||
CDNUserSession * pSession = NULL;
|
||
for( std::list<int>::iterator itor = m_DirectPartyBuffItemList.begin();itor != m_DirectPartyBuffItemList.end();itor++)
|
||
{
|
||
TItemData *pItemData = g_pDataManager->GetItemData(*itor);
|
||
if( pItemData )
|
||
{
|
||
for(int i=0;i<(int)GetUserCount();i++)
|
||
{
|
||
if( GetUserData(i) != NULL )
|
||
{
|
||
pSession = GetUserData(i);
|
||
if( pSession && pSession->GetPlayerActor() )
|
||
{
|
||
TEffectSkillData* EffectSkill = pSession->GetItem()->GetEffectSkillItem( EffectSkillNameSpace::SearchType::SkillID, pItemData->nSkillID );
|
||
if( EffectSkill )
|
||
{
|
||
CDNUserSession::RemoveEffectSkill(pSession->GetPlayerActor(), EffectSkill);
|
||
pSession->GetItem()->DelEffectSkillItem( pItemData->nSkillID );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
int nItemCount = 0;
|
||
for( std::list<int>::iterator itor = m_DirectPartyBuffItemList.begin();itor != m_DirectPartyBuffItemList.end();)
|
||
{
|
||
if( nItemID == *itor)
|
||
{
|
||
if(nItemCount == 0)
|
||
itor = m_DirectPartyBuffItemList.erase(itor);
|
||
else
|
||
itor++;
|
||
nItemCount++;
|
||
}
|
||
else
|
||
itor++;
|
||
}
|
||
|
||
if(nItemCount <= 1)
|
||
{
|
||
TItemData *pItemData = g_pDataManager->GetItemData(nItemID);
|
||
if( pItemData )
|
||
{
|
||
CDNUserSession * pSession = NULL;
|
||
for(int i=0;i<(int)GetUserCount();i++)
|
||
{
|
||
if( GetUserData(i) != NULL )
|
||
{
|
||
pSession = GetUserData(i);
|
||
if( pSession && pSession->GetPlayerActor() )
|
||
{
|
||
TEffectSkillData* EffectSkill = pSession->GetItem()->GetEffectSkillItem( EffectSkillNameSpace::SearchType::SkillID, pItemData->nSkillID );
|
||
if( EffectSkill )
|
||
{
|
||
CDNUserSession::RemoveEffectSkill(pSession->GetPlayerActor(), EffectSkill);
|
||
pSession->GetItem()->DelEffectSkillItem( pItemData->nSkillID );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
void CDNGameRoom::SendDirectPartyBuffMsg(CDNUserSession * pSession/*=NULL*/)
|
||
{
|
||
if(pSession)
|
||
pSession->SendDirectPartyBuffMsg();
|
||
else
|
||
{
|
||
for(int i=0;i<(int)GetUserCount();i++)
|
||
{
|
||
if( GetUserData(i) != NULL )
|
||
{
|
||
pSession = GetUserData(i);
|
||
if(pSession->bIsDirectPartyBuff())
|
||
{
|
||
pSession->SendDirectPartyBuffMsg();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if defined( PRE_ADD_NEWCOMEBACK )
|
||
|
||
void CDNGameRoom::DelPartyMemberAppellation( int nAppellationID )
|
||
{
|
||
if( GetTaskMng() )
|
||
{
|
||
CDnPartyTask* pPartyTask = (CDnPartyTask*)(GetTaskMng()->GetTask("PartyTask"));
|
||
if( pPartyTask )
|
||
pPartyTask->DelPartyMemberAppellation( nAppellationID );
|
||
}
|
||
}
|
||
|
||
bool CDNGameRoom::CheckPartyMemberAppellation( int nAppellationID/*=0*/ )
|
||
{
|
||
if( GetTaskMng() )
|
||
{
|
||
CDnPartyTask* pPartyTask = (CDnPartyTask*)(GetTaskMng()->GetTask("PartyTask"));
|
||
if( pPartyTask )
|
||
return pPartyTask->CheckPartyMemberAppellation( nAppellationID );
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void CDNGameRoom::ApplyJoinMemberAppellation( CDNUserSession * pSession )
|
||
{
|
||
if( !pSession )
|
||
return;
|
||
if( GetTaskMng() )
|
||
{
|
||
CDnPartyTask* pPartyTask = (CDnPartyTask*)(GetTaskMng()->GetTask("PartyTask"));
|
||
if( pPartyTask )
|
||
pPartyTask->ApplyJoinMemberAppellation( pSession );
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|
||
#if defined( PRE_FIX_BUFFITEM )
|
||
void CDNGameRoom::CheckEffectSkillItemData()
|
||
{
|
||
CDNUserSession * pSession = NULL;
|
||
|
||
for(int i=0;i<(int)GetUserCount();i++)
|
||
{
|
||
if( GetUserData(i) != NULL )
|
||
{
|
||
pSession = GetUserData(i);
|
||
if( pSession )
|
||
{
|
||
pSession->CheckEffectSkillItemData();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if defined( PRE_WORLDCOMBINE_PVP )
|
||
|
||
void CDNGameRoom::AddDBWorldPvPRoom( TWorldPvPMissionRoom *pMissionRoom, UINT nGMAccountDBID )
|
||
{
|
||
if( bIsWorldPvPRoom() )
|
||
{
|
||
if(bIsPvPRoom())
|
||
{
|
||
GetDBConnection()->QueryAddWorldPvPRoom( 0, GetWorldSetID(), nGMAccountDBID, g_Config.nManagedID, GetRoomID(), pMissionRoom );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::AddDBWorldPvPRoomMember( CDNUserSession* pSession )
|
||
{
|
||
if( bIsWorldPvPRoom() )
|
||
{
|
||
if(bIsPvPRoom())
|
||
{
|
||
bool bObserverFlag = false;
|
||
if( pSession->GetTeam() == PvPCommon::Team::Observer )
|
||
{
|
||
bObserverFlag = true;
|
||
}
|
||
GetDBConnection()->QueryAddWorldPvPRoomMember( 0, GetWorldSetID(), pSession, GetPvPMaxUser(), GetWorldPvPRoomDBIndex(), bObserverFlag );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::DelDBWorldPvPRoomMember( CDNUserSession* pSession )
|
||
{
|
||
if( bIsWorldPvPRoom() )
|
||
{
|
||
if(bIsPvPRoom())
|
||
{
|
||
GetDBConnection()->QueryDelWorldPvPRoomMember( 0, GetWorldSetID(), GetWorldPvPRoomDBIndex(), pSession );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::SetWorldPvPRoomStart(bool bFlag)
|
||
{
|
||
if( bIsPvPRoom() )
|
||
{
|
||
m_bWorldPvPRoomStart = bFlag;
|
||
if( m_bWorldPvPRoomStart )
|
||
{
|
||
GetDBConnection()->QueryDelWorldPvPRoom( GetWorldSetID(), GetWorldPvPRoomDBIndex() );
|
||
if( GetPvPGameMode() && GetPvPGameMode()->GetPvPGameModeTable() )
|
||
{
|
||
switch( GetPvPGameMode()->GetPvPGameModeTable()->uiGameMode )
|
||
{
|
||
case PvPCommon::GameMode::PvP_AllKill:
|
||
{
|
||
GetPvPGameMode()->SetWorldPvPRoomStart();
|
||
}
|
||
break;
|
||
case PvPCommon::GameMode::PvP_Tournament:
|
||
{
|
||
// <20><><EFBFBD><EFBFBD>ǥ <20>ϼ<EFBFBD>
|
||
GetPvPGameMode()->SetWorldPvPRoomStart();
|
||
}
|
||
break;
|
||
default:
|
||
printf("CDNGameRoom::SetWorldPvPRoomStart DEFAULT PVP CASE INVALID\n");
|
||
break;
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void CDNGameRoom::SetWorldPvPFARMRoomStart(bool bFlag)
|
||
{
|
||
|
||
printf("CDNGameRoom::SetWorldPvPRoomStart(bool bFlag) : %d \n",bFlag);
|
||
//rlkt 2016
|
||
//GetPvPGameMode()->SetWorldPvPRoomStart();
|
||
//return;
|
||
|
||
printf("CDNGameRoom::SetWorldPvPRoomStart room is pvp\n");
|
||
m_bWorldPvPRoomStart = bFlag;
|
||
if( m_bWorldPvPRoomStart )
|
||
{
|
||
GetDBConnection()->QueryDelWorldPvPRoom( GetWorldSetID(), GetWorldPvPRoomDBIndex() );
|
||
if( GetPvPGameMode() && GetPvPGameMode()->GetPvPGameModeTable() )
|
||
{
|
||
switch( GetPvPGameMode()->GetPvPGameModeTable()->uiGameMode )
|
||
{
|
||
case PvPCommon::GameMode::PvP_AllKill:
|
||
{
|
||
GetPvPGameMode()->SetWorldPvPRoomStart();
|
||
}
|
||
break;
|
||
case PvPCommon::GameMode::PvP_Tournament:
|
||
{
|
||
// <20><><EFBFBD><EFBFBD>ǥ <20>ϼ<EFBFBD>
|
||
GetPvPGameMode()->SetWorldPvPRoomStart();
|
||
}
|
||
break;
|
||
default:
|
||
printf("CDNGameRoom::SetWorldPvPRoomStart DEFAULT PVP CASE INVALID\n");
|
||
break;
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
bool CDNGameRoom::CheckWorldPvPRoomBreakInto( MAGABreakIntoRoom* pPacket )
|
||
{
|
||
DWORD nPlayerCount = 0;
|
||
DWORD nObserverCount = 0;
|
||
|
||
nObserverCount = GetBreakIntoUserTeamCount( PvPCommon::Team::Observer );
|
||
nPlayerCount = GetBreakIntoUserCount() - nObserverCount;
|
||
|
||
for( UINT i=0 ; i<GetUserCount() ; ++i )
|
||
{
|
||
CDNGameRoom::PartyStruct* pStruct = GetPartyData(i);
|
||
if( pStruct->pSession && pStruct->pSession->GetTeam() == PvPCommon::Team::Observer )
|
||
nObserverCount++;
|
||
else if( pStruct->pSession )
|
||
nPlayerCount++;
|
||
|
||
}
|
||
|
||
int nRet = ERROR_NONE;
|
||
if(bIsWorldPvPRoomStart())
|
||
nRet = ERROR_PVP_JOINROOM_NOTFOUNDROOM;
|
||
|
||
if( pPacket->uiTeam == PvPCommon::Team::Observer )
|
||
{
|
||
if( nObserverCount >= PvPCommon::Common::ExtendMaxObserverPlayer)
|
||
nRet = ERROR_PVP_JOINROOM_MAXPLAYER;
|
||
}
|
||
else if( nPlayerCount >= GetPvPMaxUser() )
|
||
{
|
||
nRet = ERROR_PVP_JOINROOM_MAXPLAYER;
|
||
}
|
||
|
||
if( nRet != ERROR_NONE )
|
||
{
|
||
g_pMasterConnectionManager->SendWorldPvPRoomJoinResult( pPacket->cWorldSetID, nRet, pPacket->uiAccountDBID );
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
DWORD CDNGameRoom::GetBreakIntoUserTeamCount( int nTeam )
|
||
{
|
||
int nCount = 0;
|
||
for( std::list<CDNUserSession*>::iterator itor=m_BreakIntoUserList.begin() ; itor!=m_BreakIntoUserList.end() ; ++itor )
|
||
{
|
||
CDNUserSession* pSession = (*itor);
|
||
|
||
// m_VecMember <20><> <20><><EFBFBD><EFBFBD> Push <20>ȵȾָ<C8BE>
|
||
if( GetUserSession( pSession->GetSessionID() ) == NULL )
|
||
{
|
||
if( pSession->GetTeam() == nTeam )
|
||
nCount++;
|
||
}
|
||
}
|
||
return nCount;
|
||
}
|
||
|
||
#endif
|
||
|
||
#if defined(PRE_ADD_ACTIVEMISSION)
|
||
|
||
void CDNGameRoom::InitActiveMission()
|
||
{
|
||
CDnWorld *pWorld = GetWorld();
|
||
if(!pWorld || pWorld->GetMapType() != EWorldEnum::MapTypeDungeon) return;
|
||
if(!GetIsFirstInitializeDungeon()) return;
|
||
|
||
int nActiveMissionGainRate = 0;
|
||
bool bGuildBonus = false;
|
||
|
||
// <20><>Ƽ Ǯ<><C7AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD>̼<EFBFBD> ȹ<><C8B9> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>
|
||
if( pWorld->GetMaxPartyCount() > 1 && pWorld->GetMaxPartyCount() == GetUserCount() )
|
||
{
|
||
bGuildBonus = true;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
CDNUserSession* pSession = m_VecMember[i].pSession;
|
||
if( !pSession->GetGuildUID().IsSet() || pSession->GetGuildUID() != m_VecMember[0].pSession->GetGuildUID() )
|
||
{
|
||
bGuildBonus = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
switch(pWorld->GetMapSubType())
|
||
{
|
||
case EWorldEnum::MapSubTypeNone:
|
||
nActiveMissionGainRate = bGuildBonus ? ActiveMission::NoneTypeActiveMissionGainBonusRate : ActiveMission::NoneTypeActiveMissionGainRate;
|
||
break;
|
||
|
||
case EWorldEnum::MapSubTypeNest:
|
||
case EWorldEnum::MapSubTypeNestNormal:
|
||
nActiveMissionGainRate = bGuildBonus ? ActiveMission::NestTypeActiveMissionGainBonusRate : ActiveMission::NestTypeActiveMissionGainRate;
|
||
break;
|
||
}
|
||
|
||
if(nActiveMissionGainRate <= 0) return;
|
||
|
||
//Ȯ<><C8AE> ġƮ
|
||
int nActiveMissionCheatID = 0;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
{
|
||
if( m_VecMember[i].pSession->GetActiveMissionCheatID() > 0 )
|
||
{
|
||
nActiveMissionCheatID = m_VecMember[i].pSession->GetActiveMissionCheatID();
|
||
m_VecMember[i].pSession->SetActiveMissionCheatID(0); //ġƮ <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
break;
|
||
}
|
||
}
|
||
|
||
TActiveMissionData *pActiveMissionData = NULL;
|
||
|
||
if(nActiveMissionCheatID > 0)
|
||
{
|
||
pActiveMissionData = g_pDataManager->GetActiveMissionData(nActiveMissionCheatID-1);
|
||
}
|
||
else
|
||
{
|
||
if ((rand() % 100) >= nActiveMissionGainRate ) return;
|
||
pActiveMissionData = g_pDataManager->GetRandomActiveMission(m_iMapIdx, rand());
|
||
}
|
||
|
||
if(!pActiveMissionData) return;
|
||
for( UINT i=0 ; i<m_VecMember.size() ; ++i )
|
||
m_VecMember[i].pSession->GetMissionSystem()->SetActiveMission(pActiveMissionData);
|
||
}
|
||
|
||
#endif
|
||
|
||
#if defined(PRE_ADD_RENEW_RANDOM_MAP)
|
||
void CDNGameRoom::OnSelectRandomMap( int nRootMapIndex, int nRandomMapIndex )
|
||
{
|
||
m_iRootMapIndex = nRootMapIndex;
|
||
m_iMapIdx = nRandomMapIndex;
|
||
|
||
g_Log.Log(LogType::_NORMAL, L"CDnGameRoom OnSelectRandomMap %d %d", nRootMapIndex, nRandomMapIndex );
|
||
}
|
||
#endif
|
||
|
||
|
||
DWORD CDNGameRoom::GetPartyUserClassCount(int nClassID)
|
||
{
|
||
DWORD nClassCount = 0;
|
||
for (UINT i = 0; i < m_VecMember.size(); i++)
|
||
{
|
||
if ( (m_VecMember[i].pSession->bIsGMTrace() == false) && (m_VecMember[i].pSession->GetClassID() == nClassID))
|
||
nClassCount++;
|
||
}
|
||
return nClassCount;
|
||
}
|
||
|
||
#if defined( PRE_ALTEIAWORLD_EXPLORE )
|
||
void CDNGameRoom::SetAlteiaWorld(bool bFlag)
|
||
{
|
||
m_bAlteiaWorld = bFlag;
|
||
if( bFlag )
|
||
{
|
||
m_dwAlteiaWorldStartTime = timeGetTime();
|
||
GetDBConnection()->QueryAddStageStartLog( GetDBThreadID(), GetWorldSetID(), 0, GetRoomLogIndex(), GetPartyLogIndex(), static_cast<BYTE>(GetUserCount()), GetGameTask()->GetMapTableID(), static_cast<DBDNWorldDef::DifficultyCode::eCode>(Dungeon::Difficulty::Easy+1) );
|
||
SetStageStartLogFlag( true );
|
||
SetStageEndLogFlag( false );
|
||
}
|
||
else
|
||
{
|
||
m_dwAlteiaWorldPlayTime = timeGetTime() - m_dwAlteiaWorldStartTime;
|
||
|
||
for (UINT i = 0; i < m_VecMember.size(); i++)
|
||
{
|
||
if( m_VecMember[i].pSession )
|
||
{
|
||
m_VecMember[i].pSession->AddAlteiaWorldResult(true);
|
||
}
|
||
}
|
||
|
||
GetDBConnection()->QueryAddStageEndLog( GetDBThreadID(), GetWorldSetID(), 0, GetRoomLogIndex(), DBDNWorldDef::WhereToGoCode::Village );
|
||
}
|
||
}
|
||
|
||
void CDNGameRoom::ResetAlteiaWorldmap()
|
||
{
|
||
if( GetGameTask() )
|
||
GetGameTask()->ResetAlteiaWorldmap();
|
||
}
|
||
|
||
DWORD CDNGameRoom::GetAlteiaPlayTime()
|
||
{
|
||
if( m_dwAlteiaWorldPlayTime > 0 )
|
||
return m_dwAlteiaWorldPlayTime;
|
||
|
||
return 0;
|
||
}
|
||
#endif
|
||
#if defined(PRE_ADD_CP_RANK)
|
||
void CDNGameRoom::SetAbyssStageClearBest(const TAGetStageClearBest* pA)
|
||
{
|
||
memcpy(&m_sLegendClearBest, &pA->sLegendClearBest, sizeof(m_sLegendClearBest));
|
||
memcpy(&m_sMonthlyClearBest, &pA->sMonthlyClearBest, sizeof(m_sMonthlyClearBest));
|
||
if( pA->sLegendClearBest.biCharacterDBID > 0 && m_sLegendClearBest.cRank > 0)
|
||
m_sLegendClearBest.cRank = m_sLegendClearBest.cRank - DBDNWorldDef::ClearGradeCode::eCode::SSS;
|
||
if( pA->sMonthlyClearBest.biCharacterDBID > 0 && m_sMonthlyClearBest.cRank > 0)
|
||
m_sMonthlyClearBest.cRank = m_sMonthlyClearBest.cRank - DBDNWorldDef::ClearGradeCode::eCode::SSS;
|
||
}
|
||
#endif //#if defined(PRE_ADD_CP_RANK)
|
||
|
||
|
||
#if defined( PRE_PVP_GAMBLEROOM )
|
||
void CDNGameRoom::CreateGambleRoom( BYTE cGambleType, int nGamblePrice )
|
||
{
|
||
if( cGambleType == PvPGambleRoom::Gold )
|
||
nGamblePrice *= 10000 ;
|
||
|
||
GetDBConnection()->QueryAddGambleRoom(m_cDBThreadID, GetWorldSetID(), GetRoomID(), cGambleType, nGamblePrice );
|
||
}
|
||
#endif |