DragonNest/Server/DNVillageServer/DNUserSession.cpp

13794 lines
435 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DNUserSession.h"
#include "DNUserSessionManager.h"
#include "DNFriend.h"
#include "DNParty.h"
#include "DNPartyManager.h"
#include "DNMasterConnection.h"
#include "DNGameDataManager.h"
#include "DNFieldDataManager.h"
#include "DNField.h"
#include "DNFieldManager.h"
#include "DNNpcObject.h"
#include "DNPropNpcObject.h"
#include "DNNpcObjectManager.h"
#include "DNDBConnection.h"
#include "DNDBConnectionManager.h"
#include "DNLogConnection.h"
#include "DNIocpManager.h"
#include "DNWorldUserState.h"
#include "DNFriend.h"
#include "DNIsolate.h"
#include "DNGuildSystem.h"
#include "DNGuildVillage.h"
#include "Util.h"
#include "Log.h"
#include "DNLogConnection.h"
#include "DNGameDataManager.h"
#include "DNSecure.h"
#include "SpinBuffer.h"
#include "DNPvPRoomManager.h"
#include "DNPvPRoom.h"
#include "DNMissionSystem.h"
#include "DNAppellation.h"
#include "DNMissionScheduler.h"
#include "NoticeSystem.h"
#include "DNAuthManager.h"
#include "DNGesture.h"
#include "EtUIXML.h"
#include "DNRestraint.h"
#include "VarArg.h"
#include "DNDungeonManager.h"
#include "DNCashConnection.h"
#include "CloseSystem.h"
#include "DNCountryUnicodeSet.h"
#if defined( PRE_ADD_VIP_FARM )
#include "DNCashRepository.h"
#endif // #if defined( PRE_ADD_VIP_FARM )
#include "DNChatRoom.h"
#include "DNChatRoomManager.h"
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
#include "ReputationSystemRepository.h"
#include "ReputationSystemEventHandler.h"
#include "NpcReputationProcessor.h"
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
#include "MasterSystemCacheRepository.h"
#if defined( PRE_ADD_SECONDARY_SKILL )
#include "SecondarySkillRepository.h"
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
#include "DNFarm.h"
#include "DNLadderSystemManager.h"
#include "DNLadderRoom.h"
#include "DNLadderRoomRepository.h"
#include "DNTimeEventSystem.h"
#include "DNGuildWarManager.h"
#include "DNMailSender.h"
#include "TradeCacheRepository.h"
#include "DNGuildRecruitCacheRepository.h"
#if defined (PRE_ADD_BESTFRIEND)
#include "DNBestFriend.h"
#endif
#include "ExceptionReport.h"
#ifdef _USE_VOICECHAT
#include "DNVoiceChat.h"
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
#include "DNPrivateChatChannel.h"
#include "DnPrivateChatManager.h"
#endif
#if defined( PRE_ADD_NEWCOMEBACK )
#include "DNCashRepository.h"
#endif
#include "DNCommonVariable.h"
#if defined( PRE_ADD_STAMPSYSTEM )
#include "DNStampSystem.h"
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
#if defined(PRE_ADD_DWC)
#include "DNDWCSystem.h"
#include "DNDWCTeam.h"
#endif
extern TVillageConfig g_Config;
CDNUserSession::CDNUserSession()
{
Init(1024 * 100, 1024 * 300, 1024 * 6);
m_bPartyInto = false;
m_eUserState = STATE_NONE;
m_GameTaskType = GameTaskType::Max;
m_cReqGameIDType = REQINFO_TYPE_SINGLE;
m_nGameServerIP = 0;
m_nGameServerPort = m_nGameServerTcpPort = m_wGameID = 0;
m_pSkill = new CDNUserSkill(this);
m_bChangeSameServer = false;
m_bFirst = true;
m_bChannelMove = false;
memset(&m_MoveToVillageInfo, 0, sizeof(TConnectionInfo));
m_boPartyLeader = false;//m_boPartyInfo = false;
m_nPartyMemberIndex = m_cGateNo = m_cGateSelect = -1;
m_PartyID = 0;
m_nSingleRandomSeed = 0;
m_nSingleRandomSeed = timeGetTime();//_rand();
// PvP
m_dwPvPRoomListRefreshTime = 0;
m_cPvPVillageID = 0;
m_unPvPVillageChannelID = 0;
m_uiPvPIndex = 0;
m_usPvPTeam = PvPCommon::Team::Max;
m_uiPvPUserState = PvPCommon::UserState::None;
m_bIsChannelCounted = false;
m_dwNpcTalkLastIndexHashCode = 0;
m_dwNpcTalkLastTargetHashCode = 0;
m_dwLastEscapeTime = 0;
#ifdef _USE_VOICECHAT
m_nVoiceRotate = 0;
#endif
m_nChatRoomID = 0;
// m_nCosMixInvenTypeCache = 0;
m_biCosMixSerialCache = 0;
m_biCosDesignMixSerialCache = 0;
#if !defined( _FINAL_BUILD )
m_bIsMasterSystemSkipDate = false;
#endif // #if defined( _FINAL_BUILD )
m_nLastUseItemSkillID = 0;
m_bIsMove = false;
m_bIsStartGame = false;
m_nInvalidSendCount = 0;
m_bIsLadderUser = false;
m_nAbuseLogSendCount = 0;
GuildWarReset();
m_dwResellItemTick = 0;
m_bIsCheckLastDungeonInfo = false;
#if defined( PRE_PARTY_DB )
memset( &m_PrevPartyListInfo, 0, sizeof(m_PrevPartyListInfo) );
m_dwPrevPartyListInfoTick = 0;
#endif // #if defined( PRE_PARTY_DB )
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
m_ePvPChannel = PvPCommon::RoomType::max;
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
#if defined(PRE_ADD_PCBANG_RENTAL_ITEM)
m_bDeletePCRentalItem = false;
#endif //
#ifdef PRE_FIX_VILLAGEZOMBIE
m_dwCalledSendInsideDisconnectTick = 0;
m_bZombieChecked = false;
#endif //#ifdef PRE_FIX_VILLAGEZOMBIE
#if defined( PRE_ADD_NEWCOMEBACK )
m_nComebackAppellation = false;
#endif
#if defined(PRE_ADD_TRANSFORM_POTION)
m_nTransformID = 0;
m_dwTransformTick = 0;
#endif
#if defined (PRE_ADD_COSRANDMIX) && defined (PRE_ADD_COSRANDMIX_ACCESSORY)
m_CosRandMixOpenType = CostumeMix::RandomMix::OpenFail;
#endif
#if defined (PRE_ADD_COSRANDMIX) && defined (PRE_ADD_COSRANDMIX_MIXERTYPE)
m_nCosRandMixerEnablePartsType = CostumeMix::RandomMix::MixerCanMixPartsAll;
#endif
#if defined( PRE_ALTEIAWORLD_EXPLORE )
m_cTicketCount = 0;
m_cSendTicketCount = 0;
m_cAlteiaBestGoldKeyCount = 0;
m_uiAlteiaBestPlayTime = 0;
m_cWeeklyPlayCount = 0;
m_cDailyPlayCount = 0;
m_AlteiaSendTicketList.clear();
#endif
#if defined(PRE_ADD_DWC)
m_nDWCTeamID = 0;
#endif
#if defined( PRE_ADD_CHARACTERCHECKSUM )
m_uiDBCheckSum = 0;
m_uiRestoreCheckSum = 0;
#endif // #if defined( PRE_ADD_CHARACTERCHECKSUM )
}
CDNUserSession::~CDNUserSession(void)
{
// Ȯ<>λ<EFBFBD><CEBB><EFBFBD>
if( g_pFieldManager )
g_pFieldManager->FinalUser( this );
if (m_bIsChannelCounted)
{
if (GetChannelID() <= 0) _DANGER_POINT();
g_pUserSessionManager->DecreaseChannelUserCount(GetChannelID());
m_bIsChannelCounted = false;
}
SAFE_DELETE(m_pSkill);
}
void CDNUserSession::InitAccount(MAVICheckUser* pCheckUser)
{
#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", pCheckUser->nSessionID, 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", pCheckUser->nSessionID, g_Config.hHSServer, m_hHSClient);
#endif
if (m_hHSClient == ANTICPX_INVALID_HANDLE_VALUE){
DetachConnection(L"Connect|_AhnHS_CreateClientObject Failed\r\n");
return;
}
m_dwCheckLiveTick = timeGetTime();
m_dwHShieldResponseTick = timeGetTime();
#endif // _HSHIELD
m_nWorldSetID = g_Config.nWorldSetID;
SetAccountName(pCheckUser->wszAccountName);
m_biCharacterDBID = pCheckUser->biCharacterDBID;
SetChannelID(pCheckUser->nChannelID);
m_bAdult = pCheckUser->bAdult;
SetPCBangGrade(pCheckUser->cPCBangGrade);
#if defined(PRE_ADD_MULTILANGUAGE)
m_eSelectedLanguage = static_cast<MultiLanguage::SupportLanguage::eSupportLanguage>(pCheckUser->cSelectedLanguage);
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
#ifdef PRE_ADD_COMEBACK
m_bComebackUser = pCheckUser->bComebackUser;
#endif //#ifdef PRE_ADD_COMEBACK
#if defined( PRE_ADD_GAMEQUIT_REWARD )
m_bReConnectUserReward = pCheckUser->bReConnectNewbieReward;
#endif // #if defined( PRE_ADD_GAMEQUIT_REWARD )
#if defined(_ID)
_strcpy(m_szMacAddress, _countof(m_szMacAddress), pCheckUser->szMacAddress, (int)strlen(pCheckUser->szMacAddress));
_strcpy(m_szKey, _countof(m_szKey), pCheckUser->szKey, (int)strlen(pCheckUser->szKey));
#endif
#if defined( PRE_FIX_67546 )
m_pDBCon = g_pDBConnectionManager->GetVillageDBConnection(m_nChannelID, m_cDBThreadID);
#else
m_pDBCon = g_pDBConnectionManager->GetDBConnection(m_nChannelID, m_cDBThreadID);
#endif
if (m_pDBCon == NULL)
{
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [InitAccount] m_pDBCon Fail!!\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
return;
}
//<2F><> <20><><EFBFBD><EFBFBD> Ư<><C6AF>ä<EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~ 10977 revision
BYTE cThreadID = 0;
CDNDBConnection *pDBCon = g_pDBConnectionManager->GetDBConnection(cThreadID);
if (pDBCon == NULL)
{
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [InitAccount] pDBCon Fail!!\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
return;
}
//<2F><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD>̽<EFBFBD><CCBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Active<76>÷<EFBFBD><C3B7>װ<EFBFBD> <20><><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20>ȵǾ<C8B5><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۶<EFBFBD><DBB6><EFBFBD><EFBFBD>ԵǼ<D4B5> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20>α׹ڱ<D7B9> <20>߰<EFBFBD>
if (pDBCon->GetActive() == false || pDBCon->GetDelete() == true)
{
g_Log.Log(LogType::_DBCONNECTIONLOG, this, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [InitAccount] pDBCon Active Flag Fail!!\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
DetachConnection(L"InitAccount pDBCon Flag");
return;
}
pDBCon->QueryGetMasterSystemSimpleInfo( cThreadID, this, false, MasterSystem::EventType::Init );
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
pDBCon->QueryGetListNpcReputation( cThreadID, this );
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
#if defined( PRE_ADD_SECONDARY_SKILL )
pDBCon->QueryGetListSecondarySkill( cThreadID, this );
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
pDBCon->QueryGetListPvPLadderScore( cThreadID, this );
pDBCon->QueryGetPVPGhoulScores( cThreadID, this );
pDBCon->QueryGetListEtcPoint( cThreadID, this );
pDBCon->QueryGetAbuseMonitor( cThreadID, this );
pDBCon->QueryGetListVariableReset( cThreadID, this );
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
pDBCon->QueryGetTotalSkillLevel(cThreadID, this);
#endif
//Query Character Data
#if defined( PRE_PARTY_DB )
pDBCon->QuerySelectCharacter(cThreadID, this);
#else
pDBCon->QuerySelectCharacter(cThreadID, this, pCheckUser->PartyID);
#endif
#if defined (PRE_ADD_BESTFRIEND)
pDBCon->QueryGetBestFriend(cThreadID, this, false);
#endif
//Query Friend Data
pDBCon->QueryFriendList(cThreadID, this);
//Query Isolate Data
pDBCon->QueryGetIsolateList(cThreadID, this);
//Query GameOption
pDBCon->QueryGetGameOption(cThreadID, this);
//Query Profile
pDBCon->QueryGetProfile(cThreadID, this);
#if defined(_VILLAGESERVER)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
if( g_pGuildWarManager && g_pGuildWarManager->GetStepIndex() == GUILDWAR_STEP_REWARD )
{
//Query Reward
pDBCon->QueryGetGuildWarRewarForCharacter(cThreadID, this);
pDBCon->QueryGetListGuildWarItemTradeRecord(cThreadID, this);
}
#endif
#if defined( PRE_ADD_LIMITED_SHOP )
pDBCon->QueryGetLimitedShopItem(cThreadID, this);
#endif
#if defined( PRE_ALTEIAWORLD_EXPLORE )
pDBCon->QueryGetAlteiaWorldInfo(cThreadID, this);
pDBCon->QueryGetAlteiaWorldSendTicketList(cThreadID, this);
#endif
#if defined( PRE_ADD_STAMPSYSTEM )
pDBCon->QueryGetListCompleteChallenges(cThreadID, this);
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
//g_Log.Log(LogType::_NORMAL, this, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [InitAccount]\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
}
bool CDNUserSession::EnterWorld()
{
// g_Log.Log(L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] CDNUserSession::EnterWorld\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
return CDNBaseObject::EnterWorld();
}
bool CDNUserSession::LeaveWorld()
{
// <20>ŷ<EFBFBD> <20><><EFBFBD≯<EFBFBD> <20>ŷ<EFBFBD> <20>ߴ<EFBFBD>
if (m_nExchangeTargetSessionID > 0){
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSession(m_nExchangeTargetSessionID);
if (pUserObj){
pUserObj->SendExchangeCancel();
pUserObj->ClearExchangeInfo();
}
SendExchangeCancel();
ClearExchangeInfo();
}
if (m_nExchangeSenderSID > 0){
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSession(m_nExchangeSenderSID);
if (pUserObj){
pUserObj->SendExchangeReject(GetSessionID());
pUserObj->ClearExchangeInfo();
}
}
if (m_nExchangeReceiverSID > 0){
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSession(m_nExchangeReceiverSID);
if (pUserObj){
pUserObj->SendExchangeRequest(GetSessionID(), ERROR_EXCHANGE_SENDERCANCEL); // <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ưâ <20><><EFBFBD>ֱ<EFBFBD>
pUserObj->ClearExchangeInfo();
}
}
// ä<>ù濡<C3B9><E6BFA1> ä<><C3A4><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>, <20><EFBFBD><E6BFA1> <20><><EFBFBD><EFBFBD>
if( m_nChatRoomID > 0 )
{
CDNChatRoom * pChatRoom = g_pChatRoomManager->GetChatRoom( m_nChatRoomID );
if( pChatRoom != NULL )
{
if( pChatRoom->IsLeader( GetAccountDBID() ) )
{
// <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 == GetAccountDBID() )
pUserSession = this;
else
pUserSession = g_pUserSessionManager->FindUserSessionByAccountDBID( 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->GetAccountDBID(), 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 != GetAccountDBID() ) // <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 );
pUserSession->BroadcastingChatRoom( eChatRoom::SC_LEAVEUSER, -CHATROOMLEAVE_DESTROYROOM ); // <20><><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
}
}
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>)
BroadcastingChatRoom( eChatRoom::SC_LEAVEUSER, -CHATROOMLEAVE_LEAVE ); // <20><><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pChatRoom->LeaveUser( GetAccountDBID(), CHATROOMLEAVE_LEAVE );
}
// <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( pChatRoom->GetUserCount() <= 0 )
{
g_pChatRoomManager->DestroyChatRoom( pChatRoom->GetChatRoomID() );
}
}
}
return CDNBaseObject::LeaveWorld();
}
bool CDNUserSession::InitObject(WCHAR *pName, UINT nUID, int nChannelID, int nMapIndex, TPosition *pCurPos)
{
return CDNBaseObject::InitObject(pName, nUID, nChannelID, nMapIndex, pCurPos);
}
bool CDNUserSession::FinalObject()
{
#ifdef PRE_FIX_VILLAGEZOMBIE
if (m_bZombieChecked)
{
//<2F><><EFBFBD><EFBFBD>üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߴ<EFBFBD><DFB4><EFBFBD> <20><><EFBFBD><EFBFBD> <20>𸥴<EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20>ǵ帮<C7B5><E5B8AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
return CDNBaseObject::FinalObject();
}
#endif //#ifdef PRE_FIX_VILLAGEZOMBIE
if (GetPartyID() > 0)
{
CDNParty * pParty = g_pPartyManager->GetParty(GetPartyID());
if (pParty)
{
#if defined( PRE_PARTY_DB )
g_pPartyManager->QueryOutParty( GetPartyID(), GetAccountDBID(), GetCharacterDBID(), GetSessionID(), Party::QueryOutPartyType::Disconnect );
#else
g_pPartyManager->DelPartyMember( pParty, this );
#endif // #if defined( PRE_PARTY_DB )
#if defined( PRE_ADD_NEWCOMEBACK )
if( GetComebackAppellation() > 0 )
{
pParty->DelPartyMemberAppellation(GetComebackAppellation());
}
#endif // #if defined( PRE_ADD_NEWCOMEBACK )
}
}
if ((m_eUserState != STATE_MOVETOVILLAGE) && (m_eUserState != STATE_MOVETOGAME)){
if (m_bLoadUserData){
SaveUserData();
LastUpdateUserData(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
if ((m_eUserState != STATE_MOVETOVILLAGE) && (m_eUserState != STATE_MOVETOGAME) && (m_eUserState != STATE_MOVETOLOGIN)){
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>..
g_pMasterConnection->SendDelUser(m_nAccountDBID, CConnection::m_nSessionID);
}
if (m_eUserState == STATE_MOVETOLOGIN)
{
//<2F>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>
g_pMasterConnection->SendCheckReconnectLogin(m_nAccountDBID);
}
if( m_nAccountDBID > 0 )
g_pCashConnection->SendDelUser(m_nAccountDBID); // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if ((m_eUserState != STATE_MOVETOVILLAGE) && (m_eUserState != STATE_MOVETOGAME) && (m_eUserState != STATE_MOVETOLOGIN))
{
if( m_pDBCon && m_nAccountDBID > 0)
{
m_pDBCon->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_eUserState != STATE_MOVETOVILLAGE && m_eUserState != STATE_MOVETOGAME )
{
if( m_pDBCon ){
m_pDBCon->QueryLogoutCharacter( this );
#if defined(_KRAZ)
m_pDBCon->QueryActozUpdateCharacterInfo(this, ActozCommon::UpdateType::Logout);
#endif // #if defined(_KRAZ)
}
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendMasterSystemSyncConnect( false, GetCharacterName(), GetMasterSystemData() );
}
m_bCertified = false;
if (m_bNeedUpdateOption && m_pDBCon)
{
m_pDBCon->QuerySetGameOption(this, &m_GameOption);
}
if (m_bIsChannelCounted)
{
if (GetChannelID() <= 0) _DANGER_POINT();
g_pUserSessionManager->DecreaseChannelUserCount(GetChannelID());
m_bIsChannelCounted = false;
}
const TGuildUID GuildUID = this->GetGuildUID();
if (GuildUID.IsSet())
{
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (pGuild)
{
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (TRUE == pGuild->IsEnable())
{
#endif
pGuild->ResetMemberWareVersion (GetCharacterDBID());
if ((m_eUserState != STATE_MOVETOVILLAGE) && (m_eUserState != STATE_MOVETOGAME))
{
if (g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendChangeGuildMemberInfo(GuildUID, GetAccountDBID(), GetCharacterDBID(), GetAccountDBID(), GetCharacterDBID(), GUILDMEMBUPDATE_TYPE_LOGINOUT, _LOCATION_NONE, 0, 0, NULL, true);
}
#if !defined( PRE_ADD_NODELETEGUILD )
}
#endif
}
}
#if defined( PRE_PRIVATECHAT_CHANNEL )
if ((m_eUserState != STATE_MOVETOVILLAGE) && (m_eUserState != STATE_MOVETOGAME))
{
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_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendModPrivateChatChannelInfo( pPrivateChatChannel->GetChannelID(), PrivateChatChannel::Common::ChangeMaster, pPrivateChatChannel->GetChannelPassword(), pPrivateChatChannel->GetMasterCharacterDBID() );
}
}
if(g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendDelPrivateChatChannelMember( PrivateChatChannel::Common::OutMember, pPrivateChatChannel->GetChannelID(), GetCharacterDBID(), GetCharacterName() );
}
SetPrivateChannelID(0);
}
}
}
#endif
// g_Log.Log(L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [CDNUserSession::FinalObject]\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
return CDNBaseObject::FinalObject();
}
void CDNUserSession::SetCharacterName(const WCHAR* wszName)
{
CDNUserBase::SetCharacterName(wszName);
CDNBaseObject::SetCharacterName(wszName);
}
void CDNUserSession::SetSessionID(UINT nSessionID)
{
CConnection::m_nSessionID = nSessionID;
CDNUserBase::m_nSessionID = nSessionID;
}
void CDNUserSession::SetChannelID(int nChannelID)
{
m_nChannelID = nChannelID;
m_BaseData.nChannelID = nChannelID;
}
void CDNUserSession::SendInsideDisconnectPacket(wchar_t *pIdent)
{
g_Log.Log(LogType::_NORMAL, this, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] SendInsideDisconnectPacket(%s)\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID, pIdent);
// <20><><EFBFBD>η<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD>
DNEncryptPacketSeq EnPacket = { 0, };
EnPacket.Packet.iLen = static_cast<unsigned short>(sizeof(DNTPacketHeader));
EnPacket.Packet.cMainCmd = IN_DISCONNECT;
EnPacket.Packet.cSubCmd = CONNECTIONKEY_USER;
EnPacket.nLen = EnPacket.Packet.iLen + sizeof(BYTE) + sizeof(USHORT);
CDNSecure::GetInstance().Tea_encrypt( reinterpret_cast<char*>(&EnPacket.Packet), EnPacket.Packet.iLen );
SetDelete(true);
#ifdef PRE_FIX_VILLAGEZOMBIE
if (AddRecvData( EnPacket ) == COMPLETE)
g_pIocpManager->AddProcessCall(m_pSocketContext);
else
g_Log.Log(LogType::_ERROR, this, L"SendInsideDisconnectPacket AddRecvData Error! AID[%u] SID[%u]\n", GetAccountDBID(), GetSessionID());
m_dwCalledSendInsideDisconnectTick = timeGetTime();
#else //#ifdef PRE_FIX_VILLAGEZOMBIE
AddRecvData( EnPacket );
g_pIocpManager->AddProcessCall(m_pSocketContext);
#endif //#ifdef PRE_FIX_VILLAGEZOMBIE
}
bool CDNUserSession::LoadUserData(TASelectCharacter *pSelect)
{
CDNUserBase::LoadUserData(pSelect);
if( !g_pMasterConnection )
{
DetachConnection(L"Connect|MasterConnection Invalid");
g_Log.Log(LogType::_ERROR, this, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] QUERY_SELECTCHARACTER Ret:%d\r\n", pSelect->nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID, pSelect->nRetCode);
return false;
}
const sChannelInfo* pChannelInfo = g_pMasterConnection->GetChannelInfo( GetChannelID() );
if( !pChannelInfo )
{
DetachConnection(L"Connect|ChannelInfo not found");
g_Log.Log(LogType::_ERROR, this, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] QUERY_SELECTCHARACTER Ret:%d ChannelID:%d\r\n", pSelect->nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID, pSelect->nRetCode, GetChannelID() );
return false;
}
TPosition Pos;
memset(&Pos, 0, sizeof(TPosition));
// PVP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> PVP<56><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD>
#if defined(PRE_ADD_DWC)
if( pChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_PVP || pChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_DWC )
#else
if( pChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_PVP )
#endif
{
SetMapIndex(pChannelInfo->nMapIdx);
g_pFieldDataManager->GetStartPosition( pChannelInfo->nMapIdx, PvPCommon::Common::PvPVillageStartPositionGateNo, Pos );
}
// GM<47><4D><EFBFBD><EFBFBD>,<2C><>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD>
else if( pChannelInfo->nChannelAttribute&(GlobalEnum::CHANNEL_ATT_GM|GlobalEnum::CHANNEL_ATT_DARKLAIR|GlobalEnum::CHANNEL_ATT_FARMTOWN))
{
SetMapIndex(pChannelInfo->nMapIdx);
g_pFieldDataManager->GetStartPosition( pChannelInfo->nMapIdx, GlobalEnum::DEFAULT_STARTPOSITION_GATENO, Pos );
SetLastSubVillageMapIndex(pChannelInfo->nMapIdx);
}
else
{
SetLastSubVillageMapIndex(-1);
GlobalEnum::eMapTypeEnum MapType = g_pDataManager->GetMapType( GetMapIndex() );
if ((pChannelInfo->nMapIdx == GetMapIndex()) && MapType == GlobalEnum::MAP_VILLAGE )
{
Pos.nX = GetPosX();
Pos.nY = GetPosY();
Pos.nZ = GetPosZ();
}
else
{
if (GetLastVillageMapIndex() > 0)
{
#if defined( PRE_PARTY_DB )
if( GetLastVillageMapIndex() == pChannelInfo->nMapIdx )
{
if (!g_pFieldDataManager->GetStartPosition(GetLastVillageMapIndex(), GetLastVillageGateNo(), Pos))
{
g_pFieldDataManager->GetRandomStartPosition(GetLastVillageMapIndex(), Pos);
}
}
else
{
g_pFieldDataManager->GetRandomStartPosition(pChannelInfo->nMapIdx, Pos);
}
#else
if (!g_pFieldDataManager->GetStartPosition(GetLastVillageMapIndex(), GetLastVillageGateNo(), Pos)){
g_pFieldDataManager->GetRandomStartPosition(GetLastVillageMapIndex(), Pos);
}
#endif
SetMapIndex(GetLastVillageMapIndex());
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (!IsCheckFirstVillage()){
SetCheckFirstVillage(true);
m_pDBCon->QueryCheckFirstVillage(this);
g_pFieldDataManager->GetStartPositionAngle( GetMapIndex(), GetLastVillageGateNo(), m_UserData.Status.fRotate );
g_pFieldDataManager->GetStartPosition(GetLastVillageMapIndex(), GetLastVillageGateNo(), Pos);
}
m_UserData.Status.nPosX = Pos.nX;
m_UserData.Status.nPosY = Pos.nY;
m_UserData.Status.nPosZ = Pos.nZ;
InitObject(m_UserData.Status.wszCharacterName, g_IDGenerator.GetUserID(), GetChannelID(), GetMapIndex(), &Pos);
m_BaseData.fRotate = GetRotate(); // 090203 Rotate<74>߰<EFBFBD>
m_pSkill->LoadUserData();
for(int PageIndex=0 ; PageIndex < DualSkill::Type::MAX ; PageIndex++)
{
for( UINT i=0 ; i<_countof(pSelect->UserData.Skill[PageIndex].SkillList) ; ++i )
{
int iSkillIndex = pSelect->UserData.Skill[PageIndex].SkillList[i].nSkillID;
if( iSkillIndex > 0 && pSelect->UserData.Skill[PageIndex].SkillList[i].nCoolTime > 0 )
{
int iCoolTime = g_pDataManager->GetSkillDelayTime( iSkillIndex, GetSkill()->GetSkillLevel(iSkillIndex) );
if( iCoolTime > pSelect->UserData.Skill[PageIndex].SkillList[i].nCoolTime )
m_SkillCoolTime.AddCoolTime( iSkillIndex, timeGetTime()+pSelect->UserData.Skill[PageIndex].SkillList[i].nCoolTime );
}
}
}
#if defined( PRE_PARTY_DB )
TPARTYID PartyID = g_pPartyManager->GetPartyID( GetAccountDBID() );
if( PartyID > 0 && GetLastServerType() != SERVERTYPE_LOGIN )
{
SetPartyID( PartyID );
}
#else
if (pSelect->PartyID > 0) // <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.(Game -> Village<67>϶<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD>)
SetPartyData(pSelect->PartyID);
#endif
SendConnectVillage(ERROR_NONE, pChannelInfo->nChannelAttribute);
#if defined(_GPK)
SendGPKCode(); // <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD>
SendGPKAuthData();
SendGPKData();
ULONG nCurTick = timeGetTime();
m_dwCheckGPKTick = nCurTick;
m_dwRecvGPKTick = nCurTick;
#endif
if (!g_pUserSessionManager->InsertSessionByName(this)){
DetachConnection(L"Connect|InsertSessionByName(LoadUserData) Failed");
g_Log.Log(LogType::_ERROR, this, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] InsertSessionByName(LoadUserData) failed\r\n", pSelect->nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
return false;
}
if (g_pMasterConnection)
g_pMasterConnection->SendLoadUserTempData(GetAccountDBID());
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
#if defined(PRE_ADD_DWC)
if( IsDWCCharacter() )
m_ePvPChannel = PvPCommon::RoomType::dwc;
else
{
#endif //#if defined(PRE_ADD_DWC)
if (GetPvPData()->cLevel > static_cast<int>(CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::Colosseum_Limit_Rank)))
m_ePvPChannel = PvPCommon::RoomType::regular;
else if (GetPvPData()->cLevel <= static_cast<int>(CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::Colosseum_Limit_Rank)))
m_ePvPChannel = PvPCommon::RoomType::beginner;
#if defined(PRE_ADD_DWC)
}
#endif
if (g_pMasterConnection)
g_pMasterConnection->SendPvPChangeChannel(GetAccountDBID(), static_cast<BYTE>(m_ePvPChannel), GetPvPData()->cLevel, static_cast<BYTE>(CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::Colosseum_Limit_Rank)), false);
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
#if defined(PRE_ADD_DWC)
if ( IsDWCCharacter() && g_pDWCTeamManager )
{ //<2F>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB <20><><EFBFBD><EFBFBD> <20>ܾ<EFBFBD><DCBE>´<EFBFBD>.
if (m_pDBCon && m_pDBCon->GetActive())
m_pDBCon->QueryGetDWCTeamInfo(m_pSession, true);
}
#endif
return true;
}
bool CDNUserSession::SaveUserData()
{
CDNUserBase::SaveUserData();
if (GetLastVillageGateNo() < 0) SetLastVillageGateNo(0);
if (m_cGateNo > 0){ // Ȥ<><C8A4> <20><><EFBFBD><EFBFBD>Ʈ <20>տ<EFBFBD><D5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٸ<DFB4> <20><>ġ<EFBFBD><C4A1> <20>ٽ<EFBFBD> <20><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD> 090105
g_pFieldDataManager->GetStartPosition(GetMapIndex(), m_cGateNo, m_BaseData.CurPos);
}
m_UserData.Status.nPosX = m_BaseData.CurPos.nX;
m_UserData.Status.nPosY = m_BaseData.CurPos.nY;
m_UserData.Status.nPosZ = m_BaseData.CurPos.nZ;
m_UserData.Status.fRotate = m_BaseData.fRotate - 15.524f; // <20><><EFBFBD>̻<EFBFBD>!
// g_Log.Log(L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] CDNUserSession::SaveUserData\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
GetSkill()->SaveUserData( &m_UserData );
std::vector<std::pair<int,int>> vData;
m_SkillCoolTime.GetCoolTimeData( vData );
for(int PageIndex=0 ; PageIndex < DualSkill::Type::MAX ; PageIndex++)
{
for( UINT i=0 ; i<_countof(m_UserData.Skill[PageIndex].SkillList) ; ++i )
{
for( UINT j=0 ; j<vData.size() ; ++j )
{
if( m_UserData.Skill[PageIndex].SkillList[i].nSkillID == vData[j].first )
{
m_UserData.Skill[PageIndex].SkillList[i].nCoolTime = vData[j].second;
break;
}
}
}
}
return true;
}
void CDNUserSession::UpdateMoveToVillageUserData()
{
if (GetClassID() <= 0) return; // 0<>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȵȴ<C8B5>
if (IsCertified() == false) return; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
m_eUserState = STATE_MOVETOVILLAGE; // <20>ϴ<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>
m_pTimeEventSystem->SaveUserData( false );
SaveUserData(); // <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20>ϰ<EFBFBD>
m_pDBCon->QueryUpdateUserData(QUERY_CHANGESERVERUSERDATA, this, &m_UserData, true );
m_pDBCon->QuerySaveItemLocationIndex(this);
#if defined(_KRAZ)
m_pDBCon->QueryActozUpdateCharacterInfo(this, ActozCommon::UpdateType::Sync);
#endif // #if defined(_KRAZ)
}
void CDNUserSession::UpdateMoveToGameUserData()
{
if (GetClassID() <= 0) return; // 0<>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȵȴ<C8B5>
if (IsCertified() == false) return; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
m_eUserState = STATE_MOVETOGAME; // <20>ϴ<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>
m_pTimeEventSystem->SaveUserData( false );
SaveUserData(); // <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20>ϰ<EFBFBD>
m_pDBCon->QueryMapInfo(this);
m_pDBCon->QueryUpdateUserData(QUERY_CHANGESERVERUSERDATA, this, &m_UserData, false );
m_pDBCon->QuerySaveItemLocationIndex(this);
#if defined(_KRAZ)
m_pDBCon->QueryActozUpdateCharacterInfo(this, ActozCommon::UpdateType::Sync);
#endif // #if defined(_KRAZ)
}
void CDNUserSession::LastUpdateUserData()
{
if (GetClassID() <= 0) return; // 0<>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȵȴ<C8B5>
m_pTimeEventSystem->SaveUserData( true );
m_pDBCon->QueryUpdateUserData(QUERY_LASTUPDATEUSERDATA, this, &m_UserData, false );
m_pDBCon->QuerySaveItemLocationIndex(this);
}
int CDNUserSession::FieldProcess(CDNBaseObject *pSender, USHORT wMsg, TBaseData *pSenderData, TParamData *pParamData)
{
CDNBaseObject::FieldProcess(pSender, wMsg, pSenderData, pParamData);
switch(wMsg)
{
case FM_SHOW:
{
if (pSender == this){
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
std::vector<TEffectSkillData> vEffectSkill;
vEffectSkill.clear();
m_pItem->GetEffectSkillItem( vEffectSkill );
SendEffectSkillItemData(m_pSession->GetSessionID(), vEffectSkill, false);
#else // #if defined( PRE_ADD_NAMEDITEM_SYSTEM )
TSourceData source = m_pItem->GetSource();
SendSourceData(GetSessionID(), source, false);
#endif // #if defined( PRE_ADD_NAMEDITEM_SYSTEM )
}
else {
if (g_IDGenerator.IsUser(pSenderData->nObjectID)){
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendEnterUser(pUserObj);
// -------------------------------------------------------------
// <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> - CSEnterUser<65><72> <20><><EFBFBD><EFBFBD><EFBFBD><20>󵵰<EFBFBD> <20><><EFBFBD><EFBFBD> ū <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( pUserObj->m_nChatRoomID > 0 ) // ä<>ù<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
{
CDNChatRoom * pChatRoom = g_pChatRoomManager->GetChatRoom( pUserObj->m_nChatRoomID );
if( pChatRoom )
{
// <20><><EFBFBD><EFBFBD>
if( pChatRoom->IsLeader( pUserObj->GetAccountDBID() ) )
{
TChatRoomView ChatRoomView;
ChatRoomView.Set( pChatRoom->GetChatRoomID(), pChatRoom->GetChatRoomName(), pChatRoom->GetChatRoomType(), pChatRoom->UsePassword(),
pChatRoom->GetChatRoomPRLine1(), pChatRoom->GetChatRoomPRLine2(), pChatRoom->GetChatRoomPRLine3() );
SendChatRoomView( pUserObj->GetSessionID(), ChatRoomView );
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
{
SendChatRoomEnterUser( pChatRoom->GetChatRoomID(), pChatRoom->GetChatRoomType(), pUserObj->GetSessionID() );
}
}
}
}
else if (g_IDGenerator.IsNpc(pSenderData->nObjectID))
{
switch(((CDNNpcObject*)pSender)->GetNpcType() ) {
case CDnNpc::ActorNpc:
{
CDNNpcObject *pNpcObj = (CDNNpcObject*)pSender;
float x = pNpcObj->GetCurrentPos().nX / 1000.0f;
float y = pNpcObj->GetCurrentPos().nY / 1000.0f;
float z = pNpcObj->GetCurrentPos().nZ / 1000.0f;
float fRot = pNpcObj->GetRotate();
SendEnterNpc(pSenderData->nObjectID, pNpcObj->GetNpcData()->nNpcID, x, y, z, fRot);
}
break;
case CDnNpc::PropNpc:
{
CDNPropNpcObject *pNpcObj = (CDNPropNpcObject*)pSender;
SendEnterPropNpc(pSenderData->nObjectID, pNpcObj->GetPropCreateUniqueID() );
}
break;
}
}
}
}
break;
case FM_HIDE:
{
if (pSender != this){
if (g_IDGenerator.IsUser(pSenderData->nObjectID)){
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendLeaveUser(pUserObj->GetSessionID(), pSender->GetLeaveType(), pUserObj->GetAccountLevel());
// g_Log.Log(L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] SendLeave\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
}
else {
switch(((CDNNpcObject*)pSender)->GetNpcType() ) {
case CDnNpc::ActorNpc:
SendLeaveNpc((pSender)->GetObjectID());
break;
case CDnNpc::PropNpc:
SendLeavePropNpc(((CDNPropNpcObject*)pSender)->GetPropCreateUniqueID() );
break;
}
}
}
}
break;
case FM_MOVE:
if ((pSender != this) && (g_IDGenerator.IsUser(pSenderData->nObjectID))){
SendActorMsg(pParamData->dwSendSessionID, pParamData->wActorProtocol, pParamData->nBufSize, (char*)pParamData->Buffer, pParamData ); // SendSessionID
}
break;
case FM_ACTORMSG:
if (pSender != this){
SendActorMsg(pParamData->dwSendSessionID, pParamData->wActorProtocol, pParamData->nBufSize, (char*)pParamData->Buffer, pParamData ); // SendSessionID
}
break;
case FM_CHAT:
{
SendChat(pParamData->eChatType, pParamData->nChatSize, pSender->wszName(), pParamData->wszChatMsg, pParamData );
break;
}
case FM_CHANGEEQUIP:
if (pSender != this){
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendChangeEquip(pUserObj->GetSessionID(), pParamData->ItemInfo);
}
else{ // <20><><EFBFBD>ڽ<EFBFBD><DABD≯<EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (GetPartyID() > 0) {
if( pParamData->ItemInfo.cSlotIndex == EQUIP_HAIR || pParamData->ItemInfo.cSlotIndex == EQUIP_HELMET || pParamData->ItemInfo.cSlotIndex == EQUIP_EARRING ) {
g_pPartyManager->SendPartyMemberPart(GetPartyID(), this);
}
}
}
break;
case FM_CHANGECASHEQUIP:
if (pSender != this){
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendChangeCashEquip(pUserObj->GetSessionID(), pParamData->CashItemInfo);
}
else{ // <20><><EFBFBD>ڽ<EFBFBD><DABD≯<EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (GetPartyID() > 0) {
if( pParamData->CashItemInfo.cSlotIndex == CASHEQUIP_HELMET || pParamData->CashItemInfo.cSlotIndex == CASHEQUIP_EARRING ) {
g_pPartyManager->SendPartyMemberPart(GetPartyID(), this);
}
}
}
break;
case FM_CHANGEGLYPH:
if (pSender != this){
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendChangeGlyph(pUserObj->GetSessionID(), pParamData->ItemInfo);
}
break;
case FM_ADDEXP:
break;
case FM_LEVELUP:
{
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendLevelUp(pUserObj->GetSessionID(), pParamData->cLevel, pParamData->nExp);
}
break;
case FM_CHANGEAPPELLATION:
{
if (pSender != this) {
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendChangeAppellation( pUserObj->GetSessionID(), pParamData->nSelectAppellation, pParamData->nCoverAppellation );
}
}
break;
case FM_CHANGEHIDE:
{
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendHide(pUserObj->GetSessionID(), pParamData->bHide);
}
break;
case FM_CHANGEGUILDSELFVIEW: // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>/<2F><>ü) <20>ֺ<EFBFBD> <20><><EFBFBD><EFBFBD>ȭ ó<><C3B3>
{
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendGuildSelfView(pUserObj->GetSessionID(), pUserObj->GetGuildSelfView());
}
break;
case FM_CHANGEJOB:
{
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendChangeJob( pUserObj->GetSessionID(), pParamData->nJob);
}
break;
case FM_EFFECT:
{
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendBroadcastingEffect(pUserObj->GetSessionID(), pParamData->cType, pParamData->cState);
}
break;
case FM_CHANGECOLOR:
{
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendChangeColor(pUserObj->GetSessionID(), pParamData->cType, pParamData->dwColor);
}
break;
case FM_CHATROOMVIEW: // ä<>ù<EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>
{
if (pSender != this){
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
TChatRoomView ChatRoomView;
if( pParamData->nChatRoomParam <= 0 ) // Param<61><6D><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȣ
{
// ä<>ù<EFBFBD><C3B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ChatRoomView.Set( 0, L"", CHATROOMTYPE_NONE, false, L"", L"", L"" );
}
else
{
// ä<>ù<EFBFBD><C3B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CDNChatRoom * pChatRoom = g_pChatRoomManager->GetChatRoom( pParamData->nChatRoomParam );
if( pChatRoom )
{
ChatRoomView.Set( pChatRoom->GetChatRoomID(), pChatRoom->GetChatRoomName(), pChatRoom->GetChatRoomType(), pChatRoom->UsePassword(),
pChatRoom->GetChatRoomPRLine1(), pChatRoom->GetChatRoomPRLine2(), pChatRoom->GetChatRoomPRLine3() );
}
}
SendChatRoomView( pUserObj->GetSessionID(), ChatRoomView );
}
}
break;
case FM_CHATROOMUSER: // ä<>ù濡 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>
{
if (pSender != this){
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
if( pParamData->nChatRoomParam > 0 ) // ChatRoomID
{
CDNChatRoom * pChatRoom = g_pChatRoomManager->GetChatRoom( pParamData->nChatRoomParam );
if( pChatRoom )
{
SendChatRoomEnterUser( pChatRoom->GetChatRoomID(), pChatRoom->GetChatRoomType(), pUserObj->GetSessionID() );
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִ<EFBFBD>.
SendChatRoomLeaveUser( pUserObj->GetSessionID(), -pParamData->nChatRoomParam );
}
}
}
break;
case FM_CHANGEVEHICLE:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendChangeVehicleParts(pSession->GetSessionID(), pParamData->nIndex, pParamData->Vehicle);
}
break;
case FM_CHANGEVEHICLECOLOR:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendChangeVehicleColor(pSession->GetSessionID(), pParamData->Vehicle.nSerial, pParamData->dwColor, pParamData->cPetPartsType);
}
break;
case FM_CHANGEPET:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendChangePetParts(pSession->GetSessionID(), pParamData->nIndex, pParamData->Vehicle);
}
break;
case FM_CHANGEPETBODY:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendChangePetBody(pSession->GetSessionID(), pParamData->PetInfo);
}
break;
case FM_RENAME_PET:
{
if (this == pSender)
break;
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendChangePetNameResult(ERROR_NONE, pSession->GetSessionID(), 0, pParamData->PetInfo.wszNickName);
}
case FM_ENTERPARTY:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendUpdatePartyUI(pSession->GetSessionID(), true);
}
break;
case FM_LEAVEPARTY:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendUpdatePartyUI(pSession->GetSessionID(), false);
}
break;
case FM_CHARACTER_RENAME:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendCharacterRenameResult(ERROR_NONE, pSession->GetSessionID(), pSession->GetCharacterName());
}
break;
case FM_GUILDWARWINSKILL :
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
TGuildUID GuildUID(g_Config.nWorldSetID, pParamData->nExp);
EtVector3 vPos( pSession->GetCurrentPos().nX/1000.f, pSession->GetCurrentPos().nY/1000.f, pSession->GetCurrentPos().nZ/1000.f );
SendGuildWarUserWinSkill(GuildUID, vPos, pParamData->nIndex);
}
break;
case FM_USE_SOURCE:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
TSourceData source = pSession->GetItem()->GetSource();
SendSourceData(pSession->GetSessionID(), source, false);
}
break;
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
case FM_USE_EFFECTSKILL:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
TEffectSkillData* EffectSkill = pSession->GetItem()->GetEffectSkillItem( EffectSkillNameSpace::SearchType::SkillID, pParamData->nIndex ); // nIndex<65><78> <20><>ų<EFBFBD><C5B3><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
if( EffectSkill )
{
//SendEffectSkillItemData(pSession->GetSessionID(), *EffectSkill, false);
if(pParamData->cLevel > EffectSkillNameSpace::ShowEffectType::NONEEFFECT)
SendShowEffect(EffectSkill->nItemID, pSession->GetSessionID(), pParamData->cLevel);
}
}
break;
case FM_HAVE_NAMEDITEM:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendNamedItemID( pSession->GetSessionID(), pParamData->nIndex );
}
break;
#endif
#if defined( PRE_ADD_TRANSFORM_POTION )
case FM_CHANGE_TRANSFORM:
{
CDNUserSession *pSession = (CDNUserSession*)pSender;
SendChangeTransform( pSession->GetSessionID(), pSession->GetTransformID(), pParamData->nIndex );
}
break;
#endif
#if defined(PRE_ADD_TALISMAN_SYSTEM)
case FM_CHANGETALISMAN:
if (pSender != this){
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
SendChangeTalisman(pUserObj->GetSessionID(), pParamData->ItemInfo);
}
break;
#endif
#if defined(PRE_ADD_DWC)
case FM_CHANGEDWCTEAM:
{
if(!g_pDWCTeamManager->bIsIncludeDWCVillage())
break;
if (pSender != this){
CDNUserSession *pUserObj = (CDNUserSession*)pSender;
const WCHAR * pDWCTeamName = NULL;
if(pUserObj->GetDWCTeamID() > 0)
pDWCTeamName = g_pDWCTeamManager->GetDWCTeamName(pUserObj->GetDWCTeamID());
SendDWCTeamName(pUserObj->GetSessionID(), pDWCTeamName);
}
}
break;
#endif
}
return 1;
}
void CDNUserSession::DoUpdate(DWORD CurTick)
{
if (!m_bLoadUserData) return; // <20>ε<EFBFBD> <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CDNUserBase::DoUpdate(CurTick);
#if defined(PRE_ADD_TRANSFORM_POTION)
CalcTransformExpire(CurTick);
#endif //#if defined(PRE_ADD_TRANSFORM_POTION)
}
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"Connect|UserObj not found");
g_Log.Log(LogType::_ERROR, this, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] QUERY_SELECTCHARACTER Ret:%d\r\n", pSelect->nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID, pSelect->nRetCode);
return;
}
if( GetCharacterDBID() != pSelect->biCharacterDBID )
{
DetachConnection(L"QUERY_SELECTCHARACTER Invalid CharacterDBID");
g_Log.Log(LogType::_ERROR, this, L"QUERY_SELECTCHARACTER Invalid CharacterDBID=%I64d,%I64d\r\n", GetCharacterDBID(), pSelect->biCharacterDBID );
return;
}
#if defined( PRE_ADD_CHARACTERCHECKSUM )
if( pSelect->tLastLoginDate <= pSelect->tLastLogoutDate && pSelect->uiCheckSum )
{
m_uiDBCheckSum = pSelect->uiCheckSum;
m_uiRestoreCheckSum = MakeCharacterCheckSum( pSelect->biCharacterDBID, pSelect->UserData.Status.cLevel, pSelect->UserData.Status.nExp, pSelect->UserData.Status.nCoin, pSelect->UserData.Status.nWarehouseCoin );
g_Log.Log(LogType::_NORMAL, this, L"Restore Character CheckSum(cid:%I64d, level:%d, exp:%d, coin:%I64d, wcoin:%I64d, restorechecksum:%x, dbchecksum:%x, lastlogin:%I64d, lastlogout:%I64d)\r\n", pSelect->biCharacterDBID, pSelect->UserData.Status.cLevel, pSelect->UserData.Status.nExp, pSelect->UserData.Status.nCoin, pSelect->UserData.Status.nWarehouseCoin, m_uiRestoreCheckSum, m_uiDBCheckSum, pSelect->tLastLoginDate, pSelect->tLastLogoutDate );
}
#endif // #if defined( PRE_ADD_CHARACTERCHECKSUM )
if (LoadUserData(pSelect) == false){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>
return;
}
#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 )
GetItem()->RemoveInstantItemData( false );
if( !pSelect->GuildSelfView.IsSet() )
GetItem()->RemoveGuildReversionItem( false );
g_Log.Log(LogType::_NORMAL, this, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] QUERY_SELECTCHARACTER\r\n", pSelect->nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
}
break;
case QUERY_CHANGESERVERUSERDATA:
{
TAUpdateCharacter *pUpdate = (TAUpdateCharacter*)pData;
if (pUpdate->nRetCode != ERROR_NONE){
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] QUERY_CHANGESERVERUSERDATA Ret:%d\r\n", pUpdate->nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID, pUpdate->nRetCode);
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>.
g_pMasterConnection->SendSaveUserTempData(this);
if (m_eUserState == STATE_MOVETOGAME)
{
SendGameInfo( m_GameTaskType, m_cReqGameIDType, m_nGameServerIP, m_nGameServerPort, m_nGameServerTcpPort, GetAccountDBID(), GetCertifyingKey());
}
else if (m_eUserState == STATE_MOVETOVILLAGE) {
SendVillageInfo(m_MoveToVillageInfo.szIP, m_MoveToVillageInfo.nPort, ERROR_NONE, GetAccountDBID(), GetCertifyingKey());
}
DelayDetachConnection(L"QUERY_CHANGESERVERUSERDATA");
g_Log.Log(LogType::_NORMAL, this, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] QUERY_CHANGESERVERUSERDATA\r\n", pUpdate->nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
}
break;
case QUERY_LASTUPDATEUSERDATA:
{
DelayDetachConnection(L"QUERY_LASTUPDATEUSERDATA");
}
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_CHANGECHARACTERNAME:
{
const TAChangeCharacterName *pPacket = reinterpret_cast<TAChangeCharacterName*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendCharacterRenameResult(pPacket->nRetCode, GetSessionID(), NULL, pPacket->tNextChangeDate);
break;
}
if (GetCharacterDBID() != pPacket->nCharacterDBID)
{
SendCharacterRenameResult(ERROR_INVALIDPACKET, GetSessionID(), NULL);
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD>, ij<><C4B3><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>
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))
break;
GetEventSystem()->OnEvent( EventSystem::OnItemUse, 1, EventSystem::ItemID, nItemID );
// Global Object
if (g_pUserSessionManager)
g_pUserSessionManager->SwapUserKeyName(pPacket->wszOriginName, pPacket->wszCharacterName);
// Guild Member
const TGuildUID GuildUID = GetGuildUID();
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (pGuild)
pGuild->UpdateMemberName(pPacket->nCharacterDBID, pPacket->wszCharacterName);
// Master System
TMasterSystemSimpleInfo& MySimpleInfo = const_cast<TMasterSystemSimpleInfo&>(GetMasterSystemData()->SimpleInfo);
for (int i=0; i<MySimpleInfo.cCharacterDBIDCount; i++)
{
if (!g_pUserSessionManager) continue;
CDNUserSession * pUserSession = g_pUserSessionManager->FindUserSessionByName(MySimpleInfo.OppositeInfo[i].wszCharName);
if (pUserSession)
{
TMasterSystemSimpleInfo& TargetSimpleInfo = const_cast<TMasterSystemSimpleInfo&>(pUserSession->GetMasterSystemData()->SimpleInfo);
for (int j=0; j<TargetSimpleInfo.cCharacterDBIDCount; j++)
{
if (!wcscmp(TargetSimpleInfo.OppositeInfo[j].wszCharName, pPacket->wszOriginName))
{
_wcscpy(TargetSimpleInfo.OppositeInfo[j].wszCharName, _countof(TargetSimpleInfo.OppositeInfo[j].wszCharName), pPacket->wszCharacterName, (int)wcslen(pPacket->wszCharacterName));
pUserSession->SendMasterSystemSimpleInfo(TargetSimpleInfo, true);
}
}
}
}
#if defined (PRE_ADD_BESTFRIEND)
CDNUserSession* pBFSession = g_pUserSessionManager->FindUserSessionByName( m_pBestFriend->GetInfo().wszName );
if (pBFSession)
pBFSession->GetBestFriend()->ChangeName(pPacket->wszCharacterName);
g_pMasterConnection->SendChangeCharacterName(GuildUID, GetWorldSetID(), pPacket->nAccountDBID, pPacket->nCharacterDBID,
pPacket->wszOriginName, pPacket->wszCharacterName, m_pBestFriend->GetInfo().biCharacterDBID);
#else
g_pMasterConnection->SendChangeCharacterName(GuildUID, GetWorldSetID(), pPacket->nAccountDBID, pPacket->nCharacterDBID, pPacket->wszOriginName, pPacket->wszCharacterName);
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
if( GetPrivateChannelID() > 0 )
{
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( GetWorldSetID(), GetPrivateChannelID() );
if(pPrivateChatChannel)
{
pPrivateChatChannel->ModPrivateChannelMemberName( GetCharacterDBID(), GetCharacterName() );
if(g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendModPrivateChatChannelMemberName( pPrivateChatChannel->GetChannelID(), GetCharacterDBID(), GetCharacterName() );
}
}
}
#endif
SendUserLocalMessage(0, FM_CHARACTER_RENAME);
#if defined(_KRAZ)
m_pDBCon->QueryActozUpdateCharacterName(this);
#endif // #if defined(_KRAZ)
}
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)
{
switch( nSubCmd )
{
case QUERY_GETLIST_PVPLADDERRANKING:
{
TAGetListPvPLadderRanking* pPacket = reinterpret_cast<TAGetListPvPLadderRanking*>(pData);
SendPvPLadderRankBoard( pPacket );
return;
}
break;
#if defined(PRE_ADD_PVP_RANKING)
case QUERY_GET_PVP_RANKBOARD:
{
TAGetPvPRankBoard* pPacket = reinterpret_cast<TAGetPvPRankBoard*>(pData);
//pvp<76><70><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E7BCB3>
g_pDataManager->SetRelativePvPRank(&pPacket->MyRanking.cPvPLevel, pPacket->MyRanking.uiExp, pPacket->MyRanking.iPvPRank, pPacket->MyRanking.fPvPRaito);
SendPvPRankBoard( pPacket );
return;
}
break;
case QUERY_GET_PVP_RANKLIST:
{
TAGetPvPRankList* pPacket = reinterpret_cast<TAGetPvPRankList*>(pData);
//pvp<76><70><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E7BCB3>
for(int i = 0 ; i < (int)pPacket->cRankingCount ; i++)
g_pDataManager->SetRelativePvPRank(&pPacket->RankingInfo[i].cPvPLevel, pPacket->RankingInfo[i].uiExp, pPacket->RankingInfo[i].iPvPRank, pPacket->RankingInfo[i].fPvPRaito);
SendPvPRankList( pPacket );
return;
}
break;
case QUERY_GET_PVP_RANKINFO:
{
TAGetPvPRankInfo* pPacket = reinterpret_cast<TAGetPvPRankInfo*>(pData);
//pvp<76><70><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E7BCB3>
g_pDataManager->SetRelativePvPRank(&pPacket->RankingInfo.cPvPLevel, pPacket->RankingInfo.uiExp, pPacket->RankingInfo.iPvPRank, pPacket->RankingInfo.fPvPRaito);
SendPvPRankInfo( pPacket );
return;
}
break;
case QUERY_GET_PVP_LADDER_RANKBOARD:
{
TAGetPvPLadderRankBoard* pPacket = reinterpret_cast<TAGetPvPLadderRankBoard*>(pData);
//pvp<76><70><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E7BCB3>
g_pDataManager->SetRelativePvPRank(&pPacket->MyRanking.cPvPLevel, pPacket->MyRanking.uiExp, pPacket->MyRanking.iPvPRank, pPacket->MyRanking.fPvPRaito);
SendPvPLadderRankBoard( pPacket );
return;
}
break;
case QUERY_GET_PVP_LADDER_RANKLIST:
{
TAGetPvPLadderRankList* pPacket = reinterpret_cast<TAGetPvPLadderRankList*>(pData);
//pvp<76><70><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E7BCB3>
for(int i = 0 ; i < (int)pPacket->cRankingCount ; i++)
g_pDataManager->SetRelativePvPRank(&pPacket->RankingInfo[i].cPvPLevel, pPacket->RankingInfo[i].uiExp, pPacket->RankingInfo[i].iPvPRank, pPacket->RankingInfo[i].fPvPRaito);
SendPvPLadderRankList( pPacket );
return;
}
break;
case QUERY_GET_PVP_LADDER_RANKINFO:
{
TAGetPvPLadderRankInfo* pPacket = reinterpret_cast<TAGetPvPLadderRankInfo*>(pData);
//pvp<76><70><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E7BCB3>
g_pDataManager->SetRelativePvPRank(&pPacket->RankingInfo.cPvPLevel, pPacket->RankingInfo.uiExp, pPacket->RankingInfo.iPvPRank, pPacket->RankingInfo.fPvPRaito);
SendPvPLadderRankInfo( pPacket );
return;
}
break;
#endif
}
CDNUserBase::OnDBRecvPvP(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvDarkLair(int nSubCmd, char *pData)
{
switch( nSubCmd )
{
case QUERY_GET_DARKLAIR_RANK_BOARD:
{
TAGetDarkLairRankBoard* pPacket = reinterpret_cast<TAGetDarkLairRankBoard*>(pData);
SendDarkLairRankBoard( pPacket );
return;
}
}
CDNUserBase::OnDBRecvDarkLair(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvGuild(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvGuild(nSubCmd, pData);
switch(nSubCmd)
{
// <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD>
case QUERY_CREATEGUILD:
{
// <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
const TACreateGuild *pPacket = reinterpret_cast<TACreateGuild *>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendCreateGuild(GetSessionID(), pPacket->wszGuildName, pPacket->nRetCode, NULL, NULL, 0, 0, 0, 0, NULL);
break;
}
if (GUILDDBID_DEF == pPacket->nGuildDBID)
{
SendCreateGuild(GetSessionID(), pPacket->wszGuildName, ERROR_DB, NULL, NULL, 0, 0, 0, 0, NULL);
break;
}
// <20><><EFBFBD><EFBFBD> â<><C3A2><EFBFBD>ڱ<EFBFBD> <20><><EFBFBD><EFBFBD> - DB<44><42> <20><><EFBFBD>ݿ<EFBFBD><DDBF>Ǿ<EFBFBD><C7BE>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
DelCoin(pPacket->nEstablishExpense, DBDNWorldDef::CoinChangeCode::DoNotDBSave, 0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
TGuild GuildInfo;
GuildInfo.GuildView.Set(TGuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID), pPacket->wszGuildName);
GuildInfo.wGuildSize = g_pGuildManager->GetDefaultSize();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)
g_pGuildManager->SetAuthBase(GuildInfo.wGuildRoleAuth);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>/<2F>Ұ<EFBFBD>)
g_pGuildManager->SetAuthMust(GuildInfo.wGuildRoleAuth);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD>
CDNGuildBase* pGuild = g_pGuildManager->Get(&GuildInfo);
if (!pGuild)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ҵ翡<D2B4><E7BFA1>
SendCreateGuild(GetSessionID(), pPacket->wszGuildName, ERROR_GENERIC_UNKNOWNERROR, NULL, NULL, 0, 0, 0, 0, NULL);
DN_BREAK;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
// â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
pGuild->ReqGetGuildWareInfo();
#if defined(_DEBUG)
pGuild->m_bSkipDisableOnDebugging = true; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><DFB1><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#endif // _DEBUG
TGuildMember GuildMember;
GuildMember.Set(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), static_cast<char>(GetUserJob()), GetLevel(), GUILDROLE_TYPE_MASTER, pPacket->JoinDate);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>߰<EFBFBD>(<28><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5B8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (!pGuild->AddMember(&GuildMember))
{
DN_ASSERT(0, "Check!");
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
TGuildSelfView GuildSelfView;
GuildSelfView.Set(GuildInfo.GuildView, GUILDROLE_TYPE_MASTER);
SetGuildSelfView(GuildSelfView);
SendGuildSelfView(GetSessionID(), GetGuildSelfView());
// <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
TCommunityLocation Location;
sWorldUserState WorldUserState;
bool bRetVal = g_pWorldUserState->GetUserState(GetCharacterName(), GetCharacterDBID(), &WorldUserState);
if (bRetVal)
{
Location.cServerLocation = WorldUserState.nLocationState;
Location.nChannelID = WorldUserState.nChannelID;
Location.nMapIdx = WorldUserState.nMapIdx;
}
else
Location.Reset();
pGuild->SetRecvAllMember( true );
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
SendCreateGuild(GetSessionID(), pPacket->wszGuildName, ERROR_NONE, &pGuild->GetUID(), &GuildInfo, GetAccountDBID(), GetCharacterDBID(), static_cast<TP_JOB>(GetUserJob()), GetLevel(), &Location);
GetEventSystem()->OnEvent( EventSystem::OnGuildCreate );
GetEventSystem()->OnEvent( EventSystem::OnGuildJoin );
#if defined(_DEBUG)
pGuild->m_bSkipDisableOnDebugging = false; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><DFB1><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#endif // _DEBUG
}
break;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
case QUERY_DISMISSGUILD:
{
const TADismissGuild *pPacket = reinterpret_cast<TADismissGuild*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendDismissGuild(GetSessionID(), pPacket->nRetCode, NULL);
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendDismissGuild(GetSessionID(), ERROR_GUILD_NOTEXIST_GUILDINFO, NULL);
break;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>
g_pGuildManager->AddDismiss(GuildUID);
// <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ȭ
ResetGuildSelfView();
// MA <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>뺸(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹̱<CCB9><CCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?)
g_pMasterConnection->SendDismissGuild(GuildUID);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF>ݳ<EFBFBD>
#if !defined( PRE_ADD_NODELETEGUILD )
pGuild->DisableAttach();
#endif
// <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>.
SendDismissGuild(GetSessionID(), ERROR_NONE, &GuildUID);
#if defined( PRE_ADD_GUILD_RENEWSYSTEM )
GetItem()->RemoveGuildReversionItem( true );
GetItem()->RemoveGuildReversionVehicleItemData( true );
SendGuildRewardItem(NULL);
#endif
USES_CONVERSION;
}
break;
case QUERY_ADDGUILDMEMBER: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD>
{
const TAAddGuildMember *pPacket = reinterpret_cast<TAAddGuildMember*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendInviteGuildMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), pPacket->nRetCode, 0, 0, 0, 0, NULL, NULL);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendInviteGuildMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), ERROR_GUILD_NOTEXIST_GUILDINFO, 0, 0, 0, 0, NULL, NULL);
break;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
// <20><>ġ <20>ʱ<EFBFBD>ȭ
TCommunityLocation Location;
Location.Reset();
TGuildMember GuildMember;
GuildMember.Set(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), static_cast<TP_JOB>(GetUserJob()), GetLevel(), GUILDROLE_TYPE_JUNIOR, pPacket->JoinDate);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>(<28>ߺ<EFBFBD><DFBA>߻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (!pGuild->AddMember(&GuildMember, &Location))
_DANGER_POINT()
// â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
pGuild->ReqGetGuildWareInfo();
// <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SetGuildSelfView(TGuildSelfView(pGuild->GetInfo()->GuildView, GUILDROLE_TYPE_JUNIOR));
TGuildRewardItem *RewardItemInfo;
RewardItemInfo = pGuild->GetGuildRewardItem();
SendGuildRewardItem(RewardItemInfo);
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BFA1><EFBFBD>
pGuild->SendAddGuildMember(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), static_cast<TP_JOB>(GetUserJob()), GetLevel(), pPacket->JoinDate, &Location);
// MA <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>
g_pMasterConnection->SendAddGuildMember(GuildUID, GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), static_cast<TP_JOB>(GetUserJob()), GetLevel(), pPacket->JoinDate);
GetEventSystem()->OnEvent( EventSystem::OnGuildJoin );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if ( g_pGuildWarManager->GetPreWinGuildUID().IsSet() && pGuild->GetUID() == g_pGuildWarManager->GetPreWinGuildUID())
SendGuildWarPreWinGuild(true);
USES_CONVERSION;
}
break;
case QUERY_DELGUILDMEMBER: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C5BB>/<2F>߹<EFBFBD>) <20><><EFBFBD><EFBFBD>
{
const TADelGuildMember *pPacket = reinterpret_cast<TADelGuildMember*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD>
if (!pPacket->bIsExiled) {
SendLeaveGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, pPacket->nRetCode, NULL, false);
}
else {
SendExileGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, pPacket->nRetCode, NULL);
}
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
if (!pPacket->bIsExiled)
{
#ifdef PRE_ADD_BEGINNERGUILD
SendLeaveGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, ERROR_GUILD_NOTEXIST_GUILDINFO, NULL, pPacket->bIsGraduateBeginnerGuild);
#else //#ifdef PRE_ADD_BEGINNERGUILD
SendLeaveGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, ERROR_GUILD_NOTEXIST_GUILDINFO, NULL, false);
#endif //#ifdef PRE_ADD_BEGINNERGUILD
}
else
SendExileGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, ERROR_GUILD_NOTEXIST_GUILDINFO, NULL);
break;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
TGuildMember aDelGuildMember;
if (!pGuild->IsMemberExist(pPacket->nDelCharacterDBID, &aDelGuildMember))
{
if (!pPacket->bIsExiled)
{
#ifdef PRE_ADD_BEGINNERGUILD
SendLeaveGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, ERROR_GUILD_NOTEXIST_GUILDMEMBERINFO, NULL, pPacket->bIsGraduateBeginnerGuild);
#else //#ifdef PRE_ADD_BEGINNERGUILD
SendLeaveGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, ERROR_GUILD_NOTEXIST_GUILDMEMBERINFO, NULL, false);
#endif //#ifdef PRE_ADD_BEGINNERGUILD
}
else
SendExileGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, ERROR_GUILD_NOTEXIST_GUILDMEMBERINFO, NULL);
break;
}
pGuild->DelMember(pPacket->nDelCharacterDBID);
#ifdef PRE_ADD_BEGINNERGUILD
CDNUserSession * pDelSession = g_pUserSessionManager->FindUserSessionByAccountDBID(pPacket->nDelAccountDBID);
if (pDelSession && pDelSession->GetPartyID() > 0)
{
CDNParty * pParty = g_pPartyManager->GetParty(pDelSession->GetPartyID());
if (pParty)
pParty->SendAllRefreshParty(PARTYREFRESH_NONE);
}
#endif //#ifdef PRE_ADD_BEGINNERGUILD
// <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ȭ
if (!pPacket->bIsExiled)
{
// Ż<><C5BB>
ResetGuildSelfView();
#ifdef PRE_ADD_BEGINNERGUILD
SendLeaveGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, ERROR_NONE, &GuildUID, pPacket->bIsGraduateBeginnerGuild);
#else //#ifdef PRE_ADD_BEGINNERGUILD
SendLeaveGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, ERROR_NONE, &GuildUID, false);
#endif //#ifdef PRE_ADD_BEGINNERGUILD
GetItem()->RemoveGuildReversionItem( true );
GetItem()->RemoveGuildReversionVehicleItemData( true );
SendGuildRewardItem(NULL);
}
else
{
// <20>߹<EFBFBD>
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByAccountDBID(pPacket->nDelAccountDBID);
if (pUserObj && pUserObj->GetGuildUID().IsSet() && pGuild->GetUID() == pUserObj->GetGuildUID() && pUserObj->GetCharacterDBID() == pPacket->nDelCharacterDBID)
{
pUserObj->ResetGuildSelfView();
pUserObj->SendExileGuildMember(pUserObj->GetAccountDBID(), pUserObj->GetCharacterDBID(), ERROR_NONE, &GuildUID);
pUserObj->GetItem()->RemoveGuildReversionItem( true );
pUserObj->GetItem()->RemoveGuildReversionVehicleItemData( true );
pUserObj->SendGuildRewardItem(NULL);
}
}
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BFA1><EFBFBD>
pGuild->SendDelGuildMember(pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, pPacket->bIsExiled);
// MA <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>
g_pMasterConnection->SendDelGuildMember(GuildUID, pPacket->nDelAccountDBID, pPacket->nDelCharacterDBID, pPacket->bIsExiled);
// <20>߹濩<DFB9>θ<EFBFBD> <20>Ǵ<EFBFBD><C7B4>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B8AE> <20>߰<EFBFBD>
BYTE btHistoryType = GUILDHISTORY_TYPE_LEAVE;
if (pPacket->bIsExiled)
btHistoryType = GUILDHISTORY_TYPE_EXILE;
}
break;
case QUERY_CHANGEGUILDINFO: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
const TAChangeGuildInfo *pPacket = reinterpret_cast<TAChangeGuildInfo*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
const TAChangeGuildMemberInfo *pPacket = reinterpret_cast<TAChangeGuildMemberInfo*>(pData);
if (ERROR_NONE != pPacket->nRetCode) {
// <20><><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD>
SendChangeGuildMemberInfo(pPacket->nReqAccountDBID, pPacket->nReqCharacterDBID, pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, 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)
{
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
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
pGuildVillage->UpdateMemberInfo(this, pPacket);
}
break;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD>
case QUERY_INVITEGUILDMEMBER:
{
TAInviteGuildMember *pMsg = reinterpret_cast<TAInviteGuildMember*>(pData);
TAGetGuildInfo *pPacket = reinterpret_cast<TAGetGuildInfo*>(&pMsg->GuildInfo);
if (ERROR_NONE != pPacket->nRetCode || GUILDDBID_DEF == pPacket->nGuildDBID)
{
// <20>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD><D9B0><EFBFBD><EFBFBD><EFBFBD>
SendInviteGuildMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), ERROR_GUILD_NOTEXIST_GUILDINFO, 0, 0, 0, 0, NULL, NULL);
break;
}
/////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD>Ȯ<EFBFBD><C8AE>
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
bool bIsNew = false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>/<2F>Ұ<EFBFBD>)
g_pGuildManager->SetAuthMust(pPacket->Info.wGuildRoleAuth);
g_pGuildManager->SetRoleLimitation(&pPacket->Info);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD>
pGuild = g_pGuildManager->Get(&pPacket->Info);
if (!pGuild)
{
// <20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD>?(Ȯ<><C8AE><EFBFBD>ʿ<EFBFBD>)
DN_BREAK;
}
bIsNew = true;
}
else {
pGuild->Set(&pPacket->Info);
bIsNew = false;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>ش<EFBFBD><D8B4>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD>½<EFBFBD>Ų<EFBFBD><C5B2>.
pGuild->ResetCheckEmpty();
/////////////////////////////////////////////////////////////////////////////
// <20>ο<EFBFBD><CEBF>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>üũ
if (!pGuild->IsMemberAddable())
{
SendInviteGuildMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), ERROR_GUILD_CANTADD_GUILDMEMBER, 0, 0, 0, 0, NULL, NULL);
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
m_pDBCon->QueryAddGuildMember(m_cDBThreadID, GetAccountDBID(), GetCharacterDBID(), pPacket->nGuildDBID, GetLevel(), g_Config.nWorldSetID, pGuild->GetInfo()->wGuildSize);
}
break;
case QUERY_MOVE_ITEM_IN_GUILDWARE: // <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>
{
TAMoveItemInGuildWare *pPacket = reinterpret_cast<TAMoveItemInGuildWare*>(pData);
if (ERROR_NONE != pPacket->nRetCode || GUILDDBID_DEF == pPacket->nGuildDBID)
{
SendMoveGuildItem(MoveType_GuildWare, 0, 0, NULL, NULL, pPacket->nRetCode);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
break;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
{
CDNGuildWare* pGuildWare = NULL;
pGuildWare = pGuildVillage->GetGuildWare();
if (pGuildWare)
{
int nRet = pGuildWare->OnMoveItemInGuildWare(this, pPacket);
if (ERROR_NONE != nRet)
{
SendMoveGuildItem(MoveType_GuildWare, 0, 0, NULL, NULL, nRet);
break;
}
}
else
SendMoveGuildItem(MoveType_GuildWare, 0, 0, NULL, NULL, ERROR_GUILDWARE_NOT_READY);
}
}
break;
case QUERY_MOVE_INVEN_TO_GUILDWARE: // <20>κ<EFBFBD> -> <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>
{
TAMoveInvenToGuildWare *pPacket = reinterpret_cast<TAMoveInvenToGuildWare*>(pData);
if (ERROR_NONE != pPacket->nRetCode || GUILDDBID_DEF == pPacket->nGuildDBID)
{
SendMoveGuildItem(MoveType_InvenToGuildWare, 0, 0, NULL, NULL, pPacket->nRetCode);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
break;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
{
CDNGuildWare* pGuildWare = pGuildVillage->GetGuildWare();
if (pGuildWare)
{
int nRet = pGuildWare->OnMoveInvenToGuildWare(this, pPacket);
if (ERROR_NONE != nRet)
{
SendMoveGuildItem(MoveType_InvenToGuildWare, 0, 0, NULL, NULL, nRet);
break;
}
}
else
SendMoveGuildItem(MoveType_InvenToGuildWare, 0, 0, NULL, NULL, ERROR_GUILDWARE_NOT_READY);
}
}
break;
case QUERY_MOVE_GUILDWARE_TO_INVEN: // <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> -> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>
{
TAMoveGuildWareToInven *pPacket = reinterpret_cast<TAMoveGuildWareToInven*>(pData);
if (GUILDDBID_DEF == pPacket->nGuildDBID)
{
SendMoveGuildItem(MoveType_GuildWareToInven, 0, 0, NULL, NULL, ERROR_GUILD_NOTEXIST_GUILD);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
break;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
{
if (ERROR_NONE != pPacket->nRetCode)
{
SendMoveGuildItem(MoveType_GuildWareToInven, 0, 0, NULL, NULL, pPacket->nRetCode);
pGuildVillage->SendGuildWareList (this, 0);
break;
}
CDNGuildWare* pGuildWare = pGuildVillage->GetGuildWare();
if (pGuildWare)
{
int nRet = pGuildWare->OnMoveGuildWareToInven(this, pPacket);
if (ERROR_NONE != nRet)
{
SendMoveGuildItem(MoveType_GuildWareToInven, 0, 0, NULL, NULL, nRet);
break;
}
}
else
SendMoveGuildItem(MoveType_GuildWareToInven, 0, 0, NULL, NULL, ERROR_GUILDWARE_NOT_READY);
}
}
break;
case QUERY_GUILDWARE_COIN: // <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>
{
TAGuildWareHouseCoin *pPacket = reinterpret_cast<TAGuildWareHouseCoin*>(pData);
if (ERROR_NONE != pPacket->nRetCode || GUILDDBID_DEF == pPacket->nGuildDBID)
{
SendMoveGuildCoin(pPacket->cMoveType, 0, 0, 0, 0, pPacket->nRetCode);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
break;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
{
CDNGuildWare* pGuildWare = NULL;
pGuildWare = pGuildVillage->GetGuildWare();
if (pGuildWare)
{
int nRet = pGuildWare->OnModGuildCoin(this, pPacket);
if (ERROR_NONE != nRet)
{
SendMoveGuildCoin(pPacket->cMoveType, 0, 0, 0, 0, pPacket->nRetCode);
break;
}
}
else
SendMoveGuildCoin(pPacket->cMoveType, 0, 0, 0, 0, ERROR_GUILDWARE_NOT_READY);
}
}
break;
case QUERY_GETGUILDHISTORYLIST: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B8AE><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>
{
const TAGetGuildHistoryList *pPacket = reinterpret_cast<TAGetGuildHistoryList*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendGetGuildHistoryList(TGuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID), 0, 0, 0, 0, pPacket->nRetCode, NULL, 0);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendGetGuildHistoryList(GuildUID, 0, 0, 0, 0, ERROR_GENERIC_UNKNOWNERROR, NULL, 0);
break;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
SendGetGuildHistoryList(GuildUID, pPacket->biIndex, pPacket->bDirection, pPacket->nCurCount, pPacket->nTotCount, ERROR_NONE, pPacket->HistoryList, MAX(pPacket->nCount, 0));
}
break;
case QUERY_GET_GUILDWAREHISTORY: // <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD>
{
TAGetGuildWareHistory *pPacket = reinterpret_cast<TAGetGuildWareHistory*>(pData);
// <20><>Ŷ <20><><EFBFBD><EFBFBD>
if (ERROR_NONE != pPacket->nErrNo || GUILDDBID_DEF == pPacket->nGuildDBID)
{
SendGetGuildWareHistoryList(TGuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID), 0, 0, 0, pPacket->nErrNo, NULL, 0);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendGetGuildWareHistoryList(GuildUID, 0, 0, 0, ERROR_GENERIC_UNKNOWNERROR, NULL, 0);
break;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
SendGetGuildWareHistoryList(GuildUID, 0, pPacket->nCurrCount, pPacket->nTotalCount, pPacket->nErrNo, pPacket->HistoryList, pPacket->nCount);
}
break;
case QUERY_CHANGEGUILDWARESIZE: // <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
TAChangeGuildWareSize *pPacket = reinterpret_cast<TAChangeGuildWareSize*>(pData);
// <20><>Ŷ <20><><EFBFBD><EFBFBD>
if (ERROR_NONE != pPacket->nRetCode || GUILDDBID_DEF == pPacket->nGuildDBID)
break;
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
break;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
// <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD> <20>ݿ<EFBFBD>
pGuild->SetInfo()->wGuildWareSize = pPacket->wStorageSize;
// <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><20>˷<EFBFBD><CBB7>ش<EFBFBD>
if (g_pMasterConnection)
g_pMasterConnection->SendExtendGuildWareSize(GuildUID, pPacket->wStorageSize);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
pGuild->SendExtendGuildWare((short)pPacket->wStorageSize);
}
break;
case QUERY_CHANGEGUILDNAME :
{
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_pMasterConnection->SendGuildChangeName(GuildUID, pPacket->wszGuildName);
SendGuildRenameResult(ERROR_NONE);
}
}
break;
case QUERY_CHANGEGUILDMARK :
{
const TAChangeGuildMark *pPacket = reinterpret_cast<TAChangeGuildMark*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendGuildMarkResult(pPacket->nRetCode, 0, 0, 0);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
if (g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendGuildChangeMark(GuildUID, pPacket->wGuildMark, pPacket->wGuildMarkBG, pPacket->wGuildMarkBorder);
SendGuildMarkResult(pPacket->nRetCode, pPacket->wGuildMark, pPacket->wGuildMarkBG, pPacket->wGuildMarkBorder);
}
break;
case QUERY_ENROLL_GUILDWAR: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
{
const TAEnrollGuildWar * pPacket = reinterpret_cast<TAEnrollGuildWar*>(pData);
// <20><>Ŷ <20><><EFBFBD><EFBFBD>
if (ERROR_NONE != pPacket->nRetCode)
{
SendEnrollGuildWar(pPacket->nRetCode);
break;
}
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendEnrollGuildWar(ERROR_GENERIC_UNKNOWNERROR);
break;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
if (pPacket->wScheduleID <= 0 || pPacket->cTeamColorCode <= 0)
{
SendEnrollGuildWar(ERROR_GENERIC_UNKNOWNERROR);
break;
}
pGuild->UpdateWarInfoOnAllMember(pPacket->wScheduleID, pPacket->cTeamColorCode);
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
if (g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendEnrollGuildWar(GuildUID, pPacket->wScheduleID, pPacket->cTeamColorCode);
}
break;
case QUERY_ADD_GUILDREWARDITEM:
{
//<2F>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
TAAddGuildRewardItem *pGuildRewardItem = (TAAddGuildRewardItem*)pData;
if (ERROR_NONE != pGuildRewardItem->nRetCode)
{
SendBuyGuildRewardItem(pGuildRewardItem->nRetCode, pGuildRewardItem->nItemID);
break;
}
SendBuyGuildRewardItem(pGuildRewardItem->nRetCode, pGuildRewardItem->nItemID);
const TGuildUID GuildUID(pGuildRewardItem->cWorldSetID, pGuildRewardItem->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendBuyGuildRewardItem(ERROR_GENERIC_UNKNOWNERROR, pGuildRewardItem->nItemID);
break;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
TGuildRewardItem RewardItemInfo;
memset( &RewardItemInfo, 0, sizeof(RewardItemInfo) );
pGuild->AddGuildRewardItem(pGuildRewardItem->nItemID, pGuildRewardItem->m_tExpireDate, RewardItemInfo, this);
pGuild->SendAddGuildRewardItem(RewardItemInfo);
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
if (g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendAddGuildRewardItem(GuildUID, pGuildRewardItem);
}
break;
case QUERY_CHANGE_GUILDSIZE:
{
TAChangeGuildSize *pPacket = (TAChangeGuildSize*)pData;
if (ERROR_NONE != pPacket->nRetCode)
break;
const TGuildUID GuildUID(pPacket->cWorldSetID, pPacket->nGuildDBID);
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
break;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
pGuild->SetInfo()->wGuildSize = pPacket->nGuildSize;
// <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><20>˷<EFBFBD><CBB7>ش<EFBFBD>
if (g_pMasterConnection)
g_pMasterConnection->SendExtendGuildSize(GuildUID, pPacket->nGuildSize);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
pGuild->SendExtendGuildSize((short)pPacket->nGuildSize);
}
break;
#if defined(PRE_ADD_GUILD_CONTRIBUTION)
case QUERY_GET_GUILDCONTRIBUTION_POINT:
{
TAGetGuildContributionPoint* pPacket = reinterpret_cast<TAGetGuildContributionPoint*>(pData);
if (pPacket->nRetCode != ERROR_NONE)
break;
SendGuildContributionPoint(pPacket->nWeeklyGuildContributionPoint, pPacket->nTotalGuildContributionPoint);
}
break;
case QUERY_GET_GUILDCONTRIBUTION_WEEKLYRANKING:
{
TAGetGuildContributionRanking* pPacket = reinterpret_cast<TAGetGuildContributionRanking*>(pData);
if (pPacket->nRetCode != ERROR_NONE)
break;
SendGuildWeeklyContributionRankList(pPacket);
}
break;
#endif // #if defined(PRE_ADD_GUILD_CONTRIBUTION)
}
}
void CDNUserSession::OnDBRecvMail(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvMail(nSubCmd, pData);
switch(nSubCmd)
{
case QUERY_GETPAGERECEIVEMAIL:
{
const TAGetPageReceiveMail *pMail = (TAGetPageReceiveMail*)pData;
switch(pMail->nRetCode)
{
case ERROR_NONE:
m_pItem->SetDailyMailCount(pMail->iBasicMailCount);
break;
case 103165: // 103165 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MAIL, nSubCmd, pMail->nRetCode);
DetachConnection(L"QUERY_GETPAGERECEIVEMAIL");
return;
}
SendMailBox(pMail->sMail, pMail->iTotalMailCount, pMail->iNotReadMailCount, pMail->cMailCount, pMail->iBasicMailCount, pMail->nRetCode);
}
break;
case QUERY_SENDMAIL:
{
const TASendMail *pSendMail = (TASendMail*)pData;
switch(pSendMail->nRetCode)
{
case ERROR_NONE:
{
m_pItem->SetDailyMailCount(pSendMail->nBasicMailCount);
if (pSendMail->biAttachCoin > 0){
DelCoin(pSendMail->biAttachCoin, DBDNWorldDef::CoinChangeCode::DoNotDBSave, 0); // <20><> <20><><EFBFBD>ְ<EFBFBD>
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pSendMail->nTax > 0){
DelCoin(pSendMail->nTax, DBDNWorldDef::CoinChangeCode::DoNotDBSave, 0); // <20><> <20><><EFBFBD>ְ<EFBFBD>
}
if (pSendMail->Code == MailType::Premium){ // <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE≯<EFBFBD> <20><>ǥ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!m_pItem->UseCashItemByType(ITEMTYPE_PREMIUM_POST, 1, true)){
DetachConnection(L"QUERY_SENDMAIL");
return;
}
}
for (int i = 0; i < MAILATTACHITEMMAX; i++){
if (pSendMail->AttachItemArr[i].Item.nItemID <= 0) continue;
if (m_pItem->IsValidInventorySlot(pSendMail->AttachItemArr[i].cSlotIndex, pSendMail->AttachItemArr[i].Item.nSerial)){ // <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
if (!m_pItem->DeleteInventoryBySlot(pSendMail->AttachItemArr[i].cSlotIndex, pSendMail->AttachItemArr[i].Item.wCount, pSendMail->AttachItemArr[i].Item.nSerial, 0)){ // <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ְ<EFBFBD>
DetachConnection(L"QUERY_SENDMAIL");
return;
}
}
else
{
DetachConnection(L"QUERY_SENDMAIL");
return;
}
}
if (pSendMail->nReceiverAccountDBID != m_nAccountDBID){
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByAccountDBID(pSendMail->nReceiverAccountDBID); // <20>޴<EFBFBD><DEB4><EFBFBD> ã<><C3A3>
if (pUserObj && (pUserObj->GetCharacterDBID() == pSendMail->biReceiverCharacterDBID)){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><> ó<><C3B3>
pUserObj->SendNotifyMail(pSendMail->nReceiverTotalMailCount, pSendMail->nReceiverNotReadMailCount, pSendMail->nReceiver7DaysLeftMailCount, true); // <20><><EFBFBD><EFBFBD> <20>°<EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> master<65><72>
g_pMasterConnection->SendNotifyMail(pSendMail->nReceiverAccountDBID, pSendMail->biReceiverCharacterDBID, pSendMail->nReceiverTotalMailCount, pSendMail->nReceiverNotReadMailCount, pSendMail->nReceiver7DaysLeftMailCount, true);
}
}
}
break;
case 103123:
case 103162:
case 103163:
case 103164:
m_pItem->DelDailyMailCount();
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MAIL, nSubCmd, pSendMail->nRetCode);
DetachConnection(L"QUERY_SENDMAIL");
return;
}
SendMailSendResult(pSendMail->nRetCode, m_pItem->GetDailyMailCount());
}
break;
case QUERY_READMAIL:
{
const TAReadMail *pRead = (TAReadMail*)pData;
TItem Item[MAILATTACHITEMMAX] = { 0, };
int nAttachCoin = 0;
switch(pRead->nRetCode)
{
case ERROR_NONE:
{
#ifdef PRE_ADD_JOINGUILD_SUPPORT
m_pItem->SetReadMail(pRead->nMailDBID, pRead->biAttachCoin, pRead->sAttachItem, pRead->cMailType); // <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD>. ÷<>ιޱ⶧ <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>
#else //#ifdef PRE_ADD_JOINGUILD_SUPPORT
m_pItem->SetReadMail(pRead->nMailDBID, pRead->biAttachCoin, pRead->sAttachItem); // <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD>. ÷<>ιޱ⶧ <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>
#endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
nAttachCoin = (int)pRead->biAttachCoin;
}
break;
case 103166: // 103166 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
{
int iInvalidCount = 5;
g_Log.Log( LogType::_HACK, this, L"HackChecker(Mail) : CharName=%s InvalidCount=%d \n", GetCharacterName(), iInvalidCount );
GetDBConnection()->QueryAddAbuseMonitor( this, iInvalidCount, 0);
break;
}
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MAIL, nSubCmd, pRead->nRetCode);
DetachConnection(L"QUERY_READMAIL");
return;
}
SendReadMailResult(pRead, nAttachCoin);
}
break;
case QUERY_DELMAIL:
{
const TADelMail *pMail = (TADelMail*)pData;
if (pMail->nRetCode != ERROR_NONE){
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MAIL, nSubCmd, pMail->nRetCode);
DetachConnection(L"QUERY_DELMAIL");
break;
}
SendDeleteMailResult(pMail->nRetCode);
}
break;
case QUERY_GETLISTMAILATTACHMENT:
{
const TAGetListMailAttachment *pMail = (TAGetListMailAttachment*)pData;
if (pMail->nRetCode != ERROR_NONE){
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MAIL, nSubCmd, pMail->nRetCode);
DetachConnection(L"QUERY_GETLISTMAILATTACHMENT");
break;
}
if (pMail->cCount == 0){ // ÷<>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD><C2B0><EFBFBD>
SendAttachAllMailResult(NULL, ERROR_MAIL_DOESNOTEXIST_ATTACHED_THING);
break;
}
int nRet = m_pItem->VerifyAttachItemList(pMail);
if (nRet != ERROR_NONE){
int nMailDBID[MAILPAGEMAX] = { 0, };
for (int i = 0; i < MAILPAGEMAX; i++){
nMailDBID[i] = pMail->MailAttachArray[i].nMailDBID;
}
SendAttachAllMailResult(nMailDBID, nRet);
break;
}
}
break;
case QUERY_TAKEATTACHMAILLIST:
{
TATakeAttachMailList *pMail = (TATakeAttachMailList*)pData;
if (pMail->nRetCode != ERROR_NONE){
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MAIL, nSubCmd, pMail->nRetCode);
DetachConnection(L"QUERY_TAKEATTACHMAILLIST");
break;
}
#ifdef PRE_ADD_JOINGUILD_SUPPORT
bool bAddGuildWare = false;
int nMailDBID[MAILPAGEMAX] = { 0, };
for (int i = 0; i < MAILPAGEMAX; i++)
{
if (pMail->TakeMailList[i].bAddGuildWare)
bAddGuildWare = true;
nMailDBID[i] = pMail->TakeMailList[i].nMailDBID;
}
int nRet = m_pItem->TakeAttachItemList(pMail);
SendAttachAllMailResult(nMailDBID, nRet);
CDNGuildBase* pGuild = NULL;
if (bAddGuildWare)
{
if (GetGuildUID().IsSet())
{
if (pGuild == NULL)
pGuild = g_pGuildManager->At(GetGuildUID());
if (pGuild)
{
bool bGuildCheck = true;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
bGuildCheck = false;
#endif
if (bGuildCheck)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
{
CDNGuildWare* pGuildWare = pGuildVillage->GetGuildWare();
if (pGuildWare)
{
for (int i = 0; i < pMail->cPageCount; i++)
{
if (pMail->TakeMailList[i].bAddGuildWare)
{
if (pMail->TakeMailList[i].nMailDBID <= 0) continue;
if (pMail->TakeMailList[i].biAttachCoin > 0)
pGuildWare->OnAddGuildCoin(this, pMail->TakeMailList[i].biAttachCoin);
pGuildWare->OnAddInGuildWare(this, &pMail->TakeMailList[i]);
}
}
}
/*else
SendMoveGuildItem(MoveType_InvenToGuildWare, 0, 0, NULL, NULL, ERROR_GUILDWARE_NOT_READY);*/
}
}
else
_DANGER_POINT();
}
}
else
g_Log.Log(LogType::_ERROR, this, L"QUERY_TAKEATTACHMAILLIST AddGuildWare NoGuild!!! [%d]\n", GetGuildUID().nDBID);
}
#else //#ifdef PRE_ADD_JOINGUILD_SUPPORT
int nMailDBID[MAILPAGEMAX] = { 0, };
for (int i = 0; i < MAILPAGEMAX; i++)
{
nMailDBID[i] = pMail->TakeMailList[i].nMailDBID;
}
int nRet = m_pItem->TakeAttachItemList(pMail);
SendAttachAllMailResult(nMailDBID, nRet);
#endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
}
break;
case QUERY_TAKEATTACHMAIL:
{
TATakeAttachMail *pMail = (TATakeAttachMail*)pData;
if (pMail->nRetCode != ERROR_NONE){
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MAIL, nSubCmd, pMail->nRetCode);
DetachConnection(L"QUERY_TAKEATTACHMAIL");
break;
}
#ifdef PRE_ADD_JOINGUILD_SUPPORT
if (pMail->TakeMail.bAddGuildWare == false)
{
int nRet = m_pItem->TakeAttachItem(pMail);
SendAttachMailResult(nRet);
}
else
{
if (pMail->nRetCode == ERROR_NONE && GetGuildUID().IsSet())
{
CDNGuildBase* pGuild = g_pGuildManager->At(GetGuildUID());
if (pGuild)
{
bool bGuildCheck = true;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
bGuildCheck = false;
#endif
if (bGuildCheck)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
{
CDNGuildWare* pGuildWare = pGuildVillage->GetGuildWare();
if (pGuildWare)
{
if (pMail->TakeMail.biAttachCoin > 0)
pGuildWare->OnAddGuildCoin(this, pMail->TakeMail.biAttachCoin);
pGuildWare->OnAddInGuildWare(this, &pMail->TakeMail);
}
else
_DANGER_POINT();
}
else
_DANGER_POINT();
}
else
_DANGER_POINT();
}
else
_DANGER_POINT();
}
else
g_Log.Log(LogType::_ERROR, this, L"QUERY_TAKEATTACHMAILLIST AddGuildWare NoGuild!!! [%d]\n", GetGuildUID().nDBID);
SendAttachMailResult(pMail->nRetCode);
}
#else //#ifdef PRE_ADD_JOINGUILD_SUPPORT
int nRet = m_pItem->TakeAttachItem(pMail);
SendAttachMailResult(nRet);
#endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
}
break;
#ifdef PRE_ADD_BEGINNERGUILD
case QUERY_GETWILLSENDMAIL:
{
TAGetWillMails * pPacket = (TAGetWillMails*)pData;
if (pPacket->nRetCode == ERROR_NONE && GetDBConnection())
{
for (int i = 0; i < pPacket->cCount; i++)
{
GetDBConnection()->QueryDelWillSendMails(this, pPacket->Mails[i].nMailID);
CDNMailSender::Process(this, pPacket->Mails[i].nMailID, DBDNWorldDef::PayMethodCode::Comeback, 0);
g_Log.Log(LogType::_BEGINNETGUILD, this, L"AccountDBID[%d] BeginnerGuild!! MailSended! MailID[%d]\n", GetAccountDBID(), pPacket->Mails[i].nMailID);
}
}
}
break;
#endif //#ifdef PRE_ADD_BEGINNERGUILD
#if defined(PRE_ADD_CADGE_CASH)
case QUERY_SENDWISHMAIL:
{
const TASendWishMail *pMail = (TASendWishMail*)pData;
switch(pMail->nRetCode)
{
case ERROR_NONE:
{
if (pMail->nReceiverAccountDBID != m_nAccountDBID){
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByAccountDBID(pMail->nReceiverAccountDBID); // <20>޴<EFBFBD><DEB4><EFBFBD> ã<><C3A3>
if (pUserObj && (pUserObj->GetCharacterDBID() == pMail->biReceiverCharacterDBID)){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><> ó<><C3B3>
pUserObj->SendNotifyMail(pMail->nReceiverTotalMailCount, pMail->nReceiverNotReadMailCount, pMail->nReceiver7DaysLeftMailCount, true); // <20><><EFBFBD><EFBFBD> <20>°<EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> master<65><72>
g_pMasterConnection->SendNotifyMail(pMail->nReceiverAccountDBID, pMail->biReceiverCharacterDBID, pMail->nReceiverTotalMailCount, pMail->nReceiverNotReadMailCount, pMail->nReceiver7DaysLeftMailCount, true);
}
}
}
break;
case 103339: // 1<><31> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ƚ<><C8BD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD><CAB0>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.
break;
}
SendCashShopCadge(pMail->nRetCode);
}
break;
case QUERY_READWISHMAIL:
{
const TAReadWishMail *pMail = (TAReadWishMail*)pData;
switch(pMail->nRetCode)
{
case ERROR_NONE:
{
}
break;
case 103166: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
case 103340: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
break;
}
SendReadCadgeMailResult(pMail);
}
break;
#endif // #if defined(PRE_ADD_CADGE_CASH)
#if defined( PRE_MOD_71820 )
#else
#ifdef PRE_ADD_JOINGUILD_SUPPORT
case QUERY_GUILDSUPPORT_REWARDINFO:
{
TAGuildSupportRewardInfo * pPacket = (TAGuildSupportRewardInfo*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
m_bWasRewardedGuildMaxLevel = pPacket->bWasGuildSupportRewardFlag;
m_cGuildJoinLevel = pPacket->cJoinGuildLevel;
if (m_bWasRewardedGuildMaxLevel == false && GetLevel() >= (int)CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::PlayerLevelLimit))
{
int nMailID = g_pDataManager->GetRewardGuildSupportMailID(m_cGuildJoinLevel);
if (nMailID > 0)
{
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 (TRUE == pGuild->IsEnable())
{
TGuildMember * pGuildMaster = pGuild->GetGuildMaster();
if (pGuildMaster)
{
CDNMailSender::Process(pGuildMaster->nAccountDBID, pGuildMaster->nCharacterDBID, GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), GetWorldSetID(), nMailID);
m_bWasRewardedGuildMaxLevel = true;
}
}
#else //#if !defined( PRE_ADD_NODELETEGUILD )
TGuildMember * pGuildMaster = pGuild->GetGuildMaster();
if (pGuildMaster)
{
CDNMailSender::Process(pGuildMaster->nAccountDBID, pGuildMaster->nCharacterDBID, GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), GetWorldSetID(), nMailID);
m_bWasRewardedGuildMaxLevel = true;
}
#endif //#if !defined( PRE_ADD_NODELETEGUILD )
}
}
else
_DANGER_POINT();
}
else
g_Log.Log(LogType::_ERROR, m_pSession, L"QUERY_GUILDSUPPORT_REWARDINFO Error MailID Invalid [%d]\n", nMailID);
}
}
}
break;
case QUERY_SENDGUILDMAIL:
{
TASendGuildMail * pPacket = (TASendGuildMail*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
if (pPacket->nReceiverAccountDBID != GetAccountDBID())
{
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByAccountDBID(pPacket->nReceiverAccountDBID); // <20>޴<EFBFBD><DEB4><EFBFBD> ã<><C3A3>
if (pUserObj && (pUserObj->GetCharacterDBID() == pPacket->biReceiverCharacterDBID)){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><> ó<><C3B3>
pUserObj->SendNotifyMail(pPacket->iTotalMailCount, pPacket->iNotReadMailCount, pPacket->i7DaysLeftMailCount, true); // <20><><EFBFBD><EFBFBD> <20>°<EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> master<65><72>
g_pMasterConnection->SendNotifyMail(pPacket->nReceiverAccountDBID, pPacket->biReceiverCharacterDBID, pPacket->iTotalMailCount, pPacket->iNotReadMailCount, pPacket->i7DaysLeftMailCount, true);
}
}
}
}
break;
#endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
#endif // #if defined( PRE_MOD_71820 )
}
}
void CDNUserSession::OnDBRecvMarket(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvMarket(nSubCmd, pData);
switch(nSubCmd)
{
case QUERY_GETPAGETRADE:
{
TAGetPageTrade *pMarketList = (TAGetPageTrade*)pData;
switch(pMarketList->nRetCode)
{
case ERROR_NONE:
case 103171: // 103171 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarketList->nRetCode);
DetachConnection(L"QUERY_GETPAGETRADE");
return;
}
SendMarketList(pMarketList->MarketInfo, pMarketList->cMarketCount, pMarketList->nMarketTotalCount, pMarketList->nRetCode);
}
break;
#if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
case QUERY_GETLISTMINITRADE:
{
TAGetListMiniTrade *pMarketList = (TAGetListMiniTrade*)pData;
switch(pMarketList->nRetCode)
{
case ERROR_NONE:
case 103171: // 103171 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarketList->nRetCode);
DetachConnection(L"QUERY_GETPAGETRADE");
return;
}
SendMarketMiniList(pMarketList->MarketInfo, pMarketList->cMarketCount, pMarketList->nMarketTotalCount, pMarketList->nRetCode);
}
break;
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
case QUERY_GETLISTMYTRADE:
{
TAGetListMyTrade *pMarketList = (TAGetListMyTrade*)pData;
switch(pMarketList->nRetCode)
{
case ERROR_NONE:
m_pItem->SetRegisterMarketCount(pMarketList->wWeeklyRegisterCount, pMarketList->wRegisterItemCount);
break;
case 103172: // 103172 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarketList->nRetCode);
DetachConnection(L"QUERY_GETLISTMYTRADE");
return;
}
m_pItem->SetMyMarketList(pMarketList->MarketInfo, pMarketList->cMarketCount);
bool bPremiumTrade = ( m_pItem && m_pItem->GetCashItemCountByType( ITEMTYPE_PREMIUM_TRADE ) > 0 ) ? true : false;
SendMyMarketList(pMarketList->MarketInfo, pMarketList->cMarketCount, pMarketList->wSellingCount, pMarketList->wExpiredCount, pMarketList->wWeeklyRegisterCount, pMarketList->wRegisterItemCount, pMarketList->nRetCode, bPremiumTrade);
}
break;
case QUERY_ADDTRADE:
{
TAAddTrade *pMarket = (TAAddTrade*)pData;
switch(pMarket->nRetCode)
{
case ERROR_NONE:
{
const TItem *pItem = NULL;
switch(pMarket->cInvenType)
{
case ITEMPOSITION_INVEN:
pItem = m_pItem->GetInventory(pMarket->cInvenIndex);
break;
case ITEMPOSITION_CASHINVEN:
pItem = m_pItem->GetCashInventory(pMarket->biSerial);
break;
}
if (!pItem)
{
DetachConnection(L"QUERY_ADDTRADE");
return;
}
if (pItem->nSerial != pMarket->biSerial){
DetachConnection(L"QUERY_ADDTRADE");
return;
}
TItemData *pItemData = g_pDataManager->GetItemData(pItem->nItemID);
if (!pItemData){
DetachConnection(L"QUERY_ADDTRADE");
return;
}
INT64 nCharge = 0;
if (pItem->nItemID > 0)
{
#if defined(PRE_ADD_PETALTRADE)
if ( pMarket->cMethodCode == DBDNWorldDef::PayMethodCode::Coin) // <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
#endif
{
nCharge = g_pDataManager->CalcTax(TAX_TRADEREGISTER, GetLevel(), pMarket->nPrice);
if (nCharge <= 0) nCharge = 1; // <20>ּ<EFBFBD> 1<><31> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if ( pMarket->bPremiumTrade ) { // <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD>
nCharge = g_pDataManager->CalcTax(TAX_TRADEREGISTER_CASH, GetLevel(), pMarket->nPrice);
if (nCharge <= 0) nCharge = 0; // <20>ּ<EFBFBD> 0<><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
}
if (!CheckEnoughCoin(nCharge)){
SendMarketRegister(pMarket->nMarketDBID, ERROR_ITEM_INSUFFICIENCY_MONEY);
return;
}
DelCoin(nCharge, DBDNWorldDef::CoinChangeCode::DoNotDBSave, 0); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
switch(pMarket->cInvenType)
{
case ITEMPOSITION_INVEN:
if (m_pItem->IsValidInventorySlot(pMarket->cInvenIndex, pMarket->biSerial))
{ // <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4>
if (!m_pItem->DeleteInventoryBySlot(pMarket->cInvenIndex, pMarket->wCount, pMarket->biSerial, 0)){
DetachConnection(L"QUERY_ADDTRADE");
return;
}
}
else
{
DetachConnection(L"QUERY_ADDTRADE");
return;
}
break;
case ITEMPOSITION_CASHINVEN:
if (!m_pItem->DeleteCashInventoryBySerial(pMarket->biSerial, pMarket->wCount, false))
{
DetachConnection(L"QUERY_ADDTRADE");
return;
}
break;
}
}
m_pItem->AddRegisterItemCount();
if ( pMarket->bPremiumTrade == false ) // <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD>񽺰<EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
m_pItem->AddWeeklyRegisterCount();
}
break;
case 103151: // 103151 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.
case 103169: // 103169 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ƚ<><C8BD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD><CAB0>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.
case 103186: // 103186 <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Ƚ<><C8BD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD><CAB0>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarket->nRetCode);
DetachConnection(L"QUERY_ADDTRADE");
return;
}
SendMarketRegister(pMarket->nMarketDBID, pMarket->nRetCode);
}
break;
case QUERY_CANCELTRADE:
{
TACancelTrade *pMarket = (TACancelTrade*)pData;
switch(pMarket->nRetCode)
{
case ERROR_NONE:
{
if (pMarket->Item.nItemID > 0){
int nRet = ERROR_DB;
pMarket->Item.bEternity = true;
if (pMarket->bCashItem){
nRet = m_pItem->CreateCashInvenWholeItem(pMarket->Item);
}
else{
nRet = m_pItem->CreateInvenWholeItemByIndex(pMarket->cInvenSlotIndex, pMarket->Item);
}
if (nRet != ERROR_NONE){
SendMarketInterrupt(pMarket->nMarketDBID, m_pItem->GetRegisterItemCount(), nRet);
return;
}
}
m_pItem->DelRegisterItemCount();
// DelRegisterItemCount <20><><EFBFBD>Ŀ<EFBFBD> ó<><C3B3><EFBFBD>ؾ<EFBFBD> <20>մϴ<D5B4>.
m_pItem->DelMyMarketList(pMarket->nMarketDBID);
}
break;
case 103173: // 103173 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.
case 103174: // 103174 <20>̹<EFBFBD> <20>ȸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarket->nRetCode);
DetachConnection(L"QUERY_CANCELTRADE");
return;
}
SendMarketInterrupt(pMarket->nMarketDBID, m_pItem->GetRegisterItemCount(), pMarket->nRetCode);
}
break;
case QUERY_BUYTRADEITEM:
{
TABuyTradeItem *pMarket = (TABuyTradeItem*)pData;
switch(pMarket->nRetCode)
{
case ERROR_NONE:
{
if (pMarket->Item.nItemID > 0){ // <20>κ<EFBFBD>üũ
if ((!g_pDataManager->IsCashItem(pMarket->Item.nItemID)) && (m_pItem->FindBlankInventorySlotCount() == 0)){
#if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(pMarket->nMarketDBID, ERROR_ITEM_INVENTORY_NOTENOUGH, pMarket->bMini);
#else // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(pMarket->nMarketDBID, ERROR_ITEM_INVENTORY_NOTENOUGH, false);
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
return;
}
}
if (pMarket->cPayMethodCode == DBDNWorldDef::PayMethodCode::Coin)
{
if (!CheckEnoughCoin(pMarket->nPrice)){
#if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(pMarket->nMarketDBID, ERROR_ITEM_INSUFFICIENCY_MONEY, pMarket->bMini);
#else // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(pMarket->nMarketDBID, ERROR_ITEM_INSUFFICIENCY_MONEY, false);
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
return;
}
DelCoin(pMarket->nPrice, DBDNWorldDef::CoinChangeCode::DoNotDBSave, 0); //
}
if (pMarket->Item.nItemID > 0){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>ֱ<EFBFBD>
int nRet = ERROR_DB;
if (g_pDataManager->IsCashItem(pMarket->Item.nItemID)){
pMarket->Item.bEternity = true;
nRet = m_pItem->CreateCashInvenWholeItem(pMarket->Item);
}
else{
nRet = m_pItem->CreateInvenWholeItemByIndex(pMarket->cInvenSlotIndex, pMarket->Item);
}
if (nRet != ERROR_NONE){
#if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(pMarket->nMarketDBID, nRet, pMarket->bMini);
#else // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(pMarket->nMarketDBID, nRet, false);
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
return;
}
}
if ((pMarket->nSellerADBID > 0) && (pMarket->nSellerADBID != m_nAccountDBID)){ // <20>Ǹŵƴٰ<C6B4> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
CDNUserSession *pUser = g_pUserSessionManager->FindUserSessionByAccountDBID(pMarket->nSellerADBID);
if (pUser && (pUser->GetCharacterDBID() == pMarket->biSellerCharacterDBID)){
pUser->SendNotifyMarket(pMarket->Item.nItemID, 0);
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> master<65><72>
g_pMasterConnection->SendNotifyMarket(pMarket->nSellerADBID, pMarket->biSellerCharacterDBID, pMarket->Item.nItemID, 0);
}
}
}
break;
case 103123: // 103123 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>
case 103174: // 103174 <20>̹<EFBFBD> <20>ȸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
case 103175: // 103175 <20><><EFBFBD>ϵǾ<CFB5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
case 101136: // <20><>Ż <20>ܾ<EFBFBD> <20><><EFBFBD><EFBFBD>
case 103325: // 103325 <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
case ERROR_ITEM_INVENTORY_NOTENOUGH:
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarket->nRetCode);
DetachConnection(L"QUERY_BUYTRADEITEM");
return;
}
#if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(pMarket->nMarketDBID, pMarket->nRetCode, pMarket->bMini);
#else // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(pMarket->nMarketDBID, pMarket->nRetCode, false);
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
}
break;
case QUERY_GETLISTTRADEFORCALCULATION:
{
TAGetListTradeForCalculation *pMarketList = (TAGetListTradeForCalculation*)pData;
if (pMarketList->nRetCode != ERROR_NONE){
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarketList->nRetCode);
DetachConnection(L"QUERY_GETLISTTRADEFORCALCULATION");
break;
// _DANGER_POINT();
}
SendMarketCalculationList(pMarketList->MarketInfo, pMarketList->cMarketCount, pMarketList->nRetCode);
}
break;
case QUERY_TRADECALCULATE:
{
TATradeCalculate *pMarket = (TATradeCalculate*)pData;
switch(pMarket->nRetCode)
{
case ERROR_NONE:
{
if (pMarket->nCalculatePrice < 0)
pMarket->nCalculatePrice = 0;
#if defined(PRE_ADD_PETALTRADE)
if ( pMarket->cPayMethodCode == DBDNWorldDef::PayMethodCode::Petal)
AddPetal(pMarket->nCalculatePrice);
else
#endif
{
AddCoin(pMarket->nCalculatePrice, DBDNWorldDef::CoinChangeCode::DoNotDBSave, 0, true);
}
}
break;
case 103176: // 103176 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
break;
case 103204: // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݾ<EFBFBD><DDBE><EFBFBD> <20>ʰ<EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>(?)
pMarket->nRetCode = ERROR_ITEM_OVERFLOWMONEY;
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarket->nRetCode);
DetachConnection(L"QUERY_TRADECALCULATE");
return;
}
SendMarketCalculation(pMarket->nMarketDBID, pMarket->nRetCode);
}
break;
case QUERY_TRADECALCULATEALL:
{
TATradeCalculateAll *pMarket = (TATradeCalculateAll*)pData;
switch(pMarket->nRetCode)
{
case ERROR_NONE:
{
#if defined(PRE_ADD_PETALTRADE)
if (pMarket->nCalculatePetal < 0) pMarket->nCalculatePetal = 0;
AddPetal(pMarket->nCalculatePetal);
#endif
if (pMarket->nCalculatePrice < 0) pMarket->nCalculatePrice = 0;
AddCoin(pMarket->nCalculatePrice, DBDNWorldDef::CoinChangeCode::DoNotDBSave, 0, true);
}
break;
case 103176: // 103176 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
break;
case 103204: // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݾ<EFBFBD><DDBE><EFBFBD> <20>ʰ<EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>(?)
pMarket->nRetCode = ERROR_ITEM_OVERFLOWMONEY;
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarket->nRetCode);
DetachConnection(L"QUERY_TRADECALCULATEALL");
return;
}
SendMarketCalculationAll(pMarket->nRetCode);
}
break;
#if !defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
case QUERY_GETTRADEITEMID:
{
TAGetTradeItemID *pMarket = (TAGetTradeItemID*)pData;
#if defined(PRE_ADD_PETALTRADE)
int nRet = 0;
if ( pMarket->cMethodCode == DBDNWorldDef::PayMethodCode::Petal )
nRet = m_pItem->BuyMarketItem(pMarket->nMarketDBID, pMarket->nMarketItemID, pMarket->nPrice);
else
nRet = m_pItem->BuyMarketItem(pMarket->nMarketDBID, pMarket->nMarketItemID, 0);
#else
int nRet = m_pItem->BuyMarketItem(pMarket->nMarketDBID, pMarket->nMarketItemID);
#endif
if (nRet != ERROR_NONE){
SendMarketBuy(0, nRet, false);
return;
}
}
break;
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
case QUERY_GETPETALBALANCE:
{
TAGetPetalBalance* pMarket = (TAGetPetalBalance*)pData;
if ( pMarket->nRetCode == ERROR_NONE )
{
SetPetal(pMarket->nPetalBalance);
}
SendMarketPetalBalance(pMarket->nPetalBalance, pMarket->nRetCode);
}
break;
case QUERY_GETTRADEPRICE:
{
TAGetTradePrice* pMarket = (TAGetTradePrice*)pData;
if (pMarket->nRetCode != ERROR_NONE)
{
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, GetSessionID(), L"[M:%d S:%d] Ret:%d", MAINCMD_MARKET, nSubCmd, pMarket->nRetCode);
DetachConnection(L"QUERY_GETTRADEPRICE");
break;
}
// ij<><C4B3> <20><><EFBFBD><EFBFBD>
TradeSystem::CMarketPriceCache::GetInstance().SetTradePrice(pMarket->nItemID, pMarket->cLevel, pMarket->cOption, pMarket->ItemPrices);
SendMarketPrice(pMarket->nRetCode, pMarket->nMarketDBID, pMarket->ItemPrices);
}
}
}
void CDNUserSession::OnDBRecvItem(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvItem(nSubCmd, pData);
switch( nSubCmd )
{
case QUERY_GETPAGEMATERIALIZEDITEM:
{
TAGetPageMaterializedItem *pItem = (TAGetPageMaterializedItem*)pData;
int nRemain = m_pItem->GetCashInventoryTotalCount() - m_pItem->GetCashInventoryCount();
if (m_bFirst)
{
SendCashInvenList( m_pItem->GetCashInventoryTotalCount(), pItem->cCount, pItem->CashItem );
#if defined (PRE_ADD_BESTFRIEND)
m_pBestFriend->RemoveReward();
#endif
}
break;
}
case QUERY_GETPAGEVEHICLE:
{
m_pItem->RemoveInstantVehicleItemData( !m_bFirst );
TAGetPageVehicle *pItem = (TAGetPageVehicle*)pData;
if (m_bFirst){
#if defined( PRE_ADD_PCBANG_RENTAL_ITEM )
bool bCheckDelete = m_pItem->RemovePCBangRentalItemVehicle( false );
if( m_bDeletePCRentalItem || bCheckDelete )
SendServerMsg( CHATTYPE_SYSTEM, CEtUIXML::idCategory1, SERVERMSG_INDEX6211, 3, 4); // Caption3, 4<><34>
#endif
SendVehicleInvenList( m_pItem->GetVehicleInventoryTotalCount(), pItem->cCount, pItem->VehicleItem);
m_pItem->SendPetSatiety();
// Ż<><C5BB><EFBFBD>κ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
if (m_pItem->GetVehicleInventoryTotalCount() == m_pItem->GetVehicleInventoryItemCount() )
{
SendQuickSlotList(GetStatusData()->QuickSlot);
if(!m_GuildSelfView.IsSet())
GetItem()->RemoveGuildReversionVehicleItemData( true );
}
}
break;
}
#if !defined (PRE_MOD_GAMESERVERSHOP)
case QUERY_GETLIST_REPURCHASEITEM:
{
TAGetListRepurchaseItem* pA = reinterpret_cast<TAGetListRepurchaseItem*>(pData);
GetItem()->OnRecvGetListRepurchaseItem( pA );
break;
}
#endif // #if !defined (PRE_MOD_GAMESERVERSHOP)
}
}
void CDNUserSession::OnDBRecvCash(int nSubCmd, char *pData)
{
CDNUserBase::OnDBRecvCash(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvMasterSystem(int nSubCmd, char* pData)
{
return CDNUserBase::OnDBRecvMasterSystem( nSubCmd, pData );
}
void CDNUserSession::OnDBRecvFarm(int nSubCmd, char * pData)
{
switch(nSubCmd)
{
case QUERY_GETLIST_FIELD_BYCHARACTER:
{
TAGetListFieldByCharacter* pPacket = reinterpret_cast<TAGetListFieldByCharacter*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
TFarmItem FarmItems[Farm::Max::FARMCOUNT];
memset(FarmItems, 0, sizeof(FarmItems));
BYTE cCount = 0;
g_pFarm->GetActivateFarmList(FarmItems, cCount);
SendFarmInfo(FarmItems, cCount, pPacket->Fields, pPacket->cCount, pPacket->bRefreshGate);
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ǯ<><C7AE><EFBFBD>ش<EFBFBD>.
m_cGateNo = -1;
m_eUserState = STATE_NONE;
SendCancelStage(pPacket->nRetCode);
}
}
break;
}
return CDNUserBase::OnDBRecvFarm(nSubCmd, pData);
}
void CDNUserSession::OnDBRecvGuildRecruit(int nSubCmd, char * pData)
{
switch(nSubCmd)
{
case QUERY_REGISTERON_GUILDRECRUIT:
{
//<2F>񵿱<EFBFBD>(<28><><EFBFBD>žȵ<C5BE>)
TARegisterOnGuildRecruit* pPacket = reinterpret_cast<TARegisterOnGuildRecruit*>(pData);
SendRegisterGuildRecruitList( pPacket->nRetCode, GuildRecruitSystem::RegisterType::RegisterOn );
return;
}
break;
case QUERY_REGISTERMOD_GUILDRECRUIT:
{
//<2F>񵿱<EFBFBD>(<28><><EFBFBD>žȵ<C5BE>)
TARegisterModGuildRecruit* pPacket = reinterpret_cast<TARegisterModGuildRecruit*>(pData);
SendRegisterGuildRecruitList( pPacket->nRetCode, GuildRecruitSystem::RegisterType::RegisterMod );
return;
}
break;
case QUERY_REGISTEROFF_GUILDRECRUIT:
{
//<2F>񵿱<EFBFBD>(<28><><EFBFBD>žȵ<C5BE>)
TARegisterOffGuildRecruit* pPacket = reinterpret_cast<TARegisterOffGuildRecruit*>(pData);
SendRegisterGuildRecruitList( pPacket->nRetCode, GuildRecruitSystem::RegisterType::RegisterOff );
return;
}
break;
case QUERY_REQUESTON_GUILDRECRUIT:
{
//<2F>ڽ<EFBFBD><DABD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>
TAGuildRecruitRequestOn* pPacket = reinterpret_cast<TAGuildRecruitRequestOn*>(pData);
SendGuildRecruitRequest( pPacket->nRetCode, GuildRecruitSystem::RequestType::RequestOn );
GuildRecruitSystem::CCacheRepository::GetInstance().DelMyGuildRecruit( this );
return;
}
break;
case QUERY_REQUESTOFF_GUILDRECRUIT:
{
//<2F>ڽ<EFBFBD><DABD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>
TAGuildRecruitRequestOff* pPacket = reinterpret_cast<TAGuildRecruitRequestOff*>(pData);
SendGuildRecruitRequest( pPacket->nRetCode, GuildRecruitSystem::RequestType::RequestOff );
GuildRecruitSystem::CCacheRepository::GetInstance().DelMyGuildRecruit( this );
return;
}
break;
case QUERY_ACCEPTON_GUILDRECRUIT:
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>ʿ<EFBFBD>(<28><EFBFBD><C2B6><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>)
TAGuildRecruitAcceptOn* pPacket = reinterpret_cast<TAGuildRecruitAcceptOn*>(pData);
if(pPacket->nRetCode == ERROR_NONE )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>
const TGuildUID GuildUID = GetGuildUID();
if( !GuildUID.IsSet())
{
return;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
return;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
return;
}
#endif
// <20><>ġ <20>ʱ<EFBFBD>ȭ
TCommunityLocation Location;
Location.Reset();
TGuildMember GuildMember;
GuildMember.Set(pPacket->nAddAccountDBID, pPacket->biAddCharacterDBID, pPacket->wszToCharacterName, static_cast<TP_JOB>(pPacket->cJob), pPacket->cLevel, GUILDROLE_TYPE_JUNIOR, pPacket->JoinDate);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>(<28>ߺ<EFBFBD><DFBA>߻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (!pGuild->AddMember(&GuildMember, &Location))
_DANGER_POINT()
// <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TGuildView GuildView = pGuild->GetInfo()->GuildView;
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BFA1><EFBFBD>
pGuild->SendAddGuildMember(pPacket->nAddAccountDBID, pPacket->biAddCharacterDBID, pPacket->wszToCharacterName, static_cast<TP_JOB>(pPacket->cJob), pPacket->cLevel, pPacket->JoinDate, &Location);
// MA <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>
g_pMasterConnection->SendAddGuildMember(GuildUID, pPacket->nAddAccountDBID, pPacket->biAddCharacterDBID, pPacket->wszToCharacterName, static_cast<TP_JOB>(pPacket->cJob), pPacket->cLevel, pPacket->JoinDate);
SendGuildRecruitAccept( pPacket->nRetCode, pPacket->biAddCharacterDBID, pPacket->bDelGuildRecruit, GuildRecruitSystem::AcceptType::AcceptOn );
GuildRecruitSystem::CCacheRepository::GetInstance().DelGuildRecruitCharacter( GuildUID );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByName(pPacket->wszToCharacterName);
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD>Ͽ<EFBFBD> ã<>ƺ<EFBFBD><C6BA><EFBFBD>.
if (!pUserObj)
{
g_pMasterConnection->SendGuildRecruitMemberResult(GuildUID, pPacket->wszToCharacterName, pPacket->biAddCharacterDBID, GuildView, GuildRecruitSystem::AcceptType::AcceptOn);
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pUserObj->SetGuildSelfView(TGuildSelfView(GuildView, GUILDROLE_TYPE_JUNIOR));
pUserObj->SendGuildRecruitMemberResult(pPacket->nRetCode, GuildView.wszGuildName, GuildRecruitSystem::AcceptType::AcceptOn);
TGuildRewardItem *RewardItemInfo;
RewardItemInfo = pGuild->GetGuildRewardItem();
pUserObj->SendGuildRewardItem(RewardItemInfo);
pUserObj->GetEventSystem()->OnEvent( EventSystem::OnGuildJoin );
}
else
{
SendGuildRecruitAccept( pPacket->nRetCode, pPacket->biAddCharacterDBID, pPacket->bDelGuildRecruit, GuildRecruitSystem::AcceptType::AcceptOn );
}
return;
}
break;
case QUERY_ACCEPTOFF_GUILDRECRUIT:
{
//<2F>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȸ<EFBFBD><C8B8><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>ʿ<EFBFBD>
TAGuildRecruitAcceptOff* pPacket = reinterpret_cast<TAGuildRecruitAcceptOff*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
const TGuildUID GuildUID = GetGuildUID();
if( !GuildUID.IsSet())
{
return;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
return;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
return;
}
#endif
TGuildView GuildView = pGuild->GetInfo()->GuildView;
SendGuildRecruitAccept( pPacket->nRetCode, pPacket->biDenyCharacterDBID, false, GuildRecruitSystem::AcceptType::AcceptOff );
GuildRecruitSystem::CCacheRepository::GetInstance().DelGuildRecruitCharacter( GuildUID );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByName(pPacket->wszToCharacterName);
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD>Ͽ<EFBFBD> ã<>ƺ<EFBFBD><C6BA><EFBFBD>.
if (!pUserObj)
{
g_pMasterConnection->SendGuildRecruitMemberResult(GuildUID, pPacket->wszToCharacterName, pPacket->biDenyCharacterDBID, GuildView, GuildRecruitSystem::AcceptType::AcceptOff);
return;
}
pUserObj->SendGuildRecruitMemberResult(pPacket->nRetCode, GuildView.wszGuildName, GuildRecruitSystem::AcceptType::AcceptOff);
}
else
{
SendGuildRecruitAccept( pPacket->nRetCode, pPacket->biDenyCharacterDBID, false, GuildRecruitSystem::AcceptType::AcceptOff );
}
return;
}
break;
}
return CDNUserBase::OnDBRecvGuildRecruit(nSubCmd, pData);
}
#if defined (PRE_ADD_DONATION)
void CDNUserSession::OnDBRecvDonation(int nSubCmd, char* pData)
{
switch (nSubCmd)
{
case QUERY_DONATE:
{
TADonate* pA = reinterpret_cast<TADonate*>(pData);
SendDonationResult(pA->nRetCode);
}
break;
case QUERY_DONATION_RANKING:
{
TADonationRaking* pA = reinterpret_cast<TADonationRaking*>(pData);
SendDonationRanking(pA->Ranking, pA->nMyRanking, pA->nMyCoin);
}
break;
}
}
#endif // #if defined (PRE_ADD_DONATION)
#if defined( PRE_PARTY_DB )
int CDNUserSession::_RecvDBCreateParty( const TAAddParty* pA )
{
if( pA->nRetCode != ERROR_NONE )
return ERROR_PARTY_CREATE_FAIL;
#if defined( _FINAL_BUILD )
if( GetPartyID() > 0 )
{
g_pPartyManager->QueryDelParty( pA->Data.PartyData.PartyID );
return ERROR_NONE;
}
#else
if( pA->bCheat == false )
{
if( GetPartyID() > 0 )
return ERROR_NONE;
}
#endif // #if defined( _FINAL_BUILD )
CDNParty* pParty = g_pPartyManager->CreateParty( this, pA->Data.PartyData.PartyID, &pA->Data );
if( pParty )
{
int iMemberIdx = -1;
if( pParty->AddPartyMember( GetAccountDBID(), GetSessionID(), GetCharacterName(), iMemberIdx, true ) == true )
{
#if defined(PRE_FIX_62281)
SendCreateParty( ERROR_NONE, pA->Data.PartyData.PartyID, ( static_cast<int>(wcslen(pA->Data.wszAfterInviteCharacterName)) > 0 ? true : false), pA->Data.PartyData.Type );
#else
SendCreateParty( ERROR_NONE, pA->Data.PartyData.PartyID, (pA->Data.uiAfterInviteAccountDBID > 0 ? true : false), pA->Data.PartyData.Type );
#endif
SetPartyID( pParty->GetPartyID() );
m_nPartyMemberIndex = iMemberIdx;
m_boPartyLeader = true;
pParty->SendAllRefreshParty( PARTYREFRESH_NONE );
pParty->SendPartyMemberMoveEachOther( GetSessionID(), GetTargetPos().nX, GetTargetPos().nY, GetTargetPos().nZ );
#if defined(PRE_FIX_62281)
if( static_cast<int>(wcslen(pA->Data.wszAfterInviteCharacterName)) > 0 )
{
CDNUserSession* pInviteUser = g_pUserSessionManager->FindUserSessionByName( pA->Data.wszAfterInviteCharacterName );
#else
if( pA->Data.uiAfterInviteAccountDBID > 0 )
{
CDNUserSession* pInviteUser = g_pUserSessionManager->FindUserSessionByAccountDBID( pA->Data.uiAfterInviteAccountDBID );
#endif
if( pInviteUser )
{
//<2F>ʴ<EFBFBD><CAB4>ҳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
#if defined(PRE_FIX_62281)
int nRet = pInviteUser->CheckPartyInvitableState(GetCharacterName(), pA->Data.PartyData.cMinLevel);
if( nRet != ERROR_NONE )
return nRet;
#else
if( !pInviteUser->IsNoneWindowState() )
return ERROR_PARTY_INVITEFAIL_DESTUSER_SITUATION_NOTALLOWED;
#endif
if( pParty->InvitePartyMember(pInviteUser->GetCharacterName()) == true )
{
pInviteUser->SetWindowState(WINDOW_ISACCEPT);
#if defined(PRE_FIX_62281)
pInviteUser->SendPartyInviteMsg( pParty->GetPartyID(), pParty->GetPartyName(), pParty->GetPassword(), GetCharacterName(), (BYTE)pParty->GetMemberMax(), (BYTE)pParty->GetMemberCount(), (USHORT)pParty->GetAvrUserLv(), -1, GetMapIndex());
#else
pInviteUser->SendPartyInviteMsg( pParty->GetPartyID(), pParty->GetPartyName(), pParty->GetPassword(), GetCharacterName(), (BYTE)pParty->GetMemberMax(), (BYTE)pParty->GetMemberCount(), (USHORT)pParty->GetAvrUserLv());
#endif
}
else
{
return ERROR_PARTY_INVITEFAIL_ALREADY_INVITED;
}
}
#if defined(PRE_FIX_62281)
else
{ //<2F><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_pMasterConnection->SendReqPartyInvite( this, pA->Data.wszAfterInviteCharacterName, pParty );
}
#endif
}
#if defined( _USE_VOICECHAT )
if( pA->Data.PartyData.iBitFlag&Party::BitFlag::VoiceChat )
{
if( g_pVoiceChat && g_pMasterConnection )
g_pMasterConnection->SendReqVoiceChannelID( pParty->GetPartyID(), _VOICECHANNEL_REQTYPE_PARTY );
}
#endif // #if defined( _USE_VOICECHAT )
}
else
{
g_pPartyManager->DestroyParty( pA->Data.PartyData.PartyID );
return ERROR_PARTY_CREATE_FAIL;
}
}
#if defined(PRE_FIX_62281)
else
return ERROR_PARTY_CREATE_FAIL;
#endif
return ERROR_NONE;
}
int CDNUserSession::_RecvDBJoinParty( const TAJoinParty* pA )
{
if( m_eUserState == STATE_READY )
return ERROR_PARTY_JOINFAIL_INREADYSTATE;
if( GetPartyID() > 0 )
return ERROR_PARTY_JOINFAIL;
if( m_bIsMove || m_bIsStartGame )
return ERROR_PARTY_JOINFAIL;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
IsWindowStateNoneSet(WINDOW_ISACCEPT);
CDNParty* pParty = g_pPartyManager->GetParty( pA->PartyID );
if( pParty == NULL )
return ERROR_PARTY_JOINFAIL;
if( pParty->CheckSameGateNo() != -1 || pParty->GetCompleteMember() || pParty->bIsMove() || pParty->bIsStartGame() )
return ERROR_PARTY_JOINFAIL_INREADYSTATE;
if (pParty->HasEmptyPlace() == false)
return ERROR_PARTY_JOINFAIL;
if (pParty->GetChannelID() != GetChannelID())
{
const sChannelInfo * pChInfo = g_pMasterConnection->GetChannelInfo(GetChannelID());
const sChannelInfo * pPartyChInfo = g_pMasterConnection->GetChannelInfo(pParty->GetChannelID());
if (pChInfo && pPartyChInfo)
{
if (pChInfo->nMapIdx != pPartyChInfo->nMapIdx)
return ERROR_PARTY_JOINFAIL;
}
else
return ERROR_PARTY_JOINFAIL;
if (!g_pMasterConnection || g_pMasterConnection->GetActive() == false)
return ERROR_PARTY_JOINFAIL;
}
int nMemberIdx = -1;
if( pParty->AddPartyMember(GetAccountDBID(), GetSessionID(), GetCharacterName(), nMemberIdx ) == false )
return ERROR_PARTY_JOINFAIL;
#if defined( PRE_PARTY_DB )
#else
if( pParty->HasEmptyPlace() == false )
g_pPartyManager->EraseWaitPartyList(pParty);
#endif // #if defined( PRE_PARTY_DB )
m_PartyID = pParty->GetPartyID();
m_nPartyMemberIndex = nMemberIdx;
SendJoinParty(ERROR_NONE, pParty->GetPartyID(), pParty->GetPartyName() );
pParty->SendAllRefreshParty(PARTYREFRESH_NONE);
pParty->SendPartyMemberMoveEachOther(GetSessionID(), m_BaseData.TargetPos.nX, m_BaseData.TargetPos.nY, m_BaseData.TargetPos.nZ);
if( GetProfile()->bOpenPublic )
pParty->SendUserProfile( GetSessionID(), *GetProfile() );
if( pParty->GetChannelID() != GetChannelID() )
g_pMasterConnection->SendVillageToVillage(REQINFO_TYPE_SINGLE_SAMEDEST, GetAccountDBID(), GetMapIndex(), -1, pParty->GetChannelID());
return ERROR_NONE;
}
int CDNUserSession::_RecvDBOutParty( const TAOutParty* pA )
{
CDNParty* pParty = g_pPartyManager->GetParty( pA->PartyID );
if( pParty == NULL )
return ERROR_PARTY_LEAVEFAIL;
return g_pPartyManager->DelPartyMember( pParty, this, pA );
}
void CDNUserSession::OnDBRecvParty( int nSubCmd, char* pData )
{
switch( nSubCmd )
{
case QUERY_ADDPARTY:
{
int iRet = _RecvDBCreateParty( reinterpret_cast<TAAddParty*>(pData) );
switch( iRet )
{
case ERROR_NONE:
{
break;
}
case ERROR_PARTY_INVITEFAIL_DESTUSER_SITUATION_NOTALLOWED:
case ERROR_PARTY_INVITEFAIL_ALREADY_INVITED:
{
SendPartyInviteFail( iRet );
break;
}
default:
{
SendCreateParty( iRet, 0 );
break;
}
}
break;
}
case QUERY_JOINPARTY:
{
const TAJoinParty* pPacket = reinterpret_cast<const TAJoinParty*>(pData);
int iRet = _RecvDBJoinParty( pPacket );
if( iRet != ERROR_NONE )
g_pPartyManager->QueryOutParty( pPacket->PartyID, pPacket->nAccountDBID, pPacket->biCharacterDBID, pPacket->nSessionID, Party::QueryOutPartyType::Normal );
break;
}
case QUERY_OUTPARTY:
{
const TAOutParty* pPacket = reinterpret_cast<const TAOutParty*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
if( _RecvDBOutParty( pPacket ) != ERROR_NONE )
DetachConnection( L"QUERY_OUTPARTY Failed!" );
}
else
{
if( pPacket->Type == Party::QueryOutPartyType::Normal )
SendPartyOut( ERROR_PARTY_LEAVEFAIL );
}
break;
}
case QUERY_GETPARTY_JOINMEMBERS:
{
const TAGetListPartyMember* pPacket = reinterpret_cast<const TAGetListPartyMember*>(pData);
#if defined( PRE_WORLDCOMBINE_PARTY )
if( (pPacket->nRetCode == ERROR_NONE && pPacket->nCount > 0)
|| Party::bIsWorldCombineParty(pPacket->PartyType) )
#else
if( pPacket->nRetCode == ERROR_NONE && pPacket->nCount > 0 )
#endif
{
SCPartyMemberInfo TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.PartyID = pPacket->PartyID;
TxPacket.PartyType = pPacket->PartyType;;
TxPacket.nCount = pPacket->nCount;
for( int i=0 ; i<pPacket->nCount ; ++i )
TxPacket.MemberData[i] = pPacket->MemberData[i];
SendPartyMemberInfo( &TxPacket );
}
else
{
m_PrevPartyListInfo.Clear();
g_Log.Log(LogType::_PARTYERROR, this, L"[QUERY_GETPARTY_JOINMEMBERS]Error PartyID:%I64d MemberCount:%d nRet:%d\n", pPacket->PartyID, pPacket->nCount, pPacket->nRetCode);
SendPartyInfoErr( ERROR_PARTY_NOTFOUND_MEMBERINFO );
}
break;
}
}
}
#endif // #if defined( PRE_PARTY_DB )
#if defined (PRE_ADD_BESTFRIEND)
void CDNUserSession::OnDBRecvBestFriend(int nSubCmd, char* pData)
{
CDNUserBase::OnDBRecvBestFriend(nSubCmd, pData);
switch( nSubCmd )
{
case QUERY_REGIST_BESTFRIEND:
{
const TARegistBestFriend *pPacket = reinterpret_cast<TARegistBestFriend*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendRegistBestFriendAck(pPacket->nRetCode, GetAccountDBID(), GetCharacterName(), 0, NULL);
break;
}
// <20><>ģ <20><><EFBFBD>ϼ<EFBFBD> <20><><EFBFBD><EFBFBD> (DB<44><42><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
m_pItem->DeleteItemByUse(ITEMPOSITION_CASHINVEN, -1, pPacket->biRegistSerial, false);
// <20><>ģ <20><><EFBFBD><EFBFBD>
m_pBestFriend->ExecuteReward(pPacket->nItemID);
// <20><>ģ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pDBCon->QueryGetBestFriend(m_cDBThreadID, this, true);
// <20><>ģ <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
SendCompleteBestFriend(ERROR_NONE, pPacket->wszFromName);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>.
g_pMasterConnection->SendCompleteBestFriend(pPacket->nToAccountDBID, GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), pPacket->nItemID);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
g_pMasterConnection->SendWorldSystemMsg(GetAccountDBID(), WORLDCHATTYPE_BESTFRIEND, 0, 0, pPacket->wszToName);
}
break;
case QUERY_CANCEL_BESTFRIEND:
{
const TACancelBestFriend *pPacket = reinterpret_cast<TACancelBestFriend*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendCancelBestFriend(pPacket->nRetCode, NULL);
break;
}
m_pDBCon->QueryGetBestFriend(m_cDBThreadID, this, true);
g_pMasterConnection->SendCancelBestFriend(GetCharacterName(), m_pBestFriend->GetInfo().wszName, pPacket->bCancel);
SendCancelBestFriend(ERROR_NONE, GetCharacterName(), pPacket->bCancel);
}
break;
case QUERY_CLOSE_BESTFRIEND:
{
const TACloseBestFriend *pPacket = reinterpret_cast<TACloseBestFriend*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
g_Log.Log(LogType::_BESTFRIEND, this, L"QUERY_CLOSE_BESTFRIEND [Result:%d] \r\n", pPacket->nRetCode);
break;
}
// <20>ı<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int nMailID = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::BestFriend_CloseMail );
CDNMailSender::Process( GetCharacterDBID(), GetWorldSetID(), nMailID );
CDNMailSender::Process( m_pBestFriend->GetInfo().biCharacterDBID, GetWorldSetID(), nMailID );
g_pMasterConnection->SendCloseBestFriend(GetCharacterName(), m_pBestFriend->GetInfo().wszName);
SendCloseBestFriend(ERROR_NONE, m_pBestFriend->GetInfo().wszName);
m_pBestFriend->Close();
}
break;
case QUERY_EDIT_BESTFRIENDMEMO:
{
const TAEditBestFriendMemo *pPacket = reinterpret_cast<TAEditBestFriendMemo*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendEditBestFriendMemo(pPacket->nRetCode, true, NULL);
break;
}
GetBestFriend()->ChangeMemo(true, pPacket->wszMemo);
g_pMasterConnection->SendEditBestFriendMemo(GetAccountDBID(), m_pBestFriend->GetInfo().biCharacterDBID, pPacket->wszMemo);
SendEditBestFriendMemo(pPacket->nRetCode, true, pPacket->wszMemo);
}
break;
default:
break;
}
}
#endif // #if defined (PRE_ADD_BESTFRIEND)
#if defined( PRE_PRIVATECHAT_CHANNEL )
void CDNUserSession::OnDBRecvPrivateChatChannel(int nSubCmd, char* pData)
{
CDNUserBase::OnDBRecvPrivateChatChannel(nSubCmd, pData);
}
#endif
#if defined( PRE_ALTEIAWORLD_EXPLORE )
void CDNUserSession::OnDBRecvAlteiaWorld(int nSubCmd, char* pData)
{
CDNUserBase::OnDBRecvAlteiaWorld(nSubCmd, pData);
switch( nSubCmd )
{
case QUERY_GET_ALTEIAWORLDINFO:
{
const TAGetAlteiaWorldInfo* pPacket = reinterpret_cast<const TAGetAlteiaWorldInfo*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
SetAlteiaBestGoldKeyCount( (BYTE)pPacket->nBestGoldKeyCount );
SetAlteiaBestPlayTime( pPacket->uiBestPlayTime );
SetAlteiaWeeklyPlayCount( (BYTE)pPacket->nWeeklyPlayCount );
SetAlteiaDailyPlayCount( (BYTE)pPacket->nDailyPlayCount );
}
}
break;
case QUERY_GET_ALTEIAWORLDPRIVATEGOLDKEYRANK:
{
const TAGetAlteiaWorldPrivateGoldKeyRank* pPacket = reinterpret_cast<const TAGetAlteiaWorldPrivateGoldKeyRank*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
SendAlteiaWorldPrivateGoldKeyRank( pPacket );
}
}
break;
case QUERY_GET_ALTEIAWORLDPRIVATEPLAYTIMERANK:
{
const TAGetAlteiaWorldPrivatePlayTimeRank* pPacket = reinterpret_cast<const TAGetAlteiaWorldPrivatePlayTimeRank*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
SendAlteiaWorldPrivatePlayTimeRank( pPacket );
}
}
break;
case QUERY_GET_ALTEIAWORLDGUILDGOLDKEYRANK:
{
const TAGetAlteiaWorldGuildGoldKeyRank* pPacket = reinterpret_cast<const TAGetAlteiaWorldGuildGoldKeyRank*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
SendAlteiaWorldGuildGoldKeyRank( pPacket );
}
}
break;
case QUERY_GET_ALTEIAWORLDSENDTICKETLIST:
{
const TAGetAlteiaWorldSendTicketList* pPacket = reinterpret_cast<const TAGetAlteiaWorldSendTicketList*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
BYTE cMaxSendTicketCount = static_cast<BYTE>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldSendTicketCount ));
BYTE cDailyTicketCount = static_cast<BYTE>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldDailyTicketCount ));
BYTE cJoinTicketCount = static_cast<BYTE>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldJoinTicketCount ));
m_cTicketCount = pPacket->nRecvTicketCount + cDailyTicketCount;
if( cJoinTicketCount * m_cDailyPlayCount <= m_cTicketCount )
m_cTicketCount -= cJoinTicketCount * m_cDailyPlayCount;
else
m_cTicketCount = 0;
if( cMaxSendTicketCount > pPacket->nSendTicketCount )
m_cSendTicketCount = cMaxSendTicketCount - pPacket->nSendTicketCount;
else
m_cSendTicketCount = 0;
for( int i=0;i<AlteiaWorld::Common::MaxSendCount;i++ )
{
if( pPacket->biCharacterDBID[i] > 0 )
AddAlteiaSendTicketList(pPacket->biCharacterDBID[i]);
else
break;
}
}
}
break;
case QUERY_ADD_ALTEIAWORLDSENDTICKETLIST:
{
const TAAddAlteiaWorldSendTicketList* pPacket = reinterpret_cast<TAAddAlteiaWorldSendTicketList*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
AddAlteiaTicket();
SendAlteiaWorldSendTicket( pPacket->wszSendCharacterName, GetAlteiaTicketCount() );
CDNUserSession* pSession = g_pUserSessionManager->FindUserSessionByName(pPacket->wszSendCharacterName);
if( pSession )
{
pSession->DelAlteiaSendTicket();
pSession->SendAlteiaWorldSendTicketResult( pPacket->nRetCode, pSession->GetAlteiaSendTicketCount() );
}
else
{
if( g_pMasterConnection )
g_pMasterConnection->SendAddAlteiaWorldSendTicketResult( pPacket->nRetCode, pPacket->biSendCharacterDBID );
}
}
else
{
CDNUserSession* pSession = g_pUserSessionManager->FindUserSessionByName(pPacket->wszSendCharacterName);
if( pSession )
{
pSession->SendAlteiaWorldSendTicketResult( pPacket->nRetCode, pSession->GetAlteiaSendTicketCount() );
}
else
{
if( g_pMasterConnection )
g_pMasterConnection->SendAddAlteiaWorldSendTicketResult( pPacket->nRetCode, pPacket->biSendCharacterDBID );
}
}
}
break;
default:
break;
}
}
#endif
#if defined(PRE_ADD_DWC)
void CDNUserSession::OnDBRecvDWC( int nSubCmd, char* pData )
{
CDNUserBase::OnDBRecvDWC(nSubCmd, pData);
switch( nSubCmd )
{
case QUERY_CREATE_DWC_TEAM:
{
const TACreateDWCTeam * pPacket = reinterpret_cast<TACreateDWCTeam*>(pData);
if( ERROR_NONE != pPacket->nRetCode )
{
SendCreateDWCTeam(pPacket->nRetCode, GetSessionID(), L"", 0);
return;
}
TDWCTeam TeamInfo;
memset( &TeamInfo, 0, sizeof(TeamInfo) );
//TeamInfo.nDWCPoint = 1500; //dWC <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
_wcscpy(TeamInfo.wszTeamName, _countof(TeamInfo.wszTeamName), pPacket->wszTeamName, (int)wcslen(pPacket->wszTeamName));
CDnDWCTeam *pDWCTeam = g_pDWCTeamManager->AddDWCTeamResource(pPacket->nTeamID, &TeamInfo);
if(!pDWCTeam)
break;
TDWCTeamMember MemberInfo;
memset( &MemberInfo, 0, sizeof(MemberInfo) );
MemberInfo.nAccountDBID = GetAccountDBID();
MemberInfo.biCharacterDBID = GetCharacterDBID();
_wcscpy(MemberInfo.wszCharacterName, _countof(MemberInfo.wszCharacterName), GetCharacterName(), (int)wcslen(GetCharacterName()));
MemberInfo.cJobCode = GetUserJob();
MemberInfo.bTeamLeader = true;
if( !pDWCTeam->AddMember(&MemberInfo, NULL) )
_DANGER_POINT();
SetDWCTeamID(pPacket->nTeamID);
SendCreateDWCTeam(pPacket->nRetCode, GetSessionID(), pPacket->wszTeamName, pPacket->nTeamID);
std::vector<INT64> vecMemberList;
vecMemberList.push_back(GetCharacterDBID());
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendDWCTeamMemberList(GetAccountDBID(), GetDWCTeamID(), vecMemberList);
RefresDWCTeamName();
}
break;
case QUERY_ADD_DWC_TEAMMEMBER:
{
const TAAddDWCTeamMember *pPacket = reinterpret_cast<TAAddDWCTeamMember*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SendInviteDWCTeamMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), pPacket->nRetCode, 0, 0, 0, NULL, NULL);
break;
}
CDnDWCTeam* pDWCTeam = g_pDWCTeamManager->GetDWCTeam(pPacket->nTeamID);
if (!pDWCTeam)
{
SendInviteDWCTeamMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), ERROR_DWC_NOTEXIST_TEAMINFO, 0, 0, 0, NULL, NULL);
break;
}
// <20><>ġ <20>ʱ<EFBFBD>ȭ
TCommunityLocation Location;
Location.Reset();
TDWCTeamMember DWCTeamMember(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), static_cast<TP_JOB>(GetUserJob()), false);
if (!pDWCTeam->AddMember(&DWCTeamMember, &Location))
_DANGER_POINT();
SetDWCTeamID(pPacket->nTeamID);
pDWCTeam->SendAddDWCTeamMember(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), static_cast<TP_JOB>(GetUserJob()), &Location);
std::vector<INT64> vecMemberList;
pDWCTeam->GetMemberCharacterDBIDList(vecMemberList);
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendDWCTeamMemberList(GetAccountDBID(), GetDWCTeamID(), vecMemberList);
RefresDWCTeamName();
}
break;
case QUERY_DWC_INVITE_MEMBER:
{
TADWCInviteMember *pPacket = reinterpret_cast<TADWCInviteMember*>(pData);
if( pPacket->nTeamID <= 0 || pPacket->cMemberCount <= 0 )
{
SendInviteDWCTeamMemberAckResult(ERROR_DWC_NOTEXIST_TEAMINFO);
break;
}
g_pDWCTeamManager->UpdateDWCTeamResource(pPacket->nTeamID, &pPacket->Info);
g_pDWCTeamManager->UpdateTeamMember(pPacket->nTeamID, pPacket->cMemberCount, pPacket->MemberList);
CDnDWCTeam* pDWCTeam = g_pDWCTeamManager->GetDWCTeam(pPacket->nTeamID);
if (!pDWCTeam)
{
SendInviteDWCTeamMemberAckResult(ERROR_DWC_NOTEXIST_TEAMINFO);
break;
}
// <20>ο<EFBFBD><CEBF>߰<EFBFBD> <20><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> üũ
if (!pDWCTeam->IsMemberAddable())
{
SendInviteDWCTeamMemberAckResult(ERROR_DWC_CANTADD_TEAMMEMBER);
break;
}
if ( !pDWCTeam->CheckDuplicationJob(GetUserJob()) )
{
SendInviteDWCTeamMemberAckResult(ERROR_DWC_DUPLICATION_JOB);
break;
}
m_pDBCon->QueryAddDWCTeamMember(m_cDBThreadID, m_nAccountDBID, m_biCharacterDBID, pPacket->nTeamID, g_Config.nWorldSetID);
}
break;
case QUERY_DEL_DWC_TEAMMEMBER:
{
const TADelDWCTeamMember* pPacket = reinterpret_cast<TADelDWCTeamMember*>(pData);
if( ERROR_NONE != pPacket->nRetCode )
{
SendLeaveDWCTeamMember(pPacket->nTeamID, pPacket->biCharacterDBID, L"", pPacket->nRetCode);
return;
}
CDnDWCTeam *pDWCTeam = g_pDWCTeamManager->GetDWCTeam(pPacket->nTeamID);
if(!pDWCTeam)
break;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD> <20><> <20><>ü
if( GetCharacterDBID() == pDWCTeam->GetLeaderCharacterDBID())
{
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BFA1><EFBFBD>
pDWCTeam->SendDismissDWCTeam(pPacket->nTeamID, ERROR_NONE);
g_pDWCTeamManager->DelDWCTeamResource(pPacket->nTeamID); //<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
else //<2F>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
pDWCTeam->SendLeaveDWCTeamMember(pPacket->nTeamID, GetCharacterDBID(), GetCharacterName(), ERROR_NONE);
pDWCTeam->DelMember(GetCharacterDBID());
pDWCTeam->ResetTeamScore(); //<2F><> <20><><EFBFBD>ھ<EFBFBD> <20>ʱ<EFBFBD>ȭ
SetDWCTeamID(0);
RefresDWCTeamName();
}
}
break;
case QUERY_GET_DWC_TEAMINFO:
{
TAGetDWCTeamInfo *pPacket = reinterpret_cast<TAGetDWCTeamInfo*>(pData);
if(ERROR_NONE != pPacket->nRetCode || 0 == pPacket->nTeamID)
break;
SetDWCTeamID(pPacket->nTeamID);
CDnDWCTeam *pDWCTeam = g_pDWCTeamManager->UpdateDWCTeamResource(pPacket);
if(pDWCTeam)
SendGetDWCTeamInfo(pDWCTeam, ERROR_NONE);
}
break;
case QUERY_GET_DWC_TEAMMEMBER:
{
TAGetDWCTeamMember *pPacket = reinterpret_cast<TAGetDWCTeamMember*>(pData);
if(ERROR_NONE != pPacket->nRetCode)
break;
CDnDWCTeam *pDWCTeam = g_pDWCTeamManager->UpdateTeamMember(pPacket);
if(pDWCTeam)
SendGetDWCTeamMember(pDWCTeam, ERROR_NONE);
}
break;
case QUERY_GET_DWC_RANKLIST:
{
TAGetDWCRankPage* pPacket = (TAGetDWCRankPage*)pData;
if (pPacket->nRetCode == ERROR_NONE)
SendDWCRankResult(pPacket->nRetCode, pPacket->nTotalRankSize, pPacket->nPageNum, pPacket->nPageSize, pPacket->RankList);
else
SendDWCRankResult(pPacket->nRetCode, 0, 0, 0, NULL);
}
break;
case QUERY_GET_DWC_FINDRANK:
{
TAGetDWCFindRank* pPacket = (TAGetDWCFindRank*)pData;
if (pPacket->nRetCode == ERROR_NONE)
SendDWCFindRankResult(pPacket->nRetCode, &pPacket->Rank);
else
SendDWCFindRankResult(pPacket->nRetCode, NULL);
}
break;
case QUERY_ADD_DWC_RESULT:
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD> ġƮŰ <20>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<EFBFBD><D1BE>´<EFBFBD>.
TAAddPvPDWCResult* pPacket = (TAAddPvPDWCResult*)pData;
MADWCUpdateScore Packet;
Packet.nTeamID = pPacket->nTeamID;
Packet.DWCScore = pPacket->DWCScore;
if(g_pDWCTeamManager && g_pDWCTeamManager->bIsIncludeDWCVillage())
{
CDnDWCTeam *pDWCTeam = g_pDWCTeamManager->GetDWCTeam(Packet.nTeamID);
if(pDWCTeam)
pDWCTeam->UpdateDWCScore(&Packet);
}
}
break;
default:
break;
}
}
#endif
int CDNUserSession::MessageProcess(int nMainCmd, int nSubCmd, char *pData, int nLen)
{
CExceptionReport::GetInstancePtr()->SetValues(GetAccountDBID(), GetCharacterDBID(), nMainCmd, nSubCmd);
if (m_bIsMove || m_bIsStartGame)
{
#ifdef _FINAL_BUILD
if (CS_PVP != nMainCmd && CS_ACTOR != nMainCmd && (CS_SYSTEM != nMainCmd && CS_CONNECTVILLAGE != nSubCmd))
{
g_Log.Log(LogType::_MOVEPACKET_SEQ, this, L"Already Move After Recv MessageProcess [MCMD:%d] [SCMD:%d]\n", nMainCmd, nSubCmd);
return ERROR_NONE;
}
#else
if (CS_ACTOR != nMainCmd && (CS_SYSTEM != nMainCmd && CS_CONNECTVILLAGE != nSubCmd))
{
g_Log.Log(LogType::_MOVEPACKET_SEQ, this, L"Already Move After Recv MessageProcess [MCMD:%d] [SCMD:%d]\n", nMainCmd, nSubCmd);
return ERROR_NONE;
}
#endif
return ERROR_NONE;
}
if (m_bCertified == false)
{
#ifdef _FINAL_BUILD
if (CS_PVP != nMainCmd && CS_ACTOR != nMainCmd && (CS_SYSTEM != nMainCmd && CS_CONNECTVILLAGE != nSubCmd))
{
g_Log.Log(LogType::_MOVEPACKET_SEQ, this, L"Cheat User plz Check this user [MCMD:%d] [SCMD:%d] [InvalidCnt:%d]n", nMainCmd, nSubCmd, m_nInvalidSendCount);
m_nInvalidSendCount++;
return m_nInvalidSendCount >= 10 ? ERROR_INVALIDPACKET : ERROR_NONE;
}
#else
if (CS_ACTOR != nMainCmd && (CS_SYSTEM != nMainCmd && CS_CONNECTVILLAGE != nSubCmd))
{
g_Log.Log(LogType::_MOVEPACKET_SEQ, this, L"Cheat User plz Check this user [MCMD:%d] [SCMD:%d] [InvalidCnt:%d]n", nMainCmd, nSubCmd, m_nInvalidSendCount);
m_nInvalidSendCount++;
return m_nInvalidSendCount >= 10 ? ERROR_INVALIDPACKET : ERROR_NONE;
}
#endif
}
else
m_nInvalidSendCount = 0;
DWORD dwCurTick = timeGetTime();
if ((m_cLastMainCmd == CS_TRADE) && (m_cLastSubCmd == nSubCmd) && (nMainCmd == CS_TRADE)){
if (dwCurTick - m_dwLastMessageTick <= 5){
g_Log.Log(LogType::_ERROR, this, L"CDNUserSession::MessageProcess repeat command(%d, %d)\n", nMainCmd, nSubCmd);
return ERROR_GENERIC_UNKNOWNERROR;
}
}
m_dwLastMessageTick = dwCurTick;
m_cLastMainCmd = nMainCmd;
m_cLastSubCmd = nSubCmd;
switch(nMainCmd)
{
case CS_SYSTEM: return OnRecvSystemMessage(nSubCmd, pData, nLen);
case CS_CHAR: return OnRecvCharMessage(nSubCmd, pData, nLen);
case CS_ACTOR: return OnRecvActorMessage(nSubCmd, pData, nLen);
case CS_PROP: return OnRecvPropMessage(nSubCmd, pData, nLen);
case CS_PARTY: return OnRecvPartyMessage(nSubCmd, pData, nLen);
case CS_ITEM: return OnRecvItemMessage(nSubCmd, pData, nLen);
case CS_ITEMGOODS: return OnRecvItemGoodsMessage(nSubCmd, pData, nLen);
case CS_NPC: return OnRecvNpcMessage(nSubCmd, pData, nLen);
case CS_QUEST: return OnRecvQuestMessage(nSubCmd, pData, nLen);
case CS_CHAT: return OnRecvChatMessage(nSubCmd, pData, nLen);
case CS_SKILL: return OnRecvSkillMessage(nSubCmd, pData, nLen);
case CS_TRADE: return OnRecvTradeMessage(nSubCmd, pData, nLen);
case CS_FRIEND: return OnRecvFriendMessage(nSubCmd, pData, nLen);
case CS_GUILD: return OnRecvGuildMessage(nSubCmd, pData, nLen);
case CS_PVP: return OnRecvPvPMessage(nSubCmd, pData, nLen);
case CS_ISOLATE: return OnRecvIsolateMessage(nSubCmd, pData, nLen);
case CS_APPELLATION: return OnRecvAppellationMessage(nSubCmd, pData, nLen);
case CS_GAMEOPTION: return OnRecvGameOptionMessage(nSubCmd, pData, nLen);
case CS_RADIO: return OnRecvRadioMessage(nSubCmd, pData, nLen);
case CS_ETC: return OnRecvEtcMessage(nSubCmd, pData, nLen);
#ifdef _USE_VOICECHAT
case CS_VOICECHAT: return OnRecvVoiceChatMessage(nSubCmd, pData, nLen);
#endif
case CS_CASHSHOP: return OnRecvCashShopMessage(nSubCmd, pData, nLen);
case CS_FARM: return OnRecvFarmMessage( nSubCmd, pData, nLen );
case CS_CHATROOM: return OnRecvChatRoomMessage( nSubCmd, pData, nLen );
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
case CS_REPUTATION: return OnRecvReputationMessage( nSubCmd, pData, nLen );
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
case CS_MASTERSYSTEM: return OnRecvMasterSystemMessage( nSubCmd, pData, nLen );
#if defined( PRE_ADD_SECONDARY_SKILL )
case CS_SECONDARYSKILL: return OnRecvSecondarySkillMessage( nSubCmd, pData, nLen );
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
case CS_GESTURE: return OnRecvGestureMessage( nSubCmd, pData, nLen );
case CS_CUSTOMEVENTUI: return OnRecvPlayerCustomEventUI(nSubCmd, pData, nLen);
case CS_GUILDRECRUIT: return OnRecvGuildRecruitMessage(nSubCmd, pData, nLen);
#if defined (PRE_ADD_DONATION)
case CS_DONATION: return OnRecvDonation(nSubCmd, pData, nLen);
#endif // #if defined (PRE_ADD_DONATION)
#if defined (PRE_ADD_BESTFRIEND)
case CS_BESTFRIEND: return OnRecvBestFriendMessage(nSubCmd, pData, nLen);
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
case CS_PRIVATECHAT_CHANNEL: return OnRecvPrivateChatChannelMessage(nSubCmd, pData, nLen);
#endif
#if defined( PRE_ALTEIAWORLD_EXPLORE )
case CS_ALTEIAWORLD: return OnRecvWorldAlteiaMessage(nSubCmd, pData, nLen);
#endif // #if defined( PRE_ALTEIAWORLD_EXPLORE )
#if defined(PRE_ADD_DWC)
case CS_DWC: return OnRecvDWCMessage(nSubCmd, pData, nLen);
#endif
#if defined(PRE_ADD_CHAT_MISSION)
case CS_MISSION: return OnRecvMissionMessage(nSubCmd, pData, nLen);
#endif
}
g_Log.Log(LogType::_ERROR, this, L"Report|[ADBID:%u, SID:%u] [MCMD:%d] [SCMD:%d] MessageProcess UNKNOWN_HEADER\n", m_nAccountDBID, GetSessionID(), nMainCmd, nSubCmd);
return ERROR_UNKNOWN_HEADER;
}
int CDNUserSession::OnRecvSystemMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case CS_CONNECTVILLAGE:
{
if (sizeof(CSConnectVillage) != nLen)
return ERROR_INVALIDPACKET;
CSConnectVillage *pConnectVillage = (CSConnectVillage*)pData;
_wcscpy(m_wszVirtualIp, _countof(m_wszVirtualIp), pConnectVillage->wszVirtualIp, IPLENMAX);
MAKE_STRINGW(m_wszVirtualIp); // 20090923 <20><><EFBFBD><EFBFBD>(b4nfter)
WideCharToMultiByte(CP_ACP, 0, m_wszVirtualIp, -1, m_szVirtualIp, IPLENMAX, NULL, NULL);
#if defined(_KR)
memcpy(m_szMID, pConnectVillage->szMID, sizeof(m_szMID));
m_dwGRC = pConnectVillage->dwGRC;
#endif
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϰ<C6B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʸ<EFBFBD> <20>̵<EFBFBD>
if (m_bChangeSameServer)
{
if ( !g_pMasterConnection )
{
DetachConnection(L"Connect|MasterConnection Invalid");
return ERROR_GENERIC_UNKNOWNERROR;
}
const sChannelInfo* pChannelInfo = g_pMasterConnection->GetChannelInfo( GetChannelID() );
if( !pChannelInfo )
{
DetachConnection(L"Connect|ChannelInfo not found");
return ERROR_GENERIC_UNKNOWNERROR;
}
if (GetPartyID() > 0 && m_bPartyInto == false)
{
CDNParty* pParty = g_pPartyManager->GetParty(GetPartyID());
if (pParty)
{
pParty->SetChannelID( GetChannelID() );
#if defined( PRE_PARTY_DB )
#else
g_pPartyManager->PushWaitPartyList(pParty);
#endif // #if defined( PRE_PARTY_DB )
}
else
_DANGER_POINT();
}
SendConnectVillage(ERROR_NONE, pChannelInfo->nChannelAttribute, m_bPartyInto);
m_bPartyInto = false;
m_eUserState = STATE_NONE;
}
else {
if (pConnectVillage->nSessionID > 0){
if (this->GetSessionID() > 0 && this->GetSessionID() != pConnectVillage->nSessionID)
{
DetachConnection(L"Connect|Invalid SessionID");
return ERROR_GENERIC_UNKNOWNERROR;
}
if (g_pUserSessionManager->FindUserSessionByAccountDBID(pConnectVillage->nAccountDBID) != NULL)
{
DetachConnection(L"Connect|Duplicate AccountDBID");
return ERROR_GENERIC_UNKNOWNERROR;
}
if (g_pUserSessionManager->FindUserSession(pConnectVillage->nSessionID) != NULL)
{
DetachConnection(L"Connect|Duplicate SessionID");
return ERROR_GENERIC_UNKNOWNERROR;
}
SetSessionID(pConnectVillage->nSessionID);
if (!g_pUserSessionManager->InsertTempSession(this))
{
DetachConnection(L"Connect|Duplicate TempSession");
return ERROR_GENERIC_UNKNOWNERROR;
}
m_bCertified = false;
g_pAuthManager->QueryCheckAuth(GetDBConnection(), pConnectVillage->biCertifyingKey, GetDBThreadID(), pConnectVillage->nAccountDBID, GetSessionID());
}
else
{
DetachConnection(L"Connect|AccountDBID invalid");
return ERROR_GENERIC_UNKNOWNERROR;
}
}
return ERROR_NONE;
}
break;
case CS_VILLAGEREADY:
{
if (sizeof(CSVillageReady) != nLen)
return ERROR_INVALIDPACKET;
CSVillageReady *pReady = (CSVillageReady*)pData;
if (GetChannelID() <= 0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> VIMA_CHECKUSER <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28≯޼<CCB8><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>) <20>߻<EFBFBD>
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
m_bFirst = pReady->boFirst; // bofirst<73><74> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 080728 saset
m_bChannelMove = pReady->boChannelMove;
const sChannelInfo * pChanInfo = g_pMasterConnection->GetChannelInfo(GetChannelID());
if (pChanInfo && GetMapIndex() != pChanInfo->nMapIdx)
{
SetMapIndex(pChanInfo->nMapIdx);
SetLastMapIndex(pChanInfo->nMapIdx);
}
SendMapInfo(GetMapIndex(), 0, 0, 0, GetChannelID(), pChanInfo?pChanInfo->nChannelIdx:0, pChanInfo? pChanInfo->nMeritBonusID : 0);
return ERROR_NONE;
}
break;
case CS_RECONNECTLOGIN:
{
if (m_eUserState == STATE_MOVETOLOGIN){
g_Log.Log(LogType::_ERROR, this, L"[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [CS_RECONNECTLOGIN] STATE_MOVETOLOGIN\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
return ERROR_NONE;
}
if (g_pMasterConnection->GetActive() == false)
SendReconnectLogin(ERROR_GENERIC_MASTERCON_NOT_FOUND, 0, 0);
else
g_pMasterConnection->SendLoginState(GetSessionID());
return ERROR_NONE;
}
break;
case CS_MOVE_PVPVILLAGETOLOBBY:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
return _RecvMovePvPVillageToLobby();
}
case CS_MOVE_PVPLOBBYTOPVPVILLAGE:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
return _RecvMovePvPLobbyToPvPVillage();
}
}
return CDNUserBase::OnRecvSystemMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvCharMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case CS_ENTER:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
CheckInitializeSchedule();
if (m_bFirst) {
#if defined( PRE_ADD_CHARACTERCHECKSUM )
if( 0 != m_uiDBCheckSum && m_uiDBCheckSum != m_uiRestoreCheckSum ) {
if( GetDBConnection() ) {
#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>.
//GetDBConnection()->QueryAddRestraint(this, DBDNWorldDef::RestraintTargetCode::Account, DBDNWorldDef::RestraintTypeCode::ConnectRestraint, wszRestraintReason.c_str(), wszRestraintReasonForDolis.c_str(), 9999);
}
g_Log.Log(LogType::_ERROR, this, L"Invalid Character CheckSum(restorechecksum:%x, dbchecksum:%x)\r\n", m_uiRestoreCheckSum, m_uiDBCheckSum );
//DetachConnection(L"QUERY_SELECTCHARACTER Invalid Character CheckSum");
//return ERROR_NONE;
}
#endif // #if defined( PRE_ADD_CHARACTERCHECKSUM )
m_pAppellation->CheckCollectionBookReward();
if( GetDBConnection() ){
GetDBConnection()->QueryLoginCharacter( this );
#if defined(_KRAZ)
m_pDBCon->QueryActozUpdateCharacterInfo(this, ActozCommon::UpdateType::Login);
#endif // #if defined(_KRAZ)
}
#if defined( PRE_PARTY_DB )
SetPartyID(0);
ModCommonVariableData( CommonVariable::Type::MOVESERVER_PARTYID, 0 );
#endif // #if defined( PRE_PARTY_DB )
}
#if defined( PRE_PARTY_DB )
if( GetPartyID() > 0 && !m_bFirst )
{
SetPartyData( GetPartyID() );
}
#endif
#if defined(PRE_ADD_TRANSFORM_POTION)
if( m_nTransformID > 0)
{
m_dwTransformTick = 0;
m_nTransformID = 0;
SendChangeTransform( GetSessionID(),0,0);
}
#endif
if( m_bChannelMove ) {
AddSendData( SC_CHAR, eChar::SC_ENTER, NULL, 0 );
}
else {
GetAppellation()->SetPCBang();
#if defined (PRE_ADD_BESTFRIEND)
m_pBestFriend->CheckAndSendData();
#endif
#if defined(PRE_ADD_PCBANG_RENTAL_ITEM)
if( m_bFirst )
m_bDeletePCRentalItem = GetItem()->RemovePCBangRentalItem(false);
#endif
SendEnter(this);
SendEquipList( m_pItem );
SendVehicleEquipList(m_pItem->GetVehicleEquip());
SendPetEquipList(m_pItem->GetPetEquip());
}
#if defined(PRE_ADD_EQUIPLOCK)
SendLockItems(m_pItem);
#endif // #if defined(PRE_ADD_EQUIPLOCK)
#if defined( PRE_PVP_GAMBLEROOM )
m_pDBCon->QueryGetPetalBalance(this);
#endif
// PvP<76>κ񿡼<CEBA><F1BFA1BC><EFBFBD> <20>Ʒ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾƵ<CABE> <20>ȴ<EFBFBD>.
CDNField* pField = g_pFieldManager->GetField( GetChannelID() );
if( pField )
{
if (m_bIsChannelCounted == false)
{
g_pUserSessionManager->IncreaseChannelUserCount(GetChannelID());
m_bIsChannelCounted = true;
}
else
_DANGER_POINT();
if( pField->bIsPvPLobby() )
{
if( LadderSystem::CManager::GetInstance().OnReconnect( this ) == false )
{
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendPvPEnterLobby( GetAccountDBID(), GetChannelID() );
}
m_bLoadUserData = true; // <20>ε<EFBFBD><CEB5>Ϸ<EFBFBD>
#if defined(PRE_ADD_PVPLEVEL_MISSION)
if( GetLastServerType() == SERVERTYPE_GAME )
GetEventSystem()->OnEvent( EventSystem::OnPvPLevelChange );
m_cLastServerType = SERVERTYPE_MAX;
#endif
return ERROR_NONE;
}
}
else
{
//<2F>ʵ尡(ä<><C3A4><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <20>Ƹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DetachConnection(L"Connect|Enterworld fail [Field NotFound]");
return ERROR_NONE;
}
if (m_bFirst) {
#ifdef _PACKET_COMP
//ULONG nPreTick = timeGetTime();
//SetPacketComp(true);
#endif
#if defined( PRE_USA_FATIGUE )
SendChannelInfoFatigueInfo();
#endif // #if defined( PRE_USA_FATIGUE )
#ifdef _USE_VOICECHAT
SendVoiceChatInfo(g_Config.szPublicDolbyIp, g_Config.nControlPort, g_Config.nAudioPort, m_nAccountDBID); // dolby info
#endif
SendWarehouseList(m_UserData.Status.nWarehouseCoin, m_pItem);
#if defined(PRE_PERIOD_INVENTORY)
SendPeriodWarehouse(m_pItem->IsEnablePeriodWarehouse(), m_pItem->GetPeriodWarehouseExpireDate());
#endif // #if defined(PRE_PERIOD_INVENTORY)
#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() );
SendQuestInvenList(m_pItem);
SendCashGestureList();
SendEffectItemGestureList();
SendMissionList(m_UserData.Mission.nMissionScore, m_UserData.Mission.MissionGain, m_UserData.Mission.MissionAchieve, m_UserData.Mission.wLastMissionAchieve);
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)
SendGuildWarBuyedItemList(m_GuildWarBuyedItem);
if (m_pRestraint) m_pRestraint->SendRestraintList();
SendKeySetting( &m_KeySetting );
SendPadSetting( &m_PadSetting );
SendNestClear(m_UserData.Status.NestClear);
#ifdef _PACKET_COMP
//SetPacketComp(false);
//printf("Test %d", timeGetTime() - nPreTick);
#endif
#if defined(_KR) || defined(_TH) || defined(_ID)
g_pMasterConnection->SendPCBangResult(m_nAccountDBID);
#endif // _KR
#if defined( PRE_ADD_SECONDARY_SKILL )
if( m_pSecondarySkillRepository )
m_pSecondarySkillRepository->SendList();
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
SendPvPLadderScoreInfo( &m_PvPLadderScoreInfo );
if (!GetGuildUID().IsSet())
GuildRecruitSystem::CCacheRepository::GetInstance().GetMyGuildRecruit( this );
#if defined( PRE_ADD_NOTIFY_ITEM_COMPOUND )
m_pCommonVariable->SendCommonVariableData(CommonVariable::Type::NotifyCompound);
#endif
if( pField->GetChannelAtt()&GlobalEnum::CHANNEL_ATT_USELASTMAPINDEX )
{
ModCommonVariableData( CommonVariable::Type::LastPartyDungeonInfo, 0 );
}
else
{
INT64 biValue=0;
if( GetCommonVariableDataValue( CommonVariable::Type::LastPartyDungeonInfo, biValue) == true && biValue > 0 )
g_pMasterConnection->SendCheckLastDungeonInfo( this, biValue );
}
#if defined( PRE_ADD_LIMITED_SHOP )
#if defined( PRE_FIX_74404 )
SendLimitedShopItemData(m_LimitedShopBuyedItemList, true);
#else // #if defined( PRE_FIX_74404 )
SendLimitedShopItemData(m_LimitedShopBuyedItem, true);
#endif // #if defined( PRE_FIX_74404 )
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
if(GetPrivateChannelID() > 0)
{
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( GetWorldSetID(), GetPrivateChannelID() );
if(pPrivateChatChannel)
{
if(pPrivateChatChannel->bIsLoaded())
m_pDBCon->QueryAddPrivateChatChannelMember( m_pSession, GetPrivateChannelID(), PrivateChatChannel::Common::EnterMember );
else
{
m_pDBCon->QueryGetPrivateChatChannelMember( m_pSession, GetPrivateChannelID() );
}
}
else
SetPrivateChannelID(0);
}
#endif
#if defined( PRE_ADD_STAMPSYSTEM )
if(m_pStampSystem)
m_pStampSystem->SendInitData();
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
}
else // if (m_bFirst)
{
#if defined( PRE_PARTY_DB )
TPARTYID PartyID = 0;
GetCommonVariableDataValue( CommonVariable::Type::MOVESERVER_PARTYID, PartyID );
if( PartyID > 0 )
{
CDNParty* pParty = g_pPartyManager->GetParty( PartyID );
if( pParty )
{
CSJoinParty TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.PartyID = PartyID;
TxPacket.iPassword = pParty->GetPassword();
OnRecvPartyMessage( CS_JOINPARTY, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
}
else
{
SendJoinParty( ERROR_PARTY_JOINFAIL, 0, NULL );
}
ModCommonVariableData( CommonVariable::Type::MOVESERVER_PARTYID, 0 );
}
#endif // #if defined( PRE_PARTY_DB )
GetDBConnection()->QueryMapInfo(this);
//<2F>̵<EFBFBD><CCB5><EFBFBD> <20>ʱ⿡ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20>̰<EFBFBD><CCB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD> <20><>Ÿ<EFBFBD>ֿ̹<CCB9> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><> <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.
if (GetPartyID() > 0){
CDNParty * pParty = g_pPartyManager->GetParty(GetPartyID());
if (pParty != NULL)
{
pParty->SendAllRefreshGateInfo(); // <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~
pParty->SendAllRefreshParty(PARTYREFRESH_RETURNVILLAGE); // <20>µǴϱ<C7B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pParty->SendPartyMemberMoveEachOther(GetSessionID(), m_BaseData.TargetPos.nX, m_BaseData.TargetPos.nY, m_BaseData.TargetPos.nZ);
}
}
//hide show <20><><EFBFBD><20><><EFBFBD>߱<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20>ڱ<EFBFBD><DAB1>ڽſ<DABD><C5BF>Ը<EFBFBD> <20><><EFBFBD><EFBFBD>
if ((GetAccountLevel() >= AccountLevel_New && GetAccountLevel() <= AccountLevel_Developer) && m_bHide == false)
SendHide(GetSessionID(), m_bHide);
#if defined( PRE_PRIVATECHAT_CHANNEL )
if(GetPrivateChannelID() > 0)
{
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( GetWorldSetID(), GetPrivateChannelID() );
if(pPrivateChatChannel)
{
if( pPrivateChatChannel->bIsLoaded() )
{
if( pPrivateChatChannel->CheckPrivateChannelMember(GetCharacterDBID()) )
{
pPrivateChatChannel->SetPrivateChannelMemberAccountDBID(GetAccountDBID(), GetCharacterDBID());
SendPrivateChatChannel(pPrivateChatChannel);
m_pDBCon->QueryModPrivateMemberServerID( m_pSession );
}
}
else
{
m_pDBCon->QueryGetPrivateChatChannelMember( m_pSession, GetPrivateChannelID() );
}
}
else
SetPrivateChannelID(0);
}
#endif
}
SendInvenList(m_pItem);
#if defined(PRE_PERIOD_INVENTORY)
SendPeriodInventory(m_pItem->IsEnablePeriodInventory(), m_pItem->GetPeriodInventoryExpireDate());
#endif // #if defined(PRE_PERIOD_INVENTORY)
ModifyCompleteQuest();
//<2F>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϴ<C6B4><CFB4><EFBFBD><EFBFBD><EFBFBD> Īȣ<C4AA><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD> <20>ű<EFBFBD>
SendAppellationList(m_UserData.Appellation.Appellation);
GetAppellation()->SendPeriodAppellationTime();
#if defined( PRE_ADD_NEWCOMEBACK )
GetAppellation()->CheckComebackAppellation( GetAppellationData()->nSelectAppellation, GetAppellationData()->nCoverAppellation );
#endif
if( g_pDataManager->GetEveryDayEventRewardMailID(1) ) //<2F><20>̺<EFBFBD>Ʈ <20><EFBFBD><E2B0A3><EFBFBD><EFBFBD> <20>Լ<EFBFBD> ȣ<><C8A3>
UpdateAttendanceEventData(false);
if( GetAppellation()->CheckResetPcbangAppellation() )
{
//<2F>Ǿ<EFBFBD><C7BE><EFBFBD> Īȣ <20>ʱ<EFBFBD>ȭ <20>˸<EFBFBD>
GetAppellation()->SetResetPcbangAppellation(false);
SendResetPcbangAppellation();
}
SendGlyphExpireData(m_pItem->GetGlyphExpireDate());
#if defined(PRE_ADD_TALISMAN_SYSTEM)
SendTalismanExpireData(m_pItem->IsTalismanCashSlotEntend(), m_pItem->GetTalismanExpireDate());
#endif
SendPvPGhoulScores(&m_PvPTotalGhoulScores);
// Cash Inventory
m_pDBCon->QueryGetPageMaterializedItem(GetDBThreadID(), this, 1, CASHINVENTORYPAGEMAX);
// Vehicle Inventory
m_pDBCon->QueryGetPageVehicle(this, 1, VEHICLEINVENTORYPAGEMAX);
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
// Payment Inventory
m_pDBCon->QueryGetListRefundableProducts(this);
#endif //#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
SetGuildWarScheduleID(g_pGuildWarManager->GetScheduleID());
if( g_pGuildWarManager->GetScheduleID() != 0 )
{
SendGuildWarEventTime(g_pGuildWarManager->GetGuildWarSchedule(), g_pGuildWarManager->GetGuildWarFinalSchedule(), g_pGuildWarManager->GetFinalProgress());
}
if (GetGuildUID().IsSet())
{
CDNGuildBase* pGuild = g_pGuildManager->At(GetGuildUID());
if( pGuild && pGuild->IsEnrollGuildWar() )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( g_pGuildWarManager->GetStepIndex() == GUILDWAR_STEP_TRIAL || g_pGuildWarManager->GetStepIndex() == GUILDWAR_STEP_REWARD )
{
m_pDBCon->QueryGetGuildWarPoint(m_cDBThreadID, GetWorldSetID(), m_nAccountDBID, 'C', m_biCharacterDBID);
}
}
// <20><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ?
if( g_pGuildWarManager->GetPreWinGuildUID() == GetGuildUID() )
SendGuildWarPreWinGuild(true);
if(pGuild)
{
TGuildRewardItem *RewardItemInfo;
RewardItemInfo = pGuild->GetGuildRewardItem();
SendGuildRewardItem(RewardItemInfo);
#if defined(PRE_ADD_GUILD_CONTRIBUTION)
m_pDBCon->QueryGetGuildContributionPoint( m_cDBThreadID, m_nWorldSetID, GetAccountDBID(), GetCharacterDBID());
#endif // #if defined(PRE_ADD_GUILD_CONTRIBUTION)
}
}
SendGuildWarFestivalPoint();
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
SendTotalLevel(GetSessionID(), m_nTotalLevelSKillLevel);
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));
}
SendTotalLevelSkillList(GetSessionID(), m_nTotalLevelSKillData);
#endif
m_bLoadUserData = true; // <20>ε<EFBFBD><CEB5>Ϸ<EFBFBD>
m_pTimeEventSystem->RequestSyncTimeEvent();
// PvP<76><50><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
SendPvPData( m_UserData.PvP );
m_pDBCon->GetCountReceiveMail(this); // <20><><EFBFBD><EFBFBD> ī<><C4AB>Ʈ <20><>û
m_pDBCon->QueryNotifyGift(this, false); // <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><>û
#if defined(PRE_SPECIALBOX)
m_pDBCon->QueryGetCountEventReward(this); // Ư<><C6AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ <20><>û
#endif // #if defined(PRE_SPECIALBOX)
m_pDBCon->QueryGetCountHarvestDepotItem( this ); // <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> ī<><C4AB>Ʈ <20><>û
#ifdef PRE_ADD_BEGINNERGUILD
m_pDBCon->QueryGetWillSendMails(this);
#endif //#ifdef PRE_ADD_BEGINNERGUILD
#if defined( PRE_ALTEIAWORLD_EXPLORE )
SendAlteiaWorldJoinInfo( m_cWeeklyPlayCount, m_cDailyPlayCount, m_cTicketCount );
#endif
// OnMissionEvent
GetEventSystem()->OnEvent( EventSystem::OnDungeonEnter );
#if defined(PRE_ADD_DWC)
if( IsDWCCharacter() )
SendDWCChannelInfo();
#endif
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ӽ<EFBFBD>
if( GetLastServerType() == SERVERTYPE_LOGIN )
{
if(GetGuildUID().IsSet()) //<2F><><EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><>ġ<EFBFBD><C4A1>
{
CDNGuildBase* pGuild = g_pGuildManager->At(GetGuildUID());
if (pGuild && pGuild->GetInfo()->cGuildType != BeginnerGuild::Type::Beginner) //<2F>ʺ<EFBFBD><CABA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Թ̼<D4B9> <20>ȵ<EFBFBD>
GetEventSystem()->OnEvent( EventSystem::OnGuildJoin );
}
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendMasterSystemSyncConnect( true, GetCharacterName(), GetMasterSystemData() );
if(GetGuildUID().IsSet())
{
g_pMasterConnection->SendChangeGuildMemberInfo(GetGuildUID(), GetAccountDBID(), GetCharacterDBID(), GetAccountDBID(), GetCharacterDBID(), GUILDMEMBUPDATE_TYPE_LOGINOUT, _LOCATION_MOVE, 0, 0, NULL, true);
CDNGuildBase* pGuild = g_pGuildManager->At(GetGuildUID());
if (pGuild)
{
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
#endif
#if defined( PRE_ADD_NODELETEGUILD )
if (pGuild->GetRecvAllMember())
{
SendGetGuildInfo(pGuild, ERROR_NONE);
SendGetGuildMember(pGuild, ERROR_NONE);
}
#else // #if defined( PRE_ADD_NODELETEGUILD )
if (TRUE == pGuild->IsEnable() && pGuild->GetRecvAllMember())
{
SendGetGuildInfo(pGuild, ERROR_NONE);
SendGetGuildMember(pGuild, ERROR_NONE);
}
#endif // #if defined( PRE_ADD_NODELETEGUILD )
}
}
}
OnMasterSystemEvent( MasterSystem::EventType::VillageFirstConnect );
GetEventSystem()->OnEvent( EventSystem::OnJobChange );
#if defined(PRE_ADD_REMOTE_QUEST)
GetQuest()->OnEvent(EventSystem::OnQuestClear); //<2F><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1>ν<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>Ʈ Ÿ<><C5B8><EFBFBD><EFBFBD> üũ<C3BC>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#endif
#if defined(PRE_ADD_DWC)
if( IsDWCCharacter() )
{
if( GetDWCTeamID() > 0 && g_pDWCTeamManager )
{
CDnDWCTeam* pDWCTeam = g_pDWCTeamManager->GetDWCTeam(GetDWCTeamID());
if(pDWCTeam && pDWCTeam->GetRecvMemberList())
{ // CDnDWCTeam::UpdateMemberList <20><><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>ȴ<EFBFBD>.
//g_pDWCTeamManager->RegistDWCCharacter(GetCharacterDBID(), GetDWCTeamID());
// SendGetDWCTeamInfo(pDWCTeam, ERROR_NONE);
// SendGetDWCTeamMember(pDWCTeam, ERROR_NONE);
TCommunityLocation Location;
Location.Reset();
Location.cServerLocation = _LOCATION_MOVE;
pDWCTeam->ChangeDWCTeamMemberState(GetCharacterDBID(), &Location, true);
std::vector<INT64> vecMemberList;
pDWCTeam->GetMemberCharacterDBIDList(vecMemberList);
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendDWCTeamMemberList(GetAccountDBID(), GetDWCTeamID(), vecMemberList);
}
else
SendGetDWCTeamInfo(NULL, ERROR_DWC_NOTEXIST_TEAMINFO);
}
else
SendGetDWCTeamInfo(NULL, ERROR_DWC_HAVE_NOT_TEAM);
}
#endif
}
SendMasterSystemSimpleInfo( m_MasterSystemData.SimpleInfo );
#if defined(PRE_ADD_PVPLEVEL_MISSION)
if( GetLastServerType() == SERVERTYPE_LOGIN || GetLastServerType() == SERVERTYPE_GAME )
GetEventSystem()->OnEvent( EventSystem::OnPvPLevelChange );
#endif
#if defined(PRE_ADD_MISSION_COUPON)
if( GetExpiredPetID() > 0 )
{
GetEventSystem()->OnEvent( EventSystem::OnPetExpired, 1, EventSystem::ItemID, GetExpiredPetID() );
SetExpiredPetID(0);
}
#endif
#if defined( PRE_ADD_VIP_FARM )
if( GetEffectRepository() )
GetEffectRepository()->SendEffectItem();
#endif // #if defined( PRE_ADD_VIP_FARM )
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
_ASSERT( m_pReputationSystem && m_pReputationSystem->GetEventHandler() );
m_pReputationSystem->GetEventHandler()->OnConnect( 0, true );
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
#if defined( PRE_ADD_NEW_MONEY_SEED )
SendSeedPoint();
#endif
m_cLastServerType = SERVERTYPE_MAX;
m_bSecurityUpdate = true;
#if defined(_WORK)
wstring wszString = FormatW(L"<EFBFBD><EFBFBD> <20>̵<EFBFBD> -> ID:[%d]\r\n", GetStatusData()->nMapIndex);
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
#endif
return ERROR_NONE;
}
break;
case CS_COMPLETELOADING:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
if (!EnterWorld()){
DetachConnection(L"Connect|Enterworld fail");
g_Log.Log(LogType::_ERROR, this, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [CS_CHAR_ENTER] Enterworld fail!! Char:%u\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
return ERROR_GENERIC_UNKNOWNERROR;
}
#ifdef _FINAL_BUILD
if (GetAccountLevel() < AccountLevel_New && GetField()->GetPermitLevel() > 0)
{ //<2F><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϽø<CFBD>
if (GetField()->GetPermitLevel() > GetLevel())
{
#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 6474, m_eSelectedLanguage);
std::wstring wszRestraintReasonForDolis = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 6475, m_eSelectedLanguage);
#else //#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 6474);
std::wstring wszRestraintReasonForDolis = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 6475);
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
m_pDBCon->QueryAddRestraint(m_pSession, DBDNWorldDef::RestraintTargetCode::Account, DBDNWorldDef::RestraintTypeCode::ConnectRestraint, wszRestraintReason.c_str(), wszRestraintReasonForDolis.c_str(), 30);
DetachConnection(L"Connect|PermitLevel fail");
g_Log.Log(LogType::_ERROR, this, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [CS_CHAR_ENTER] PermitLevel fail!! Char:%u\r\n", m_nAccountDBID, m_biCharacterDBID, GetSessionID(), m_BaseData.nObjectID);
return ERROR_GENERIC_UNKNOWNERROR;
}
}
#endif
if (g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendEnterVillage(GetAccountDBID(), m_pField->GetChnnelID());
else
{
DetachConnection(L"Connect|MasterCon Not Found");
return ERROR_NONE;
}
m_bCharOutLog = true; // leave<76>Ҷ<EFBFBD> log <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TNoticeInfo Notice;
memset(&Notice, 0, sizeof(Notice));
if (g_pNoticeSystem)
{
g_pNoticeSystem->GetNotice(m_pField->GetChnnelID(), m_pField->GetMapIndex(), Notice);
if (Notice.nCreateTime > 0)
SendNotice(Notice.wszMsg, (int)wcsnlen(Notice.wszMsg, CHATLENMAX), Notice.TypeInfo.nSlideShowSec);
}
if (g_pCloseSystem)
{
__time64_t _tNow, _tOderedTime, _tCloseTime;
if (g_pCloseSystem->IsClosing(_tOderedTime, _tCloseTime))
{
time(&_tNow);
SendCloseService(_tNow, _tOderedTime, _tCloseTime);
}
}
#ifdef PRE_ADD_COMEBACK
if (m_bComebackUser)
{
if (m_pDBCon)
{
m_pDBCon->QueryModLastConnectDate(this);
#if defined( PRE_ADD_NEWCOMEBACK )
m_pDBCon->QueryModComebackFlag(this, false);
#endif
}
bool bComebackSended = false;
TLevelupEvent ComebackMail;
int nComebackMailID = 0;
if (g_pDataManager->GetLevelupEventbyType(GetLevel(), TLevelupEvent::CombackUser, ComebackMail))
{
nComebackMailID = ComebackMail.nMailID > 0 ? ComebackMail.nMailID : ComebackMail.nCashMailID;
if (nComebackMailID > 0)
{
CDNMailSender::Process(this, nComebackMailID, DBDNWorldDef::PayMethodCode::Comeback);
bComebackSended = true;
g_Log.Log(LogType::_COMEBACK, this, L"AccountDBID[%d] ComebackUser!! MailSended! MailID[%d]\n", GetAccountDBID(), nComebackMailID);
m_bComebackUser = false;
}
else
_DANGER_POINT_MSG(L"nComebackMailID error");
}
else
_DANGER_POINT_MSG(L"GetLevelupEventbyType return false");
#if defined( PRE_ADD_NEWCOMEBACK )
// <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>ֱ<EFBFBD>
int nCombackEffectItemID = (int)CGlobalWeightIntTable::GetInstance().GetValue(CGlobalWeightIntTable::ComebackEffectItemID);
if(nCombackEffectItemID > 0)
{
TItemData* pItemData = g_pDataManager->GetItemData(nCombackEffectItemID);
if( pItemData && GetItem() )
{
TItem NewItem = {0,};
GetItem()->MakeItemStruct(pItemData->nItemID, NewItem, (int)CGlobalWeightIntTable::GetInstance().GetValue(CGlobalWeightIntTable::ComebackGiveTerm), 0);
if( GetEffectRepository()->Add( NewItem.nSerial, pItemData->nItemID, NewItem.tExpireDate ))
{
GetDBConnection()->QueryAddEffectItems(m_pSession, pItemData->nItemID, DBDNWorldDef::EffectItemLifeSpanType::New, DBDNWorldDef::EffectItemGetCode::Cash, 0, 0,
NewItem.bEternity, NewItem.nLifespan, NewItem.nSerial, 0);
}
}
}
TLevelupEvent ComebackInven;
if (g_pDataManager->GetLevelupEventbyType(GetLevel(), TLevelupEvent::ComeBackUserInven, ComebackInven))
{
CheckComebackRewardItem( ComebackInven );
bComebackSended = true;
m_bComebackUser = false;
}
#endif
if (bComebackSended == false)
{
g_Log.Log(LogType::_COMEBACK, this, L"AccountDBID[%d] ComebackUser!! MailSen Failed!! MailID[%d] Level[%d]\n", GetAccountDBID(), nComebackMailID, GetLevel());
}
}
#endif //#ifdef PRE_ADD_COMEBACK
#if defined( PRE_ADD_GAMEQUIT_REWARD )
if(m_bReConnectUserReward)
{
m_bReConnectUserReward = false;
GetDBConnection()->QueryModNewbieRewardFlag(this, true);
g_Log.Log(LogType::_GAMEQUITREWARD, this, L"AccountDBID[%d] ReConnectNewbieReward(DB CHECK)\n", GetAccountDBID());
}
#endif // #if defined( PRE_ADD_GAMEQUIT_REWARD )
return ERROR_NONE;
}
break;
}
return CDNUserBase::OnRecvCharMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvActorMessage(int nSubCmd, char *pData, int nLen)
{
CSActorMessage *pActorMsg = (CSActorMessage*)pData;
m_ParamData.wActorProtocol = nSubCmd;
memcpy(&m_ParamData.Buffer, pActorMsg->cBuf, 128);
ScopeEncryptFlag Scope( &m_ParamData.bEncrypt );
EtVector3 vPos;
EtVector2 vDir, vLook;
CPacketCompressStream Stream(pActorMsg->cBuf, 128);
m_ParamData.dwSendSessionID = ( pActorMsg->nSessionID != 0 ) ? pActorMsg->nSessionID : GetSessionID(); // SendSessionID
switch(nSubCmd)
{
case CS_CMDMOVE:
{
Stream.Seek( sizeof(DWORD), SEEK_CUR, CPacketCompressStream::NOCOMPRESS );
Stream.Seek( sizeof(int), SEEK_CUR, CPacketCompressStream::INTEGER_SHORT );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Read( &vDir, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
m_BaseData.TargetPos.nX = (int)(vPos.x * 1000.f);
m_BaseData.TargetPos.nY = (int)(vPos.y * 1000.f);
m_BaseData.TargetPos.nZ = (int)(vPos.z * 1000.f);
m_BaseData.MoveDir.nX = (int)(vDir.x * 1000.f);
m_BaseData.MoveDir.nY = 0;
m_BaseData.MoveDir.nZ = (int)(vDir.y * 1000.f);
m_BaseData.fRotate = EtToDegree( acos( EtVec2Dot( &EtVector2( 0.f, 1.f ), &vLook ) ) );
m_ParamData.nBufSize = nLen;
SendFieldMessage(FM_MOVE);
if (GetPartyID() > 0){ // <20><>Ƽ<EFBFBD><C6BC> <20>ִٸ<D6B4>
CDNParty *pParty = g_pPartyManager->GetParty(GetPartyID());
if (pParty){
pParty->SendPartyMemberMove(GetSessionID(), vPos);
}
#ifdef _USE_VOICECHAT
m_nVoiceRotate = (int)EtToDegree( acos( EtVec2Dot( &EtVector2( 0.f, 1.f ), &vDir ) ) );
if ( vDir.x > 0.0f )
m_nVoiceRotate = 360 - m_nVoiceRotate;
m_nVoiceRotate = (m_nVoiceRotate + 90) % 360;
SetVoicePos((int)vPos.x, (int)vPos.y, (int)vPos.z, m_nVoiceRotate);
#endif
}
CheckValidCollisionHeight();
return ERROR_NONE;
}
break;
case CS_CMDMOVEPOS:
{
Stream.Seek( sizeof(DWORD), SEEK_CUR, CPacketCompressStream::NOCOMPRESS );
Stream.Seek( sizeof(int), SEEK_CUR, CPacketCompressStream::INTEGER_SHORT );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Seek( sizeof(EtVector3), SEEK_CUR, CPacketCompressStream::VECTOR3_BIT );
Stream.Read( &vDir, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
m_BaseData.TargetPos.nX = (int)(vPos.x * 1000.f);
m_BaseData.TargetPos.nY = (int)(vPos.y * 1000.f);
m_BaseData.TargetPos.nZ = (int)(vPos.z * 1000.f);
m_BaseData.MoveDir.nX = (int)(vDir.x * 1000.f);
m_BaseData.MoveDir.nY = 0;
m_BaseData.MoveDir.nZ = (int)(vDir.y * 1000.f);
m_BaseData.fRotate = EtToDegree( acos( EtVec2Dot( &EtVector2( 0.f, 1.f ), &vDir ) ) );
m_ParamData.nBufSize = nLen;
SendFieldMessage(FM_MOVE);
if (GetPartyID() > 0){ // <20><>Ƽ<EFBFBD><C6BC> <20>ִٸ<D6B4>
CDNParty *pParty = g_pPartyManager->GetParty(GetPartyID());
if (pParty){
pParty->SendPartyMemberMove(GetSessionID(), vPos);
}
#ifdef _USE_VOICECHAT
m_nVoiceRotate = (int)EtToDegree( acos( EtVec2Dot( &EtVector2( 0.f, 1.f ), &vDir ) ) );
if( vDir.x > 0.0f )
m_nVoiceRotate = 360 - m_nVoiceRotate;
m_nVoiceRotate = (m_nVoiceRotate + 90) % 360;
SetVoicePos((int)vPos.x, (int)vPos.y, (int)vPos.z, (int)m_nVoiceRotate);
#endif
}
return ERROR_NONE;
}
break;
/*
case CS_POSREV:
{
bool bMoveVector;
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Seek( sizeof(DWORD), SEEK_CUR, CPacketCompressStream::NOCOMPRESS );
Stream.Read( &bMoveVector, sizeof(bool) );
m_BaseData.TargetPos.nX = (int)(vPos.x * 1000.f);
m_BaseData.TargetPos.nY = (int)(vPos.y * 1000.f);
m_BaseData.TargetPos.nZ = (int)(vPos.z * 1000.f);
if( bMoveVector ) {
Stream.Read( &vDir, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
m_BaseData.MoveDir.nX = (int)(vDir.x * 1000.f);
m_BaseData.MoveDir.nY = 0;
m_BaseData.MoveDir.nZ = (int)(vDir.y * 1000.f);
}
m_ParamData.nBufSize = nLen;
SendFieldMessage(FM_MOVE);
#ifdef _USE_VOICECHAT
//if( m_nPartyIndex > 0 )
//{
// CVoiceChatServer::GetInstance().SetPlayerPos( m_nAccountDBID, ( int )vPos.x, ( int )vPos.y, ( int )vPos.z, ( int )m_BaseData.fRotate );
//}
#endif
return ERROR_NONE;
}
break;
*/
case CS_CMDSTOP:
{
Stream.Seek( sizeof(DWORD), SEEK_CUR, CPacketCompressStream::NOCOMPRESS );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
m_BaseData.TargetPos.nX = (int)(vPos.x * 1000.f);
m_BaseData.TargetPos.nY = (int)(vPos.y * 1000.f);
m_BaseData.TargetPos.nZ = (int)(vPos.z * 1000.f);
m_BaseData.MoveDir.nX = 0;
m_BaseData.MoveDir.nY = 0;
m_BaseData.MoveDir.nZ = 0;
m_ParamData.nBufSize = nLen;
SendFieldMessage(FM_MOVE);
#ifdef _USE_VOICECHAT
SetVoicePos((int)vPos.x, (int)vPos.y, (int)vPos.z, (int)m_nVoiceRotate);
#endif
return ERROR_NONE;
}
break;
case CS_CMDTOGGLEBATTLE:
{
Stream.Read( &m_BaseData.bBattleMode, sizeof(bool) );
m_ParamData.nBufSize = nLen;
SendUserLocalMessage(0, FM_ACTORMSG);
return ERROR_NONE;
}
break;
case CS_CMDTOGGLEWEAPONORDER:
{
int nEquipIndex;
bool bEquipCash;
Stream.Read( &nEquipIndex, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Read( &bEquipCash, sizeof(bool) );
if( nEquipIndex == 0 || nEquipIndex == 1 ) {
SetViewCashEquipBitmap((char)(CASHEQUIP_WEAPON1 + nEquipIndex), bEquipCash);
}
m_ParamData.nBufSize = nLen;
SendUserLocalMessage(0, FM_ACTORMSG);
return ERROR_NONE;
}
break;
case CS_CMDTOGGLEPARTSORDER:
{
int nEquipIndex;
bool bEquipCash;
Stream.Read( &nEquipIndex, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Read( &bEquipCash, sizeof(bool) );
SetViewCashEquipBitmap((char)nEquipIndex, bEquipCash);
m_ParamData.nBufSize = nLen;
SendUserLocalMessage(0, FM_ACTORMSG);
if (GetPartyID() > 0) {
if( nEquipIndex == CASHEQUIP_HELMET || nEquipIndex == CASHEQUIP_EARRING || nEquipIndex == HIDEHELMET_BITINDEX ) {
g_pPartyManager->SendPartyMemberPart(GetPartyID(), this);
}
}
return ERROR_NONE;
}
break;
case CS_CMDESCAPE:
{
// <20>ð<EFBFBD>üũ <20><> <20><><EFBFBD>ְ<EFBFBD>..
DWORD dwCurTime = timeGetTime();
#ifndef _WORK
if( dwCurTime - m_dwLastEscapeTime < 1000 * 60 * 2 ) break;
#endif
m_dwLastEscapeTime = dwCurTime;
////////////////////////
TPosition Pos = { 0, };
char cGateNo = g_pFieldDataManager->GetRandomGateNo( m_UserData.Status.nMapIndex );
g_pFieldDataManager->GetStartPosition( m_UserData.Status.nMapIndex, cGateNo, Pos );
m_UserData.Status.nPosX = Pos.nX;
m_UserData.Status.nPosY = Pos.nY;
m_UserData.Status.nPosZ = Pos.nZ;
m_BaseData.CurPos = Pos;
m_BaseData.TargetPos = Pos;
EtVector3 vPos( Pos.nX / 1000.f, Pos.nY / 1000.f, Pos.nZ / 1000.f );
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
SendActorMsg( GetSessionID(), SC_CMDESCAPE, Stream.Size(), Stream.GetBuffer(), NULL );
}
break;
case CS_USESKILL:
{
int nSkillTableID;
bool bUseApplySkillItem = false;
Stream.Read( &nSkillTableID, sizeof(int) );
Stream.Seek( sizeof(char), SEEK_CUR, CPacketCompressStream::NOCOMPRESS );
Stream.Read( &bUseApplySkillItem, sizeof(bool) );
if( !bUseApplySkillItem ) {
if( GetSkill()->FindSkill( nSkillTableID ) == false )
return ERROR_NONE;
}
else {
if( GetLastUseItemSkillID() != nSkillTableID )
return ERROR_NONE;
}
int iCoolTime = g_pDataManager->GetSkillDelayTime( nSkillTableID, GetSkill()->GetSkillLevel(nSkillTableID) );
// <20>۷ι<DBB7> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִٸ<D6B4> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8> <20><>ü<EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int iGlobalCoolTime = g_pDataManager->GetSkillGlobalCoolTime( nSkillTableID );
if( 0 < iGlobalCoolTime )
iCoolTime = iGlobalCoolTime;
// <20>۷ι<DBB7><CEB9><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><>ų<EFBFBD><20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int iGlobalSkillGroupID = g_pDataManager->GetSkillGlobalGroupID( nSkillTableID );
if( 0 < iGlobalSkillGroupID )
{
const vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO>& vlPossessedSkill = GetSkill()->GetPossessedSkillInfo();
for( int i = 0; i <(int)vlPossessedSkill.size(); ++i )
{
int iNowGroupSkillID = vlPossessedSkill.at( i ).iSkillID;
int iNowGlobalSkillGroupID = g_pDataManager->GetSkillGlobalGroupID( iNowGroupSkillID );
if( 0 < iNowGlobalSkillGroupID )
{
if( iNowGlobalSkillGroupID == iGlobalSkillGroupID )
{
m_SkillCoolTime.Update( iNowGroupSkillID, timeGetTime() );
m_SkillCoolTime.AddCoolTime( iNowGroupSkillID, timeGetTime()+iCoolTime );
}
}
}
}
if( iCoolTime > 0 )
{
m_SkillCoolTime.Update( nSkillTableID, timeGetTime() );
m_SkillCoolTime.AddCoolTime( nSkillTableID, timeGetTime()+iCoolTime );
}
m_ParamData.nBufSize = nLen;
SendUserLocalMessage(0, FM_ACTORMSG);
return ERROR_NONE;
}
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
case CS_ADD_TOTAL_LEVEL_SKILL:
{
int nSlotIndex = -1;
int nSkillID = 0;
Stream.Read( &nSlotIndex, sizeof(int) );
Stream.Read( &nSkillID, sizeof(int) );
if(!m_pSession->AddTotalLevelSkillData(nSlotIndex, nSkillID))
{
break;
}
m_pSession->SendAddTotalLevelSkill(m_pSession->GetSessionID(), nSlotIndex, nSkillID);
}
break;
case CS_REMOVE_TOTAL_LEVEL_SKILL:
{
int nSlotIndex = -1;
Stream.Read( &nSlotIndex, sizeof(int) );
if( nSlotIndex < 0 || nSlotIndex >= TotalLevelSkill::Common::MAXSLOTCOUNT )
break;
m_pSession->AddTotalLevelSkillData(nSlotIndex, 0);
m_pSession->SendDelTotalLevelSkill(m_pSession->GetSessionID(), nSlotIndex);
}
break;
#endif
default:
m_ParamData.nBufSize = nLen;
SendUserLocalMessage(0, FM_ACTORMSG);
return ERROR_NONE;
break;
}
return ERROR_UNKNOWN_HEADER; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϵǾ<CFB5><C7BE><EFBFBD> <20>մϴ<D5B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD>!
}
int CDNUserSession::OnRecvPropMessage(int nSubCmd, char *pData, int nLen)
{
return ERROR_UNKNOWN_HEADER;
}
int CDNUserSession::OnRecvItemMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case CS_MOVEITEM:
{
if (sizeof(CSMoveItem) != nLen)
return ERROR_INVALIDPACKET;
CSMoveItem *pMove = (CSMoveItem*)pData;
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> Blind<6E><64><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if (!IsNoneWindowState() && !IsWindowState(WINDOW_BLIND))
{
int nRet = ERROR_ITEM_FAIL;
switch(pMove->cMoveType)
{
case MoveType_EquipToInven: nRet = ERROR_ITEM_EQUIPTOINVEN_FAIL; break;
case MoveType_InvenToEquip: nRet = ERROR_ITEM_INVENTOEQUIP_FAIL; break;
}
SendMoveItem(pMove->cMoveType, pMove->cSrcIndex, pMove->cDestIndex, NULL, NULL, nRet);
return ERROR_NONE;
}
m_pItem->OnRecvMoveItem(pMove);
return ERROR_NONE;
}
break;
case CS_MOVECASHITEM:
{
if (sizeof(CSMoveCashItem) != nLen)
return ERROR_INVALIDPACKET;
CSMoveCashItem *pMove = (CSMoveCashItem*)pData;
if (!IsNoneWindowState())
{
int nRet = ERROR_ITEM_FAIL;
switch(pMove->cMoveType)
{
case MoveType_CashEquipToCashInven:
{
nRet = ERROR_ITEM_EQUIPTOINVEN_FAIL;
break;
}
case MoveType_CashInvenToCashEquip:
{
nRet = ERROR_ITEM_INVENTOEQUIP_FAIL;
break;
}
case MoveType_VehicleBodyToVehicleInven:
case MoveType_VehicleInvenToVehicleBody:
case MoveType_VehiclePartsToCashInven:
case MoveType_CashInvenToVehicleParts:
{
nRet = ERROR_ITEM_INVENTOEQUIP_FAIL;
break;
}
case MoveType_PetInvenToPetBody:
{
nRet = ERROR_CANT_RECALL_PET_STATUS;
break;
}
}
SendMoveCashItem(pMove->cMoveType, pMove->cCashEquipIndex, NULL, pMove->biCashInvenSerial, NULL, nRet);
return ERROR_NONE;
}
m_pItem->OnRecvMoveCashItem(pMove);
return ERROR_NONE;
}
break;
#if defined(PRE_ADD_SERVER_WAREHOUSE)
case CS_MOVE_SERVERWARE :
{
if (sizeof(CSMoveServerWare) != nLen)
return ERROR_INVALIDPACKET;
CSMoveServerWare *pMove = (CSMoveServerWare*)pData;
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> Blind<6E><64><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if (!IsNoneWindowState() && !IsWindowState(WINDOW_BLIND))
{
int nRet = ERROR_ITEM_FAIL;
//SendMoveItem(pMove->cMoveType, pMove->cSrcIndex, pMove->cDestIndex, NULL, NULL, nRet);
return ERROR_NONE;
}
m_pItem->OnRecvMoveServerWareItem(pMove);
return ERROR_NONE;
}
break;
case CS_MOVE_CASHSERVERWARE :
{
if (sizeof(CSMoveCashServerWare) != nLen)
return ERROR_INVALIDPACKET;
CSMoveCashServerWare *pMove = (CSMoveCashServerWare*)pData;
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> Blind<6E><64><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if (!IsNoneWindowState() && !IsWindowState(WINDOW_BLIND))
{
int nRet = ERROR_ITEM_FAIL;
//SendMoveItem(pMove->cMoveType, pMove->cSrcIndex, pMove->cDestIndex, NULL, NULL, nRet);
return ERROR_NONE;
}
m_pItem->OnRecvMoveServerWareCashItem(pMove);
return ERROR_NONE;
}
break;
#endif
case CS_MOVEGUILDITEM:
{
#if defined(_CH)
if (GetLevel() <= 40){
SendMoveGuildItem(0, 0, 0, NULL, NULL, ERROR_GUILD_INVALIDWARE);
return ERROR_NONE;
}
#endif // #if defined(_CH)
if (sizeof(CSMoveGuildItem) != nLen)
return ERROR_INVALIDPACKET;
CSMoveGuildItem *pMove = (CSMoveGuildItem*)pData;
// <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> <20>;<EFBFBD><CDBE><EFBFBD>.
if (!IsWindowState(WINDOW_BLIND))
{
SendMoveGuildItem(pMove->cMoveType, 0, 0, NULL, NULL, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
{
SendMoveGuildItem(pMove->cMoveType, 0, 0, NULL, NULL, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
const TGuildUID GuildUID(GetGuildUID());
if (!GuildUID.IsSet())
{
SendMoveGuildItem(pMove->cMoveType, 0, 0, NULL, NULL, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD);
return ERROR_NONE;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
// <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if (!pGuild)
{
SendMoveGuildItem(pMove->cMoveType, 0, 0, NULL, NULL, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD);
return ERROR_NONE;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) return ERROR_NONE;
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
{
CDNGuildWare* pGuildWare = pGuildVillage->GetGuildWare();
if (pGuildWare)
pGuildWare->OnRecvMoveGuildItem(this, pMove);
else
SendMoveGuildItem(pMove->cMoveType, 0, 0, NULL, NULL, ERROR_GUILDWARE_NOT_READY);
}
}
break;
case CS_MOVEGUILDCOIN:
{
#if defined(_CH)
if (GetLevel() <= 40){
SendMoveGuildItem(0, 0, 0, NULL, NULL, ERROR_GUILD_INVALIDWARE);
return ERROR_NONE;
}
#endif // #if defined(_CH)
if (sizeof(CSMoveGuildCoin) != nLen)
return ERROR_INVALIDPACKET;
CSMoveGuildCoin *pMove = (CSMoveGuildCoin*)pData;
if (!IsWindowState(WINDOW_BLIND))
{
SendMoveGuildCoin(pMove->cMoveType, 0, 0, 0, 0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
{
SendMoveGuildItem(pMove->cMoveType, 0, 0, NULL, NULL, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
const TGuildUID GuildUID(GetGuildUID());
if (!GuildUID.IsSet())
{
SendMoveGuildCoin(pMove->cMoveType, 0, 0, 0, 0, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD);
return ERROR_NONE;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
// <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if (!pGuild)
{
SendMoveGuildCoin(pMove->cMoveType, 0, 0, 0, 0, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD);
return ERROR_NONE;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendMoveGuildCoin(pMove->cMoveType, 0, 0, 0, 0, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD);
return ERROR_NONE;
}
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
{
CDNGuildWare* pGuildWare = pGuildVillage->GetGuildWare();
if (pGuildWare)
pGuildWare->OnRecvMoveGuildCoin(this, pMove);
else
SendMoveGuildCoin(pMove->cMoveType, 0, 0, 0, 0, ERROR_GUILDWARE_NOT_READY);
}
}
break;
case CS_REMOVEITEM:
{
if (sizeof(CSRemoveItem) != nLen)
return ERROR_INVALIDPACKET;
CSRemoveItem *pRemoveItem = (CSRemoveItem*)pData;
if (!IsNoneWindowState() && !IsWindowState(WINDOW_BLIND))
{
SendRemoveItem(pRemoveItem->cType, pRemoveItem->cSlotIndex, NULL, ERROR_ITEM_FAIL);
return ERROR_NONE;
}
#if defined( PRE_ADD_DWC )
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false && AccountLevel_DWC != m_UserData.Status.cAccountLevel)
#else // #if defined( PRE_ADD_DWC )
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
#endif // #if defined( PRE_ADD_DWC )
return ERROR_NONE;
m_pItem->OnRecvRemoveItem(pRemoveItem);
return ERROR_NONE;
}
break;
case CS_EMBLEM_COMPOUND_OPEN_REQ:
{
//if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
// return ERROR_GENERIC_INVALIDREQUEST;
//}
if (sizeof(CSEmblemCompoundOpenReq) != nLen)
return ERROR_INVALIDPACKET;
CSEmblemCompoundOpenReq* pCompoundItem = (CSEmblemCompoundOpenReq*)pData;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WINDOW_BLIND <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>;<EFBFBD><CDBE><EFBFBD>.
if( !IsWindowState(WINDOW_BLIND)) {
SendEmblemCompoundRes( ERROR_ITEM_EMBLEM_COMPOUND_FAIL, 0 );
return ERROR_NONE;
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
CDnItemCompounder::S_ITEM_SETTING_INFO ItemSettingInfo;
CDnItemCompounder::S_OUTPUT Output;
CDnItemCompounder::S_COMPOUND_INFO_EXTERN CompoundInfo;
ItemSettingInfo.iCompoundTableID = pCompoundItem->nCompoundTableID;
ItemSettingInfo.iHasMoney = GetCoin(); // Note: GetCoin <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> INT64<36><34>.
const TItem* pPlateItem = m_pItem->GetInventory( pCompoundItem->cPlateItemSlotIndex );
if( NULL == pPlateItem )
return ERROR_GENERIC_INVALIDREQUEST;
if( pCompoundItem->biPlateItemSerialID != pPlateItem->nSerial )
return ERROR_GENERIC_INVALIDREQUEST;
g_pDataManager->GetItemCompounder()->GetCompoundInfo( pCompoundItem->nCompoundTableID, &CompoundInfo );
bool bValidHaveItem = true;
int iItemSettingArrayCount = 0;
for( int i = 0; i < COMPOUNDITEMMAX; ++i )
{
if( 0 == CompoundInfo.aiItemID[ i ] )
break;
int iHaveCount = m_pItem->GetInventoryItemCount( CompoundInfo.aiItemID[ i ] );
if( iHaveCount < CompoundInfo.aiItemCount[ i ] )
{
bValidHaveItem = false;
break;
}
ItemSettingInfo.aiItemID[ i ] = CompoundInfo.aiItemID[ i ];
ItemSettingInfo.aiItemCount[ i ] = CompoundInfo.aiItemCount[ i ];
++iItemSettingArrayCount;
}
int iResult = ERROR_ITEM_EMBLEM_COMPOUND_FAIL;
if( bValidHaveItem )
{
// <20>÷<EFBFBD><C3B7><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
int iPlateItemID = pPlateItem->nItemID;
if( -1 != iPlateItemID )
{
iResult = ERROR_ITEM_EMBLEM_COMPOUND_FAIL;
if( GetCheatCommand()->m_bLucky ) g_pDataManager->GetItemCompounder()->CheckPossibility( false );
g_pDataManager->EmblemCompound( iPlateItemID, ItemSettingInfo, &Output );
if( GetCheatCommand()->m_bLucky ) g_pDataManager->GetItemCompounder()->CheckPossibility( true );
if( CDnItemCompounder::R_SUCCESS == Output.eResultCode ||
CDnItemCompounder::R_POSSIBILITY_FAIL == Output.eResultCode )
{
iResult = ERROR_NONE;
BroadcastingEffect(EffectType_Emblem, EffectState_Start);
}
}
}
SendEmblemCompoundOpen( iResult );
return ERROR_NONE;
}
break;
case CS_ITEM_COMPOUND_OPEN_REQ:
{
int iResult = ParseItemCompound( reinterpret_cast<CSItemCompoundOpenReq*>(pData), nLen );
return iResult;
}
break;
case CS_EMBLEM_COMPOUND_REQ:
{
/*if(!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}*/
if (sizeof(CSCompoundEmblemReq) != nLen)
return ERROR_INVALIDPACKET;
// Note: <20><><EFBFBD>Ŀ<EFBFBD> NPC <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD>ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ش<EFBFBD> NPC <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ؾ<EFBFBD><D8BE><EFBFBD>.
CSCompoundEmblemReq* pCompoundItem = (CSCompoundEmblemReq*)pData;
CDnItemCompounder::S_ITEM_SETTING_INFO ItemSettingInfo;
CDnItemCompounder::S_OUTPUT Output;
CDnItemCompounder::S_COMPOUND_INFO_EXTERN CompoundInfo;
ItemSettingInfo.iCompoundTableID = pCompoundItem->nCompoundTableID;
ItemSettingInfo.iHasMoney = GetCoin(); // Note: GetCoin <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> INT64<36><34>.
const TItem* pPlateItem = m_pItem->GetInventory( pCompoundItem->cPlateItemSlotIndex );
if( NULL == pPlateItem )
return ERROR_GENERIC_INVALIDREQUEST;
if( pCompoundItem->biPlateItemSerialID != pPlateItem->nSerial )
return ERROR_GENERIC_INVALIDREQUEST;
g_pDataManager->GetItemCompounder()->GetCompoundInfo( pCompoundItem->nCompoundTableID, &CompoundInfo );
bool bValidHaveItem = true;
int iItemSettingArrayCount = 0;
for( int i = 0; i < COMPOUNDITEMMAX; ++i )
{
if( 0 == CompoundInfo.aiItemID[ i ] )
break;
int iHaveCount = m_pItem->GetInventoryItemCount( CompoundInfo.aiItemID[ i ] );
if( iHaveCount < CompoundInfo.aiItemCount[ i ] )
{
bValidHaveItem = false;
break;
}
ItemSettingInfo.aiItemID[ i ] = CompoundInfo.aiItemID[ i ];
ItemSettingInfo.aiItemCount[ i ] = CompoundInfo.aiItemCount[ i ];
++iItemSettingArrayCount;
}
int iResult = ERROR_ITEM_EMBLEM_COMPOUND_FAIL;
int nResultItemID = 0;
if( bValidHaveItem )
{
int iPlateItemID = pPlateItem->nItemID;
iResult = ERROR_ITEM_EMBLEM_COMPOUND_FAIL;
if( IsWindowState(WINDOW_BLIND) )
{
if( GetCheatCommand()->m_bLucky ) g_pDataManager->GetItemCompounder()->CheckPossibility( false );
g_pDataManager->EmblemCompound( iPlateItemID, ItemSettingInfo, &Output );
if( GetCheatCommand()->m_bLucky ) g_pDataManager->GetItemCompounder()->CheckPossibility( true );
if( CDnItemCompounder::R_SUCCESS == Output.eResultCode ||
CDnItemCompounder::R_POSSIBILITY_FAIL == Output.eResultCode )
{
// <20><><EFBFBD><EFBFBD> <20><> <20>ش<EFBFBD>
if (!DelCoin( Output.iCost, DBDNWorldDef::CoinChangeCode::CompoundTax, m_nClickedNpcID))
SendEmblemCompoundRes( iResult, nResultItemID );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵٰ<D1B4> <20>߾<EFBFBD><DFBE>µ<EFBFBD> <20><>ȹ<EFBFBD><C8B9> <20><> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD>.
// <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ְ<EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ù<><C3B9>° <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( !Output.vlItemCount.empty() && Output.vlItemCount.front() == 0 )
{
int nResultItemCount = 0;
int nLastValue = 1;
int nDepth = ITEMDROP_DEPTH;
#if defined( PRE_ADD_FARM_DOWNSCALE )
CDNUserItem::CalcDropItems( this, Output.vlItemID.front(), nResultItemID, nResultItemCount, nLastValue, nDepth );
#else
m_pItem->CalcDropItems( Output.vlItemID.front(), nResultItemID, nResultItemCount, nLastValue, nDepth );
#endif // #if defined( PRE_ADD_FARM_DOWNSCALE )
}
else
nResultItemID = Output.vlItemID.empty() ? 0 : Output.vlItemID.front();
if (!m_pItem->EmblemCompoundComplete( nResultItemID, pCompoundItem->cPlateItemSlotIndex, pCompoundItem->biPlateItemSerialID,
CompoundInfo.aiItemID, CompoundInfo.aiItemCount, iItemSettingArrayCount ))
SendEmblemCompoundRes( iResult, nResultItemID );
if( CDnItemCompounder::R_POSSIBILITY_FAIL == Output.eResultCode ){
iResult = ERROR_ITEM_EMBLEM_COMPOUND_POSSIBILITY_FAIL;
BroadcastingEffect(EffectType_Emblem, EffectState_Fail);
}
else{
iResult = ERROR_NONE;
BroadcastingEffect(EffectType_Emblem, EffectState_Success);
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ..
iResult = _MakeEmblemErrorCode( Output );
}
}
}
// Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
SendEmblemCompoundRes( iResult, nResultItemID );
return ERROR_NONE;
}
break;
case CS_ITEM_COMPOUND_REQ:
{
return ParseItemCompoundComplete( reinterpret_cast<CSCompoundItemReq*>(pData), nLen );
}
break;
case CS_EMBLEM_COMPOUND_CANCEL_REQ:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (sizeof(CSEmblemCompoundCancelReq) != nLen)
return ERROR_INVALIDPACKET;
CSEmblemCompoundCancelReq * pPacket = (CSEmblemCompoundCancelReq*)pData;
SendEmblemCompoundCancel( ERROR_NONE );
BroadcastingEffect(EffectType_Emblem, EffectState_Cancel);
return ERROR_NONE;
}
break;
case CS_ITEM_COMPOUND_CANCEL_REQ:
{
int iResult = ParseItemCompoundCancel( reinterpret_cast<CSItemCompoundCancelReq*>(pData), nLen );
return iResult;
}
break;
case CS_MOVECOIN:
{
if (sizeof(CSMoveCoin) != nLen)
return ERROR_INVALIDPACKET;
CSMoveCoin *pMove = (CSMoveCoin*)pData;
if ( !IsNoneWindowState() && !IsWindowState(WINDOW_BLIND))
{
SendMoveCoin(pMove->cMoveType, 0, 0, 0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
switch(pMove->cMoveType)
{
case MoveType_InvenToWare: m_pItem->OnRecvMoveCoinInventoWare(pMove->cMoveType, pMove->nMoveCoin); break;
case MoveType_WareToInven: m_pItem->OnRecvMoveCoinWaretoInven(pMove->cMoveType, pMove->nMoveCoin); break;
}
return ERROR_NONE;
}
break;
case CS_USEITEM:
{
if (sizeof(CSUseItem) != nLen)
return ERROR_INVALIDPACKET;
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false && AccountLevel_DWC != GetAccountLevel())
return ERROR_NONE;
CSUseItem *pUseItem = (CSUseItem*)pData;
m_pItem->OnRecvUseItem(pUseItem);
return ERROR_NONE;
}
break;
case CS_COMPLETE_RANDOMITEM:
{
if( !m_pItem->IsValidRequestTimer( CDNUserItem::RequestType_UseRandomItem ) ) break;
if (sizeof(CSCompleteRandomItem) != nLen)
return ERROR_INVALIDPACKET;
CSCompleteRandomItem *pCompleteItem = (CSCompleteRandomItem *)pData;
if( m_pItem->CalcRandomItem( pCompleteItem ) == false )
_DANGER_POINT();
//UseItem<65><6D><EFBFBD><EFBFBD> WINDOW_PROGRESS<53><53><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
case CS_CANCEL_RANDOMITEM:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
m_pItem->SetRequestTimer( CDNUserItem::RequestType_None, 0 );
BroadcastingEffect(EffectType_Random, EffectState_Cancel);
//UseItem<65><6D><EFBFBD><EFBFBD> WINDOW_PROGRESS<53><53><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
case CS_ENCHANT:
{
return ParseEnchant( reinterpret_cast<CSEnchantItem*>(pData), nLen );
}
break;
case CS_ENCHANTCOMPLETE:
{
return ParseEnchantComplete( reinterpret_cast<CSEnchantItem*>(pData), nLen );
}
case CS_ENCHANTCANCEL:
{
return ParseEnchantCancel( nLen );
}
break;
case CS_SORTINVENTORY:
{
CSSortInventory *pSort = (CSSortInventory*)pData;
if (sizeof(CSSortInventory) - sizeof(pSort->SlotInfo) + (sizeof(TSortSlot) * pSort->cTotalCount) != nLen)
return ERROR_INVALIDPACKET;
if( !IsNoneWindowState() && !IsWindowState(WINDOW_BLIND))
{
SendSortInventory(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (pSort->cTotalCount > INVENTORYMAX)
{
_DANGER_POINT();
return ERROR_NONE;
}
if (m_pItem->SortInventory(pSort))
SendSortInventory(ERROR_NONE);
else
SendSortInventory(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
break;
#if defined(PRE_PERIOD_INVENTORY)
case CS_SORTPERIODINVENTORY:
{
CSSortInventory *pSort = (CSSortInventory*)pData;
if (sizeof(CSSortInventory) - sizeof(pSort->SlotInfo) + (sizeof(TSortSlot) * pSort->cTotalCount) != nLen)
return ERROR_INVALIDPACKET;
if( !IsNoneWindowState() && !IsWindowState(WINDOW_BLIND))
{
SendSortPeriodInventory(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (pSort->cTotalCount > PERIODINVENTORYMAX)
{
_DANGER_POINT();
return ERROR_NONE;
}
if (m_pItem->SortPeriodInventory(pSort))
SendSortPeriodInventory(ERROR_NONE);
else
SendSortPeriodInventory(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
break;
#endif // #if defined(PRE_PERIOD_INVENTORY)
case CS_MODITEMEXPIREDATE:
{
if (sizeof(CSModItemExpireDate) != nLen)
{
SendItemModItemExpireDate(ERROR_INVALIDPACKET);
return ERROR_INVALIDPACKET;
}
CSModItemExpireDate *pItem = (CSModItemExpireDate*)pData;
const TItem *pExpendItem = m_pItem->GetCashInventory(pItem->biExpireDateItemSerial);
bool bFlag = false; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ
if (pExpendItem)
{
TItemData *pExpendItemData = g_pDataManager->GetItemData(pExpendItem->nItemID);
if (pExpendItemData)
{
int nMin = 0;
//<2F><EFBFBD><E2B0A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>޶<EFBFBD><DEB6><EFBFBD>
switch(pExpendItemData->nType)
{
case ITEMTYPE_PET_EXPIRE:
{
const TVehicle *pPet = m_pItem->GetVehicleInventory(pItem->biItemSerial);
if (pPet)
{
TItemData *pPetItemData = g_pDataManager->GetItemData( pPet->Vehicle[Vehicle::Slot::Body].nItemID );
if ( pPetItemData && pPetItemData->nType == ITEMTYPE_PET )
{
nMin = pExpendItemData->nTypeParam[0] * 24 * 60;
bFlag = true;
}
}
}
break;
default:
break;
}
if (bFlag)
{
#ifdef PRE_FIX_63822
if (m_pSession->AddDataBaseMessageSequence(MAINCMD_ITEM, QUERY_MODITEMEXPIREDATE) == false)
{
bFlag = false;
break;
}
#endif //#ifdef PRE_FIX_63822
m_pItem->ModItemExpireDate(pItem, nMin);
m_pItem->DeleteCashInventoryBySerial(pItem->biExpireDateItemSerial,1,false); //<2F><EFBFBD><E2B0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ModItemExpireDate() <20>Լ<EFBFBD> <20>ȿ<EFBFBD><C8BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
}
}
}
if(!bFlag)
{
//<2F><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QUERY_MODITEMEXPIREDATE <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendItemModItemExpireDate(ERROR_ITEM_FAIL);
return ERROR_ITEM_FAIL;
}
return ERROR_NONE;
}
break;
case CS_DELETE_PET_SKILL :
{
if (sizeof(CSPetSkillDelete) != nLen)
return ERROR_INVALIDPACKET;
CSPetSkillDelete *pItem = (CSPetSkillDelete*)pData;
int nRet = m_pItem->DelPetSkill(pItem->cSlotNum);
SendPetSkillDelete(nRet, pItem->cSlotNum);
}
break;
case CS_SORTWAREHOUSE:
{
CSSortWarehouse * pPacket = (CSSortWarehouse*)pData;
if (sizeof(CSSortWarehouse) - sizeof(pPacket->SlotInfo) + (sizeof(TSortSlot) * pPacket->cTotalCount) != nLen)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND) )
{
SendSortWarehouse(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (pPacket->cTotalCount > WAREHOUSEMAX)
{
SendSortWarehouse(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (m_pItem->SortWarehouse(pPacket))
SendSortWarehouse(ERROR_NONE);
else
SendSortWarehouse(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
break;
#if defined(PRE_PERIOD_INVENTORY)
case CS_SORTPERIODWAREHOUSE:
{
CSSortWarehouse * pPacket = (CSSortWarehouse*)pData;
if (sizeof(CSSortWarehouse) - sizeof(pPacket->SlotInfo) + (sizeof(TSortSlot) * pPacket->cTotalCount) != nLen)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND) )
{
SendSortPeriodWarehouse(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (pPacket->cTotalCount > PERIODWAREHOUSEMAX)
{
SendSortPeriodWarehouse(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (m_pItem->SortPeriodWarehouse(pPacket))
SendSortPeriodWarehouse(ERROR_NONE);
else
SendSortPeriodWarehouse(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
break;
#endif // #if defined(PRE_PERIOD_INVENTORY)
#ifdef PRE_ADD_AUTOUNPACK
case CS_USE_AUTOUNPACK_CASHITEM_REQ:
{
CSAutoUnpack * pPacket = ( CSAutoUnpack * )pData;
int retCode = ERROR_NONE;
int typeParam = -1;
// <20><><EFBFBD><EFBFBD> - <20>ٸ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>.
if( !IsNoneWindowState() || IsWindowState(WINDOW_BLIND) )
{
retCode = ERROR_GENERIC_INVALIDREQUEST;
}
// <20><><EFBFBD><EFBFBD> - ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
else
{
const TItem * pItem = m_pItem->GetCashInventory( pPacket->serial );
if( pItem )
{
TItemData* pItemData = g_pDataManager->GetItemData( pItem->nItemID );
if( pItemData )
{
typeParam = pItemData->nTypeParam[0];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int iExistCount = GetItem()->GetCashItemCountByType( ITEMTYPE_AUTOUNPACK );
if( iExistCount < 1 ||
( pItem->wCount < 1 ) )
retCode = ERROR_ITEM_INSUFFICIENCY_ITEM;
}
else
retCode = ERROR_ITEM_FAIL;
}
else
{
retCode = ERROR_ITEM_NOTFOUND; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
}
}
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>OK <20><><EFBFBD><EFBFBD>.
SendAutoUnpack( pPacket->serial, retCode );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20>Ҹ<EFBFBD><D2B8>ȴ<EFBFBD>.
if( typeParam == 0 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ۼҸ<DBBC>.
m_pItem->DeleteItemByUse( ITEMPOSITION_CASHINVEN, -1, pPacket->serial );
}
return retCode;
}
break;
#endif
#if defined(PRE_ADD_TALISMAN_SYSTEM)
case CS_OPEN_TALISMANSLOT:
{
if (sizeof(CSOpenTalismanSlot) != nLen)
return ERROR_INVALIDPACKET;
CSOpenTalismanSlot *pPacket = (CSOpenTalismanSlot*)pData;
int nRet = m_pItem->OnRecvOpenTalismanSlot(pPacket);
if(nRet != ERROR_NONE)
SendOpenTalismanSlot(nRet, GetItem()->GetTalismanSlotOpenFlag());
return ERROR_NONE;
}
break;
#endif
/*
case CS_DISJOINT_REQ:
{
#ifdef _ADD_NEWDISJOINT
CSItemDisjointReqNew * pPacket = (CSItemDisjointReqNew*)pData;
if (sizeof(CSItemDisjointReqNew) != nLen)
return ERROR_INVALIDPACKET;
if (m_pSession->GetRestraint()->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
int iResult = ERROR_NONE;
#ifdef _ADD_NEWDISJOINT
SCItemDisjointResNew *pResultPacket = new SCItemDisjointResNew();
ZeroMemory(pResultPacket, sizeof(SCItemDisjointResNew));
#endif
int nLastIndex = 0;
for (int k = 0; k < 4; k++)
{
if (pPacket->cSlotIndex[k] == 0 || pPacket->biItemSerial[k] == 0)
continue;
const TItem *pItem = m_pItem->GetInventory(pPacket->cSlotIndex[k]);//GetInventoryItem(m_pSession, pPacket->cSlotIndex[k]);
if (!pItem)
{
_DANGER_POINT();
return ERROR_NONE;
}
if (pItem->nSerial != pPacket->biItemSerial[k]) return ERROR_ITEM_FAIL;
TItemData *pItemData = g_pDataManager->GetItemData(pItem->nItemID);
int nItemID = pItem->nItemID;
bool bSuccessDisjoint = false;
if (pItem && pItemData)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ر<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE> <20><>ġ<EFBFBD><C4A1> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><>.
// <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>ϸ<EFBFBD> <20>ɱ.
DnActorHandle hNpc = CDnActor::FindActorFromUniqueID(pSession->GetGameRoom(), pPacket->nNpcUniqueID);
if (hNpc) {
int nDisjointType = 0;
if (hNpc->IsNpcActor()) {
CDnNPCActor *pNpc = static_cast<CDnNPCActor *>(hNpc.GetPointer());
nDisjointType = (pNpc->GetNpcData()) ? pNpc->GetNpcData()->nParam[0] : 0;
}
if (pItem->CanDisjoint() && pItem->CanDisjointType(nDisjointType) && pItem->CanDisjointLevel(pSession->GetLevel()))
{
// <20>ͼ<EFBFBD><CDBC≯鼭 <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
bool bSealedItem = false;
if (pItemData->cReversion == ITEMREVERSION_BELONG && pItem->IsSoulbBound() == false)
bSealedItem = true;
if (!bSealedItem)
{
for (int i = 0; i < pPacket->nCount[k]; ++i)
{
bSuccessDisjoint = false;
iResult = ERROR_NONE;
// <20><><EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>.
if (pSession->CheckEnoughCoin(pItem->GetDisjointCost()))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>˾Ƽ<CBBE> <20>޾<DEBE>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> <20><>.
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
DNVector(CDnItem::DropItemStruct) VecDisjointItems;
pItem->GetDisjointItems(VecDisjointItems);
if (!VecDisjointItems.empty())
bSuccessDisjoint = true;
int nLocalItemID = pItem->GetClassID();
bool bDeleteItemResult = pSession->GetItem()->DeleteInventoryBySlot(pPacket->cSlotIndex[k], 1, pPacket->biItemSerial[k], DBDNWorldDef::UseItem::DeCompose);
_ASSERT(bDeleteItemResult);
if (bDeleteItemResult)
{
EtVector3 vPos = *hNpc->GetPosition();
// npc <20>ٶ󺸴<D9B6> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> 2 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ
vPos += (hNpc->GetMatEx()->m_vZAxis * 200.0f);
for (DWORD i = 0; i < VecDisjointItems.size(); ++i)
{
pResultPacket->nItemID[i + nLastIndex] = VecDisjointItems[i].nItemID;
pResultPacket->nCount[i + nLastIndex] = VecDisjointItems[i].nCount;
nLastIndex++;
//int nRotate = (int)(((VecDisjointItems[i].nSeed % 360) / (float)VecDisjointItems.size()) * i);
m_pSession->GetItem()->CreateInvenItem1(VecDisjointItems[i].nItemID, VecDisjointItems[i].nCount, -1, -1, DBDNWorldDef::AddMaterializedItem::ItemDecompose, 0, CREATEINVEN_ETC);
//RequestDropItem(STATIC_INSTANCE(CDnDropItem::s_dwUniqueCount)++, vPos, VecDisjointItems[i].nItemID,
// VecDisjointItems[i].nSeed, VecDisjointItems[i].nCount, nRotate, pSession->GetSessionID());
}
pSession->DelCoin(pItem->GetDisjointCost(), DBDNWorldDef::CoinChangeCode::DisjointTax, pSession->m_nClickedNpcID);
pSession->GetEventSystem()->OnEvent(EventSystem::OnItemDisjoint, 1, EventSystem::ItemID, nLocalItemID);
}
else
iResult = ERROR_ITEM_FAIL; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǴ<C8B5> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD>.
}
else
{
iResult = ERROR_ITEM_INSUFFICIENCY_MONEY;
}
if (iResult != ERROR_NONE)
break;
}
}
else
iResult = ERROR_ITEM_CAN_NOT_DISJOINT;
}
else
iResult = ERROR_ITEM_CAN_NOT_DISJOINT;
}
else iResult = ERROR_ITEM_FAIL;
}
else
iResult = ERROR_ITEM_NOTFOUND; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>..
pResultPacket->bSuccess = bSuccessDisjoint;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
}
if (ERROR_NONE == iResult)
SendItemDisjointResNew(pSession, pResultPacket); //wtf
else
SendItemDisjointResNew(pSession, pResultPacket); // 0 <20><> <20><><EFBFBD><EFBFBD>
return iResult;
}
break;
*/
}
return CDNUserBase::OnRecvItemMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvItemGoodsMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
// <20>Ϻ<EFBFBD> <20><>í<EFBFBD><C3AD> <20><>û
#ifdef PRE_ADD_GACHA_JAPAN
case CS_JP_GACHAPON_REQ:
{
if (sizeof(CSGachaRequest_JP) != nLen)
return ERROR_INVALIDPACKET;
int nResultItemID = 0;
CSGachaRequest_JP* pGachaReq = (CSGachaRequest_JP*)pData;
int nResult = m_pItem->RunGachapon_JP( pGachaReq->nJobClassID, pGachaReq->nSelectedPart, nResultItemID );
SendGachaResult_JP( nResult, nResultItemID );
return ERROR_NONE;
}
break;
#endif // PRE_ADD_GACHA_JAPAN
case CS_COSMIXOPEN:
{
// CS_COMIXOPEN <20>Ⱦ<EFBFBD><C8BE><EFBFBD> UseItem<65><6D><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..<2E>̰<EFBFBD> <20>Ⱦ<EFBFBD><C8BE>µ<EFBFBD>.<2E>Ф<EFBFBD>
if( !IsNoneWindowState() )
{
SendCosMixOpen(ERROR_ITEM_COSMIX_OPEN_FAIL);
return ERROR_NONE;
}
const CDnCostumeMixDataMgr& mgr = g_pDataManager->GetCosMixDataMgr();
if (mgr.IsEnableCostumeMix() == false)
{
SendCosMixOpen(ERROR_ITEM_COSMIX_OPEN_FAIL);
return ERROR_NONE;
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
SetWindowState(WINDOW_COSMIX);
SendCosMixOpen(ERROR_NONE);
return ERROR_NONE;
}
break;
case CS_COSMIXCLOSE:
case CS_COSMIXCOMPLETECLOSE:
{
if ( IsWindowState(WINDOW_COSMIX) == false )
{
OnEndCostumeMix();
SendCosMixClose(ERROR_ITEM_COSMIX_CLOSE_FAIL, nSubCmd);
return ERROR_NONE;
}
OnEndCostumeMix();
SendCosMixClose(ERROR_NONE, nSubCmd);
return ERROR_NONE;
}
break;
case CS_COSMIXCOMPLETE:
{
if (sizeof(CSCosMix) != nLen)
return ERROR_INVALIDPACKET;
const CDnCostumeMixDataMgr& mgr = g_pDataManager->GetCosMixDataMgr();
if (mgr.IsEnableCostumeMix() == false)
{
SendCosMixComplete(ERROR_ITEM_COSMIX_FAIL, 0, 0);
OnEndCostumeMix();
return ERROR_NONE;
}
if (m_biCosMixSerialCache == 0/* || m_nCosMixInvenTypeCache == 0*/)
{
SendCosMixComplete(ERROR_ITEM_COSMIX_FAIL, 0, 0);
OnEndCostumeMix();
return ERROR_NONE;
}
CSCosMix* pCosMix = (CSCosMix*)pData;
if( !IsWindowState(WINDOW_COSMIX) )
{
SendCosMixComplete(ERROR_ITEM_COSMIX_FAIL, 0, 0);
OnEndCostumeMix();
return ERROR_NONE;
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
if (!m_pItem->DeleteItemByUse(ITEMPOSITION_CASHINVEN, -1, m_biCosMixSerialCache)){
SendCosMixComplete(ERROR_ITEM_COSMIX_FAIL, 0, 0);
OnEndCostumeMix();
return ERROR_NONE;
}
int nItemId = 0;
int nRet = m_pItem->MixCostume(nItemId, pCosMix->nStuffSerialID, pCosMix->nResultItemID, pCosMix->cOption);
if (nRet != ERROR_NONE || nItemId == 0)
{
SendCosMixComplete(ERROR_ITEM_COSMIX_FAIL, 0, 0);
OnEndCostumeMix();
return ERROR_NONE;
}
// m_nCosMixInvenTypeCache = 0;
m_biCosMixSerialCache = 0;
SendCosMixComplete(nRet, nItemId, pCosMix->cOption);
return ERROR_NONE;
}
break;
case CS_DESIGNMIXCLOSE:
case CS_DESIGNMIXCOMPLETECLOSE:
{
if( !IsWindowState(WINDOW_DESIGNMIX) )
{
OnEndCostumeDesignMix();
SendCosDesignMixClose(ERROR_ITEM_DESIGNMIX_CLOSE_FAIL, nSubCmd);
return ERROR_NONE;
}
OnEndCostumeDesignMix();
SendCosDesignMixClose(ERROR_NONE, nSubCmd);
return ERROR_NONE;
}
break;
case CS_DESIGNMIXCOMPLETE:
{
if (sizeof(CSCosDesignMix) != nLen)
return ERROR_INVALIDPACKET;
const CDnCostumeMixDataMgr& mgr = g_pDataManager->GetCosMixDataMgr();
if (mgr.IsEnableCostumeMix() == false)
{
SendCosDesignMixComplete(ERROR_ITEM_DESIGNMIX_FAIL);
OnEndCostumeDesignMix();
return ERROR_NONE;
}
if (m_biCosDesignMixSerialCache == 0)
{
SendCosDesignMixComplete(ERROR_ITEM_DESIGNMIX_FAIL);
OnEndCostumeDesignMix();
return ERROR_NONE;
}
CSCosDesignMix* pCosMix = (CSCosDesignMix*)pData;
if ( !IsWindowState(WINDOW_DESIGNMIX) )
{
SendCosDesignMixComplete(ERROR_ITEM_DESIGNMIX_FAIL);
OnEndCostumeDesignMix();
return ERROR_NONE;
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
if (m_pItem->MixCostumeDesign(pCosMix->nStuffSerialID) != ERROR_NONE)
{
SendCosDesignMixComplete(ERROR_ITEM_DESIGNMIX_FAIL);
OnEndCostumeDesignMix();
return ERROR_NONE;
}
}
break;
#ifdef PRE_ADD_COSRANDMIX
case CS_RANDOMMIXCLOSE:
case CS_RANDOMMIXCOMPLETECLOSE:
{
if( !IsWindowState(WINDOW_RANDOMMIX) )
{
OnEndCostumeRandomMix();
SendCosRandomMixClose(ERROR_ITEM_RANDOMMIX_CLOSE_FAIL, nSubCmd);
return ERROR_NONE;
}
OnEndCostumeRandomMix();
SendCosRandomMixClose(ERROR_NONE, nSubCmd);
return ERROR_NONE;
}
break;
case CS_RANDOMMIXCOMPLETE:
{
if (sizeof(CSCosRandomMix) != nLen)
return ERROR_INVALIDPACKET;
const CDnCostumeRandomMixDataMgr& mgr = g_pDataManager->GetCosRandomMixDataMgr();
if (mgr.IsEnableCosRandomMix() == false)
{
SendCosRandomMixComplete(ERROR_ITEM_RANDOMMIX_FAIL, 0);
OnEndCostumeRandomMix();
return ERROR_NONE;
}
#ifdef PRE_ADD_COSRANDMIX_ACCESSORY
eError cannotMix = ERROR_NONE;
if (m_CosRandMixOpenType == CostumeMix::RandomMix::OpenByItem)
{
if (m_biCosRandomMixSerialCache == 0)
cannotMix = ERROR_ITEM_RANDOMMIX_FAIL;
}
if (m_CosRandMixOpenType == CostumeMix::RandomMix::OpenFail)
cannotMix = ERROR_ITEM_RANDOMMIX_FAIL;
if (cannotMix != ERROR_NONE)
{
SendCosRandomMixComplete(ERROR_ITEM_RANDOMMIX_FAIL, 0);
OnEndCostumeRandomMix();
return ERROR_NONE;
}
#else
if (m_biCosRandomMixSerialCache == 0)
{
SendCosRandomMixComplete(ERROR_ITEM_RANDOMMIX_FAIL, 0);
OnEndCostumeRandomMix();
return ERROR_NONE;
}
#endif
CSCosRandomMix* pCosMix = (CSCosRandomMix*)pData;
if ( !IsWindowState(WINDOW_RANDOMMIX) )
{
SendCosRandomMixComplete(ERROR_ITEM_RANDOMMIX_FAIL, 0);
OnEndCostumeRandomMix();
return ERROR_NONE;
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
int nResultItemId = 0;
eError mixError = m_pItem->MixRandomCostume(nResultItemId, pCosMix->nStuffSerialID);
if (mixError != ERROR_NONE)
{
SendCosRandomMixComplete(mixError, 0);
#ifdef PRE_MOD_COSRANDMIX_NPC_CLOSE
if (m_CosRandMixOpenType != CostumeMix::RandomMix::OpenByNpc)
OnEndCostumeRandomMix();
#else
OnEndCostumeRandomMix();
#endif
return ERROR_NONE;
}
}
break;
#endif // PRE_ADD_COSRANDMIX
#ifdef PRE_ADD_CHANGEJOB_CASHITEM
case CS_USE_CHANGEJOB_CASHITEM_REQ:
{
if( m_eUserState != STATE_NONE || GetPartyID() > 0 || !IsNoneWindowState() )
return ERROR_ITEM_CHANGEJOB_ILLEGAL_STATE;
CSUseChangeJobCashItemReq* pPacket = reinterpret_cast<CSUseChangeJobCashItemReq*>(pData);
#ifdef PRE_ADD_JOBCHANGE_RESTRICT_JOB
int nTemp1, nTemp2;
if( !CheckAndCalcParallelChangeJob( pPacket->iJobToChange, nTemp1, nTemp2 ) )
{
SendChangeJobCashItemRes( ERROR_GENERIC_INVALIDREQUEST, 0, 0, 0 );
return ERROR_GENERIC_INVALIDREQUEST;
}
#endif // PRE_ADD_JOBCHANGE_RESTRICT_JOB
const TItem* pItem = m_pItem->GetCashInventory(pPacket->biItemSerial);
if( pItem )
{
TItemData* pItemData = g_pDataManager->GetItemData( pItem->nItemID );
if( pItemData )
{
if( !m_pItem->DeleteItemByUse( ITEMPOSITION_CASHINVEN, -1, pPacket->biItemSerial) )
return ERROR_GENERIC_INVALIDREQUEST;
int iResult = m_pItem->UseChangeJobCashItem( pItemData, pPacket->iJobToChange );
if( ERROR_NONE != iResult )
return iResult;
}
}
return ERROR_NONE;
}
break;
#endif // #ifdef PRE_ADD_CHANGEJOB_CASHITEM
}
return CDNUserBase::OnRecvItemGoodsMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvNpcMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case CS_NPCTALK:
{
#if defined (_WORK) && defined (PRE_ADD_SERVER_LOAD_SHORTENING)
if (g_ConfigWork.HasCommand(L"ExceptScript"))
{
SendNextTalkError();
return ERROR_NONE;
}
#endif // #if defined (_WORK) && defined (PRE_ADD_SERVER_LOAD_SHORTENING)
if (sizeof(CSNpcTalk) != nLen)
{
g_Log.Log(LogType::_ERROR, this, L"[CS_NPCTALK](0) ACC:%s(%d), CHR:%s(%I64d), SIZ:%d/%d\n", GetAccountName(), GetAccountDBID(), GetCharacterName(), GetCharacterDBID(), sizeof(CSNpcTalk), nLen);
return ERROR_INVALIDPACKET;
}
CSNpcTalk *pTalk = (CSNpcTalk*)pData;
CDNNpcObject* pNpc = g_pFieldManager->GetNpcObjectByNpcObjID(GetChannelID(), pTalk->nNpcUniqueID);
if( !pNpc )
{
g_Log.Log(LogType::_ERROR, this, L"[CS_NPCTALK](1) ACC:%s(%d), CHR:%s(%I64d), PAK:%d/%d/%d\n", GetAccountName(), GetAccountDBID(), GetCharacterName(), GetCharacterDBID(), pTalk->nNpcUniqueID, pTalk->dwIndexHashCode, pTalk->dwTargetHashCode);
SendNextTalkError();
return ERROR_GENERIC_INVALIDREQUEST;
}
std::wstring wszIndex;
std::wstring wszTarget;
bool bResult = g_pDataManager->GetTalkIndexName(pTalk->dwIndexHashCode, wszIndex);
if( !bResult )
{
g_Log.Log(LogType::_ERROR, this, L"[CS_NPCTALK](2) ACC:%s(%d), CHR:%s(%I64d), PAK:%d/%d/%d\n", GetAccountName(), GetAccountDBID(), GetCharacterName(), GetCharacterDBID(), pTalk->nNpcUniqueID, pTalk->dwIndexHashCode, pTalk->dwTargetHashCode);
SendNextTalkError();
return ERROR_GENERIC_INVALIDREQUEST;
}
bResult = g_pDataManager->GetTalkFileName(pTalk->dwTargetHashCode, wszTarget);
if( !bResult )
{
g_Log.Log(LogType::_ERROR, this, L"[CS_NPCTALK](3) ACC:%s(%d), CHR:%s(%I64d), PAK:%d/%d/%d\n", GetAccountName(), GetAccountDBID(), GetCharacterName(), GetCharacterDBID(), pTalk->nNpcUniqueID, pTalk->dwIndexHashCode, pTalk->dwTargetHashCode);
SendNextTalkError();
return ERROR_GENERIC_INVALIDREQUEST;
}
if(0 != m_dwNpcTalkLastIndexHashCode && ::wcscmp(wszIndex.c_str(), L"start") && pTalk->dwIndexHashCode == m_dwNpcTalkLastIndexHashCode && pTalk->dwTargetHashCode == m_dwNpcTalkLastTargetHashCode)
{
g_Log.Log(LogType::_ERROR, this, L"[CS_NPCTALK](4) ACC:%s(%d), CHR:%s(%I64d), PAK:%d/%d/%d\n", GetAccountName(), GetAccountDBID(), GetCharacterName(), GetCharacterDBID(), pTalk->nNpcUniqueID, pTalk->dwIndexHashCode, pTalk->dwTargetHashCode);
SendNextTalkError();
return ERROR_GENERIC_INVALIDREQUEST;
}
TALK_PARAGRAPH& para = GetLastTalkParagraph();
// NPC<50><43><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>.
if( ::wcscmp(wszIndex.c_str(), NpcTalkStringGroup[NPCTALK_START].c_str()) == 0 )
#if defined(PRE_FIX_QUEST_GUILD_BOARD)
{
para = g_pDataManager->GetEmptyTalkParagraph();
GetQuest()->ResetRewardFlag();
}
#else
para = g_pDataManager->GetEmptyTalkParagraph();
#endif
bool bValidAnswer = false;
for (int i = NPCTALK_START; i<NPCTALK_END; i++)
{
if( ::wcscmp(wszIndex.c_str(), NpcTalkStringGroup[i].c_str()) == 0)
bValidAnswer = true;
}
if(bValidAnswer == false)
{
if( para.Answers.size() )
{
for( std::vector<TALK_ANSWER>::iterator i = para.Answers.begin(); i != para.Answers.end(); i++ )
{
if((*i).szLinkIndex == wszIndex )
{
bValidAnswer = true;
break;
}
}
}
#if !defined(PRE_FIX_QUEST_GUILD_BOARD) //<2F>Ʒ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
else
bValidAnswer = true;
#endif
}
if( bValidAnswer == false )
{
g_Log.Log(LogType::_ERROR, this, L"[CS_NPCTALK](5) PAK:%d/%d/%d INDEX:%s\r\n", pTalk->nNpcUniqueID, pTalk->dwIndexHashCode, pTalk->dwTargetHashCode, wszIndex.c_str());
SendNextTalkError();
return ERROR_GENERIC_INVALIDREQUEST;
}
m_dwNpcTalkLastIndexHashCode = pTalk->dwIndexHashCode;
m_dwNpcTalkLastTargetHashCode = pTalk->dwTargetHashCode;
m_nClickedNpcID = pNpc->GetNpcData()->nNpcID; // Ŭ<><C5AC><EFBFBD>Ҷ<EFBFBD><D2B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_nClickedNpcObjectID = pTalk->nNpcUniqueID;
if(!IsValidPacketByNpcClick())
{ // npc <20>Ÿ<EFBFBD>üũ
g_Log.Log(LogType::_ERROR, this, L"[CS_NPCTALK](6) ACC:%s(%d), CHR:%s(%I64d), PAK:%d/%d/%d\n", GetAccountName(), GetAccountDBID(), GetCharacterName(), GetCharacterDBID(), pTalk->nNpcUniqueID, pTalk->dwIndexHashCode, pTalk->dwTargetHashCode);
SendNextTalkError();
return ERROR_GENERIC_INVALIDREQUEST;
}
bool bReturn = pNpc->Talk(this, pTalk->nNpcUniqueID, wszIndex, wszTarget);
if( !bReturn )
{
SendNextTalkError();
g_Log.Log(LogType::_ERROR, this, L"[CS_NPCTALK](6) ACC:%s(%d), CHR:%s(%I64d), PAK:%d/%d/%d\n", GetAccountName(), GetAccountDBID(), GetCharacterName(), GetCharacterDBID(), pTalk->nNpcUniqueID, pTalk->dwIndexHashCode, pTalk->dwTargetHashCode);
return ERROR_GENERIC_INVALIDREQUEST;
}
if(!IsNpcTalk())
SendTalkEnd(pTalk->nNpcUniqueID); // <20><> <20><>Ŷ<EFBFBD><C5B6> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> NPC <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20>ݱ<EFBFBD>
if( ::wcscmp(wszIndex.c_str(), NpcTalkStringGroup[NPCTALK_START].c_str()) == 0 )
GetEventSystem()->OnEvent( EventSystem::OnNpcTalk, 1, EventSystem::NpcID, m_nClickedNpcID );
return ERROR_NONE;
}
break;
#if defined(PRE_FIX_QUEST_GUILD_BOARD)
case CS_NPCTALKEND:
{
GetQuest()->ResetRewardFlag();
return ERROR_NONE;
}
break;
#endif
}
SendNextTalkError();
_DANGER_POINT();
//ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
return ERROR_UNKNOWN_HEADER;
}
int CDNUserSession::OnRecvQuestMessage(int nSubCmd, char *pData, int nLen)
{
return CDNUserBase::OnRecvQuestMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvChatMessage(int nSubCmd, char *pData, int nLen)
{
//<2F><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD> üũ<C3BC>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>.
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_CHAT) == false)
return ERROR_NONE;
switch(nSubCmd)
{
case CS_CHATMSG:
{
if( !m_pField )
return ERROR_NONE;
CSChat *pChat = (CSChat*)pData;
if (sizeof(CSChat) - sizeof(pChat->wszChatMsg) +(pChat->nLen * sizeof(WCHAR)) != nLen)
return ERROR_INVALIDPACKET;
if (pChat->nLen > CHATLENMAX-1) return ERROR_NONE;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pChat->wszChatMsg, pChat->nLen);
if (GetAccountLevel() >= AccountLevel_New && GetAccountLevel() <= AccountLevel_Developer){
wstring WChatMsg = wszChatMsg;
if (WChatMsg.find(L"/") == 0){
if (GetAccountLevel() == AccountLevel_QA){ // QA<51><41> ġƮ <20>ǰ<EFBFBD> <20>Ѵ<EFBFBD>
if (m_pCheatCommand){
if (m_pCheatCommand->Command(WChatMsg) > 0) return ERROR_NONE;
}
}
if (m_pGMCommand){
if (m_pGMCommand->GMCommand(WChatMsg)) return ERROR_NONE;
}
#if defined( _WORK )
// <20><><EFBFBD>߹<EFBFBD><DFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>...
#else
return ERROR_NONE;
#endif // #if defined( _WORK )
}
}
#if defined(_WORK)
if (m_pCheatCommand){
if (m_pCheatCommand->Command(wstring(wszChatMsg)) > 0) return ERROR_NONE;
}
#endif
#if defined(PRE_ADD_ANTI_CHAT_SPAM)
if( GetSpammer() ) // <20><><EFBFBD>иӴ<D0B8> <20>ӵ<EFBFBD> <20>о<EFBFBD>..
return ERROR_NONE;
#endif
#if defined(PRE_ADD_MUTE_USERCHATTING)
if( IsMuteChatting() ) //ü<><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>н<EFBFBD>
return ERROR_NONE;
#endif // #if defined(PRE_ADD_MUTE_USERCHATTING)
switch(pChat->eType)
{
case CHATTYPE_NORMAL:
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E4B0B0><EFBFBD><EFBFBD> <20>Ⱥ<EFBFBD><C8BA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>°ɷ<C2B0> <20>ϰڴ<CFB0>.
if( CheckPapering(eChatPapering) )
return ERROR_NONE;
// EncryptFlag <20><><EFBFBD><EFBFBD>
ScopeEncryptFlag Scope( &m_ParamData.bEncrypt );
if( m_pField->bIsPvPLobby() )
{
memset( &m_ParamData, 0, sizeof(TParamData) );
m_ParamData.nChatSize = pChat->nLen;
if ((GetAccountLevel() >= AccountLevel_New) && (GetAccountLevel() <= AccountLevel_QA)) m_ParamData.eChatType = CHATTYPE_GM;
else m_ParamData.eChatType = pChat->eType;
_wcscpy(m_ParamData.wszChatMsg, _countof(m_ParamData.wszChatMsg), wszChatMsg, (int)wcslen(wszChatMsg));
m_ParamData.wszChatMsg[m_ParamData.nChatSize] = 0;
m_pField->SendFieldMessage( this, FM_CHAT, NULL, &m_ParamData );
}
else
{
memset(&m_ParamData, 0, sizeof(TParamData));
m_ParamData.nChatSize = pChat->nLen;
if ((GetAccountLevel() >= AccountLevel_New) && (GetAccountLevel() <= AccountLevel_QA)) m_ParamData.eChatType = CHATTYPE_GM;
else m_ParamData.eChatType = pChat->eType;
_wcscpy(m_ParamData.wszChatMsg, _countof(m_ParamData.wszChatMsg), wszChatMsg, (int)wcslen(wszChatMsg));
m_ParamData.wszChatMsg[m_ParamData.nChatSize] = 0;
SendUserLocalMessage(0, FM_CHAT);
}
break;
}
case CHATTYPE_PARTY:
case CHATTYPE_RAIDNOTICE:
{
if (GetPartyID() > 0)
{ // <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
if ((GetAccountLevel() >= AccountLevel_New) && (GetAccountLevel() <= AccountLevel_QA))
pChat->eType = CHATTYPE_PARTY_GM;
CDNParty * pParty = g_pPartyManager->GetParty(GetPartyID());
if (pParty)
pParty->SendPartyChat(pChat->eType, pChat->nLen, GetCharacterName(), wszChatMsg );
}
break;
}
case CHATTYPE_GUILD:
{
const TGuildUID GuildUID(GetGuildUID());
if (!GuildUID.IsSet()) {
break;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
break;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
g_pMasterConnection->SendGuildChat(GuildUID, GetAccountDBID(), GetCharacterDBID(), pChat->wszChatMsg, pChat->nLen);
}
break;
case CHATTYPE_CHANNEL:
case CHATTYPE_WORLD:
#if defined(PRE_ADD_WORLD_MSG_RED)
case CHATTYPE_WORLD_POPMSG:
#endif // #if defined(PRE_ADD_WORLD_MSG_RED)
{
//<2F>Ƹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>Ѵٰ<D1B4> <20><>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ŀ<EFBFBD> <20>÷ο<C3B7> <20><><EFBFBD><EFBFBD>
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<>θ<EFBFBD> <20>ϰ<EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD>ε<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD>~
if (g_pMasterConnection && g_pMasterConnection->GetActive()) {
int nItemID = 0;
#if defined(PRE_ADD_WORLD_MSG_RED)
if( !m_pItem->IsVaildWorldChatItem(pChat->eType, pChat->biItemSerial, nItemID) )
{
g_Log.Log(LogType::_ERROR, this, L"[OnRecvItem] WorldChat Item Find Failed(ChatType : %d, Serial: %I64d\r\n", pChat->eType, pChat->biItemSerial);
break;
}
#else
const TItem *pItem = m_pItem->GetCashInventory(pChat->biItemSerial);
if (pItem) nItemID = pItem->nItemID;
#endif // #if defined(PRE_ADD_WORLD_MSG_RED)
if (m_pItem->DeleteItemByUse(ITEMPOSITION_CASHINVEN, -1, pChat->biItemSerial)){
g_pMasterConnection->SendChat(pChat->eType, m_nAccountDBID, wszChatMsg, pChat->nLen, GetField()->GetMapIndex());
GetEventSystem()->OnEvent( EventSystem::OnItemUse, 1, EventSystem::ItemID, nItemID );
}
}
}
break;
#if defined( PRE_PRIVATECHAT_CHANNEL )
case CHATTYPE_PRIVATECHANNEL:
{
if (g_pMasterConnection && g_pMasterConnection->GetActive())
{
if(GetPrivateChannelID())
g_pMasterConnection->SendPrivateChannelChat(pChat->eType, m_nAccountDBID, wszChatMsg, pChat->nLen, GetPrivateChannelID());
}
}
break;
#endif
#if defined(PRE_ADD_DWC)
case CHATTYPE_DWC_TEAM:
{
if(!IsDWCCharacter() || GetDWCTeamID() <= 0 )
break;
if(g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendDWCTeamChat(GetDWCTeamID(), GetAccountDBID(), GetCharacterDBID(), pChat->wszChatMsg, pChat->nLen);
}
break;
#endif
default:
_DANGER_POINT();
}
return ERROR_NONE;
}
break;
case CS_CHAT_PRIVATE:
{
CSChatPrivate *pChat = (CSChatPrivate*)pData;
if (sizeof(CSChatPrivate) - sizeof(pChat->wszChatMsg) +(pChat->nLen * sizeof(WCHAR)) != nLen)
return ERROR_INVALIDPACKET;
if (pChat->nLen > CHATLENMAX-1) return ERROR_NONE;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pChat->wszChatMsg, pChat->nLen);
if (m_pIsolate->IsIsolateItem(pChat->wszToCharacterName))
{
SendIsolateResult(ERROR_ISOLATE_REQUESTFAIL);
return ERROR_NONE;
}
if (CheckLastSpace(pChat->wszToCharacterName))
{
SendIsolateResult(ERROR_ISOLATE_REQUESTFAIL);
return ERROR_GENERIC_INVALIDREQUEST;
}
if (__wcsicmp_l(pChat->wszToCharacterName, m_BaseData.wszName) == 0){ // <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD> <20>ٽ<EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD>
SendChat(CHATTYPE_PRIVATE, pChat->nLen, m_BaseData.wszName, wszChatMsg, NULL, ERROR_CHAT_DONTSAYYOURSELF); // -2<><32> <20>ڱ<EFBFBD><DAB1>ڽ<EFBFBD><DABD>϶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>
return ERROR_GENERIC_INVALIDREQUEST;
}
int nChatType = CHATTYPE_PRIVATE;
if ((GetAccountLevel() >= AccountLevel_New) && (GetAccountLevel() <= AccountLevel_QA)) nChatType = CHATTYPE_PRIVATE_GM;
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByName(pChat->wszToCharacterName);
if (pUserObj)
{
#if defined(PRE_ADD_DWC)
if( IsDWCCharacter() ^ pUserObj->IsDWCCharacter() ) //<2F><><EFBFBD><EFBFBD> Ÿ<>Գ<EFBFBD><D4B3><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ <20><><EFBFBD><EFBFBD>
{ //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>
SendChat(nChatType, pChat->nLen, m_BaseData.wszName, wszChatMsg, NULL, ERROR_CHAT_USERNOTFOUND);
return ERROR_NONE;
}
#endif
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>
if (pUserObj->GetIsolate()->IsIsolateItem(GetCharacterName()))
return ERROR_NONE;
// GM<47≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20>ؾ<EFBFBD><D8BE><EFBFBD>
if ((pUserObj->GetAccountLevel() >= AccountLevel_New) && (pUserObj->GetAccountLevel() <= AccountLevel_QA)){
if (!pUserObj->GetGMCommand()->IsWhisperName(m_BaseData.wszName)){
SendChat(nChatType, pChat->nLen, m_BaseData.wszName, wszChatMsg, NULL, ERROR_CHAT_USERNOTFOUND);
return ERROR_NONE;
}
}
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E4B0B0><EFBFBD><EFBFBD> <20>Ⱥ<EFBFBD><C8BA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>°ɷ<C2B0> <20>ϰڴ<CFB0>.CS_INVITEGUILDMEMBREQ
if ( CheckPapering(eChatPapering) )
return ERROR_NONE;
pUserObj->SendChat(nChatType, pChat->nLen, m_BaseData.wszName, wszChatMsg);
}
else { // <20><><EFBFBD>ٸ<EFBFBD>
#if defined(PRE_ADD_DWC)
if(IsDWCCharacter())
nChatType = CHATTYPE_DWC_PRIVATE; // <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20>򶧴<EFBFBD> DWC Ÿ<><C5B8><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
#endif
#ifdef PRE_ADD_DOORS
INT64 biDoorsDestChracterDBID = 0;
if (GetFriend())
{
TFriend * pFriend = GetFriend()->GetFriend(pChat->wszToCharacterName);
if (pFriend)
//if (pFriend && pFriend->bMobileAuthentication)
biDoorsDestChracterDBID = pFriend->biFriendCharacterDBID;
}
g_pMasterConnection->SendPrivateChat(m_nAccountDBID, pChat->wszToCharacterName, nChatType, wszChatMsg, pChat->nLen, biDoorsDestChracterDBID);
#else //#ifdef PRE_ADD_DOORS
g_pMasterConnection->SendPrivateChat(m_nAccountDBID, pChat->wszToCharacterName, nChatType, wszChatMsg, pChat->nLen);
#endif //#ifdef PRE_ADD_DOORS
}
return ERROR_NONE;
}
break;
case CS_DICE:
{
}
break;
case CS_CHAT_CHATROOM:
{
CSChatChatRoom * pChatChatRoom = (CSChatChatRoom*)pData;
if (sizeof(CSChatChatRoom) - sizeof(pChatChatRoom->wszChatMsg) +(pChatChatRoom->nLen * sizeof(WCHAR)) != nLen)
return ERROR_INVALIDPACKET;
if (pChatChatRoom->nLen > CHATLENMAX-1) return ERROR_NONE;
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
_wcscpy(wszChatMsg, CHATLENMAX, pChatChatRoom->wszChatMsg, pChatChatRoom->nLen);
if( m_nChatRoomID <= 0 ) // ä<>ù濡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
{
return ERROR_CHATROOM_UNKNOWNUSER;
}
CDNChatRoom * pChatRoom = g_pChatRoomManager->GetChatRoom( m_nChatRoomID );
if( pChatRoom )
{
pChatRoom->SendChatMessageToAll( pChatChatRoom->nLen, GetCharacterName(), wszChatMsg );
}
return ERROR_NONE;
}
break;
#if defined(PRE_ADD_ANTI_CHAT_SPAM)
case CS_CHAT_SPAMMER :
{
bool* bSpammer = (bool*)pData;
// <20><><EFBFBD>иӷ<D0B8> <20>Ű<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
SetSpammer(*bSpammer);
if( *bSpammer )
{
int iInvalidCount = 1;
g_Log.Log( LogType::_HACK, this, L"HackChecker(Spammer) : CharName=%s InvalidCount=%d\n", GetCharacterName(), iInvalidCount );
GetDBConnection()->QueryAddAbuseMonitor( this, 0, iInvalidCount );
}
}
break;
#endif
}
return ERROR_UNKNOWN_HEADER; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϵǾ<CFB5><C7BE><EFBFBD> <20>մϴ<D5B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD>!
}
int CDNUserSession::OnRecvTradeMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
#if !defined (PRE_MOD_GAMESERVERSHOP)
// Shop
#if defined(PRE_ADD_REMOTE_OPENSHOP)
case eTrade::CS_SHOP_REMOTEOPEN:
{
if (sizeof(CSShopBuy) != nLen)
return ERROR_INVALIDPACKET;
CSShopRemoteOpen *pShop = (CSShopRemoteOpen*)pData;
m_pItem->OnRecvShopRemoteOpen(pShop->Type);
SendShopOpen(m_nShopID, pShop->Type);
return ERROR_NONE;
}
break;
#endif // #if defined(PRE_ADD_REMOTE_OPENSHOP)
case CS_SHOP_BUY: // <20><><EFBFBD><EFBFBD>
{
#if defined(PRE_ADD_REMOTE_OPENSHOP)
if (!m_bRemoteShopOpen && !IsValidPacketByNpcClick()) // npc <20>Ÿ<EFBFBD>üũ
#else // #if defined(PRE_ADD_REMOTE_OPENSHOP)
if (!IsValidPacketByNpcClick()) // npc <20>Ÿ<EFBFBD>üũ
#endif // #if defined(PRE_ADD_REMOTE_OPENSHOP)
return ERROR_GENERIC_INVALIDREQUEST;
#if defined(_CH)
if (m_cFCMState != FCMSTATE_NONE){
SendShopBuyResult(ERROR_FCMSTATE);
return ERROR_NONE;
}
#endif // _CH
if( !IsWindowState(WINDOW_BLIND) ){
SendShopBuyResult(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
#if defined( PRE_ADD_DWC )
if (AccountLevel_DWC != m_UserData.Status.cAccountLevel && m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false) // DWCij<43><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>
#else // #if defined( PRE_ADD_DWC )
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
#endif // #if defined( PRE_ADD_DWC )
return ERROR_NONE;
if (sizeof(CSShopBuy) != nLen)
return ERROR_INVALIDPACKET;
CSShopBuy *pBuy = (CSShopBuy*)pData;
int nRet = m_pItem->OnRecvBuyNpcShopItem(m_nShopID, pBuy->cTapIndex, pBuy->cShopIndex, pBuy->wCount);
SendShopBuyResult(nRet);
return ERROR_NONE;
}
break;
case CS_SHOP_SELL: // <20>Ǹ<EFBFBD>
{
#if defined(PRE_ADD_REMOTE_OPENSHOP)
if (!m_bRemoteShopOpen && !IsValidPacketByNpcClick()) // npc <20>Ÿ<EFBFBD>üũ
#else // #if defined(PRE_ADD_REMOTE_OPENSHOP)
if (!IsValidPacketByNpcClick()) // npc <20>Ÿ<EFBFBD>üũ
#endif // #if defined(PRE_ADD_REMOTE_OPENSHOP)
return ERROR_GENERIC_INVALIDREQUEST;
#if defined(_CH)
if (m_cFCMState != FCMSTATE_NONE){
SendShopSellResult(ERROR_FCMSTATE);
return ERROR_NONE;
}
#endif // _CH
if( !IsWindowState(WINDOW_BLIND) ){ // <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>ƴϸ<C6B4>..
SendShopSellResult(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
if (sizeof(CSShopSell) != nLen)
return ERROR_INVALIDPACKET;
// <20><><EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD> 0.5<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD>.~~
DWORD dwCurTick = timeGetTime();
if( m_dwResellItemTick && dwCurTick-m_dwResellItemTick < 500 )
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>..
SendShopSellResult(ERROR_GENERIC_TIME_WAIT);
return ERROR_NONE;
}
#if defined(PRE_FIX_74387)
if( m_bNowResellItem )
{
//<2F>̳<EFBFBD><CCB3><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>..
int iInvalidCount = 1;
g_Log.Log( LogType::_HACK, this, L"HackChecker(ResellItem) : CharName=%s InvalidCount=%d\n", GetCharacterName(), iInvalidCount );
GetDBConnection()->QueryAddAbuseMonitor( this, 0, iInvalidCount );
SendShopSellResult(ERROR_GENERIC_TIME_WAIT);
return ERROR_NONE;
}
#endif
CSShopSell *pSell = (CSShopSell*)pData;
int nRet = m_pItem->OnRecvSellNpcShopItem(pSell);
#if defined(PRE_FIX_74387)
if( nRet != ERROR_NONE ) // DB<44><42> <20><><EFBFBD>ٿͼ<D9BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
SendShopSellResult(nRet);
else
m_bNowResellItem = true;
#else
SendShopSellResult(nRet);
#endif //#if defined(PRE_FIX_74387)
m_dwResellItemTick = dwCurTick;
return ERROR_NONE;
}
break;
case CS_SHOP_REPURCHASE:
{
#if defined(PRE_ADD_REMOTE_OPENSHOP)
if (!m_bRemoteShopOpen && !IsValidPacketByNpcClick()) // npc <20>Ÿ<EFBFBD>üũ
#else // #if defined(PRE_ADD_REMOTE_OPENSHOP)
if (!IsValidPacketByNpcClick()) // npc <20>Ÿ<EFBFBD>üũ
#endif // #if defined(PRE_ADD_REMOTE_OPENSHOP)
return ERROR_GENERIC_INVALIDREQUEST;
#if defined(_CH)
if (m_cFCMState != FCMSTATE_NONE){
SendShopRepurchase(ERROR_FCMSTATE);
return ERROR_NONE;
}
#endif // _CH
if ( !IsWindowState(WINDOW_BLIND)){
SendShopRepurchase(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
if ( sizeof(CSShopRepurchase) != nLen)
return ERROR_INVALIDPACKET;
CSShopRepurchase* pPacket = reinterpret_cast<CSShopRepurchase*>(pData);
int iRet = m_pItem->OnRecvShopRepurchase( pPacket );
SendShopRepurchase( iRet, pPacket->iRepurchaseID );
return ERROR_NONE;
}
case CS_SHOP_GETLIST_REPURCHASE:
{
#if defined(PRE_ADD_REMOTE_OPENSHOP)
if (!m_bRemoteShopOpen && !IsValidPacketByNpcClick()) // npc <20>Ÿ<EFBFBD>üũ
#else // #if defined(PRE_ADD_REMOTE_OPENSHOP)
if (!IsValidPacketByNpcClick()) // npc <20>Ÿ<EFBFBD>üũ
#endif // #if defined(PRE_ADD_REMOTE_OPENSHOP)
return ERROR_GENERIC_INVALIDREQUEST;
#if defined(_CH)
if (m_cFCMState != FCMSTATE_NONE){
SendShopRepurchaseList(ERROR_FCMSTATE);
return ERROR_NONE;
}
#endif // _CH
if ( !IsWindowState(WINDOW_BLIND)){
SendShopRepurchaseList(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
if (0 != nLen)
return ERROR_INVALIDPACKET;
GetDBConnection()->QueryGetListRepurchaseItem( this );
return ERROR_NONE;
}
case CS_REPAIR_EQUIP: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
#if defined(_CH)
if (m_cFCMState != FCMSTATE_NONE){
SendRepairEquip(ERROR_FCMSTATE);
return ERROR_NONE;
}
#endif // _CH
if (nLen != 0)
return ERROR_INVALIDPACKET;
m_pItem->OnRecvRepairEquip();
return ERROR_NONE;
}
break;
case CS_REPAIR_ALL: // <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
#if defined(_CH)
if (m_cFCMState != FCMSTATE_NONE){
SendRepairAll(ERROR_FCMSTATE);
return ERROR_NONE;
}
#endif // _CH
if (nLen != 0)
return ERROR_INVALIDPACKET;
m_pItem->OnRecvRepairAll();
return ERROR_NONE;
}
break;
#endif // #if !defined (PRE_MOD_GAMESERVERSHOP)
// Mail
case CS_MAILBOX:
{
if( !IsWindowState(WINDOW_BLIND) ){
SendMailBox(NULL, 0, 0, 0, 0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (sizeof(CSMailBox) != nLen)
return ERROR_INVALIDPACKET;
CSMailBox *pMailBox = (CSMailBox*)pData;
m_pDBCon->QueryGetPageReceiveMail(this, pMailBox->cPageNum);
return ERROR_NONE;
}
break;
case CS_MAIL_SEND:
{
if( !IsWindowState(WINDOW_BLIND) ){
SendMailSendResult(ERROR_GENERIC_INVALIDREQUEST, 0);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
if (sizeof(CSSendMail) < nLen) // <20><><EFBFBD><EFBFBD>
return ERROR_INVALIDPACKET;
if ( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::LimitLevel_SendMail )) )
{
SendMailSendResult( ERROR_GENERIC_LEVELLIMIT, 0 );
return ERROR_NONE;
}
CSSendMail *pSendMail = (CSSendMail*)pData;
if (CheckLastSpace(pSendMail->wszToCharacterName))
{
SendMailSendResult(ERROR_GENERIC_INVALIDREQUEST, 0);
return ERROR_GENERIC_INVALIDREQUEST;
}
if (__wcsicmp_l(pSendMail->wszToCharacterName, m_BaseData.wszName) == 0){ // <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>
SendMailSendResult(ERROR_MAIL_DONTSENDYOURSELF, 0);
return ERROR_GENERIC_UNKNOWNERROR;
}
if (m_pIsolate->IsIsolateItem(pSendMail->wszToCharacterName))
{
SendMailSendResult(ERROR_ISOLATE_REQUESTFAIL, 0);
return ERROR_GENERIC_UNKNOWNERROR;
}
#if defined(PRE_ADD_36935)
if ((GetAccountLevel() >= AccountLevel_New) && (GetAccountLevel() <= AccountLevel_QA))
{
if (pSendMail->nAttachCoin > 0 || pSendMail->cAttachItemTotalCount > 0)
{
SendMailSendResult(ERROR_MAIL_CANT_RECVMAIL, 0);
return ERROR_GENERIC_UNKNOWNERROR;
}
}
#endif // #if defined(PRE_ADD_36935)
int nRet = m_pItem->CheckSendMailItem(pSendMail);
if (nRet != ERROR_NONE){
SendMailSendResult(nRet, 0);
return ERROR_GENERIC_UNKNOWNERROR;
}
return ERROR_NONE;
}
break;
case CS_MAIL_READ:
{
if( !IsWindowState(WINDOW_BLIND) ){ // <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><20>ƴѵ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
SendReadMailResult(NULL, 0);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (sizeof(CSReadMail) != nLen) return ERROR_INVALIDPACKET;
CSReadMail *pMail = (CSReadMail*)pData;
if (pMail->nMailDBID <= 0){ // <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20><><EFBFBD><EFBFBD>
SendReadMailResult(NULL, 0);
return ERROR_NONE;
}
m_pDBCon->QueryReadMail(this, pMail->nMailDBID);
return ERROR_NONE;
}
break;
#if defined(PRE_ADD_CADGE_CASH)
case CS_MAIL_READCADGE:
{
if( !IsWindowState(WINDOW_BLIND) ){ // <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><20>ƴѵ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
SendReadCadgeMailResult(NULL);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (sizeof(CSReadMail) != nLen) return ERROR_INVALIDPACKET;
CSReadMail *pMail = (CSReadMail*)pData;
if (pMail->nMailDBID <= 0){ // <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20><><EFBFBD><EFBFBD>
SendReadCadgeMailResult(NULL);
return ERROR_NONE;
}
m_pDBCon->QueryReadWishMail(this, pMail->nMailDBID);
return ERROR_NONE;
}
break;
#endif // #if defined(PRE_ADD_CADGE_CASH)
case CS_MAIL_DELETE:
{
if( !IsWindowState(WINDOW_BLIND) ) { // <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><20>ƴѵ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
SendDeleteMailResult(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (sizeof(CSMailDBIDArray) != nLen)
return ERROR_INVALIDPACKET;
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
CSMailDBIDArray *pMail = (CSMailDBIDArray*)pData;
std::vector <int> VecMailDBID;
int nCount = 0;
for (int i = 0; i < MAILPAGEMAX; i++)
{
if (pMail->nMailDBID[i] > 0)
{
if (find(VecMailDBID.begin(), VecMailDBID.end(), pMail->nMailDBID[i]) == VecMailDBID.end())
VecMailDBID.push_back(pMail->nMailDBID[i]);
}
}
if (VecMailDBID.size() == 0){ // <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20><><EFBFBD><EFBFBD>
SendDeleteMailResult(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
// <20>ߺ<EFBFBD>Ű<EFBFBD><C5B0> <20>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
memset(pMail->nMailDBID, 0x00, sizeof(pMail->nMailDBID));
for (int i = 0; i <(int)VecMailDBID.size(); i++)
{
if (i < MAILPAGEMAX)
pMail->nMailDBID[i] = VecMailDBID[i];
}
m_pDBCon->QueryDelMail(this, pMail->nMailDBID);
return ERROR_NONE;
}
break;
case CS_MAIL_ATTACHALL:
{
if (sizeof(CSMailDBIDArray) != nLen)
return ERROR_INVALIDPACKET;
CSMailDBIDArray *pMail = (CSMailDBIDArray*)pData;
if( !IsWindowState(WINDOW_BLIND) ){
SendAttachAllMailResult(pMail->nMailDBID, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
std::vector <int> VecMailDBID;
int nCount = 0;
for (int i = 0; i < MAILPAGEMAX; i++)
{
if (pMail->nMailDBID[i] > 0)
{
if (find(VecMailDBID.begin(), VecMailDBID.end(), pMail->nMailDBID[i]) == VecMailDBID.end())
VecMailDBID.push_back(pMail->nMailDBID[i]);
}
}
if (VecMailDBID.size() == 0){ // <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20><><EFBFBD><EFBFBD>
SendAttachAllMailResult(pMail->nMailDBID, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
// <20>ߺ<EFBFBD>Ű<EFBFBD><C5B0> <20>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
memset(pMail->nMailDBID, 0x00, sizeof(pMail->nMailDBID));
for (int i = 0; i <(int)VecMailDBID.size(); i++)
{
if (i < MAILPAGEMAX)
pMail->nMailDBID[i] = VecMailDBID[i];
}
m_pDBCon->QueryGetListMailAttachment(this, pMail->nMailDBID); // <20>ϴ<EFBFBD> <20><EFBFBD><EEB0B3><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD><EEB0A3>(?)
return ERROR_NONE;
}
break;
case CS_MAIL_ATTACH:
{
if( !IsWindowState(WINDOW_BLIND)) {
SendAttachMailResult(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (sizeof(CSAttachMail) != nLen) return ERROR_INVALIDPACKET;
CSAttachMail *pMail = (CSAttachMail*)pData;
if (pMail->nMailDBID <= 0){ // <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20><><EFBFBD><EFBFBD>
SendAttachMailResult(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
int nRet = m_pItem->VerifyAttachItem(pMail);
if (nRet != ERROR_NONE){
SendAttachMailResult(nRet);
return ERROR_NONE;
}
return ERROR_NONE;
}
break;
// <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>
case CS_MARKETLIST:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if( !IsWindowState(WINDOW_BLIND) ){
SendMarketList(NULL, 0, 0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (sizeof(CSMarketList) != nLen)
return ERROR_INVALIDPACKET;
CSMarketList *pMarketList = (CSMarketList*)pData;
// cLevel <20><> char <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>ִ<EFBFBD>ġ<EFBFBD><C4A1> <20>Ѵ<EFBFBD><D1B4><EFBFBD> static_assert <20>ɾ<EFBFBD><C9BE>д<EFBFBD>.
BOOST_STATIC_ASSERT( CHARLEVELMAX <= SCHAR_MAX );
pMarketList->cMinLevel = (pMarketList->cMinLevel < 1) ? 1 : pMarketList->cMinLevel;
pMarketList->cMaxLevel = (pMarketList->cMaxLevel > CHARLEVELMAX) ? CHARLEVELMAX : pMarketList->cMaxLevel;
char cItemExchangeArray[ITEMCATAGORY_MAX];
memset(cItemExchangeArray, 0, sizeof(cItemExchangeArray));
if (pMarketList->nExchangeItemID >= 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<>װ<EFBFBD><D7B0><EFBFBD> <20>׷<EFBFBD> <20><>ȯ
TExchangeTrade* pExchange = g_pDataManager->GetExchageTradeData(pMarketList->nExchangeItemID);
if (!pExchange)
return ERROR_INVALIDPACKET;
if (pExchange->nCategoryType == 0)
{
if (!g_pDataManager->GetExchangeGroupID(pExchange->nGroupID, cItemExchangeArray))
return ERROR_INVALIDPACKET;
}
else // ī<>װ<EFBFBD><D7B0><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
{
cItemExchangeArray[0] = pExchange->ExchangeType;
}
}
else
{
cItemExchangeArray[0] = -1; // <20><>ü<EFBFBD>˻<EFBFBD>
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20>׷<EFBFBD> <20><>ȯ
char cJobCodeArray[ITEMJOB_MAX];
memset(cJobCodeArray, 0, sizeof(cJobCodeArray));
if (pMarketList->cJob >= 0)
{
if (pMarketList->bLowJobGroup)
{
g_pDataManager->GetJobGroupID(pMarketList->cJob, cJobCodeArray);
}
else
{
cJobCodeArray[0] = pMarketList->cJob;
}
}
else
{
cJobCodeArray[0] = -1; // <20><>ü<EFBFBD>˻<EFBFBD>
}
#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE
std::wstring wstrSearchItemName;
if (pMarketList->cCount > 0)
{
if (pMarketList->cCount == 1)
{
if (pMarketList->SearchList[0].nSearchItemID > 0 || pMarketList->SearchList[0].nSearchNameID)
{
if (pMarketList->SearchList[0].nSearchItemID > 0)
{
TItemData * pSearchItemData = g_pDataManager->GetItemData(pMarketList->SearchList[0].nSearchItemID);
if (pSearchItemData)
wstrSearchItemName = pSearchItemData->wszItemName;
}
if (wstrSearchItemName.empty() && pMarketList->SearchList[0].nSearchNameID)
wstrSearchItemName = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, pMarketList->SearchList[0].nSearchNameID, MultiLanguage::eDefaultLanguage);
}
}
else
{
for (int nSearchCount = 0; nSearchCount < pMarketList->cCount; nSearchCount++)
{
if (pMarketList->SearchList[nSearchCount].nSearchNameID)
{
wstrSearchItemName += GetEtUIXML().GetUIString(CEtUIXML::idCategory1, pMarketList->SearchList[nSearchCount].nSearchNameID, MultiLanguage::eDefaultLanguage);
if (nSearchCount != pMarketList->cCount - 1)
wstrSearchItemName += L" ";
}
}
}
}
if (wstrSearchItemName.empty())
wstrSearchItemName = pMarketList->wszSearchItemName;
/*if (pMarketList->nSearchItemID > 0 || pMarketList->nSearchNameID)
{
if (pMarketList->nSearchItemID > 0)
{
TItemData * pSearchItemData = g_pDataManager->GetItemData(pMarketList->nSearchItemID);
if (pSearchItemData)
wstrSearchItemName = pSearchItemData->wszItemName;
}
if (wstrSearchItemName.empty() && pMarketList->nSearchNameID)
wstrSearchItemName = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, pMarketList->nSearchNameID, MultiLanguage::eDefaultLanguage);
}
if (wstrSearchItemName.empty())
wstrSearchItemName = pMarketList->wszSearchItemName;*/
#endif //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE
#if defined(PRE_ADD_PETALTRADE)
#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE
m_pDBCon->QueryGetPageTrade(this, pMarketList, cJobCodeArray, cItemExchangeArray, const_cast<wchar_t*>(wstrSearchItemName.c_str()));
#else //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE
m_pDBCon->QueryGetPageTrade(this, pMarketList, cJobCodeArray, cItemExchangeArray, pMarketList->wszSearchItemName);
#endif //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE
#else //#if defined(PRE_ADD_PETALTRADE)
#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE
m_pDBCon->QueryGetPageTrade(this, pMarketList, cJobCodeArray, cItemExchangeArray, const_cast<wchar_t*>(wstrSearchItemName.c_str()));
#else //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE
m_pDBCon->QueryGetPageTrade(this, pMarketList, cJobCodeArray, cItemExchangeArray, pMarketList->wszSearchItemName);
#endif //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE
#endif //#if defined(PRE_ADD_PETALTRADE)
return ERROR_NONE;
}
break;
case CS_MYMARKETLIST:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (nLen != 0)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND) ){
SendMyMarketList(NULL, 0, 0, 0, 0, 0, ERROR_GENERIC_INVALIDREQUEST, false);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
m_pDBCon->QueryGetListMyTrade(this);
return ERROR_NONE;
}
break;
case CS_MARKET_REGISTER:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (sizeof(CSMarketRegister) != nLen)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND)){
SendMarketRegister(0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
CSMarketRegister *pMarket = (CSMarketRegister*)pData;
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
if ( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::LimitLevel_Market )) )
{
SendMarketRegister( 0, ERROR_GENERIC_LEVELLIMIT );
return ERROR_NONE;
}
int nRet = m_pItem->CheckRegisterMarketItem(pMarket);
if (nRet != ERROR_NONE){
SendMarketRegister(0, nRet);
}
return ERROR_NONE;
}
break;
case CS_MARKET_INTERRUPT:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (sizeof(CSMarketDBID) != nLen)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND)){
SendMarketInterrupt(0, 0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
CSMarketDBID *pMarket = (CSMarketDBID*)pData;
if (!m_pItem->IsCashMyMarketItem(pMarket->nMarketDBID) && (m_pItem->FindBlankInventorySlotCount() == 0)){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD> <20>˻<EFBFBD><><C4B3><EFBFBD><EFBFBD> <20>ƴҶ<C6B4><D2B6><EFBFBD>)
SendMarketInterrupt(pMarket->nMarketDBID, 0, ERROR_ITEM_INVENTORY_NOTENOUGH);
return ERROR_NONE;
}
int nRet = m_pItem->CancelMarketItem(pMarket->nMarketDBID);
if (nRet != ERROR_NONE){
SendMarketInterrupt(pMarket->nMarketDBID, 0, nRet);
return ERROR_NONE;
}
return ERROR_NONE;
}
break;
case CS_MARKET_BUY:
{
if (!IsValidPacketByNpcClick()) // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
if (sizeof(CSMarketBuy) != nLen)
return ERROR_INVALIDPACKET;
CSMarketBuy *pMarket = (CSMarketBuy*)pData;
if( !IsWindowState(WINDOW_BLIND)){
#if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(0, ERROR_GENERIC_INVALIDREQUEST, pMarket->bMini);
#else // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy(0, ERROR_GENERIC_INVALIDREQUEST, false);
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
if ( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::LimitLevel_Market )) )
{
#if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy( 0, ERROR_GENERIC_LEVELLIMIT, pMarket->bMini );
#else // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
SendMarketBuy( 0, ERROR_GENERIC_LEVELLIMIT, false );
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
return ERROR_NONE;
}
#if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
int nRet = m_pItem->BuyMarketItem(pMarket->nMarketDBID, pMarket->bMini);
if (nRet != ERROR_NONE){
SendMarketBuy(0, nRet, pMarket->bMini);
return ERROR_NONE;
}
#else // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
m_pDBCon->QueryGetTradeItemID(this, pMarket->nMarketDBID);
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
return ERROR_NONE;
}
break;
case CS_MARKET_CALCULATIONLIST:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (nLen != 0)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND)){
SendMarketCalculationList(NULL, 0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
m_pDBCon->QueryGetListTradeforCalculation(this);
return ERROR_NONE;
}
break;
case CS_MARKET_CALCULATION:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (sizeof(CSMarketDBID) != nLen)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND)){
SendMarketCalculation(0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
CSMarketDBID *pMarket = (CSMarketDBID*)pData;
m_pDBCon->QueryTradeCalculation(this, pMarket->nMarketDBID);
return ERROR_NONE;
}
break;
case CS_MARKET_CALCULATIONALL:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (nLen != 0)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND)){
SendMarketCalculationAll(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
m_pDBCon->QueryTradeCalculationAll(this);
return ERROR_NONE;
}
break;
case CS_MARKET_PETALBALANCE:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (nLen != 0)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND)){
SendMarketCalculation(0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
m_pDBCon->QueryGetPetalBalance(this);
return ERROR_NONE;
}
break;
case CS_MARKET_PRICE:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (sizeof(CSMarketPrice) != nLen)
return ERROR_INVALIDPACKET;
CSMarketPrice *pMarket = (CSMarketPrice*)pData;
TMarketPrice ItemPrices[2];
if (TradeSystem::CMarketPriceCache::GetInstance().GetTradePrice(pMarket->nItemID, pMarket->cLevel, pMarket->cOption, ItemPrices))
{
SendMarketPrice(ERROR_NONE, pMarket->nMarketDBID, ItemPrices);
return ERROR_NONE;
}
m_pDBCon->QueryGetTradePrice(this, pMarket);
return ERROR_NONE;
}
break;
#if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
case CS_MARKETMINILIST:
{
if( !IsWindowState(WINDOW_BLIND) ){
SendMarketMiniList(NULL, 0, 0, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (sizeof(CSMarketMiniList) != nLen)
return ERROR_INVALIDPACKET;
CSMarketMiniList *pMarketList = (CSMarketMiniList*)pData;
if (!g_pDataManager->GetItemData(pMarketList->nItemID)){
SendMarketMiniList(NULL, 0, 0, ERROR_ITEM_NOTFOUND);
return ERROR_NONE;
}
m_pDBCon->QueryGetListMiniTrade(this, pMarketList->nItemID, pMarketList->cPayMethodCode);
return ERROR_NONE;
}
break;
#endif // #if defined(PRE_ADD_DIRECT_BUY_UPGRADEITEM)
}
return CDNUserBase::OnRecvTradeMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvSkillMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
/*case CS_ADDSKILL:
{
CSAddSkill *pAddSkill = (CSAddSkill*)pData;
m_pSkill->AddSkill(pAddSkill->nSkillID);
return ERROR_NONE;
}
break;
case CS_DELSKILL:
{
CSDelSkill *pDelSkill = (CSDelSkill*)pData;
m_pSkill->DelSkill(pDelSkill->nSkillID);
return ERROR_NONE;
}
break;*/
case CS_SKILLLEVELUP_REQ:
{
if (sizeof(CSSkillLevelUpReq) != nLen)
return ERROR_INVALIDPACKET;
CSSkillLevelUpReq* pSkillLevelUp = (CSSkillLevelUpReq *)pData;
m_pSkill->SkillLevelUp( pSkillLevelUp->nSkillID, pSkillLevelUp->cUseSkillPoint );
return ERROR_NONE;
}
break;
case CS_ACQUIRESKILL_REQ:
{
if (sizeof(CSAcquireSkillReq) != nLen)
return ERROR_INVALIDPACKET;
CSAcquireSkillReq* pAcquireSkillReq = (CSAcquireSkillReq*)pData;
m_pSkill->AcquireSkill( pAcquireSkillReq->nSkillID );
return ERROR_NONE;
}
break;
case CS_UNLOCKSKILL_BY_MONEY_REQ:
{
if (sizeof(CSUnlockSkillByMoneyReq) != nLen)
return ERROR_INVALIDPACKET;
CSUnlockSkillByMoneyReq* pUnlockSkillByMoneyReq = (CSUnlockSkillByMoneyReq*)pData;
m_pSkill->UnLockSkillByMoney( pUnlockSkillByMoneyReq->nSkillID );
return ERROR_NONE;
}
break;
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
case CS_RESERVATION_SKILL_LIST_REQ :
{
CSReservationSkillListReq* pReservationSkillList = (CSReservationSkillListReq*)pData;
m_pSkill->ReservationSkillList(pReservationSkillList);
return ERROR_NONE;
}
break;
#endif
#ifdef PRE_ADD_PRESET_SKILLTREE
case CS_LIST_SKILLSET:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
if (GetDBConnection())
GetDBConnection()->QueryGetSkillPresetList(this);
return ERROR_NONE;
}
break;
case CS_SAVE_SKILLSET:
{
CSSaveSkillSet * pPacket = (CSSaveSkillSet*)pData;
if (sizeof(CSSaveSkillSet) - sizeof(pPacket->SKills) + (sizeof(TSkillSetPartialData) * pPacket->cCount) != nLen)
return ERROR_INVALIDPACKET;
if (wcslen(pPacket->wszSetName) <= 0)
return ERROR_GENERIC_UNKNOWNERROR;
if (pPacket->cIndex < 0 || pPacket->cIndex >= SKILLPRESETMAX)
return ERROR_GENERIC_UNKNOWNERROR;
if (GetDBConnection())
GetDBConnection()->QueryAddSkillPreset(this, pPacket);
return ERROR_NONE;
}
break;
case CS_DELETE_SKILLSET:
{
if (sizeof(CSDeleteSkillSet) != nLen)
return ERROR_INVALIDPACKET;
CSDeleteSkillSet * pPacket = (CSDeleteSkillSet*)pData;
if (pPacket->cIndex < 0 || pPacket->cIndex >= SKILLPRESETMAX)
return ERROR_GENERIC_UNKNOWNERROR;
if (GetDBConnection())
GetDBConnection()->QueryDelSkillPreset(this, pPacket->cIndex);
return ERROR_NONE;
}
break;
#endif //#ifdef PRE_ADD_PRESET_SKILLTREE
case CS_USE_SKILLRESET_CASHITEM_REQ:
{
CSUseSkillResetCashItemReq* pPacket = reinterpret_cast<CSUseSkillResetCashItemReq*>(pData);
#if defined(PRE_MOD_SKILLRESETITEM )
const TItem* pItem = NULL;
if( pPacket->cInvenType == ITEMPOSITION_INVEN )
pItem = m_pItem->GetInventory(pPacket->cInvenIndex);
else if( pPacket->cInvenType == ITEMPOSITION_CASHINVEN )
pItem = m_pItem->GetCashInventory(pPacket->biItemSerial);
#else
const TItem* pItem = m_pItem->GetCashInventory(pPacket->biItemSerial);
#endif // #if defined(PRE_MOD_SKILLRESETITEM )
if( pItem )
{
TItemData* pItemData = g_pDataManager->GetItemData( pItem->nItemID );
if( pItemData )
{
bool bDeleteItem = true;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>.
if( pItemData->nType == ITEMTYPE_INFINITY_RESET_SKILL )
{
#if defined(PRE_MOD_SKILLRESETITEM)
int iExistCount = 0;
if( pPacket->cInvenType == ITEMPOSITION_INVEN )
iExistCount = GetItem()->GetInventoryItemCountByType(ITEMTYPE_INFINITY_RESET_SKILL);
else if( pPacket->cInvenType == ITEMPOSITION_CASHINVEN )
iExistCount = GetItem()->GetCashItemCountByType( ITEMTYPE_INFINITY_RESET_SKILL );
#else
int iExistCount = GetItem()->GetCashItemCountByType( ITEMTYPE_INFINITY_RESET_SKILL );
#endif // #if defined(PRE_MOD_SKILLRESETITEM)
if( iExistCount <= 0 )
return ERROR_GENERIC_INVALIDREQUEST;
bDeleteItem = false;
}
if( bDeleteItem == true )
{
#if defined(PRE_MOD_SKILLRESETITEM)
if( !m_pItem->DeleteItemByUse( pPacket->cInvenType, pPacket->cInvenIndex, pPacket->biItemSerial) )
#else
if( !m_pItem->DeleteItemByUse( ITEMPOSITION_CASHINVEN, -1, pPacket->biItemSerial) )
#endif
return ERROR_GENERIC_INVALIDREQUEST;
}
m_pItem->UseSkillResetCashItem( pItemData );
}
}
return ERROR_NONE;
}
break;
case CS_CHANGE_SKILLPAGE:
{
SCChangeSkillPage* pPacket = reinterpret_cast<SCChangeSkillPage*>(pData);
if( pPacket->cSkillPage >= 0 && pPacket->cSkillPage < GetItem()->GetSkillPageCount())
{
SetSkillPage(pPacket->cSkillPage);
GetDBConnection()->QueryChagneSkillPage( this , pPacket->cSkillPage );
SendChangeSkillPage(pPacket->cSkillPage);
}
}
break;
}
return ERROR_UNKNOWN_HEADER; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϵǾ<CFB5><C7BE><EFBFBD> <20>մϴ<D5B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD>!
}
int CDNUserSession::OnRecvFriendMessage(int nSubCmd, char * pData, int nLen)
{
return CDNUserBase::OnRecvFriendMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvGuildMessage(int nSubCmd, char * pData, int nLen)
{
switch(nSubCmd)
{
case eGuild::CS_CREATEGUILD: // <20><><EFBFBD><EFBFBD> â<><C3A2> <20><>û
{
const CSCreateGuild *pPacket = reinterpret_cast<CSCreateGuild*>(pData);
// <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if (sizeof(CSCreateGuild) != nLen)
return ERROR_INVALIDPACKET;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if (0 >= ::wcslen(pPacket->wszGuildName))
{
SendCreateGuild(GetSessionID(), L"", ERROR_GENERIC_INVALIDREQUEST, NULL, NULL, 0, 0, 0, 0, NULL);
return ERROR_GENERIC_INVALIDREQUEST;
}
// 20100629 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۼ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD>ڴ뿪 Ȯ<><C8AE><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
if (!g_CountryUnicodeSet.Check(pPacket->wszGuildName))
{
SendCreateGuild(GetSessionID(), L"", ERROR_GENERIC_INVALIDREQUEST, NULL, NULL, 0, 0, 0, 0, NULL);
return ERROR_GENERIC_INVALIDREQUEST;
}
#ifdef PRE_MOD_74203
#if defined(PRE_ADD_MULTILANGUAGE)
if (g_pDataManager->CheckProhibitWord(static_cast<int>(m_eSelectedLanguage), pPacket->wszGuildName))
{
SendCreateGuild(GetSessionID(), L"", ERROR_GENERIC_INVALIDREQUEST, NULL, NULL, 0, 0, 0, 0, NULL);
return ERROR_GENERIC_INVALIDREQUEST;
}
#else //#if defined(PRE_ADD_MULTILANGUAGE)
if (g_pDataManager->CheckProhibitWord(pPacket->wszGuildName))
{
SendCreateGuild(GetSessionID(), L"", ERROR_GENERIC_INVALIDREQUEST, NULL, NULL, 0, 0, 0, 0, NULL);
return ERROR_GENERIC_INVALIDREQUEST;
}
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
#endif //#ifdef PRE_MOD_74203
// <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
const TGuildUID GuildUID = GetGuildUID();
if (GuildUID.IsSet())
{
SendCreateGuild(GetSessionID(), L"", ERROR_GUILD_YOUR_ALREADY_BELONGTOGUILD, NULL, NULL, 0, 0, 0, 0, NULL);
return ERROR_GUILD_YOUR_ALREADY_BELONGTOGUILD;
}
// <20><><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ּ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
if (GUILDCREATECHARLEVEL_DEF > GetLevel())
{
SendCreateGuild(GetSessionID(), L"", ERROR_GUILD_LACKOFCOUNT_CREATELEVEL, NULL, NULL, 0, 0, 0, 0, NULL);
return ERROR_GUILD_LACKOFCOUNT_CREATELEVEL;
}
TGuildLevel* GuildLevel = g_pDataManager->GetGuildLevelData(1);
if (!GuildLevel)
{
SendCreateGuild(GetSessionID(), L"", ERROR_GENERIC_UNKNOWNERROR, NULL, NULL, 0, 0, 0, 0, NULL);
return ERROR_GENERIC_UNKNOWNERROR;
}
int nReqCoin = GuildLevel->nReqGold;
if (nReqCoin > GetCoin())
{
SendCreateGuild(GetSessionID(), L"", ERROR_GUILD_LACKOFCOUNT_SELFMONEY, NULL, NULL, 0, 0, 0, 0, NULL);
return ERROR_GUILD_LACKOFCOUNT_SELFMONEY;
}
int wGuildRoleAuth[GUILDROLE_TYPE_CNT] = { 0, };
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)
g_pGuildManager->SetAuthBase(wGuildRoleAuth);
// DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_pDBCon->QueryCreateGuild(m_cDBThreadID, m_nAccountDBID, m_biCharacterDBID, pPacket->wszGuildName, GetMapIndex(), GetLevel(), nReqCoin, g_Config.nWorldSetID, wGuildRoleAuth);
return ERROR_NONE;
}
break;
case eGuild::CS_DISMISSGUILD: // <20><><EFBFBD><EFBFBD> <20><>ü <20><>û
{
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet()) {
SendDismissGuild(GetSessionID(), ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, NULL);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
// <20>̹<EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ
if (g_pGuildManager->IsDismissExist(GuildUID))
{
ResetGuildSelfView();
SendDismissGuild(GetSessionID(), ERROR_GUILD_ALREADYDISMISS_GUILD, NULL);
return ERROR_GUILD_ALREADYDISMISS_GUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7BFA9> <20>˻<EFBFBD>
if (!pGuild)
{
SendDismissGuild(GetSessionID(), ERROR_GUILD_NOTEXIST_GUILDINFO, NULL);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendDismissGuild(GetSessionID(), ERROR_GUILD_NOTEXIST_GUILDINFO, NULL);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if (GUILDROLE_TYPE_MASTER != GetGuildSelfView().btGuildRole)
{
SendDismissGuild(GetSessionID(), ERROR_GUILD_HAS_NO_AUTHORITY, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if (!pGuild->GetMemberInfo(GetCharacterDBID()))
{
SendDismissGuild(GetSessionID(), ERROR_GUILD_HAS_NO_AUTHORITY, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
// <20>Ҽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if (pGuild->GetMemberCount() > 1)
{
SendDismissGuild(GetSessionID(), ERROR_GUILD_STILLEXIST_MEMBER, NULL);
return ERROR_GUILD_STILLEXIST_MEMBER;
}
if (g_pGuildWarManager && pGuild->IsEnrollGuildWar() && g_pGuildWarManager->GetRestriction(nSubCmd, pGuild->GetUID()))
{
SendDismissGuild(GetSessionID(), ERROR_GUILDWAR_CANTDISMISS, NULL);
return ERROR_GUILDWAR_CANTDISMISS;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>ȯ
_ASSERT( dynamic_cast<CDNGuildVillage *>(pGuild) );
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
if (pGuildVillage)
{
CDNGuildWare* pGuildWare = NULL;
pGuildWare = pGuildVillage->GetGuildWare();
if (pGuildWare)
{
// <20><><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE>
if (pGuildWare->GetWarehouseCoin() != 0)
{
SendDismissGuild(GetSessionID(), ERROR_GUILD_CANTDISMISS_MONEY, NULL);
return ERROR_GUILD_CANTDISMISS_MONEY;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
if (pGuildWare->GetWareItemCount() > 0)
{
SendDismissGuild(GetSessionID(), ERROR_GUILD_CANTDISMISS_ITEM, NULL);
return ERROR_GUILD_CANTDISMISS_ITEM;
}
}
}
m_pDBCon->QueryDismissGuild(this);
return ERROR_NONE;
}
break;
case eGuild::CS_INVITEGUILDMEMBREQ: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>û
{
const CSInviteGuildMemberReq *pPacket = reinterpret_cast<CSInviteGuildMemberReq*>(pData);
if (sizeof(CSInviteGuildMemberReq) != nLen)
return ERROR_INVALIDPACKET;
if (0 >= ::wcslen(pPacket->wszToCharacterName))
{
SendInviteGuildMemberReq(GetGuildUID(), GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GENERIC_INVALIDREQUEST, 0, 0);
return ERROR_GENERIC_INVALIDREQUEST;
}
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet())
{
SendInviteGuildMemberReq(GetGuildUID(), GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, 0, 0);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILD_NOTEXIST_GUILDINFO, 0, 0);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILD_NOTEXIST_GUILDINFO, 0, 0);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20><><EFBFBD><EFBFBD> üũ(<28>ʴ<EFBFBD>)
DN_ASSERT(CHECK_LIMIT(GetGuildSelfView().btGuildRole, GUILDROLE_TYPE_CNT), "Check!");
if (!pGuild->CheckGuildInfoAuth(static_cast<eGuildRoleType>(GetGuildSelfView().btGuildRole), static_cast<eGuildAuthType>(GUILDAUTH_TYPE_INVITE)))
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
// <20>ο<EFBFBD><CEBF>߰<EFBFBD> <20><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> üũ
if (!pGuild->IsMemberAddable())
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILD_CANTADD_GUILDMEMBER, 0, 0);
return ERROR_GUILD_CANTADD_GUILDMEMBER;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><EFBFBD><E2B0A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
if (g_pGuildWarManager && pGuild->IsEnrollGuildWar() && g_pGuildWarManager->GetRestriction(nSubCmd, pGuild->GetUID()) )
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILDWAR_CANTADD_GUILDMEMBER, 0, 0);
return ERROR_GUILDWAR_CANTADD_GUILDMEMBER;
}
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByName(pPacket->wszToCharacterName);
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD>Ͽ<EFBFBD> ã<>ƺ<EFBFBD><C6BA><EFBFBD>.
if (!pUserObj)
{
g_pMasterConnection->SendInviteGuildMember(GuildUID, GetAccountDBID(), GetSessionID(), GetCharacterDBID(), GetCharacterName(), pPacket->wszToCharacterName, pGuild->GetInfo()->GuildView.wszGuildName );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>
// <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if (!pUserObj->m_bLoadUserData)
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_CHARACTER_DATA_NOT_LOADED_OPPOSITE, 0, 0);
return ERROR_CHARACTER_DATA_NOT_LOADED_OPPOSITE;
}
if (pUserObj->GetGuildUID().IsSet())
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILD_ALREADYINGUILD_OPPOSITEUSER, 0, 0);
return ERROR_GUILD_ALREADYINGUILD_OPPOSITEUSER;
}
if (GetAccountDBID() == pUserObj->GetAccountDBID())
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILD_CANTINVITE_YOURSELF, 0, 0);
return ERROR_GUILD_CANTINVITE_YOURSELF;
}
if (pUserObj->IsAcceptAbleOption(GetCharacterDBID(), GetAccountDBID(), _ACCEPTABLE_CHECKTYPE_GUILDINVITE) == false)
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILD_REFUESED_GUILDINVITATION, 0, 0);
return ERROR_GUILD_REFUESED_GUILDINVITATION;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if ( !pUserObj->IsNoneWindowState() )
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_GUILD_CANTACCEPT_GUILDINVITATION, 0, 0);
return ERROR_GUILD_CANTACCEPT_GUILDINVITATION;
}
#if defined(PRE_ADD_DWC)
if(pUserObj->IsDWCCharacter())
{
SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), pPacket->wszToCharacterName, ERROR_PARTY_INVITEFAIL_DESTUSER_SITUATION_NOTALLOWED, 0, 0);
return ERROR_PARTY_INVITEFAIL_DESTUSER_SITUATION_NOTALLOWED;
}
#endif
pUserObj->SetWindowState(WINDOW_ISACCEPT);
pUserObj->SendInviteGuildMemberReq(GuildUID, GetAccountDBID(), GetSessionID(), GetCharacterName(), ERROR_NONE, pUserObj->GetAccountDBID(), pUserObj->GetSessionID(), pGuild->GetInfo()->GuildView.wszGuildName);
return ERROR_NONE;
}
break;
case eGuild::CS_INVITEGUILDMEMBACK: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD>
{
const CSInviteGuildMemberAck *pPacket = reinterpret_cast<CSInviteGuildMemberAck*>(pData);
if (sizeof(CSInviteGuildMemberAck) != nLen)
return ERROR_INVALIDPACKET;
//const TGuildUID GuildUID = pPacket->GuildUID;
IsWindowStateNoneSet(WINDOW_ISACCEPT);
const TGuildUID GuildUID = GetGuildUID();
if (GuildUID.IsSet())
{
SendInviteGuildMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), ERROR_GUILD_YOUR_ALREADY_BELONGTOGUILD, 0, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_YOUR_ALREADY_BELONGTOGUILD;
}
// <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD> Ȯ<><C8AE>
if (!pPacket->bAccept)
{
// <20><><EFBFBD><EFBFBD>ʴ<EFBFBD><CAB4><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF>Ծ˸<D4BE>
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByAccountDBID(pPacket->nFromAccountID);
if (pUserObj)
pUserObj->SendInviteGuildMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), ERROR_GUILD_REFUESED_GUILDINVITATION, pUserObj->GetAccountDBID(), pUserObj->GetSessionID(), 0, 0, NULL, NULL);
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD><CAB4><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
g_pMasterConnection->SendInviteGuildResult(pPacket->nFromAccountID, ERROR_GUILD_REFUESED_GUILDINVITATION, true, GetCharacterName());
}
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>带 ã<>´<EFBFBD>.
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> DB<44><42>ȸ<EFBFBD><C8B8> <20>Ͽ<EFBFBD> ó<><C3B3><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
m_pDBCon->QueryGuildInviteMember(m_cDBThreadID, m_nAccountDBID, pPacket->GuildUID.nDBID, m_nWorldSetID, GetSessionID(), true);
m_pDBCon->QueryGetGuildRewardItem( m_cDBThreadID, m_nWorldSetID, m_nAccountDBID, pPacket->GuildUID.nDBID );
return ERROR_NONE;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> DB<44><42>ȸ<EFBFBD><C8B8> <20>Ͽ<EFBFBD> ó<><C3B3><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
m_pDBCon->QueryGuildInviteMember(m_cDBThreadID, m_nAccountDBID, pPacket->GuildUID.nDBID, m_nWorldSetID, GetSessionID(), true);
m_pDBCon->QueryGetGuildRewardItem( m_cDBThreadID, m_nWorldSetID, m_nAccountDBID, pPacket->GuildUID.nDBID );
return ERROR_NONE;
}
#endif
// <20>ο<EFBFBD><CEBF>߰<EFBFBD> <20><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> üũ
DN_ASSERT(!pGuild->IsLock(), "Already Locked!");
if (!pGuild->IsMemberAddable())
{
SendInviteGuildMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), ERROR_GUILD_CANTADD_GUILDMEMBER, 0, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_CANTADD_GUILDMEMBER;
}
m_pDBCon->QueryAddGuildMember(m_cDBThreadID, GetAccountDBID(), GetCharacterDBID(), pPacket->GuildUID.nDBID, GetLevel(), g_Config.nWorldSetID, pGuild->GetInfo()->wGuildSize);
return ERROR_NONE;
}
break;
case eGuild::CS_LEAVEGUILDMEMB: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB> <20><>û
{
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet())
{
SendLeaveGuildMember(GetAccountDBID(), GetCharacterDBID(), ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, NULL, false);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendLeaveGuildMember(GetAccountDBID(), GetCharacterDBID(), ERROR_GUILD_NOTEXIST_GUILDINFO, NULL, false);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendLeaveGuildMember(GetAccountDBID(), GetCharacterDBID(), ERROR_GUILD_NOTEXIST_GUILDINFO, NULL, false);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if (GUILDROLE_TYPE_MASTER == static_cast<eGuildRoleType>(GetGuildSelfView().btGuildRole))
{
SendLeaveGuildMember(GetAccountDBID(), GetCharacterDBID(), ERROR_GUILD_NOTAVAILABLE_GUILDMASTER, &GuildUID, false);
return ERROR_GUILD_NOTAVAILABLE_GUILDMASTER;
}
if (g_pGuildWarManager && pGuild->IsEnrollGuildWar() && g_pGuildWarManager->GetRestriction(nSubCmd, pGuild->GetUID()))
{
SendLeaveGuildMember(GetAccountDBID(), GetCharacterDBID(), ERROR_GUILDWAR_CANTLEAVE_GUILDMEMBER, &GuildUID, false);
return ERROR_GUILDWAR_CANTLEAVE_GUILDMEMBER;
}
m_pDBCon->QueryDelGuildMember(m_cDBThreadID, GetAccountDBID(), GetCharacterDBID(), GetAccountDBID(), GetCharacterDBID(), GuildUID.nDBID, GetLevel(), g_Config.nWorldSetID, false, false);
return ERROR_NONE;
}
break;
case eGuild::CS_EXILEGUILDMEMB: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߹<EFBFBD> <20><>û
{
const CSExileGuildMember *pPacket = reinterpret_cast<CSExileGuildMember*>(pData);
if (sizeof(CSExileGuildMember) != nLen)
return ERROR_INVALIDPACKET;
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet())
{
SendExileGuildMember(pPacket->nAccountDBID, pPacket->nCharacterDBID, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, NULL);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendExileGuildMember(pPacket->nAccountDBID, pPacket->nCharacterDBID, ERROR_GUILD_NOTEXIST_GUILDINFO, NULL);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendExileGuildMember(pPacket->nAccountDBID, pPacket->nCharacterDBID, ERROR_GUILD_NOTEXIST_GUILDINFO, NULL);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20><><EFBFBD><EFBFBD> üũ(<28>߹<EFBFBD>)
DN_ASSERT(CHECK_LIMIT(GetGuildSelfView().btGuildRole, GUILDROLE_TYPE_CNT), "Check!");
if (!pGuild->CheckGuildInfoAuth(static_cast<eGuildRoleType>(GetGuildSelfView().btGuildRole), static_cast<eGuildAuthType>(GUILDAUTH_TYPE_EXILE)))
{
SendExileGuildMember(pPacket->nAccountDBID, pPacket->nCharacterDBID, ERROR_GUILD_HAS_NO_AUTHORITY, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
TGuildMember* pGuildMember = pGuild->GetMemberInfo(pPacket->nCharacterDBID);
if (!pGuildMember)
{
SendExileGuildMember(pPacket->nAccountDBID, pPacket->nCharacterDBID, ERROR_GUILD_NOTOURGUILD_OPPOSITEUSER, NULL);
return ERROR_GUILD_NOTOURGUILD_OPPOSITEUSER;
}
// <20><EFBFBD><E6B8B6> <20>߹<EFBFBD><DFB9><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
if (pGuildMember->btGuildRole == GUILDROLE_TYPE_MASTER)
{
SendExileGuildMember(pPacket->nAccountDBID, pPacket->nCharacterDBID, ERROR_GUILD_HAS_NO_AUTHORITY, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
// <20>ش<EFBFBD> ij<><C4B3><EFBFBD>;<EFBFBD><CDBE>̵<EFBFBD> üũ
if (pPacket->nCharacterDBID == GetCharacterDBID())
{
SendExileGuildMember(pPacket->nAccountDBID, pPacket->nCharacterDBID, ERROR_GUILD_CANTEXILE_YOURSELF, NULL);
return ERROR_GUILD_CANTEXILE_YOURSELF;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B0A3><EFBFBD>°<EFBFBD><C2B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
if (g_pGuildWarManager && pGuild->IsEnrollGuildWar() && g_pGuildWarManager->GetRestriction(nSubCmd, pGuild->GetUID()) )
{
SendExileGuildMember(pPacket->nAccountDBID, pPacket->nCharacterDBID, ERROR_GUILDWAR_CANTEXILE_GUILDMEMBER, NULL);
return ERROR_GUILDWAR_CANTEXILE_GUILDMEMBER;
}
m_pDBCon->QueryDelGuildMember(m_cDBThreadID, GetAccountDBID(), GetCharacterDBID(), pPacket->nAccountDBID, pPacket->nCharacterDBID, GuildUID.nDBID, GetLevel(), g_Config.nWorldSetID, true, false);
return ERROR_NONE;
}
break;
case eGuild::CS_CHANGEGUILDINFO: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û
{
const CSChangeGuildInfo *pPacket = reinterpret_cast<CSChangeGuildInfo*>(pData);
if (sizeof(CSChangeGuildInfo) != nLen)
return ERROR_INVALIDPACKET;
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet())
{
SendChangeGuildInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->btGuildUpdate, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendChangeGuildInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->btGuildUpdate, ERROR_GUILD_NOTEXIST_GUILDINFO, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendChangeGuildInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->btGuildUpdate, ERROR_GUILD_NOTEXIST_GUILDINFO, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD> <20><><EFBFBD><EFBFBD>
eGuildRoleType btGuildRole = static_cast<eGuildRoleType>(GetGuildSelfView().btGuildRole);
// <20><><EFBFBD><EFBFBD> <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>ȭ<EFBFBD><C8AD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD> <20><>)
long nAddCommonPoint = 0;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><> üũ <20><> <20><><EFBFBD><EFBFBD>
switch(pPacket->btGuildUpdate)
{
case GUILDUPDATE_TYPE_NOTICE: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
// <20><><EFBFBD><EFBFBD> üũ(<28><><EFBFBD><EFBFBD>)
DN_ASSERT(CHECK_LIMIT(btGuildRole, GUILDROLE_TYPE_CNT), "Check!");
if (!pGuild->CheckGuildInfoAuth(btGuildRole, static_cast<eGuildAuthType>(GUILDAUTH_TYPE_NOTICE)))
{
SendChangeGuildInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->btGuildUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
}
break;
case GUILDUPDATE_TYPE_ROLEAUTH: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>߿<EFBFBD>! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD>)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if (0 > pPacket->Int3 || pPacket->Int3 > g_pDataManager->GetGuildLimitMaxItem())
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendChangeGuildInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->btGuildUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
// <20><><EFBFBD>ݾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if (0 > pPacket->Int4 || pPacket->Int4 > g_pDataManager->GetGuildLimitMaxCoin())
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendChangeGuildInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->btGuildUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
// <20><><EFBFBD><EFBFBD><E5B8B6><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޿<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
if (GUILDROLE_TYPE_MASTER == btGuildRole)
break; // DB<44><42><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD> ó<><C3B3>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
if (GUILDROLE_TYPE_SUBMASTER == btGuildRole)
{
// <20><><EFBFBD><EFBFBD><E5B8B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>X
if (GUILDROLE_TYPE_MASTER == pPacket->Int1)
{
}
else
break; // DB<44><42><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD> ó<><C3B3>
}
// <20><> <20>ܿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>õ<EFBFBD><C3B5>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>!
SendChangeGuildInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->btGuildUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
break;
#if defined( PRE_ADD_GUILD_EASYSYSTEM )
case GUILDUPDATE_TYPE_HOMEPAGE:
{
// <20><><EFBFBD><EFBFBD> üũ(Ȩ<><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
DN_ASSERT(CHECK_LIMIT(btGuildRole, GUILDROLE_TYPE_CNT), "Check!");
if (!pGuild->CheckGuildInfoAuth(btGuildRole, static_cast<eGuildAuthType>(GUILDAUTH_TYPE_HOMEPAGE)))
{
SendChangeGuildInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->btGuildUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
}
break;
#endif
default:
{
SendChangeGuildInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->btGuildUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
}
DN_RETURN(ERROR_GENERIC_INVALIDREQUEST);
}
m_pDBCon->QueryChangeGuildInfo(m_cDBThreadID, GetAccountDBID(), GetCharacterDBID(), GuildUID.nDBID, g_Config.nWorldSetID, pPacket->btGuildUpdate, pPacket->Int1, pPacket->Int2, pPacket->Int3, pPacket->Int4, pPacket->Int64, pPacket->Text, nAddCommonPoint);
return ERROR_NONE;
}
break;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û
case eGuild::CS_CHANGEGUILDMEMBINFO:
{
const CSChangeGuildMemberInfo *pPacket = reinterpret_cast<CSChangeGuildMemberInfo*>(pData);
if (sizeof(CSChangeGuildMemberInfo) != nLen)
return ERROR_INVALIDPACKET;
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet()) {
SendChangeGuildMemberInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendChangeGuildMemberInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, ERROR_GUILD_NOTEXIST_GUILDINFO, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendChangeGuildMemberInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, ERROR_GUILD_NOTEXIST_GUILDINFO, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
eGuildRoleType btGuildRole = static_cast<eGuildRoleType>(GetGuildSelfView().btGuildRole);
UINT nChgAccountDBID = 0;
INT64 nChgCharacterDBID = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><> üũ <20><> <20><><EFBFBD><EFBFBD>
switch(pPacket->btGuildMemberUpdate)
{
case GUILDMEMBUPDATE_TYPE_INTRODUCE: // <20>ڱ<EFBFBD><DAB1>Ұ<EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD>)
{
nChgAccountDBID = GetAccountDBID();
nChgCharacterDBID = GetCharacterDBID();
}
break;
case GUILDMEMBUPDATE_TYPE_ROLE: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ?)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
if (GUILDROLE_TYPE_SUBMASTER < btGuildRole)
{
SendChangeGuildMemberInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
if (GUILDROLE_TYPE_MASTER >= pPacket->Int1 || GUILDROLE_TYPE_CNT <= pPacket->Int1) {
SendChangeGuildMemberInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
return ERROR_GENERIC_INVALIDREQUEST;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if (GUILDROLE_TYPE_SUBMASTER == btGuildRole)
{
if (GUILDROLE_TYPE_MASTER == pPacket->Int1 || GUILDROLE_TYPE_SUBMASTER == pPacket->Int1)
{
SendChangeGuildMemberInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
return ERROR_GENERIC_INVALIDREQUEST;
}
}
nChgAccountDBID = pPacket->nChgAccountDBID;
nChgCharacterDBID = pPacket->nChgCharacterDBID;
}
break;
case GUILDMEMBUPDATE_TYPE_GUILDMASTER: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ?) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>!!!
{
if (GUILDROLE_TYPE_MASTER != static_cast<eGuildRoleType>(GetGuildSelfView().btGuildRole)) {
SendChangeGuildMemberInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, ERROR_GUILD_HAS_NO_AUTHORITY, 0, 0, 0, NULL, NULL);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
nChgAccountDBID = pPacket->nChgAccountDBID;
nChgCharacterDBID = pPacket->nChgCharacterDBID;
}
break;
// case GUILDMEMBUPDATE_TYPE_CMMPOINT: // <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>(<28><EFBFBD><E2BFA9>)
default:
{
SendChangeGuildMemberInfo(GetAccountDBID(), GetCharacterDBID(), pPacket->nChgAccountDBID, pPacket->nChgCharacterDBID, pPacket->btGuildMemberUpdate, ERROR_GENERIC_INVALIDREQUEST, 0, 0, 0, NULL, NULL);
}
DN_RETURN(ERROR_GENERIC_INVALIDREQUEST);
}
DN_ASSERT(0 != nChgAccountDBID, "Invalid!");
DN_ASSERT(0 != nChgCharacterDBID, "Invalid!");
m_pDBCon->QueryChangeGuildMemberInfo(m_cDBThreadID, GetAccountDBID(), GetCharacterDBID(), nChgAccountDBID, nChgCharacterDBID, GuildUID.nDBID, g_Config.nWorldSetID, pPacket->btGuildMemberUpdate, pPacket->Int1, pPacket->Int2, pPacket->Int64, pPacket->Text, GetLevel());
return ERROR_NONE;
}
break;
case eGuild::CS_GETGUILDHISTORYLIST: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><>û
{
const CSGetGuildHistoryList *pPacket = reinterpret_cast<CSGetGuildHistoryList*>(pData);
if (sizeof(CSGetGuildHistoryList) != nLen)
return ERROR_INVALIDPACKET;
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet()) {
SendGetGuildHistoryList(GetGuildUID(), 0, 0, 0, 0, ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, NULL, 0);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendGetGuildHistoryList(GetGuildUID(), 0, 0, 0, 0, ERROR_GUILD_NOTEXIST_GUILDINFO, NULL, 0);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendGetGuildHistoryList(GetGuildUID(), 0, 0, 0, 0, ERROR_GUILD_NOTEXIST_GUILDINFO, NULL, 0);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
m_pDBCon->QueryGetGuildHistoryList(this, pPacket->biIndex, pPacket->bDirection);
return ERROR_NONE;
}
break;
case eGuild::CS_GETGUILDINFO: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û
{
if (sizeof(CSGetGuildInfo) != nLen)
return ERROR_INVALIDPACKET;
g_pGuildManager->OnRecvCsGetGuildInfo(this, reinterpret_cast<CSGetGuildInfo*>(pData));
return ERROR_NONE;
}
break;
case eGuild::CS_GET_GUILDWARE_HISTORY: // <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20><>û
{
if (sizeof(CSGetGuildWareHistory) != nLen)
return ERROR_INVALIDPACKET;
g_pGuildManager->OnRecvCsGetGuildWareHistory(this, reinterpret_cast<CSGetGuildWareHistory*>(pData));
return ERROR_NONE;
}
break;
case eGuild::CS_CLOSE_GUILDWARE: // <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20>ݱ<EFBFBD>
{
g_pGuildManager->OnRecvCsCloseGuildWare(this);
return ERROR_NONE;
}
break;
case eGuild::CS_ENROLL_GUILDWAR: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û
{
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet()) {
SendEnrollGuildWar(ERROR_GUILD_YOUR_NOT_BELONGANYGUILD);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendEnrollGuildWar(ERROR_GUILD_NOTEXIST_GUILDINFO);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendEnrollGuildWar(ERROR_GUILD_NOTEXIST_GUILDINFO);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
eGuildRoleType btGuildRole = static_cast<eGuildRoleType>(GetGuildSelfView().btGuildRole);
// <20><><EFBFBD><EFBFBD> üũ
if (GUILDROLE_TYPE_MASTER != btGuildRole)
{
SendEnrollGuildWar(ERROR_GUILD_HAS_NO_AUTHORITY);
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
// <20>Ⱓ üũ
if (g_pGuildWarManager->GetStepIndex() != GUILDWAR_STEP_PREPARATION)
{
SendEnrollGuildWar(ERROR_GUILDWAR_CANTENROLL);
return ERROR_GUILDWAR_CANTENROLL;
}
// <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD>
if (pGuild->IsEnrollGuildWar())
{
SendEnrollGuildWar(ERROR_GUILDWAR_ALREADY_ENROLL);
return ERROR_GUILDWAR_ALREADY_ENROLL;
}
if (m_pDBCon)
m_pDBCon->QueryEnrollGuildWar(m_cDBThreadID, GetGuildUID().nDBID, g_Config.nWorldSetID, GetAccountDBID());
}
break;
case eGuild::CS_GUILDWAR_VOTE : // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
{
CSGuildWarVote *pPacket = reinterpret_cast<CSGuildWarVote*>(pData);
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet()) {
SendGuildWarVote(ERROR_GUILD_YOUR_NOT_BELONGANYGUILD);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendGuildWarVote(ERROR_GUILD_NOTEXIST_GUILDINFO);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendGuildWarVote(ERROR_GUILD_NOTEXIST_GUILDINFO);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20><>ǥ<EFBFBD><EFBFBD><E2B0A3><EFBFBD><EFBFBD>.
if ( g_pGuildWarManager->GetStepIndex() != GUILDWAR_STEP_REWARD )
{
SendGuildWarVote(ERROR_GUILDWAR_CANT_VOTE);
return ERROR_GUILDWAR_CANT_VOTE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߰ų<DFB0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>ƴϸ<C6B4>
if( !pGuild->IsEnrollGuildWar() || g_pGuildWarManager->IsGuildWarFinal(GetGuildUID()) || !GetGuildWarPoint() )
{
SendGuildWarVote(ERROR_GUILDWAR_CANT_VOTE);
return ERROR_GUILDWAR_CANT_VOTE;
}
// <20><>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD>
if ( GetGuildWarVote() )
{
SendGuildWarVote(ERROR_GUILDWAR_ALREADY_VOTE);
return ERROR_GUILDWAR_ALREADY_VOTE;
}
if (m_pDBCon)
m_pDBCon->QueryAddGuildWarPopularityVote(m_cDBThreadID, g_Config.nWorldSetID, GetAccountDBID(), GetCharacterDBID(), pPacket->GuildUID.nDBID );
}
break;
case eGuild::CS_GUILDWAR_COMPENSATION : // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ޱ<EFBFBD>
{
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet()) {
SendGuildWarReward(ERROR_GUILD_YOUR_NOT_BELONGANYGUILD);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendGuildWarReward(ERROR_GUILD_NOTEXIST_GUILDINFO);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendGuildWarReward(ERROR_GUILD_NOTEXIST_GUILDINFO);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B0A3><EFBFBD><EFBFBD>.
if ( g_pGuildWarManager->GetStepIndex() != GUILDWAR_STEP_REWARD || !IsGuildWarReward() || GetGuildWarRewardEnable() == GUILDWAR_REWARD_CHAR_MAX )
{
SendGuildWarReward(ERROR_GUILDWAR_CANT_COMPENSATION);
return ERROR_GUILDWAR_CANT_COMPENSATION;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20>˻<EFBFBD>.
if( GetGuildWarPoint() == 0)
{
SendGuildWarReward(ERROR_GUILDWAR_CANT_COMPENSATION);
return ERROR_GUILDWAR_CANT_COMPENSATION;
}
if (m_pDBCon)
{
CDNGuildVillage* pGuildVillage = static_cast<CDNGuildVillage *>(pGuild);
SetGuildWarRewardGuildPoint(pGuildVillage->CalcGuildWarTrialPoint());
SetGuildWarRewardFestivalPoint(g_pGuildWarManager->CalcGuildWarFestivalPoint(GetGuildSelfView().cTeamColorCode, GetCharacterDBID(), GetGuildWarPoint()));
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>޾Ҵ<DEBE><D2B4><EFBFBD> üũ<C3BC>ϰ<EFBFBD> <20><> <20>޾<EFBFBD><DEBE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..DB<44><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD>.
if( !pGuild->GetGuildWarRewardEnable(GUILDWAR_REWARD_GUILD_TRIAL_POINT) )
{
m_pDBCon->QueryAddGuildWarRewarForGuild(m_cDBThreadID, g_Config.nWorldSetID, g_pGuildWarManager->GetScheduleID(), pGuild->GetUID().nDBID, GUILDWAR_REWARD_GUILD_TRIAL_POINT);
}
m_pDBCon->QueryAddGuildWarRewarForCharacter(m_cDBThreadID, this);
}
}
break;
case eGuild::CS_GUILDWAR_WIN_SKILL :
{
CSGuildWarWinSkill *pPacket = reinterpret_cast<CSGuildWarWinSkill*>(pData);
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet()) {
SendGuildWarWinSkill(ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, 0);
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendGuildWarWinSkill(ERROR_GUILD_NOTEXIST_GUILDINFO, 0);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendGuildWarWinSkill(ERROR_GUILD_NOTEXIST_GUILDINFO, 0);
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20><><EFBFBD>±<EFBFBD><C2B1><20>´<EFBFBD><C2B4><EFBFBD> Ȯ<><C8AE>.
if( !g_pGuildWarManager->GetPreWinGuildUID().IsSet() && g_pGuildWarManager->GetPreWinGuildUID() != GuildUID )
{
SendGuildWarWinSkill(ERROR_GUILDWAR_NOT_PRE_WIN, 0);
return ERROR_GUILDWAR_NOT_PRE_WIN;
}
// <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>´<EFBFBD><C2B4><EFBFBD> Ȯ<><C8AE>
DWORD dwCurTick = timeGetTime();
if( g_pGuildWarManager->GetPreWinSKillCoolTime()+GUILDWAR_PRE_WIN_SKILL_COOLTIME > dwCurTick )
{
SendGuildWarWinSkill(ERROR_GUILDWAR_SKILL_COOLTIME, g_pGuildWarManager->GetPreWinSKillCoolTime()+GUILDWAR_PRE_WIN_SKILL_COOLTIME - dwCurTick);
return ERROR_GUILDWAR_SKILL_COOLTIME;
}
// nExp<78><70> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..UINT<4E><54><EFBFBD><EFBFBD>
g_pGuildWarManager->SetPreWinSKillCoolTime(dwCurTick);
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendSetGuilldWarPreWinSkillCoolTime(g_Config.nManagedID, dwCurTick);
}
SendGuildWarWinSkill(ERROR_NONE, 0);
m_ParamData.nExp = GetGuildUID().nDBID;
m_ParamData.nIndex = pPacket->nSkillID;
SendFieldMessage(FM_GUILDWARWINSKILL);
}
break;
case eGuild::CS_GUILD_BUY_REWARDITEM:
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (sizeof(CSBuyGuildRewardItem) != nLen)
return ERROR_INVALIDPACKET;
CSBuyGuildRewardItem *pPacket = reinterpret_cast<CSBuyGuildRewardItem*>(pData);
g_pGuildManager->BuyGuildRewardItem( this, pPacket->nItemID );
return ERROR_NONE;
}
break;
case eGuild::CS_PLAYER_REQUEST_GUILDINFO:
{
const CSPlayerGuildInfo *pPacket = reinterpret_cast<CSPlayerGuildInfo*>(pData);
if (sizeof(CSPlayerGuildInfo) != nLen)
return ERROR_INVALIDPACKET;
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSession(pPacket->nSessionID);
if( !pUserObj )
{
SendPlayerGuildInfo( ERROR_GENERIC_INVALIDREQUEST, 0, NULL, NULL, 0, 0, 0, NULL );
return ERROR_GENERIC_INVALIDREQUEST;
}
const TGuildUID GuildUID = pUserObj->GetGuildUID();
if (!GuildUID.IsSet())
{
SendPlayerGuildInfo( ERROR_NONE, pUserObj->GetSessionID(), NULL, NULL, 0, 0, 0, NULL );
return ERROR_NONE;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendPlayerGuildInfo( ERROR_NONE, pUserObj->GetSessionID(), NULL, NULL, 0, 0, 0, NULL );
return ERROR_NONE;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendPlayerGuildInfo( ERROR_NONE, pUserObj->GetSessionID(), NULL, NULL, 0, 0, 0, NULL );
return ERROR_NONE;
}
#endif
TGuildMember *GuildMaster = pGuild->GetGuildMaster();
if( GuildMaster )
SendPlayerGuildInfo( ERROR_NONE, pUserObj->GetSessionID(), pGuild->GetInfo()->GuildView.wszGuildName, GuildMaster->wszCharacterName, pGuild->GetLevel(), pGuild->GetMemberCount(), pGuild->GetGuildMemberSize(), pGuild->GetGuildRewardItem() );
else
SendPlayerGuildInfo( ERROR_NONE, pUserObj->GetSessionID(), pGuild->GetInfo()->GuildView.wszGuildName, NULL, pGuild->GetLevel(), pGuild->GetMemberCount(), pGuild->GetGuildMemberSize(), pGuild->GetGuildRewardItem() );
return ERROR_NONE;
}
break;
#if defined(PRE_ADD_GUILD_CONTRIBUTION)
case eGuild::CS_GUILD_CONTRIBUTION_RANK:
{
m_pDBCon->QueryGetWeeklyGuildContributionPointRanking( m_cDBThreadID, g_Config.nWorldSetID, GetAccountDBID(), GetGuildUID().nDBID );
return ERROR_NONE;
}
break;
#endif // #if defined(PRE_ADD_GUILD_CONTRIBUTION)
default:
DN_BREAK;
}
return ERROR_UNKNOWN_HEADER;
}
bool CDNUserSession::_CheckPvPGameModeInventory()
{
CDNPvPRoom* pPvPRoom = CDNPvPRoomManager::GetInstance().GetPvPRoom( GetChannelID(), GetPvPIndex() );
if( pPvPRoom == NULL )
{
_DANGER_POINT();
return false;
}
const TPvPGameModeTable* pPvPGameMode = g_pDataManager->GetPvPGameModeTable( pPvPRoom->GetGameModeTableID() );
if( pPvPGameMode == NULL )
{
_DANGER_POINT();
return false;
}
if( pPvPGameMode->iNeedInven > GetItem()->FindBlankInventorySlotCount() )
return false;
return true;
}
bool CDNUserSession::_CheckPvPGameModeInventory(UINT uiPvPIndex)
{
CDNPvPRoom* pPvPRoom = CDNPvPRoomManager::GetInstance().GetPvPRoom( GetChannelID(), uiPvPIndex );
if( pPvPRoom == NULL )
{
_DANGER_POINT();
return false;
}
if (pPvPRoom->GetEventRoomIndex() <= 0)
return true;
const TPvPGameModeTable* pPvPGameMode = g_pDataManager->GetPvPGameModeTable( pPvPRoom->GetGameModeTableID() );
if( pPvPGameMode == NULL )
{
_DANGER_POINT();
return false;
}
if( pPvPGameMode->iNeedInven > GetItem()->FindBlankInventorySlotCount() )
return false;
return true;
}
int CDNUserSession::OnRecvPvPMessage(int nSubCmd, char * pData, int nLen)
{
bool bCheckPvPLobby = true;
#if defined(PRE_ADD_QUICK_PVP)
// 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD>ϰ<EFBFBD> PVP<56><50> <20>ٸ<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>ֱ⵵ <20><><EFBFBD>ϰ<EFBFBD>..
if( nSubCmd == ePvP::CS_QUICKPVP_INVITE || nSubCmd == ePvP::CS_QUICKPVP_RESULT)
bCheckPvPLobby = false;
#endif
#if defined(PRE_ADD_PVP_VILLAGE_ACCESS)
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
if( bCheckPvPLobby && (nSubCmd == ePvP::CS_ROOMLIST || nSubCmd == ePvP::CS_JOINROOM || nSubCmd == ePvP::CS_CREATEROOM || nSubCmd == ePvP::CS_PVP_LIST_OPEN_UI || nSubCmd == ePvP::CS_ENTER_LADDERCHANNEL || nSubCmd == ePvP::CS_PVP_CHANGECHANNEL))
#else //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
if( bCheckPvPLobby && (nSubCmd == ePvP::CS_ROOMLIST || nSubCmd == ePvP::CS_JOINROOM || nSubCmd == ePvP::CS_CREATEROOM || nSubCmd == ePvP::CS_PVP_LIST_OPEN_UI || nSubCmd == ePvP::CS_ENTER_LADDERCHANNEL))
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
bCheckPvPLobby = false;
#endif
// PvP<76>κ<EFBFBD><CEBA><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
if( !m_pField || (bCheckPvPLobby && !m_pField->bIsPvPLobby()) )
{
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
switch(nSubCmd)
{
// PvPRoom <20><><EFBFBD><EFBFBD>
case ePvP::CS_CREATEROOM:
{
CSPVP_CREATEROOM * pPacket = reinterpret_cast<CSPVP_CREATEROOM*>(pData);
if(sizeof(CSPVP_CREATEROOM) - sizeof(pPacket->wszBuf) +((pPacket->cRoomNameLen + pPacket->cRoomPWLen) * sizeof(WCHAR)) != nLen)
return ERROR_INVALIDPACKET;
const short nRetCode = _RecvPvPCreateRoom( pPacket );
if( nRetCode != ERROR_NONE )
{
SendPvPCreateRoom( nRetCode );
}
break;
}
// PvPRoom <20><><EFBFBD><EFBFBD>
case ePvP::CS_MODIFYROOM:
{
CSPVP_MODIFYROOM * pPacket = reinterpret_cast<CSPVP_MODIFYROOM*>(pData);
if(sizeof(CSPVP_MODIFYROOM) - sizeof(pPacket->sCSPVP_CREATEROOM.wszBuf) + \
((pPacket->sCSPVP_CREATEROOM.cRoomNameLen + pPacket->sCSPVP_CREATEROOM.cRoomPWLen) * sizeof(WCHAR)) != nLen)
return ERROR_INVALIDPACKET;
const short nRetCode = _RecvPvPModifyRoom( pPacket );
if( nRetCode != ERROR_NONE )
{
SendPvPModifyRoom( nRetCode );
}
break;
}
// PvPRoom <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case ePvP::CS_LEAVEROOM:
{
if(nLen != 0)
return ERROR_INVALIDPACKET;
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendPvPLeaveRoom( GetAccountDBID() );
else
_DANGER_POINT();
break;
}
// PvPRoom <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case ePvP::CS_CHANGECAPTAIN:
{
CSPVP_CHANGECAPTAIN* pPacket = reinterpret_cast<CSPVP_CHANGECAPTAIN*>(pData);
if(sizeof(CSPVP_CHANGECAPTAIN) != nLen)
return ERROR_INVALIDPACKET;
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendPvPChangeCaptain( GetAccountDBID(), pPacket );
else
_DANGER_POINT();
break;
}
#if defined(PRE_ADD_PVP_VILLAGE_ACCESS)
case ePvP::CS_PVP_LIST_OPEN_UI :
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
//RLKT DISABLED
//const sChannelInfo* pChannelInfo = g_pMasterConnection->GetChannelInfoFromAttr(GlobalEnum::CHANNEL_ATT_PVP);
//if( pChannelInfo )
//{
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if( GetLevel() < 10 )//pChannelInfo->nLimitLevel ) //RLKT
SendPvPListOpenUI(ERROR_PVP_LIST_LEVEL_LIMIT, 10);
else
SendPvPListOpenUI(ERROR_NONE, 10);
//}
break;
}
#endif
// PvPRoom <20><EFBFBD><E6B8AE>Ʈ <20><>û
case ePvP::CS_ROOMLIST:
{
CSPVP_ROOMLIST* pPacket = reinterpret_cast<CSPVP_ROOMLIST*>(pData);
if(sizeof(CSPVP_ROOMLIST) != nLen)
return ERROR_INVALIDPACKET;
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
pPacket->cChannelType = GetPvPChannelType();
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendPvPRoomList( GetAccountDBID(), GetChannelID(), pPacket );
else
SendPvPRoomList( ERROR_GENERIC_MASTERCON_NOT_FOUND );
break;
}
case ePvP::CS_WAITUSERLIST:
{
CSPVP_WAITUSERLIST* pPacket = reinterpret_cast<CSPVP_WAITUSERLIST*>(pData);
if( sizeof(CSPVP_WAITUSERLIST) != nLen )
return ERROR_INVALIDPACKET;
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendPvPWaitUserList( GetAccountDBID(), GetChannelID(), pPacket );
else
SendPvPWaitUserList( ERROR_GENERIC_MASTERCON_NOT_FOUND );
break;
}
// PvPRoom <20><><EFBFBD><EFBFBD><EEB0A1>
case ePvP::CS_JOINROOM:
{
CSPVP_JOINROOM* pPacket = reinterpret_cast<CSPVP_JOINROOM*>(pData);
if(sizeof(CSPVP_JOINROOM) - sizeof(pPacket->wszRoomPW) +(pPacket->cRoomPWLen * sizeof(WCHAR)) != nLen)
return ERROR_INVALIDPACKET;
#if defined(PRE_ADD_PVP_VILLAGE_ACCESS)
if( m_pField->bIsPvPLobby() ) // <20>Ϲ<EFBFBD> PvP<76>κ<EFBFBD> <20>϶<EFBFBD><CFB6><EFBFBD> <20>˻<EFBFBD>..
{
if (_CheckPvPGameModeInventory(pPacket->uiPvPIndex) == false)
break;
}
#endif //#if defined(PRE_ADD_PVP_VILLAGE_ACCESS)
#if defined( PRE_PVP_GAMBLEROOM )
int nPvPLobbyChannelID = CDNPvPRoomManager::GetInstance().GetPvPLobbyChannelID();
CDNPvPRoom* pPvPRoom = CDNPvPRoomManager::GetInstance().GetPvPRoom( nPvPLobbyChannelID, pPacket->uiPvPIndex );
if( pPvPRoom)
{
int nRetCode = pPvPRoom->CheckGambleRoomJoin(this) ;
if( nRetCode != ERROR_NONE )
{
SendPvPJoinRoom( nRetCode );
break;
}
}
#endif
#if defined( PRE_WORLDCOMBINE_PVP )
if( pPacket->uiPvPIndex > PvPCommon::Common::MaxRoomCount)
{
if( GetPvPIndex() > 0)
break;
TWorldPvPRoomDBData* pWorldPvPRoomData = CDNPvPRoomManager::GetInstance().GetWorldPvPRoom( pPacket->uiPvPIndex );
int nWorldPvPRoomChannelID = CDNPvPRoomManager::GetInstance().GetWorldPvPRoomChannelID();
if( pWorldPvPRoomData )
{
CDNPvPRoom* pPvPRoom = CDNPvPRoomManager::GetInstance().GetPvPRoom( nWorldPvPRoomChannelID, pPacket->uiPvPIndex );
if( g_pMasterConnection && pPvPRoom )
{
bool bLobby = false;
if( GetField() && GetField()->bIsPvPLobby())
{
bLobby = true;
}
UINT uiTeam = -1;
if( pPacket->bIsObserver )
uiTeam = PvPCommon::Team::Observer;
else
{
if( !pPvPRoom->CheckLevel(GetLevel()) )
SendPvPJoinRoom( ERROR_PVP_JOINROOM_LEVELLIMIT );
if( pPvPRoom->GetWorldPvPRoomPw() )
{
int nRoomPw = _wtoi(pPacket->wszRoomPW);
if( pPvPRoom->GetWorldPvPRoomPw() != nRoomPw )
{
SendPvPJoinRoom( ERROR_PVP_JOINROOM_INVALIDPW );
break;
}
}
}
SetPvPIndex(pPacket->uiPvPIndex);
SendPvPJoinRoom(ERROR_NONE, pPvPRoom);
g_pMasterConnection->SendWorldPvPJoinRoom( GetAccountDBID(), GetCharacterDBID(), pPacket->uiPvPIndex, pWorldPvPRoomData, uiTeam, bLobby );
}
}
break;
}
#endif
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendPvPJoinRoom( GetAccountDBID(), GetLevel(), pPacket, this );
}
else
SendPvPJoinRoom( ERROR_GENERIC_MASTERCON_NOT_FOUND );
break;
}
// PvPRoom <20><><EFBFBD><EFBFBD>
case ePvP::CS_READY:
{
CSPVP_READY* pPacket = reinterpret_cast<CSPVP_READY*>(pData);
if(sizeof(CSPVP_READY) != nLen)
return ERROR_INVALIDPACKET;
if( _CheckPvPGameModeInventory() == false )
break;
if( g_pMasterConnection )
g_pMasterConnection->SendPvPReady( GetAccountDBID(), pPacket );
else
_DANGER_POINT();
break;
}
// PvPRoom <20><><EFBFBD><EFBFBD>
case ePvP::CS_START:
{
CSPVP_START* pPacket= reinterpret_cast<CSPVP_START*>(pData);
if(sizeof(CSPVP_START) != nLen)
return ERROR_INVALIDPACKET;
if( _CheckPvPGameModeInventory() == false )
break;
if( g_pMasterConnection )
g_pMasterConnection->SendPvPStart( GetAccountDBID(), pPacket );
else
_DANGER_POINT();
break;
}
// PvP<76><50> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1>
case ePvP::CS_RANDOMJOINROOM:
{
if(nLen != 0)
return ERROR_INVALIDPACKET;
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendPvPRandomJoinRoom( GetAccountDBID(), GetLevel() );
else
SendPvPJoinRoom( ERROR_GENERIC_MASTERCON_NOT_FOUND );
break;
}
// PvP <20><> <20><><EFBFBD><EFBFBD>
case ePvP::CS_CHANGETEAM:
{
CSPVP_CHANGETEAM* pPacket = reinterpret_cast<CSPVP_CHANGETEAM*>(pData);
if(sizeof(CSPVP_CHANGETEAM) != nLen)
return ERROR_INVALIDPACKET;
if( g_pMasterConnection )
g_pMasterConnection->SendPvPChangeTeam( GetAccountDBID(), GetLevel(), pPacket );
else
_DANGER_POINT();
break;
}
// <20>߹<EFBFBD>
case ePvP::CS_BAN:
{
if(sizeof(CSPVP_BAN) != nLen)
return ERROR_INVALIDPACKET;
if( g_pMasterConnection )
g_pMasterConnection->SendPvPBan( GetAccountDBID(), reinterpret_cast<CSPVP_BAN*>(pData) );
else
_DANGER_POINT();
break;
}
//####################################################################################################
// LadderSystem <20><><EFBFBD><EFBFBD> Protocol
//####################################################################################################
case ePvP::CS_ENTER_LADDERCHANNEL:
{
if(sizeof(LadderSystem::CS_ENTER_CHANNEL) != nLen )
return ERROR_INVALIDPACKET;
LadderSystem::CS_ENTER_CHANNEL* pPacket = reinterpret_cast<LadderSystem::CS_ENTER_CHANNEL*>(pData);
#if defined( PRE_FIX_TEAM_LADDER_3vs3 )
switch( pPacket->MatchType )
{
case LadderSystem::MatchType::_1vs1:
case LadderSystem::MatchType::_3vs3:
break;
default:
return ERROR_INVALIDPACKET;
}
#endif // #if defined( PRE_FIX_TEAM_LADDER_3vs3 )
if( g_pMasterConnection && g_pMasterConnection->GetActive() == true )
g_pMasterConnection->SendPvPLadderEnterChannel( GetAccountDBID(), pPacket->MatchType );
else
SendLadderEnterChannel( ERROR_GENERIC_MASTERCON_NOT_FOUND, pPacket->MatchType );
break;
}
case ePvP::CS_LEAVE_LADDERCHANNEL:
{
if( nLen != 0 )
return ERROR_INVALIDPACKET;
LadderSystem::CManager::GetInstance().OnLeaveChannel( this );
break;
}
case ePvP::CS_LADDER_MATCHING:
{
if(sizeof(LadderSystem::CS_LADDER_MATCHING) != nLen )
return ERROR_INVALIDPACKET;
LadderSystem::CS_LADDER_MATCHING* pPacket = reinterpret_cast<LadderSystem::CS_LADDER_MATCHING*>(pData);
LadderSystem::CManager::GetInstance().OnMatching( this, pPacket->bIsCancel );
break;
}
case ePvP::CS_LADDER_PLAYING_ROOMLIST:
{
if(sizeof(LadderSystem::CS_PLAYING_ROOMLIST) != nLen )
return ERROR_INVALIDPACKET;
LadderSystem::CS_PLAYING_ROOMLIST* pPacket = reinterpret_cast<LadderSystem::CS_PLAYING_ROOMLIST*>(pData);
LadderSystem::CRoom* pRoom = LadderSystem::CManager::GetInstance().GetRoomPtr( GetCharacterName() );
if( pRoom == NULL )
{
SendLadderPlayingRoomList( ERROR_INVALIDUSER_LADDERROOM );
break;
}
LadderSystem::CManager::GetInstance().GetRoomRepositoryPtr()->SendPlayingRoomList( this, pRoom->GetMatchType(), pPacket->uiReqPage );
break;
}
case ePvP::CS_LADDER_OBSERVER:
{
if(sizeof(LadderSystem::CS_OBSERVER) != nLen )
return ERROR_INVALIDPACKET;
int iRet = LadderSystem::CManager::GetInstance().OnEnterObserver( this, reinterpret_cast<LadderSystem::CS_OBSERVER*>(pData) );
SendLadderObserver( iRet );
break;
}
case ePvP::CS_LADDER_INVITE:
{
if( sizeof(LadderSystem::CS_INVITE) != nLen )
return ERROR_INVALIDPACKET;
if( g_pMasterConnection && g_pMasterConnection->GetActive() == true )
g_pMasterConnection->SendPvPLadderInviteUser( GetAccountDBID(), reinterpret_cast<LadderSystem::CS_INVITE*>(pData)->wszCharName );
else
SendPvPLadderInviteUser( ERROR_GENERIC_MASTERCON_NOT_FOUND, reinterpret_cast<LadderSystem::CS_INVITE*>(pData)->wszCharName );
break;
}
case ePvP::CS_LADDER_INVITE_CONFIRM:
{
if( sizeof(LadderSystem::CS_INVITE_CONFIRM) != nLen )
return ERROR_INVALIDPACKET;
if( g_pMasterConnection && g_pMasterConnection->GetActive() == true )
g_pMasterConnection->SendPvPLadderInviteConfirm( GetAccountDBID(), GetCharacterName(), reinterpret_cast<LadderSystem::CS_INVITE_CONFIRM*>(pData) );
else
SendPvPLadderInviteConfirm( ERROR_GENERIC_MASTERCON_NOT_FOUND, reinterpret_cast<LadderSystem::CS_INVITE_CONFIRM*>(pData)->wszCharName );
break;
}
case ePvP::CS_LADDER_KICKOUT:
{
if( sizeof(LadderSystem::CS_KICKOUT) != nLen )
return ERROR_INVALIDPACKET;
int iRet = LadderSystem::CManager::GetInstance().OnKickOut( this, reinterpret_cast<LadderSystem::CS_KICKOUT*>(pData)->biCharacterDBID );
SendPvPLadderKickOut( iRet );
break;
}
case ePvP::CS_FATIGUE_OPTION:
{
if(sizeof(CSPVP_FATIGUE_OPTION) != nLen )
return ERROR_INVALIDPACKET;
#if defined(PRE_ADD_DWC)
if(IsDWCCharacter())
return ERROR_DWC_FAIL;
#endif
CSPVP_FATIGUE_OPTION* pPacket = reinterpret_cast<CSPVP_FATIGUE_OPTION*>(pData);
// <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϸ<EFBFBD> <20><>.
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendPvPFatigueOption( GetAccountDBID(), pPacket->bOption );
break;
}
case ePvP::CS_SWAPMEMBERINDEX:
{
CSPvPTeamSwapMemberIndex * pPacket = (CSPvPTeamSwapMemberIndex*)pData;
if(sizeof(CSPvPTeamSwapMemberIndex) - sizeof(pPacket->Index) +(sizeof(TSwapMemberIndex) * pPacket->cCount) != nLen)
return ERROR_INVALIDPACKET;
if(g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendPvPSwapMemberIndex(GetAccountDBID(), pPacket->cCount, pPacket->Index);
else
SendPvPMemberIndex(0, 0, NULL, ERROR_PVP_SWAPTEAM_MEMBERINDEX_FAIL);
break;
}
case ePvP::CS_GUILDWAR_CHANGEMEMBER_GRADE:
{
CSPvPGuildWarChangeMemberGrade * pPacket = (CSPvPGuildWarChangeMemberGrade*)pData;
if(sizeof(CSPvPGuildWarChangeMemberGrade) != nLen)
return ERROR_INVALIDPACKET;
if(g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendPvPChangeMemberGrade(GetAccountDBID(), pPacket->nType, pPacket->nSessionID, pPacket->bAsign);
else
SendPvPGuildWarMemberGrade(0, 0, ERROR_PVP_CHANGEMEMBERGRADE_FAIL);
break;
}
#if defined(_VILLAGESERVER)
#if defined(PRE_ADD_QUICK_PVP)
case ePvP::CS_QUICKPVP_INVITE :
{
CSQuickPvPInvite* pPacket = (CSQuickPvPInvite*)pData;
if(sizeof(CSQuickPvPInvite) != nLen )
return ERROR_INVALIDPACKET;
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSession(pPacket->nReceiverSessionID);
if (!pUserSession){
SendQuickPvPResult(ERROR_PVP_QUICK_USERNOTFOUND);
return ERROR_NONE;
}
#if defined(PRE_ADD_DWC)
if( IsDWCCharacter() )
{
SendQuickPvPResult(ERROR_DWC_FAIL);
return ERROR_NONE;
}
if( pUserSession->IsDWCCharacter() )
{
SendQuickPvPResult(ERROR_PVP_QUICK_USERNOTFOUND);
return ERROR_NONE;
}
#endif
const sChannelInfo* pChannelInfo = g_pMasterConnection->GetChannelInfoFromAttr(GlobalEnum::CHANNEL_ATT_PVP);
if( pChannelInfo )
{
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if( GetLevel() < pChannelInfo->nLimitLevel )
{
SendQuickPvPResult(ERROR_PVP_QUICK_MY_LEVEL);
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if( pUserSession->GetLevel() < pChannelInfo->nLimitLevel )
{
SendQuickPvPResult(ERROR_PVP_QUICK_OTHER_LEVEL);
return ERROR_NONE;
}
}
else
{
SendQuickPvPResult(ERROR_PVP_QUICK_FAIL);
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD>..
if( !IsNoneWindowState() )
{
SendQuickPvPResult(ERROR_PVP_QUICK_FAIL);
return ERROR_NONE;
}
if( !pUserSession->IsNoneWindowState())
{
SendQuickPvPResult(ERROR_PVP_QUICK_CANTINVITE);
return ERROR_NONE;
}
if( pUserSession->m_eUserState != STATE_NONE )
{
SendQuickPvPResult(ERROR_PVP_QUICK_CANTINVITE);
return ERROR_NONE;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӿɼ<D3BF><C9BC><EFBFBD> Ȯ<><C8AE><EFBFBD>մϴ<D5B4>.
if (pUserSession->IsAcceptAbleOption(GetCharacterDBID(), GetAccountDBID(), _ACCEPTABEL_CHECKTYPE_QUICKPVPINVITE) == false)
{
SendQuickPvPResult(ERROR_PVP_QUICK_CANTINVITE);
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if( pUserSession->GetPartyID() > 0 || GetPartyID() > 0)
{
SendQuickPvPResult(ERROR_PVP_QUICK_CANTINVITE);
return ERROR_NONE;
}
pUserSession->SetWindowState(WINDOW_ISACCEPT);
pUserSession->SendQuickPvPInvite(GetSessionID());
}
break;
case ePvP::CS_QUICKPVP_RESULT :
{
CSQuickPvPResult* pPacket = (CSQuickPvPResult*)pData;
if(sizeof(CSQuickPvPResult) != nLen)
return ERROR_INVALIDPACKET;
IsWindowStateNoneSet(WINDOW_ISACCEPT);
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSession(pPacket->nSenderSessionID);
if (!pUserSession){
SendQuickPvPResult(ERROR_PVP_QUICK_USERNOTFOUND);
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD>..
if( !IsNoneWindowState() )
{
SendQuickPvPResult(ERROR_PVP_QUICK_FAIL);
pUserSession->SendQuickPvPResult(ERROR_PVP_QUICK_DENY);
return ERROR_NONE;
}
if( !pUserSession->IsNoneWindowState() )
{
SendQuickPvPResult(ERROR_PVP_QUICK_FAIL);
pUserSession->SendQuickPvPResult(ERROR_PVP_QUICK_DENY);
return ERROR_NONE;
}
if( pUserSession->m_eUserState != STATE_NONE )
{
SendQuickPvPResult(ERROR_PVP_QUICK_FAIL);
pUserSession->SendQuickPvPResult(ERROR_PVP_QUICK_DENY);
return ERROR_NONE;
}
if( pPacket->bAccept )
{
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
g_pMasterConnection->SendMakeQuickPvPRoom(pUserSession->GetAccountDBID(), GetAccountDBID());
else
{
SendQuickPvPResult(ERROR_PVP_QUICK_FAIL);
pUserSession->SendQuickPvPResult(ERROR_PVP_QUICK_DENY);
return ERROR_NONE;
}
}
else
pUserSession->SendQuickPvPResult(ERROR_PVP_QUICK_DENY);
}
break;
#endif //#if defined(PRE_ADD_QUICK_PVP)
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
case ePvP::CS_PVP_CHANGECHANNEL:
{
if (sizeof(CSPVP_CHANGECHANNEL) != nLen)
return ERROR_INVALIDPACKET;
CSPVP_CHANGECHANNEL * pPacket = (CSPVP_CHANGECHANNEL*)pData;
if (pPacket->cType >= PvPCommon::RoomType::max)
{
//<2F><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20>ؾ<EFBFBD><D8BE><EFBFBD>
_DANGER_POINT();
SendPvPChangeChannelResult(static_cast<BYTE>(m_ePvPChannel), ERROR_PVP_CHANGELEVEL_FAIL);
return ERROR_NONE;
}
if (g_pMasterConnection)
g_pMasterConnection->SendPvPChangeChannel(GetAccountDBID(), pPacket->cType, GetPvPData()->cLevel, static_cast<BYTE>(CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::Colosseum_Limit_Rank)));
else
{
_DANGER_POINT();
SendPvPChangeChannelResult(static_cast<BYTE>(m_ePvPChannel), ERROR_PVP_CHANGELEVEL_FAIL);
}
}
break;
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
#endif //#if defined(_VILLAGESERVER)
#if defined(PRE_ADD_PVP_TOURNAMENT)
case ePvP::CS_PVP_SWAP_TOURNAMENT_INDEX:
{
if(sizeof(CSPvPSwapTournamentIndex) != nLen )
return ERROR_INVALIDPACKET;
CSPvPSwapTournamentIndex* pPacket = reinterpret_cast<CSPvPSwapTournamentIndex*>(pData);
if(g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendPvPSwapTournamentIndex(GetAccountDBID(), pPacket->cSourceIndex, pPacket->cDestIndex);
else
SendPvPMemberIndex(0, 0, NULL, ERROR_PVP_SWAP_TOURNAMENT_INDEX_FAIL);
break;
}
break;
#endif
default:
{
return ERROR_UNKNOWN_HEADER;
}
}
return ERROR_NONE;
}
int CDNUserSession::OnRecvFarmMessage(int nSubCmd, char * pData, int nLen)
{
switch(nSubCmd)
{
case eFarm::CS_START:
{
if(g_pMasterConnection && g_pMasterConnection->GetActive() )
{
CSFarmEnter * pPacket = (CSFarmEnter*)pData;
#if defined( PRE_ADD_FARM_DOWNSCALE ) && defined( PRE_ADD_VIP_FARM )
int iAttr = Farm::Attr::None;
if( g_pFarm->GetFarmAttr( pPacket->iFarmDBID, iAttr ) == false )
{
_DANGER_POINT();
break;
}
if( iAttr&Farm::Attr::Vip )
{
if( bIsFarmVip() == false )
{
SendFarmStart( ERROR_FARM_INVALID_VIP );
return ERROR_NONE;
}
}
#elif defined( PRE_ADD_VIP_FARM )
Farm::Attr::eType Attr = Farm::Attr::None;
if( g_pFarm->GetFarmAttr( pPacket->iFarmDBID, Attr ) == false )
{
_DANGER_POINT();
break;
}
switch( Attr )
{
case Farm::Attr::Vip:
{
if( bIsFarmVip() == false )
{
SendFarmStart( ERROR_FARM_INVALID_VIP );
return ERROR_NONE;
}
break;
}
}
#endif // #if defined( PRE_ADD_FARM_DOWNSCALE ) && defined( PRE_ADD_VIP_FARM )
//rlkt 2016
g_pMasterConnection->SendReqGameID( GameTaskType::Farm, REQINFO_TYPE_PVP_BREAKINTO, m_nAccountDBID, GetChannelID(), timeGetTime(), 15025, 0, CONVERT_TO_DUNGEONDIFFICULTY(0), true, NULL, pPacket->iFarmDBID );
//g_pMasterConnection->SendReqGameID( GameTaskType::Farm, REQINFO_TYPE_FARM, m_nAccountDBID, GetChannelID(), timeGetTime(), 15025, 0, CONVERT_TO_DUNGEONDIFFICULTY(0), true, NULL, pPacket->iFarmDBID );
}
else
{
_DANGER_POINT();
}
break;
}
case eFarm::CS_FARMINFO:
{
ReqFarmInfo(false);
break;
}
}
return ERROR_NONE;
}
int CDNUserSession::OnRecvIsolateMessage(int nSubCmd, char * pData, int nLen)
{
return CDNUserBase::OnRecvIsolateMessage(nSubCmd, pData, nLen);
}
int CDNUserSession::OnRecvAppellationMessage(int nSubCmd, char * pData, int nLen)
{
switch( nSubCmd ) {
case eAppellation::CS_SELECT_APPELLATION:
{
CSSelectAppellation *pPacket = (CSSelectAppellation *)pData;
if(sizeof(CSSelectAppellation) != nLen)
return ERROR_INVALIDPACKET;
if( m_pAppellation->OnRecvSelectAppellation( pPacket->nArrayIndex, pPacket->nCoverArrayIndex ) == false )
_DANGER_POINT();
return ERROR_NONE;
}
break;
#if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
#else
case eAppellation::CS_COLLECTIONBOOK:
{
CSCollectionBook *pPacket = (CSCollectionBook*)pData;
if(sizeof(CSCollectionBook) != nLen)
return ERROR_INVALIDPACKET;
m_pAppellation->OnRecvCollectionBook(pPacket->nCollectionID);
return ERROR_NONE;
}
break;
#endif // #if defined(PRE_MOD_APPELLATIONBOOK_RENEWAL)
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserSession::OnRecvGameOptionMessage(int nSubCmd, char * pData, int nLen)
{
return CDNUserBase::OnRecvGameOptionMessage(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(GetPartyID() <= 0)
{ //<2F><>Ƽ<EFBFBD><C6BC><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD>.
_DANGER_POINT();
return ERROR_NONE;
}
g_pPartyManager->SendPartyUseRadio(GetPartyID(), GetSessionID(), pPacket->nID);
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
#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;
CDNParty * pParty = NULL;
if(GetPartyID() > 0)
pParty = g_pPartyManager->GetParty(GetPartyID());
if(m_bVoiceAvailable)
{
if(m_nVoiceChannelID > 0 || pParty == NULL) return ERROR_NONE;
if(pParty->m_nVoiceChannelID > 0)
JoinVoiceChannel(pParty->m_nVoiceChannelID, GetIp(), &GetTargetPos(), (int)m_nVoiceRotate);
}
else
LeaveVoiceChannel();
if(pParty)
pParty->SendRefreshVoiceInfo();
return ERROR_NONE;
}
break;
case eVoiceChat::CS_VOICEMUTE:
{
CSVoiceMute * pPacket = (CSVoiceMute*)pData;
if(sizeof(CSVoiceMute) != nLen)
return ERROR_INVALIDPACKET;
if(GetPartyID() <= 0 || m_nVoiceChannelID <= 0)
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
CDNUserSession * pSession = g_pUserSessionManager->FindUserSession(pPacket->nSessionID);
if(pSession)
VoiceMuteOnetoOne(pSession->GetAccountDBID(), pPacket->cMute == 0 ? false : true);
else
_DANGER_POINT();
return ERROR_NONE;
}
break;
case eVoiceChat::CS_VOICECOMPLAINTREQ:
{
CSVoiceComplaintReq * pPacket = (CSVoiceComplaintReq*)pData;
if(sizeof(CSVoiceComplaintReq) != nLen)
return ERROR_INVALIDPACKET;
if(GetPartyID() <= 0 || m_nVoiceChannelID <= 0)
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
CDNUserSession * pSession = g_pUserSessionManager->FindUserSession(pPacket->nSessionID);
if(pSession)
VoiceComplaintRequest(pSession->GetAccountDBID(), pPacket->szCategory, pPacket->szSubject, pPacket->szMsg);
else
_DANGER_POINT();
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
#endif
int CDNUserSession::OnRecvChatRoomMessage( int nSubCmd, char * pData, int nLen )
{
switch( nSubCmd )
{
case eChatRoom::CS_CREATECHATROOM:
{
CSCreateChatRoom * pCreateChatRoom = (CSCreateChatRoom *)pData;
if(sizeof(CSCreateChatRoom) != nLen) return ERROR_INVALIDPACKET;
// #23581 ä<><C3A4><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>û <20><> ä<>ù<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
if( m_eUserState != STATE_NONE )
return ERROR_NONE;
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 = g_pChatRoomManager->CreateChatRoom( GetAccountDBID(), pCreateChatRoom->wszName, pCreateChatRoom->nRoomType,
pCreateChatRoom->nRoomAllow, pCreateChatRoom->wszPassword,
pCreateChatRoom->PRLine1, pCreateChatRoom->PRLine2, pCreateChatRoom->PRLine3 );
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 = g_pChatRoomManager->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( GetAccountDBID(), 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 )
{
g_pChatRoomManager->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>
BroadcastingChatRoom( eChatRoom::SC_CHATROOMVIEW, pChatRoom->GetChatRoomID() );
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 = g_pChatRoomManager->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( GetAccountDBID(), pEnterRoom->wszPassword, false );
if( nRet == ERROR_NONE )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID
if( pChatRoom->GetLeaderAID() > 0 )
{
CDNUserSession * pLeaderSession = g_pUserSessionManager->FindUserSessionByAccountDBID( pChatRoom->GetLeaderAID() );
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 = g_pUserSessionManager->FindUserSessionByAccountDBID( 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>
BroadcastingChatRoom( eChatRoom::SC_ENTERUSERCHATROOM, pChatRoom->GetChatRoomID() );
// <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 = g_pChatRoomManager->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( GetAccountDBID() ) == 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>
BroadcastingChatRoom( eChatRoom::SC_CHATROOMVIEW, pChatRoom->GetChatRoomID() );
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 = g_pChatRoomManager->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( GetAccountDBID() ) == 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 = g_pUserSessionManager->FindUserSession( pKickUser->nKickUserSessionID );
if( pUserSession == NULL )
{
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
nRet = pChatRoom->LeaveUser( pUserSession->GetAccountDBID(), 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>
pUserSession->BroadcastingChatRoom( eChatRoom::SC_LEAVEUSER, -pKickUser->nKickReason );
}
return ERROR_NONE;
}
break;
case eChatRoom::CS_LEAVEROOM:
{
if(0 != nLen) return ERROR_INVALIDPACKET;
int nRet = ERROR_NONE;
CDNChatRoom * pChatRoom = g_pChatRoomManager->GetChatRoom( m_nChatRoomID );
if( pChatRoom == NULL )
{
return ERROR_NONE;
}
if( pChatRoom->IsLeader(GetAccountDBID()) )
{
// <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 = g_pUserSessionManager->FindUserSessionByAccountDBID( 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->GetAccountDBID(), 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( GetAccountDBID() ) )
{
TChatRoomView RoomView;
RoomView.Set( 0, L"", CHATROOMTYPE_NONE, false, L"", L"", L"" );
pUserSession->SendChatRoomLeaveUser( pUserSession->GetSessionID(), CHATROOMLEAVE_DESTROYROOM );
pUserSession->BroadcastingChatRoom( eChatRoom::SC_CHATROOMVIEW, 0 ); // <20><><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
else
{
pUserSession->SendChatRoomLeaveUser( pUserSession->GetSessionID(), CHATROOMLEAVE_DESTROYROOM );
pUserSession->BroadcastingChatRoom( eChatRoom::SC_LEAVEUSER, -CHATROOMLEAVE_DESTROYROOM ); // <20><><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
}
}
// <20><><EFBFBD><EFBFBD>~!
g_pChatRoomManager->DestroyChatRoom( pChatRoom->GetChatRoomID() );
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E6BFA1> <20><><EFBFBD><EFBFBD>
nRet = pChatRoom->LeaveUser( GetAccountDBID(), 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>
BroadcastingChatRoom( eChatRoom::SC_LEAVEUSER, -CHATROOMLEAVE_LEAVE ); // <20><><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
}
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserSession::OnRecvMasterSystemMessage( int nSubCmd, char* pData, int nLen )
{
switch( nSubCmd )
{
case eMasterSystem::CS_MASTERLIST:
{
if( sizeof(MasterSystem::CSMasterList) != nLen )
return ERROR_INVALIDPACKET;
// <20><><EFBFBD>¸<EFBFBD><C2B8><EFBFBD> <20><>û<EFBFBD><C3BB> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> üũ( <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>,<2C>ִ뽺<D6B4>¼<EFBFBD> )
if( GetLevel() > static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_PupilMaxLevel )) || m_MasterSystemData.SimpleInfo.iMasterCount >= MasterSystem::Max::MasterCount )
{
SendMasterSystemMasterList( ERROR_GENERIC_INVALIDREQUEST, std::vector<TMasterInfo>() );
return ERROR_NONE;
}
MasterSystem::CSMasterList* pPacket = reinterpret_cast<MasterSystem::CSMasterList*>(pData);
MasterSystem::CCacheRepository::GetInstance().GetMasterList( this, pPacket->uiPage, pPacket->cJob, pPacket->cGender );
return ERROR_NONE;
}
case eMasterSystem::CS_INTRODUCTION_ONOFF:
{
MasterSystem::CSIntroduction* pPacket = reinterpret_cast<MasterSystem::CSIntroduction*>(pData);
int iNeedSize = pPacket->bRegister ? sizeof(MasterSystem::CSIntroduction) : sizeof(MasterSystem::CSIntroduction)-sizeof(pPacket->wszSelfIntroduction);
if( iNeedSize != nLen )
return ERROR_INVALIDPACKET;
// üũ
if( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_MasterMinLevel )) )
{
SendMasterSystemIntroductionOnOff( ERROR_GENERIC_INVALIDREQUEST, pPacket->bRegister, NULL );
return ERROR_NONE;
}
if( CheckDBConnection() == false )
{
SendMasterSystemIntroductionOnOff( ERROR_GENERIC_DBCON_NOT_FOUND, pPacket->bRegister, NULL );
return ERROR_NONE;
}
if( pPacket->bRegister )
{
size_t len = wcslen(pPacket->wszSelfIntroduction);
if( len == 0 || len >= MasterSystem::Max::SelfIntrotuctionLen )
{
SendMasterSystemIntroductionOnOff( ERROR_GENERIC_INVALIDREQUEST, pPacket->bRegister, NULL );
return ERROR_NONE;
}
GetDBConnection()->QueryRegisterMasterCharacter( this, pPacket->wszSelfIntroduction );
}
else
{
GetDBConnection()->QueryRegisterCancelMasterCharacter( this );
}
return ERROR_NONE;
}
case eMasterSystem::CS_MASTER_APPLICATION:
{
MasterSystem::CSMasterApplication* pPacket = reinterpret_cast<MasterSystem::CSMasterApplication*>(pData);
if( sizeof(MasterSystem::CSMasterApplication) != nLen )
return ERROR_INVALIDPACKET;
// üũ
if( GetLevel() > static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_PupilMaxLevel )) )
{
SendMasterSystemMasterApplication( ERROR_GENERIC_INVALIDREQUEST );
return ERROR_NONE;
}
if( bIsMasterApplicationPenalty() )
{
SendMasterSystemMasterApplication( ERROR_MASTERSYSTEM_MASTERAPPLICATION_PENALTY );
}
else
{
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendCheckMasterApplication( pPacket->biCharacterDBID, GetCharacterDBID() );
}
else
{
SendMasterSystemMasterApplication( ERROR_GENERIC_MASTERCON_NOT_FOUND );
}
}
return ERROR_NONE;
}
case eMasterSystem::CS_JOIN:
{
MasterSystem::CSJoin* pPacket = reinterpret_cast<MasterSystem::CSJoin*>(pData);
if( sizeof(MasterSystem::CSJoin) != nLen )
return ERROR_INVALIDPACKET;
// üũ
if( GetLevel() > static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_PupilMaxLevel )) )
{
SendMasterSystemJoin( ERROR_GENERIC_INVALIDREQUEST, false, false, true );
return ERROR_NONE;
}
if( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::LimitLevel_MasterSystem )) )
{
SendMasterSystemJoin( ERROR_GENERIC_LEVELLIMIT, false, false, true );
return ERROR_NONE;
}
if( CheckDBConnection() == false )
{
SendMasterSystemJoin( ERROR_GENERIC_DBCON_NOT_FOUND, false, false, true );
return ERROR_NONE;
}
// <20><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> ã<>ƺ<EFBFBD><C6BA><EFBFBD>.
CDNUserSession* pMasterSession = g_pUserSessionManager->FindUserSessionByName(pPacket->wszMasterCharName );
if( !pMasterSession )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if( g_pMasterConnection == NULL || g_pMasterConnection->GetActive() == false )
{
SendMasterSystemJoin( ERROR_GENERIC_MASTERCON_NOT_FOUND, false, false, true );
return ERROR_NONE;
}
g_pMasterConnection->SendMasterSystemJoinConfirm(pPacket->biMasterCharacterDBID, GetLevel(), GetUserJob(), GetCharacterName());
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<>ü<EFBFBD><C3BC><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20>˻<EFBFBD>
if( !pMasterSession->IsNoneWindowState() )
{
SendMasterSystemJoin( ERROR_MASTERSYSTEM_CANT_JOINSTATE, false, false, true );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pMasterSession->SendMasterSystemJoinComfirm(GetLevel(), GetUserJob(), GetCharacterName());
}
return ERROR_NONE;
}
case eMasterSystem::CS_JOIN_CONFIRM :
{
MasterSystem::CSJoinComfirm* pPacket = reinterpret_cast<MasterSystem::CSJoinComfirm*>(pData);
// <20><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> ã<>ƺ<EFBFBD><C6BA><EFBFBD>.
CDNUserSession* pPupilSession = g_pUserSessionManager->FindUserSessionByName(pPacket->wszPupilCharName);
if( !pPupilSession )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if( g_pMasterConnection == NULL || g_pMasterConnection->GetActive() == false )
return ERROR_NONE;
g_pMasterConnection->SendMasterSystemJoinConfirmResult(ERROR_NONE, pPacket->bIsAccept, GetCharacterDBID(), pPacket->wszPupilCharName);
}
else
{
if( pPacket->bIsAccept )
{
#if defined( _FINAL_BUILD )
GetDBConnection()->QueryJoinMasterSystem( this, GetCharacterDBID(), pPupilSession->GetCharacterDBID(), false, DBDNWorldDef::TransactorCode::Master );
#else
GetDBConnection()->QueryJoinMasterSystem( this, GetCharacterDBID(), pPupilSession->GetCharacterDBID(), false, DBDNWorldDef::TransactorCode::Master, m_bIsMasterSystemSkipDate );
#endif // #if defined( _FINAL_BUILD )
}
else
pPupilSession->SendMasterSystemJoin( ERROR_MASTERSYSTEM_JOIN_DENY, false, false, true );
}
return ERROR_NONE;
}
case eMasterSystem::CS_CLASSMATEINFO:
{
MasterSystem::CSClassmateInfo* pPacket = reinterpret_cast<MasterSystem::CSClassmateInfo*>(pData);
if( sizeof(MasterSystem::CSClassmateInfo) != nLen )
return ERROR_INVALIDPACKET;
if( CheckDBConnection() == false )
{
SendMasterSystemClassmateInfo( ERROR_GENERIC_DBCON_NOT_FOUND );
return ERROR_NONE;
}
MasterSystem::CCacheRepository::GetInstance().GetClassmateInfo( this, pPacket->biClassmateCharacterDBID, true );
return ERROR_NONE;
}
case eMasterSystem::CS_MYMASTERINFO:
{
MasterSystem::CSMyMasterInfo* pPacket = reinterpret_cast<MasterSystem::CSMyMasterInfo*>(pData);
if( sizeof(MasterSystem::CSMyMasterInfo) != nLen )
return ERROR_INVALIDPACKET;
MasterSystem::CCacheRepository::GetInstance().GetMyMasterInfo( this, GetCharacterDBID(), pPacket->biMasterCharacterDBID, true );
return ERROR_NONE;
}
case eMasterSystem::CS_LEAVE:
{
MasterSystem::CSLeave* pPacket = reinterpret_cast<MasterSystem::CSLeave*>(pData);
if( sizeof(MasterSystem::CSLeave) != nLen )
return ERROR_INVALIDPACKET;
if( g_pMasterConnection == NULL || g_pMasterConnection->GetActive() == false )
{
SendMasterSystemLeave( ERROR_GENERIC_MASTERCON_NOT_FOUND );
return ERROR_NONE;
}
g_pMasterConnection->SendMasterSystemCheckLeave( GetAccountDBID(), pPacket->biDestCharacterDBID, pPacket->bIsMaster );
return ERROR_NONE;
}
case eMasterSystem::CS_INVITE_PUPIL:
{
MasterSystem::CSInvitePupil* pPacket = reinterpret_cast<MasterSystem::CSInvitePupil*>(pData);
if( sizeof(MasterSystem::CSInvitePupil) != nLen )
return ERROR_INVALIDPACKET;
// üũ
if( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_MasterMinLevel )) || m_MasterSystemData.SimpleInfo.iPupilCount >= MasterSystem::Max::PupilCount || m_MasterSystemData.SimpleInfo.iMasterCount > 0 )
{
SendMasterSystemInvitePupil( ERROR_GENERIC_INVALIDREQUEST, pPacket->wszCharName );
return ERROR_NONE;
}
CDNUserSession* pPupilSession = g_pUserSessionManager->FindUserSessionByName( pPacket->wszCharName );
if( pPupilSession == NULL )
{
SendMasterSystemInvitePupil( ERROR_GENERIC_USER_NOT_FOUND, pPacket->wszCharName );
return ERROR_NONE;
}
if( pPupilSession->GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::LimitLevel_MasterSystem )) )
{
SendMasterSystemInvitePupil( ERROR_GENERIC_LEVELLIMIT, pPacket->wszCharName );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
if( GetMapIndex() != pPupilSession->GetMapIndex() || GetChannelID() != pPupilSession->GetChannelID() )
{
SendMasterSystemInvitePupil( ERROR_GENERIC_INVALIDREQUEST, pPacket->wszCharName );
return ERROR_NONE;
}
// <20><><EFBFBD>ڰ<EFBFBD> ij<>ü<EFBFBD><C3BC><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20>˻<EFBFBD>
if( !pPupilSession->IsNoneWindowState() )
{
SendMasterSystemInvitePupil( ERROR_MASTERSYSTEM_CANT_JOINSTATE, pPacket->wszCharName );
return ERROR_NONE;
}
if( pPupilSession->GetMasterSystemData()->SimpleInfo.iMasterCount >= MasterSystem::Max::MasterCount )
{
SendMasterSystemInvitePupil( ERROR_MASTERSYSTEM_CANT_JOINSTATE, pPacket->wszCharName );
return ERROR_NONE;
}
#if defined(PRE_FIX_MASTERSYSTEM_CHECK_PUPILBLOCKDATE)
if ( pPupilSession->bIsMasterApplicationPenalty() )
{
SendMasterSystemInvitePupil( ERROR_MASTERSYSTEM_CANT_JOINSTATE, pPacket->wszCharName );
return ERROR_NONE;
}
#endif // #if defined(PRE_FIX_MASTERSYSTEM_CHECK_PUPILBLOCKDATE)
SendMasterSystemInvitePupil( ERROR_NONE, pPacket->wszCharName );
pPupilSession->SendMasterSystemInvitePupilConfirm( ERROR_NONE, GetCharacterName() );
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD><C2BA><EFBFBD>
pPupilSession->SetWindowState(WINDOW_ISACCEPT);
return ERROR_NONE;
}
case eMasterSystem::CS_INVITE_PUPIL_CONFIRM:
{
MasterSystem::CSInvitePupilConfirm* pPacket = reinterpret_cast<MasterSystem::CSInvitePupilConfirm*>(pData);
if( sizeof(MasterSystem::CSInvitePupilConfirm) != nLen )
return ERROR_INVALIDPACKET;
IsWindowStateNoneSet(WINDOW_ISACCEPT);
CDNUserSession* pMasterSession = g_pUserSessionManager->FindUserSessionByName( pPacket->wszMasterCharName );
if( pMasterSession == NULL )
{
SendMasterSystemInvitePupilConfirm( ERROR_GENERIC_USER_NOT_FOUND, pPacket->wszMasterCharName );
return ERROR_NONE;
}
// üũ
if( GetLevel() > static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_PupilMaxLevel )) )
{
SendMasterSystemInvitePupilConfirm( ERROR_GENERIC_INVALIDREQUEST, pPacket->wszMasterCharName );
return ERROR_NONE;
}
if( CheckDBConnection() == false )
{
SendMasterSystemInvitePupilConfirm( ERROR_GENERIC_DBCON_NOT_FOUND, pPacket->wszMasterCharName );
return ERROR_NONE;
}
if( pPacket->bIsAccept == false )
{
pMasterSession->SendMasterSystemInvitePupil( ERROR_MASTERSYSTEM_JOIN_DENY, GetCharacterName() );
return ERROR_NONE;
}
#if defined( _FINAL_BUILD )
GetDBConnection()->QueryJoinMasterSystem( this, pMasterSession->GetCharacterDBID(), GetCharacterDBID(), true, DBDNWorldDef::TransactorCode::Pupil );
#else
GetDBConnection()->QueryJoinMasterSystem( this, pMasterSession->GetCharacterDBID(), GetCharacterDBID(), true, DBDNWorldDef::TransactorCode::Pupil, m_bIsMasterSystemSkipDate );
#endif // #if defined( _FINAL_BUILD )
return ERROR_NONE;
}
case eMasterSystem::CS_JOIN_DIRECT:
{
MasterSystem::CSJoinDirect* pPacket = reinterpret_cast<MasterSystem::CSJoinDirect*>(pData);
if( sizeof(MasterSystem::CSJoinDirect) != nLen )
return ERROR_INVALIDPACKET;
// üũ
if( GetLevel() > static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_PupilMaxLevel )) || m_MasterSystemData.SimpleInfo.iMasterCount >= MasterSystem::Max::MasterCount )
{
SendMasterSystemJoinDirect( ERROR_GENERIC_INVALIDREQUEST, pPacket->wszMasterCharName );
return ERROR_NONE;
}
if( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::LimitLevel_MasterSystem )) )
{
SendMasterSystemJoinDirect( ERROR_GENERIC_LEVELLIMIT, pPacket->wszMasterCharName );
return ERROR_NONE;
}
CDNUserSession* pMasterSession = g_pUserSessionManager->FindUserSessionByName( pPacket->wszMasterCharName );
if( pMasterSession == NULL )
{
SendMasterSystemJoinDirect( ERROR_GENERIC_USER_NOT_FOUND, pPacket->wszMasterCharName );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
if( GetMapIndex() != pMasterSession->GetMapIndex() || GetChannelID() != pMasterSession->GetChannelID() )
{
SendMasterSystemJoinDirect( ERROR_GENERIC_INVALIDREQUEST, pPacket->wszMasterCharName );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<>ü<EFBFBD><C3BC><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20>˻<EFBFBD>
if( !pMasterSession->IsNoneWindowState() )
{
SendMasterSystemJoinDirect( ERROR_MASTERSYSTEM_CANT_JOINSTATE, pPacket->wszMasterCharName );
return ERROR_NONE;
}
if( pMasterSession->GetMasterSystemData()->SimpleInfo.iPupilCount >= MasterSystem::Max::PupilCount )
{
SendMasterSystemJoinDirect( ERROR_MASTERSYSTEM_CANT_JOINSTATE, pPacket->wszMasterCharName );
return ERROR_NONE;
}
SendMasterSystemJoinDirect( ERROR_NONE, pPacket->wszMasterCharName );
pMasterSession->SendMasterSystemJoinDirectConfirm( ERROR_NONE, GetCharacterName() );
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD><C2BA><EFBFBD>
pMasterSession->SetWindowState(WINDOW_ISACCEPT);
return ERROR_NONE;
}
case eMasterSystem::CS_JOIN_DIRECT_CONFIRM:
{
MasterSystem::CSJoinDirectConfirm* pPacket = reinterpret_cast<MasterSystem::CSJoinDirectConfirm*>(pData);
if( sizeof(MasterSystem::CSJoinDirectConfirm) != nLen )
return ERROR_INVALIDPACKET;
IsWindowStateNoneSet(WINDOW_ISACCEPT);
CDNUserSession* pPupilSession = g_pUserSessionManager->FindUserSessionByName( pPacket->wszPupilCharName );
if( pPupilSession == NULL )
{
SendMasterSystemInvitePupilConfirm( ERROR_GENERIC_USER_NOT_FOUND, pPacket->wszPupilCharName );
return ERROR_NONE;
}
// üũ
if( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_MasterMinLevel )) )
{
SendMasterSystemInvitePupilConfirm( ERROR_GENERIC_INVALIDREQUEST, pPacket->wszPupilCharName );
return ERROR_NONE;
}
if( CheckDBConnection() == false )
{
SendMasterSystemInvitePupilConfirm( ERROR_GENERIC_DBCON_NOT_FOUND, pPacket->wszPupilCharName );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD>
if( pPacket->bIsAccept == false )
{
pPupilSession->SendMasterSystemJoinDirect( ERROR_MASTERSYSTEM_JOIN_DENY, GetCharacterName() );
return ERROR_NONE;
}
#if defined( _FINAL_BUILD )
GetDBConnection()->QueryJoinMasterSystem( this, GetCharacterDBID(), pPupilSession->GetCharacterDBID(), true, DBDNWorldDef::TransactorCode::Master );
#else
GetDBConnection()->QueryJoinMasterSystem( this, GetCharacterDBID(), pPupilSession->GetCharacterDBID(), true, DBDNWorldDef::TransactorCode::Master, m_bIsMasterSystemSkipDate );
#endif // #if defined( _FINAL_BUILD )
return ERROR_NONE;
}
case eMasterSystem::CS_RECALL_MASTER:
{
MasterSystem::CSRecallMaster* pPacket = reinterpret_cast<MasterSystem::CSRecallMaster*>(pData);
if( sizeof(MasterSystem::CSRecallMaster) != nLen )
return ERROR_INVALIDPACKET;
// üũ
if( GetLevel() > static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_PupilMaxLevel )) || GetMasterSystemData()->SimpleInfo.iMasterCount <= 0 )
{
SendMasterSystemRecallMaster( ERROR_GENERIC_INVALIDREQUEST, pPacket->wszMasterCharName, false );
return ERROR_NONE;
}
CDNUserSession* pMasterSession = g_pUserSessionManager->FindUserSessionByName( pPacket->wszMasterCharName );
if( pMasterSession )
{
// <20><><EFBFBD><EFBFBD> ä<><C3A4> <20>˻<EFBFBD>
if( GetChannelID() == pMasterSession->GetChannelID() )
{
SendMasterSystemRecallMaster( ERROR_MASTERSYSTEM_RECALL_SAMECHANNEL, pPacket->wszMasterCharName, false );
return ERROR_NONE;
}
else
{
// <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if( pMasterSession->m_eUserState != STATE_NONE || pMasterSession->GetPartyID() > 0 || !pMasterSession->IsNoneWindowState() )
{
SendMasterSystemRecallMaster( ERROR_MASTERSYSTEM_RECALL_CANTSTATUS, pPacket->wszMasterCharName, false );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
bool bCheck = false;
for( int i=0 ; i<GetMasterSystemData()->SimpleInfo.iMasterCount ; ++i )
{
if( pMasterSession->GetCharacterDBID() == GetMasterSystemData()->SimpleInfo.OppositeInfo[i].CharacterDBID )
{
bCheck = true;
break;
}
}
if( bCheck == false )
{
SendMasterSystemRecallMaster( ERROR_MASTERSYSTEM_RECALL_FAILED, pPacket->wszMasterCharName, false );
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD><C2BA><EFBFBD>..
pMasterSession->SetWindowState(WINDOW_ISACCEPT);
SendMasterSystemRecallMaster( ERROR_NONE, pPacket->wszMasterCharName, false );
pMasterSession->SendMasterSystemRecallMaster( ERROR_NONE, GetCharacterName(), true );
return ERROR_NONE;
}
}
if( g_pMasterConnection == NULL || g_pMasterConnection->GetActive() == false )
{
SendMasterSystemRecallMaster( ERROR_GENERIC_MASTERCON_NOT_FOUND, pPacket->wszMasterCharName, false );
return ERROR_NONE;
}
g_pMasterConnection->SendMasterSystemRecallMaster( GetAccountDBID(), GetCharacterName(), pPacket->wszMasterCharName, GetMasterSystemData() );
return ERROR_NONE;
}
case eMasterSystem::CS_BREAKINTO_PUPIL:
{
MasterSystem::CSBreakInto* pPacket = reinterpret_cast<MasterSystem::CSBreakInto*>(pData);
if( sizeof(MasterSystem::CSBreakInto) != nLen )
return ERROR_INVALIDPACKET;
// üũ
if( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_MasterMinLevel )) || GetMasterSystemData()->SimpleInfo.iPupilCount <= 0 )
{
_DANGER_POINT();
return ERROR_NONE;
}
int iRet = pPacket->iRet;
if( pPacket->iRet == ERROR_NONE )
{
if( m_eUserState != STATE_NONE || GetPartyID() > 0 )
iRet = ERROR_MASTERSYSTEM_RECALL_CANTSTATUS;
}
SetWindowState(WINDOW_NONE); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ǯ<><C7AE><EFBFBD>ֱ<EFBFBD>
if( g_pMasterConnection == NULL || g_pMasterConnection->GetActive() == false )
return ERROR_NONE;
g_pMasterConnection->SendMasterSystemBreakInto( iRet, GetAccountDBID(), pPacket->wszPupilCharName, GetMasterSystemData() );
return ERROR_NONE;
}
}
return CDNUserBase::OnRecvMasterSystemMessage( nSubCmd, pData, nLen );
}
#if defined( PRE_ADD_SECONDARY_SKILL )
int CDNUserSession::OnRecvSecondarySkillMessage( int nSubCmd, char * pData, int nLen )
{
return CDNUserBase::OnRecvSecondarySkillMessage( nSubCmd, pData, nLen );
}
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
void CDNUserSession::OnDBRecvMsgadjustment(int nSubCmd, char * pData)
{
switch(nSubCmd)
{
case QUERY_MSGADJUST:
{
TAMsgAdjust * pPacket = (TAMsgAdjust*)pData;
if(g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendVillageToVillage(REQINFO_TYPE_SINGLE_SAMEDEST, GetAccountDBID(), pPacket->nVerifyMapIndex, pPacket->cGateNo, pPacket->nChannelID );
else
SendMoveChannelFail(ERROR_PARTY_MOVECHANNELFAIL);
m_eUserState = STATE_NONE;
}
}
}
int CDNUserSession::OnRecvGuildRecruitMessage( int nSubCmd, char* pData, int nLen )
{
switch( nSubCmd )
{
case eGuildRecruit::CS_GUILDRECRUIT_REGISTER:
{
GuildRecruitSystem::CSGuildRecruitRegister* pPacket = reinterpret_cast<GuildRecruitSystem::CSGuildRecruitRegister*>(pData);
if( sizeof(GuildRecruitSystem::CSGuildRecruitRegister) != nLen )
return ERROR_INVALIDPACKET;
const TGuildUID GuildUID = GetGuildUID();
if( !GuildUID.IsSet())
{
SendRegisterGuildRecruitList( ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, (GuildRecruitSystem::RegisterType::eType)pPacket->cRegisterType );
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendRegisterGuildRecruitList( ERROR_GUILD_NOTEXIST_GUILDINFO, (GuildRecruitSystem::RegisterType::eType)pPacket->cRegisterType );
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendRegisterGuildRecruitList( ERROR_GUILD_NOTEXIST_GUILDINFO, (GuildRecruitSystem::RegisterType::eType)pPacket->cRegisterType );
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20><><EFBFBD><EFBFBD> üũ(<28>ʴ<EFBFBD>)
DN_ASSERT(CHECK_LIMIT(GetGuildSelfView().btGuildRole, GUILDROLE_TYPE_CNT), "Check!");
//<2F><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EBB0A1>
if ( GetGuildSelfView().btGuildRole != GUILDROLE_TYPE_MASTER )
{
SendRegisterGuildRecruitList( ERROR_GUILD_ONLYAVAILABLE_GUILDMASTER, (GuildRecruitSystem::RegisterType::eType)pPacket->cRegisterType );
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
#if defined( PRE_ADD_GUILD_EASYSYSTEM )
if( pPacket->cRegisterType == GuildRecruitSystem::RegisterType::RegisterOn) //<2F><><EFBFBD><EFBFBD>
GetDBConnection()->QueryRegisterOnGuildRecruit( this, pPacket->wszGuildIntroduction, pPacket->cClassGrade, pPacket->nMinLevel, pPacket->nMaxLevel, pPacket->cPurposeCode, pPacket->bCheckHomePage );
else if( pPacket->cRegisterType == GuildRecruitSystem::RegisterType::RegisterMod) //<2F><><EFBFBD><EFBFBD>
GetDBConnection()->QueryRegisterModGuildRecruit( this, pPacket->wszGuildIntroduction, pPacket->cClassGrade, pPacket->nMinLevel, pPacket->nMaxLevel, pPacket->cPurposeCode, pPacket->bCheckHomePage );
else if( pPacket->cRegisterType == GuildRecruitSystem::RegisterType::RegisterOff) //<2F><><EFBFBD><EFBFBD>
GetDBConnection()->QueryRegisterOffGuildRecruit( this );
#else // #if defined( PRE_ADD_GUILD_EASYSYSTEM )
if( pPacket->cRegisterType == GuildRecruitSystem::RegisterType::RegisterOn) //<2F><><EFBFBD><EFBFBD>
GetDBConnection()->QueryRegisterOnGuildRecruit( this, pPacket->wszGuildIntroduction, pPacket->cClassGrade, pPacket->nMinLevel, pPacket->nMaxLevel, 0, false );
else if( pPacket->cRegisterType == GuildRecruitSystem::RegisterType::RegisterMod) //<2F><><EFBFBD><EFBFBD>
GetDBConnection()->QueryRegisterModGuildRecruit( this, pPacket->wszGuildIntroduction, pPacket->cClassGrade, pPacket->nMinLevel, pPacket->nMaxLevel, 0, false );
else if( pPacket->cRegisterType == GuildRecruitSystem::RegisterType::RegisterOff) //<2F><><EFBFBD><EFBFBD>
GetDBConnection()->QueryRegisterOffGuildRecruit( this );
#endif // #if defined( PRE_ADD_GUILD_EASYSYSTEM )
return ERROR_NONE;
}
break;
case eGuildRecruit::CS_GUILDRECRUIT_REQUEST:
{
GuildRecruitSystem::CSGuildRecruitRequest* pPacket = reinterpret_cast<GuildRecruitSystem::CSGuildRecruitRequest*>(pData);
if( sizeof(GuildRecruitSystem::CSGuildRecruitRequest) != nLen )
return ERROR_INVALIDPACKET;
if( GetGuildUID().IsSet())
{
SendGuildRecruitRequest( ERROR_GUILD_YOUR_ALREADY_BELONGTOGUILD, (GuildRecruitSystem::RequestType::eType)pPacket->cRequestType );
return ERROR_GUILD_YOUR_ALREADY_BELONGTOGUILD;
}
if( pPacket->cRequestType == GuildRecruitSystem::RequestType::RequestOn )
GetDBConnection()->QueryRequestOnGuildRecruit( this, pPacket->GuildUID.nDBID );
else if( pPacket->cRequestType == GuildRecruitSystem::RequestType::RequestOff )
GetDBConnection()->QueryRequestOffGuildRecruit( this, pPacket->GuildUID.nDBID );
return ERROR_NONE;
}
break;
case eGuildRecruit::CS_GUILDRECRUIT_ACCEPT:
{
GuildRecruitSystem::CSGuildRecruitAccept* pPacket = reinterpret_cast<GuildRecruitSystem::CSGuildRecruitAccept*>(pData);
if( sizeof(GuildRecruitSystem::CSGuildRecruitAccept) != nLen )
return ERROR_INVALIDPACKET;
if (0 >= ::wcslen(pPacket->wszToCharacterName))
{
SendGuildRecruitAccept(ERROR_GENERIC_INVALIDREQUEST, pPacket->biAcceptCharacterDBID, false, (GuildRecruitSystem::AcceptType::eType)pPacket->cAcceptType);
return ERROR_GENERIC_INVALIDREQUEST;
}
const TGuildUID GuildUID = GetGuildUID();
if( !GuildUID.IsSet())
{
SendGuildRecruitAccept( ERROR_GUILD_YOUR_NOT_BELONGANYGUILD, pPacket->biAcceptCharacterDBID, false, (GuildRecruitSystem::AcceptType::eType)pPacket->cAcceptType );
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (!pGuild)
{
SendGuildRecruitAccept( ERROR_GUILD_NOTEXIST_GUILDINFO, pPacket->biAcceptCharacterDBID, false, (GuildRecruitSystem::AcceptType::eType)pPacket->cAcceptType );
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable())
{
SendGuildRecruitAccept( ERROR_GUILD_NOTEXIST_GUILDINFO, pPacket->biAcceptCharacterDBID, false, (GuildRecruitSystem::AcceptType::eType)pPacket->cAcceptType );
return ERROR_GUILD_NOTEXIST_GUILDINFO;
}
#endif
// <20><><EFBFBD><EFBFBD> üũ(<28>ʴ<EFBFBD>)
DN_ASSERT(CHECK_LIMIT(GetGuildSelfView().btGuildRole, GUILDROLE_TYPE_CNT), "Check!");
if (!pGuild->CheckGuildInfoAuth(static_cast<eGuildRoleType>(GetGuildSelfView().btGuildRole), static_cast<eGuildAuthType>(GUILDAUTH_TYPE_INVITE)))
{
SendGuildRecruitAccept( ERROR_GUILD_HAS_NO_AUTHORITY, pPacket->biAcceptCharacterDBID, false, (GuildRecruitSystem::AcceptType::eType)pPacket->cAcceptType );
return ERROR_GUILD_HAS_NO_AUTHORITY;
}
if( pPacket->cAcceptType == GuildRecruitSystem::AcceptType::AcceptOn )
{
// <20>ο<EFBFBD><CEBF>߰<EFBFBD> <20><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> üũ
if (!pGuild->IsMemberAddable())
{
SendGuildRecruitAccept( ERROR_GUILD_CANTADD_GUILDMEMBER, pPacket->biAcceptCharacterDBID, false, (GuildRecruitSystem::AcceptType::eType)pPacket->cAcceptType );
return ERROR_GUILD_CANTADD_GUILDMEMBER;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><EFBFBD><E2B0A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
if (g_pGuildWarManager && pGuild->IsEnrollGuildWar() && g_pGuildWarManager->GetRestriction( eGuild::CS_INVITEGUILDMEMBREQ, pGuild->GetUID()) )
{
SendGuildRecruitAccept( ERROR_GUILDWAR_CANTADD_GUILDMEMBER, pPacket->biAcceptCharacterDBID, false, (GuildRecruitSystem::AcceptType::eType)pPacket->cAcceptType );
return ERROR_GUILDWAR_CANTADD_GUILDMEMBER;
}
GetDBConnection()->QueryAcceptOnGuildRecruit( this, pPacket->GuildUID.nDBID, pPacket->biAcceptCharacterDBID, pGuild->GetInfo()->wGuildSize, pPacket->wszToCharacterName );
}
else if( pPacket->cAcceptType == GuildRecruitSystem::AcceptType::AcceptOff )
{
GetDBConnection()->QueryAcceptOffGuildRecruit( this, pPacket->GuildUID.nDBID, pPacket->biAcceptCharacterDBID, pPacket->wszToCharacterName );
}
return ERROR_NONE;
}
break;
}
return CDNUserBase::OnRecvGuildRecruitMessage( nSubCmd, pData, nLen );
}
#if defined (PRE_ADD_BESTFRIEND)
int CDNUserSession::OnRecvBestFriendMessage(int nSubCmd, char *pData, int nLen)
{
switch( nSubCmd )
{
case eBestFriend::CS_SEARCH:
{
const BestFriend::CSSearch *pPacket = reinterpret_cast<BestFriend::CSSearch*>(pData);
if (sizeof(BestFriend::CSSearch) != nLen)
return ERROR_INVALIDPACKET;
if (0 >= ::wcslen(pPacket->wszName))
{
SendSearchBestFriendResult(ERROR_GENERIC_INVALIDREQUEST, 0, 0, NULL);
return ERROR_GENERIC_INVALIDREQUEST;
}
if (wcscmp(GetCharacterName(), pPacket->wszName) == 0)
{
SendSearchBestFriendResult(ERROR_BESTFRIEND_SELFSEARCH, 0, 0, NULL);
return ERROR_BESTFRIEND_SELFSEARCH;
}
if (m_pBestFriend->IsRegistered())
{
SendSearchBestFriendResult(ERROR_BESTFRIEND_ALREADY_REGISTERED, 0, 0, NULL);
return ERROR_BESTFRIEND_ALREADY_REGISTERED;
}
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByName(pPacket->wszName);
if (!pUserObj)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
g_pMasterConnection->SendSearchBestFriend(GetAccountDBID(), ERROR_NONE, false, pPacket->wszName);
return ERROR_NONE;
}
SendSearchBestFriendResult(ERROR_NONE, pUserObj->GetLevel(), pUserObj->GetStatusData()->cJob, pUserObj->GetCharacterName());
return ERROR_NONE;
}
break;
case eBestFriend::CS_REGIST:
{
const BestFriend::CSRegist *pPacket = reinterpret_cast<BestFriend::CSRegist*>(pData);
if (sizeof(BestFriend::CSRegist) != nLen)
return ERROR_INVALIDPACKET;
if (0 >= ::wcslen(pPacket->wszBestFriendName))
{
SendRegistBestFriendReq(ERROR_GENERIC_INVALIDREQUEST, 0, 0, NULL, 0, 0, NULL);
return ERROR_GENERIC_INVALIDREQUEST;
}
if (wcscmp(GetCharacterName(), pPacket->wszBestFriendName) == 0)
{
SendRegistBestFriendReq(ERROR_BESTFRIEND_SELFREGIST, 0, 0, NULL, 0, 0, NULL);
return ERROR_BESTFRIEND_SELFREGIST;
}
if (m_pBestFriend->IsRegistered())
{
SendRegistBestFriendReq(ERROR_BESTFRIEND_ALREADY_REGISTERED, 0, 0, NULL, 0, 0, NULL);
return ERROR_BESTFRIEND_ALREADY_REGISTERED;
}
const TItem* pRegistItem = m_pItem->GetCashInventory(pPacket->biInvenSerial);
if (!pRegistItem)
{
SendRegistBestFriendReq(ERROR_BESTFRIEND_NOTHAVE_REGISTITEM, 0, 0, NULL, 0, 0, NULL);
return ERROR_BESTFRIEND_NOTHAVE_REGISTITEM;
}
m_pBestFriend->SetRegistSerial(pPacket->biInvenSerial);
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByName(pPacket->wszBestFriendName);
if (!pUserObj)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
g_pMasterConnection->SendRegistBestFriend(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), pPacket->wszBestFriendName, pRegistItem->nItemID);
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD>üũ
if (pUserObj->GetBestFriend()->IsRegistered())
{
SendRegistBestFriendReq(ERROR_BESTFRIEND_REGISTFAIL_DESTUSER_SITUATION_NOTALLOWED, 0, 0, NULL, 0, 0, NULL);
return ERROR_BESTFRIEND_REGISTFAIL_DESTUSER_SITUATION_NOTALLOWED;
}
// <20><>ģ <20><>û
pUserObj->SendRegistBestFriendReq(ERROR_NONE, GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), pUserObj->GetAccountDBID(), pUserObj->GetCharacterDBID(), pUserObj->GetCharacterName());
return ERROR_NONE;
}
break;
case eBestFriend::CS_ACCEPT:
{
const BestFriend::CSAccept *pPacket = reinterpret_cast<BestFriend::CSAccept*>(pData);
if (sizeof(BestFriend::CSAccept) != nLen)
return ERROR_INVALIDPACKET;
if (!pPacket->bAccept) // <20><><EFBFBD><EFBFBD>
{
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByName(pPacket->wszFromName);
if (pUserObj)
pUserObj->SendRegistBestFriendAck(ERROR_BESTFRIEND_REFUESED_REGISTRATION, GetAccountDBID(), GetCharacterName(), pUserObj->GetAccountDBID(), pUserObj->GetCharacterName());
else
g_pMasterConnection->SendRegistBestFriendResult(pPacket->nFromAccountDBID, ERROR_BESTFRIEND_REFUESED_REGISTRATION, true, 0, pPacket->wszFromName, GetAccountDBID(), GetCharacterDBID(), GetCharacterName());
return ERROR_NONE;
}
g_pMasterConnection->SendRegistBestFriendResult(pPacket->nFromAccountDBID, ERROR_NONE, true, pPacket->biFromCharacterDBID, pPacket->wszFromName, GetAccountDBID(), GetCharacterDBID(), GetCharacterName());
return ERROR_NONE;
}
break;
case eBestFriend::CS_CANCELBF:
{
const BestFriend::CSCancel *pPacket = reinterpret_cast<BestFriend::CSCancel*>(pData);
if (sizeof(BestFriend::CSCancel) != nLen)
return ERROR_INVALIDPACKET;
if (false == m_pBestFriend->IsRegistered())
{
SendCancelBestFriend(ERROR_BESTFRIEND_NOT_REGISTERED, NULL);
return ERROR_BESTFRIEND_NOT_REGISTERED;
}
// DB ó<><C3B3>
m_pDBCon->QueryCancelBestFriend(this, pPacket->bCancel);
return ERROR_NONE;
}
break;
case eBestFriend::CS_EDITMEMO:
{
const BestFriend::CSEditMemo *pPacket = reinterpret_cast<BestFriend::CSEditMemo*>(pData);
if (sizeof(BestFriend::CSEditMemo) != nLen)
return ERROR_INVALIDPACKET;
// <20><><EFBFBD><EFBFBD> ó<><C3B3>
if (false == m_pBestFriend->IsRegistered())
{
SendEditBestFriendMemo(ERROR_BESTFRIEND_NOT_REGISTERED, true, NULL);
return ERROR_BESTFRIEND_NOT_REGISTERED;
}
// DB ó<><C3B3>
m_pDBCon->QueryEditBestFriendMemo(this, pPacket->wszMemo);
return ERROR_NONE;
}
break;
}
return CDNUserBase::OnRecvBestFriendMessage( nSubCmd, pData, nLen );
}
#endif // #if defined (PRE_ADD_BESTFRIEND)
#if defined (PRE_PRIVATECHAT_CHANNEL)
int CDNUserSession::OnRecvPrivateChatChannelMessage(int nSubCmd, char *pData, int nLen)
{
return CDNUserBase::OnRecvPrivateChatChannelMessage( nSubCmd, pData, nLen );
}
#endif // #if defined (PRE_PRIVATECHAT_CHANNEL)
#if defined( PRE_ALTEIAWORLD_EXPLORE )
int CDNUserSession::OnRecvWorldAlteiaMessage(int nSubCmd, char *pData, int nLen)
{
switch( nSubCmd )
{
case eAlteiaWorld::CS_ALTEIAWORLD_INFO:
{
AlteiaWorld::CSAlteiaWorldInfo* pPacket = reinterpret_cast<AlteiaWorld::CSAlteiaWorldInfo*>(pData);
if( sizeof(AlteiaWorld::CSAlteiaWorldInfo) != nLen )
return ERROR_INVALIDPACKET;
AlteiaWorldInfo( pPacket );
}
break;
case eAlteiaWorld::CS_ALTEIAWORLD_JOIN:
{
int nRet = AlteiaWorldJoin();
if(nRet != ERROR_NONE)
{
SendAlteiaWorldJoinResult(nRet);
}
}
break;
case eAlteiaWorld::CS_ALTEIAWORLD_SENDTICKET:
{
AlteiaWorld::CSAlteiaWorldSendTicket* pPacket = reinterpret_cast<AlteiaWorld::CSAlteiaWorldSendTicket*>(pData);
if( sizeof(AlteiaWorld::CSAlteiaWorldSendTicket) != nLen )
return ERROR_INVALIDPACKET;
if(m_cSendTicketCount <= 0)
{
SendAlteiaWorldSendTicketResult(ERROR_INVALIDPACKET, GetAlteiaSendTicketCount() );
break;
}
CDNUserSession* pSession = g_pUserSessionManager->FindUserSessionByName(pPacket->wszCharacterName);
if(pSession)
{
if( GetSessionID() == pSession->GetSessionID() )
{
SendAlteiaWorldSendTicketResult(ERROR_INVALIDPACKET, GetAlteiaSendTicketCount() );
break;
}
BYTE cMaxSendTicketCount = static_cast<BYTE>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldSendTicketCount ));
pSession->GetDBConnection()->QueryAddAlteiaWorldSendTicketList(pSession, GetCharacterDBID(), GetCharacterName(), cMaxSendTicketCount);
return ERROR_NONE;
}
else
{
if( g_pMasterConnection )
g_pMasterConnection->SendAddAlteiaWorldSendTicket( GetWorldSetID(), pPacket->wszCharacterName, GetCharacterDBID(), GetCharacterName() );
}
}
break;
case eAlteiaWorld::CS_ALTEIAWORLD_QUITINFO:
{
SetWindowState(WINDOW_NONE);
}
break;
}
return CDNUserBase::OnRecvWorldAlteiaMessage( nSubCmd, pData, nLen );
}
#endif // #if defined( PRE_ALTEIAWORLD_EXPLORE )
#if defined(PRE_ADD_DWC)
int CDNUserSession::_RecvInviteDWCTeamMembReq(LPCWSTR pwszToCharacterName)
{
if (0 >= ::wcslen(pwszToCharacterName))
return ERROR_GENERIC_INVALIDREQUEST;
if( !IsDWCCharacter() )
return ERROR_DWC_FAIL;
if (GetDWCTeamID() <= 0)
return ERROR_DWC_HAVE_NOT_TEAM;
CDnDWCTeam *pDWCTeam = g_pDWCTeamManager->GetDWCTeam(GetDWCTeamID());
if (!pDWCTeam)
return ERROR_DWC_NOTEXIST_TEAMINFO;
if (pDWCTeam->GetLeaderCharacterDBID() != GetCharacterDBID()) //<2F><><EFBFBD><20>ʴ밡<CAB4><EBB0A1>
return ERROR_DWC_HAS_NO_AUTHORITY;
if (!pDWCTeam->IsMemberAddable()) // <20>ο<EFBFBD><CEBF>߰<EFBFBD> <20><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> üũ
return ERROR_DWC_CANTADD_TEAMMEMBER;
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByName(pwszToCharacterName);
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD>Ͽ<EFBFBD> ã<>ƺ<EFBFBD><C6BA><EFBFBD>.
if (!pUserObj)
{
g_pMasterConnection->SendInviteDWCTeamMember(GetDWCTeamID(), GetAccountDBID(), GetCharacterName(), pwszToCharacterName, pDWCTeam->GetTeamInfo()->wszTeamName);
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><E7BCAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>
// <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if(!pUserObj->m_bLoadUserData)
return ERROR_CHARACTER_DATA_NOT_LOADED_OPPOSITE;
if( !pUserObj->IsDWCCharacter() )
return ERROR_DWC_NOT_DWC_CHARACTER;
if(pUserObj->GetDWCTeamID() > 0)
return ERROR_DWC_ALREADY_HASTEAM;
if(GetAccountDBID() == pUserObj->GetAccountDBID())
return ERROR_DWC_CANT_INVITE_YOURESELF;
if(!pDWCTeam->CheckDuplicationJob(pUserObj->GetUserJob()))
return ERROR_DWC_DUPLICATION_JOB;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if ( !pUserObj->IsNoneWindowState() )
return ERROR_DWC_CANTACCEPT_TEAMINVITATION;
pUserObj->SetWindowState(WINDOW_ISACCEPT);
pUserObj->SendInviteDWCTeamMemberReq(GetDWCTeamID(), GetAccountDBID(), GetCharacterName(), pDWCTeam->GetTeamInfo()->wszTeamName);
return ERROR_NONE;
}
int CDNUserSession::_RecvInviteDWCTeamMembAck(bool bAccept, UINT nFromAccountDBID, UINT nTeamID)
{
if( !bAccept )
{ //<2F>ʴ<EFBFBD><CAB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD>
CDNUserSession *pUserObj = g_pUserSessionManager->FindUserSessionByAccountDBID(nFromAccountDBID);
if (pUserObj)
pUserObj->SendInviteDWCTeamMemberAck(GetAccountDBID(), GetCharacterDBID(), GetCharacterName(), ERROR_DWC_REFUESED_TEAMINVITATION, pUserObj->GetAccountDBID(), pUserObj->GetCharacterDBID(), 0,NULL, NULL);
else
g_pMasterConnection->SendInviteDWCTeamMemberACK(nFromAccountDBID, ERROR_DWC_REFUESED_TEAMINVITATION, false, GetCharacterName());
return ERROR_NONE;
}
if( !IsDWCCharacter() )
return ERROR_DWC_PERMIT_FAIL;
if (GetDWCTeamID() > 0)
return ERROR_DWC_ALREADY_HASTEAM;
CDnDWCTeam* pDWCTeam = g_pDWCTeamManager->GetDWCTeam(nTeamID);
if (!pDWCTeam) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> DB<44><42>ȸ<EFBFBD><C8B8> <20>Ͽ<EFBFBD> ó<><C3B3><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
{
m_pDBCon->QueryDWCInviteMember(m_cDBThreadID, m_nAccountDBID, m_biCharacterDBID, nTeamID, g_Config.nWorldSetID, true);
return ERROR_NONE;
}
// <20>ο<EFBFBD><CEBF>߰<EFBFBD> <20><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> üũ
if (!pDWCTeam->IsMemberAddable())
return ERROR_DWC_CANTADD_TEAMMEMBER;
if(!pDWCTeam->CheckDuplicationJob(GetUserJob()))
return ERROR_DWC_DUPLICATION_JOB;
m_pDBCon->QueryAddDWCTeamMember(m_cDBThreadID, m_nAccountDBID, m_biCharacterDBID, nTeamID, g_Config.nWorldSetID);
return ERROR_NONE;
}
int CDNUserSession::OnRecvDWCMessage( int nSubCmd, char* pData, int nLen )
{
switch( nSubCmd )
{
case eDWC::CS_CREATE_DWCTEAM:
{
CSCreateDWCTeam* pPacket = (CSCreateDWCTeam*)pData;
if( sizeof(CSCreateDWCTeam) != nLen )
return ERROR_INVALIDPACKET;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if (0 >= ::wcslen(pPacket->wszTeamName))
{
SendCreateDWCTeam(ERROR_GENERIC_INVALIDREQUEST, GetSessionID(), L"", 0);
return ERROR_GENERIC_INVALIDREQUEST;
}
// 20100629 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۼ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD>ڴ뿪 Ȯ<><C8AE><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
if (!g_CountryUnicodeSet.Check(pPacket->wszTeamName))
{
SendCreateDWCTeam(ERROR_GENERIC_INVALIDREQUEST, GetSessionID(), L"", 0);
return ERROR_GENERIC_INVALIDREQUEST;
}
#if defined(PRE_ADD_MULTILANGUAGE)
if (g_pDataManager->CheckProhibitWord(static_cast<int>(m_eSelectedLanguage), pPacket->wszTeamName))
{
SendCreateDWCTeam(ERROR_DWC_PROHIBITWORD, GetSessionID(), L"", 0);
return ERROR_DWC_PROHIBITWORD;
}
#else //#if defined(PRE_ADD_MULTILANGUAGE)
if (g_pDataManager->CheckProhibitWord(pPacket->wszTeamName))
{
SendCreateDWCTeam(ERROR_DWC_PROHIBITWORD, GetSessionID(), L"", 0);
return ERROR_DWC_PROHIBITWORD;
}
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
if( !IsDWCCharacter() )
{
SendCreateDWCTeam(ERROR_DWC_PERMIT_FAIL, GetSessionID(), L"", 0);
return ERROR_DWC_PERMIT_FAIL;
}
if( GetDWCTeamID() > 0 )
{
SendCreateDWCTeam(ERROR_DWC_ALREADY_HASTEAM, GetSessionID(), L"", 0);
return ERROR_DWC_ALREADY_HASTEAM;
}
// DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_pDBCon->QueryCreateDWCTeam(m_cDBThreadID, m_nAccountDBID, m_biCharacterDBID, pPacket->wszTeamName, g_Config.nWorldSetID);
return ERROR_NONE;
}
break;
case eDWC::CS_LEAVE_DWCTEAM_MEMB:
{
if( !IsDWCCharacter() )
{
SendCreateDWCTeam(ERROR_DWC_PERMIT_FAIL, GetSessionID(), L"", 0);
return ERROR_DWC_PERMIT_FAIL;
}
if( GetDWCTeamID() <= 0 )
{
SendCreateDWCTeam(ERROR_DWC_ALREADY_HASTEAM, GetSessionID(), L"", 0);
return ERROR_DWC_HAVE_NOT_TEAM;
}
if(!g_pDWCTeamManager)
{
SendCreateDWCTeam(ERROR_DWC_NOTEXIST_TEAMINFO, GetSessionID(), L"", 0);
return ERROR_DWC_NOTEXIST_TEAMINFO;
}
CDnDWCTeam *pDWCTeam = g_pDWCTeamManager->GetDWCTeam(GetDWCTeamID());
if(!pDWCTeam)
{
SendCreateDWCTeam(ERROR_DWC_NOTEXIST_TEAMINFO, GetSessionID(), L"", 0);
return ERROR_DWC_NOTEXIST_TEAMINFO;
}
if(!pDWCTeam->CheckCanLeaveTeam())
{
SendCreateDWCTeam(ERROR_DWC_CANT_LEAVE_TEAM, GetSessionID(), L"", 0);
return ERROR_DWC_CANT_LEAVE_TEAM;
}
m_pDBCon->QuerLeaveDWCTeam(m_cDBThreadID, m_nAccountDBID, m_biCharacterDBID, GetDWCTeamID(), g_Config.nWorldSetID);
return ERROR_NONE;
}
break;
case eDWC::CS_INVITE_DWCTEAM_MEMBREQ: // CS_INVITE_DWCTEAM_MEMBREQ <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD><C8B2> SC_INVITE_DWCTEAM_MEMBACK <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
{
const CSInviteDWCTeamMemberReq *pPacket = reinterpret_cast<CSInviteDWCTeamMemberReq*>(pData);
if (sizeof(CSInviteDWCTeamMemberReq) != nLen)
return ERROR_INVALIDPACKET;
int nRet = _RecvInviteDWCTeamMembReq(pPacket->wszToCharacterName);
if( nRet != ERROR_NONE )
SendInviteDWCTeamMemberAck(nRet);
return ERROR_NONE;
}
break;
case eDWC::CS_INVITE_DWCTEAM_MEMBACK:
{
const CSInviteDWCTeamMemberAck *pPacket = reinterpret_cast<CSInviteDWCTeamMemberAck*>(pData);
if (sizeof(CSInviteDWCTeamMemberAck) != nLen)
return ERROR_INVALIDPACKET;
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
IsWindowStateNoneSet(WINDOW_ISACCEPT);
int nRet = _RecvInviteDWCTeamMembAck( pPacket->bAccept, pPacket->nFromAccountDBID, pPacket->nTeamID );
if( nRet != ERROR_NONE )
SendInviteDWCTeamMemberAckResult(nRet);
return ERROR_NONE;
}
break;
case eDWC::CS_GET_DWCTEAM_INFO:
{
CSGetDWCTeamInfo* pPacket = (CSGetDWCTeamInfo*)pData;
if (sizeof(CSGetDWCTeamInfo) != nLen)
return ERROR_INVALIDPACKET;
if(!IsDWCCharacter())
{
SendGetDWCTeamInfo(NULL, ERROR_DWC_PERMIT_FAIL);
return ERROR_NONE;
}
if( GetDWCTeamID() <= 0 )
{
SendGetDWCTeamInfo(NULL, ERROR_DWC_HAVE_NOT_TEAM);
return ERROR_NONE;
}
CDnDWCTeam* pDWCTeam = g_pDWCTeamManager->GetDWCTeam(GetDWCTeamID());
if(pDWCTeam)
{
SendGetDWCTeamInfo(pDWCTeam, ERROR_NONE);
if(pPacket->bNeedMembList)
SendGetDWCTeamMember(pDWCTeam, ERROR_NONE);
}
else
{
SendGetDWCTeamInfo(NULL, ERROR_DWC_NOTEXIST_TEAMINFO);
if (m_pDBCon && m_pDBCon->GetActive())
m_pDBCon->QueryGetDWCTeamInfo(this, true);
}
return ERROR_NONE;
}
break;
case eDWC::CS_GET_DWC_RANKPAGE:
{
CSGetDWCRankPage * pPacket = (CSGetDWCRankPage*)pData;
if (sizeof(CSGetDWCRankPage) != nLen)
return ERROR_INVALIDPACKET;
if (!IsDWCCharacter())
{
SendDWCRankResult(ERROR_DWC_PERMIT_FAIL, 0, 0, 0, NULL);
return ERROR_NONE;
}
if (pPacket->nPageSize > DWC::Common::RankPageMaxSize)
{
SendDWCRankResult(ERROR_DWC_FAIL, 0, 0, 0, NULL);
return ERROR_NONE;
}
if (GetDBConnection())
{
GetDBConnection()->QueryGetDWCRank(this, pPacket->nPageNum, pPacket->nPageSize);
return ERROR_NONE;
}
SendDWCRankResult(ERROR_DWC_FAIL, 0, 0, 0, NULL);
return ERROR_NONE;
}
break;
case eDWC::CS_GET_DWC_FINDRANK:
{
CSGetDWCFindRank * pPacket = (CSGetDWCFindRank*)pData;
if (sizeof(CSGetDWCFindRank) != nLen)
return ERROR_INVALIDPACKET;
if (!IsDWCCharacter())
{
SendDWCFindRankResult(ERROR_DWC_PERMIT_FAIL, NULL);
return ERROR_NONE;
}
if (wcslen(pPacket->wszFindKey) <= 0)
{
SendDWCFindRankResult(ERROR_DWC_FAIL, NULL);
return ERROR_NONE;
}
if (GetDBConnection())
{
GetDBConnection()->QueryGetDWCFindRank(this, pPacket->cType, pPacket->wszFindKey);
return ERROR_NONE;
}
SendDWCFindRankResult(ERROR_DWC_FAIL, NULL);
return ERROR_NONE;
}
break;
default:
return ERROR_UNKNOWN_HEADER;
}
return ERROR_NONE;
}
#endif
int CDNUserSession::_MakeEmblemErrorCode( CDnItemCompounder::S_OUTPUT &Output )
{
int iResult = ERROR_ITEM_EMBLEM_COMPOUND_FAIL;
if( Output.eResultCode == CDnItemCompounder::R_FAIL )
{
// <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
iResult = ERROR_ITEM_EMBLEM_COMPOUND_FAIL;
}
else
//if( Output.eResultCode == CDnItemCompounder::R_POSSIBILITY_FAIL )
//{
// // Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>.
// iResult = ERROR_ITEM_EMBLEM_COMPOUND_POSSIBILITY_FAIL;
//}
//else
{
// <20>̰<EFBFBD><CCB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ŵ. <20><><EFBFBD>ʺ<EFBFBD><CABA><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾҾ<CABE><D2BE><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȳ.
switch( Output.eErrorCode )
{
case CDnItemCompounder::E_NOT_ENOUGH_MONEY: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD>
iResult = ERROR_ITEM_EMBLEM_COMPOUND_NOT_ENOUGH_MONEY;
break;
case CDnItemCompounder::E_NOT_ENOUGH_ITEM: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
iResult = ERROR_ITEM_EMBLEM_COMPOUND_NOT_ENOUGH_ITEM;
break;
case CDnItemCompounder::E_NOT_MATCH_SLOT: // <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
iResult = ERROR_ITEM_EMBLEM_COMPOUND_NOT_MATCH_SLOT;
break;
case CDnItemCompounder::E_NOT_ENOUGH_ITEM_COUNT: // <20><><EFBFBD>Կ<EFBFBD> <20>¾<EFBFBD><C2BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD>
iResult = ERROR_ITEM_EMBLEM_COMPOUND_NOT_ENOUGH_ITEM_COUNT;
break;
case CDnItemCompounder::E_NOT_MATCH_PLATE_WITH_ITEM_COMPOUND: // <20>÷<EFBFBD><C3B7><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Է¹<D4B7><C2B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD>.
iResult = ERROR_ITEM_EMBLEM_COMPOUND_NOT_MATCH_PLATE_WITH_ITEM_COMPOUND_INDEX;
break;
}
}
return iResult;
}
int CDNUserSession::_RecvMovePvPVillageToLobby()
{
if( !m_pField || !g_pMasterConnection )
{
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> PvP<76><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD>..
if( !m_pField->bIsPvPVillage() )
{
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
if(g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendVillageToVillage( REQINFO_TYPE_PVP, m_nAccountDBID, m_pField->GetMapIndex(), PvPCommon::Common::PvPVillageToLobbyGateNo );
else
_DANGER_POINT();
return ERROR_NONE;
}
int CDNUserSession::_RecvMovePvPLobbyToPvPVillage()
{
if( !m_pField || !g_pMasterConnection )
{
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> PvP<76>κ<EFBFBD><CEBA><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD>..
if( !m_pField->bIsPvPLobby() )
{
_DANGER_POINT();
return ERROR_GENERIC_UNKNOWNERROR;
}
g_pMasterConnection->SendMovePvPLobbyToPvPVillage( m_nAccountDBID );
return ERROR_NONE;
}
bool CDNUserSession::bIsCheckPvPCreateRoom( CDNUserSession* pSession, const CSPVP_CREATEROOM* pPacket, const UINT uiMapIndex, UINT& uiPvPGameMode )
{
if( pPacket->cRoomNameLen == 0 || pPacket->cRoomNameLen > PvPCommon::TxtMax::RoomName || pPacket->cRoomPWLen > PvPCommon::TxtMax::RoomPW )
return false;
// MapTable <20>˻<EFBFBD>
const TPvPMapTable* pPvPMapTable = g_pDataManager->GetPvPMapTable( uiMapIndex );
if( !pPvPMapTable )
return false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if( pPvPMapTable->MatchType != LadderSystem::MatchType::None )
return false;
// MaxUser <20>˻<EFBFBD>
if( !pPvPMapTable->CheckMaxUser( pPacket->cMaxUser ) )
return false;
// <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD> <20>˻<EFBFBD>
if( !pPvPMapTable->CheckGameModeTableID( pPacket->uiGameModeTableID ) )
return false;
// <20><><EFBFBD>Կɼ<D4BF> <20>˻<EFBFBD>
if( !pPvPMapTable->CheckBreakIntoOption( pPacket->unRoomOptionBit&PvPCommon::RoomOption::BreakInto ) )
return false;
const TPvPGameModeTable* pPvPGameModeTable = g_pDataManager->GetPvPGameModeTable( pPacket->uiGameModeTableID );
if( !pPvPGameModeTable )
return false;
if(pPvPGameModeTable->bAllowedUserCreateMode == false) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD> <20><><EFBFBD><EFBFBD>
return false;
// <20>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if( !pPvPGameModeTable->CheckWinCondition( pPacket->uiSelectWinCondition ) )
return false;
// <20>÷<EFBFBD><C3B7><EFBFBD>Ÿ<EFBFBD><C5B8> <20>˻<EFBFBD>
if( !pPvPGameModeTable->CheckPlayTimeSec( pPacket->uiSelectPlayTimeSec ) )
return false;
if( !pPvPGameModeTable->CheckMaxUser( pPacket->cMaxUser) )
return false;
if( pPvPGameModeTable->bIsSelectableRegulation == false )
{
if( pPvPGameModeTable->bIsDefaultRegulation == true )
{
if( pPacket->unRoomOptionBit&PvPCommon::RoomOption::NoRegulation )
return false;
}
else
{
if( !(pPacket->unRoomOptionBit&PvPCommon::RoomOption::NoRegulation) )
return false;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD><C8BF> <20>˻<EFBFBD>
if( pPacket->cMinLevel < 1 || pPacket->cMaxLevel > CHARLEVELMAX || pPacket->cMinLevel > pPacket->cMaxLevel )
return false;
if( pSession && (pSession->GetLevel() < pPacket->cMinLevel || pSession->GetLevel() > pPacket->cMaxLevel) )
return false;
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
//<2F>ʺ<EFBFBD>Ÿ<EFBFBD><C5B8> <20><>ȿ<EFBFBD><C8BF> <20>˻<EFBFBD>
if (pSession && pSession->GetPvPChannelType() != pPacket->cRoomType)
{
_DANGER_POINT();
return false;
}
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
switch( pPvPGameModeTable->uiGameMode )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ShowHP <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
case PvPCommon::GameMode::PvP_Captain:
{
const_cast<CSPVP_CREATEROOM*>(pPacket)->unRoomOptionBit &= ~(PvPCommon::RoomOption::ShowHP);
break;
}
case PvPCommon::GameMode::PvP_AllKill:
#if defined( PRE_ADD_PVP_TOURNAMENT)
case PvPCommon::GameMode::PvP_Tournament:
#endif //#if defined( PRE_ADD_PVP_TOURNAMENT)
{
// <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
const_cast<CSPVP_CREATEROOM*>(pPacket)->unRoomOptionBit &= ~(PvPCommon::RoomOption::BreakInto|PvPCommon::RoomOption::DropItem);
if( pPacket->unRoomOptionBit&PvPCommon::RoomOption::RandomTeam )
{
if( !(pPacket->unRoomOptionBit&PvPCommon::RoomOption::AllKill_RandomOrder) )
return false;
}
break;
}
}
if( pPvPGameModeTable->uiGameMode != PvPCommon::GameMode::PvP_AllKill )
{
const_cast<CSPVP_CREATEROOM*>(pPacket)->unRoomOptionBit &= ~(PvPCommon::RoomOption::AllKill_RandomOrder);
}
#if defined(PRE_ADD_DWC)
//DWC <20>ɸ<EFBFBD><C9B8>ʹ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( pSession && (pSession->IsDWCCharacter() && pPvPGameModeTable->uiGameMode != PvPCommon::GameMode::PvP_AllKill) )
return false;
#endif
uiPvPGameMode = pPvPGameModeTable->uiGameMode;
return true;
}
short CDNUserSession::_RecvPvPCreateRoom( const CSPVP_CREATEROOM* pPacket )
{
if( !g_pMasterConnection || !g_pMasterConnection->GetActive() )
return ERROR_GENERIC_MASTERCON_NOT_FOUND;
UINT uiPvPGameMode;
if( !bIsCheckPvPCreateRoom( this, pPacket, pPacket->uiMapIndex, uiPvPGameMode ) )
return ERROR_PVP_CREATEROOM_FAILED;
if( !m_pField )
{
_DANGER_POINT();
return ERROR_PVP_CREATEROOM_FAILED;
}
#if defined( PRE_WORLDCOMBINE_PVP )
if( pPacket->nWorldPvPRoomType )
{
if( (GetAccountLevel() >= AccountLevel_New && GetAccountLevel() <= AccountLevel_Developer) && g_Config.nCombinePartyWorld == g_Config.nWorldSetID )
{
const TPvPGameModeTable* pGameModeTable = g_pDataManager->GetPvPGameModeTable( pPacket->uiGameModeTableID );
if(pGameModeTable)
{
if( !g_pDataManager->bIsWorldPvPRoomAllowMode( pGameModeTable->uiGameMode ) )
return ERROR_PVP_CREATEROOM_FAILED;
}
else
return ERROR_PVP_CREATEROOM_FAILED;
//<2F><EFBFBD>ڸ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>( <20>κ<EFBFBD><CEBA>̰<EFBFBD> <20><><EFBFBD>ؿ<EFBFBD><D8BF><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
TWorldPvPMissionRoom MissonRoomData;
memset(&MissonRoomData,0,sizeof(MissonRoomData));
MissonRoomData.bDropItem = false;
MissonRoomData.cMaxPlayers = pPacket->cMaxUser;
MissonRoomData.nStartPlayers = pPacket->cMinUser;
MissonRoomData.cModeID = pPacket->uiGameModeTableID;
MissonRoomData.eWorldReqType = WorldPvPMissionRoom::Common::GMRoom;
#if defined( PRE_ADD_COLOSSEUM_BEGINNER )
MissonRoomData.nChannelType = GetPvPChannelType();
#endif
MissonRoomData.nItemID = CDNPvPRoomManager::GetInstance().GetGMWorldPvPRoomIndex();
MissonRoomData.nMapID = pPacket->uiMapIndex;
MissonRoomData.nMinLevel = pPacket->cMinLevel;
MissonRoomData.nMaxLevel = pPacket->cMaxLevel;
MissonRoomData.nPlayTime = pPacket->uiSelectPlayTimeSec;
MissonRoomData.nWinCondition = pPacket->uiSelectWinCondition;
MissonRoomData.unRoomOptionBit = pPacket->unRoomOptionBit;
MissonRoomData.unRoomOptionBit |= PvPCommon::RoomOption::RandomTeam;
if( pGameModeTable->uiGameMode == PvPCommon::GameMode::PvP_AllKill )
MissonRoomData.unRoomOptionBit |= PvPCommon::RoomOption::AllKill_RandomOrder;
_wcscpy( MissonRoomData.wszRoomName, _countof(MissonRoomData.wszRoomName), pPacket->wszBuf, pPacket->cRoomNameLen );
if( pPacket->cRoomPWLen > 0 )
{
WCHAR wszBuf[PASSWORDLENMAX];
memset( &wszBuf, 0, sizeof(WCHAR)*PASSWORDLENMAX );
_wcscpy( wszBuf, _countof(wszBuf), pPacket->wszBuf+pPacket->cRoomNameLen, pPacket->cRoomPWLen );
MissonRoomData.nRoomPW = _wtoi(wszBuf);
}
g_pMasterConnection->SendWorldPvPCreateRoom( MissonRoomData.nItemID, MissonRoomData, GetAccountDBID() );
return ERROR_NONE;
}
return ERROR_PVP_CREATEROOM_FAILED;
}
#endif
#ifdef PRE_MOD_PVPOBSERVER
if (pPacket->bExtendObserver == true)
return ERROR_PVP_CREATEROOM_FAILED;
#endif //#ifdef PRE_MOD_PVPOBSERVER
#if defined(PRE_ADD_PVP_TOURNAMENT)
g_pMasterConnection->SendPvPCreateRoom( m_nAccountDBID, static_cast<BYTE>(uiPvPGameMode), GetChannelID(), m_pField->GetMapIndex(), pPacket, NULL, GetUserJob() );
#else
g_pMasterConnection->SendPvPCreateRoom( m_nAccountDBID, static_cast<BYTE>(uiPvPGameMode), GetChannelID(), m_pField->GetMapIndex(), pPacket );
#endif
return ERROR_NONE;
}
short CDNUserSession::_RecvPvPModifyRoom( const CSPVP_MODIFYROOM* pPacket )
{
if( !g_pMasterConnection || !g_pMasterConnection->GetActive() )
return ERROR_GENERIC_MASTERCON_NOT_FOUND;
// <20><><EFBFBD><EFBFBD> PvPMapIndex <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UINT uiPvPIndex = GetPvPIndex();
CDNPvPRoom* pPvPRoom = CDNPvPRoomManager::GetInstance().GetPvPRoom( GetChannelID(), uiPvPIndex );
if( !pPvPRoom )
{
_DANGER_POINT();
return ERROR_PVP_MODIFYROOM_FAILED;
}
// <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if( pPvPRoom->GetMaxUser() != pPacket->sCSPVP_CREATEROOM.cMaxUser )
{
_DANGER_POINT();
return ERROR_PVP_MODIFYROOM_FAILED;
}
//UINT uiPvPMapIndex = pPvPRoom->GetMapIndex();
UINT uiPvPMapIndex = pPacket->sCSPVP_CREATEROOM.uiMapIndex;
UINT uiPvPGameMode;
if( !bIsCheckPvPCreateRoom( this, &pPacket->sCSPVP_CREATEROOM, uiPvPMapIndex, uiPvPGameMode ) )
return ERROR_PVP_MODIFYROOM_FAILED;
g_pMasterConnection->SendPvPModifyRoom( m_nAccountDBID, static_cast<BYTE>(uiPvPGameMode), pPacket );
return ERROR_NONE;
}
void CDNUserSession::SetPartyData(TPARTYID PartyID)
{
CDNParty* pParty = g_pPartyManager->GetParty(PartyID);
if (!pParty)
return;
pParty->SetCompleteMember(false); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ǯ<><C7AE><EFBFBD>ش<EFBFBD>
bool boLeader = false;
if (pParty->GetLeaderAccountDBID() == GetAccountDBID())
{
boLeader = true;
m_boPartyLeader = true;
pParty->SetLeaderSessionID(GetSessionID());
pParty->SetLeaderAccountDBID(GetAccountDBID());
}
int nMemberIndex = pParty->GetPartyMemberIdx(m_nAccountDBID);
if (pParty->CheckCompleteParty())
{
#if defined( PRE_PARTY_DB )
#else
g_pPartyManager->PushWaitPartyList(pParty);
#endif // #if defined( PRE_PARTY_DB )
}
m_PartyID = PartyID;
m_boPartyLeader = boLeader;
m_nPartyMemberIndex = nMemberIndex;
#ifdef _USE_VOICECHAT
if (pParty->m_nVoiceChannelID > 0)
{
TMemberVoiceInfo * pVoice = pParty->GetInitVoiceInfo(GetAccountDBID());
if (pVoice)
{
memcpy(m_nVoiceMutedList, pVoice->nMutedList, sizeof(UINT[PARTYCOUNTMAX]));
JoinVoiceChannel(pParty->m_nVoiceChannelID, GetIp(), &GetTargetPos(), (int)m_nVoiceRotate, pVoice->cVoiceAvailable == 0 ? false : true);
}
}
#endif
}
void CDNUserSession::SetTargetMapIndexByStartStage()
{
if (m_cGateNo <= 0) return;
if (g_pDataManager->GetMapType(GetMapIndex()) == GlobalEnum::MAP_VILLAGE)
{
if (GetChannelAttribute()&GlobalEnum::CHANNEL_ATT_DARKLAIR){
SetLastSubVillageMapIndex(GetMapIndex());
}
else{
// GM??
if ( !(GetChannelAttribute()&(GlobalEnum::CHANNEL_ATT_GM|GlobalEnum::CHANNEL_ATT_DARKLAIR|GlobalEnum::CHANNEL_ATT_FARMTOWN)) )
SetLastMapIndex( GetMapIndex() );
}
}
SetLastVillageGateNo(m_cGateNo);
int nTargetMap = GetTargetMapIndex();
m_bCharOutLog = false;
if (nTargetMap > 0)
SetMapIndex(nTargetMap);
m_cGateNo = -1;
m_cGateSelect = -1;
}
int CDNUserSession::GetTargetMapIndex()
{
if (m_cGateNo <= 0) return GetMapIndex();
return g_pDataManager->GetMapIndexByGateNo(GetMapIndex(), m_cGateNo, m_cGateSelect);
}
void CDNUserSession::ClearPartyInfo()
{
m_PartyID = 0;
m_boPartyLeader = false;
m_nPartyMemberIndex = -1;
}
// PvP
void CDNUserSession::CreatePvPRoom( const MAVIPVP_CREATEROOM* pPacket )
{
}
void CDNUserSession::NextTalk(UINT nNpcObjectID, WCHAR* wszTalkIndex, WCHAR* wszTarget, std::vector<TalkParam>& talkParam )
{
SendNextTalk(nNpcObjectID, wszTalkIndex, wszTarget, talkParam);
}
void CDNUserSession::ChangeMap(BYTE cVillageID, BYTE cTargetGateNo, int nTargetChannelID, int nTargetMapIndex, char *pIp, USHORT nPort)
{
if ( (nTargetChannelID <= 0) ||(nTargetMapIndex <= 0))
return;
m_bCharOutLog = false;
// _SetLastVillageMapIndex(GetMapIndex());
LeaveWorld();
if (m_bIsChannelCounted)
{
if (GetChannelID() <= 0) _DANGER_POINT();
g_pUserSessionManager->DecreaseChannelUserCount(GetChannelID());
m_bIsChannelCounted = false;
}
const sChannelInfo* pTargetChannelInfo = g_pMasterConnection->GetChannelInfo( nTargetChannelID );
const sChannelInfo* pChannelInfo = g_pMasterConnection->GetChannelInfo( GetChannelID() );
if( pTargetChannelInfo && pChannelInfo )
{
bool bUpdate = true;
if( pTargetChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_USELASTMAPINDEX && pChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_USELASTMAPINDEX )
bUpdate = false;
if (pTargetChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_DARKLAIR)
SetLastSubVillageMapIndex(nTargetMapIndex);
else{
SetLastSubVillageMapIndex(-1);
if( bUpdate ){
SetLastMapIndex( GetMapIndex() );
GlobalEnum::eMapTypeEnum MapType = g_pDataManager->GetMapType(nTargetMapIndex);
if (MapType == GlobalEnum::MAP_VILLAGE)
SetLastMapIndex(nTargetMapIndex);
}
}
}
SetChannelID(nTargetChannelID);
SetMapIndex(nTargetMapIndex);
#if defined( PRE_FIX_67546 )
m_pDBCon = g_pDBConnectionManager->GetVillageDBConnection(nTargetChannelID, m_cDBThreadID);
#else
m_pDBCon = g_pDBConnectionManager->GetDBConnection(nTargetChannelID, m_cDBThreadID);
#endif
if (m_pDBCon == NULL)
{
//<2F><> Ÿ<>ֿ̹<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӵ<EFBFBD>.....<2E><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DetachConnection(L"ChangeMap DBCon NotFound");
return;
}
TPosition Pos = { 0, };
g_pFieldDataManager->GetStartPosition(nTargetMapIndex, cTargetGateNo, Pos);
m_BaseData.CurPos = Pos;
m_BaseData.TargetPos = Pos;
if (cVillageID == g_Config.nVillageID){
m_bChangeSameServer = true;
m_cGateNo = -1;
m_cGateSelect = -1;
SendVillageInfo(pIp, nPort, ERROR_NONE, GetAccountDBID(), GetCertifyingKey()); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> <20>ȴ<EFBFBD> // <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> ???(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ??? <20>׷<EFBFBD><D7B7>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD>üũ <20>ٽ<EFBFBD> <20>ʿ<EFBFBD> !!!)
}
else{
m_bChangeSameServer = false;
// <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
_strcpy(m_MoveToVillageInfo.szIP, _countof(m_MoveToVillageInfo.szIP), pIp, (int)strlen(pIp));
m_MoveToVillageInfo.nPort = nPort;
m_eUserState = STATE_READYTOVILLAGE;
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_VILLAGE, this);
}
}
void CDNUserSession::ChangeMap(BYTE cVillageID, int nTargetChannelID, int nTargetMapIndex, char *pIp, USHORT nPort, bool bPartyinto)
{
if ((nTargetChannelID <= 0) ||(nTargetMapIndex <= 0)) return;
m_bCharOutLog = false;
const sChannelInfo* pTargetChannelInfo = g_pMasterConnection->GetChannelInfo( nTargetChannelID );
if( !pTargetChannelInfo )
{
_DANGER_POINT();
return;
}
TPosition Pos = { 0, };
if (bPartyinto == false)
{
#if defined(PRE_ADD_DWC)
if( pTargetChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_PVP || pTargetChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_DWC )
#else
if( pTargetChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_PVP )
#endif
g_pFieldDataManager->GetStartPosition( nTargetMapIndex, PvPCommon::Common::PvPVillageStartPositionGateNo, Pos );
else if (pTargetChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_FARMTOWN || pTargetChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_DARKLAIR)
g_pFieldDataManager->GetStartPosition( nTargetMapIndex, GlobalEnum::DEFAULT_STARTPOSITION_GATENO, Pos );
else
g_pFieldDataManager->GetRandomStartPosition(nTargetMapIndex, Pos);
if (Pos.nX == 0) return;
}
else
m_bPartyInto = true;
// _SetLastVillageMapIndex(GetMapIndex());
LeaveWorld();
if (m_bIsChannelCounted)
{
if (GetChannelID() <= 0) _DANGER_POINT();
g_pUserSessionManager->DecreaseChannelUserCount(GetChannelID());
m_bIsChannelCounted = false;
}
const sChannelInfo* pChannelInfo = g_pMasterConnection->GetChannelInfo( GetChannelID() );
if( pTargetChannelInfo && pChannelInfo )
{
bool bUpdate = true;
if( pTargetChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_USELASTMAPINDEX && pChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_USELASTMAPINDEX )
bUpdate = false;
if (pTargetChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_DARKLAIR)
SetLastSubVillageMapIndex(nTargetMapIndex);
else{
SetLastSubVillageMapIndex(-1);
if( bUpdate ){
SetLastMapIndex( GetMapIndex() );
GlobalEnum::eMapTypeEnum MapType = g_pDataManager->GetMapType(nTargetMapIndex);
if (MapType == GlobalEnum::MAP_VILLAGE)
SetLastMapIndex(nTargetMapIndex);
}
}
}
SetChannelID(nTargetChannelID);
SetMapIndex(nTargetMapIndex);
#if defined( PRE_FIX_67546 )
m_pDBCon = g_pDBConnectionManager->GetVillageDBConnection(nTargetChannelID, m_cDBThreadID);
#else
m_pDBCon = g_pDBConnectionManager->GetDBConnection(nTargetChannelID, m_cDBThreadID);
#endif
if (m_pDBCon == NULL)
{
//<2F><> Ÿ<>ֿ̹<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӵ<EFBFBD>.....<2E><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DetachConnection(L"ChangeMap DBCon NotFound");
return;
}
if (bPartyinto == false)
{
m_BaseData.CurPos = Pos;
m_BaseData.TargetPos = Pos;
}
if (cVillageID == g_Config.nVillageID)
{
m_bChangeSameServer = true;
SendVillageInfo(pIp, nPort, ERROR_NONE, GetAccountDBID(), GetCertifyingKey()); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> <20>ȴ<EFBFBD> // <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> ???(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ??? <20>׷<EFBFBD><D7B7>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD>üũ <20>ٽ<EFBFBD> <20>ʿ<EFBFBD> !!!)
}
else
{
m_bChangeSameServer = false;
// <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
_strcpy(m_MoveToVillageInfo.szIP, _countof(m_MoveToVillageInfo.szIP), pIp, (int)strlen(pIp));
m_MoveToVillageInfo.nPort = nPort;
m_eUserState = STATE_READYTOVILLAGE;
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_VILLAGE, this);
}
}
void CDNUserSession::ChangePos(int nX, int nY, int nZ, float fLookX, float fLookZ)
{
LeaveWorld();
if (m_bIsChannelCounted)
{
if (GetChannelID() <= 0) _DANGER_POINT();
g_pUserSessionManager->DecreaseChannelUserCount(GetChannelID());
m_bIsChannelCounted = false;
}
m_BaseData.CurPos.nX = nX;
m_BaseData.CurPos.nY = nY;
m_BaseData.CurPos.nZ = nZ;
EnterWorld();
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
EtVector3 vPos( GetCurrentPos().nX/1000.f, GetCurrentPos().nY/1000.f, GetCurrentPos().nZ/1000.f );
EtVector2 vLook( fLookX, fLookZ );
Stream.Write( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Write( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
SendActorMsg( GetSessionID(), eActor::SC_CMDWARP, Stream.Tell(), Stream.GetBuffer() );
}
void CDNUserSession::ReconnectLogin(short nRet)
{
if (nRet == ERROR_NONE){
m_eUserState = STATE_MOVETOLOGIN;
}
SendReconnectLogin(nRet, GetAccountDBID(), GetCertifyingKey());
}
//Farm
bool CDNUserSession::ReqFarmInfo(bool bRefreshGate /*=true*/)
{
if (g_pFarm->GetInitFlag() == false)
return false; //<2F>ε<EFBFBD><CEB5>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD>մϴ<D5B4>.
m_pDBCon->QueryGetListFieldByCharacter( this, bRefreshGate );
return true;
}
void CDNUserSession::SetLevel(BYTE cLevel, int nLogCode, bool bDBSave)
{
if (GetLevel() == cLevel) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (cLevel > CHARLEVELMAX) cLevel = CHARLEVELMAX; // <20>ƽ<EFBFBD>ġ<EFBFBD><C4A1> <20>Ѿ<D1BE><EEB0A1> <20>ȵ<EFBFBD>
if (GetLevel() < cLevel){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD>ٸ<EFBFBD>
int nSkillPoint = m_pSkill->GetLevelUpSkillPoint( GetLevel(), cLevel );
// <20><EFBFBD><E9BCB7> <20>Ͼ<CFBE><EEB3AA> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿣.. <20>ƹ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>ؾ<EFBFBD><D8BE>ұ.
if( nSkillPoint > 0 ){
ChangeSkillPoint(nSkillPoint, 0, true, DBDNWorldDef::SkillPointCode::LevelUp, DualSkill::Type::Primary);
ChangeSkillPoint(nSkillPoint, 0, true, DBDNWorldDef::SkillPointCode::LevelUp, DualSkill::Type::Secondary);
}
m_ParamData.cLevel = cLevel;
m_ParamData.nExp = GetExp();
SendUserLocalMessage(0, FM_LEVELUP);
NotifyGuildMemberLevelUp(cLevel);
}
BYTE cPreLevel = GetLevel();
m_UserData.Status.cLevel = cLevel;
GetEventSystem()->OnEvent( EventSystem::OnLevelUp );
if (bDBSave){
m_pDBCon->QueryLevel(this, nLogCode); // level db<64><62><EFBFBD><EFBFBD> 20100128
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( m_MasterSystemData.SimpleInfo.iMasterCount > 0 && cLevel >= static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_GraduateLevel )) )
{
if( m_pDBCon && m_pDBCon->GetActive() )
m_pDBCon->QueryMasterSystemGraduate( this );
}
if( cPreLevel < cLevel)
{
for( BYTE bCurLevel=cPreLevel+1; bCurLevel<=cLevel; ++bCurLevel) //<2F>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>dzʶ۶<CAB6><DBB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ɸ<EFBFBD><C9B8><EFBFBD>..
{
SendLevelupEventMail(bCurLevel, GetClassID(), GetUserJob());
}
}
#if defined( PRE_ADD_BESTFRIEND )
if( GetBestFriend()->IsRegistered() )
{
sWorldUserState State;
if (g_pWorldUserState->GetUserState(GetBestFriend()->GetInfo().wszName, GetBestFriend()->GetInfo().biCharacterDBID, &State))
{
CDNUserSession* pSession = g_pUserSessionManager->FindUserSessionByName(GetBestFriend()->GetInfo().wszName);
if(pSession)
{
pSession->GetBestFriend()->ChangeLevel(cLevel);
}
else
{
if (g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendLevelUpBestFriend(cLevel, m_pBestFriend->GetInfo().wszName);
}
}
}
#endif
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
if (cPreLevel < cLevel)
{
AddTotalLevelSkillLevel(cLevel - cPreLevel);
SendTotalLevel( m_pSession->GetSessionID(), GetTotalLevelSkillLevel() );
}
#endif
const TGuildUID GuildUID = GetGuildUID();
if (GuildUID.IsSet())
{
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (pGuild)
{
#ifdef PRE_ADD_BEGINNERGUILD
if (cLevel >=(int)CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::BeginnerGuild_GraduateLevel))
{
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (TRUE == pGuild->IsEnable())
{
if (pGuild->GetInfo()->cGuildType == BeginnerGuild::Type::Beginner)
{
if (m_pDBCon)
m_pDBCon->QueryDelGuildMember(m_cDBThreadID, GetAccountDBID(), GetCharacterDBID(), GetAccountDBID(), GetCharacterDBID(), GuildUID.nDBID, GetLevel(), g_Config.nWorldSetID, false, true);
}
}
#else //#if !defined( PRE_ADD_NODELETEGUILD )
if (pGuild->GetInfo()->cGuildType == BeginnerGuild::Type::Beginner)
{
if (m_pDBCon)
m_pDBCon->QueryDelGuildMember(m_cDBThreadID, GetAccountDBID(), GetCharacterDBID(), GetAccountDBID(), GetCharacterDBID(), GuildUID.nDBID, GetLevel(), g_Config.nWorldSetID, false, true);
}
#endif //#if !defined( PRE_ADD_NODELETEGUILD )
}
#endif //#ifdef PRE_ADD_BEGINNERGUILD
#if defined(PRE_ADD_JOINGUILD_SUPPORT)
if (GetDBConnection() && bDBSave)
GetDBConnection()->QueryGuildSupportRewardInfo(this);
#endif //#if defined(PRE_ADD_JOINGUILD_SUPPORT)
}
else
_DANGER_POINT();
}
#if defined(_KRAZ)
m_pDBCon->QueryActozUpdateCharacterInfo(m_pSession, ActozCommon::UpdateType::Levelup);
#endif // #if defined(_KRAZ)
}
#if defined(PRE_ADD_EXPUP_ITEM)
void CDNUserSession::ChangeExp(int nChangeExp, int nLogCode, INT64 biFKey, bool bAbsolute)
{
CDNUserBase::ChangeExp(nChangeExp, nLogCode, biFKey, bAbsolute);
if (GetPartyID() > 0)
g_pPartyManager->SendPartyMemberPart(GetPartyID(), this);
}
#else
void CDNUserSession::ChangeExp(int nChangeExp, int nLogCode, INT64 biFKey)
{
CDNUserBase::ChangeExp(nChangeExp, nLogCode, biFKey);
if (GetPartyID() > 0)
g_pPartyManager->SendPartyMemberPart(GetPartyID(), this);
}
#endif
void CDNUserSession::SetExp(UINT nExp, int nLogCode, INT64 biFKey, bool bDBSave)
{
CDNUserBase::SetExp(nExp, nLogCode, biFKey, bDBSave);
BYTE cLevel = g_pDataManager->GetLevel(GetClassID(), GetExp());
if (cLevel <= 0) cLevel = 1;
if (cLevel > CHARLEVELMAX) cLevel = CHARLEVELMAX;
if (cLevel != GetLevel()){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ö<EFBFBD><C3B6>ٸ<EFBFBD>
int nLevelLog = DBDNWorldDef::CharacterLevelChangeCode::Normal;
switch(nLogCode)
{
case DBDNWorldDef::CharacterExpChangeCode::Cheat: nLevelLog = DBDNWorldDef::CharacterLevelChangeCode::Cheat; break;
case DBDNWorldDef::CharacterExpChangeCode::Admin: nLevelLog = DBDNWorldDef::CharacterLevelChangeCode::Admin; break;
}
SetLevel(cLevel, nLevelLog, bDBSave); // <20><><EFBFBD>⼭ db<64><62><EFBFBD><EFBFBD>
}
if (GetPartyID() > 0)
g_pPartyManager->SendPartyMemberPart(GetPartyID(), this);
}
void CDNUserSession::QueryGetMasterSystemCountInfo( bool bClientSend )
{
if( CheckDBConnection() == false)
return;
CDNParty* pParty = g_pPartyManager->GetParty( GetPartyID() );
if( pParty == NULL )
return;
std::vector<INT64> vPartyListExceptMe;
pParty->GetMemberCharacterDBIDInfo( vPartyListExceptMe, GetCharacterDBID() );
GetDBConnection()->QueryGetMasterSystemCountInfo( m_cDBThreadID, this, bClientSend, vPartyListExceptMe );
}
// PvP
bool CDNUserSession::bIsPvPRoomListRefreshTime()
{
if( timeGetTime()-m_dwPvPRoomListRefreshTime >= PvPCommon::Common::RoomListRefreshGapTime )
return true;
return false;
}
bool CDNUserSession::bIsLadderUser()
{
#if defined( _WORK )
LadderSystem::CRoom* pRoom = LadderSystem::CManager::GetInstance().GetRoomPtr( GetCharacterName() );
_ASSERT( pRoom ? m_bIsLadderUser == true : m_bIsLadderUser == false );
#endif // #if defined( _WORK )
return m_bIsLadderUser;
}
void CDNUserSession::SetUserJob(BYTE cJob)
{
CDNUserBase::SetUserJob(cJob);
if (GetPartyID() > 0)
g_pPartyManager->SendPartyMemberPart(GetPartyID(), this);
m_ParamData.nJob = cJob;
SendUserLocalMessage(0, FM_CHANGEJOB);
}
void CDNUserSession::SetHide(bool bHide)
{
m_bHide = bHide;
m_ParamData.bHide = m_bHide;
SendUserLocalMessage(0, FM_CHANGEHIDE);
}
void CDNUserSession::SetDefaultMaxFatigue(bool bSend)
{
CDNUserBase::SetDefaultMaxFatigue(bSend);
if (GetPartyID() > 0)
g_pPartyManager->SendPartyMemberPart(GetPartyID(), this);
}
void CDNUserSession::SetDefaultMaxWeeklyFatigue(bool bSend)
{
CDNUserBase::SetDefaultMaxWeeklyFatigue(bSend);
if (GetPartyID() > 0)
g_pPartyManager->SendPartyMemberPart(GetPartyID(), this);
}
void CDNUserSession::SetDefaultMaxRebirthCoin(bool bSend)
{
CDNUserBase::SetDefaultMaxRebirthCoin(bSend);
if (bSend)
SendRebirthCoin(ERROR_NONE, 0, _REBIRTH_SELF, GetSessionID());
}
void CDNUserSession::IncreaseFatigue(int nGap)
{
CDNUserBase::IncreaseFatigue(nGap);
SendFatigue(GetSessionID(), GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
// Guild
void CDNUserSession::RefreshGuildSelfView()
{
SendUserLocalMessage(0, FM_CHANGEGUILDSELFVIEW);
}
int CDNUserSession::CmdSelectChannel( const int iChannelID, bool bSkipVerifyChannelID/*=false*/ )
{
if( !m_pField || !g_pMasterConnection )
return ERROR_NONE;
//<2F>̵<EFBFBD><CCB5><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( iChannelID != m_pField->GetChnnelID())
{
// <20>̵<EFBFBD><CCB5><EFBFBD> ä<><C3A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
const sChannelInfo* pChannelInfo = g_pMasterConnection->GetChannelInfo( iChannelID );
if( !pChannelInfo )
{
_DANGER_POINT();
SendMoveChannelFail(ERROR_PARTY_MOVECHANNELFAIL);
return ERROR_NONE;
}
int nVerifyMapIndex = m_pField->GetMapIndex();
//if( m_pField->bIsPvPVillage() || m_pField->bIsGMVillage() || pChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_GM )
if( m_pField->bIsUseLastMapIndex() || pChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_GM )
nVerifyMapIndex = pChannelInfo->nMapIdx;
// PvP<76><50><EFBFBD><EFBFBD>,<2C><>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD><EEB8B6>, <20><><EFBFBD><EFBFBD><E5B8B6><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>ϴ°Ÿ<C2B0> VerifyChannelID Skip <20>ϰ<EFBFBD> PvP<76><50><EFBFBD><EFBFBD> MapIdx <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
#if defined(PRE_ADD_DWC)
if( bSkipVerifyChannelID || pChannelInfo->nChannelAttribute&(GlobalEnum::CHANNEL_ATT_PVP|GlobalEnum::CHANNEL_ATT_DARKLAIR|GlobalEnum::CHANNEL_ATT_FARMTOWN|GlobalEnum::CHANNEL_ATT_DWC) )
#else
if( bSkipVerifyChannelID || pChannelInfo->nChannelAttribute&(GlobalEnum::CHANNEL_ATT_PVP|GlobalEnum::CHANNEL_ATT_DARKLAIR|GlobalEnum::CHANNEL_ATT_FARMTOWN) )
#endif
{
bSkipVerifyChannelID = true;
nVerifyMapIndex = pChannelInfo->nMapIdx;
}
//<2F>ٸ<EFBFBD> ä<>η<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>½<EFBFBD><C2BD>ϴپ<CFB4>~ <20>׷<EFBFBD>ä<EFBFBD><C3A4><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( bSkipVerifyChannelID || g_pMasterConnection->VerifyChannelID( iChannelID, nVerifyMapIndex ) )
{
if (GetPartyID() > 0)
{
#if defined( PRE_PARTY_DB )
return ERROR_NONE;
#else
CDNParty * pParty = g_pPartyManager->GetParty(GetPartyID());
if (!pParty)
{
_DANGER_POINT();
SendMoveChannelFail(ERROR_PARTY_MOVECHANNELFAIL);
return ERROR_NONE;
}
if( g_pPartyManager->DelPartyMember( pParty, this ) != ERROR_NONE )
{
_DANGER_POINT();
SendMoveChannelFail(ERROR_PARTY_MOVECHANNELFAIL);
return ERROR_NONE;
}
#endif // #if defined( PRE_PARTY_DB )
}
if (pChannelInfo->cVillageID == g_Config.nVillageID && pChannelInfo->nMapIdx == GetMapIndex() )
{
//<2F><><EFBFBD>ο<EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD><EEBFA1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DbCon<6F><6E> threadid<69><64> <20>ٽ<EFBFBD> <20>޾ƿ;<C6BF> <20>մϴ<D5B4>.
//<2F>̶<EFBFBD> Ÿ <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><> <20>̵<EFBFBD><CCB5>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20>ΰ<EFBFBD><CEB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//dbcon<6F><6E> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>ϹǷ<CFB9>...
if (m_pDBCon && m_pDBCon->GetActive())
{
m_pDBCon->QueryMsgAdj(this, iChannelID, nVerifyMapIndex, m_cGateNo);
m_eUserState = STATE_MOVESAMECHANNEL;
}
else
SendMoveChannelFail(ERROR_PARTY_MOVECHANNELFAIL);
}
else
{
if (g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendVillageToVillage(REQINFO_TYPE_SINGLE, GetAccountDBID(), nVerifyMapIndex, m_cGateNo, iChannelID );
else
SendMoveChannelFail(ERROR_PARTY_MOVECHANNELFAIL);
}
return ERROR_NONE;
}
else
_DANGER_POINT();
}
else
_DANGER_POINT();
SendMoveChannelFail(ERROR_PARTY_MOVECHANNELFAIL);
return ERROR_NONE;
}
void CDNUserSession::BroadcastingEffect(char cType, char cState)
{
m_ParamData.cType = cType;
m_ParamData.cState = cState;
SendUserLocalMessage(0, FM_EFFECT);
}
void CDNUserSession::BroadcastingChatRoom( int nSubCmd, UINT nChatRoomParam )
{
switch( nSubCmd )
{
case eChatRoom::SC_CHATROOMVIEW:
{
m_ParamData.nChatRoomParam = nChatRoomParam; // Param<61><6D><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȣ(Param==0 <20><> <20><> <20><><EFBFBD><EFBFBD>)
SendUserLocalMessage( 0, FM_CHATROOMVIEW );
}
break;
case eChatRoom::SC_ENTERUSERCHATROOM:
{
m_ParamData.nChatRoomParam = nChatRoomParam;
SendUserLocalMessage( 0, FM_CHATROOMUSER ); // Param<61><6D><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȣ
}
break;
case eChatRoom::SC_LEAVEUSER:
{
m_ParamData.nChatRoomParam = nChatRoomParam; // Param<61><6D><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendUserLocalMessage( 0, FM_CHATROOMUSER );
}
break;
}
}
void CDNUserSession::StartCostumeMix(int nInvenType, INT64 biInvenSerial)
{
if( !IsNoneWindowState())
{
SendCosMixOpen(ERROR_ITEM_COSMIX_OPEN_FAIL);
return;
}
const CDnCostumeMixDataMgr& mgr = g_pDataManager->GetCosMixDataMgr();
if(mgr.IsEnableCostumeMix() == false)
{
SendCosMixOpen(ERROR_ITEM_COSMIX_OPEN_FAIL);
return;
}
if(m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
{
SendCosMixOpen(ERROR_ITEM_COSMIX_OPEN_FAIL);
return;
}
SetWindowState(WINDOW_COSMIX);
SendCosMixOpen(ERROR_NONE);
// m_nCosMixInvenTypeCache = nInvenType;
m_biCosMixSerialCache = biInvenSerial;
return;
}
int CDNUserSession::OnEndCostumeMix()
{
IsWindowStateNoneSet(WINDOW_COSMIX);
m_biCosMixSerialCache = 0;
// m_nCosMixInvenTypeCache = 0;
return ERROR_NONE;
}
void CDNUserSession::StartCostumeDesignMix(int nInvenType, int nInvenIndex, INT64 biInvenSerial)
{
if( !IsNoneWindowState() )
{
SendCosDesignMixOpen(ERROR_ITEM_DESIGNMIX_OPEN_FAIL);
return;
}
const CDnCostumeMixDataMgr& mgr = g_pDataManager->GetCosMixDataMgr();
if(mgr.IsEnableCostumeDesignMix() == false)
{
SendCosDesignMixOpen(ERROR_ITEM_DESIGNMIX_OPEN_FAIL);
return;
}
if(m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
{
SendCosDesignMixOpen(ERROR_ITEM_DESIGNMIX_OPEN_FAIL);
return;
}
SetWindowState(WINDOW_DESIGNMIX);
m_biCosDesignMixSerialCache = biInvenSerial;
SendCosDesignMixOpen(ERROR_NONE);
return;
}
void CDNUserSession::ResetCostumeDesignCache()
{
m_biCosDesignMixSerialCache = 0;
}
int CDNUserSession::OnEndCostumeDesignMix()
{
IsWindowStateNoneSet(WINDOW_DESIGNMIX);
ResetCostumeDesignCache();
return ERROR_NONE;
}
#ifdef PRE_ADD_COSRANDMIX
#ifdef PRE_ADD_COSRANDMIX_ACCESSORY
void CDNUserSession::StartCostumeRandomMix(CostumeMix::RandomMix::eOpenType openType, int nInvenType, INT64 biInvenSerial)
#else
void CDNUserSession::StartCostumeRandomMix(int nInvenType, INT64 biInvenSerial)
#endif
{
#ifdef PRE_ADD_COSRANDMIX_ACCESSORY
bool bInvalidState = false;
if (openType == CostumeMix::RandomMix::OpenByItem)
{
if (!IsNoneWindowState())
bInvalidState = true;
}
else
if (openType == CostumeMix::RandomMix::OpenByNpc)
{
if (!IsWindowState(WINDOW_BLIND))
bInvalidState = true;
}
if (bInvalidState)
{
SendCosRandomMixOpen(ERROR_ITEM_RANDOMMIX_OPEN_FAIL, CostumeMix::RandomMix::OpenFail);
return;
}
const CDnCostumeRandomMixDataMgr& mgr = g_pDataManager->GetCosRandomMixDataMgr();
if (mgr.IsEnableCosRandomMix() == false)
{
SendCosRandomMixOpen(ERROR_ITEM_RANDOMMIX_OPEN_FAIL, CostumeMix::RandomMix::OpenFail);
return;
}
#else
if( !IsNoneWindowState() )
{
SendCosRandomMixOpen(ERROR_ITEM_RANDOMMIX_OPEN_FAIL);
return;
}
const CDnCostumeRandomMixDataMgr& mgr = g_pDataManager->GetCosRandomMixDataMgr();
if (mgr.IsEnableCosRandomMix() == false)
{
SendCosRandomMixOpen(ERROR_ITEM_RANDOMMIX_OPEN_FAIL);
return;
}
#endif // PRE_ADD_COSRANDMIX_ACCESSORY
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return;
#ifdef PRE_ADD_COSRANDMIX_ACCESSORY
if (openType == CostumeMix::RandomMix::OpenFail)
{
SendCosRandomMixOpen(ERROR_ITEM_RANDOMMIX_OPEN_FAIL, openType);
return;
}
m_CosRandMixOpenType = openType;
#endif
#ifdef PRE_ADD_COSRANDMIX_MIXERTYPE
#ifdef PRE_ADD_COSRANDMIX_ACCESSORY
if (openType == CostumeMix::RandomMix::OpenByItem)
{
const TItem *pItem = m_pItem->GetCashInventory(biInvenSerial);
if (pItem == NULL)
{
SendCosRandomMixOpen(ERROR_ITEM_RANDOMMIX_OPEN_FAIL, openType);
return;
}
const TItemData *pCurItemData = g_pDataManager->GetItemData(pItem->nItemID);
if (pCurItemData == NULL)
{
SendCosRandomMixOpen(ERROR_ITEM_RANDOMMIX_OPEN_FAIL, openType);
return;
}
m_nCosRandMixerEnablePartsType = pCurItemData->nTypeParam[0];
}
#else // PRE_ADD_COSRANDMIX_ACCESSORY
const TItem *pItem = m_pItem->GetCashInventory(biInvenSerial);
if (pItem == NULL)
{
SendCosRandomMixOpen(ERROR_ITEM_RANDOMMIX_OPEN_FAIL);
return;
}
const TItemData *pCurItemData = g_pDataManager->GetItemData(pItem->nItemID);
if (pCurItemData == NULL)
{
SendCosRandomMixOpen(ERROR_ITEM_RANDOMMIX_OPEN_FAIL);
return;
}
m_nCosRandMixerEnablePartsType = pCurItemData->nTypeParam[0];
#endif // PRE_ADD_COSRANDMIX_ACCESSORY
#endif
SetWindowState(WINDOW_RANDOMMIX);
m_biCosRandomMixSerialCache = biInvenSerial;
#ifdef PRE_ADD_COSRANDMIX_ACCESSORY
SendCosRandomMixOpen(ERROR_NONE, openType);
#else
SendCosRandomMixOpen(ERROR_NONE);
#endif
return;
}
int CDNUserSession::OnEndCostumeRandomMix()
{
IsWindowStateNoneSet(WINDOW_RANDOMMIX);
ResetCostumeRandomMixCache();
return ERROR_NONE;
}
void CDNUserSession::ResetCostumeRandomMixCache()
{
m_biCosRandomMixSerialCache = 0;
#ifdef PRE_ADD_COSRANDMIX_ACCESSORY
m_CosRandMixOpenType = CostumeMix::RandomMix::OpenFail;
#endif
#ifdef PRE_ADD_COSRANDMIX_MIXERTYPE
m_nCosRandMixerEnablePartsType = CostumeMix::RandomMix::MixerCanMixPartsAll;
#endif
}
#endif // PRE_ADD_COSRANDMIX
void CDNUserSession::CheckValidCollisionHeight()
{
if( m_pField == NULL )
return;
CDNFieldData* pFieldData = m_pField->GetFieldData();
if(!pFieldData)
return;
if(GetMapIndex() != pFieldData->GetMapIndex())
{
if(m_nAbuseLogSendCount % 10 == 0)
g_Log.Log(LogType::_ERROR, L"CheckValidCollisionHeight - Wrong MapIndex [ADBID:%u, CDBID:%I64d, SID:%u, ObjID:%u] [Map:%d<>%d][Channel:%d<>%d]",
GetAccountDBID(), GetCharacterDBID(), GetSessionID(), m_BaseData.nObjectID, GetMapIndex(), pFieldData->GetMapIndex(), m_BaseData.nChannelID, m_pField->GetChnnelID());
m_nAbuseLogSendCount++;
return;
}
DWORD dwTileSize = pFieldData->GetCurrentTileSize();
float fX = (float)GetTargetPos().nX / 1000.0f;
float fY = (float)GetTargetPos().nY / 1000.0f;
float fZ = (float)GetTargetPos().nZ / 1000.0f;
int nTileMax = 3;
int nTileGap = 2;
int nMaxJump = 1000;
float fOffSetX = fX -(dwTileSize * nTileGap);
float fOffSetZ = fZ -(dwTileSize * nTileGap);
float fPositionX = 0;
float fPositionZ = 0;
float fMaxHeight = FLT_MIN;
for (int i=0; i<nTileMax; i++)
{
fPositionX = fOffSetX +(dwTileSize *i);
for (int j=0; j<nTileMax; j++)
{
fPositionZ = fOffSetZ +(dwTileSize *j);
float fTemp = pFieldData->GetCollisionHeight(fPositionX, fPositionZ) + nMaxJump;
if( fTemp > fMaxHeight ) fMaxHeight = fTemp;
}
}
if( fY > fMaxHeight )
{
if(m_nAbuseLogSendCount % 10 == 0)
{
WCHAR wszBuf[100];
swprintf( wszBuf, L"ABOVE MAX HEIGHT [Map:%d<>%d][Channel:%d<>%d][X:%0.2f][Y:%0.2f][Z:%0.2f][Max:%0.2f]", GetMapIndex(), pFieldData->GetMapIndex(), m_BaseData.nChannelID, m_pField->GetChnnelID(), fX, fY, fZ, fMaxHeight);
GetDBConnection()->QueryAddAbuseLog(this, ABUSE_MOVE_INSKY, wszBuf);
m_nAbuseLogSendCount++;
}
}
//OutputDebug("ABOVE MAX HEIGHT [Map:%d<>%d][Channel:%d<>%d][X:%0.2f][Y:%0.2f][Z:%0.2f][Max:%0.2f]\n", GetMapIndex(), pFieldData->GetMapIndex(), m_BaseData.nChannelID, m_pField->GetChnnelID(), fX, fY, fZ, fMaxHeight);
}
void CDNUserSession::GuildWarReset()
{
CDNUserBase::GuildWarReset();
m_nGuildWarPoint = 0;
m_bGuildWarStats = false; // <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>
m_bGuildWarVote = false;
m_bGuildWarVoteLoading = false;
memset(&m_sMyGuildWarMissionRaningInfo, 0, sizeof(m_sMyGuildWarMissionRaningInfo));
memset(&m_bRewardResults, 1, sizeof(m_bRewardResults));
m_GuildWarBuyedItem.clear();
}
void CDNUserSession::SetGuildWarMissionRankingInfo(TAGetGuildWarPointPartTotal* pGetGuildWarPointPartTotal)
{
for (int i=0; i<GUILDWAR_RANKINGTYPE_MAX; ++i)
{
m_sMyGuildWarMissionRaningInfo[i].wRanking = pGetGuildWarPointPartTotal->GuildWarPointPartTotal[i].wRanking;
m_sMyGuildWarMissionRaningInfo[i].nTotalPoint = pGetGuildWarPointPartTotal->GuildWarPointPartTotal[i].nPoint;
}
m_bGuildWarStats = true;
}
void CDNUserSession::SetGuildWarRewardResults(bool* pRewardResults )
{
for( char i=0; i<GUILDWAR_REWARD_CHAR_MAX; ++i)
{
m_bRewardResults[i] = pRewardResults[i];
}
}
void CDNUserSession::SetGuildWarRewardResultIndex(char cRewardType, bool bResult)
{
if( cRewardType >= GUILDWAR_REWARD_CHAR_MAX || cRewardType < GUILDWAR_REWARD_CHAR_PRESENT )
return;
m_bRewardResults[cRewardType] = bResult;
}
char CDNUserSession::GetGuildWarRewardEnable()
{
for( char i=0; i<GUILDWAR_REWARD_CHAR_MAX; ++i)
{
if( m_bRewardResults[i] == false ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
return i;
}
return GUILDWAR_REWARD_CHAR_MAX;
}
bool CDNUserSession::IsGuildWarReward()
{
for( char i=0; i<GUILDWAR_REWARD_CHAR_MAX; ++i)
{
if( m_bRewardResults[i] == false ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
return true;
}
return false;
}
void CDNUserSession::AddGuildWarBuyedItem(int itemID, int count)
{
std::map<int, int>::iterator it = m_GuildWarBuyedItem.find(itemID);
if (it == m_GuildWarBuyedItem.end())
m_GuildWarBuyedItem.insert(std::map<int, int>::value_type(itemID, count));
else
it->second = it->second + count;
}
int CDNUserSession::GetGuildWarBuyedItem(int itemID) const
{
std::map<int, int>::const_iterator it = m_GuildWarBuyedItem.find(itemID);
if (it == m_GuildWarBuyedItem.end())
return 0;
return it->second;
}
void CDNUserSession::ResetGuildWarBuyedItems()
{
m_GuildWarBuyedItem.clear();
}
#ifdef PRE_ADD_CHANGEJOB_CASHITEM
bool CDNUserSession::CheckAndCalcParallelChangeJob( /*IN*/ int iJobID, /*OUT*/ int& iFirstJobID, /*OUT*/ int& iSecondJobID )
{
#ifdef PRE_ADD_JOBCHANGE_RESTRICT_JOB
DNTableFileFormat* pJobTable = GetDNTable( CDnTableDB::TJOB );
CDNTableFile::Cell* pServiceCell = pJobTable->GetFieldFromLablePtr( iJobID, "_Service" );
CDNTableFile::Cell* pJobChangeAvailCell = pJobTable->GetFieldFromLablePtr( iJobID, "_JobChangeAble" );
if( pServiceCell == NULL || pJobChangeAvailCell == NULL )
{
return false;
}
else
{
if( pServiceCell->GetInteger() <= 0 || pJobChangeAvailCell->GetInteger() <= 0 )
return false;
}
#endif // PRE_ADD_JOBCHANGE_RESTRICT_JOB
bool bResult = false;
iFirstJobID = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD> ù<><C3B9>° <20><><EFBFBD><EFBFBD> ID
iSecondJobID = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> ID
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ谪<DCB0><E8B0AA> <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int iNowJob = this->GetUserJob();
int iNowJobDegree = g_pDataManager->GetJobNumber( iNowJob );
int iBaseClassID = g_pDataManager->GetBaseClass( iNowJob );
int iJobIDToChange = iJobID;
TJobTableData* pJobDataToChange = g_pDataManager->GetJobTableData( iJobIDToChange );
if( pJobDataToChange )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲٷ<D9B2><D9B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE>߸<EFBFBD> <20>Ѵ<EFBFBD>.
int iBaseClassIDToChangeJob = g_pDataManager->GetBaseClass( iJobIDToChange );
if( iBaseClassID == iBaseClassIDToChangeJob )
{
int iJobDeepToChange = g_pDataManager->GetJobNumber( iJobIDToChange );
if( iJobDeepToChange == iNowJobDegree )
{
bResult = true;
if( 1 == iNowJobDegree )
{
iFirstJobID = iJobIDToChange;
}
else
if( 2 == iNowJobDegree )
{
iFirstJobID = g_pDataManager->GetParentJob( iJobIDToChange );
iSecondJobID = iJobIDToChange;
}
}
else
{
#ifdef _WORK
// <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> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> <20>մϴ<D5B4>. <20>Ұ<EFBFBD><D2B0><EFBFBD>!!\r\n");
this->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
#endif // #ifdef _WORK
}
}
else
{
#ifdef _WORK
// <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");
this->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
#endif // #ifdef _WORK
}
}
if( false == bResult )
{
#ifdef _WORK
wstring wszString = FormatW(L"<EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> Job ID <20>Դϴ<D4B4>..\r\n");
this->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
#endif // #ifdef _WORK
}
return bResult;
}
#endif // #ifdef PRE_ADD_CHANGEJOB_CASHITEM
void CDNUserSession::WritePingLog()
{
if( m_pairTcpPing.second == 0 )
return;
g_Log.Log( LogType::_PING, this, L"[%d] IP=%S TcpPing=%dms(%d/%d)\r\n", g_Config.nManagedID, GetIp(), m_pairTcpPing.first/m_pairTcpPing.second, m_pairTcpPing.first, m_pairTcpPing.second );
}
void CDNUserSession::UseExpandSkillPage()
{
int nSkillArray[DEFAULTSKILLMAX] = { 0, };
int nSkillPoint = GetSkill()->GetLevelUpSkillPoint( 1, GetLevel());
SetSkillPoint( nSkillPoint, DualSkill::Type::Secondary );
g_pDataManager->GetCreateDefaultSkill( GetClassID(), nSkillArray );
GetDBConnection()->QueryUseExpandSkillPage(m_pSession, nSkillArray, nSkillPoint );
}
int CDNUserSession::TryWarpVillage(int nMapIndex, INT64 nItemSerial)
{
if (!g_pMasterConnection || !g_pMasterConnection->GetActive())
return ERROR_GENERIC_MASTERCON_NOT_FOUND;
g_pMasterConnection->SendVillageToVillage(REQINFO_TYPE_SINGLE, GetAccountDBID(), nMapIndex, -1, -1, NULL, nItemSerial);
return ERROR_NONE;
}
void CDNUserSession::WarpVillage(MAVITargetVillageInfo* pPacket)
{
SetWindowState(WINDOW_NONE);
if (!DeleteWarpVillageItemByUse(pPacket->nItemSerial))
return;
ChangeMap(pPacket->cVillageID, pPacket->nTargetChannelID, pPacket->nTargetMapIdx, pPacket->szIP, pPacket->nPort, pPacket->cPartyInto <= 0 ? false : true);
}
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
void CDNUserSession::ApplyPartyEffectSkillItemData( CSUseItem *pPacket, TItemData *pItemData, UINT nUseSessionID, EffectSkillNameSpace::ShowEffectType::eType eType, bool bSendDB, bool bUseItem )
{
CDNParty* pParty = g_pPartyManager->GetParty( GetPartyID() );
bool bBuff = false;
if(pParty && pItemData && pItemData->nTypeParam[0] == EffectSkillNameSpace::BuffType::Partybuff )
{
pParty->ApplyPartyEffectSkillItemData( pPacket, pItemData, nUseSessionID, eType, bSendDB, bUseItem );
bBuff = true;
}
if( !bBuff && GetItem() )
{
GetItem()->ApplyPartyEffectSkillItemData( pPacket, pItemData, GetSessionID(), eType, true, true );
}
if( pParty )
{
pParty->SendAllRefreshParty(PARTYREFRESH_NONE);
}
}
#endif
#if defined( PRE_FIX_BUFFITEM )
void CDNUserSession::DelPartyEffectSkillItemData()
{
if( GetPartyID() > 0 )
{
CDNParty * pParty = g_pPartyManager->GetParty(GetPartyID());
if (pParty)
pParty->SendAllRefreshParty(PARTYREFRESH_NONE);
}
}
#endif
#if defined(PRE_FIX_62281)
#if defined(PRE_PARTY_DB)
int CDNUserSession::CheckPartyInvitableState(const WCHAR * pInviterName, int nPartyMinLevel)
#else
int CDNUserSession::CheckPartyInvitableState(const WCHAR * pInviterName, int nPartyMinLevel, int nPartyMaxLevel)
#endif
{
if( m_eUserState != STATE_NONE ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ʴ<EFBFBD> <20>Ұ<EFBFBD><D2B0>ϴ<EFBFBD>
return ERROR_PARTY_INVITEFAIL_DEST_USER_NOWREADY;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӿɼ<D3BF><C9BC><EFBFBD> Ȯ<><C8AE><EFBFBD>մϴ<D5B4>.
if( IsAcceptAbleOption(GetCharacterDBID(), GetAccountDBID(), _ACCEPTABLE_CHECKTYPE_PARTYINVITE) == false )
return ERROR_PARTY_INVITEFAIL;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> <20>˾<EFBFBD> <20><><EFBFBD>ϴ<EFBFBD>
if( GetIsolate()->IsIsolateItem(pInviterName) )
return ERROR_PARTY_INVITEFAIL;
// GM<47≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20>ؾ<EFBFBD><D8BE><EFBFBD>
if( (GetAccountLevel() >= AccountLevel_New) && (GetAccountLevel() <= AccountLevel_Master))
return ERROR_PARTY_INVITEFAIL_DESTUSER_NOTFOUND;
const sChannelInfo* pUserChInfo = g_pMasterConnection->GetChannelInfo(GetChannelID());
if( pUserChInfo == NULL )
return ERROR_PARTY_INVITEFAIL;
#if defined(PRE_ADD_DWC)
if( pUserChInfo->nChannelAttribute&(GlobalEnum::CHANNEL_ATT_PVP|GlobalEnum::CHANNEL_ATT_PVPLOBBY|GlobalEnum::CHANNEL_ATT_DWC) )
#else
if( pUserChInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_PVP || pUserChInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_PVPLOBBY)
#endif
return ERROR_PARTY_INVITEFAIL_DESTLOCATION_NOT_SAME;
if( !IsNoneWindowState())
return ERROR_PARTY_INVITEFAIL_DESTUSER_SITUATION_NOTALLOWED;
if( GetPartyID() > 0)
return ERROR_PARTY_INVITEFAIL_ALREADY_HAS_PARTY;
if( GetLevel() < nPartyMinLevel)
return ERROR_PARTY_INVITEFAIL_CHARACTERLEVEL_SHORTAGE;
#if defined( PRE_PARTY_DB )
#else
if( GetLevel() > nPartyMaxLevel)
return ERROR_PARTY_JOINFAIL_CHARACTERLEVEL_OVER;
#endif // #if defined( PRE_PARTY_DB )
return ERROR_NONE;
}
#endif
#if defined( PRE_ADD_NEWCOMEBACK )
void CDNUserSession::CheckComebackRewardItem( TLevelupEvent ComebackReward )
{
if( ComebackReward.nMailID > 0)
{
TMailTableData *pData = g_pDataManager->GetMailTableData( ComebackReward.nMailID );
if (pData)
{
TItem NewItem = {0};
for( int i=0; i<MAILATTACHITEMMAX; i++ )
{
if( pData->ItemIDArr[i] > 0 && pData->ItemCountArr[i] > 0 )
{
TItemData* pItemData = g_pDataManager->GetItemData(pData->ItemIDArr[i]);
if( pItemData )
{
if( pItemData->IsCash )
{
g_Log.Log(LogType::_COMEBACK, this, L"AccountDBID[%d] ComebackUser!! Item CashType Failed!! ItemID[%d]\n", GetAccountDBID(), pItemData->nItemID);
break;
}
if( GetItem()->CreateInvenItem1( pItemData->nItemID, pData->ItemCountArr[i], -1, -1, DBDNWorldDef::AddMaterializedItem::COMEBACKREWARD, 0 ) )
{
g_Log.Log(LogType::_COMEBACK, this, L"AccountDBID[%d] ComebackUser!! Inven Item Failed!! ItemID[%d]\n", GetAccountDBID(), pItemData->nItemID);
}
}
}
}
}
}
if( ComebackReward.nCashMailID > 0)
{
TMailTableData *pData = g_pDataManager->GetMailTableData( ComebackReward.nCashMailID );
if (pData)
{
for( int i=0; i<MAILATTACHITEMMAX; i++ )
{
if( pData->ItemSNArr[i] > 0 )
{
int nItemID = g_pDataManager->GetCashCommodityItem0(pData->ItemSNArr[i]);
int nItemCount = g_pDataManager->GetCashCommodityCount(pData->ItemSNArr[i]);
int nPeriod = g_pDataManager->GetCashCommodityPeriod(pData->ItemSNArr[i]);
TItemData* pItemData = g_pDataManager->GetItemData(nItemID);
if( pItemData && nItemCount > 0 )
{
if( !pItemData->IsCash )
{
g_Log.Log(LogType::_COMEBACK, this, L"AccountDBID[%d] ComebackUser!! Item NotCashType Failed!! ItemID[%d]\n", GetAccountDBID(), pItemData->nItemID);
break;
}
if( GetItem()->CreateCashInvenItem( nItemID, nItemCount, DBDNWorldDef::AddMaterializedItem::COMEBACKREWARD, -1, nPeriod, 0, pItemData->nItemID ) )
{
g_Log.Log(LogType::_COMEBACK, this, L"AccountDBID[%d] ComebackUser!! CashItem Error!! ItemID[%d]\n", GetAccountDBID(), pItemData->nItemID);
}
}
}
}
}
}
}
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( GetPartyID() > 0 )
{
CDNParty* pParty = g_pPartyManager->GetParty( GetPartyID() );
if( pParty && pParty->bIsComebackParty() )
{
pParty->DelPartyMemberAppellation( nPrevComebackAppellation );
}
}
else
{
TAppellationData *pAData = g_pDataManager->GetAppellationData( nPrevComebackAppellation );
if( pAData )
{
TItemData* pBuffItemData = g_pDataManager->GetItemData( pAData->nSkillItemID );
if( pBuffItemData )
{
if( GetItem() )
{
TEffectSkillData* EffectSkill = GetItem()->GetEffectSkillItem( EffectSkillNameSpace::SearchType::SkillID, pBuffItemData->nSkillID );
if( EffectSkill )
{
GetItem()->DelEffectSkillItem( pBuffItemData->nSkillID );
SendDelEffectSkillItemData( GetSessionID(), pBuffItemData->nItemID );
}
}
}
}
}
}
if( m_nComebackAppellation > 0 )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
TAppellationData *pAData = g_pDataManager->GetAppellationData( m_nComebackAppellation );
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 )
{
if( GetPartyID() > 0 )
{
CDNParty* pParty = g_pPartyManager->GetParty( GetPartyID() );
if( pParty )
{
pParty->SetComebackParty(true);
pParty->ApplyPartyEffectSkillItemData(&pPacket, pBuffItemData, m_pSession->GetSessionID(), EffectSkillNameSpace::ShowEffectType::NONEEFFECT, false, true);
pParty->SendAllRefreshParty(PARTYREFRESH_NONE);;
}
}
else
{
m_pSession->GetItem()->ApplyPartyEffectSkillItemData(&pPacket, pBuffItemData, m_pSession->GetSessionID(), EffectSkillNameSpace::ShowEffectType::NONEEFFECT, false, true);
}
}
}
}
}
else
{
if( GetPartyID() > 0 )
{
CDNParty* pParty = g_pPartyManager->GetParty( GetPartyID() );
if( pParty )
pParty->SendAllRefreshParty(PARTYREFRESH_NONE);;
}
}
}
}
#endif
#if defined(PRE_ADD_TRANSFORM_POTION)
void CDNUserSession::CalcTransformExpire(DWORD CurTick)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if( m_nTransformID > 0 && m_dwTransformTick<=CurTick)
{
// <20><><EFBFBD><EFBFBD>
m_dwTransformTick = 0;
m_nTransformID = 0;
SendUserLocalMessage(0, FM_CHANGE_TRANSFORM);
}
}
void CDNUserSession::SetTransformID(int nTransformID, int nExpireMinute)
{
m_nTransformID = nTransformID;
m_dwTransformTick = timeGetTime()+(1000*nExpireMinute);
}
#endif
#if defined( PRE_ALTEIAWORLD_EXPLORE )
void CDNUserSession::AlteiaWorldDailyResetInfo()
{
BYTE cTicketCount = (BYTE)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldDailyTicketCount );
BYTE cSendTicketCount = (BYTE)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldSendTicketCount );
SetAlteiaDailyPlayCount(0);
SetAlteiaTicketCount(cTicketCount);
SetAlteiaSendTicketCount(cSendTicketCount);
m_AlteiaSendTicketList.clear();
SendAlteiaWorldJoinInfo( m_cWeeklyPlayCount, m_cDailyPlayCount, m_cTicketCount );
}
void CDNUserSession::AlteiaWorldWeeklyResetInfo()
{
SetAlteiaWeeklyPlayCount(0);
}
void CDNUserSession::AlteiaWorldInfo( AlteiaWorld::CSAlteiaWorldInfo* pPacket )
{
if( !IsNoneWindowState() && !IsWindowState(WINDOW_ALTEIAWORLD) )
return;
if( GetPartyID() > 0 )
return;
switch( pPacket->eType )
{
case AlteiaWorld::Info::JoinInfo:
{
SendAlteiaWorldJoinInfo( m_cWeeklyPlayCount, m_cDailyPlayCount, m_cTicketCount );
SetWindowState(WINDOW_ALTEIAWORLD);
}
break;
case AlteiaWorld::Info::PrivateGoldKeyRankInfo:
{
GetDBConnection()->QueryGetAlteiaWorldPrivateGoldKeyRank( this );
}
break;
case AlteiaWorld::Info::PrivatePlayTimeRankInfo:
{
GetDBConnection()->QueryGetAlteiaWorldPrivatePlayTimeRank( this );
}
break;
case AlteiaWorld::Info::GuildGoldKeyRankInfo:
{
GetDBConnection()->QueryGetAlteiaWorldGuildGoldKeyRank( this );
}
break;
case AlteiaWorld::Info::SendTicketInfo:
{
AlteiaWorldSendTicketInfo();
}
break;
}
return;
}
int CDNUserSession::AlteiaWorldJoin()
{
if( !IsWindowState(WINDOW_ALTEIAWORLD) )
return ERROR_GENERIC_INVALIDREQUEST;
if( GetPartyID() > 0 )
return ERROR_GENERIC_INVALIDREQUEST;
TAlteiaWorldMapInfo* pAlteiaWorldMapInfo = g_pDataManager->GetAlteiaWorldMapInfo(1);
// Ƚ<><C8BD>üũ
BYTE cPlayCount = (BYTE)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldDailyPlayCount );
if(GetAlteiaDailyPlayCount() >= cPlayCount)
return ERROR_GENERIC_INVALIDREQUEST;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üũ
BYTE cTicketCount = (BYTE)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldJoinTicketCount );
if(m_cTicketCount < cTicketCount )
return ERROR_GENERIC_INVALIDREQUEST;
// <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>üũ
if( g_pDataManager && !g_pDataManager->bIsAlteiaWorldEventTime() )
return ERROR_GENERIC_INVALIDREQUEST;
ScheduleStruct *pSchedule;
for( DWORD i=0; i<m_VecScheduleList.size(); i++ )
{
pSchedule = &m_VecScheduleList[i];
if( pSchedule->EventType == CDNSchedule::ResetWeeklyMission )
{
time_t LocalTime;
tm pLocalTime;
time(&LocalTime);
pLocalTime = *localtime(&LocalTime);
int nWeek = pSchedule->Cycle - CDNSchedule::Sunday;
if( pLocalTime.tm_wday == nWeek )
{
int nEnterLimitStartTime = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldEnterLimitStartTime );
int nEnterLimitEndTime = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::AlteiaWorldEnterLimitEndTime );
int nResetTime = pSchedule->cHour * 60 + pSchedule->cMinute;
int nCurTime = pLocalTime.tm_hour * 60 + pLocalTime.tm_min;
if( nCurTime >= nResetTime - nEnterLimitStartTime && nCurTime <= nResetTime + nEnterLimitEndTime )
{
//<2F><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
return ERROR_ALTEIAWORLD_ENTERLIMITTIME;
}
}
}
}
if( pAlteiaWorldMapInfo )
{
int TargetMapIndex = pAlteiaWorldMapInfo->nMapID;
if( TargetMapIndex <= 0 || m_pField == NULL )
{
m_cGateNo = -1;
m_cGateSelect = -1;
return ERROR_PARTY_STARTSTAGE_FAIL;
}
if( g_pMasterConnection->GetActive() == false )
return ERROR_GENERIC_MASTERCON_NOT_FOUND;
m_nSingleRandomSeed = timeGetTime();//_rand();
m_cGateNo = 1;
m_cGateSelect = -1;
g_pMasterConnection->SendReqGameID( GameTaskType::Normal, REQINFO_TYPE_SINGLE, m_nAccountDBID, GetChannelID(), m_nSingleRandomSeed, TargetMapIndex, m_cGateNo, Dungeon::Difficulty::Easy, true ); // GameID<49><44> <20><>û
}
else
{
g_Log.Log(LogType::_NORMAL, m_pSession, L"AlateiaWorldMapInfo Error!!\r\n");
return ERROR_GENERIC_INVALIDREQUEST;
}
return ERROR_NONE;
}
bool CDNUserSession::bIsAlteiaSendTicketList( INT64 biCharacterDBID )
{
for( std::list<INT64>::iterator itor = m_AlteiaSendTicketList.begin();itor != m_AlteiaSendTicketList.end();itor++ )
{
if( biCharacterDBID == *itor)
return true;
}
return false;
}
void CDNUserSession::AlteiaWorldSendTicketInfo()
{
INT64 biCharacterDBID[AlteiaWorld::Common::MaxSendCount];
memset(biCharacterDBID, 0, sizeof(biCharacterDBID));
int nCount = 0;
for( std::list<INT64>::iterator itor = m_AlteiaSendTicketList.begin();itor != m_AlteiaSendTicketList.end();itor++ )
{
biCharacterDBID[nCount] = *itor;
nCount++;
if( nCount >= AlteiaWorld::Common::MaxSendCount )
{
g_Log.Log(LogType::_NORMAL, m_pSession, L"AlateiaWorld SendTicketList Error!!\r\n");
break;
}
}
SendAlteiaWorldSendTicketInfo( biCharacterDBID, m_cSendTicketCount);
}
void CDNUserSession::AddAlteiaTicket( int nCount/*=1*/ )
{
m_cTicketCount += nCount;
}
void CDNUserSession::DelAlteiaSendTicket( int nCount/*=1*/ )
{
m_cSendTicketCount -= nCount;
}
#endif
#if defined( PRE_DRAGONBUFF )
void CDNUserSession::ApplyWorldBuff( WCHAR* wszCharacterName, int nItemID )
{
TItemData* pBuffItemData = g_pDataManager->GetItemData(nItemID);
if (!pBuffItemData)
{
_DANGER_POINT();
g_Log.Log(LogType::_BESTFRIEND, this, L"CDNUserSession::ApplyWorldBuff Invalid BuffItem [%d] \r\n", nItemID);
return;
}
CSUseItem pPacket;
memset(&pPacket, 0, sizeof(pPacket));
pPacket.biInvenSerial = GetItem()->MakeItemSerial();
GetItem()->ApplyPartyEffectSkillItemData(&pPacket, pBuffItemData, GetSessionID(), EffectSkillNameSpace::ShowEffectType::NONEEFFECT, true, false);
SendWorldBuffMsg(wszCharacterName, nItemID);
if( GetPartyID() > 0 )
{
CDNParty* pParty = g_pPartyManager->GetParty( GetPartyID() );
if( pParty )
{
pParty->SendAllRefreshParty(PARTYREFRESH_NONE);
}
}
}
#endif
#if defined(PRE_ADD_DWC)
void CDNUserSession::RefresDWCTeamName()
{
SendUserLocalMessage(0, FM_CHANGEDWCTEAM);
}
#endif