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

4904 lines
No EOL
152 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
}