4904 lines
No EOL
152 KiB
C++
4904 lines
No EOL
152 KiB
C++
#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;
|
||
}
|
||
} |