DragonNest/Server/DNGameServer/DNUserSession.cpp

4904 lines
152 KiB
C++
Raw Permalink Normal View History

#include "stdafx.h"
#include "DnActor.h"
#include "GameSendPacket.h"
#include "DnWorldProp.h"
#include "Task.h"
#include "TaskManager.h"
#include "DNPartyTask.h"
#include "DNUserSession.h"
#include "DNRUDPGameServer.h"
#include "DNGameRoom.h"
#include "DNPvPGameRoom.h"
#include "DNIocpManager.h"
#include "DNMasterConnection.h"
#include "DNMasterConnectionManager.h"
#include "DNDBConnection.h"
#include "DNDBConnectionManager.h"
#include "DnPlayerActor.h"
#include "DnActor.h"
#include "Log.h"
#include "DNProtocol.h"
#include "DNGameServerScriptAPI.h"
#include "DNUserTcpConnection.h"
#include "DNLogConnection.h"
#include "DnGameTask.h"
#include "DNGameDataManager.h"
#include "PvPRespawnMode.h"
#include "DNFriend.h"
#include "DNIsolate.h"
#include "DNWorldUserState.h"
#include "DNMissionSystem.h"
#include "DNAppellation.h"
#include "DNMissionScheduler.h"
#include "DNAuthManager.h"
#include "DNRestraint.h"
#include "DNGuildSystem.h"
#include "VarArg.h"
#include "DnSkillTask.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 "MasterSystemCacheRepository.h"
#if defined( PRE_ADD_SECONDARY_SKILL )
#include "SecondarySkillRepository.h"
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
#include "DNChatRoom.h"
#include "DNChatRoomManager.h"
#include "LadderStats.h"
#include "DNTimeEventSystem.h"
#include "DnBlow.h"
#include "DNGuildRecruitCacheRepository.h"
#if defined (PRE_ADD_BESTFRIEND)
#include "DNBestFriend.h"
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
#include "DNPrivateChatChannel.h"
#include "DnPrivateChatManager.h"
#endif
#if defined(PRE_FIX_69108)
#include "DNDLGameRoom.h"
#endif
#if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
#include "DnWorldOperationProp.h"
#include "DnItemTask.h"
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
#ifdef PRE_ADD_PACKETSIZE_CHECKER
#include "DNServiceConnection.h"
#endif //#ifdef PRE_ADD_PACKETSIZE_CHECKER
using namespace eItem;
extern TGameConfig g_Config;
CDNUserSession::CDNUserSession(unsigned int iUID, CDNRUDPGameServer * pServer, CDNGameRoom * pRoom)
{
m_pGameServer = pServer;
m_pGameRoom = pRoom;
m_pTcpConnection = NULL;
m_iState = SESSION_STATE_NONE;
m_iNetID = 0; //RUDPSocketFrame<6D>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49>̴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ú<EFBFBD><C3BA>ÿ<EFBFBD> <20>ʿ<EFBFBD>.
m_nSessionID = iUID;
m_cPacketSeq = 1;
memset(m_szNextVillageIP, 0, sizeof(IPLENMAX));
m_nNextVillagePort = 0;
#if defined(_HSHIELD)
#if defined( PRE_ADD_HSHIELD_LOG )
g_Log.Log(LogType::_HACKSHIELD, m_pSession, L"[_AhnHS_CreateClientObject before - (%d) ] ServerHandle[%x] : 0x%x\r\n", GetSessionID(), g_Config.hHSServer, m_hHSClient);
#endif
m_hHSClient = _AhnHS_CreateClientObject(g_Config.hHSServer);
#if defined( PRE_ADD_HSHIELD_LOG )
g_Log.Log(LogType::_HACKSHIELD, m_pSession, L"[_AhnHS_CreateClientObject after - (%d) ] ServerHandle[%x] : 0x%x\r\n", GetSessionID(), g_Config.hHSServer, m_hHSClient);
#endif
if(m_hHSClient == ANTICPX_INVALID_HANDLE_VALUE){
DetachConnection(L"ANTICPX_INVALID_HANDLE_VALUE");
return;
}
m_dwCheckLiveTick = m_dwHShieldResponseTick = timeGetTime();
#endif // _HSHIELD
m_bStageAbortLog = true;
for( int i=0; i<3; i++ ) {
memset( m_pPacketQueueBuffer[i], 0, PACKET_QUEUE_SIZE );
m_nPacketQueueOffset[i] = 0;
m_nPacketQueueCount[i] = 0;
}
m_bIntededDisconnected = false;
m_bRudpDisconnected = false;
m_nRudpDisconnectedTick = 0;
m_iTeam = 0;
m_cKickKind = -1;
m_bAbsent = false;
m_bPvPGameModeFinish = false;
m_bGMTrace = false;
m_iDecreaseFatigue = 0;
m_bLoadingComplete = false;
m_iTotalMasterDecreaseFatigue = 0;
m_nPartyMemberIndex = -1;
m_nChatRoomID = 0;
m_bPvPFatigueOption = false;
m_biPickUpCoin = 0;
#if defined( PRE_USA_FATIGUE )
m_bNoFagiueEnter = false;
#endif // #if defined( PRE_USA_FATIGUE )
m_bOuted = false;
m_dwCheckUdpPing = timeGetTime();
m_pairUdpPing = std::make_pair(0,0);
m_dwKeepOperationID = 0;
m_bHide = false;
m_bTutorial = false;
m_uiPvPUserState = 0;
m_mGuildRewardItem.clear();
m_nPeriodeExpItemRate = 0;
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
m_nGoldBoxCheatID = 0;
#endif
#if defined(PRE_ADD_ACTIVEMISSION)
m_nActiveMissionCheatID = 0;
#endif
#if defined( PRE_ADD_DIRECTNBUFF )
m_bDirectPartyBuffItem = false;
m_DirectPartyBuffItemList.clear();
#endif
#ifdef PRE_MOD_INDUCE_TCPCONNECT
m_dwSendReqTCPConnect = 0;
m_bRecvReqTCPConnectMsg = false;
#endif //#ifdef PRE_MOD_INDUCE_TCPCONNECT
#if defined( PRE_ADD_GUILDREWARDITEM )
m_GuildRewardbuffItemList.clear();
#endif
#if defined( PRE_ALTEIAWORLD_EXPLORE )
m_nAlteiaWorldPosition = 1;
m_dwAlteiaWorldMoveNextMapTick = 0;
m_cDailyPlayCount = 0;
m_bCanDice = true;
#endif
#ifdef PRE_ADD_PACKETSIZE_CHECKER
m_nSendCheckTick = 0;
m_nSendCheckSize = 0;
m_nSendCheckCount = 0;
memset(m_SendDebugInfo, 0, sizeof(m_SendDebugInfo));
m_nSendDebugInfoCount = 0;
//memset(m_SendActorDebugInfo, 0, sizeof(m_SendActorDebugInfo));
//m_nSendActorDebugInfoCount = 0;
_ACTOR_SENDINFO Info;
memset(&Info, 0, sizeof(_ACTOR_SENDINFO));
for (int i = 0; i < eActor::SC_ACTOR_STATE_MAX; i++)
m_vActorSendInfo.push_back(Info);
m_bActorDebugSended = false;
#endif //#ifdef PRE_ADD_PACKETSIZE_CHECKER
}
CDNUserSession::~CDNUserSession()
{
for( DNVector(_STORE_PACKET)::iterator ii = m_pStoredPacketList.begin(); ii != m_pStoredPacketList.end(); ii++)
CLfhHeap::GetInstance()->_DeAlloc((*ii).pMsg);
}
const char * CDNUserSession::GetIp()
{
if(m_pTcpConnection)
return m_pTcpConnection->GetIp();
return NULL;
}
const WCHAR * CDNUserSession::GetIpW()
{
if(m_pTcpConnection)
return m_pTcpConnection->GetwszIp();
return NULL;
}
int CDNUserSession::GetServerID()
{
// 2009.01.20 <20><><EFBFBD><EFBFBD>
// return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾ<EFBFBD> <20><><EFBFBD><EFBFBD>
if(m_pGameServer)
return m_pGameServer->GetServerID();
return -1;
}
int CDNUserSession::GetRoomID()
{
if(m_pGameRoom) return m_pGameRoom->GetRoomID();
return 0;
}
TPARTYID CDNUserSession::GetPartyID()
{
return m_pGameRoom->GetPartyIndex();
}
void CDNUserSession::SetSessionState(int nState)
{
if(m_iState == SESSION_STATE_DISCONNECTED) return; //<2F>̹<EFBFBD> <20><><EFBFBD>̳<EFBFBD><CCB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
m_iState = nState;
if (m_iState == SESSION_STATE_LOADED)
m_bLoadUserData = true;
}
int CDNUserSession::GetPromotionValue(int nType)
{
std::vector <TUserPromotionData>::iterator ii;
for(ii = m_vPromotionData.begin(); ii != m_vPromotionData.end(); ii++)
{
if((*ii).nType == nType)
return(*ii).nValue;
}
return 0;
}
void CDNUserSession::SetKeepOperationID(DWORD dwUniqueID)
{
m_dwKeepOperationID = dwUniqueID;
}
bool CDNUserSession::IsConnected()
{
return(m_iState >= SESSION_STATE_CONNECTED) &&(m_iState != SESSION_STATE_DISCONNECTED) &&
(m_pTcpConnection != NULL && m_pTcpConnection->GetDelete() == false) ? true : false;
}
bool CDNUserSession::RUDPConnected(int iNetID)
{
_ASSERT(iNetID != 0);
if(m_iState >= SESSION_STATE_RUDP_CONNECTED || iNetID == 0)
{
g_Log.Log(LogType::_ERROR, this, L"Connect|ReConnected RUDP err NetID:%d\n", iNetID);
return false;
}
m_iNetID = iNetID;
SetSessionState(SESSION_STATE_RUDP_CONNECTED);
return true;
}
bool CDNUserSession::TCPConnected(CDNTcpConnection * pCon)
{
if(m_iState != SESSION_STATE_RUDP_CONNECTED)
{
g_Log.Log(LogType::_ERROR, this, L"Connect|RUDP Connected Not Yet ADBID[%d] CNAME[%s]", GetAccountDBID(), GetCharacterName());
return false;
}
if(g_pMasterConnectionManager->SendEnterGame(m_nWorldSetID, GetAccountDBID(), GetGameRoom()->GetRoomID(), m_pGameServer->GetServerID()) == false)
{
g_Log.Log(LogType::_ERROR, this, L"Connect|MasterCon Not Found ADBID[%d] CNAME[%s]", GetAccountDBID(), GetCharacterName());
return false;
}
m_pTcpConnection = pCon;
SetSessionState(SESSION_STATE_CONNECTED);
m_bCertified = false;
m_dwCertifyingTick = timeGetTime();
g_pAuthManager->QueryCheckAuth(GetCertifyingKey(), this);
InitVoice();
#ifdef PRE_MOD_INDUCE_TCPCONNECT
#endif //#ifdef PRE_MOD_INDUCE_TCPCONNECT
return true;
}
void CDNUserSession::RudpDisConnected()
{
//rudp<64><70> <20><><EFBFBD><EFBFBD><EFBFBD>̴ϴ<CCB4>. tcp<63><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD> room, session<6F><6E> state<74><65> Ȯ<><C8AE><EFBFBD>ؼ<EFBFBD> <20><>¥ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴµ<CFB4>
if(IsConnected() && m_iState != SESSION_STATE_SERVER_CHANGE) //<2F>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. rudp<64><70> <20><EFBFBD><E7BFAC> <20><><EFBFBD><EFBFBD> <20>մϴ<D5B4>.
{
SendReConnectReq();
m_bRudpDisconnected = true;
m_nRudpDisconnectedTick = GetGameRoom()->GetGameTick(); //<2F><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD>.
}
}
void CDNUserSession::_SendReconnectLogin()
{
if( m_pGameRoom->GetRoomState() != _GAME_STATE_SYNC2PLAY )
g_pMasterConnectionManager->SendLoginState(m_nWorldSetID, m_nAccountDBID);
else {
SendReconnectLogin(ERROR_GENERIC_INVALIDREQUEST, 0, 0);
}
}
void CDNUserSession::SetPromotionData(int nPromotionType, int nValue)
{
bool bAdded = false;
std::vector <TUserPromotionData>::iterator ii;
for(ii = m_vPromotionData.begin(); ii != m_vPromotionData.end(); ii++)
{
if((*ii).nType == nPromotionType)
{
(*ii).nValue = (*ii).nValue < nValue ? nValue :(*ii).nValue;
bAdded = true;
}
}
if(bAdded == false)
{
TUserPromotionData Promo;
memset(&Promo, 0, sizeof(TUserPromotionData));
Promo.nType = nPromotionType;
Promo.nValue = nValue;
// <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> 10000 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 100<30><30> <20><><EFBFBD>ش<EFBFBD>.
if( Promo.nType == PROMOTIONTYPE_DECREASEFATIGUE )
Promo.nValue *= 100;
m_vPromotionData.push_back(Promo);
}
}
void CDNUserSession::IntendedDisconnected()
{
m_bIntededDisconnected = true;
}
void CDNUserSession::DetachConnection(wchar_t *pwszIdent)
{
if(m_iState == SESSION_STATE_DISCONNECTED) return;
// <20><><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD> m_VecMember <20><> pushback <20>ϱ<EFBFBD> <20><><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> RemoveMember() ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20>ּ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ϸ<EFBFBD> <20>ȵǿ<C8B5>~~~!!!
if(GetGameRoom())
{
if( GetGameRoom()->bIsBreakIntoUser( this ) )
{
if( GetGameRoom()->GetPartyData(this) == NULL )
{
GetGameRoom()->RemoveMember(this, pwszIdent);
if(GetTcpConnection())
GetTcpConnection()->DetachConnection(pwszIdent);
return;
}
}
}
if(GetTcpConnection())
GetTcpConnection()->DetachConnection(pwszIdent);
else if(GetGameRoom())
GetGameRoom()->RemoveMember(this, pwszIdent);
else _DANGER_POINT();
#ifdef _USE_VOICECHAT
LeaveVoiceChannel();
if(GetGameRoom())
GetGameRoom()->SendRefreshVoiceInfo(GetAccountDBID());
else _DANGER_POINT();
#endif
}
#ifdef PRE_MOD_INDUCE_TCPCONNECT
void CDNUserSession::SendReqTCPConnect(DWORD dwCurTick)
{
if (GetState() != SESSION_STATE_RUDP_CONNECTED) return;
if (m_bRecvReqTCPConnectMsg == true) return;
if (m_dwSendReqTCPConnect == 0 || m_dwSendReqTCPConnect + 3000 < dwCurTick)
{
m_dwSendReqTCPConnect = dwCurTick;
SendPacket(SC_SYSTEM, eSystem::SC_TCP_CONNECT_REQ, NULL, 0, _RELIABLE);
g_Log.Log(LogType::_GAMECONNECTLOG, this, L"[%d] CS_CONNECT_REQUEST\n", g_Config.nManagedID);
}
}
void CDNUserSession::RecvReqTCPConnect()
{
g_Log.Log(LogType::_GAMECONNECTLOG, this, L"[%d] CS_TCP_CONNECT_REQ\n", g_Config.nManagedID);
}
#endif //#ifdef PRE_MOD_INDUCE_TCPCONNECT
void CDNUserSession::DoUpdate( DWORD dwCurTick )
{
#ifdef PRE_MOD_INDUCE_TCPCONNECT
if (GetGameRoom()->GetRoomState() == _GAME_STATE_READY2CONNECT || GetGameRoom()->GetRoomState() == _GAME_STATE_CONNECT2CHECKAUTH)
{
SendReqTCPConnect(dwCurTick);
return;
}
#endif //#ifdef PRE_MOD_INDUCE_TCPCONNECT
if( bIsCheckPing() == true )
{
if( dwCurTick-m_dwCheckUdpPing >= CHECK_UDP_PING_TICK )
{
m_dwCheckUdpPing = dwCurTick;
SendUdpPing( GetSessionID(), dwCurTick );
}
}
#if defined( PRE_ALTEIAWORLD_EXPLORE )
// if( m_dwAlteiaWorldMoveNextMapTick > 0 && dwCurTick - m_dwAlteiaWorldMoveNextMapTick >= AlteiaWorld::Common::MoveNextMapTick)
// {
// MoveAlteiaNextMap();
// }
#endif
CDNUserBase::DoUpdate(dwCurTick);
}
void CDNUserSession::DecreaseFatigue( bool bFinalUser/*=false*/ )
{
if( GetGameRoom() && GetGameRoom()->GetMasterRewardSystem() )
{
if( GetGameRoom()->GetMasterRewardSystem()->bIsFatigueReward( this ) )
{
m_iTotalMasterDecreaseFatigue += GetDecreaseFatigue(); // <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD>
#if defined( _WORK )
WCHAR wszBuf[MAX_PATH];
wsprintf( wszBuf, L"[<5B><><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>] <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" );
SendDebugChat( wszBuf );
#endif // #if defined( _WORK )
return;
}
}
int iDecreaseFatigue = GetDecreaseFatigue();
if( iDecreaseFatigue > 0 )
{
// FinalUser <20>ÿ<EFBFBD><C3BF><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if( bFinalUser && !bIsLoadingComplete() )
{
g_Log.Log(LogType::_LOADINGDISCONNECT, this, L"<EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ܼ<EFBFBD> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Fatigue(<28>Ϲ<EFBFBD>:%d <20>ְ<EFBFBD>:%d PC<50><43>:%d Event:%d VIP:%d)\r\n", GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(),GetEventFatigue());
return;
}
if( CDnWorld::GetInstance( GetGameRoom() ).GetMapType() == EWorldEnum::MapTypeDungeon )
{
int iPrevValue = iDecreaseFatigue;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int iLevelDecreaseValue = (iDecreaseFatigue*g_pDataManager->GetFatigue10000RatioFromPlayerCommonLevelTable( GetLevel() )/10000);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int iMaxLevelDecreaseValue = (iDecreaseFatigue*GetPromotionValue(PROMOTIONTYPE_DECREASEFATIGUE)/10000);
iDecreaseFatigue -= (iLevelDecreaseValue+iMaxLevelDecreaseValue);
if( iDecreaseFatigue < 0 )
iDecreaseFatigue = 0;
#if defined( _WORK )
WCHAR wszBuf[MAX_PATH];
wsprintf( wszBuf, L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ƿε<C7B7>:%d <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d <20><><EFBFBD><EFBFBD>:%d\r\n", iPrevValue, iLevelDecreaseValue, iMaxLevelDecreaseValue, iDecreaseFatigue );
SendDebugChat( wszBuf );
#endif // #if defined( _WORK )
if( iDecreaseFatigue > 0 )
DecreaseFatigue( iDecreaseFatigue );
}
SetDecreaseFatigue(0);
}
}
void CDNUserSession::MasterMessageProcess(int iMainCmd, int iSubCmd, const void * pData, int iLen)
{//<2F>ܺ<EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ǵܿ<C7B4><DCBF><EFBFBD> ó<><C3B3><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> <20><> <20>Դϴ<D4B4>.
switch(iMainCmd)
{
case MAGA_NEXTVILLAGEINFO:
{
MAGANextVillageInfo * pPacket = (MAGANextVillageInfo*)pData;
SetWindowState(WINDOW_NONE);
GetGameRoom()->SendNextVillageInfo(pPacket->szIP, pPacket->nPort, pPacket->nMapIdx, pPacket->nNextMapIdx, pPacket->nNextGateIdx, pPacket->nRet, pPacket->nItemSerial);
break;
}
case MAGA_REBIRTHVILLAGEINFO:
{
MAGARebirthVillageInfo *pInfo = (MAGARebirthVillageInfo*)pData;
if( pInfo->nRet == ERROR_NONE )
{
_strcpy( m_szNextVillageIP, _countof(m_szNextVillageIP), pInfo->szIP, (int)strlen(pInfo->szIP));
m_nNextVillagePort = pInfo->nPort;
m_bCharOutLog = false;
SetSessionState(SESSION_STATE_READY_TO_VILLAGE);
m_biCertifyingKey = g_pAuthManager->GetCertifyingKey();
DN_ASSERT(0 != m_biCertifyingKey, "Invalid!"); // <20><><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> 0 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>ʵ<EFBFBD> !!!(<28><><EFBFBD><EFBFBD> <20>ǹ<EFBFBD>)
g_pAuthManager->QueryStoreAuth(SERVERTYPE_GAME, this);
}
else
{
SendVillageInfo(m_szNextVillageIP, m_nNextVillagePort, pInfo->nRet, 0, 0);
_SendReconnectLogin();
}
if(m_pGameRoom)
{
GetGameRoom()->OnDelPartyMember(GetSessionID(), m_cKickKind);
#if defined(PRE_ADD_REVENGE)
if( m_pGameRoom->bIsPvPRoom() && !GetPvPGameModeFinish() )
static_cast<CDNPvPGameRoom*>(m_pGameRoom)->OnLeaveRoomBeforeFinish(GetSessionID());
#endif
}
break;
}
case MAGA_MOVEPVPGAMETOPVPLOBBY:
{
MAGAMovePvPGameToPvPLobby* pPacket = (MAGAMovePvPGameToPvPLobby*)pData;
if( pPacket->nRet == ERROR_NONE )
{
// <20><><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD>
if( m_pGameRoom )
#if defined(PRE_ADD_REVENGE)
{
m_pGameRoom->OnDelPartyMember(GetSessionID(), -1);
if( m_pGameRoom->bIsPvPRoom() && !GetPvPGameModeFinish() )
static_cast<CDNPvPGameRoom*>(m_pGameRoom)->OnLeaveRoomBeforeFinish(GetSessionID());
}
#else
m_pGameRoom->OnDelPartyMember(GetSessionID(), -1);
#endif
else
_DANGER_POINT();
_strcpy( m_szNextVillageIP, _countof(m_szNextVillageIP), pPacket->szIP, (int)strlen(pPacket->szIP) );
m_nNextVillagePort = pPacket->unPort;
m_bCharOutLog = false;
SetSessionState(SESSION_STATE_READY_TO_VILLAGE);
m_biCertifyingKey = g_pAuthManager->GetCertifyingKey();
DN_ASSERT(0 != m_biCertifyingKey, "Invalid!"); // <20><><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> 0 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>ʵ<EFBFBD> !!!(<28><><EFBFBD><EFBFBD> <20>ǹ<EFBFBD>)
g_pAuthManager->QueryStoreAuth(SERVERTYPE_GAME, this);
}
else {
SendVillageInfo( m_szNextVillageIP, m_nNextVillagePort, pPacket->nRet, 0, 0);
}
break;
}
case MAGA_LOGINSTATE:
{
MAGALoginState *pState = (MAGALoginState*)pData;
if(ERROR_NONE != pState->nRet) {
SendReconnectLogin(pState->nRet, 0, 0);
break;
}
SetSessionState(SESSION_STATE_READY_TO_LOGIN);
m_biCertifyingKey = g_pAuthManager->GetCertifyingKey();
DN_ASSERT(0 != m_biCertifyingKey, "Invalid!"); // <20><><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> 0 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>ʵ<EFBFBD> !!!(<28><><EFBFBD><EFBFBD> <20>ǹ<EFBFBD>)
g_pAuthManager->QueryStoreAuth(SERVERTYPE_GAME, this);
if(m_pGameRoom)
{
GetGameRoom()->OnDelPartyMember(GetSessionID(), m_cKickKind);
#if defined(PRE_ADD_REVENGE)
if( GetGameRoom()->bIsPvPRoom() && !GetPvPGameModeFinish() )
static_cast<CDNPvPGameRoom*>(GetGameRoom())->OnLeaveRoomBeforeFinish(GetSessionID());
#endif
}
break;
}
case MAGA_FRIENDADDNOTICE:
{
MAGAFriendAddNotice * pNotice = (MAGAFriendAddNotice*)pData;
SendFriendAddNotice(pNotice->wszAddName);
break;
}
case MAGA_PRIVATECHAT:
{
MAPrivateChat *pChat = (MAPrivateChat*)pData;
if(pChat->wChatLen > CHATLENMAX-1) break;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pChat->wszChatMsg, pChat->wChatLen);
if( m_pIsolate && m_pIsolate->IsIsolateItem(pChat->wszFromCharacterName)) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF>Լ<EFBFBD> <20><> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
break;
if( pChat->nRet == ERROR_NONE )
{
// GM<47≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20>ؾ<EFBFBD><D8BE><EFBFBD>
if((GetAccountLevel() <= AccountLevel_QA) &&(GetAccountLevel() >= AccountLevel_New))
{
if(!GetGMCommand()->IsWhisperName(pChat->wszFromCharacterName))
{
break;
}
}
}
SendChat(pChat->cType, pChat->wChatLen, pChat->wszFromCharacterName, wszChatMsg, NULL, pChat->nRet);
break;
}
case MAGA_CHAT:
{
MAChat *pChat = (MAChat*)pData;
if(pChat->wChatLen > CHATLENMAX-1 || pChat->wChatLen <= 0) break;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pChat->wszChatMsg, pChat->wChatLen);
SendChat(static_cast<eChatType>(pChat->cType), pChat->wChatLen, pChat->wszFromCharacterName, wszChatMsg);
break;
}
case MAGA_DETACHUSER:
{
MADetachUser* pDetach = (MADetachUser*)pData;
if( pDetach->bIsDuplicate )
{
bool bIsDetach = true;
if( GetGameRoom() && GetGameRoom()->IsRoomCrash() )
// ũ<><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> Auth <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD> <20><><EFBFBD><EFBFBD>..
bIsDetach = false;
g_pMasterConnectionManager->SendDuplicateLogin(GetWorldSetID(), pDetach->nAccountDBID, bIsDetach, pDetach->nSessionID);
if( GetGameRoom() )
g_Log.Log(LogType::_NORMAL, GetWorldSetID(), GetAccountDBID(), GetCharacterDBID(), GetSessionID(), L"[MAGA_DETACHUSER] Duplicate User InGame!! RoomState:%d, SessionState:%d, RoomCrash:%d\r\n", GetGameRoom()->GetRoomState(), m_iState, GetGameRoom()->IsRoomCrash());
else
g_Log.Log(LogType::_NORMAL, GetWorldSetID(), GetAccountDBID(), GetCharacterDBID(), GetSessionID(), L"[MAGA_DETACHUSER] Duplicate User InGame!! SessionState:%d\r\n", m_iState);
#if defined(PRE_MOD_DUPLICATION_LOGIN_MES)
// <20>ߺ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û.
// DetachFlag<61><67> On<4F><6E> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ(Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD>۵ǰų<C7B0> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ߺ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD> <20><><EFBFBD><EFBFBD>)
if(bIsDetach && GetTcpConnection() && !GetTcpConnection()->GetDetachFlag())
SendCompleteDetachMsg( ERROR_DUPLICATEUSER_INGAME, L"ERROR_DUPLICATEUSER_INGAME", true);
else
DetachConnection(L"MAGA_DETACHUSER | DUPLICATEUSER");
break;
#endif // #if defined(PRE_MOD_DUPLICATION_LOGIN_MES)
}
DetachConnection(L"MAGA_DETACHUSER");
break;
}
#if defined(_CH)
case MAGA_FCMSTATE: // <20>Ƿε<C7B7>
{
MAFCMState *pState = (MAFCMState*)pData;
SetFCMOnlineMin(pState->nOnlineMin, pState->bSend);
break;
}
#endif // _CH
case MAGA_NOTIFYMAIL:
{
MANotifyMail *pMail = (MANotifyMail*)pData;
if(pMail->biToCharacterDBID == m_biCharacterDBID)
SendNotifyMail(pMail->wTotalMailCount, pMail->wNotReadMailCount, pMail->w7DaysLeftCount, pMail->bNewMail); // <20><><EFBFBD><EFBFBD><EFBFBD>Դٰ<D4B4> <20>
break;
}
case MAGA_NOTIFYMARKET:
{
MANotifyMarket *pMarket = (MANotifyMarket*)pData;
if(pMarket->biSellerCharacterDBID == m_biCharacterDBID)
SendNotifyMarket(pMarket->nItemID, pMarket->wCalculationCount);
break;
}
case MAGA_NOTIFYGIFT:
{
MANotifyGift *pGift = (MANotifyGift*)pData;
if(pGift->biToCharacterDBID == GetCharacterDBID())
SendCashshopNotifyGift(pGift->bNew, pGift->nGiftCount); // <20><><EFBFBD><EFBFBD><EFBFBD>Դٰ<D4B4> <20>
break;
}
case MAGA_RESTRAINT:
{
MARestraint * pPacket = (MARestraint*)pData;
GetDBConnection()->QueryGetRestraint( this );
break;
}
case MAGA_PCBANGRESULT:
{
MAPCBangResult *pResult = (MAPCBangResult*)pData;
PCBangResult(pResult);
break;
}
case MAGA_INVITEPARTYMEMBERRESULT:
{
MAGAInvitePartyMemberResult * pPacket = (MAGAInvitePartyMemberResult*)pData;
GetGameRoom()->ResetInvite(pPacket->nRetCode);
SendPartyInviteFail(pPacket->nRetCode);
break;
}
#if defined(PRE_MOD_REQ_JOIN_PARTY_ANSWER_MSG_APP)
case MAGA_GETPARTYID:
{
MAGAGetPartyID* pPacket = (MAGAGetPartyID*)(pData);
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendGetPartyIDResult(GetGameRoom()->GetWorldSetID(), pPacket->nSenderAccountDBID, GetPartyID());
break;
}
case MAGA_REQPARTYASKJOIN:
{
MAGAReqPartyAskJoin* pPacket = (MAGAReqPartyAskJoin*)(pData);
if( GetPartyID() <= 0 )
{
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendResPartyAskJoin( GetGameRoom()->GetWorldSetID(), ERROR_PARTY_ASKJOIN_PARTY_NOTFOUND, pPacket->nReqAccountDBID );
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
const TMapInfo* pMapInfo = g_pDataManager->GetMapInfo( GetMapIndex() );
if( pMapInfo == NULL || pMapInfo->MapType != GlobalEnum::MAP_WORLDMAP )
{
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendResPartyAskJoin( GetGameRoom()->GetWorldSetID(), ERROR_PARTY_ASKJOIN_FAIL, pPacket->nReqAccountDBID );
break;
}
CDNUserSession* pLeader = GetGameRoom()->GetUserSessionByCharDBID((GetGameRoom()->GetPartyStructData().biLeaderCharacterDBID));
if( pLeader == NULL )
{
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendResPartyAskJoin( GetGameRoom()->GetWorldSetID(), ERROR_PARTY_ASKJOIN_FAIL, pPacket->nReqAccountDBID );
break;
}
if( pLeader->GetIsolate()->IsIsolateItem(pPacket->wszReqChracterName) )
{
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendResPartyAskJoin( GetGameRoom()->GetWorldSetID(), ERROR_PARTY_ASKJOIN_FAIL, pPacket->nReqAccountDBID );
break;
}
if( pLeader->IsAcceptAbleOption(pPacket->biReqCharacterDBID, pPacket->nReqAccountDBID, _ACCEPTABLE_CHECKTYPE_PARTYINVITE) == false)
{
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendResPartyAskJoin( GetGameRoom()->GetWorldSetID(), ERROR_PARTY_ASKJOIN_FAIL, pPacket->nReqAccountDBID );
break;
}
if( !pLeader->IsNoneWindowState() )
{
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendResPartyAskJoin( GetGameRoom()->GetWorldSetID(), ERROR_PARTY_ASKJOIN_DESTUSER_SITUATION_NOTALLOWED, pPacket->nReqAccountDBID );
break;
}
pLeader->SetWindowState(WINDOW_ISACCEPT);
pLeader->SendAskJoinToLeader(pPacket->wszReqChracterName, pPacket->cReqUserJob, pPacket->cReqUserLevel);
break;
}
#endif
case MAGA_USERTEMPDATA_RESULT:
{
MAGAUserTempDataResult * pPacket = (MAGAUserTempDataResult*)pData;
SetDungeonClearCount(pPacket->nDungeonClearCount);
#if defined(PRE_ADD_REMOTE_QUEST)
GetQuest()->RefreshRemoteQuest(pPacket->nAcceptWaitRemoteQuestCount, pPacket->AcceptWaitRemoteQuestList);
#endif
#if defined(PRE_ADD_GAMEQUIT_REWARD)
SetUserGameQuitRewardType(pPacket->eUserGameQuitRewardType);
#endif // #if defined(PRE_ADD_GAMEQUIT_REWARD)
break;
}
case MAGA_PVP_MEMBERINDEX:
{
MAGAPvPMemberIndex * pPacket = (MAGAPvPMemberIndex*)pData;
if(GetGameRoom()->bIsPvPRoom())
{
if(pPacket->nRetCode == ERROR_NONE)
{
CDNPvPGameRoom * pPvPRoom = static_cast<CDNPvPGameRoom*>(GetGameRoom());
if(pPvPRoom)
{
CSPartySwapMemberIndex packet;
memset(&packet, 0, sizeof(CSPartySwapMemberIndex));
packet.cCount = pPacket->cCount;
for (int h = 0; h < packet.cCount; h++)
{
packet.Index[h].cIndex = pPacket->Index[h].cIndex;
packet.Index[h].nSessionID = pPacket->Index[h].nSessionID;
}
if(pPvPRoom->PartySwapMemberIndex(&packet) == false)
_DANGER_POINT(); //<2F><EFBFBD><ECBFA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pPvPRoom->SendMemberIndex(pPacket->nTeam, pPacket->cCount, pPacket->Index, pPacket->nRetCode);
}
}
else
SendPvPMemberIndex(pPacket->nTeam, 0, NULL, pPacket->nRetCode);
}
else
_DANGER_POINT();
break;
}
case MAGA_PVP_MEMBERGRADE:
{
MAGAPvPMemberGrade * pPacket = (MAGAPvPMemberGrade*)pData;
if(GetGameRoom()->bIsPvPRoom())
{
CDNPvPGameRoom * pPvPRoom = static_cast<CDNPvPGameRoom*>(GetGameRoom());
if(pPvPRoom)
pPvPRoom->SendMemberGrade(pPacket->nTeam, pPacket->uiUserState, pPacket->nChangedSessionID, pPacket->nRetCode);
}
else _DANGER_POINT();
break;
}
#if defined(PRE_ADD_DWC)
case MAGA_DWC_TEAMCHAT:
{
MAChat *pChat = (MAChat*)pData;
if(pChat->wChatLen > CHATLENMAX-1 || pChat->wChatLen <= 0) break;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pChat->wszChatMsg, pChat->wChatLen);
SendChat(static_cast<eChatType>(pChat->cType), pChat->wChatLen, pChat->wszFromCharacterName, wszChatMsg);
break;
}
#endif
}
}
void CDNUserSession::OnDBRecvAuth(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvAuth(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvCharInfo(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvCharInfo(nSubCmd, pData);
switch(nSubCmd)
{
case QUERY_SELECTCHARACTER:
{
TASelectCharacter *pSelect = (TASelectCharacter*)pData;
if(pSelect->nRetCode != ERROR_NONE){
DetachConnection(L"QUERY_SELECTCHARACTER");
#ifdef _DEBUG
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u CDBID:%I64d SID:%u] QUERY_SELECTCHARACTER Ret:%d\r\n", pSelect->nAccountDBID, m_biCharacterDBID, m_nSessionID, pSelect->nRetCode);
#endif
return;
}
if(!m_pGameRoom){
DetachConnection(L"QUERY_SELECTCHARACTER m_pGameRoom = NULL");
#ifdef _DEBUG
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u CDBID:%I64d SID:%u] QUERY_SELECTCHARACTER Session not Found\r\n", pSelect->nAccountDBID, m_biCharacterDBID, m_nSessionID);
#endif
return;
}
#if defined( PRE_ADD_CHARACTERCHECKSUM )
if( m_bTutorial && pSelect->tLastLoginDate <= pSelect->tLastLogoutDate && pSelect->uiCheckSum )
{
UINT uiCheckSum = MakeCharacterCheckSum( pSelect->biCharacterDBID, pSelect->UserData.Status.cLevel, pSelect->UserData.Status.nExp, pSelect->UserData.Status.nCoin, pSelect->UserData.Status.nWarehouseCoin );
if( uiCheckSum != pSelect->uiCheckSum )
{
if( m_pDBCon )
{
#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 8418, m_eSelectedLanguage);
std::wstring wszRestraintReasonForDolis = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 8419, m_eSelectedLanguage);
#else //#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 8418);
std::wstring wszRestraintReasonForDolis = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 8419);
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
// <20><><EFBFBD><EFBFBD>ȭ <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɵ<EFBFBD><C9B5><EFBFBD> <20><><EFBFBD><EFBFBD>.
//m_pDBCon->QueryAddRestraint(this, DBDNWorldDef::RestraintTargetCode::Account, DBDNWorldDef::RestraintTypeCode::ConnectRestraint, wszRestraintReason.c_str(), wszRestraintReasonForDolis.c_str(), 9999);
}
//DetachConnection(L"QUERY_SELECTCHARACTER Invalid Character CheckSum");
g_Log.Log(LogType::_ERROR, this, L"Invalid Character CheckSum(cid:%I64d, level:%d, exp:%d, coin:%I64d, wcoin:%I64d, mychecksum:%x, dbchecksum:%x)\r\n", pSelect->biCharacterDBID, pSelect->UserData.Status.cLevel, pSelect->UserData.Status.nExp, pSelect->UserData.Status.nCoin, pSelect->UserData.Status.nWarehouseCoin, uiCheckSum, pSelect->uiCheckSum );
//return;
}
}
#endif // #if defined( PRE_ADD_CHARACTERCHECKSUM )
LoadUserData(pSelect);
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
_ASSERT( m_pReputationSystem && m_pReputationSystem->GetEventHandler() );
m_pReputationSystem->GetEventHandler()->OnConnect( pSelect->UserData.Status.tLastConnectDate, false );
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
GetDBConnection()->GetCountReceiveMail(this); // <20><><EFBFBD><EFBFBD>, market ī<><C4AB>Ʈ <20><>û
GetDBConnection()->QueryGetCountHarvestDepotItem( this ); // <20><><EFBFBD><EFBFBD> â<><C3A2> ī<><C4AB>Ʈ <20><>û
#if defined(_KRAZ)
if (m_bTutorial)
m_pDBCon->QueryActozUpdateCharacterInfo(this, ActozCommon::UpdateType::Login);
#endif // #if defined(_KRAZ)
#ifdef _DEBUG
g_Log.Log(LogType::_NORMAL, this, L"[ADBID:%u CDBID:%I64d SID:%u] QUERY_SELECTCHARACTER\r\n", pSelect->nAccountDBID, m_biCharacterDBID, m_nSessionID);
#endif
}
break;
case QUERY_CHANGESERVERUSERDATA:
{
TAUpdateCharacter *pUpdate = (TAUpdateCharacter*)pData;
if(pUpdate->nRetCode != ERROR_NONE){
#ifdef _DEBUG
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u CDBID:%I64d SID:%u] QUERY_UPDATECHANGESERVER Ret:%d\r\n", pUpdate->nAccountDBID, m_biCharacterDBID, m_nSessionID, pUpdate->nRetCode);
#endif
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4> <20>̵<EFBFBD><CCB5>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20>ӽõ<D3BD><C3B5><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendSaveUserTempData(GetWorldSetID(), this);
SendVillageInfo(m_szNextVillageIP, m_nNextVillagePort, ERROR_NONE, GetAccountDBID(), GetCertifyingKey());
SetSessionState(SESSION_STATE_SERVER_CHANGE);
if( GetGameRoom() )
GetGameRoom()->SetGoToVillageFlag( true );
}
break;
case QUERY_CHANGESTAGEUSERDATA:
{
TAChangeStageUserData *pUpdate = (TAChangeStageUserData*)pData;
if(pUpdate->nRetCode != ERROR_NONE){
#ifdef _DEBUG
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u CDBID:%I64d SID:%u] QUERY_CHANGESTAGEUSERDATA Ret:%d\r\n", pUpdate->nAccountDBID, m_biCharacterDBID, m_nSessionID, pUpdate->nRetCode);
#endif
return;
}
}
break;
case QUERY_GETCHARACTERPARTIALYBYDBID:
case QUERY_GETCHARACTERPARTIALYBYNAME:
{
TAGetCharacterPartialy * pPacket = (TAGetCharacterPartialy*)pData;
switch(pPacket->cReqType)
{
case _REQCHARACTERPARTIALY_FRIEND:
{
if(pPacket->nRetCode != ERROR_NONE) return;
if(pPacket->biCharacterDBID > 0)
{
TFriend * pFriend = m_pFriend->GetFriend(pPacket->biCharacterDBID);
if(pFriend == NULL) return;
sWorldUserState State;
memset(&State, 0, sizeof(sWorldUserState));
if(g_pWorldUserState->GetUserState(pFriend->wszCharacterName, pFriend->biFriendCharacterDBID, &State) == false)
State.nLocationState = _LOCATION_NONE;
if(pFriend != NULL)
SendFriendDetailInfo(pFriend->biFriendCharacterDBID, pFriend->nGroupDBID, pPacket->cClass, pPacket->cLevel, \
pPacket->cJob, &State, NULL, pFriend->wszFriendMemo);
else
_DANGER_POINT();
}
}
}
}
break;
case QUERY_OWNCHRACTERLEVEL:
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EEB8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ~
int nMaxLevelCount = GetMaxLevelCharacterCount();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
const TPromotionData * pPromo = NULL;
int nPromotionCount = g_pDataManager->GetPromotionCount();
for (int i = 0; i < nPromotionCount; i++)
{
pPromo = g_pDataManager->GetPromotionByIdx(i);
if (pPromo && pPromo->nConditionType == PROMOTION_CONDTIONTYPE_MAXLEVEL)
{
if (pPromo->nConditionValue <= nMaxLevelCount)
SetPromotionData(pPromo->nPromotionType, pPromo->nRewardValue);
}
}
}
break;
}
}
void CDNUserSession::OnDBRecvEtc(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvEtc(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvQuest(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvQuest(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvMission(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvMission(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvSkill(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvSkill(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvFriend(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvFriend(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvIsolate(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvIsolate(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvPvP(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvPvP(nSubCmd, pData);
switch(nSubCmd)
{
case QUERY_UPDATEPVPDATA:
{
TAUpdatePvPData* pPacket = reinterpret_cast<TAUpdatePvPData*>(pData);
if( pPacket->nRetCode != ERROR_NONE )
_DANGER_POINT();
switch( pPacket->Type )
{
case PvPCommon::QueryUpdatePvPDataType::FinishGameMode:
{
if( GetGameRoom() && GetGameRoom()->GetPvPGameMode() )
GetGameRoom()->GetPvPGameMode()->SendFinishGameMode( this );
else
_DANGER_POINT();
break;
}
case PvPCommon::QueryUpdatePvPDataType::GoPvPLobby:
{
SendPvPGameToPvPLobby();
break;
}
case PvPCommon::QueryUpdatePvPDataType::GoSelectChar:
{
_SendReconnectLogin();
break;
}
#if defined(PRE_MOD_PVP_LADDER_XP)
case PvPCommon::QueryUpdatePvPDataType::FinishLadder:
{
break;
}
#endif
}
break;
}
case QUERY_ADD_PVP_LADDERRESULT:
{
TAAddPvPLadderResult* pPacket = reinterpret_cast<TAAddPvPLadderResult*>(pData);
if( pPacket->nRetCode != ERROR_NONE )
_DANGER_POINT();
switch( pPacket->Type )
{
case PvPCommon::QueryUpdatePvPDataType::FinishGameMode:
{
if( GetGameRoom() && GetGameRoom()->GetPvPGameMode() )
GetGameRoom()->GetPvPGameMode()->SendFinishGameMode( this );
else
_DANGER_POINT();
break;
}
case PvPCommon::QueryUpdatePvPDataType::GoPvPLobby:
{
SendPvPGameToPvPLobby();
break;
}
case PvPCommon::QueryUpdatePvPDataType::GoSelectChar:
{
_SendReconnectLogin();
break;
}
}
break;
}
case QUERY_GETLIST_PVP_LADDERSCORE:
{
TAGetListPvPLadderScore* pA = reinterpret_cast<TAGetListPvPLadderScore*>(pData);
if( pA->nRetCode == ERROR_NONE )
{
if( GetGameRoom()->bIsLadderRoom() )
{
#if defined(PRE_ADD_DWC)
if(static_cast<CDNPvPGameRoom*>(GetGameRoom())->bIsDWCMatch())
break;
#endif
LadderSystem::CStatsRepository* pRepository = static_cast<CDNPvPGameRoom*>(GetGameRoom())->GetLadderStatsRepositoryPtr();
if( pRepository )
{
pRepository->OnRecvLadderScore( GetCharacterDBID(), GetTeam(), pA );
}
else
_ASSERT(0);
}
}
break;
}
#if defined( PRE_FIX_76282 )
case SYNC_GOPVPLOBBY:
{
TAHeader * pA = reinterpret_cast<TAHeader*>(pData);
if( pA->nRetCode == ERROR_NONE )
{
SendPvPGameToPvPLobby();
}
break;
}
#endif // #if defined( PRE_FIX_76282 )
}
}
void CDNUserSession::OnDBRecvDarkLair(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvDarkLair(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvGuild(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvGuild(nSubCmd, pData);
switch(nSubCmd)
{
case QUERY_CREATEGUILD: // <20><><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD>
{
// GA <20><> <20><> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
DN_BREAK;
case QUERY_DISMISSGUILD: // <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>
{
// GA <20><> <20><> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
DN_BREAK;
case QUERY_ADDGUILDMEMBER: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>
{
// GA <20><> <20><> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
DN_BREAK;
case QUERY_DELGUILDMEMBER: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><><C5BB>/<2F>߹<EFBFBD>) <20><><EFBFBD><EFBFBD>
{
// GA <20><> <20><> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
DN_BREAK;
case QUERY_CHANGEGUILDINFO: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
const TAChangeGuildInfo *pPacket = reinterpret_cast<TAChangeGuildInfo*>(pData);
if(ERROR_NONE != pPacket->nRetCode) {
// <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>
SendChangeGuildInfo(pPacket->nAccountDBID, pPacket->nCharacterDBID, pPacket->btGuildUpdate, pPacket->nRetCode, pPacket->nInt1, pPacket->nInt2, pPacket->biInt64, pPacket->Text, NULL);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if(!pGuild)
{
SendChangeGuildInfo(pPacket->nAccountDBID, pPacket->nCharacterDBID, pPacket->btGuildUpdate, ERROR_GUILD_NOTEXIST_GUILDINFO, pPacket->nInt1, pPacket->nInt2, pPacket->biInt64, pPacket->Text, NULL);
break;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if(FALSE == pGuild->IsEnable())
{
SendChangeGuildInfo(pPacket->nAccountDBID, pPacket->nCharacterDBID, pPacket->btGuildUpdate, ERROR_GUILD_NOTEXIST_GUILDINFO, pPacket->nInt1, pPacket->nInt2, pPacket->biInt64, pPacket->Text, NULL);
break;
}
#endif
pGuild->UpdateGuildInfo(this, pPacket);
}
break;
case QUERY_CHANGEGUILDMEMBERINFO: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
const TAChangeGuildMemberInfo *pPacket = reinterpret_cast<TAChangeGuildMemberInfo*>(pData);
if(ERROR_NONE != pPacket->nRetCode) {
// <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>
SendChangeGuildMemberInfo(pPacket->nReqAccountDBID, pPacket->nReqCharacterDBID, pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, pPacket->nRetCode, pPacket->nInt1, pPacket->nInt2, pPacket->biInt64, pPacket->Text, NULL);
break;
}
DN_ASSERT(GetAccountDBID() == pPacket->nReqAccountDBID, "Invalid!");
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if(!pGuild)
{
SendChangeGuildMemberInfo(pPacket->nReqAccountDBID, pPacket->nReqCharacterDBID, pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, ERROR_GENERIC_UNKNOWNERROR, pPacket->nInt1, pPacket->nInt2, pPacket->biInt64, pPacket->Text, NULL);
break;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if(FALSE == pGuild->IsEnable()) break;
#endif
pGuild->UpdateMemberInfo(this, pPacket);
}
break;
case QUERY_GETGUILDHISTORYLIST: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
// GA <20><> <20><> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
DN_BREAK;
case QUERY_CHANGEGUILDNAME: // <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
{
const TAChangeGuildName *pPacket = reinterpret_cast<TAChangeGuildName*>(pData);
if(ERROR_NONE != pPacket->nRetCode)
{
SendGuildRenameResult(pPacket->nRetCode);
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD>, <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> Send
int nItemID = 0;
const TItem *pItem = m_pItem->GetCashInventory(pPacket->biItemSerial);
if(pItem)
nItemID = pItem->nItemID;
if(m_pItem->DeleteItemByUse(ITEMPOSITION_CASHINVEN, -1, pPacket->biItemSerial))
{
GetEventSystem()->OnEvent( EventSystem::OnItemUse, 1, EventSystem::ItemID, nItemID );
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
g_pMasterConnectionManager->SendGuildChangeName(GetWorldSetID(), GuildUID, pPacket->wszGuildName);
SendGuildRenameResult(ERROR_NONE);
}
}
break;
}
}
void CDNUserSession::OnDBRecvMail(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvMail(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvMarket(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvMarket(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvItem(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvItem(nSubCmd, pData);
switch( nSubCmd )
{
case QUERY_GETPAGEMATERIALIZEDITEM:
{
int nRemain = m_pItem->GetCashInventoryTotalCount() - m_pItem->GetCashInventoryCount();
if( nRemain <= 0)
{
TItem *pCashItem = m_pItem->GetCashItemByType(ITEMTYPE_EXPAND);
if(pCashItem)
m_nExpandNestClearCount = g_pDataManager->GetItemTypeParam1(pCashItem->nItemID);
#if defined(PRE_ADD_TSCLEARCOUNTEX)
pCashItem = m_pItem->GetCashItemByType(ITEMTYPE_EXPAND_TS);
if(pCashItem)
m_nExpandTreasureStageClearCount = g_pDataManager->GetItemTypeParam1(pCashItem->nItemID);
#endif // #if defined(PRE_ADD_TSCLEARCOUNTEX)
// Vehicle Inventory
GetDBConnection()->QueryGetPageVehicle(this, 1, VEHICLEINVENTORYPAGEMAX);
}
break;
}
case QUERY_GETPAGEVEHICLE:
{
if(m_pItem->IsCompleteLimitlessItem())
SetSessionState(SESSION_STATE_LOADED);
break;
}
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
case QUERY_CHECK_NAMEDITEMCOUNT:
{
TACheckNamedItemCount* pA = reinterpret_cast<TACheckNamedItemCount*>(pData);
if( m_pGameRoom && m_pGameRoom->GetTaskMng() )
{
CDnGameTask* pTask = (CDnGameTask *)m_pGameRoom->GetTaskMng()->GetTask( "GameTask" );
if( pTask )
{
if( pTask->GetDungeonClearState() >= CDnGameTask::DungeonClearStateEnum::DCS_SelectRewardItemStay && pTask->GetDungeonClearState() <= CDnGameTask::DungeonClearStateEnum::DCS_RewardItemStay )
{
pTask->CheckSelectNamedItemResult( this, pA );
}
}
}
}
break;
#endif
}
}
void CDNUserSession::OnDBRecvCash(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvCash(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvMasterSystem(int nSubCmd, char *pData)
{
switch( nSubCmd )
{
case QUERY_GET_COUNTINFO:
{
TAGetMasterSystemCountInfo* pA = reinterpret_cast<TAGetMasterSystemCountInfo*>(pData);
if( GetGameRoom() )
{
if( GetGameRoom()->GetMasterRewardSystem() )
GetGameRoom()->GetMasterRewardSystem()->Update( this, pA );
}
return;
}
case QUERY_MOD_RESPECTPOINT:
{
TAModRespectPoint* pA = reinterpret_cast<TAModRespectPoint*>(pData);
SendMasterSystemRespectPoint( pA->iRespectPoint );
return;
}
case QUERY_MOD_FAVORPOINT:
{
TAModMasterFavorPoint* pA = reinterpret_cast<TAModMasterFavorPoint*>(pData);
SendMasterSystemFavorPoint( pA->biMasterCharacterDBID, pA->biPupilCharacterDBID, pA->iFavorPoint );
// ȣ<><C8A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>.
GetGameRoom()->GetMasterRewardSystem()->UpdateFavor(this, pA->biPupilCharacterDBID, pA->iFavorPoint );
// <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> FavorPoint <20>˸<EFBFBD>
if( GetGameRoom() )
{
for( UINT i=0 ;i<GetGameRoom()->GetUserCount() ; ++i )
{
CDNUserSession* pSession = GetGameRoom()->GetUserData(i);
if( pSession && pSession->GetCharacterDBID() == pA->biPupilCharacterDBID )
{
pSession->SendMasterSystemFavorPoint( pA->biMasterCharacterDBID, pA->biPupilCharacterDBID, pA->iFavorPoint );
pSession->GetDBConnection()->QueryGetMasterSystemSimpleInfo( pSession->GetDBThreadID(), pSession, true, MasterSystem::EventType::DungeonClear );
pSession->QueryGetMasterSystemCountInfo( true );
}
}
}
return;
}
case QUERY_GET_MASTERCHARACTER_TYPE1:
{
TAGetMasterCharacterType1* pA = reinterpret_cast<TAGetMasterCharacterType1*>(pData);
MasterSystem::CCacheRepository::GetInstance().SetMasterCharacter( this, pA );
return;
}
case QUERY_GET_PUPILLIST:
{
TAGetListPupil* pA = reinterpret_cast<TAGetListPupil*>(pData);
MasterSystem::CCacheRepository::GetInstance().SetPupilList( this, pA );
return;
}
case QUERY_GET_MASTERANDCLASSMATE:
{
TAGetListMyMasterAndClassmate* pA = reinterpret_cast<TAGetListMyMasterAndClassmate*>(pData);
MasterSystem::CCacheRepository::GetInstance().SetMasterClassmateList( this, pA );
return;
}
}
// UserSession <20>ܿ<EFBFBD><DCBF><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴ<CABE> <20><>Ŷ<EFBFBD><C5B6> UserBase <20><> <20>ѱ<EFBFBD><D1B1><EFBFBD>.
CDNUserBase::OnDBRecvMasterSystem(nSubCmd, pData);
}
#if defined( PRE_PARTY_DB )
void CDNUserSession::OnDBRecvParty( int nSubCmd, char* pData )
{
// UserSession <20>ܿ<EFBFBD><DCBF><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴ<CABE> <20><>Ŷ<EFBFBD><C5B6> UserBase <20><> <20>ѱ<EFBFBD><D1B1><EFBFBD>.
CDNUserBase::OnDBRecvParty(nSubCmd, pData);
}
#endif // #if defined( PRE_PARTY_DB )
#if defined( PRE_ALTEIAWORLD_EXPLORE )
void CDNUserSession::OnDBRecvAlteiaWorld(int nSubCmd, char* pData)
{
CDNUserBase::OnDBRecvAlteiaWorld(nSubCmd, pData);
switch( nSubCmd )
{
case QUERY_ADD_ALTEIAWORLDSENDTICKETLIST:
{
const TAAddAlteiaWorldSendTicketList* pPacket = reinterpret_cast<TAAddAlteiaWorldSendTicketList*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
SendAlteiaWorldSendTicket( pPacket->wszSendCharacterName );
if (g_pMasterConnectionManager)
g_pMasterConnectionManager->SendAddAlteiaWorldSendTicketResult( GetWorldSetID(), pPacket->nRetCode, pPacket->biSendCharacterDBID );
}
else
{
if (g_pMasterConnectionManager)
g_pMasterConnectionManager->SendAddAlteiaWorldSendTicketResult( GetWorldSetID(), pPacket->nRetCode, pPacket->biSendCharacterDBID );
}
}
break;
case QUERY_GET_ALTEIAWORLDINFO:
{
const TAGetAlteiaWorldInfo* pPacket = reinterpret_cast<const TAGetAlteiaWorldInfo*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
m_cDailyPlayCount = (BYTE)pPacket->nDailyPlayCount;
}
}
break;
default:
break;
}
}
#endif // #if defined(PRE_ALTEIAWORLD_EXPLORE)
#if defined (PRE_ADD_BESTFRIEND)
void CDNUserSession::OnDBRecvBestFriend(int nSubCmd, char* pData)
{
CDNUserBase::OnDBRecvBestFriend(nSubCmd, pData);
}
#endif // #if defined (PRE_ADD_BESTFRIEND)
int CDNUserSession::OnRecvCharMessage(int iSubCmd, char * pData, int iLen)
{
#if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
switch (iSubCmd)
{
case eChar::CS_STAGECLEAR_BONUSREWARD_SELECT:
{
int iResult = GetStageClearBonusReward(pData, iLen);
SendStageClearBonusRewardResult(iResult);
return iResult;
}
break;
//rlkt_test
case eChar::CS_DOSPECIALIZE: OnRecvSpecializeMessage(iSubCmd, pData, iLen); break;
}
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
return CDNUserBase::OnRecvCharMessage(iSubCmd, pData, iLen);
}
int CDNUserSession::OnRecvTradeMessage(int iSubCmd, char * pData, int iLen)
{
return CDNUserBase::OnRecvTradeMessage(iSubCmd, pData, iLen);
}
int CDNUserSession::OnRecvQuestMessage(int iSubCmd, char * pData, int iLen)
{
return CDNUserBase::OnRecvQuestMessage(iSubCmd, pData, iLen);
}
int CDNUserSession::OnRecvSystemMessage(int iSubCmd, char * pData, int iLen)
{
switch(iSubCmd)
{
case eSystem::CS_RECONNECTLOGIN: // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
if(m_iState != SESSION_STATE_GAME_PLAY)
return ERROR_NONE;
if( GetGameRoom() )
GetGameRoom()->DelLastPartyDungeonInfo( this );
BackUpEquipInfo();
if( m_pGameRoom->bIsPvPRoom() )
{
if( !GetPvPGameModeFinish() && m_pGameRoom->GetPvPGameMode() )
{
if( m_pGameRoom->GetPvPGameMode()->bIsPlayingUser( GetActorHandle() ) )
{
if( m_pGameRoom->bIsZombieMode() )
{
_SendReconnectLogin();
return ERROR_NONE;
}
#if defined( PRE_ADD_PVP_COMBOEXERCISE )
if( m_pGameRoom->bIsComboExerciseMode() )
{
_SendReconnectLogin();
return ERROR_NONE;
}
#endif // #if defined( PRE_ADD_PVP_COMBOEXERCISE )
#if defined(PRE_ADD_DWC)
if( m_pGameRoom->GetPvPGameMode()->GetPvPChannelType() == PvPCommon::RoomType::dwc || static_cast<CDNPvPGameRoom*>(m_pGameRoom)->bIsDWCMatch() )
{
_SendReconnectLogin();
return ERROR_NONE;
}
#endif
IScoreSystem* pScoreSystem = m_pGameRoom->GetPvPGameMode()->GetScoreSystem();
if( pScoreSystem )
{
if( pScoreSystem->QueryUpdatePvPData( PvPCommon::Team::Max, this, PvPCommon::QueryUpdatePvPDataType::GoSelectChar ) == false )
{
_DANGER_POINT();
_SendReconnectLogin();
}
#if defined( PRE_ADD_RACING_MODE)
if( m_pGameRoom->GetPvPGameMode()->bIsRacingMode() )
{
_SendReconnectLogin();
}
#endif
return ERROR_NONE;
}
}
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ƽ <20>Կ<EFBFBD><D4BF><EFBFBD> <20>ؿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DnActorHandle hActor = GetActorHandle();
if( hActor )
{
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(hActor.GetPointer());
pPlayer->OnStageGiveUp();
}
}
ChangeStageUserData();
_SendReconnectLogin();
return ERROR_NONE;
}
break;
case eSystem::CS_READY_2_RECIEVE:
{
CSReady2Recieve *pPacket = (CSReady2Recieve*)pData;
if(sizeof(CSReady2Recieve) != iLen)
return ERROR_INVALIDPACKET;
wcsncpy(m_wszVirtualIp, pPacket->wszVirtualIp, IPLENMAX);
WideCharToMultiByte(CP_ACP, 0, m_wszVirtualIp, -1, m_szVirtualIp, IPLENMAX, NULL, NULL);
SetSessionState(SESSION_STATE_READY_TO_SYNC);
SendUserInfo();
return ERROR_NONE;
}
case eSystem::CS_INTENDED_DISCONNECT:
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD><CCB0><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>ƽθ<C6BD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȳ<C8B5><C8B3>̳<EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>߿<EFBFBD> <20>ۻ쳭 <20><><EFBFBD><EFBFBD>
//if(m_GameState >= _GAME_STATE_SYNC2SYNC && m_GameState <= _GAME_STATE_PLAY)
// pSession->IntendedDisconnected();
return ERROR_NONE;
}
case eSystem::CS_ABANDONSTAGE: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
CDnGameTask *pTask = ( m_pGameRoom ) ? m_pGameRoom->GetGameTask() : NULL;
if (!pTask) return ERROR_GENERIC_INVALIDREQUEST;
if( pTask->IsWaitPlayCutScene() ) return ERROR_GENERIC_INVALIDREQUEST;
CSAbandonStage * pPacket = (CSAbandonStage*)pData;
if(iLen != sizeof(CSAbandonStage))
return ERROR_INVALIDPACKET;
int nResult = ERROR_NONE;
nResult = CmdAbandonStage( true, pPacket->bIsPartyOut, pPacket->bIntenedDisconnect );
if( nResult == ERROR_NONE ) {
ChangeStageUserData();
}
return nResult;
}
// PvP<76><50><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD> PvP<76>κ<EFBFBD><CEBA><EFBFBD> <20>̵<EFBFBD> <20><>û
case eSystem::CS_MOVE_PVPGAMETOPVPLOBBY:
{
if(iLen != 0)
return ERROR_INVALIDPACKET;
if( m_iState != SESSION_STATE_GAME_PLAY )
return ERROR_NONE;
BackUpEquipInfo();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD>...
if( !GetPvPGameModeFinish() )
{
if( m_pGameRoom && m_pGameRoom->GetPvPGameMode() )
{
if( m_pGameRoom->GetPvPGameMode()->bIsPlayingUser( GetActorHandle() ) )
{
#if defined( PRE_FIX_76282 )
bool bSyncGoPvP = false;
#endif // // #if defined( PRE_FIX_76282 )
if( m_pGameRoom->GetPvPGameMode()->bIsZombieMode() )
{
#if defined( PRE_FIX_76282 )
bSyncGoPvP = true;
#else // #if defined( PRE_FIX_76282 )
SendPvPGameToPvPLobby();
return ERROR_NONE;
#endif // // #if defined( PRE_FIX_76282 )
}
#if defined( PRE_ADD_RACING_MODE)
if( m_pGameRoom->GetPvPGameMode()->bIsRacingMode() )
{
#if defined( PRE_FIX_76282 )
bSyncGoPvP = true;
#else // #if defined( PRE_FIX_76282 )
m_pItem->RemoveInstantEquipVehicleData(true);
m_pItem->RemoveInstantVehicleItemData(true);
SendPvPGameToPvPLobby();
return ERROR_NONE;
#endif // #if defined( PRE_FIX_76282 )
}
#endif // #if defined( PRE_ADD_RACING_MODE)
#if defined( PRE_ADD_PVP_COMBOEXERCISE )
if( m_pGameRoom->GetPvPGameMode()->bIsComboExerciseMode() )
{
#if defined( PRE_FIX_76282 )
bSyncGoPvP = true;
#else // #if defined( PRE_FIX_76282 )
SendPvPGameToPvPLobby();
return ERROR_NONE;
#endif // #if defined( PRE_FIX_76282 )
}
#endif // #if defined( PRE_ADD_PVP_COMBOEXERCISE )
// #76282<38><32> <20><><EFBFBD><EFBFBD> <20>Ͽ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CPvPScoreSystem::QueryUpdatePvPData <20><><EFBFBD><EFBFBD> <20>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
IScoreSystem* pScoreSystem = m_pGameRoom->GetPvPGameMode()->GetScoreSystem();
if( pScoreSystem )
{
if( pScoreSystem->QueryUpdatePvPData( PvPCommon::Team::Max, this, PvPCommon::QueryUpdatePvPDataType::GoPvPLobby ) == false )
{
_DANGER_POINT();
SendPvPGameToPvPLobby();
}
#if defined( PRE_FIX_76282 )
if( bSyncGoPvP && m_pDBCon )
{
m_pDBCon->SendSyncGoPvPLobby( this );
}
#endif // #if defined( PRE_FIX_76282 )
#if defined(PRE_ADD_DWC)
if( m_pGameRoom->GetPvPGameMode()->GetPvPChannelType() == PvPCommon::RoomType::dwc || static_cast<CDNPvPGameRoom*>(m_pGameRoom)->bIsDWCMatch() )
SendPvPGameToPvPLobby();
#endif
return ERROR_NONE;
}
}
}
}
SendPvPGameToPvPLobby();
return ERROR_NONE;
}
case eSystem::CC_PEER_CONNECT_REQUEST:
//{
// CCPeerConnectRequest * pPacket = (CCPeerConnectRequest*)pData;
// if(pPacket->cState == 1) //PeerConnected Msg
// {
// if(m_PeerManager.IsConnectedPeer(pPacket->nSessionID[0], pPacket->nSessionID[1]) == false)
// m_PeerManager.ConnectPeer(pPacket->nSessionID[0], pPacket->nSessionID[1]);
// else
// _DANGER_POINT();
// }
// else if(pPacket->cState == 2) //PeerDisConnected Msg
// {
// if(m_PeerManager.IsConnectedPeer(pSession->GetSessionID(), pPacket->nSessionID[1]) == true)
// m_PeerManager.DisConnectPeer(pSession->GetSessionID(), pPacket->nSessionID[1]);
// else
// _DANGER_POINT();
// }
//}
return ERROR_NONE;
#ifdef PRE_MOD_INDUCE_TCPCONNECT
case eSystem::CS_CONNECTGAME:
{
m_bRecvReqTCPConnectMsg = true;
g_Log.Log( LogType::_GAMECONNECTLOG, L"MessageProcess CS_CONNECTGAME!!\n" );
return ERROR_NONE;
}
#endif //#ifdef PRE_MOD_INDUCE_TCPCONNECT
}
return CDNUserBase::OnRecvSystemMessage(iSubCmd, pData, iLen);
}
int CDNUserSession::OnRecvFriendMessage(int nSubCmd, char * pData, int nLen)
{
return CDNUserBase::OnRecvFriendMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvIsolateMessage(int nSubCmd, char * pData, int nLen)
{
return CDNUserBase::OnRecvIsolateMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvGameOptionMessage(int nSubCmd, char * pData, int nLen)
{
return CDNUserBase::OnRecvGameOptionMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvEtcMessage(int nSubCmd, char * pData, int nLen)
{
switch( nSubCmd )
{
case eEtc::CS_DARKLAIR_RANK_BOARD:
{
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> UserBase <20><><EFBFBD><EFBFBD> Process ó<><C3B3><EFBFBD><EFBFBD> <20>ϰ<EFBFBD>
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UserSession <20>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƶд<C6B5>.
_ASSERT(0);
return ERROR_INVALIDPACKET; // <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
return CDNUserBase::OnRecvEtcMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvRadioMessage(int nSubCmd, char * pData, int nLen)
{
switch(nSubCmd)
{
case eRadio::CS_USERADIO:
{
CSUseRadio * pPacket = (CSUseRadio*)pData;
if(sizeof(CSUseRadio) != nLen)
return ERROR_INVALIDPACKET;
if( !GetActorHandle() )
return ERROR_NONE;
CDNGameRoom * pRoom = GetGameRoom();
CDnPlayerActor * pActor = (CDnPlayerActor*)GetActorHandle().GetPointer();
if(pRoom && pActor)
{
int nTeam = pActor->GetTeam();
//#43512 <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>Ѹ<EFBFBD><D1B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵǴ<C8B5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
if (pActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
nTeam = pActor->GetOriginalTeam();
for(DWORD i = 0; i < pRoom->GetUserCount(); i++)
{
CDNUserSession * pSession = pRoom->GetUserData(i);
if(pSession && pSession->GetActorHandle())
{
CDnPlayerActor * pDestActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
//#43512 <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>Ѹ<EFBFBD><D1B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵǴ<C8B5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
int nDestActorTeam = pDestActor->GetTeam();
if (pDestActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
nDestActorTeam = pDestActor->GetOriginalTeam();
if(nTeam == nDestActorTeam)
pSession->SendUseRadio(GetSessionID(), pPacket->nID);
}
}
return ERROR_NONE;
}
else
_DANGER_POINT();
return ERROR_NONE;
}
break;
}
return CDNUserBase::OnRecvRadioMessage(nSubCmd, pData, nLen);
}
#ifdef _USE_VOICECHAT
int CDNUserSession::OnRecvVoiceChatMessage(int nSubCmd, char * pData, int nLen)
{
switch(nSubCmd)
{
case eVoiceChat::CS_VOICEAVAILABLE:
{
CSVoiceChatAvailable * pPacket = (CSVoiceChatAvailable*)pData;
if(sizeof(CSVoiceChatAvailable) != nLen)
return ERROR_INVALIDPACKET;
m_bVoiceAvailable = pPacket->cAvailable > 0 ? true : false;
if(m_bVoiceAvailable)
{
if(m_nVoiceChannelID > 0) return ERROR_NONE;
if(GetGameRoom() && GetGameRoom()->m_nVoiceChannelID[0] > 0)
JoinVoiceChannel(GetGameRoom()->m_nVoiceChannelID[0], GetIp(), NULL, 0);
}
else
LeaveVoiceChannel();
//refresh<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(GetGameRoom())
GetGameRoom()->SendRefreshVoiceInfo();
return ERROR_NONE;
}
break;
case eVoiceChat::CS_VOICEMUTE:
{
CSVoiceMute * pPacket = (CSVoiceMute*)pData;
if(sizeof(CSVoiceMute) != nLen)
return ERROR_INVALIDPACKET;
if(g_pVoiceChat && GetGameRoom()->m_nVoiceChannelID[0] > 0)
{
CDNUserSession * pSession = GetGameRoom()->GetUserSession(pPacket->nSessionID);
if(pSession)
{
g_pVoiceChat->MuteOneToOne(GetAccountDBID(), pSession->GetAccountDBID(), pPacket->cMute == 0 ? false : true);
//<2F><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>߰ڴپ<DAB4>.
}
else
_DANGER_POINT();
}
else
_DANGER_POINT();
return ERROR_NONE;
}
break;
case eVoiceChat::CS_VOICECOMPLAINTREQ:
{
CSVoiceComplaintReq * pPacket = (CSVoiceComplaintReq*)pData;
if(sizeof(CSVoiceComplaintReq) != nLen)
return ERROR_INVALIDPACKET;
if(g_pVoiceChat && GetGameRoom()->m_nVoiceChannelID[0] > 0)
{
CDNUserSession * pSession = GetGameRoom()->GetUserSession(pPacket->nSessionID);
if(pSession)
{
g_pVoiceChat->ComplaintRequest(GetAccountDBID(), pSession->GetAccountDBID(), pSession->GetAccountDBID(), pPacket->szCategory, pPacket->szSubject, pPacket->szMsg);
}
else
_DANGER_POINT();
}
else
_DANGER_POINT();
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
#endif
#if defined( PRE_ADD_SECONDARY_SKILL )
int CDNUserSession::OnRecvSecondarySkillMessage( int nSubCmd, char* pData, int nLen )
{
switch( nSubCmd )
{
case eSecondarySkill::CS_DELETE:
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if( CDnWorld::GetInstance( GetGameRoom() ).GetMapType() != EWorldEnum::MapTypeWorldMap )
{
SecondarySkill::CSDelete* pPacket = reinterpret_cast<SecondarySkill::CSDelete*>(pData);
SendDelSecondarySkill( ERROR_SECONDARYSKILL_DELETE_FAILED_DONTALLOWMAP, pPacket->iSkillID );
return ERROR_GENERIC_INVALIDREQUEST;
}
break;
}
}
return CDNUserBase::OnRecvSecondarySkillMessage( nSubCmd, pData, nLen );
}
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
int CDNUserSession::OnRecvChatRoomMessage(int nSubCmd, char *pData, int nLen)
{
// <20><><EFBFBD><EFBFBD><E5BFA1><EFBFBD><EFBFBD> ä<>÷<EFBFBD><C3B7><EFBFBD> <20>̿<EFBFBD><CCBF>Ҽ<EFBFBD> <20>ִ<EFBFBD>.
if(!m_pGameRoom->bIsFarmRoom())
return ERROR_INVALIDPACKET;
switch( nSubCmd )
{
case eChatRoom::CS_CREATECHATROOM:
{
CSCreateChatRoom * pCreateChatRoom = (CSCreateChatRoom *)pData;
if(sizeof(CSCreateChatRoom) != nLen) return ERROR_INVALIDPACKET;
TChatRoomView ChatRoomView;
// 0. <20>ٸ<EFBFBD> ä<>ù濡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
if( m_nChatRoomID > 0 )
{
SendChatRoomCreateChatRoom( ERROR_CHATROOM_ANOTHERROOM, ChatRoomView );
return ERROR_NONE;
}
int nChatRoomID = 0;
// 1. <20><> <20><><EFBFBD><EFBFBD>
nChatRoomID = m_pGameRoom->m_ChatRoomManager.CreateChatRoom( GetSessionID(), pCreateChatRoom->wszName, pCreateChatRoom->nRoomType,
pCreateChatRoom->nRoomAllow, pCreateChatRoom->wszPassword, pCreateChatRoom->PRLine1, pCreateChatRoom->PRLine2, pCreateChatRoom->PRLine3, m_pGameRoom );
if( nChatRoomID == 0 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - ERROR_CHATROOM_FAILEDMAKEROOM
SendChatRoomCreateChatRoom( ERROR_CHATROOM_FAILEDMAKEROOM, ChatRoomView );
return ERROR_NONE;
}
// <20><>ã<EFBFBD><C3A3>
CDNChatRoom * pChatRoom = m_pGameRoom->m_ChatRoomManager.GetChatRoom( nChatRoomID );
if( pChatRoom == NULL )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - ERROR_CHATROOM_FAILEDMAKEROOM
SendChatRoomCreateChatRoom( ERROR_CHATROOM_FAILEDMAKEROOM, ChatRoomView );
return ERROR_NONE;
}
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>
ChatRoomView.Set( pChatRoom->GetChatRoomID(), pChatRoom->GetChatRoomName(), pChatRoom->GetChatRoomType(), pChatRoom->UsePassword(),
pChatRoom->GetChatRoomPRLine1(), pChatRoom->GetChatRoomPRLine2(), pChatRoom->GetChatRoomPRLine3() );
// 2. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int nRet = ERROR_NONE;
nRet = pChatRoom->EnterRoom( m_nSessionID, pCreateChatRoom->wszPassword, true );
if( nRet != ERROR_NONE )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD><CFBF>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1>Ѵ<EFBFBD>.
if( pChatRoom->GetUserCount() <= 0 )
{
m_pGameRoom->m_ChatRoomManager.DestroyChatRoom( pChatRoom->GetChatRoomID() );
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
SendChatRoomCreateChatRoom( nRet, ChatRoomView );
// <20>ֺ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD>
m_pGameRoom->BroadcastChatRoomView(this, ChatRoomView);
return ERROR_NONE;
}
break;
case eChatRoom::CS_ENTERCHATROOM:
{
CSChatRoomEnterRoom * pEnterRoom = (CSChatRoomEnterRoom *)pData;
if(sizeof(CSChatRoomEnterRoom) != nLen) return ERROR_INVALIDPACKET;
int nRet = ERROR_NONE;
int UserSessionIDs[CHATROOMMAX];
int nUserCount = 0;
int LeaderSID = 0;
memset( UserSessionIDs, 0, sizeof(UserSessionIDs) );
// <20><>ã<EFBFBD><C3A3>
CDNChatRoom * pChatRoom = m_pGameRoom->m_ChatRoomManager.GetChatRoom( pEnterRoom->nChatRoomID );
if( pChatRoom == NULL )
{
SendChatRoomEnterRoom( ERROR_CHATROOM_INVALIDCHATROOM, LeaderSID, UserSessionIDs, nUserCount );
return ERROR_NONE;
}
// <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
nRet = pChatRoom->EnterRoom( m_nSessionID, pEnterRoom->wszPassword, false );
if( nRet == ERROR_NONE )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID
if( pChatRoom->GetLeaderID() > 0 )
{
CDNUserSession * pLeaderSession = m_pGameRoom->GetUserSession(pChatRoom->GetLeaderID());
if( pLeaderSession ) LeaderSID = pLeaderSession->GetSessionID();
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD> ID
for( int i=0; i<CHATROOMMAX; i++ )
{
if( pChatRoom->GetMemberAIDFromIndex(i) <= 0 ) continue;
CDNUserSession * pUserSession = m_pGameRoom->GetUserSession( pChatRoom->GetMemberAIDFromIndex(i) );
if( pUserSession == NULL ) continue;
UserSessionIDs[ nUserCount ] = pUserSession->GetSessionID();
nUserCount++;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendChatRoomEnterRoom( nRet, LeaderSID, UserSessionIDs, nUserCount );
if( nRet == ERROR_NONE )
{
// <20>ֺ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD>
m_pGameRoom->BroadcastChatRoomEnterUser(this, pChatRoom);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( pChatRoom->GetChatRoomType() == CHATROOMTYPE_PR && GetProfile()->bOpenPublic )
pChatRoom->SendProfileToAll( GetSessionID(), *GetProfile() );
}
return ERROR_NONE;
}
break;
case eChatRoom::CS_CHANGEROOMOPTION:
{
CSChatRoomChangeRoomOption * pChangeOption = (CSChatRoomChangeRoomOption*)pData;
if(sizeof(CSChatRoomChangeRoomOption) != nLen) return ERROR_INVALIDPACKET;
// <20><>ã<EFBFBD><C3A3>
CDNChatRoom * pChatRoom = m_pGameRoom->m_ChatRoomManager.GetChatRoom( m_nChatRoomID );
if( pChatRoom == NULL )
{
SendChatRoomChangeRoomOption( ERROR_CHATROOM_INVALIDCHATROOM, pChangeOption->ChatRoomView );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if( pChatRoom->IsLeader( m_nSessionID ) == false )
{
SendChatRoomChangeRoomOption( ERROR_CHATROOM_ONLYLEADER, pChangeOption->ChatRoomView );
return ERROR_NONE;
}
pChatRoom->ChangeRoomOption( pChangeOption->ChatRoomView.m_wszChatRoomName, pChangeOption->ChatRoomView.m_nChatRoomType,
pChangeOption->nRoomAllow, pChangeOption->wszPassword,
pChangeOption->ChatRoomView.m_wszChatRoomPRLine1,
pChangeOption->ChatRoomView.m_wszChatRoomPRLine2,
pChangeOption->ChatRoomView.m_wszChatRoomPRLine3 );
TChatRoomView RoomView;
RoomView.Set( pChatRoom->GetChatRoomID(), pChatRoom->GetChatRoomName(), pChatRoom->GetChatRoomType(), pChatRoom->UsePassword(),
pChatRoom->GetChatRoomPRLine1(), pChatRoom->GetChatRoomPRLine2(), pChatRoom->GetChatRoomPRLine3() );
SendChatRoomChangeRoomOption( ERROR_NONE, RoomView );
// <20>ֺ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD>
m_pGameRoom->BroadcastChatRoomView(this, RoomView);
return ERROR_NONE;
}
break;
case eChatRoom::CS_KICKUSER:
{
CSChatRoomKickUser * pKickUser = (CSChatRoomKickUser *)pData;
if(sizeof(CSChatRoomKickUser) != nLen) return ERROR_INVALIDPACKET;
int nRet = ERROR_NONE;
// <20><>ã<EFBFBD><C3A3>
CDNChatRoom * pChatRoom = m_pGameRoom->m_ChatRoomManager.GetChatRoom( m_nChatRoomID );
if( pChatRoom == NULL )
{
SendChatRoomKickUser( ERROR_CHATROOM_INVALIDCHATROOM, pKickUser->nKickUserSessionID );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if( pChatRoom->IsLeader( m_nSessionID ) == false )
{
SendChatRoomKickUser( ERROR_CHATROOM_ONLYLEADER, pKickUser->nKickUserSessionID );
return ERROR_NONE;
}
// <20>ڱ<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>.
if( GetSessionID() == pKickUser->nKickUserSessionID )
{
return ERROR_NONE;
}
CDNUserSession *pUserSession = m_pGameRoom->GetUserSession(pKickUser->nKickUserSessionID);
if( pUserSession == NULL )
{
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
nRet = pChatRoom->LeaveUser( pUserSession->GetSessionID(), pKickUser->nKickReason );
if( nRet == ERROR_NONE )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pUserSession->SendChatRoomLeaveUser( pUserSession->GetSessionID(), pKickUser->nKickReason );
// <20>ֺ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD>
m_pGameRoom->BroadcastChatRoomLeaveUser(pUserSession, pKickUser->nKickReason);
}
return ERROR_NONE;
}
break;
case eChatRoom::CS_LEAVEROOM:
{
if(0 != nLen) return ERROR_INVALIDPACKET;
int nRet = ERROR_NONE;
CDNChatRoom * pChatRoom = m_pGameRoom->m_ChatRoomManager.GetChatRoom( m_nChatRoomID );
if( pChatRoom == NULL )
{
return ERROR_NONE;
}
if( pChatRoom->IsLeader(GetSessionID()) )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E6BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
while( pChatRoom->GetUserCount() > 0 )
{
UINT UserAID = pChatRoom->GetMemberAIDFromIndex( 0 );
if( UserAID <= 0 ) break; // <20><><EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
CDNUserSession * pUserSession = m_pGameRoom->GetUserSession( UserAID );
if( pUserSession == NULL ) break; // <20><><EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
nRet = pChatRoom->LeaveUser( pUserSession->GetSessionID(), CHATROOMLEAVE_DESTROYROOM );
if( nRet == ERROR_NONE )
{
// <20><EFBFBD><E6BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20>ֺ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( pChatRoom->IsLeader( GetSessionID() ) )
{
TChatRoomView RoomView;
RoomView.Set( 0, L"", CHATROOMTYPE_NONE, false, L"", L"", L"" );
pUserSession->SendChatRoomLeaveUser( pUserSession->GetSessionID(), CHATROOMLEAVE_DESTROYROOM );
m_pGameRoom->BroadcastChatRoomView( pUserSession, RoomView );
}
else
{
pUserSession->SendChatRoomLeaveUser( pUserSession->GetSessionID(), CHATROOMLEAVE_DESTROYROOM );
m_pGameRoom->BroadcastChatRoomLeaveUser( pUserSession, CHATROOMLEAVE_DESTROYROOM );
}
}
}
// <20><><EFBFBD><EFBFBD>~!
m_pGameRoom->m_ChatRoomManager.DestroyChatRoom( pChatRoom->GetChatRoomID() );
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E6BFA1> <20><><EFBFBD><EFBFBD>
nRet = pChatRoom->LeaveUser( GetSessionID(), CHATROOMLEAVE_LEAVE );
if( nRet == ERROR_NONE )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendChatRoomLeaveUser( GetSessionID(), CHATROOMLEAVE_LEAVE );
// <20>ֺ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD>
m_pGameRoom->BroadcastChatRoomLeaveUser( this, CHATROOMLEAVE_LEAVE );
}
}
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserSession::OnRecvPvPMessage(int nSubCmd, char * pData, int nLen)
{
switch(nSubCmd)
{
case ePvP::CS_SWAPMEMBERINDEX:
{
CSPvPTeamSwapMemberIndex * pPacket = (CSPvPTeamSwapMemberIndex*)pData;
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendPvPSwapMemberIndex(GetWorldSetID(), GetAccountDBID(), pPacket->cCount, pPacket->Index);
else
SendPvPMemberIndex(0, 0, NULL, ERROR_PVP_SWAPTEAM_MEMBERINDEX_FAIL);
return ERROR_NONE;
}
case ePvP::CS_GUILDWAR_CHANGEMEMBER_GRADE:
{
CSPvPGuildWarChangeMemberGrade * pPacket = (CSPvPGuildWarChangeMemberGrade*)pData;
if(sizeof(CSPvPGuildWarChangeMemberGrade) != nLen)
return ERROR_INVALIDPACKET;
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendPvPChangeMemberGrade(GetWorldSetID(), GetAccountDBID(), pPacket->nType, pPacket->nSessionID, pPacket->bAsign);
else
SendPvPGuildWarMemberGrade(0, 0, ERROR_PVP_CHANGEMEMBERGRADE_FAIL);
return ERROR_NONE;
}
case ePvP::CS_CONCENTRATE_ORDER:
{
CSOrderConcentrate * pPacket = (CSOrderConcentrate*)pData;
if(sizeof(CSOrderConcentrate) != nLen)
return ERROR_INVALIDPACKET;
if(!(GetPvPUserState()&PvPCommon::UserState::GuildWarCaptain) && !(GetPvPUserState()&PvPCommon::UserState::GuildWarSedcondCaptain))
return ERROR_NONE;
for( UINT i=0 ; i<GetGameRoom()->GetUserCount() ; ++i )
{
CDNUserSession* pSession = GetGameRoom()->GetUserData(i);
if(pSession)
pSession->SendGuildWarConcentrateOrder(GetSessionID(), pPacket->vPosition);
}
return ERROR_NONE;
}
#if defined( PRE_WORLDCOMBINE_PVP )
case ePvP::CS_PVP_WORLDPVPROOM_STARTMSG:
{
WorldPvPMissionRoom::CSWorldPvPRoomStartMsg * pPacket = (WorldPvPMissionRoom::CSWorldPvPRoomStartMsg*)pData;
if(sizeof(WorldPvPMissionRoom::CSWorldPvPRoomStartMsg) != nLen)
return ERROR_INVALIDPACKET;
if( GetGameRoom()->bIsWorldPvPRoom() && !GetGameRoom()->bIsWorldPvPRoomStart() )
{
CPvPGameMode * pMode = GetGameRoom()->GetPvPGameMode();
if( pMode )
{
if( pMode->CheckWorldPvPRoomMinMemberCount() )
{
if( GetGameRoom()->GetWorldPvPRoomReqType() == WorldPvPMissionRoom::Common::GMRoom )
{
// <20><> <20><><EFBFBD><EFBFBD>üũ
}
GetGameRoom()->SetWorldPvPRoomStart(true);
}
else
{
SendWorldPvPRoomStartResult(ERROR_GENERIC_INVALIDREQUEST);
GetGameRoom()->GetPvPGameMode()->SetSendStartMsg(false);
}
}
}
return ERROR_NONE;
}
break;
#endif
}
return ERROR_UNKNOWN_HEADER;
}
#if defined( PRE_PRIVATECHAT_CHANNEL )
int CDNUserSession::OnRecvPrivateChatChannelMessage(int nSubCmd, char * pData, int nLen)
{
return CDNUserBase::OnRecvPrivateChatChannelMessage( nSubCmd, pData, nLen );
}
#endif
#if defined( PRE_ALTEIAWORLD_EXPLORE )
int CDNUserSession::OnRecvWorldAlteiaMessage(int nSubCmd, char *pData, int nLen)
{
switch( nSubCmd )
{
case eAlteiaWorld::CS_ALTEIAWORLD_DICE:
{
int nRet = AlteiaWorldDice();
if( nRet != ERROR_NONE )
{
SendAlteiaWorldDiceResult( nRet, 0 );
}
}
break;
case eAlteiaWorld::CS_ALTEIAWORLD_NEXTMAP:
{
MoveAlteiaNextMap();
}
break;
}
return CDNUserBase::OnRecvWorldAlteiaMessage( nSubCmd, pData, nLen );
}
#endif
void CDNUserSession::SendPacket(int iMainCmd, int iSubCmd, const void * pMsg, int iLen, int iPrior)
{
#ifdef PRE_ADD_PACKETSIZE_CHECKER
if (m_nSendCheckTick == 0)
m_nSendCheckTick = timeGetTime();
unsigned long CurTick = timeGetTime();
m_nSendCheckSize += iLen;
m_nSendCheckCount++;
int cnt = m_nSendDebugInfoCount++&127;
m_SendDebugInfo[cnt]._DebugMainCmd = iMainCmd;
m_SendDebugInfo[cnt]._DebugSubCmd = iSubCmd;
m_SendDebugInfo[cnt]._DebugTick = CurTick;
m_SendDebugInfo[cnt]._DebugSize = iLen;
if (m_bActorDebugSended == false && m_nSendCheckTick + 10000 < CurTick && GetGameRoom())
{
if (m_nSendCheckSize > (1024 * 500) || m_nSendCheckCount > 10000)
{
g_Log.Log(LogType::_ERROR, L"[%d] Report|Frame SendSize SID[%d] Class[%d] Job[%d] MapIndex[%d] AvrCur[%d] Sum[%d] Cnt[%d]\n", g_Config.nManagedID, GetSessionID(), GetClassID(), GetUserJob(), GetGameRoom()->GetGameTask()->GetMapTableID(), m_nSendCheckSize / m_nSendCheckCount, m_nSendCheckSize, m_nSendCheckCount);
if (g_pServiceConnection)
{
WCHAR wszBuf[GAMEDELAYSIZE] = {0,};
wsprintf( wszBuf, L"[%d] Report|Frame SendSize SID[%d] Class[%d] Job[%d] MapIndex[%d] AvrCur[%d] Sum[%d] Cnt[%d]", g_Config.nManagedID, GetSessionID(), GetClassID(), GetUserJob(), GetGameRoom()->GetGameTask()->GetMapTableID(), m_nSendCheckSize / m_nSendCheckCount, m_nSendCheckSize, m_nSendCheckCount);
g_pServiceConnection->SendGameDelayedReport(wszBuf);
}
USES_CONVERSION;
std::wstring wstrLogText;
bool bSended = false;
int nAddedCount = 0;
for (int nLogCout = 0; nLogCout < (int)m_vActorSendInfo.size(); nLogCout++)
{
if (bSended == false)
{
wstrLogText.clear();
wstrLogText = L"[";
wstrLogText += I2W(g_Config.nManagedID);
wstrLogText += L"] Report|Frame SendActorInfo ";
bSended = true;
}
if (m_vActorSendInfo[nLogCout].nSendCount <= 0)
continue;
wstrLogText += L"[SC:";
wstrLogText += I2W(nLogCout);
wstrLogText += L" SCC:";
wstrLogText += I2W(m_vActorSendInfo[nLogCout].nSendCount);
wstrLogText += L"]";
nAddedCount++;
if (nAddedCount >= 4)
{
if (g_pServiceConnection && GAMEDELAYSIZE > (int)wstrLogText.size())
g_pServiceConnection->SendGameDelayedReport(const_cast<WCHAR*>(wstrLogText.c_str()));
wstrLogText += L"\n";
g_Log.Log(LogType::_ERROR, L"%s\n", wstrLogText.c_str());
bSended = false;
nAddedCount = 0;
}
}
m_bActorDebugSended = true;
for (int nLogCount = 0; nLogCount < 128; nLogCount++)
{
g_Log.Log(LogType::_ERROR, L"[%d] Report|Frame SendDebugInfo MCmd[%d] SCmd[%d] Tick[%d] Size[%d]\n", g_Config.nManagedID, m_SendDebugInfo[nLogCount]._DebugMainCmd, m_SendDebugInfo[nLogCount]._DebugSubCmd, \
m_SendDebugInfo[nLogCount]._DebugTick, m_SendDebugInfo[nLogCount]._DebugSize);//, m_SendActorDebugInfo[nLogCount]._dwUniqueID, m_SendActorDebugInfo[nLogCount]._ActorSubCmd, m_SendActorDebugInfo[nLogCount]._PacketBroadFlag);
if (g_pServiceConnection)
{
WCHAR wszBuf[GAMEDELAYSIZE] = {0,};
wsprintf( wszBuf, L"[%d] Report|Frame SendDebugInfo MCmd[%d] SCmd[%d] Tick[%d] Size[%d]", g_Config.nManagedID, m_SendDebugInfo[nLogCount]._DebugMainCmd, m_SendDebugInfo[nLogCount]._DebugSubCmd, \
m_SendDebugInfo[nLogCount]._DebugTick, m_SendDebugInfo[nLogCount]._DebugSize);//, m_SendActorDebugInfo[nLogCount]._dwUniqueID, m_SendActorDebugInfo[nLogCount]._ActorSubCmd, m_SendActorDebugInfo[nLogCount]._PacketBroadFlag);
g_pServiceConnection->SendGameDelayedReport(wszBuf);
}
}
}
m_nSendCheckTick = CurTick;
m_nSendCheckSize = 0;
m_nSendCheckCount = 0;
}
#endif //#ifdef PRE_ADD_PACKETSIZE_CHECKER
//<2F><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> tcp<63><70> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~
if(m_pGameRoom->GetRoomState() == _GAME_STATE_SYNC2SYNC)
StorePacket(iMainCmd, iSubCmd, (char*)pMsg, iLen);
else
{
// <20><><EFBFBD><20><> <20><EFBFBD><EEB0A1>............<2E>ϴܸ<CFB4> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˴ϴ<CBB4>.
// Note: <20><><EFBFBD><EFBFBD> <20>Դ<EFBFBD> <20><> <20><>ũ <20>ȸ´<C8B8> <20><> <20>ǽɵǼ<C9B5> <20><><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UDP<44><50> <20><><EFBFBD>ϴ<EFBFBD>..
// udp/tcp <20><><EFBFBD><EFBFBD> <20><><EFBFBD>߾<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD>صǾ<D8B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
bool bSendUdp = false;
switch( iMainCmd ) {
case SC_ACTOR:
case SC_ACTORBUNDLE:
case SC_PROP:
bSendUdp = true;
break;
case SC_SYSTEM:
switch( iSubCmd ) {
case eSystem::SC_TCP_CONNECT_REQ:
bSendUdp = true;
break;
}
break;
case SC_ROOM:
{
switch( iSubCmd )
{
case eRoom::SC_SYNC_MEMBERINFO:
case eRoom::SC_SYNC_MEMBERTEAM:
case eRoom::SC_SYNC_MEMBERDEFAULTPARTS:
case eRoom::SC_SYNC_MEMBEREQUIP:
case eRoom::SC_SYNC_MEMBERSKILL:
case eRoom::SC_SYNC_MEMBER_BREAKINTO:
case eRoom::SC_SYNC_MEMBERHPSP:
case eRoom::SC_SYNC_MEMBERBATTLEMODE:
case eRoom::SC_SYNC_DROPITEMLIST:
case eRoom::SC_SYNC_DATUMTICK:
case eRoom::SC_DLDUNGEONCLEAR_RANKINFO:
case eRoom::SC_START_DRAGONNEST:
case eRoom::SC_DUNGEONCLEAR_MSG:
case eRoom::SC_DLDUNGEONCLEAR_MSG:
{
// PvP Sync <20><>Ŷ<EFBFBD><C5B6> TCP <20><> <20><><EFBFBD><EFBFBD>.
bSendUdp = false;
break;
}
default:
{
bSendUdp = true;
break;
}
}
break;
}
case SC_QUEST:
switch( iSubCmd ) {
case eQuest::SC_PLAYCUTSCENE:
case eQuest::SC_COMPLETE_CUTSCENE:
bSendUdp = true;
break;
}
break;
}
bool bSendOK = true;
BYTE cPrevPacketSeq = m_cPacketSeq;
if( bSendUdp && iLen >= 512 )
{
#ifdef _FINAL_BUILD
#else //#ifdef _FINAL_BUILD
g_Log.Log(LogType::_ERROR, this, L"SendError Check Packet Size MCMD[%d] SCMD[%d] PL[%d]\n", iMainCmd, iSubCmd, iLen);
#endif //#ifdef _FINAL_BUILD
bSendUdp = false;
}
if (bSendUdp && iMainCmd != SC_ACTORBUNDLE && iPrior == _RELIABLE)
FlushPacketQueue();
//reliable udp<64><70> tcp<63>ΰ<EFBFBD><CEB0><EFBFBD><ECBFA1> <20>ø<EFBFBD><C3B8>ϴ<EFBFBD>
BYTE cSeq = 0;
if((bSendUdp && iPrior == _RELIABLE) || bSendUdp == false)
cSeq = m_cPacketSeq += 2;
//rlkt_udp
//bSendUdp = false;
if( bSendUdp )
{
#ifdef _PACKET_COMP
//if(m_pTcpConnection && m_pTcpConnection->GetIsUseComp()) m_pTcpConnection->SetPacketComp(false);
#endif
if(m_pGameServer->Send(m_iNetID, iMainCmd, iSubCmd, pMsg, iLen, iPrior, cSeq) < 0)
{
bSendOK = false;
#ifdef _DEBUG
if (iMainCmd == SC_SYSTEM && iSubCmd == SC_TCP_CONNECT_REQ)
g_Log.Log(LogType::_ERROR, this, L"UDP SendError NETID[%d] MCMD[%d] SCMD[%d] PL[%d] PRIOR[%d]\n", m_iNetID, iMainCmd, iSubCmd, iLen, iPrior);
#endif
//g_Log.Log(LogType::_ERROR, this, L"UDP SendError NETID[%d] MCMD[%d] SCMD[%d] PL[%d] PRIOR[%d]\n", m_iNetID, iMainCmd, iSubCmd, iLen, iPrior);
}
}
else if(m_pTcpConnection != NULL)// && m_pTcpConnection->GetDelete() == false && m_pTcpConnection->GetActive())
{
if(m_pTcpConnection->AddSendData(iMainCmd, iSubCmd, (char*)pMsg, iLen, NULL, cSeq) < 0)
{
bSendOK = false;
//g_Log.Log(LogType::_ERROR, this, L"TCP SendError ADBID[%d] CNAME[%s] MCMD[%d] SCMD[%d] PL[%d]\n", GetAccountDBID(), GetCharacterName(), iMainCmd, iSubCmd, iLen);
}
}
#if !defined( STRESS_TEST )
else
{
bSendOK = false;
//g_Log.Log(LogType::_ERROR, this, L"SendError ADBID[%d] CNAME[%s] MCMD[%d] SCMD[%d] PL[%d]\n", GetAccountDBID(), GetCharacterName(), iMainCmd, iSubCmd, iLen);
}
#endif
if((bSendUdp && iPrior == _RELIABLE) || bSendUdp == false)
{
if( !bSendOK )
{
m_cPacketSeq = cPrevPacketSeq;
}
}
}
}
int CDNUserSession::AddSendData(int iMainCmd, int iSubCmd, char *pData, int iLen)
{
SendPacket(iMainCmd, iSubCmd, pData, iLen, _RELIABLE);
return 0;
}
#if defined(PRE_ADD_MULTILANGUAGE)
void CDNUserSession::PreInitializeUser(WCHAR * wszAccountName, UINT nAccountDBID, UINT nSessionID, INT64 biCharacterDBID, int iTeam, int nWorldID, int nVillageID, bool bTutorial, bool bAdult, char cPCBangGrade, char cSelectedLanguage, TMemberVoiceInfo * pInfo)
#else //#if defined(PRE_ADD_MULTILANGUAGE)
void CDNUserSession::PreInitializeUser(WCHAR * wszAccountName, UINT nAccountDBID, UINT nSessionID, INT64 biCharacterDBID, int iTeam, int nWorldID, int nVillageID, bool bTutorial, bool bAdult, char cPCBangGrade, TMemberVoiceInfo * pInfo)
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
{
SetAccountName(wszAccountName);
m_nAccountDBID = nAccountDBID;
m_nSessionID = nSessionID;
m_biCharacterDBID = biCharacterDBID;
m_iTeam = iTeam;
m_nWorldSetID = nWorldID;
m_cVillageID = nVillageID;
m_bAdult = bAdult;
SetPCBangGrade(cPCBangGrade);
if(m_bPCBang)
{
#if !defined(_KR)
SendPCBang(m_cPCBangGrade, NULL);
#endif
}
m_bTutorial = bTutorial;
#ifdef _USE_VOICECHAT
if(pInfo)
{
m_bVoiceAvailable = pInfo->cVoiceAvailable == 0 ? false : true;
memcpy(m_nVoiceMutedList, pInfo->nMutedList, sizeof(UINT[PARTYCOUNTMAX]));
m_nVoiceChannelID = 0;
m_cIsTalking = 0;
m_nVoiceJoinType = _VOICEJOINTYPE_NONE;
}
#endif
#if defined(PRE_ADD_MULTILANGUAGE)
m_eSelectedLanguage = static_cast<MultiLanguage::SupportLanguage::eSupportLanguage>(cSelectedLanguage);
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
SetSessionState(SESSION_STATE_READY);
}
void CDNUserSession::QueryGetMasterSystemCountInfo( bool bClientSend, CDNDBConnection* pDBCon/*=NULL*/, BYTE cThreadID/*=0*/ )
{
if( GetGameRoom() == NULL )
return;
// <20>Ϻ<EFBFBD> Task <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD>.
switch( GetGameRoom()->GetGameTaskType() )
{
case GameTaskType::Farm:
case GameTaskType::PvP:
{
return;
}
}
std::vector<INT64> vPartyListExceptMe;
for( UINT i=0 ; i<GetGameRoom()->GetUserCount() ; ++i )
{
CDNUserSession* pSession = GetGameRoom()->GetUserData(i);
if( pSession && pSession != this && pSession->bIsGMTrace() == false )
vPartyListExceptMe.push_back( pSession->GetCharacterDBID() );
}
if( pDBCon )
pDBCon->QueryGetMasterSystemCountInfo( cThreadID, this, bClientSend, vPartyListExceptMe );
else
GetDBConnection()->QueryGetMasterSystemCountInfo( GetDBThreadID(), this, bClientSend, vPartyListExceptMe );
}
void CDNUserSession::InitialUser()
{
//Query Character Data
BYTE cThreadID = 0;
CDNDBConnection *pTempDBCon = g_pDBConnectionManager->GetDBConnection(cThreadID);
pTempDBCon->QueryGetMasterSystemSimpleInfo( cThreadID, this, false, MasterSystem::EventType::Init );
QueryGetMasterSystemCountInfo( false, pTempDBCon, cThreadID );
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
pTempDBCon->QueryGetListNpcReputation( cThreadID, this );
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
#if defined( PRE_ADD_SECONDARY_SKILL )
pTempDBCon->QueryGetListSecondarySkill( cThreadID, this );
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
if( GetGameRoom()->bIsFarmRoom() )
{
pTempDBCon->QueryGetFieldCountByCharacter( cThreadID, GetWorldSetID(), m_nAccountDBID, m_biCharacterDBID, false );
pTempDBCon->QueryGetListFieldForCharacter( cThreadID, GetWorldSetID(), GetAccountDBID(), GetCharacterDBID(), GetRoomID() );
}
pTempDBCon->QueryGetListPvPLadderScore( cThreadID, this );
pTempDBCon->QueryGetPVPGhoulScores( cThreadID, this );
pTempDBCon->QueryGetListEtcPoint( cThreadID, this );
pTempDBCon->QueryGetAbuseMonitor( cThreadID, this );
#if defined(PRE_ADD_ABUSE_ACCOUNT_RESTRAINT)
#if defined(PRE_ADD_MULTILANGUAGE)
pTempDBCon->QueryGetWholeAbuseMonitor( cThreadID, this, m_eSelectedLanguage );
#else //#if defined(PRE_ADD_MULTILANGUAGE)
pTempDBCon->QueryGetWholeAbuseMonitor( cThreadID, this );
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
#endif //#if defined(PRE_ADD_ABUSE_ACCOUNT_RESTRAINT)
pTempDBCon->QueryGetListVariableReset( cThreadID, this );
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
pTempDBCon->QueryGetTotalSkillLevel(cThreadID, this);
#endif
#if defined( PRE_PARTY_DB )
pTempDBCon->QuerySelectCharacter( cThreadID, this );
#else
pTempDBCon->QuerySelectCharacter( cThreadID, this, 0 );
#endif
#if defined (PRE_ADD_BESTFRIEND)
pTempDBCon->QueryGetBestFriend(cThreadID, this, false);
#endif
//Query Friend Data
pTempDBCon->QueryFriendList(cThreadID, this );
//Query Isolate Data
pTempDBCon->QueryGetIsolateList(cThreadID, this);
//Query GameOption
pTempDBCon->QueryGetGameOption(cThreadID, this);
//Cash Inventory
pTempDBCon->QueryGetPageMaterializedItem(cThreadID, this, 1, CASHINVENTORYPAGEMAX);
pTempDBCon->QueryGetProfile(cThreadID, this);
#if defined( PRE_ADD_LIMITED_SHOP )
pTempDBCon->QueryGetLimitedShopItem(cThreadID, this);
#endif
#if defined( PRE_ADD_STAMPSYSTEM )
pTempDBCon->QueryGetListCompleteChallenges(cThreadID, this);
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
#if defined( PRE_ALTEIAWORLD_EXPLORE )
pTempDBCon->QueryGetAlteiaWorldInfo(cThreadID, this);
#endif
#ifdef _DEBUG
g_Log.Log(LogType::_NORMAL, this, L"[ADBID:%u CDBID:%I64d SID:%u] [InitialUser]\r\n", m_nAccountDBID, m_biCharacterDBID, m_nSessionID);
#endif
SetSessionState(SESSION_STATE_LOAD);
}
void CDNUserSession::BackUpEquipInfo()
{
if( m_BackupEquipInfo.first > 0 )
{
int iInvenIndex = GetItem()->FindInventorySlotBySerial( m_BackupEquipInfo.first );
int iDestIndex = GetItem()->GetInventory(iInvenIndex) ? GetItem()->GetEquipSlotIndex( GetItem()->GetInventory(iInvenIndex)->nItemID ) : -1;
if( iInvenIndex >= 0 && iDestIndex >= 0 )
{
CSMoveItem TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.cMoveType = MoveType_InvenToEquip;
TxPacket.cSrcIndex = static_cast<BYTE>(iInvenIndex);
TxPacket.biSrcItemSerial = m_BackupEquipInfo.first;
TxPacket.cDestIndex = static_cast<BYTE>(iDestIndex);
TxPacket.wCount = 1;
GetItem()->SetMoveItemCheckGameMode( false );
GetGameRoom()->OnDispatchMessage( this, CS_ITEM, eItem::CS_MOVEITEM, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket), 0 );
GetItem()->SetMoveItemCheckGameMode( true );
}
m_BackupEquipInfo = std::make_pair(0,0);
}
}
void CDNUserSession::CheckAndSendStageClearLog(bool bClear)
{
if( bClear )
{
if( !m_pGameRoom )
return;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>α<EFBFBD> (RequestDungeonClear<61><72> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
if( m_pGameRoom->GetStageStartLogFlag() == true )
{
CDnPlayerActor *pPlayer = GetPlayerActor();
if( !pPlayer )
return;
BYTE cThreadID;
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
if( pDBCon )
{
#if defined( PRE_ADD_36870 )
pDBCon->QueryAddStageClearLog( cThreadID, m_pGameRoom->GetWorldSetID(), GetAccountDBID(), m_pGameRoom->GetRoomLogIndex(), GetCharacterDBID(), GetUserJob(), GetLevel(),
true, static_cast<DBDNWorldDef::ClearGradeCode::eCode>(0), pPlayer->GetMaxComboCount(), pPlayer->GetKillBossCount(), 0, 0, 0, 0,
m_pGameRoom->GetDungeonPlayTime()/1000, m_pGameRoom->GetDungeonClearRound());
#else
pDBCon->QueryAddStageClearLog( cThreadID, m_pGameRoom->GetWorldSetID(), GetAccountDBID(), m_pGameRoom->GetRoomLogIndex(), GetCharacterDBID(), GetUserJob(), GetLevel(),
true, static_cast<DBDNWorldDef::ClearGradeCode::eCode>(0), pPlayer->GetMaxComboCount(), pPlayer->GetKillBossCount(), 0, 0, 0, 0, 0 );
#endif // #if defined( PRE_ADD_36870 )
}
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>α<EFBFBD>( <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD> ) && StartLog <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
if( GetLastStageClearRank() == -1 && m_pGameRoom->GetStageStartLogFlag() == true )
{
BYTE cThreadID;
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
if( pDBCon )
{
#if defined( PRE_ADD_36870 )
pDBCon->QueryAddStageClearLog( cThreadID, m_pGameRoom->GetWorldSetID(), GetAccountDBID(), m_pGameRoom->GetRoomLogIndex(), GetCharacterDBID(), GetUserJob(), GetLevel(),
false, static_cast<DBDNWorldDef::ClearGradeCode::eCode>(0), 0, 0, 0, 0, 0, 0, 0, m_pGameRoom->GetDungeonClearRound());
#else
pDBCon->QueryAddStageClearLog( cThreadID, m_pGameRoom->GetWorldSetID(), GetAccountDBID(), m_pGameRoom->GetRoomLogIndex(), GetCharacterDBID(), GetUserJob(), GetLevel(),
false, static_cast<DBDNWorldDef::ClearGradeCode::eCode>(0), 0, 0, 0, 0, 0, 0, 0 );
#endif // #if defined( PRE_ADD_36870 )
}
}
}
}
void CDNUserSession::FinalUser()
{
if(m_iState == SESSION_STATE_DISCONNECTED) return;
FinalizeEvent();
#if defined( STRESS_TEST )
#else
g_Log.Log( LogType::_GAMECONNECTLOG, this, L"[%d] FinalUser() SessionState=%d RoomState=%d ip=%s\n", g_Config.nManagedID, m_iState, GetGameRoom() ? GetGameRoom()->GetRoomState() : -1, GetIpW() ? GetIpW() : L"None" );
#endif // #if defined( STRESS_TEST )
BackUpEquipInfo();
// InstantItem <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( m_iState != SESSION_STATE_SERVER_CHANGE )
GetItem()->RemoveInstantItemData( false );
if(m_iState != SESSION_STATE_SERVER_CHANGE && m_iState != SESSION_STATE_RECONNECTLOGIN)
{
if(GetGameRoom())
{
GetGameRoom()->OnDelPartyMember(GetSessionID(), m_cKickKind);
#if defined(PRE_ADD_REVENGE)
if( m_pGameRoom->bIsPvPRoom() && !GetPvPGameModeFinish() )
static_cast<CDNPvPGameRoom*>(m_pGameRoom)->OnLeaveRoomBeforeFinish(GetSessionID());
#endif
}
else
_DANGER_POINT();
}
#if defined( PRE_PARTY_DB )
else if( GetGameRoom() && GetGameRoom()->GetGameType() != REQINFO_TYPE_SINGLE )
{
if( GetGameRoom()->GetTaskMng() )
{
CDnPartyTask* pPartyTask = (CDnPartyTask*)(GetGameRoom()->GetTaskMng()->GetTask("PartyTask"));
if( pPartyTask )
pPartyTask->DelPartyMemberDB( this );
}
}
#endif
#if defined( PRE_WORLDCOMBINE_PVP )
if( GetGameRoom() && GetGameRoom()->bIsWorldPvPRoom() )
{
if( GetGameRoom()->GetWorldPvPRoomReqType() == WorldPvPMissionRoom::Common::GMRoom && GetAccountDBID() == GetGameRoom()->GetWorldPvPRoomCreateGMAccountDBID() )
{
CDNGameRoom::PartyStruct * pStruct = NULL;
CDNUserSession * pSession = NULL;
for (DWORD i = 0; i < GetGameRoom()->GetUserCount(); i++)
{
pStruct = GetGameRoom()->GetPartyData(i);
pSession = pStruct->pSession;
if ( pStruct && pSession && pSession != this )
{
pSession->SendPvPGameToPvPLobby();
}
}
}
GetGameRoom()->DelDBWorldPvPRoomMember( this );
if( GetGameRoom()->GetPvPGameMode() )
{
if( GetGameRoom()->GetPvPGameMode()->bIsSendStartMsg() && !GetGameRoom()->GetPvPGameMode()->bIsWaitStartCount() )
{
if( GetSessionID() == GetGameRoom()->GetPvPGameMode()->GetSendStartMsgSessionID() )
{
GetGameRoom()->GetPvPGameMode()->SetSendStartMsg(false);
}
}
}
}
#endif
#if defined( PRE_ADD_DIRECTNBUFF )
if( !m_DirectPartyBuffItemList.empty() )
{
for(std::list<int>::iterator itor=m_DirectPartyBuffItemList.begin();itor!=m_DirectPartyBuffItemList.end();itor++)
{
GetGameRoom()->RemoveDirectPartyBuff(*itor);
}
}
#endif
SendPartyBonusValue(0, 0);
CheckAndSendStageClearLog();
if(m_bStageAbortLog && m_pGameRoom->GetTaskMng() )
{
CDnGameTask* pTask = (CDnGameTask *)m_pGameRoom->GetTaskMng()->GetTask( "GameTask" );
#if defined( _WORK )
if(true)
#else
if(pTask && pTask->IsEnteredDungeon())
#endif // #if defined( _WORK )
ChangeStageUserData();
}
// <20>ŷ<EFBFBD> <20><><EFBFBD≯<EFBFBD> <20>ŷ<EFBFBD> <20>ߴ<EFBFBD>
if(m_nExchangeTargetSessionID > 0){
CDNUserSession *pSession = FindUserSession(m_nExchangeTargetSessionID);
if(pSession){
pSession->SendExchangeCancel();
pSession->ClearExchangeInfo();
}
SendExchangeCancel();
ClearExchangeInfo();
}
if(m_nExchangeSenderSID > 0){
CDNUserSession *pSession = FindUserSession(m_nExchangeSenderSID);
if(pSession){
pSession->SendExchangeReject(m_nSessionID);
pSession->ClearExchangeInfo();
}
}
if(m_nExchangeReceiverSID > 0){
CDNUserSession *pSession = FindUserSession(m_nExchangeReceiverSID);
if(pSession){
pSession->SendExchangeRequest(m_nSessionID, ERROR_EXCHANGE_SENDERCANCEL); // <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ưâ <20><><EFBFBD>ֱ<EFBFBD>
pSession->ClearExchangeInfo();
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>¡ <20><><EFBFBD><EFBFBD> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> üũ
DecreaseFatigue(true);
if( m_hActor ) {
if( m_iState != SESSION_STATE_SERVER_CHANGE && m_iState != SESSION_STATE_RECONNECTLOGIN ) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( m_hActor->IsPlayerActor() )
{
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(m_hActor.GetPointer());
if(pPlayer)
pPlayer->OnStageGiveUp();
else
_DANGER_POINT();
}
else
{
_DANGER_POINT();
}
}
if( m_iState == SESSION_STATE_GAME_PLAY || m_iState == SESSION_STATE_RECONNECTLOGIN ) {
SaveUserData();
LastUpdateUserData();
}
}
else{
if (m_iState > SESSION_STATE_LOADED && m_pTimeEventSystem)
m_pTimeEventSystem->SaveUserData( true );
}
if(m_bNeedUpdateOption)
GetDBConnection()->QuerySetGameOption(this, &m_GameOption);
// Rotha : Ż<><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( m_hActor )
{
if( m_hActor->IsPlayerActor() )
{
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(m_hActor.GetPointer());
if(pPlayer && pPlayer->IsVehicleMode() && pPlayer->GetMyVehicleActor())
pPlayer->UnRideVehicle();
}
}
// ä<>ù濡<C3B9><E6BFA1> ä<><C3A4><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>, <20><EFBFBD><E6BFA1> <20><><EFBFBD><EFBFBD>
if( m_nChatRoomID > 0 )
{
CDNChatRoom * pChatRoom = m_pGameRoom->m_ChatRoomManager.GetChatRoom( m_nChatRoomID );
if( pChatRoom != NULL )
{
if( pChatRoom->IsLeader( GetSessionID() ) )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
while( pChatRoom->GetUserCount() > 0 )
{
UINT UserAID = pChatRoom->GetMemberAIDFromIndex( 0 );
if( UserAID <= 0 ) break; // <20><><EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
CDNUserSession * pUserSession = NULL;
if( UserAID == GetSessionID() )
pUserSession = this;
else
pUserSession = m_pGameRoom->GetUserSession( UserAID );
if( pUserSession == NULL ) break; // <20><><EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
int nRet = pChatRoom->LeaveUser( pUserSession->GetSessionID(), CHATROOMLEAVE_DESTROYROOM );
if( nRet == ERROR_NONE )
{
// <20><EFBFBD><E6BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20>ֺ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( UserAID != GetSessionID() ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
pUserSession->SendChatRoomLeaveUser( pUserSession->GetSessionID(), CHATROOMLEAVE_DESTROYROOM );
m_pGameRoom->BroadcastChatRoomLeaveUser( pUserSession, CHATROOMLEAVE_DESTROYROOM );
}
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20>ֺ<EFBFBD><D6BA><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD>)
m_pGameRoom->BroadcastChatRoomLeaveUser( this, CHATROOMLEAVE_LEAVE );
pChatRoom->LeaveUser( GetSessionID(), CHATROOMLEAVE_LEAVE );
}
// <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( pChatRoom->GetUserCount() <= 0 )
{
m_pGameRoom->m_ChatRoomManager.DestroyChatRoom( pChatRoom->GetChatRoomID() );
}
}
}
GetGameRoom()->AddBackupPartyInfo( this );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> <20><>
SAFE_RELEASE_SPTR( m_hActor );
if((m_iState != SESSION_STATE_SERVER_CHANGE) &&(m_iState != SESSION_STATE_RECONNECTLOGIN))
{
GetDBConnection()->QueryLogout(this, m_szMID);
if(m_bCertified) { // <20><><EFBFBD><EFBFBD> !!! - <20>ݵ<EFBFBD><DDB5><EFBFBD> QUERY_CHECKAUTH <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> !!!
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_pAuthManager->QueryResetAuth(m_nWorldSetID, m_nAccountDBID, GetSessionID());
}
if( m_bCertified ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ָ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
// <20><><EFBFBD>⼭ SendDelUser() <20><> ȣ<><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
{
g_pMasterConnectionManager->SendDelUser(GetWorldSetID(), GetAccountDBID(), m_bIntededDisconnected, m_nSessionID);
}
}
if(m_iState == SESSION_STATE_RECONNECTLOGIN)
g_pMasterConnectionManager->SendCheckReconnectLogin(GetWorldSetID(), GetAccountDBID());
if( m_iState != SESSION_STATE_SERVER_CHANGE )
{
if( GetDBConnection() ){
GetDBConnection()->QueryLogoutCharacter( this );
#if defined(_KRAZ)
m_pDBCon->QueryActozUpdateCharacterInfo(this, ActozCommon::UpdateType::Logout);
#endif // #if defined(_KRAZ)
}
if( g_pMasterConnectionManager )
g_pMasterConnectionManager->SendMasterSystemSyncConnect( GetWorldSetID(), false, GetCharacterName(), GetMasterSystemData() );
const TGuildUID GuildUID = GetGuildUID();
if(GuildUID.IsSet())
{
if(g_pMasterConnectionManager)
{
g_pMasterConnectionManager->SendChangeGuildMemberInfo(GetWorldSetID(), GuildUID, GetAccountDBID(), GetCharacterDBID(), GetAccountDBID(), GetCharacterDBID(), GUILDMEMBUPDATE_TYPE_LOGINOUT, _LOCATION_NONE, 0, 0, NULL, true);
}
}
#if defined( PRE_PRIVATECHAT_CHANNEL )
if(GetPrivateChannelID())
{
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( GetWorldSetID(), GetPrivateChannelID() );
if(pPrivateChatChannel)
{
m_pDBCon->QueryOutPrivateChatChannelMember( m_pSession, PrivateChatChannel::Common::ExitMember );
pPrivateChatChannel->DelPrivateChannelMember( PrivateChatChannel::Common::OutMember, GetCharacterDBID() );
if( GetCharacterDBID() == pPrivateChatChannel->GetMasterCharacterDBID() )
{
m_pDBCon->QueryModPrivateChatChannelInfo( m_pSession, pPrivateChatChannel->GetChannelName(), PrivateChatChannel::Common::ChangeMaster, pPrivateChatChannel->GetChannelPassword(), pPrivateChatChannel->GetNextMasterCharacterDBID());
pPrivateChatChannel->ModPrivateChannelInfo( PrivateChatChannel::Common::ChangeMaster, pPrivateChatChannel->GetChannelPassword(), pPrivateChatChannel->GetNextMasterCharacterDBID() );
if(g_pMasterConnectionManager)
{
g_pMasterConnectionManager->SendModPrivateChatChannelInfo(m_pSession->GetWorldSetID(), pPrivateChatChannel->GetChannelID(), PrivateChatChannel::Common::ChangeMaster, pPrivateChatChannel->GetChannelPassword(), pPrivateChatChannel->GetMasterCharacterDBID() );
}
}
if(g_pMasterConnectionManager)
{
g_pMasterConnectionManager->SendDelPrivateChatChannelMember( m_pSession->GetWorldSetID(), PrivateChatChannel::Common::OutMember, pPrivateChatChannel->GetChannelID(), GetCharacterDBID(), GetCharacterName() );
}
SetPrivateChannelID(0);
}
}
#endif
}
m_bCertified = false;
if(m_pTcpConnection)
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ͼ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
#if defined( PRE_FIX_SOCKETCONTEXT_DANGLINGPTR )
DWORD dwTime = timeGetTime();
bool bDelete = false;
#if defined( _WORK )
while( true )
#else
while( timeGetTime()-dwTime <= 1000 )
#endif // #if defined( _WORK )
{
CSocketContext* pSocketContext = m_pTcpConnection->GetSocketContext();
CDNTcpConnection* pTcpCon = m_pTcpConnection;
if( InterlockedCompareExchange( &pSocketContext->m_lActiveCount, CSocketContext::DeleteFlag, 0 ) == 0 )
{
bDelete = true;
pTcpCon->SetSocketContext(NULL, NULL);
m_pTcpConnection = NULL;
SAFE_DELETE(pTcpCon);
g_pIocpManager->ClearSocketContext(pSocketContext);
#if defined( PRE_FIX_SOCKETCONTEXT_DANGLINGPTR ) && defined( _WORK)
std::cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~~~~~" << std::endl;
#endif // #if defined( PRE_FIX_SOCKETCONTEXT_DANGLINGPTR ) && defined( _WORK)
break;
}
else
{
#if defined( _WORK)
std::cout << "<EFBFBD><EFBFBD><EFBFBD>۴<EFBFBD><EFBFBD>۴<EFBFBD><EFBFBD>۸<EFBFBD>~~~" << std::endl;
#else
g_Log.Log(LogType::_ERROR, L"[%d] GameServer Occur DanglingPointer!!!\r\n", g_Config.nManagedID );
#endif // #if defined( _WORK)
}
}
if( bDelete == false )
{
g_Log.Log(LogType::_ERROR, L"[%d] GameServer DanglingPointer Delete Fail!!!\r\n", g_Config.nManagedID );
}
#else
g_pIocpManager->ClearSocketContext(GetTcpConnection()->GetSocketContext());
GetTcpConnection()->SetSocketContext(NULL, NULL);
delete GetTcpConnection();
m_pTcpConnection = NULL;
#endif // #if defined( PRE_FIX_SOCKETCONTEXT_DANGLINGPTR )
}
SetSessionState(SESSION_STATE_DISCONNECTED);
m_pGameRoom->m_iPartMemberCnt--;
if(GetGameRoom()->GetPartyIndex() > 0)
{
GetGameRoom()->SortMemberIndex(GetPartyMemberIndex());
SetPartyMemberIndex(-1);
GetGameRoom()->SendRefreshParty(0, NULL);
}
g_Log.Log(LogType::_NORMAL, this, L"[ADBID:%u CDBID:%I64d SID:%u] CDNUserConnection::FinalUser\r\n", m_nAccountDBID, m_biCharacterDBID, m_nSessionID);
}
void CDNUserSession::InitVoice()
{
#ifdef _USE_VOICECHAT
if(GetGameRoom()->m_nVoiceChannelID[0] > 0)
JoinVoiceChannel(GetGameRoom()->m_nVoiceChannelID[0], GetIp(), NULL, 0, false, true);
#endif
}
void CDNUserSession::SendSeqLevel(BYTE cSeqLevel)
{
SendRoomSeqLevel(this, cSeqLevel);
}
void CDNUserSession::SendBackToVillage( bool bIsPartyOut, char cKickKind/*=-1*/, const int iMapIndex/*=-1*/ )
{
m_cKickKind = cKickKind;
if(m_cKickKind == 1)
{
for (int i = 0; i < PARTYKICKMAX; i++)
if(GetGameRoom()->GetPartyKickedAccountID(i) == 0)
GetGameRoom()->SetPartyKickedAccountID(i,GetAccountDBID());
}
int iLastVillageMapIndex = ( iMapIndex != -1 ) ? iMapIndex : m_UserData.Status.nLastVillageMapIndex;
if(GetLastSubVillageMapIndex() > 0)
iLastVillageMapIndex = GetLastSubVillageMapIndex();
if(bIsGMTrace())
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD>
g_pMasterConnectionManager->SendRebirthVillageInfo(m_nWorldSetID, m_nAccountDBID, iLastVillageMapIndex );
return;
}
#if defined(PRE_WORLDCOMBINE_PARTY )
else if(GetGameRoom()->GetGameType() == REQINFO_TYPE_PARTY && GetGameRoom()->GetUserCountWithoutGM() == 1 && bIsPartyOut == false && !GetGameRoom()->bIsWorldCombineParty())
#else
else if(GetGameRoom()->GetGameType() == REQINFO_TYPE_PARTY && GetGameRoom()->GetUserCountWithoutGM() == 1 && bIsPartyOut == false)
#endif
{
//ȥ<><C8A5><EFBFBD>̰<EFBFBD> <20><><EFBFBD><20>ƴ϶<C6B4><CFB6><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD>.
g_pMasterConnectionManager->SendRequestNextVillageInfo(m_nWorldSetID, iLastVillageMapIndex, -1, true, GetGameRoom());
#if defined(PRE_FIX_69108)
//<2F><>ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ ó<><C3B3>
CDNGameRoom* pGameRoom = GetGameRoom();
if( pGameRoom )
{
CDnGameTask *pTask = (CDnGameTask*)pGameRoom->GetTaskMng()->GetTask("GameTask");
if( pTask && pTask->GetGameTaskType() == GameTaskType::DarkLair && CDnWorld::GetInstance(GetGameRoom()).GetMapType() == EWorldEnum::MapTypeDungeon)
{
GetGameRoom()->AddDungeonPlayTime( timeGetTime() - pTask->GetStageCreateTime() );
for( DWORD i=0; i<pTask->GetUserCount(); i++ ) {
CDNGameRoom::PartyStruct *pStruct = pTask->GetPartyData(i);
if( pStruct == NULL ) continue;
((CDNDLGameRoom*)GetGameRoom())->SetUpdateRankData( pStruct->pSession );
}
((CDNDLGameRoom*)GetGameRoom())->RequestRankQueryData();
}
}
#endif
return;
}
#if defined( PRE_ADD_58761 )
if(GetGameRoom()->GetDungeonGateID() > 0)
{
if (GetGameRoom()->GetDBConnection())
GetGameRoom()->GetDBConnection()->QueryAddNestGateClearLog( GetGameRoom()->GetDBThreadID(), GetGameRoom()->GetWorldSetID(), 0, GetGameRoom()->GetRoomLogIndex(), false, GetCharacterDBID(), GetUserJob(), GetLevel());
}
#endif //#if defined( PRE_ADD_58761 )
if( GetGameRoom() )
GetGameRoom()->DelLastPartyDungeonInfo( this );
if (g_pMasterConnectionManager->SendRebirthVillageInfo(m_nWorldSetID, m_nAccountDBID, iLastVillageMapIndex ))
SetOutedMember();
}
void CDNUserSession::SendPvPGameToPvPLobby()
{
if( g_pMasterConnectionManager )
{
bool bIsLadderRoom = false;
if( GetGameRoom() )
bIsLadderRoom = GetGameRoom()->bIsLadderRoom();
g_pMasterConnectionManager->SendPvPGameToPvPLobby( m_nWorldSetID, m_nAccountDBID, m_pGameRoom->GetPvPIndex(), GetLastVillageMapIndex(), bIsLadderRoom );
}
else
_DANGER_POINT();
}
void CDNUserSession::SendConnectedResult()
{
SendConnectedGameServer(this, m_nSessionID);
}
void CDNUserSession::SendUserInfo()
{
CheckInitializeSchedule();
#if defined (PRE_ADD_BESTFRIEND)
m_pBestFriend->CheckAndSendData();
#endif
//<2F>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> Īȣ<C4AA><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendAppellationList(m_UserData.Appellation.Appellation);
GetAppellation()->SendPeriodAppellationTime();
#if defined(PRE_ADD_REMOTE_QUEST)
ModifyCompleteQuest(); //<2F><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŷ<EFBFBD><C5B7> <20>ʿ<EFBFBD>
#endif
SendGlyphExpireData(m_pItem->GetGlyphExpireDate());
#if defined(PRE_ADD_TALISMAN_SYSTEM)
SendTalismanExpireData(m_pItem->IsTalismanCashSlotEntend(), m_pItem->GetTalismanExpireDate());
#endif
//#if defined( PRE_ADD_GUILDREWARDITEM )
//#else // #if defined( PRE_ADD_GUILDREWARDITEM )
const TGuildUID GuildUID = GetGuildUID();
if(GuildUID.IsSet())
{
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (pGuild)
{
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (pGuild->IsEnable())
{
#endif
TGuildRewardItem *RewardItemInfo;
RewardItemInfo = pGuild->GetGuildRewardItem();
SetGuildRewardItem(RewardItemInfo);
SendGuildRewardItem(RewardItemInfo);
#if !defined( PRE_ADD_NODELETEGUILD )
}
#endif
}
}
//#endif // #if defined( PRE_ADD_GUILDREWARDITEM )
//#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
// for(int i=0;i<TotalLevelSkill::Common::MAXSLOTCOUNT;i++)
// {
// if(g_pDataManager->bIsTotalLevelSkillCashSlot(i))
// m_pSession->SendTotalLevelSkillCashSlot(m_pSession->GetSessionID(), i, m_pSession->bIsTotalLevelSkillCashSlot(i), m_pSession->GetTotalLevelSkillCashSlot(i));
// }
//#endif
if(m_bTutorial){ // Ʃ<><EFBFBD><E4B8AE><EFBFBD><EFBFBD>
#ifdef _PACKET_COMP
//if(m_pTcpConnection) m_pTcpConnection->SetPacketComp(true);
#endif
#ifdef _USE_VOICECHAT
SendVoiceChatInfo(g_Config.szPublicDolbyIp, g_Config.nControlPort, g_Config.nAudioPort, m_nAccountDBID);
#endif
SendEnter(this);
SendEquipList( m_pItem );
SendInvenList( m_pItem );
SendWarehouseList(m_UserData.Status.nWarehouseCoin, m_pItem);
#if defined(PRE_ADD_SERVER_WAREHOUSE)
SendServerWareHouseList(m_pItem);
SendServerWareHouseCashList(m_pItem);
#endif
SendSkill(m_UserData.Skill[DualSkill::Type::Primary].SkillList, DualSkill::Type::Primary);
SendSkill(m_UserData.Skill[DualSkill::Type::Secondary].SkillList, DualSkill::Type::Secondary);
SendSkillPageCount( GetItem()->GetSkillPageCount() );
SendQuickSlotList(m_UserData.Status.QuickSlot);
SendMissionList(m_UserData.Mission.nMissionScore, m_UserData.Mission.MissionGain, m_UserData.Mission.MissionAchieve, m_UserData.Mission.wLastMissionAchieve);
SendPvPData( m_UserData.PvP );
SendGlyphTimeInfo(m_UserData.Status.nGlyphDelayTime, m_UserData.Status.nGlyphRemainTime);
SendDailyMissionList( 0, m_UserData.Mission.DailyMission );
SendDailyMissionList( 1, m_UserData.Mission.WeeklyMission );
SendDailyMissionList( 2, m_UserData.Mission.GuildWarMission );
SendDailyMissionList( 4, m_UserData.Mission.GuildCommonMission );
SendDailyMissionList( 5, m_UserData.Mission.WeekendEventMission );
SendDailyMissionList( 6, m_UserData.Mission.WeekendRepeatMission );
#if defined(PRE_ADD_MONTHLY_MISSION)
SendDailyMissionList( 7, m_UserData.Mission.MonthlyMission );
#endif // #if defined(PRE_ADD_MONTHLY_MISSION)
SendKeySetting( &m_KeySetting );
SendPadSetting( &m_PadSetting );
SendNestClear(m_UserData.Status.NestClear);
#if defined( PRE_ADD_SECONDARY_SKILL )
if( m_pSecondarySkillRepository )
m_pSecondarySkillRepository->SendList();
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
if(m_pRestraint) m_pRestraint->SendRestraintList();
if( GetDBConnection() )
GetDBConnection()->QueryLoginCharacter( this );
SendGuildWarFestivalPoint();
SendPvPGhoulScores(&m_PvPTotalGhoulScores);
#if defined(_KR)
g_pMasterConnectionManager->SendPCBangResult(GetWorldSetID(), m_nAccountDBID);
#endif // _KR
}
#if defined(PRE_ADD_EQUIPLOCK)
SendLockItems(m_pItem);
#endif // #if defined(PRE_ADD_EQUIPLOCK)
}
bool CDNUserSession::LoadUserData(TASelectCharacter *pSelect)
{
bool bResult = CDNUserBase::LoadUserData(pSelect);
if( !bResult ) return false;
if(g_pMasterConnectionManager)
g_pMasterConnectionManager->SendLoadUserTempData(GetWorldSetID(), GetAccountDBID());
return true;
}
bool CDNUserSession::SaveUserData()
{
CDNUserBase::SaveUserData();
if( GetPlayerActor() )
GetPlayerActor()->SaveUserData(m_UserData);
return true;
}
void CDNUserSession::ChangeServerUserData()
{
if(m_UserData.Status.cClass <= 0) return; // 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־ <20>ϴ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> -_-;
if(IsCertified() == false)
{
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u CDBID:%I64d SID:%u] CDNUserConnection::ChangeServerUserData IsCertified() == false!!\r\n", m_nAccountDBID, m_biCharacterDBID, m_nSessionID);
return;
}
m_pTimeEventSystem->SaveUserData( false );
SaveUserData();
CDNDBConnection *pDBCon = GetDBConnection();
if(!pDBCon){
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u CDBID:%I64d SID:%u] CDNUserConnection::ChangeServerUserData DBConnection NULL!!\r\n", m_nAccountDBID, m_biCharacterDBID, m_nSessionID);
return;
}
pDBCon->QueryUpdateUserData(QUERY_CHANGESERVERUSERDATA, this, &m_UserData, true );
pDBCon->QuerySaveItemLocationIndex(this);
#if defined(PRE_ADD_DOORS_PROJECT)
pDBCon->QuerySaveCharacterAbility(this);
#endif
#if defined(_KRAZ)
pDBCon->QueryActozUpdateCharacterInfo(this, ActozCommon::UpdateType::Sync);
#endif // #if defined(_KRAZ)
}
void CDNUserSession::LastUpdateUserData()
{
if(m_UserData.Status.cClass <= 0) return; // 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־ <20>ϴ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> -_-;
if(!m_bLoadUserData) return;
m_pTimeEventSystem->SaveUserData( true );
CDNDBConnection *pDBCon = GetDBConnection();
if(!pDBCon){
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u CDBID:%I64d SID:%u] CDNUserConnection::LastUpdateCharacter DBConnection NULL!!\r\n", m_nAccountDBID, m_biCharacterDBID, m_nSessionID);
return;
}
pDBCon->QueryUpdateUserData(QUERY_LASTUPDATEUSERDATA, this, &m_UserData, false );
pDBCon->QuerySaveItemLocationIndex(this);
#if defined(PRE_ADD_DOORS_PROJECT)
pDBCon->QuerySaveCharacterAbility(this);
#endif
}
void CDNUserSession::ChangeStageUserData(int nAddPetExp/* = 0*/)
{
if(IsCertified() == false)
return;
if(m_UserData.Status.cClass <= 0) return; // 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־ <20>ϴ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> -_-;
SaveUserData(); // <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD>
std::vector<INT64> VecSerialList;
std::vector<USHORT> VecDurList;
VecSerialList.clear();
VecDurList.clear();
m_pItem->GetEquipItemDurability(VecSerialList, VecDurList);
m_pItem->GetInventoryItemDurability(VecSerialList, VecDurList);
int nDeathCount = 0;
BYTE cDifficult = 0;
CDnPlayerActor *pPlayer = GetPlayerActor();
if( pPlayer )
{
nDeathCount = pPlayer->GetStageDeathCount();
pPlayer->ClearStageDeathCount(); // <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ʱ<EFBFBD>ȭ
}
CDNGameRoom *pGameRoom = GetGameRoom();
if( pGameRoom )
cDifficult = pGameRoom->m_StageDifficulty+1;
// PCBangRebirthCoin<69><6E> GetPCBangRebirthCoin()<29><><EFBFBD><EFBFBD> <20>Ⱦ<EFBFBD><C8BE><EFBFBD> <20><><EFBFBD><EFBFBD> -> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>̵<EFBFBD> <20>ƴϵ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD> (<28>Լ<EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>ϸ<EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20>ƴҶ<C6B4> 0<><30><EFBFBD><EFBFBD> <20>ٲ<EFBFBD>)
m_pDBCon->QueryChangeStageUserData(this, m_UserData.Status.cPCBangRebirthCoin, VecSerialList, VecDurList, nDeathCount, cDifficult, GetPickUpCoin(), m_pItem->GetPetBodySerial(), nAddPetExp);
#if defined(_KRAZ)
m_pDBCon->QueryActozUpdateCharacterInfo(this, ActozCommon::UpdateType::Sync);
#endif // #if defined(_KRAZ)
// Reset
m_biPickUpCoin = 0;
}
void CDNUserSession::SetNextVillageData(const char * pIP, USHORT nPort, int nMapIndex, int nNextMapIndex, char cNextGateNo)
{
GetGameRoom()->DelLastPartyDungeonInfo( this );
if(pIP != NULL && nPort > 0)
{
_strcpy( m_szNextVillageIP, _countof(m_szNextVillageIP), pIP, (int)strlen(pIP) );
m_nNextVillagePort = nPort;
m_biCertifyingKey = g_pAuthManager->GetCertifyingKey();
DN_ASSERT(0 != m_biCertifyingKey, "Invalid!"); // <20><><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> 0 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>ʵ<EFBFBD> !!!(<28><><EFBFBD><EFBFBD> <20>ǹ<EFBFBD>)
SetSessionState(SESSION_STATE_READY_TO_VILLAGE);
g_pAuthManager->QueryStoreAuth(SERVERTYPE_GAME, this);
}
if(cNextGateNo > 0){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>տ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.(Random<6F>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD> gateidx<64><78> -1<>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ´<CAB4>)
if(g_pDataManager->GetMapType( nNextMapIndex ) == GlobalEnum::eMapTypeEnum::MAP_VILLAGE){
SetMapIndex(nMapIndex);
if(nNextMapIndex > 0){
bool bUpdate = true;
switch( g_pDataManager->GetMapSubType( nNextMapIndex ) )
{
case GlobalEnum::eMapSubTypeEnum::MAPSUB_PVPVILLAGE:
case GlobalEnum::eMapSubTypeEnum::MAPSUB_PVPLOBBY:
{
bUpdate = false;
break;
}
}
if( bUpdate )
SetLastMapIndex(nNextMapIndex);
}
}
else
SetMapIndex(nNextMapIndex);
m_UserData.Status.cLastVillageGateNo = cNextGateNo;
}
ChangeStageUserData();
m_bCharOutLog = false;
}
void CDNUserSession::SetMapIndex(int nMapIndex)
{
if(m_bTutorial) return; // Ʃ<><EFBFBD><E4B8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȵ<EFBFBD>
CDNUserBase::SetMapIndex(nMapIndex);
GetDBConnection()->QueryMapInfo(this); // db <20><><EFBFBD><EFBFBD> 100128
}
void CDNUserSession::SetFatigue(int nFatigue, int nWeeklyFatigue, int nPCBangFatigue, int nEventFatigue, int nVIPFatigue, bool bDBSave/* = true*/)
{
CDNUserBase::SetFatigue(nFatigue, nWeeklyFatigue, nPCBangFatigue, nEventFatigue, nVIPFatigue, bDBSave);
for(DWORD i = 0; i < m_pGameRoom->GetUserCount(); i++){
CDNGameRoom::PartyStruct *pStruct = m_pGameRoom->GetPartyData(i);
if(pStruct == NULL) continue;
pStruct->pSession->SendFatigue(GetSessionID(), nFatigue, nWeeklyFatigue, nPCBangFatigue, nEventFatigue, nVIPFatigue);
}
}
void CDNUserSession::DecreaseFatigue(int nGap)
{
#if defined(PRE_ADD_WORLD_EVENT) // <20>̰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD>.
#else
// PvP <20>Ƿε<C7B7> <20><><EFBFBD>Ҵ<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( !GetGameRoom()->bIsPvPRoom() )
{
TEvent * pEvent = GetGameRoom()->GetApplyEvent(_EVENT_1_FATIGUE);
if(pEvent) return; // <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ȱ<EFBFBD><C8B1><EFBFBD> <20><><EFBFBD><EFBFBD>
}
#endif //#if defined(PRE_ADD_WORLD_EVENT)
// GM<47><4D><EFBFBD><EFBFBD> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~!
if( bIsGMTrace() )
return;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~!
if( m_hActor && m_hActor->bIsObserver() )
return;
CDNUserBase::DecreaseFatigue(nGap);
int nMax = g_pDataManager->GetFatigue(GetUserJob(), m_UserData.Status.cLevel);
for(DWORD i = 0; i < m_pGameRoom->GetUserCount(); i++){
CDNGameRoom::PartyStruct *pStruct = m_pGameRoom->GetPartyData(i);
if(pStruct == NULL) continue;
pStruct->pSession->SendFatigue(GetSessionID(), GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
}
void CDNUserSession::IncreaseFatigue(int nGap)
{
if(nGap <= 0) return;
CDNUserBase::IncreaseFatigue(nGap);
for(DWORD i = 0; i < m_pGameRoom->GetUserCount(); i++){
CDNGameRoom::PartyStruct *pStruct = m_pGameRoom->GetPartyData(i);
if(pStruct == NULL) continue;
pStruct->pSession->SendFatigue(GetSessionID(), GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
}
void CDNUserSession::SetDefaultMaxFatigue(bool bSend)
{
CDNUserBase::SetDefaultMaxFatigue(bSend);
if( bSend ) {
for(DWORD i = 0; i < m_pGameRoom->GetUserCount(); i++){
CDNGameRoom::PartyStruct *pStruct = m_pGameRoom->GetPartyData(i);
if(pStruct == NULL) continue;
if(pStruct->pSession != this)
pStruct->pSession->SendFatigue(GetSessionID(), GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
}
}
void CDNUserSession::SetDefaultMaxWeeklyFatigue(bool bSend)
{
CDNUserBase::SetDefaultMaxWeeklyFatigue(bSend);
if( bSend ) {
for(DWORD i = 0; i < m_pGameRoom->GetUserCount(); i++){
CDNGameRoom::PartyStruct *pStruct = m_pGameRoom->GetPartyData(i);
if(pStruct == NULL) continue;
if(pStruct->pSession != this)
pStruct->pSession->SendFatigue(GetSessionID(), GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
}
}
void CDNUserSession::SetDefaultMaxRebirthCoin(bool bSend)
{
CDNUserBase::SetDefaultMaxRebirthCoin(bSend);
if(bSend)
{
if( GetPlayerActor() && GetPlayerActor()->GetPartyData() )
SendRebirthCoin(ERROR_NONE, GetPlayerActor()->GetPartyData()->nUsableRebirthCoin, _REBIRTH_SELF, GetSessionID());
}
}
CDnPlayerActor* CDNUserSession::GetPlayerActor()
{
if( !m_hActor )
return NULL;
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(m_hActor.GetPointer());
return pPlayer;
}
void CDNUserSession::AddPacketQueue( const DWORD dwUniqueID, const BYTE cSubCmd, const BYTE *pBuffer, const int nSize, const int nPrior )
{
if(( sizeof(DWORD) + sizeof(BYTE) + sizeof(WORD) + nSize ) >= PACKET_QUEUE_SIZE ) {
_ASSERT(0);
return;
}
if( m_nPacketQueueOffset[nPrior] +( sizeof(DWORD) + sizeof(BYTE) + sizeof(WORD) + nSize ) >= PACKET_QUEUE_SIZE ) {
FlushPacketQueue( nPrior );
}
CheckFlushQueue( nPrior, dwUniqueID, cSubCmd );
memcpy( m_pPacketQueueBuffer[nPrior] + m_nPacketQueueOffset[nPrior], &dwUniqueID, sizeof(DWORD) ); m_nPacketQueueOffset[nPrior] += sizeof(DWORD);
memcpy( m_pPacketQueueBuffer[nPrior] + m_nPacketQueueOffset[nPrior], &cSubCmd, sizeof(BYTE) ); m_nPacketQueueOffset[nPrior] += sizeof(BYTE);
memcpy( m_pPacketQueueBuffer[nPrior] + m_nPacketQueueOffset[nPrior], &nSize, sizeof(WORD) ); m_nPacketQueueOffset[nPrior] += sizeof(WORD);
memcpy( m_pPacketQueueBuffer[nPrior] + m_nPacketQueueOffset[nPrior], pBuffer, nSize ); m_nPacketQueueOffset[nPrior] += nSize;
#ifdef PRE_ADD_PACKETSIZE_CHECKER
if (cSubCmd < (BYTE)m_vActorSendInfo.size())
{
m_vActorSendInfo[cSubCmd].nSendCount++;
m_vActorSendInfo[cSubCmd].nSendSize += nSize;
}
/*int cnt = m_nSendActorDebugInfoCount++&31;
m_SendActorDebugInfo[cnt]._dwUniqueID = dwUniqueID;
m_SendActorDebugInfo[cnt]._ActorSubCmd = cSubCmd;
m_SendActorDebugInfo[cnt]._PacketBroadFlag = bBroad ? 1 : 0;*/
#endif //#ifdef PRE_ADD_PACKETSIZE_CHECKER
m_nPacketQueueCount[nPrior]++;
m_dwVecPacketQueueUniqueList[nPrior].push_back( dwUniqueID );
}
void CDNUserSession::CheckFlushQueue( int nPrior, DWORD dwUniqueID, BYTE cSubCmd )
{
bool bCheckFlush = true;
switch( cSubCmd ) {
case eActor::SC_CP:
bCheckFlush = false;
break;
default: break;
}
for( int i=0; i<3; i++ ) {
if( i == nPrior ) continue;
if( std::find( m_dwVecPacketQueueUniqueList[i].begin(), m_dwVecPacketQueueUniqueList[i].end(), dwUniqueID ) != m_dwVecPacketQueueUniqueList[i].end() ) {
FlushPacketQueue( i );
}
}
}
void CDNUserSession::FlushPacketQueue( int nPrior )
{
if( nPrior == -1 ) {
for( int i=0; i<3; i++ ) FlushPacketQueue(i);
return;
}
if( m_nPacketQueueCount[nPrior] == 0 ) return;
SendGameActorBundleMsg( this, m_nPacketQueueCount[nPrior], m_pPacketQueueBuffer[nPrior], m_nPacketQueueOffset[nPrior], nPrior );
m_nPacketQueueOffset[nPrior] = 0;
m_nPacketQueueCount[nPrior] = 0;
m_dwVecPacketQueueUniqueList[nPrior].clear();
}
void CDNUserSession::FlushStoredPacket()
{
ScopeLock<CSyncLock> Lock( m_StoreSync );
DNVector(_STORE_PACKET)::iterator ii;
for(ii = m_pStoredPacketList.begin(); ii != m_pStoredPacketList.end(); ii++)
{
SendPacket((*ii).iMainCmd, (*ii).iSubCmd, (*ii).pMsg, (*ii).iSize, _RELIABLE);
CLfhHeap::GetInstance()->_DeAlloc((*ii).pMsg);
}
m_pStoredPacketList.clear();
}
void CDNUserSession::StorePacket(int iMainCmd, int iSubCmd, const char * pData, int nLen)
{
ScopeLock<CSyncLock> Lock( m_StoreSync );
_STORE_PACKET Store;
Store.iMainCmd = iMainCmd;
Store.iSubCmd = iSubCmd;
Store.iSize = nLen;
Store.pMsg = static_cast<char*>(CLfhHeap::GetInstance()->_Alloc(nLen));
memcpy(Store.pMsg, pData, nLen);
m_pStoredPacketList.push_back(Store);
}
CDNUserSession* CDNUserSession::FindUserSession(UINT nSessionID)
{
return m_pGameRoom->GetUserSession(nSessionID);
}
#if !defined(PRE_DELETE_DUNGEONCLEAR)
bool CDNUserSession::IsNeedDungeonLevelSave( int nMapTableID )
{
DNTableFileFormat *pMapSox = GetDNTable( CDnTableDB::TMAP );
DNTableFileFormat *pEnterDungeonSox = GetDNTable( CDnTableDB::TDUNGEONENTER );
if( !pMapSox->IsExistItem( nMapTableID ) ) return false;
int nDungeonEnterTableID = pMapSox->GetFieldFromLablePtr( nMapTableID, "_EnterConditionTableID" )->GetInteger();
if( nDungeonEnterTableID < 1 || !pEnterDungeonSox->IsExistItem( nDungeonEnterTableID ) ) return false;
int nLevel = pEnterDungeonSox->GetFieldFromLablePtr( nDungeonEnterTableID, "_LvlMin" )->GetInteger();
if( nLevel < 1 || GetLevel() - nLevel >= 30 ) return false;
return true;
}
bool CDNUserSession::CheckDungeonEnterLevel( int nMapTableID )
{
if( !IsNeedDungeonLevelSave( nMapTableID ) ) return false;
return CDNUserBase::CheckDungeonEnterLevel(nMapTableID);
}
void CDNUserSession::CalcDungeonEnterLevel(int nMapTableID, char &cOpenHard, char &cOpenVeryHard)
{
CDNUserBase::CalcDungeonEnterLevel( nMapTableID, cOpenHard, cOpenVeryHard );
if( GetMaxLevelCharacterCount() > 0 ) {
cOpenHard = cOpenVeryHard = true;
}
}
bool CDNUserSession::UpdateDungenEnterLevel( int nCurrentStageConstructionLevel, int nRank )
{
CDnGameTask *pTask = (CDnGameTask *)m_pGameRoom->GetTaskMng()->GetTask( "GameTask" );
if( !pTask ) return false;
int nEnterMapTableID = pTask->GetEnterMapTableID();
if( nEnterMapTableID < 1 ) return false;
int nDungeonEnterTableID = pTask->GetDungeonEnterTableID();
if( nDungeonEnterTableID < 1 ) return false;
if( !IsNeedDungeonLevelSave( nEnterMapTableID ) ) return false;
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TDUNGEONENTER );
static char *szRankStr[] = { "_Hard", "_VeryHard" };
char szLabel[32];
sprintf_s( szLabel, "%sOpenRank", szRankStr[nCurrentStageConstructionLevel-1] );
int nNeedRank = pSox->GetFieldFromLablePtr( nDungeonEnterTableID, szLabel )->GetInteger();
if( nRank > nNeedRank ) return false;
int nSlotIndex = GetDungeonLevelIndex( nEnterMapTableID, NULL );
if( nSlotIndex == -1 ) return false;
if( nCurrentStageConstructionLevel - 1 != GetDungeonClearType(nSlotIndex) ) return false;
SetDungeonClearType(nSlotIndex, nCurrentStageConstructionLevel); // db<64><62><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendGameOpenDungeonLevel( this, nEnterMapTableID, nCurrentStageConstructionLevel + 1 );
return true;
}
void CDNUserSession::RefreshDungeonEnterLevel()
{
for( int i=0; i<DUNGEONCLEARMAX; i++ ) {
int nMapIndex = GetDungeonClearMapIndex(i);
if( nMapIndex < 1 ) continue;
if( !IsNeedDungeonLevelSave( nMapIndex ) ) {
SetDungeonClear(i, 0, 0); // db<64><62><EFBFBD><EFBFBD>?
}
}
}
#endif // #if !defined(PRE_DELETE_DUNGEONCLEAR)
void CDNUserSession::CopyDefaultParts( int* pDest )
{
*pDest = GetDefaultBody();
*(pDest+1) = GetDefaultLeg();
*(pDest+2) = GetDefaultHand();
*(pDest+3) = GetDefaultFoot();
}
void CDNUserSession::SendPvPModeStartTick( const UINT uiStartTick )
{
if( m_iState != SESSION_STATE_GAME_PLAY )
{
_DANGER_POINT();
return;
}
if( m_hActor )
m_hActor->ResetActor();
SCPVP_MODE_STARTTICK TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiStartTick = uiStartTick;
TxPacket.uiCurTick = timeGetTime();
AddSendData( SC_PVP, ePvP::SC_MODE_STARTTICK, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNUserSession::SendPvPModeFinish( const CPvPGameMode* pPvPMode )
{
SCPVP_FINISH_PVPMODE TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiWinTeam = pPvPMode->GetWinTeam();
TxPacket.Reason = pPvPMode->GetFinishReason();
#if defined(PRE_ADD_PVP_TOURNAMENT)
TxPacket.uiWinSessionID = pPvPMode->GetLastWinSessionID();
#endif
pPvPMode->GetGameModeScore( TxPacket.uiATeamScore, TxPacket.uiBTeamScore );
AddSendData( SC_PVP, ePvP::SC_FINISH_PVPMODE, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNUserSession::SendPvPRoundStart()
{
AddSendData( SC_PVP, ePvP::SC_START_PVPROUND, NULL, 0 );
}
#if defined(PRE_ADD_PVP_TOURNAMENT)
void CDNUserSession::SendPvPRoundFinish( const UINT uiWinTeam, PvPCommon::FinishReason::eCode Reason, const CPvPGameMode* pPvPMode, const UINT uiWInSessionID, const char cTournamentStep )
#else
void CDNUserSession::SendPvPRoundFinish( const UINT uiWinTeam, PvPCommon::FinishReason::eCode Reason, const CPvPGameMode* pPvPMode )
#endif
{
SCPVP_FINISH_PVPROUND TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiWinTeam = uiWinTeam;
TxPacket.Reason = Reason;
#if defined(PRE_ADD_PVP_TOURNAMENT)
TxPacket.uiWinSessionID = uiWInSessionID;
TxPacket.cTournamentStep = cTournamentStep;
#endif //#if defined(PRE_ADD_PVP_TOURNAMENT)
pPvPMode->GetGameModeScore( TxPacket.uiATeamScore, TxPacket.uiBTeamScore );
AddSendData( SC_PVP, ePvP::SC_FINISH_PVPROUND, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNUserSession::SendSuccessBreakInto( const UINT uiSessionID )
{
SCPVP_SUCCESSBREAKINTO TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiSessionID = uiSessionID;
AddSendData( SC_PVP, ePvP::SC_BREAKINTO_SUCCESS, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNUserSession::SendPvPAddPoint( UINT uiSessionID, const UINT uiScoreType, const UINT uiAddPoint )
{
SCPVP_ADDPOINT TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiSessionID = uiSessionID;
TxPacket.uiScoreType = uiScoreType;
TxPacket.uiAddPoint = uiAddPoint;
AddSendData( SC_PVP, ePvP::SC_ADDPOINT, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
void CDNUserSession::SendPvPSelectCaptain( UINT uiSessionID, WCHAR* wszName )
{
SCPVP_SELECTCAPTAIN TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.uiSessionID = uiSessionID;
AddSendData( SC_PVP, ePvP::SC_SELECTCAPTAIN, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
#if !defined( _FINAL_BUILD )
WCHAR wszChat[MAX_PATH];
wsprintf( wszChat, L"%s <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.", wszName );
SendChat( CHATTYPE_TEAMCHAT, static_cast<int>(wcslen(wszChat)), L"", wszChat );
#endif // #if defined( _FINAL_BUILD )
}
void CDNUserSession::SendPvPSelectZombie( std::map<DWORD,DnActorHandle>& mZombie )
{
SCPVP_SELECTZOMBIE TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
if( _countof(TxPacket.Zombies) < mZombie.size() )
return;
for( std::map<DWORD,DnActorHandle>::iterator itor=mZombie.begin() ; itor!=mZombie.end() ; ++itor )
{
TxPacket.Zombies[TxPacket.cCount].uiSessionID = (*itor).second->GetSessionID();
TxPacket.Zombies[TxPacket.cCount].nMonsterMutationTableID = (*itor).second->GetMonsterMutationTableID();
TxPacket.Zombies[TxPacket.cCount].bZombie = true;
TxPacket.Zombies[TxPacket.cCount].iScale = static_cast<int>((*itor).second->GetScale()->x*100);
++TxPacket.cCount;
#if !defined( _FINAL_BUILD )
WCHAR wszChat[MAX_PATH];
wsprintf( wszChat, L"%s <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.", (*itor).second->GetName() );
SendChat( CHATTYPE_TEAMCHAT, static_cast<int>(wcslen(wszChat)), L"", wszChat );
#endif // #if defined( _FINAL_BUILD )
}
int iSize = sizeof(TxPacket)-sizeof(TxPacket.Zombies)+(TxPacket.cCount*sizeof(TZombieInfo));
AddSendData( SC_PVP, ePvP::SC_SELECTZOMBIE, reinterpret_cast<char*>(&TxPacket), iSize );
}
void CDNUserSession::SendPvPSelectZombie( DnActorHandle hActor, int nTableID, bool bZombie, bool bRemoveStateBlow, int iScale )
{
SCPVP_SELECTZOMBIE TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.Zombies[TxPacket.cCount].uiSessionID = hActor->GetSessionID();
TxPacket.Zombies[TxPacket.cCount].nMonsterMutationTableID = nTableID;
TxPacket.Zombies[TxPacket.cCount].bZombie = bZombie;
TxPacket.Zombies[TxPacket.cCount].bRemoveStateBlow = bRemoveStateBlow;
TxPacket.Zombies[TxPacket.cCount].iScale = iScale;
++TxPacket.cCount;
#if !defined( _FINAL_BUILD )
if( bZombie )
{
WCHAR wszChat[MAX_PATH];
wsprintf( wszChat, L"%s <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.", hActor->GetName() );
SendChat( CHATTYPE_TEAMCHAT, static_cast<int>(wcslen(wszChat)), L"", wszChat );
}
#endif // #if defined( _FINAL_BUILD )
int iSize = sizeof(TxPacket)-sizeof(TxPacket.Zombies)+(TxPacket.cCount*sizeof(TZombieInfo));
AddSendData( SC_PVP, ePvP::SC_SELECTZOMBIE, reinterpret_cast<char*>(&TxPacket), iSize );
}
#if defined(PRE_MOD_PVP_LADDER_XP)
void CDNUserSession::UpdatePvPLevel()
{
TPvPGroup* pPvPData = GetPvPData();
if( !pPvPData ) return;
// PvP_Level
for( UINT i=pPvPData->cLevel ; i<PvPCommon::Common::MaxRank ; ++i )
{
const TPvPRankTable* pPvPRankTable = g_pDataManager->GetPvPRankTable( i );
if( !pPvPRankTable )
{
_DANGER_POINT();
break;
}
#ifdef PRE_MOD_PVPRANK
if (pPvPRankTable->cType != PvPCommon::RankTable::ExpValue)
continue;
if( pPvPData->uiXP >= pPvPRankTable->uiXP )
#if defined(PRE_ADD_PVPLEVEL_MISSION)
SetPvPLevel(static_cast<BYTE>(i+1));
#else
pPvPData->cLevel = static_cast<BYTE>(i+1);
#endif
else
break;
#else //#ifdef PRE_MOD_PVPRANK
if( pPvPData->uiXP >= pPvPRankTable->uiXP )
#if defined(PRE_ADD_PVPLEVEL_MISSION)
SetPvPLevel(static_cast<BYTE>(i+1));
#else
pPvPData->cLevel = static_cast<BYTE>(i+1);
#endif
else
break;
#endif //#ifdef PRE_MOD_PVPRANK
}
}
#endif
void CDNUserSession::SetHide(bool bHide)
{
m_bHide = bHide;
for(DWORD i = 0; i < m_pGameRoom->GetUserCount(); i++){
CDNGameRoom::PartyStruct *pStruct = m_pGameRoom->GetPartyData(i);
if(pStruct == NULL) continue;
pStruct->pSession->SendHide(m_nSessionID, bHide);
}
}
// Guild
void CDNUserSession::RefreshGuildSelfView()
{
for(DWORD i = 0; i < m_pGameRoom->GetUserCount(); i++) {
CDNGameRoom::PartyStruct *pStruct = m_pGameRoom->GetPartyData(i);
if(NULL == pStruct) {
continue;
}
pStruct->pSession->SendGuildSelfView(GetSessionID(), m_GuildSelfView);
}
}
int CDNUserSession::CmdAbandonStage( const bool bDecreaseDurability, bool bPartyOut, bool bIntenedDisconnect, const int iMapIndex/*=-1*/ )
{
if(m_iState != SESSION_STATE_GAME_PLAY || GetGameRoom()->GetRoomState() != _GAME_STATE_PLAY)
return ERROR_GENERIC_INVALIDREQUEST;
if( m_pGameRoom && m_pGameRoom->bIsPvPRoom() )
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
CDNGameRoom::PartyStruct * pStruct = GetGameRoom()->GetPartyData(this);
if(pStruct)
{
if(pStruct->nEnteredGateIndex != -1)
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
}
DnActorHandle hActor = GetActorHandle();
if( hActor )
{
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(hActor.GetPointer());
if(pPlayer)
{
if( bDecreaseDurability )
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ְ<EFBFBD>
if(m_pGameRoom->GetWorld()->GetMapType() == EWorldEnum::MapTypeEnum::MapTypeDungeon)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ƽ <20>Կ<EFBFBD><D4BF><EFBFBD> <20>ؿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pPlayer->OnStageGiveUp();
pPlayer->CmdRemoveStateEffect(STATE_BLOW::BLOW_099);
}
}
}
}
if( bIntenedDisconnect == false )
SendBackToVillage( bPartyOut, -1, iMapIndex );
m_bStageAbortLog = false;
return ERROR_NONE;
}
void CDNUserSession::SetUserJob(BYTE cJob)
{
CDNUserBase::SetUserJob( cJob );
DnActorHandle hActor = GetActorHandle();
if( hActor )
{
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(hActor.GetPointer());
pPlayer->CmdChangeJob( cJob );
}
for(DWORD i = 0; i < m_pGameRoom->GetUserCount(); i++){
CDNGameRoom::PartyStruct *pStruct = m_pGameRoom->GetPartyData(i);
if(pStruct == NULL) continue;
if( pStruct->pSession == this ) continue;
pStruct->pSession->SendChangeJob( m_nSessionID, cJob );
}
}
void CDNUserSession::BroadcastingEffect(char cType, char cState)
{
for(DWORD i = 0; i < m_pGameRoom->GetUserCount(); i++){
CDNGameRoom::PartyStruct *pStruct = m_pGameRoom->GetPartyData(i);
if(pStruct == NULL) continue;
if( pStruct->pSession->GetState() != SESSION_STATE_GAME_PLAY )
continue;
pStruct->pSession->SendBroadcastingEffect(GetSessionID(), cType, cState);
}
}
void CDNUserSession::VerifyValidMap(int nNextMapIndex)
{
#if defined(_FINAL_BUILD)
// <20>Ϲݰ<CFB9><DDB0><EFBFBD><EFBFBD><EFBFBD> üũ
if((GetAccountLevel() <= AccountLevel_QA) &&(GetAccountLevel() >= AccountLevel_New))
return;
#endif // #if defined(_FINAL_BUILD)
if(!g_pDataManager->CheckChangeMap(GetMapIndex(), nNextMapIndex))
{
WCHAR wszBuf[100];
wsprintf( wszBuf, L"GAME Prev[%d]->Next[%d]", GetMapIndex(), nNextMapIndex);
GetDBConnection()->QueryAddAbuseLog(this, ABUSE_MOVE_SERVERS, wszBuf);
}
}
void CDNUserSession::RecvUdpPing( DWORD dwTick )
{
DWORD dwCur = timeGetTime();
if( dwCur < dwTick )
{
_DANGER_POINT();
return;
}
DWORD dwGap = (dwCur-dwTick);
#if defined( _WORK )
//std::cout << "UDPPing=" << dwGap << std::endl;
#endif // #if defined( _WORK )
m_pairUdpPing.first += dwGap;
++m_pairUdpPing.second;
}
void CDNUserSession::WritePingLog()
{
int iTcpPing = -1;
int iUdpPing = -1;
if( m_pairTcpPing.second > 0 )
iTcpPing = m_pairTcpPing.first/m_pairTcpPing.second;
if( m_pairUdpPing.second > 0 )
iUdpPing = m_pairUdpPing.first/m_pairUdpPing.second;
if( iTcpPing == -1 && iUdpPing == -1 )
return;
g_Log.Log( LogType::_PING, this, L"[%d] IP=%S TcpPing=%dms(%d/%d) UdpPing=%dms(%d/%d)\r\n", g_Config.nManagedID, GetIp(), iTcpPing, m_pairTcpPing.first, m_pairTcpPing.second, iUdpPing, m_pairUdpPing.first, m_pairUdpPing.second );
}
void CDNUserSession::ApplySourceEffect(CDnPlayerActor* pPlayerActor, const TSourceData& source, bool bOnInitialize/* = false*/)
{
if (!pPlayerActor)
return;
if (source.nItemID <= 0 || source.nRemainTime <= 0)
return;
const TItemData* pItemData = g_pDataManager->GetItemData(source.nItemID);
if (!pItemData)
return;
const TSkillData* pSkill = g_pDataManager->GetSkillData(pItemData->nSkillID);
if (!pSkill || pSkill->vLevelDataList.empty())
return;
CDnSkill::SkillInfo skillInfo;
std::vector<CDnSkill::StateEffectStruct> stateEffects;
CDnSkill::CreateSkillInfo(pSkill->nSkillID, pSkill->vLevelDataList[0].cSkillLevel, skillInfo, stateEffects);
skillInfo.hSkillUser = pPlayerActor->GetActorHandle();
// <20><20>ٿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>־<EFBFBD><D6BE>ش<EFBFBD>.
int iSE = pPlayerActor->GetNumAppliedStateBlow();
for( int i = 0; i < iSE; ++i )
{
DnBlowHandle hBlow = pPlayerActor->GetAppliedStateBlow( i );
if( hBlow->IsFromSourceItem() )
pPlayerActor->AddStateBlowIDToRemove( hBlow->GetBlowID() );
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pPlayerActor->RemoveResetStateBlow();
for each (CDnSkill::StateEffectStruct stateEffect in stateEffects)
{
int iBlowID = pPlayerActor->CmdAddStateEffect(&skillInfo, static_cast<STATE_BLOW::emBLOW_INDEX>(stateEffect.nID), (source.nRemainTime*1000), stateEffect.szValue.c_str(), false, true);
pPlayerActor->SendRemoveStateEffectGraphic(static_cast<STATE_BLOW::emBLOW_INDEX>(stateEffect.nID));
if( -1 != iBlowID )
{
DnBlowHandle hBlow = pPlayerActor->GetStateBlowFromID( iBlowID );
hBlow->FromSourceItem();
// #45646 <20>ٿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> HP/MP <20><> Ǯ<><C7AE> ä<><C3A4><EFBFBD>ش<EFBFBD>.
if( bOnInitialize )
hBlow->SetHPMPFullWhenBegin();
}
// Ż<>Ϳ<EFBFBD> <20>̵<EFBFBD><CCB5>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>Ŀ<EFBFBD> <20><>ȹ<EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20><>û<EFBFBD>ϸ<EFBFBD> <20>߰<EFBFBD>.
//if (pPlayerActor->GetMyVehicleActor())
//{
// int iBlowID = pPlayerActor->GetMyVehicleActor()->CmdAddStateEffect(&skillInfo, static_cast<STATE_BLOW::emBLOW_INDEX>(stateEffect.nID), source.nRemainTime, stateEffect.szValue.c_str(), false, true);
//}
}
}
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
void CDNUserSession::ApplyEffectSkill( CDnPlayerActor* pPlayerActor, std::vector<TEffectSkillData>& vEffectSkill, bool bOnInitialize , bool bIsPvpGameRoom )
{
if( !pPlayerActor || ( pPlayerActor && !pPlayerActor->GetActorHandle() ) )
return;
if( vEffectSkill.empty() )
return;
std::vector<TEffectSkillData>::iterator itor = vEffectSkill.begin();
for(;itor != vEffectSkill.end(); itor++)
{
ApplyEffectSkill( pPlayerActor, &(*itor), bOnInitialize , bIsPvpGameRoom );
}
}
void CDNUserSession::ApplyEffectSkill( CDnPlayerActor* pPlayerActor, TEffectSkillData* EffectSkill, bool bOnInitialize , bool bIsPvpGameRoom )
{
if( !pPlayerActor || ( pPlayerActor && !pPlayerActor->GetActorHandle() ) )
return;
if( !EffectSkill )
return;
if (EffectSkill->nSkillID <= 0 || ( EffectSkill->tExpireDate <= 0 && EffectSkill->bEternity == false ))
return;
const TSkillData* pSkill = g_pDataManager->GetSkillData(EffectSkill->nSkillID);
if (!pSkill || pSkill->vLevelDataList.empty())
return;
int nItemType = g_pDataManager->GetItemMainType(EffectSkill->nItemID);
if( ( (nItemType == ITEMTYPE_GLOBAL_PARTY_BUFF) || (nItemType == ITEMTYPE_BESTFRIEND) ) && bIsPvpGameRoom )
return;
CDnSkill::SkillInfo skillInfo;
std::vector<CDnSkill::StateEffectStruct> stateEffects;
#if defined( PRE_FIX_BUFFITEM )
CDnSkill::CreateSkillInfo(EffectSkill->nSkillID, EffectSkill->nSkillLevel, skillInfo, stateEffects);
#else
CDnSkill::CreateSkillInfo(pSkill->nSkillID, pSkill->vLevelDataList[0].cSkillLevel, skillInfo, stateEffects);
#endif
skillInfo.hSkillUser = pPlayerActor->GetActorHandle();
for each (CDnSkill::StateEffectStruct stateEffect in stateEffects)
{
int nRemainTime = EffectSkill->nRemainTime * 1000;
if( EffectSkill->bEternity == true )
nRemainTime = -1;
int iBlowID = pPlayerActor->CmdAddStateEffect(&skillInfo, static_cast<STATE_BLOW::emBLOW_INDEX>(stateEffect.nID), nRemainTime , stateEffect.szValue.c_str(), true, true);
pPlayerActor->SendRemoveStateEffectGraphic(static_cast<STATE_BLOW::emBLOW_INDEX>(stateEffect.nID));
if( -1 != iBlowID )
{
DnBlowHandle hBlow = pPlayerActor->GetStateBlowFromID( iBlowID );
if( hBlow )
{
// #45646 <20>ٿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> HP/MP <20><> Ǯ<><C7AE> ä<><C3A4><EFBFBD>ش<EFBFBD>.
hBlow->FromSourceItem();
if( bOnInitialize )
hBlow->SetHPMPFullWhenBegin();
EffectSkill->bApplySkill = true;
}
}
}
}
void CDNUserSession::RemoveEffectSkill( CDnPlayerActor* pPlayerActor, TEffectSkillData* EffectSkill )
{
if( !pPlayerActor || ( pPlayerActor && !pPlayerActor->GetActorHandle() ) )
return;
if( !EffectSkill )
return;
if( EffectSkill->nSkillID <= 0 )
return;
const TSkillData* pSkill = g_pDataManager->GetSkillData(EffectSkill->nSkillID);
if (!pSkill || pSkill->vLevelDataList.empty())
return;
int iSE = pPlayerActor->GetNumAppliedStateBlow();
for( int i = 0; i < iSE; ++i )
{
DnBlowHandle hBlow = pPlayerActor->GetAppliedStateBlow( i );
if( hBlow )
{
if( hBlow->GetParentSkillInfo() && hBlow->GetParentSkillInfo()->iSkillID == pSkill->nSkillID )
pPlayerActor->AddStateBlowIDToRemove( hBlow->GetBlowID() );
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
EffectSkill->bApplySkill = false;
pPlayerActor->RemoveResetStateBlow();
}
#if defined( PRE_FIX_BUFFITEM )
void CDNUserSession::RemoveApplySkill( CDnPlayerActor* pPlayerActor, int nSkillID )
{
if( !pPlayerActor || ( pPlayerActor && !pPlayerActor->GetActorHandle() ) )
return;
if( nSkillID <= 0 )
return;
const TSkillData* pSkill = g_pDataManager->GetSkillData(nSkillID);
if (!pSkill || pSkill->vLevelDataList.empty())
return;
int iSE = pPlayerActor->GetNumAppliedStateBlow();
for( int i = 0; i < iSE; ++i )
{
DnBlowHandle hBlow = pPlayerActor->GetAppliedStateBlow( i );
if( hBlow )
{
if( hBlow->GetParentSkillInfo() && hBlow->GetParentSkillInfo()->iSkillID == pSkill->nSkillID )
pPlayerActor->AddStateBlowIDToRemove( hBlow->GetBlowID() );
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pPlayerActor->RemoveResetStateBlow();
}
#endif
#endif
int CDNUserSession::TryWarpVillage(int nMapIndex, INT64 nItemSerial)
{
if (m_pGameRoom->GetRoomState() != _GAME_STATE_PLAY)
return ERROR_GENERIC_INVALIDREQUEST;
if (!IsWindowState(WINDOW_BLIND))
return ERROR_ITEM_FAIL;
CDnGameTask *pTask = (CDnGameTask*)m_pGameRoom->GetTaskMng()->GetTask("GameTask");
SetNextVillageData(NULL, 0, pTask->GetMapTableID(), nMapIndex, 1);
g_pMasterConnectionManager->SendRequestNextVillageInfo(GetWorldSetID(), GetAccountDBID(), nMapIndex, 1, true, nItemSerial);
return ERROR_NONE;
}
void CDNUserSession::SetGuildRewardItem( TGuildRewardItem* GuildRewardItem )
{
#if defined( PRE_ADD_GUILDREWARDITEM )
if(GetPlayerActor())
{
for(int i = GUILDREWARDEFFECT_TYPE_ADDSKILLTYPE1; i <= GUILDREWARDEFFECT_TYPE_ADDSKILLTYPE4; i++)
{
std::map<int, TGuildRewardItem>::iterator itor = m_mGuildRewardItem.find(i);
if( itor != m_mGuildRewardItem.end() )
{
// <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> nEffectValue<75><65> <20><><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD> nEffectValue2<65><32> <20><>ų<EFBFBD>ε<EFBFBD><CEB5><EFBFBD>
DnSkillHandle hSkill = GetPlayerActor()->FindSkill( itor->second.nEffectValue2 );
if( hSkill )
GetPlayerActor()->RemoveSkill(hSkill->GetClassID());
}
}
}
m_mGuildRewardItem.clear();
#endif
for(int i=GUILDREWARDEFFECT_TYPE_EXTRAEXP; i<GUILDREWARDEFFECT_TYPE_CNT; i++)
{
if( GuildRewardItem[i].nItemID > 0 )
{
m_mGuildRewardItem.insert(pair<int,TGuildRewardItem>(i, GuildRewardItem[i]));
}
}
}
int CDNUserSession::GetGuildRewardItemValue( int nType )
{
std::map<int, TGuildRewardItem>::iterator itor = m_mGuildRewardItem.find(nType);
if( itor != m_mGuildRewardItem.end() )
{
if( itor->second.nItemID > 0 && itor->second.nEffectValue > 0 )
return itor->second.nEffectValue;
}
return 0;
}
#if defined( PRE_ADD_GUILDREWARDITEM )
void CDNUserSession::SetGuildRewardItem()
{
const TGuildUID GuildUID = GetGuildUID();
if(GuildUID.IsSet())
{
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (pGuild)
{
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (pGuild->IsEnable())
{
#endif
TGuildRewardItem *RewardItemInfo;
RewardItemInfo = pGuild->GetGuildRewardItem();
SetGuildRewardItem(RewardItemInfo);
SendGuildRewardItem(RewardItemInfo);
#if !defined( PRE_ADD_NODELETEGUILD )
}
#endif
}
}
}
void CDNUserSession::ApplyGuildRewardSkill( bool bUseItem/*=false*/ )
{
if(!GetPlayerActor())
return;
for(int i = GUILDREWARDEFFECT_TYPE_ADDSKILLTYPE1; i <= GUILDREWARDEFFECT_TYPE_ADDSKILLTYPE4; i++)
{
std::map<int, TGuildRewardItem>::iterator itor = m_mGuildRewardItem.find(i);
if( itor != m_mGuildRewardItem.end() )
{
AddGuildRewardItemBuff( itor->second.nEffectValue2);
}
}
ApplyGuildRewardItemBuff(bUseItem);
}
void CDNUserSession::AddGuildRewardItemBuff( int nItemID )
{
m_GuildRewardbuffItemList.push_back(nItemID);
}
void CDNUserSession::ApplyGuildRewardItemBuff( bool bUseItem/*=false*/ )
{
for( std::list<int>::iterator itor = m_GuildRewardbuffItemList.begin();itor != m_GuildRewardbuffItemList.end(); itor++ )
{
CSUseItem pPacket;
memset(&pPacket, 0, sizeof(pPacket));
TItemData *pItemData = g_pDataManager->GetItemData(*itor);
if( g_pDataManager->IsUseItemAllowMapTypeCheck( pItemData->nItemID, GetGameRoom()->m_iMapIdx ) )
{
TEffectSkillData* EffectSkill = GetItem()->GetEffectSkillItem( EffectSkillNameSpace::SearchType::SkillID, pItemData->nSkillID );
if( !EffectSkill )
{
GetItem()->ApplyPartyEffectSkillItemData(&pPacket, pItemData, GetSessionID(), EffectSkillNameSpace::ShowEffectType::NONEEFFECT, false, bUseItem);
}
}
}
}
#endif
void CDNUserSession::SetPeriodExpItemRate()
{
// <20><><EFBFBD><EFBFBD>ġ ȹ<><C8B9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>..
std::vector<const TItem*> vItem;
m_pItem->GetCashInventoryItemListByType( ITEMTYPE_PERIODEXPITEM, vItem );
m_nPeriodeExpItemRate = 0;
if( vItem.empty() )
return;
for( UINT i=0 ; i<vItem.size() ; ++i )
{
if( m_nPeriodeExpItemRate < g_pDataManager->GetItemTypeParam1(vItem[i]->nItemID) )
{
if( g_pDataManager->GetItemTypeParam2(vItem[i]->nItemID) > 0 && GetLevel() >= g_pDataManager->GetItemTypeParam2(vItem[i]->nItemID) )
continue;
m_nPeriodeExpItemRate = g_pDataManager->GetItemTypeParam1(vItem[i]->nItemID);
}
}
}
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
void CDNUserSession::ApplyPartyEffectSkillItemData( CSUseItem *pPacket, TItemData *pItemData, UINT nUseSessionID, EffectSkillNameSpace::ShowEffectType::eType eType, bool bSendDB, bool bUseItem )
{
if( GetGameRoom() )
{
CDnPartyTask* pPartyTask = (CDnPartyTask*)(GetGameRoom()->GetTaskMng()->GetTask("PartyTask"));
if( pPartyTask && pItemData)
{
if(pItemData->nTypeParam[0] == EffectSkillNameSpace::BuffType::Partybuff )
{
pPartyTask->ApplyPartyEffectSkillItemData(pPacket, pItemData, nUseSessionID, eType, bSendDB, bUseItem);
}
else
{
GetItem()->ApplyPartyEffectSkillItemData( pPacket, pItemData, GetSessionID(), eType, true, true );
}
}
}
}
#endif
#if defined(_ID)
void CDNUserSession::SetIDNPcCafeInfo(const char* strMacAddress, const char* strKey)
{
_strcpy(m_szMacAddress, _countof(m_szMacAddress), strMacAddress, (int)strlen(strMacAddress));
_strcpy(m_szKey, _countof(m_szKey), strKey, (int)strlen(strKey));
}
#endif
#if defined( PRE_ADD_BESTFRIEND )
void CDNUserSession::BestFriendChangeLevel(BYTE cLevel, bool bSend /*= false*/)
{
if(bSend)
{
if( GetBestFriend()->IsRegistered() )
{
sWorldUserState State;
if (g_pWorldUserState->GetUserState(GetBestFriend()->GetInfo().wszName, GetBestFriend()->GetInfo().biCharacterDBID, &State))
{
if (g_pMasterConnectionManager)
g_pMasterConnectionManager->SendLevelUpBestFriend(GetWorldSetID(), cLevel, m_pBestFriend->GetInfo().wszName);
}
}
}
else
GetBestFriend()->ChangeLevel(cLevel);
}
#endif
#if defined( PRE_ADD_DIRECTNBUFF )
void CDNUserSession::SendDirectPartyBuffMsg()
{
for(std::list<int>::iterator itor = m_DirectPartyBuffItemList.begin();itor!=m_DirectPartyBuffItemList.end();itor++)
{
for (DWORD i = 0; i < m_pSession->GetGameRoom()->GetUserCount(); ++i)
{
if( !g_pDataManager->IsUseItemAllowMapTypeCheck( *itor, GetGameRoom()->m_iMapIdx ) )
continue;
const CDNGameRoom::PartyStruct* pPartyStruct = m_pSession->GetGameRoom()->GetPartyData(i);
if(pPartyStruct && pPartyStruct->pSession)
{
pPartyStruct->pSession->SendWorldSystemMsg(WORLDCHATTYPE_DIRECTPARTYBUFF, *itor, GetCharacterName(), 0 );
}
}
}
}
#endif
#if defined( PRE_ADD_NEWCOMEBACK )
void CDNUserSession::SetComebackAppellation( int nAppelationID )
{
if( m_nComebackAppellation != nAppelationID )
{
int nPrevComebackAppellation = m_nComebackAppellation;
m_nComebackAppellation = nAppelationID;
GetDBConnection()->QueryModMemberComebackInfo( this, GetPartyID() );
if( nPrevComebackAppellation > 0 )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( GetGameRoom() && GetGameRoom()->bIsComebackParty() )
{
GetGameRoom()->DelPartyMemberAppellation(nPrevComebackAppellation);
}
}
if( m_nComebackAppellation > 0 )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
TAppellationData *pAData = g_pDataManager->GetAppellationData( nAppelationID );
if( pAData )
{
if( pAData->nSkillItemID > 0 )
{
CSUseItem pPacket;
memset(&pPacket, 0, sizeof(pPacket));
pPacket.biInvenSerial = GetItem()->MakeItemSerial();
TItemData* pBuffItemData = g_pDataManager->GetItemData( pAData->nSkillItemID );
if( pBuffItemData && GetGameRoom() )
{
GetGameRoom()->SetComebackParty(true);
bool bUseItem = true;
EWorldEnum::MapTypeEnum MapType = CDnWorld::GetInstance(GetGameRoom()).GetMapType();
if( MapType == EWorldEnum::MapTypeWorldMap )
bUseItem = false;
ApplyPartyEffectSkillItemData(&pPacket, pBuffItemData, m_pSession->GetSessionID(), EffectSkillNameSpace::ShowEffectType::NONEEFFECT, false, bUseItem);
}
}
}
}
}
}
#endif
#if defined( PRE_FIX_BUFFITEM )
void CDNUserSession::CheckEffectSkillItemData()
{
std::vector<TEffectSkillData> vEffectSkill;
vEffectSkill.clear();
GetItem()->GetEffectSkillItem( vEffectSkill );
if(vEffectSkill.empty())
return;
for( int i=0;i<vEffectSkill.size();i++ )
{
if( !g_pDataManager->IsUseItemAllowMapTypeCheck( vEffectSkill[i].nItemID, GetGameRoom()->m_iMapIdx ) )
{
CDNUserSession::RemoveEffectSkill(GetPlayerActor(), &vEffectSkill[i]);
GetItem()->BroadcastDelEffectSkillItemData( vEffectSkill[i].nItemID );
}
else
{
CSUseItem pPacket;
memset(&pPacket, 0, sizeof(pPacket));
pPacket.biInvenSerial = GetItem()->MakeItemSerial();
TItemData* pBuffItemData = g_pDataManager->GetItemData(vEffectSkill[i].nItemID);
if( pBuffItemData )
{
TEffectSkillData* EffectSkill = GetItem()->GetEffectSkillItem( EffectSkillNameSpace::SearchType::SkillID, pBuffItemData->nSkillID );
if( EffectSkill && EffectSkill->bApplySkill == false )
{
GetItem()->BroadcastEffectSkillItemData( false, pBuffItemData->nSkillID, EffectSkillNameSpace::ShowEffectType::NONEEFFECT );
CDNUserSession::ApplyEffectSkill(GetPlayerActor(), EffectSkill, true, GetGameRoom()->bIsPvPRoom() );
}
}
}
}
}
#endif
#if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
int CDNUserSession::GetStageClearBonusReward(char *pData, int nLen)
{
if(nLen != sizeof(CSStageClearBonusRewardSelect))
return ERROR_INVALIDPACKET;
CSStageClearBonusRewardSelect* pPacket = (CSStageClearBonusRewardSelect*)pData;
if(pPacket->nItemID <= 0 || pPacket->nPropID <= 0)
return ERROR_GENERIC_INVALIDREQUEST;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3>
int nMapID = m_pGameRoom->GetGameTask()->GetMapTableID();
int nDropItemGroup = g_pDataManager->GetBonusDropGroupID(nMapID, pPacket->nItemID);
if(nDropItemGroup == 0)
{
//<2F><>, <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD><D7B7><EFBFBD> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD>̰ų<CCB0> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_Log.Log(LogType::_ERROR, this, L"[StageClearBonusReward] BonusReward Find Fail(MapID[%d] NeedItemID[%d])\n", nMapID, pPacket->nItemID);
return ERROR_GENERIC_INVALIDREQUEST;
}
//<2F>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
bool IsCashItem = g_pDataManager->IsCashItem(pPacket->nItemID);
if(IsCashItem)
if(m_pItem->GetCashItemCountByItemID(pPacket->nItemID) <= 0)
return ERROR_GENERIC_INVALIDREQUEST;
else
if(m_pItem->GetInventoryItemCount(pPacket->nItemID) <= 0)
return ERROR_GENERIC_INVALIDREQUEST;
//<2F><><EFBFBD><EFBFBD> üũ
std::vector<CEtWorldProp *> VecProp;
m_pGameRoom->GetWorld()->FindPropFromCreateUniqueID( pPacket->nPropID, &VecProp );
if( VecProp.empty() )
return ERROR_GENERIC_INVALIDREQUEST;
//<2F><><EFBFBD><EFBFBD> Ÿ<><C5B8> üũ. ChestŸ<74><C5B8><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD>ϴ<EFBFBD> <20>ְ<EFBFBD> <20>ƴ<EFBFBD>...
if(static_cast<CDnWorldProp *>( VecProp[0] )->GetPropType() != PTE_Operation)
return ERROR_GENERIC_INVALIDREQUEST;
CDnWorldOperationProp *pProp = static_cast<CDnWorldOperationProp *>( VecProp[0] );
if( !pProp )
return ERROR_GENERIC_INVALIDREQUEST;
if(!pProp->IsShow())
return ERROR_GENERIC_INVALIDREQUEST;
CDnItemTask *pItemTask = (CDnItemTask *)GetGameRoom()->GetTaskMng()->GetTask( "ItemTask" );
if(!pItemTask)
return ERROR_GENERIC_INVALIDREQUEST;
//<2F>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ҵ<DEBE><D2B4><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> Ȯ<><C8AE>
if(pProp->IsClickPropAndCheckUser(m_hActor))
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ұų<D2B0>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>°Ÿ<C2B0> <20><><EFBFBD>̰ų<CCB0> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD> <20><><EFBFBD><EFBFBD>...
g_Log.Log(LogType::_ERROR, this, L"[StageClearBonusReward] Retry BonusReward(MapID:[%d] PropID[%d] NeedItemID[%d]\n", nMapID, pPacket->nPropID, pPacket->nItemID);
return ERROR_GENERIC_INVALIDREQUEST;
}
//<2F><><EFBFBD><EFBFBD> üũ
DNVector(CDnItem::DropItemStruct) VecDropItemList;
CDnDropItem::CalcDropItemList(GetGameRoom(), m_pGameRoom->GetGameTask()->GetStageDifficulty(), nDropItemGroup, VecDropItemList);
if(VecDropItemList.empty())
{
//<2F><><EFBFBD><EFBFBD> <20>׷<EFBFBD>ID<49><44> <20>ִµ<D6B4>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD>.. <20>α׳<CEB1><D7B3><EFBFBD><EFBFBD><EFBFBD>
g_Log.Log(LogType::_ERROR, this, L"[StageClearBonusReward] DropItemGroup Is Empty(MapID:[%d] NeedItemID[%d] DropGroupID[%d])\n", nMapID, pPacket->nItemID, nDropItemGroup);
return ERROR_GENERIC_INVALIDREQUEST;
}
//Ű <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(IsCashItem)
{
if(!m_pItem->DeleteCashInventoryByItemID(pPacket->nItemID, 1, DBDNWorldDef::UseItem::Use))
{
g_Log.Log(LogType::_ERROR, this, L"[StageClearBonusReward] Delete Item Failed(Cash)(MapID:[%d] NeedItemID[%d] DropGroupID[%d]) \n", nMapID, pPacket->nItemID, nDropItemGroup);
return ERROR_GENERIC_INVALIDREQUEST;
}
}
else
{
if(!m_pItem->DeleteInventoryByItemID(pPacket->nItemID, 1, DBDNWorldDef::UseItem::Use))
{
g_Log.Log(LogType::_ERROR, this, L"[StageClearBonusReward] Delete Item Failed(Normal)(MapID:[%d] NeedItemID[%d] DropGroupID[%d]) \n", nMapID, pPacket->nItemID, nDropItemGroup);
return ERROR_GENERIC_INVALIDREQUEST;
}
}
for( DWORD j=0; j<VecDropItemList.size(); j++ ) {
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
pItemTask->RequestDropItem( VecDropItemList[j].dwUniqueID, *(GetActorHandle()->GetPosition()), VecDropItemList[j].nItemID, VecDropItemList[j].nSeed, VecDropItemList[j].nCount, (short)( _rand(GetGameRoom())%360 ), m_nSessionID, VecDropItemList[j].nEnchantID);
#else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
pItemTask->RequestDropItem( VecDropItemList[j].dwUniqueID, *(GetActorHandle()->GetPosition()), VecDropItemList[j].nItemID, VecDropItemList[j].nSeed, VecDropItemList[j].nCount, (short)( _rand(GetGameRoom())%360 ), m_nSessionID);
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
}
GetEventSystem()->OnEvent( EventSystem::OnItemUse, 1, EventSystem::ItemID, pPacket->nItemID);
//<2F><><EFBFBD><EFBFBD> Disabled
pProp->CmdEnableOperator(m_hActor, false);
return ERROR_NONE;
}
void CDNUserSession::SendStageClearBonusRewardResult(int nResult)
{
SCStageClearBonusRewardSelect TxPacket;
memset(&TxPacket, 0, sizeof(SCStageClearBonusRewardSelect));
TxPacket.nResult = nResult;
AddSendData(SC_CHAR, eChar::SC_STAGECLEAR_BONUSREWARD_SELECT, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket));
}
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
#if defined( PRE_ALTEIAWORLD_EXPLORE )
int CDNUserSession::AlteiaWorldDice()
{
if( GetGameRoom() )
{
if( GetGameRoom()->bIsAlteiaWorld() )
{
if( !m_bCanDice )
{
SendAlteiaWorldDiceResult( ERROR_GENERIC_INVALIDREQUEST );
return ERROR_GENERIC_INVALIDREQUEST;
}
int nDiceNumber = (_rand(GetGameRoom()) % MAXALTEIADICENUMBER)+1;
m_nAlteiaWorldPosition += nDiceNumber;
if( m_nAlteiaWorldPosition >= g_pDataManager->GetAlteiaWorldMapMaxCount() )
{
nDiceNumber = g_pDataManager->GetAlteiaWorldMapMaxCount() - (m_nAlteiaWorldPosition - nDiceNumber);
m_nAlteiaWorldPosition = g_pDataManager->GetAlteiaWorldMapMaxCount();
}
TAlteiaWorldMapInfo* pAlteiaWorldMapInfo = g_pDataManager->GetAlteiaWorldMapInfo(m_nAlteiaWorldPosition);
if(pAlteiaWorldMapInfo)
{
m_dwAlteiaWorldMoveNextMapTick = timeGetTime();
SendAlteiaWorldDiceResult( ERROR_NONE, nDiceNumber);
m_bCanDice = false;
return ERROR_NONE;
}
else
{
g_Log.Log(LogType::_NORMAL, m_pSession, L"AlateiaWorldMapInfo Index:d Error!!\r\n",m_nAlteiaWorldPosition);
SendAlteiaWorldDiceResult( ERROR_GENERIC_INVALIDREQUEST );
return ERROR_GENERIC_INVALIDREQUEST;
}
}
}
return ERROR_GENERIC_INVALIDREQUEST;
}
void CDNUserSession::MoveAlteiaNextMap()
{
if( m_bCanDice )
{
SendAlteiaWorldDiceResult( ERROR_GENERIC_INVALIDREQUEST );
return;
}
TAlteiaWorldMapInfo* pAlteiaWorldMapInfo = g_pDataManager->GetAlteiaWorldMapInfo(m_nAlteiaWorldPosition);
if(pAlteiaWorldMapInfo)
{
GetGameRoom()->SetAlteiaWorldMap(true);
GetGameRoom()->ReserveInitStateAndSync( pAlteiaWorldMapInfo->nMapID, 1, CRandom::Seed(GetGameRoom()), pAlteiaWorldMapInfo->Difficulty, true );
m_dwAlteiaWorldMoveNextMapTick = 0;
m_bCanDice = true;
}
}
void CDNUserSession::AddAlteiaWorldResult( bool bClearFlag )
{
if( bClearFlag )
{
int nGoldKeyCount = 0;
int nGoldKeyItemID = 0;
m_cDailyPlayCount++;
std::vector<TItem *> pVecResultList;
int nGoldkeyItemID = (int)CGlobalWeightIntTable::GetInstance().GetValue(CGlobalWeightIntTable::AlteiaWorldGoldKeyItemID);
m_pItem->GetInventoryItemListFromItemID(nGoldkeyItemID , pVecResultList );
for( std::vector<TItem *>::iterator itor = pVecResultList.begin(); itor != pVecResultList.end();itor++)
{
nGoldKeyCount += (*itor)->wCount;
}
DWORD dwPlayTick = GetGameRoom()->GetAlteiaPlayTime();
if( dwPlayTick > 0 )
dwPlayTick = dwPlayTick/1000;
GetDBConnection()->QueryAddAlteiaWorldPlayResult( this, nGoldKeyCount, dwPlayTick, GetGuildUID().nDBID );
if( m_cDailyPlayCount >= (BYTE)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldDailyPlayCount ) )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int nBuffItemID = (int)CGlobalWeightIntTable::GetInstance().GetValue(CGlobalWeightIntTable::AlteiaWorldBuffItemID);
TItemData *pItemData = g_pDataManager->GetItemData(nBuffItemID);
if( pItemData )
{
CSUseItem pPacket;
memset(&pPacket, 0, sizeof(pPacket));
GetItem()->ApplyPartyEffectSkillItemData(&pPacket, pItemData, GetSessionID(), EffectSkillNameSpace::ShowEffectType::NONEEFFECT, true, false);
}
}
}
}
#endif
void CDNUserSession::OnRecvSpecializeMessage(int iSubCmd, char * pData, int iLen)
{
if (sizeof(CSSpecialize) != iLen)
return;
CSSpecialize* pPacket = (CSSpecialize*)pData;
//rlkt_jobchange
if (pPacket->nSelectedClass < 0 || pPacket->nSelectedClass > 100)
return;
DNTableFileFormat* pJobTable = GetDNTable(CDnTableDB::TJOB);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ谪<DCB0><E8B0AA> <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int iNowJob = m_pSession->GetUserJob();
int iNowJobDeep = 0;
int iNowRootJob = 0;
for (int i = 0; i < pJobTable->GetItemCount(); ++i)
{
int iItemID = pJobTable->GetItemID(i);
if (iItemID == iNowJob)
{
iNowJobDeep = pJobTable->GetFieldFromLablePtr(iItemID, "_JobNumber")->GetInteger();
iNowRootJob = pJobTable->GetFieldFromLablePtr(iItemID, "_BaseClass")->GetInteger();
break;
}
}
int iJobIDToChange = pPacket->nSelectedClass;
// <20>ٲٱ<D9B2> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ谡 <20><><EFBFBD>ų<EFBFBD> ū<><C5AB> Ȯ<><C8AE>.
bool bSuccess = false;
map<int, int> mapRootJob;
for (int i = 0; i < pJobTable->GetItemCount(); ++i)
{
int iItemID = pJobTable->GetItemID(i);
if (iItemID == iJobIDToChange)
{
int iJobRootToChange = pJobTable->GetFieldFromLablePtr(iItemID, "_BaseClass")->GetInteger();
if (iNowRootJob == iJobRootToChange)
{
int iJobDeepToChange = pJobTable->GetFieldFromLablePtr(iItemID, "_JobNumber")->GetInteger();
if (iNowJobDeep < iJobDeepToChange)
{
// <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>¾ƾ<C2BE> <20><>.
int iParentJobID = pJobTable->GetFieldFromLablePtr(iItemID, "_ParentJob")->GetInteger();
if (iParentJobID == iNowJob)
{
m_pSession->SetUserJob(iJobIDToChange);
// <20>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.(#19141)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ġƮŰ<C6AE><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>ų <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
#ifdef _VILLAGESERVER
for (int nSkillPage = DualSkill::Type::Primary; nSkillPage < DualSkill::Type::MAX; nSkillPage++)
m_pSession->GetSkill()->ResetSkill(nSkillPage);
#endif // #ifdef _VILLAGESERVER
bSuccess = true;
}
else
{
// <20>ٲٰ<D9B2><D9B0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>.
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.!!\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
return;
}
}
else
{
// <20>ٲٰ<D9B2><D9B0><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD>. <20><><EFBFBD>ٲ<EFBFBD>.
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!!\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
return;
}
}
else
{
// <20>ٲٰ<D9B2><D9B0><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD>ٲ<EFBFBD>.
wstring wszString = FormatW(L"<EFBFBD>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!!\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
return;
}
}
}
if (false == bSuccess)
{
wstring wszString = FormatW(L"<EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> Job ID <20>Դϴ<D4B4>..\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
return;
}
}