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

11927 lines
No EOL
360 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

#include "StdAfx.h"
#include "DNUserBase.h"
#include "DNUserSession.h"
#include "DNUserSendManager.h"
#include "DNFriend.h"
#include "DNIsolate.h"
#include "DNMissionSystem.h"
#include "DNAppellation.h"
#include "DNGameDataManager.h"
#include "DNDBConnectionManager.h"
#include "DNRestraint.h"
#include "DNGuildSystem.h"
#include "DNDBConnection.h"
#include "DNDBConnectionManager.h"
#include "DNLogConnection.h"
#include "DNWorldUserState.h"
#include "DNMasterConnection.h"
#include "DNAuthManager.h"
#include "DNQuestManager.h"
#include "DNCashConnection.h"
#include "EtUIXML.h"
#include "TimeSet.h"
#include "DNEvent.h"
#include "DNCashRepository.h"
#include "DNTimeEventSystem.h"
#include "DNMailSender.h"
#include "SundriesFunc.h"
#include "DNCountryUnicodeSet.h"
#ifdef _USE_VOICECHAT
#include "DNVoiceChat.h"
#endif
#include "DNCommonVariable.h"
#if defined(_VILLAGESERVER)
#include "DNPartyManager.h"
#include "DNUserSessionManager.h"
#include "DNNpcObject.h"
#include "DNFieldManager.h"
#include "DNVillageUserEventHandler.hpp"
extern TVillageConfig g_Config;
#elif defined(_GAMESERVER)
#include "DNGameUserEventHandler.hpp"
#include "DNMasterConnectionManager.h"
#include "DnPlayerActor.h"
#include "DNUserTcpConnection.h"
extern TGameConfig g_Config;
#endif
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
#include "ReputationSystemRepository.h"
#include "NpcReputationProcessor.h"
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
#include "MasterSystemCacheRepository.h"
#if defined( PRE_ADD_SECONDARY_SKILL )
#include "SecondarySkillRepositoryServer.h"
#include "ManufactureSkill.h"
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
#include "DNPeriodQuestSystem.h"
#include "DNGuildRecruitCacheRepository.h"
#ifdef PRE_ADD_LIMITED_CASHITEM
#include "DNLimitedCashItemRepository.h"
#endif //#ifdef PRE_ADD_LIMITED_CASHITEM
#if defined (PRE_ADD_BESTFRIEND)
#include "DNBestFriend.h"
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
#include "DNPrivateChatChannel.h"
#include "DnPrivateChatManager.h"
#endif
#if defined( PRE_ADD_STAMPSYSTEM )
#include "DNStampSystem.h"
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
#include "DNGesture.h"
#include "Version.h"
CDNUserBase::CDNUserBase(void): CDNUserSendManager((CDNUserSession*)this)
{
m_nAccountDBID = m_nSessionID = 0;
m_biCharacterDBID = 0;
memset(&m_wszAccountName, 0, sizeof(m_wszAccountName));
memset(&m_szAccountName, 0, sizeof(m_szAccountName));
memset(&m_szCharacterName, 0, sizeof(m_szCharacterName));
if( g_pDBConnectionManager )
m_pDBCon = g_pDBConnectionManager->GetDBConnection( m_cDBThreadID );
else
m_pDBCon = NULL;
m_bLoadUserData = false;
memset(&m_UserData, 0, sizeof(TUserData));
memset(&m_Profile, 0, sizeof(TProfile));
memset( &m_PvPLadderScoreInfo, 0, sizeof(m_PvPLadderScoreInfo) );
memset( &m_PvPTotalGhoulScores, 0, sizeof(m_PvPTotalGhoulScores) );
memset( &m_PvPAddGhoulScores, 0, sizeof(m_PvPAddGhoulScores) );
memset(&m_UnionReputePointInfo, 0, sizeof(m_UnionReputePointInfo));
// m_pSendManager = new CDNUserSendManager(this);
m_pItem = new CDNUserItem(m_pSession);
m_pQuest = new CDNUserQuest(m_pSession);
m_pCheatCommand = new CDNCheatCommand(m_pSession);
m_pGMCommand = new CDNGMCommand(m_pSession);
m_pFriend = new CDNFriend(this);
m_pIsolate = new CDNIsolate(this);
m_pMissionSystem = new CDNMissionSystem(m_pSession);
m_pEventSystem = new CDNEventSystem(m_pSession);
m_pAppellation = new CDNAppellation(m_pSession);
m_pRestraint = new CDNRestraint(this);
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
m_pReputationSystem = new CReputationSystemRepository( static_cast<CDNUserSession*>(this) );
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
#if defined( PRE_ADD_SECONDARY_SKILL )
m_pSecondarySkillRepository = new CSecondarySkillRepositoryServer( static_cast<CDNUserSession*>(this) );
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
m_pGesture = new CDNGesture(m_pSession);
m_pTimeEventSystem = new CDNTimeEventSystem(m_pSession);
m_pCommonVariable = new CDNCommonVariable(m_pSession);
#if defined (PRE_ADD_BESTFRIEND)
m_pBestFriend = new CDNBestFriend(m_pSession);
#endif
m_TalkParamList.clear();
m_bSkipParagraphCheck = m_bCalledNpcResponse = m_bIsNpcTalk = false;
m_nExchangeTargetSessionID = m_nExchangeSenderSID = m_nExchangeReceiverSID = 0;
m_dwLastMessageTick = timeGetTime();
m_cLastMainCmd = m_cLastSubCmd = 0;
m_bHide = false;
m_bNeedUpdateOption = false;
memset(&m_GameOption, 0, sizeof(TGameOptions));
m_GameOption.SetDefault();
#if defined(_CH)
m_cFCMState = FCMSTATE_NONE;
m_nFCMOnlineMin = 0;
#endif // _CH
#if defined(_GPK)
m_dwCheckGPKTick = 0;
m_dwRecvGPKTick = 0;
m_bRespondErr = false;
if (g_Config.pDynCode)
{
m_nCodeIndex = g_Config.pDynCode->GetRandIdx();
if (m_nCodeIndex < 0)
{
g_Log.Log(LogType::_GPKERROR, m_pSession, L"GetRandIdx Fail Index[%d]\n", m_nCodeIndex);
}
m_nCodeLen = g_Config.pDynCode->GetCltDynCode(m_pSession->m_nCodeIndex, &m_pCode);
if (m_pCode == NULL || m_nCodeLen < 0 || m_nCodeLen > GPKCODELENMAX )
{
g_Log.Log(LogType::_GPKERROR, m_pSession, L"GetCltDynCode Fail Len[%d]\n", m_nCodeLen);
m_nCodeLen = 0;
}
}
else
{
m_nCodeIndex = m_nCodeLen = -1;
}
#endif // _GPK
#ifdef PRE_ADD_GACHA_JAPAN
m_nGachaponShopID = 0;
#endif // PRE_ADD_GACHA_JAPAN
m_nWorldSetID = m_nRoomID = m_nChannelID = m_nClickedNpcID = m_nCutSceneID = 0;
m_nClickedNpcObjectID = 0;
m_wGameID = 0;
m_cVillageID = 0;
m_sUserWindowState = WINDOW_NONE;
m_bPCBang = false;
m_cPCBangGrade = PCBang::Grade::None;
m_nPcBangBonusExp = 0;
m_bAdult = true;
m_cAge = 0;
m_cDailyCreateCount = 0;
m_nPrmInt1 = 0;
m_cLastServerType = SERVERTYPE_MAX;
m_bCharOutLog = false;
m_nCashBalance = 0;
#if defined(_US)
m_nNxAPrepaid = m_nNxACredit = 0; // m_biCashBalance - m_biNxAPrepaid
#endif // #if defined(_US)
// Auth
m_bCertified = false;
m_dwCertifyingTick = 0;
m_biCertifyingKey = 0;
memset(&m_wszVirtualIp, 0, sizeof(m_wszVirtualIp));
memset(&m_szVirtualIp, 0, sizeof(m_szVirtualIp));
::memset(m_dwTick, 0, sizeof(m_dwTick));
m_cLastStageClearRank = -1;
m_GuildSelfView.Reset();
m_bVoiceAvailable = false;
#ifdef _USE_VOICECHAT
m_nVoiceChannelID = 0;
m_nVoiceJoinType = _VOICEJOINTYPE_NONE;
m_cIsTalking = false;
memset(m_nVoiceMutedList, 0, sizeof(m_nVoiceMutedList));
#endif
m_dwNpcTalkLastIndexHashCode = 0;
m_dwNpcTalkLastTargetHashCode = 0;
m_bIsSetSecondAuthPW = false; // 2<><32> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>й<EFBFBD>ȣ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_bIsSetSecondAuthLock = false; // 2<><32> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Lock <20><><EFBFBD><EFBFBD>
#if defined(_KR) || defined(_US)
m_nNexonSN = 0;
#endif // #if defined(_KR)
m_cVIPRebirthCoin = 0;
m_bVIP = false;
m_nVIPTotalPoint = 0;
m_tVIPEndDate = 0;
m_bVIPAutoPay = false;
m_nVIPBonusExp = 0;
m_bIntroducer = false;
m_bFriendBonus = false;
for (int i = 0; i < eCheckPaperingAmount; i++){
m_dwCheckPaperingRemainTime[i] = 0;
m_listRecentCheckTime[i].clear();
}
m_pEffectRepository = new CDNEffectRepository((CDNUserSession*)this );
memset( &m_MasterSystemData, 0, sizeof(m_MasterSystemData) );
m_bSecurityUpdate = false;
m_nVehicleObjectID = 0;
#if defined(PRE_ADD_MISSION_COUPON)
m_nExpiredPetID = 0;
#endif
m_nExpandNestClearCount = 0;
#if defined(PRE_ADD_TSCLEARCOUNTEX)
m_nExpandTreasureStageClearCount = 0;
#endif // #if defined(PRE_ADD_TSCLEARCOUNTEX)
memset(&m_szMID, 0, sizeof(m_szMID));
m_dwGRC = 0;
GuildWarReset();
m_iRemoteEnchantItemID = 0;
m_iRemoteItemCompoundItemID = 0;
m_iHackAbuseDBValue = 0;
m_iHackAbuseDBCallCount = 0;
m_iHackPlayRestraintValue = 0;
m_iHackResetRestraintValue = 0;
m_nHackAbuseCharacterCntWithoutMe = 0;
#if defined(PRE_ADD_ANTI_CHAT_SPAM)
m_bSpammer = false;
#endif
m_dwCheckTcpPing = timeGetTime();
m_pairTcpPing = std::make_pair(0,0);
m_bSaleAbortListSended = false;
m_ShopType = Shop::Type::Normal;
memset(&m_OwnCharacterLevelList, 0, sizeof(m_OwnCharacterLevelList));
#if defined( _VILLAGESERVER )
m_pUserEventHandler = new CDNVillageUserEventHandler( m_pSession );
#else
m_pUserEventHandler = new CDNGameUserEventHandler( m_pSession );
#endif // #if defined( _VILLAGESERVER )
#if defined(PRE_ADD_MULTILANGUAGE)
m_eSelectedLanguage = MultiLanguage::eDefaultLanguage;
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
#ifdef PRE_ADD_COMEBACK
m_bComebackUser = false;
#endif //#ifdef PRE_ADD_COMEBACK
#if defined(PRE_ADD_GAMEQUIT_REWARD)
m_bReConnectUserReward = false;
m_eUserGameQuitRewardType = GameQuitReward::RewardType::None;
#endif // #if defined(PRE_ADD_GAMEQUIT_REWARD)
#if defined(_ID)
memset(&m_szMacAddress, 0, sizeof(m_szMacAddress));
memset(&m_szKey,0,sizeof(m_szKey));
m_dwKreonCN = 0;
#endif
m_nShopID = 0;
#if defined(PRE_ADD_REMOTE_OPENSHOP)
m_bRemoteShopOpen = false;
#endif // #if defined(PRE_ADD_REMOTE_OPENSHOP)
#if defined( PRE_ADD_LIMITED_SHOP )
#if defined( PRE_FIX_74404 )
m_LimitedShopBuyedItemList.clear();
#else // #if defined( PRE_FIX_74404 )
m_LimitedShopBuyedItem.clear();
#endif // #if defined( PRE_FIX_74404 )
#endif // #if defined( PRE_ADD_LIMITED_SHOP )
memset(m_bPeriodQuestSchedule, 0, sizeof(m_bPeriodQuestSchedule));
memset(m_dwPeriodQuestTick, 0, sizeof(m_dwPeriodQuestTick));
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
m_nTotalLevelSKillLevel = 0;
memset(m_nTotalLevelSKillData, 0, sizeof(m_nTotalLevelSKillData));
memset(m_bTotalLevelSkillCashSlot, 0, sizeof(m_bTotalLevelSkillCashSlot));
memset(m_nTotalLevelSkillCashSlot, 0, sizeof(m_nTotalLevelSkillCashSlot));
#endif
#if defined( PRE_ADD_NEWCOMEBACK )
m_nComebackAppellation = 0;
#endif
#ifdef PRE_ADD_JOINGUILD_SUPPORT
m_cGuildJoinLevel = 0;
m_bWasRewardedGuildMaxLevel = true;
m_bPartyBegginerGuild = false;
#endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
#if defined(_KRAZ)
m_bShutdownDetach = false;
memset(&m_ShutdownData, 0, sizeof(TShutdownData));
#endif // #if defined(_KRAZ)
m_bFinalize = false;
#if defined(PRE_RECEIVEGIFTALL)
m_nReceiveGiftPageCount = 0;
m_VecReceiveGiftResultList.clear();
#endif // #if defined(PRE_RECEIVEGIFTALL)
#if defined( PRE_ADD_STAMPSYSTEM )
m_pStampSystem = new CDNStampSystem( static_cast<CDNUserSession*>(this) );
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
#if defined(PRE_FIX_74387)
m_bNowResellItem = false;
#endif
#if defined(PRE_ADD_CP_RANK)
m_cStageClearBestRank = 0;
m_nStageClearBestCP = 0;
#endif //#if defined(PRE_ADD_CP_RANK)
#if defined( PRE_ADD_NEW_MONEY_SEED )
m_nSeedPoint = 0;
#endif
}
CDNUserBase::~CDNUserBase(void)
{
SAFE_DELETE(m_pItem);
SAFE_DELETE(m_pQuest);
SAFE_DELETE(m_pCheatCommand);
SAFE_DELETE(m_pGMCommand);
SAFE_DELETE(m_pFriend);
SAFE_DELETE(m_pIsolate);
SAFE_DELETE(m_pMissionSystem);
SAFE_DELETE(m_pEventSystem);
SAFE_DELETE(m_pAppellation);
SAFE_DELETE(m_pRestraint);
SAFE_DELETE(m_pEffectRepository)
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
SAFE_DELETE(m_pReputationSystem);
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
#if defined( PRE_ADD_SECONDARY_SKILL )
SAFE_DELETE(m_pSecondarySkillRepository);
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
SAFE_DELETE( m_pGesture );
SAFE_DELETE(m_pTimeEventSystem);
SAFE_DELETE(m_pCommonVariable);
#if defined (PRE_ADD_BESTFRIEND)
SAFE_DELETE(m_pBestFriend);
#endif
#if defined( PRE_ADD_STAMPSYSTEM )
SAFE_DELETE( m_pStampSystem );
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
#if defined(_HSHIELD)
#if defined( PRE_ADD_HSHIELD_LOG )
if( m_pSession )
g_Log.Log(LogType::_HACKSHIELD, m_pSession, L"[_AhnHS_CloseClientHandle before - (%d) ] ClientHandle[%x]\r\n", m_pSession->GetSessionID(), m_hHSClient);
#endif
_AhnHS_CloseClientHandle(m_hHSClient);
#if defined( PRE_ADD_HSHIELD_LOG )
if( m_pSession )
g_Log.Log(LogType::_HACKSHIELD, m_pSession, L"[_AhnHS_CloseClientHandle after - (%d) ] ClientHandle[%x]\r\n", m_pSession->GetSessionID(), m_hHSClient);
#endif
m_hHSClient = ANTICPX_INVALID_HANDLE_VALUE;
#endif // _HSHIELD
SAFE_DELETE( m_pUserEventHandler );
}
void CDNUserBase::FinalizeEvent()
{
if (!m_bFinalize)
{
m_bFinalize = true;
m_pUserEventHandler->OnFinalize();
}
}
void CDNUserBase::GuildWarReset()
{
m_wGuildWarScheduleID = 0;
m_nGuildWarRewardFestivalPoint = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
m_nGuildWarRewardGuildPoint = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
m_biGuildWarFestivalPoint = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
}
void CDNUserBase::DelGuildWarFestivalPoint(INT64 biPoint)
{
if (m_biGuildWarFestivalPoint < biPoint)
return;
m_biGuildWarFestivalPoint -= (int)biPoint;
}
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
bool CDNUserBase::LoadReputation( TAGetListNpcFavor* pA )
{
for( UINT i=0 ; i<pA->cCount ; ++i )
{
m_pReputationSystem->SetNpcReputation( pA->ReputationArr[i].iNpcID, IReputationSystem::NpcFavor, pA->ReputationArr[i].iFavorPoint );
m_pReputationSystem->SetNpcReputation( pA->ReputationArr[i].iNpcID, IReputationSystem::NpcMalice, pA->ReputationArr[i].iMalicePoint);
}
return true;
}
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
bool CDNUserBase::LoadUserData(TASelectCharacter *pSelect)
{
m_nVehicleObjectID = m_nSessionID + 1;
m_bIsSetSecondAuthPW = pSelect->bIsSetSecondAuthPW;
m_bIsSetSecondAuthLock = pSelect->bIsSetSecondAuthLock;
#if defined( PRE_ADD_DWC )
if (m_pRestraint->LoadRestraint(&pSelect->RestraintData, pSelect->UserData.Status.cAccountLevel) == false){
#else // #if defined( PRE_ADD_DWC )
if (m_pRestraint->LoadRestraint(&pSelect->RestraintData) == false){
#endif // #if defined( PRE_ADD_DWC )
//<2F><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD>
m_pSession->DetachConnection(L"Connect|UserAccount Blocked");
g_Log.Log(LogType::_NORMAL, m_pSession, L"Connect|[ADBID:%u, CDBID:%I64d, SID:%u] QUERY_SELECTCHARACTER UserAccount Blocked\r\n", pSelect->nAccountDBID, m_biCharacterDBID, m_nSessionID);
return false;
}
m_UserData = pSelect->UserData;
#ifdef PRE_MOD_PVPRANK
//<2F><>ũ <20><><EFBFBD><EFBFBD>!
if (m_UserData.PvP.uiXP >= g_pDataManager->GetPvPExpThreshold())
{
int nRetLevel = g_pDataManager->GetRelativePvPRank(m_UserData.PvP.nExpAbsoluteRank, m_UserData.PvP.fExpRateRank);
if (nRetLevel > 0)
#if defined(PRE_ADD_PVPLEVEL_MISSION)
SetPvPLevel(static_cast<BYTE>(nRetLevel), false);
#else
m_UserData.PvP.cLevel = static_cast<BYTE>(nRetLevel);
#endif
else
g_Log.Log(LogType::_ERROR, m_pSession, L"Calclation Relative PvPRank Error! [%d][%d][%f][%d]\n", m_UserData.PvP.uiXP, m_UserData.PvP.nExpAbsoluteRank, m_UserData.PvP.fExpRateRank, nRetLevel);
}
#endif //#ifdef PRE_MOD_PVPRANK
m_KeySetting = pSelect->KeySetting;
m_PadSetting = pSelect->PadSetting;
if (m_UserData.Status.cJobArray[0] <= 0) m_UserData.Status.cJobArray[0] = m_UserData.Status.cClass;
if ((GetAccountLevel() >= AccountLevel_New) && (GetAccountLevel() <= AccountLevel_QA)) m_bHide = true; // <20><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> hide<64><65>.
SetCharacterName(GetCharacterName());
ChangeExp( 0, DBDNWorldDef::CharacterExpChangeCode::Admin, 0 );
// GUILD
m_GuildSelfView = pSelect->GuildSelfView;
m_pItem->LoadUserData(pSelect);
m_pMissionSystem->LoadUserData();
m_pAppellation->LoadUserData();
m_pTimeEventSystem->LoadUserData();
#if defined( PRE_ADD_STAMPSYSTEM )
m_pStampSystem->LoadUserData();
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
#ifdef PRE_ADD_JOINGUILD_SUPPORT
m_cGuildJoinLevel = pSelect->cGuildJoinLevel; //<2F><><EFBFBD><EFBFBD><E5B0A1> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>)
m_bWasRewardedGuildMaxLevel = pSelect->bWasRewardedGuildMaxLevel; //<2F><><EFBFBD><EFBFBD><E5BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ҵ<DEBE><D2B4><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
#endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
#if defined( PRE_ADD_DWC )
if( pSelect->UserData.Status.cAccountLevel == AccountLevel_DWC )
{
#ifdef PRE_ADD_COMEBACK
m_bComebackUser = false;
#endif
#if defined(PRE_ADD_GAMEQUIT_REWARD)
m_bReConnectUserReward = false;
#endif // #if defined(PRE_ADD_GAMEQUIT_REWARD)
}
#endif // #if defined( PRE_ADD_DWC )
for( int i=0 ; i<DNNotifier::RegisterCount::Total ; ++i )
{
if( m_UserData.Status.NotifierData[i].eType == DNNotifier::Type::MainQuest && m_UserData.Status.NotifierData[i].iIndex == 0 )
{
m_UserData.Status.NotifierData[i].Clear();
}
}
for( UINT i=0 ; i<DNNotifier::RegisterCount::Total ; ++i )
{
m_NotifierRepository.Register( i, m_UserData.Status.NotifierData[i] );
}
if (GetGuildUID().IsSet())
{
CDNGuildBase* pGuild = g_pGuildManager->At(GetGuildUID());
if (!pGuild)
{
if (m_pDBCon && m_pDBCon->GetActive())
{
m_pDBCon->QueryGetGuildInfo(m_pSession, GetGuildUID().nDBID, true);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pDBCon->QueryGetGuildRewardItem( m_cDBThreadID, m_nWorldSetID, GetAccountDBID(), GetGuildUID().nDBID );
}
}
#if defined(_VILLAGESERVER)
else
{
bool bGuildCheck = true;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach (pGuild);
if (FALSE == pGuild->IsEnable())
bGuildCheck = false;
#endif
#if defined(PRE_ADD_BEGINNERGUILD)
if (bGuildCheck)
{
if (GetLevel() >= (int)CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::BeginnerGuild_GraduateLevel))
{
if (pGuild->GetInfo()->cGuildType == BeginnerGuild::Type::Beginner)
{
if (GetDBConnection())
GetDBConnection()->QueryDelGuildMember(GetDBThreadID(), GetAccountDBID(), GetCharacterDBID(), GetAccountDBID(), GetCharacterDBID(), GetGuildUID().nDBID, GetLevel(), GetWorldSetID(), false, true);
}
}
}
else
_DANGER_POINT();
#endif //#if defined(PRE_ADD_BEGINNERGUILD)
#if defined(PRE_ADD_JOINGUILD_SUPPORT)
if (bGuildCheck && m_bWasRewardedGuildMaxLevel == false && m_cGuildJoinLevel > 0)
{
if (GetLevel() >= (int)CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::PlayerLevelLimit))
{
int nMailID = g_pDataManager->GetRewardGuildSupportMailID(m_cGuildJoinLevel);
if (nMailID > 0)
{
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_JOINGUILD_SUPPORT)
}
#endif //#if defined(_VILLAGESERVER)
}
if (m_pDBCon && m_pDBCon->GetActive())
m_pDBCon->QueryGetPeriodQuestDate(m_pSession);
#if defined(PRE_ADD_VIP)
m_nVIPTotalPoint = pSelect->nVIPTotalPoint;
m_tVIPEndDate = pSelect->tVIPEndDate;
m_bVIPAutoPay = pSelect->bAutoPay;
__time64_t Time;
time(&Time);
if (m_tVIPEndDate != -1){
if (m_tVIPEndDate >= Time){
m_bVIP = true;
m_nVIPBonusExp = g_pDataManager->GetVIPExp(GetClassID(), GetLevel());
int nRebirthMax = g_pDataManager->GetCoinCount(GetLevel(), GetWorldSetID());
if (GetRebirthCoin() > nRebirthMax){
m_cVIPRebirthCoin = GetRebirthCoin() - nRebirthMax;
m_UserData.Status.cRebirthCoin = nRebirthMax;
}
}
else{ // vip <20><> <20><><EFBFBD><EFBFBD>
if (m_bVIPAutoPay){ // <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3>ٸ<EFBFBD>
if (g_pCashConnection->GetActive()){
g_pCashConnection->SendBalanceInquiry(m_pSession, false, true);
}
}
}
}
#endif // #if defined(PRE_ADD_VIP)
#if defined(_CH)
m_bIntroducer = pSelect->bIntroducer;
#endif // #if defined(_CH)
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
for( int i=0;i<TotalLevelSkill::Common::MAXSLOTCOUNT;i++ )
{
if( m_nTotalLevelSKillData[i] )
{
if(g_pDataManager && !g_pDataManager->bIsTotalLevelSkillLimitLevel(i, m_nTotalLevelSKillData[i], GetTotalLevelSkillLevel(), GetLevel()))
m_nTotalLevelSKillData[i] = 0;
}
}
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD>
if (m_UserData.Status.tLastFatigueDate < 0) m_UserData.Status.tLastFatigueDate = 0;
if (m_UserData.Status.tLastRebirthCoinDate < 0) m_UserData.Status.tLastRebirthCoinDate = 0;
if (m_UserData.Mission.tDailyMissionDate < 0) m_UserData.Mission.tDailyMissionDate = 0;
if (m_UserData.Mission.tWeeklyMissionDate < 0) m_UserData.Mission.tWeeklyMissionDate = 0;
#if defined( PRE_ADD_MONTHLY_MISSION)
if (m_UserData.Mission.tMonthlyMissionDate < 0) m_UserData.Mission.tMonthlyMissionDate = 0;
#endif // #if defined( PRE_ADD_MONTHLY_MISSION)
if (m_UserData.Status.tLastEventFatigueDate < 0) m_UserData.Status.tLastEventFatigueDate = 0;
if (m_UserData.Status.tLastTimeEventDate < 0) m_UserData.Status.tLastTimeEventDate = 0;
#if defined( PRE_ADD_STAMPSYSTEM )
if (m_UserData.Status.tLastStampDate < 0) m_UserData.Status.tLastStampDate = 0;
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
RegisterSchedule( CDNSchedule::ResetFatigue, m_UserData.Status.tLastFatigueDate );
RegisterSchedule( CDNSchedule::ResetWeeklyFatigue, m_UserData.Status.tLastFatigueDate );
RegisterSchedule( CDNSchedule::ResetRebirthCoin, m_UserData.Status.tLastRebirthCoinDate );
RegisterSchedule( CDNSchedule::ResetDailyMission, m_UserData.Mission.tDailyMissionDate );
RegisterSchedule( CDNSchedule::ResetWeeklyMission, m_UserData.Mission.tWeeklyMissionDate );
#if defined(PRE_ADD_MONTHLY_MISSION)
RegisterSchedule( CDNSchedule::ResetMonthlyMission, m_UserData.Mission.tMonthlyMissionDate );
#endif // #if defined(PRE_ADD_MONTHLY_MISSION)
RegisterSchedule( CDNSchedule::ResetEventFatigue, m_UserData.Status.tLastEventFatigueDate );
RegisterSchedule( CDNSchedule::ResetDailyTimeEvent, m_UserData.Status.tLastTimeEventDate );
#if defined( PRE_ADD_STAMPSYSTEM )
RegisterSchedule( CDNSchedule::ResetWeeklyStamp, m_UserData.Status.tLastStampDate );
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
ResetRepeatQuest();
g_pPeriodQuestSystem->BuildCompletedPeriodQuests(m_pQuest);
return true;
}
#if defined(PRE_ADD_MUTE_USERCHATTING)
bool CDNUserBase::IsMuteChatting()
{
INT64 biBlindTime = 0;
if(!m_pCommonVariable->GetDataValue(CommonVariable::Type::MuteChatting, biBlindTime))
return false;
if(biBlindTime <= 0)
return false;
__time64_t _blindStartTime;
m_pCommonVariable->GetDataModDate(CommonVariable::Type::MuteChatting, _blindStartTime);
CTimeSet tCurTime;
tCurTime.Reset();
CTimeSet tMuteTime(_blindStartTime, true);
tMuteTime.AddSecond(biBlindTime * 60);
if((tMuteTime - tCurTime) > 0)
return true;
//0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ü<><C3BC> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20>ʱ<EFBFBD>ȭ.
m_pCommonVariable->ModData(CommonVariable::Type::MuteChatting, 0);
return false;
}
#endif // #if defined(PRE_ADD_MUTE_USERCHATTING)
bool CDNUserBase::ModCommonVariableData( CommonVariable::Type::eCode Type, INT64 biValue, __time64_t tDate/* = 0*/ )
{
return m_pCommonVariable->ModData(Type, biValue, tDate);
}
bool CDNUserBase::GetCommonVariableDataValue( CommonVariable::Type::eCode Type, INT64& biValue )
{
return m_pCommonVariable->GetDataValue(Type, biValue);
}
bool CDNUserBase::IncCommonVariableData( CommonVariable::Type::eCode Type, __time64_t tDate/* = 0*/ )
{
return m_pCommonVariable->IncData(Type, tDate);
}
void CDNUserBase::UpdateAttendanceEventData(bool bSendResult)
{
INT64 biValue = 0;
__time64_t tLastModifyDate = 0;
m_pCommonVariable->GetDataValue(CommonVariable::Type::AttendanceEvent, biValue);
m_pCommonVariable->GetDataModDate(CommonVariable::Type::AttendanceEvent, tLastModifyDate);
DWORD iDoneDayIndex = LODWORD(biValue);
DWORD iOngoingDay = HIDWORD(biValue);
WORD iDoneDay = LOWORD(iDoneDayIndex); //<2F>Ϸ<EFBFBD><CFB7>ѳ<EFBFBD>¥
WORD iIndex = HIWORD(iDoneDayIndex); //<2F><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ ȸ<><C8B8>
//<2F><20>̺<EFBFBD>Ʈ ȸ<><C8B8> üũ <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٵ<EFBFBD><30><C8B8> <20>̱⶧<CCB1><E2B6A7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><31><C8B8><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD>
if (iIndex == 0)
iIndex = 1;
if( !g_pDataManager->CheckEveryDayEventTime(&iIndex) )
{
iDoneDay = 0;
iOngoingDay = 0;
tLastModifyDate = 0;
}
bool bCheckAttendanceFirst = false;
int nGapDay = GetDateGap(tLastModifyDate);
if( nGapDay == 1 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20>Ϸ簡 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
iOngoingDay++;
if( iOngoingDay > iDoneDay )
{
iDoneDay = (WORD)iOngoingDay;
iDoneDayIndex = MAKELONG(iDoneDay, iIndex);
if( CheckAttendanceEventDone(iOngoingDay) )
{
ModCommonVariableData(CommonVariable::Type::AttendanceEvent, MAKELONG64(iDoneDayIndex, iOngoingDay));
bCheckAttendanceFirst = true;
}
else
ModCommonVariableData(CommonVariable::Type::AttendanceEvent, MAKELONG64(iDoneDayIndex, iOngoingDay));
}
else
{
ModCommonVariableData(CommonVariable::Type::AttendanceEvent, MAKELONG64(iDoneDayIndex, iOngoingDay));
}
}
else if( nGapDay == 0)
{
//<2F>ϴ<EFBFBD> <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 12<31><32> <20>Ѿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( iOngoingDay == 0 )
{
iOngoingDay = 1;
iDoneDay = 1;
iDoneDayIndex = MAKELONG(iDoneDay, iIndex);
}
ModCommonVariableData(CommonVariable::Type::AttendanceEvent, MAKELONG64(iDoneDayIndex, iOngoingDay), tLastModifyDate);
bCheckAttendanceFirst = false;
}
else if( nGapDay > 1 )//ó<><C3B3><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20>Ϸ<EFBFBD> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
if( CheckAttendanceEventDone(1) ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20>޵<EFBFBD><DEB5><EFBFBD> <20><><EFBFBD><EFBFBD>
{
iDoneDay = 1;
iDoneDayIndex = MAKELONG(iDoneDay, iIndex);
ModCommonVariableData(CommonVariable::Type::AttendanceEvent, MAKELONG64(iDoneDayIndex, 1));
bCheckAttendanceFirst = true;
}
}
else
{
if( iDoneDay == 0 && CheckAttendanceEventDone(1) ) // iDoneDay<61><79> 0<≯<EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> CheckAttendanceEventDone()<29>Լ<EFBFBD> ȣ<><C8A3> <20>ʿ<EFBFBD>
{
iDoneDay = 1;
iDoneDayIndex = MAKELONG(iDoneDay, iIndex);
ModCommonVariableData(CommonVariable::Type::AttendanceEvent, MAKELONG64(iDoneDayIndex, 1));
bCheckAttendanceFirst = true;
}
else
{
g_Log.Log(LogType::_ERROR, m_pSession, L"[UpdateAttendanceEventData] GapDay:%d", nGapDay);
}
}
if (bSendResult)
SendAttendanceEventResult( bCheckAttendanceFirst );
}
int CDNUserBase::GetDateGap(__time64_t tLastModifyTime)
{
if( 0 >= tLastModifyTime ) return -1;
// <20><>¥ <20><><EFBFBD><EFBFBD>
tm pCurTime, pLastTime;
time_t Time;
time(&Time);
pCurTime = *localtime(&Time);
pLastTime = *localtime(&tLastModifyTime);
int nYear = 0;
if ((pCurTime.tm_year - pLastTime.tm_year) > 0 )
nYear = 365;
return(pCurTime.tm_yday + nYear - pLastTime.tm_yday);
}
bool CDNUserBase::CheckAttendanceEventDone(int iOngoingDay)
{
TEveryDayEventData* pData = g_pDataManager->GetEveryDayEventRewardMailID(iOngoingDay);
if( pData )
{
if (pData->nMailID > 0)
CDNMailSender::Process( m_pSession, pData->nMailID, DBDNWorldDef::PayMethodCode::Event, 0 );
if (pData->nCashMailID > 0)
CDNMailSender::Process( m_pSession, pData->nCashMailID, DBDNWorldDef::PayMethodCode::Event, 0 );
return true;
}
return false;
}
bool CDNUserBase::SaveUserData()
{
if (GetLastVillageGateNo() < 0) SetLastVillageGateNo(0);
m_pItem->SaveUserData();
return true;
}
void CDNUserBase::DoUpdate(DWORD dwCurTick)
{
#if defined(_HSHIELD)
if (GetAccountLevel() != AccountLevel_Developer)
{
if (m_dwCheckLiveTick + CHECKLIVETICK <= dwCurTick)
{
SendMakeRequest();
m_dwCheckLiveTick = dwCurTick;
}
}
#endif // #if defined(_HSHIELD)
#if defined(_GPK)
if (m_dwCheckGPKTick > 0 && m_dwCheckGPKTick + CHECKGPKTICK <= dwCurTick)
{
SendGPKData();
SendGPKAuthData();
m_dwCheckGPKTick = dwCurTick;
m_dwRecvGPKTick = dwCurTick;
}
#endif // #if defined(_GPK)
if( !m_pDBCon || m_pDBCon->GetDelete() )
{
if( m_pSession )
m_pSession->DetachConnection( L"DB M/W Disconnect!" );
}
#if defined( _GAMESERVER )
// #<23><><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Tcp Connection <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB IP <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> <20>־ Tcp <20><> <20>ٱ<EFBFBD><D9B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if( m_pSession == NULL || m_pSession->GetIp() == NULL )
return;
#endif // #if defined( _GAMESERVER )
CDNSchedule::Process( dwCurTick );
m_pTimeEventSystem->Process( dwCurTick );
if( bIsCheckPing() == true )
{
if( dwCurTick-m_dwCheckTcpPing >= CHECK_TCP_PING_TICK )
{
m_dwCheckTcpPing = dwCurTick;
if( m_pSession )
m_pSession->SendTcpPing( dwCurTick );
}
}
ProcessPeriodQuest(dwCurTick);
m_pItem->DoUpdate(dwCurTick);
#if defined(_KRAZ)
_CheckShutdown();
#endif // #if defined(_KRAZ)
}
bool CDNUserBase::CheckDBConnection()
{
if( m_pDBCon && m_pDBCon->GetActive() )
return true;
return false;
}
void CDNUserBase::CashMessageProcess(int nMainCmd, int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case CASH_BALANCEINQUIRY:
{
const TACashBalanceInquiry *pCash = (TACashBalanceInquiry*)pData;
if (pCash->nResult == ERROR_NONE){
SetCashBalance(pCash->nCashBalance);
SetPetal(pCash->nPetal);
#if defined(_US)
SetNxAPrepaid(pCash->nNotRefundableBalance);
SetNxACredit(GetCashBalance() - GetNxAPrepaid());
#endif // #if defined(_US)
#if defined(PRE_ADD_VIP)
if (pCash->bServer){
int nAutoPayItemSN = g_pDataManager->GetVIPAutoPayItemSN();
if (CheckEnoughCashBalance(g_pDataManager->GetCashCommodityVIPAutomaticPaySalePrice(nAutoPayItemSN))){
if (g_pCashConnection->GetActive()){
g_pCashConnection->SendVIPBuy(m_pSession, nAutoPayItemSN, true);
}
}
else{ // ij<>ú<EFBFBD><C3BA><EFBFBD><EFBFBD>϶<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߼<EFBFBD>
int nMailID = g_pDataManager->GetVIPShortCashMailID();
if (nMailID > 0)
CDNMailSender::Process((CDNUserSession*)this, nMailID, 0, 0);
}
return;
}
#endif // #if defined(PRE_ADD_VIP)
}
else{
g_Log.Log(LogType::_NORMAL, m_pSession, L"[CASH_BALANCEINQUIRY] Result:%d", pCash->nResult);
if (pCash->bOpen)
IsWindowStateNoneSet(WINDOW_CASHSHOP);
}
if (pCash->bOpen)
{
//ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD> <20><> <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD>ش<EFBFBD>~
if (m_bSaleAbortListSended == false && g_pCashConnection->m_cSaleAbortCount > 0)
{
SendSaleAbortList(g_pCashConnection->m_cSaleAbortCount, g_pCashConnection->m_nSaleAbortList);
m_bSaleAbortListSended = true;
}
SendCashShopOpen(pCash->nCashBalance, pCash->nPetal, pCash->nResult, m_wszAccountName);
}
else{
SendCashShopBalanceInquiry(pCash->nResult, pCash->nPetal, pCash->nCashBalance);
}
}
break;
case CASH_BUY:
{
const TACashBuy *pCash = (TACashBuy*)pData;
int nResult = pCash->nResult;
TCashShopInfo Info[PREVIEWCARTLISTMAX] = { 0, };
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
TPaymentItemInfo PaymentList[PREVIEWCARTLISTMAX] = { 0, };
#endif
int nCount = 0;
if (nResult == ERROR_NONE){
int nPrice = 0;
char cPaymentRules = Cash::PaymentRules::None;
cPaymentRules = pCash->cPaymentRules;
#if defined(PRE_ADD_SALE_COUPON)
if( pCash->biSaleCouponSerial > 0)
m_pItem->DeleteCashInventoryBySerial(pCash->biSaleCouponSerial, 1, true );
#endif
for (int i = 0; i < pCash->cProductCount; i++){
if (pCash->BuyList[i].bFail) continue; // <20><><EFBFBD>и<EFBFBD> <20>ϴ<EFBFBD> <20>Ѿ<D1BE><EEB0A3>
nPrice = g_pDataManager->GetCashCommodityPrice(pCash->BuyList[i].nItemSN);
#if defined( PRE_ADD_NEW_MONEY_SEED )
if (pCash->cPaymentRules != Cash::PaymentRules::Petal && pCash->cPaymentRules != Cash::PaymentRules::Seed)
#else
if (pCash->cPaymentRules != Cash::PaymentRules::Petal)
#endif
DelCashByPaymentRules(nPrice, cPaymentRules);
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><20>ֵ<EFBFBD>..
if( !m_pItem->GetCashMoveInven() && !g_pDataManager->GetCashCommodityNoRefund(pCash->BuyList[i].CashItem.nItemID, pCash->BuyList[i].nItemSN) )
{
m_pItem->AddPaymentItem(pCash->ItemList[nCount]);
memcpy(&PaymentList[nCount], &pCash->ItemList[nCount].PaymentItemInfo, sizeof(TPaymentItemInfo) );
++nCount;
}
else
#endif
{
m_pItem->ApplyCashShopItem(pCash->BuyList[i]);
}
}
SetPetal(pCash->nPetalBalance);
#if defined( PRE_ADD_NEW_MONEY_SEED )
SetSeedPoint( pCash->nSeedPoint );
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
nCount = 0;
for (int i = 0; i < pCash->cProductCount; i++){
if (!pCash->BuyList[i].bFail) continue;
Info[nCount].cSlotIndex = pCash->BuyList[i].cCartIndex;
Info[nCount].nItemSN = pCash->BuyList[i].nItemSN;
Info[nCount].nItemID = pCash->BuyList[i].CashItem.nItemID;
nCount++;
}
if (nCount > 0)
nResult = ERROR_CASHSHOP_CALLGM; // <20><><EFBFBD>а<EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
switch(nResult)
{
case ERROR_GENERIC_INVALIDREQUEST:
case 101147: // 101147 = <20><><EFBFBD><EFBFBD> <20><>ǰ<EFBFBD>Դϴ<D4B4>. <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD><CAB0>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.
case 101190: // 101190 = <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD><CAB0>մϴ<D5B4>.
case ERROR_NONE:
case ERROR_CASHSHOP_PROHIBITSALE:
case ERROR_CASHSHOP_COUNTOVER:
{
int nNxAPrepaid = 0, nNxACredit = 0;
#if defined(_US)
nNxAPrepaid = GetNxAPrepaid();
nNxACredit = GetNxACredit();
#endif // #if defined(_US)
INT64 nSeedPoint = 0;
#if defined( PRE_ADD_NEW_MONEY_SEED )
nSeedPoint = GetSeedPoint();
#endif
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
SendCashShopBuy((UINT)GetCashBalance(), GetPetal(), nResult, pCash->cCartType, nCount, Info, PaymentList, nNxAPrepaid, nNxACredit, nSeedPoint);
#else
SendCashShopBuy((UINT)GetCashBalance(), GetPetal(), nResult, pCash->cCartType, nCount, Info, NULL, nNxAPrepaid, nNxACredit, nSeedPoint);
#endif
}
break;
default:
SendCompleteDetachMsg( nResult, L"ERROR_CASHSHOP_CALLGM" );
g_Log.Log(LogType::_ERROR, m_pSession, L"[CASH_BUY] Fail!!!!(Ret:%d)\n", nResult);
break;
}
}
break;
case CASH_PACKAGEBUY:
{
const TACashPackageBuy *pCash = (TACashPackageBuy*)pData;
if (pCash->nResult == ERROR_NONE)
{ // <20><>Ű<EFBFBD><C5B0> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̹ۿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nPrice = g_pDataManager->GetCashCommodityPrice(pCash->nPackageSN);
#if defined(PRE_ADD_SALE_COUPON)
if( pCash->biSaleCouponSerial > 0)
m_pItem->DeleteCashInventoryBySerial(pCash->biSaleCouponSerial, 1, true );
#endif
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND) // ij<><C4B3><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> <20>ٷΰ<D9B7><CEB0><20>ƴϰ<C6B4> ȯ<>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20>߰<EFBFBD>.
if( !m_pItem->GetCashMoveInven() && !g_pDataManager->GetCashCommodityNoRefund(0, pCash->nPackageSN))
{
m_pItem->AddPaymentPackageItem(pCash->PaymentItem);
}
else
#endif
{
for (int i = 0; i < pCash->cPackageCount; i++)
{
m_pItem->ApplyCashShopItem(pCash->BuyList[i]);
}
}
char cPaymentRules = Cash::PaymentRules::None;
cPaymentRules = pCash->cPaymentRules;
#if defined( PRE_ADD_NEW_MONEY_SEED )
if (pCash->cPaymentRules != Cash::PaymentRules::Petal && pCash->cPaymentRules != Cash::PaymentRules::Seed)
#else
if (pCash->cPaymentRules != Cash::PaymentRules::Petal)
#endif
DelCashByPaymentRules(nPrice, cPaymentRules);
SetPetal(pCash->nPetalBalance);
#if defined( PRE_ADD_NEW_MONEY_SEED )
SetSeedPoint( pCash->nSeedPoint );
#endif
}
int nNxAPrepaid = 0, nNxACredit = 0;
#if defined(_US)
nNxAPrepaid = GetNxAPrepaid();
nNxACredit = GetNxACredit();
#endif // #if defined(_US)
INT64 nSeedPoint = 0;
#if defined( PRE_ADD_NEW_MONEY_SEED )
nSeedPoint = GetSeedPoint();
#endif
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
SendCashShopPackageBuy(pCash->nPackageSN, (UINT)GetCashBalance(), GetPetal(), pCash->nResult, &pCash->PaymentItem.PaymentPackageItemInfo, nNxAPrepaid, nNxACredit, nSeedPoint);
#else
SendCashShopPackageBuy(pCash->nPackageSN, (UINT)GetCashBalance(), GetPetal(), pCash->nResult, NULL, nNxAPrepaid, nNxACredit, nSeedPoint);
#endif
}
break;
case CASH_GIFT:
{
const TACashGift *pCash = (TACashGift*)pData;
int nResult = pCash->nResult;
TCashShopInfo Info[PREVIEWCARTLISTMAX] = { 0, };
int nCount = 0;
if (nResult == ERROR_NONE){
int nPrice = 0;
for (int i = 0; i < pCash->cGiftCount; i++){
if (pCash->GiftList[i].bFail){
Info[nCount].cSlotIndex = pCash->GiftList[i].cCartIndex;
Info[nCount].nItemSN = pCash->GiftList[i].nItemSN;
Info[nCount].nItemID = pCash->GiftList[i].nItemID;
nCount++;
continue; // <20><><EFBFBD>и<EFBFBD> <20>ϴ<EFBFBD> <20>Ѿ<D1BE><EEB0A3>
}
nPrice = g_pDataManager->GetCashCommodityPrice(pCash->GiftList[i].nItemSN);
DelCashBalance(nPrice);
#if defined(_US)
DelNxAPrepaid(nPrice);
#endif // #if defined(_US)
}
SetPetal(pCash->nPetalBalance);
#if defined( PRE_ADD_NEW_MONEY_SEED )
SetSeedPoint( pCash->nSeedPoint );
#endif
if (nCount > 0)
nResult = ERROR_NEXONBILLING_99; // <20><><EFBFBD>а<EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pCash->nReceiverAccountDBID != m_nAccountDBID){
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSessionByAccountDBID(pCash->nReceiverAccountDBID); // <20>޴<EFBFBD><DEB4><EFBFBD> ã<><C3A3>
if (pUserSession && (pUserSession->GetCharacterDBID() == pCash->biReceiverCharacterDBID)){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><> ó<><C3B3>
pUserSession->SendCashshopNotifyGift(true, pCash->nReceiverGiftCount); // <20><><EFBFBD><EFBFBD> <20>°<EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> master<65><72>
g_pMasterConnection->SendNotifyGift(pCash->nReceiverAccountDBID, pCash->biReceiverCharacterDBID, true, pCash->nReceiverGiftCount);
}
#elif defined(_GAMESERVER)
// g_pMasterConnection->SendNotifyGift(pCash->nReceiverAccountDBID, pCash->biReceiverCharacterDBID, true, pCash->nReceiverGiftCount);
#endif
}
}
int nNxAPrepaid = 0, nNxACredit = 0;
#if defined(_US)
nNxAPrepaid = GetNxAPrepaid();
nNxACredit = GetNxACredit();
#endif // #if defined(_US)
INT64 nSeedPoint = 0;
#if defined( PRE_ADD_NEW_MONEY_SEED )
nSeedPoint = GetSeedPoint();
#endif
#if defined(PRE_ADD_CADGE_CASH)
if( nResult == ERROR_NONE && pCash->nMailDBID > 0 )
GetEventSystem()->OnEvent( EventSystem::OnGiftToCadger );
#endif
SendCashShopGift((UINT)GetCashBalance(), GetPetal(), nResult, pCash->cCartType, nCount, Info, nNxAPrepaid, nNxACredit, nSeedPoint);
}
break;
case CASH_PACKAGEGIFT:
{
const TACashPackageGift *pCash = (TACashPackageGift*)pData;
if (pCash->nResult == ERROR_NONE){ // <20><>Ű<EFBFBD><C5B0> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̹ۿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nPrice = g_pDataManager->GetCashCommodityPrice(pCash->nPackageSN);
DelCashBalance(nPrice);
#if defined(_US)
DelNxAPrepaid(nPrice);
#endif // #if defined(_US)
SetPetal(pCash->nPetalBalance);
#if defined( PRE_ADD_NEW_MONEY_SEED )
SetSeedPoint( pCash->nSeedPoint );
#endif
}
if (pCash->nReceiverAccountDBID != m_nAccountDBID){
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSessionByAccountDBID(pCash->nReceiverAccountDBID); // <20>޴<EFBFBD><DEB4><EFBFBD> ã<><C3A3>
if (pUserSession && (pUserSession->GetCharacterDBID() == pCash->biReceiverCharacterDBID)){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><> ó<><C3B3>
pUserSession->SendCashshopNotifyGift(true, pCash->nReceiverGiftCount); // <20><><EFBFBD><EFBFBD> <20>°<EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> master<65><72>
g_pMasterConnection->SendNotifyGift(pCash->nReceiverAccountDBID, pCash->biReceiverCharacterDBID, true, pCash->nReceiverGiftCount);
}
#elif defined(_GAMESERVER)
// g_pMasterConnection->SendNotifyGift(pCash->nReceiverAccountDBID, pCash->biReceiverCharacterDBID, true, pCash->nReceiverGiftCount);
#endif
}
int nNxAPrepaid = 0, nNxACredit = 0;
#if defined(_US)
nNxAPrepaid = GetNxAPrepaid();
nNxACredit = GetNxACredit();
#endif // #if defined(_US)
INT64 nSeedPoint = 0;
#if defined( PRE_ADD_NEW_MONEY_SEED )
nSeedPoint = GetSeedPoint();
#endif
#if defined(PRE_ADD_CADGE_CASH)
if( pCash->nResult == ERROR_NONE && pCash->nMailDBID > 0 )
GetEventSystem()->OnEvent( EventSystem::OnGiftToCadger );
#endif
SendCashShopPackageGift(pCash->nPackageSN, (UINT)GetCashBalance(), GetPetal(), pCash->nResult, nNxAPrepaid, nNxACredit, nSeedPoint);
}
break;
case CASH_COUPON:
{
const TACashCoupon *pCash = (TACashCoupon*)pData;
SendCoupon(pCash->nResult);
}
break;
#if defined(PRE_ADD_VIP)
case CASH_VIPBUY:
{
const TACashVIPBuy *pCash = (TACashVIPBuy*)pData;
if (pCash->nResult == ERROR_NONE){
SetPetal(pCash->nPetal);
#if defined( PRE_ADD_NEW_MONEY_SEED )
SetSeedPoint( pCash->nSeedPoint );
#endif
// SetCashBalance(pCash->nCash);
int nPrice = g_pDataManager->GetCashCommodityPrice(pCash->nItemSN);
DelCashBalance(nPrice);
if (!m_bVIP){ // <20>̹<EFBFBD> vip<69><70> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD>
m_bVIP = true; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
SetDefaultVIPFatigue(); // vip<69>Ƿε<C7B7> <20><><EFBFBD><EFBFBD>
}
m_bVIP = true;
m_nVIPTotalPoint = pCash->nVIPTotalPoint;
m_tVIPEndDate = pCash->tVIPEndDate;
m_bVIPAutoPay = pCash->bAutoPay;
_MakeGiftVIPMonthItemByItemSN(pCash->nItemSN);
}
INT64 nSeedPoint = 0;
#if defined( PRE_ADD_NEW_MONEY_SEED )
nSeedPoint = GetSeedPoint();
#endif
if (pCash->bServer)
SendVIPInfo(m_nVIPTotalPoint, m_tVIPEndDate, m_bVIPAutoPay, m_bVIP);
else
SendVIPBuy((UINT)GetCashBalance(), pCash->nPetal, pCash->nResult, pCash->nVIPTotalPoint, pCash->tVIPEndDate, m_bVIPAutoPay, nSeedPoint);
}
break;
case CASH_VIPGIFT:
{
const TACashVIPGift *pCash = (TACashVIPGift*)pData;
if (pCash->nResult == ERROR_NONE){
SetPetal(pCash->nPetal);
#if defined( PRE_ADD_NEW_MONEY_SEED )
SetSeedPoint( pCash->nSeedPoint );
#endif
//SetCashBalance(pCash->nCash);
int nPrice = g_pDataManager->GetCashCommodityPrice(pCash->nItemSN);
DelCashBalance(nPrice);
}
if (pCash->nReceiverAccountDBID != m_nAccountDBID){
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSessionByAccountDBID(pCash->nReceiverAccountDBID); // <20>޴<EFBFBD><DEB4><EFBFBD> ã<><C3A3>
if (pUserSession && (pUserSession->GetCharacterDBID() == pCash->biReceiverCharacterDBID)){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><> ó<><C3B3>
pUserSession->SendCashshopNotifyGift(true, pCash->nReceiverGiftCount); // <20><><EFBFBD><EFBFBD> <20>°<EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> master<65><72>
g_pMasterConnection->SendNotifyGift(pCash->nReceiverAccountDBID, pCash->biReceiverCharacterDBID, true, pCash->nReceiverGiftCount);
}
#elif defined(_GAMESERVER)
// g_pMasterConnection->SendNotifyGift(pCash->nReceiverAccountDBID, pCash->biReceiverCharacterDBID, true, pCash->nReceiverGiftCount);
#endif
}
INT64 nSeedPoint = 0;
#if defined( PRE_ADD_NEW_MONEY_SEED )
nSeedPoint = GetSeedPoint();
#endif
SendVIPGift((UINT)GetCashBalance(), pCash->nPetal, pCash->nResult, nSeedPoint);
}
break;
#endif // #if defined(PRE_ADD_VIP)
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
case CASH_MOVE_CASHINVEN:
{
const TACashMoveCashInven* pCash = (TACashMoveCashInven*)pData;
if( pCash->nResult == ERROR_NONE )
{
TPaymentItemInfoEx* PaymentItemInfo = m_pItem->GetPaymentItem(pCash->biPurchaseOrderDetailID);
if( PaymentItemInfo ) //<2F>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD>.
{
m_pItem->ApplyCashShopItem(pCash->CashItem);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
m_pItem->DelPaymentItem(pCash->biPurchaseOrderDetailID);
SetPetal(pCash->nTotalPetal);
INT64 nSeedPoint = 0;
#if defined( PRE_ADD_NEW_MONEY_SEED )
SetSeedPoint(pCash->nTotalSeed);
nSeedPoint = GetSeedPoint();
#endif
SendCashShopMoveCashinven(pCash->biPurchaseOrderDetailID, ERROR_NONE, pCash->nTotalPetal, nSeedPoint);
break;
}
}
SendCashShopMoveCashinven(0, pCash->nResult, 0, 0);
}
break;
case CASH_PACKAGE_MOVE_CASHINVEN:
{
const TACashPackageMoveCashInven* pCash = (TACashPackageMoveCashInven*)pData;
if( pCash->nResult == ERROR_NONE )
{
TPaymentPackageItemInfoEx* PaymentPackageItemInfo = m_pItem->GetPaymentPackageItem(pCash->biPurchaseOrderDetailID);
if( PaymentPackageItemInfo ) //<2F>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD>.
{
for (int i = 0; i < PACKAGEITEMMAX; i++)
{
if( pCash->CashItemList[i].CashItem.nItemID == 0)
break;
m_pItem->ApplyCashShopItem(pCash->CashItemList[i]);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
m_pItem->DelPaymentPackageItem(pCash->biPurchaseOrderDetailID);
SetPetal(pCash->nTotalPetal);
INT64 nSeedPoint = 0;
#if defined( PRE_ADD_NEW_MONEY_SEED )
SetSeedPoint(pCash->nTotalSeed);
nSeedPoint = GetSeedPoint();
#endif
SendCashShopMoveCashinven(pCash->biPurchaseOrderDetailID, ERROR_NONE, pCash->nTotalPetal, nSeedPoint);
break;
}
}
SendCashShopMoveCashinven(0, pCash->nResult, 0, 0);
}
break;
case CASH_REFUNDCASH:
{
const TACashRefund* pCash = (TACashRefund*)pData;
if (pCash->nResult == ERROR_NONE)
{
if( pCash->cItemType == 1) // <20>Ϲ<EFBFBD>
{
TPaymentItemInfoEx* PaymentItemInfo = m_pItem->GetPaymentItem(pCash->biPurchaseOrderDetailID);
if( PaymentItemInfo ) //<2F>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD>.
{
// ȯ<><C8AF> ij<><C4B3> <20><><EFBFBD><EFBFBD>..
AddCashBalance(PaymentItemInfo->nPrice);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
m_pItem->DelPaymentItem(pCash->biPurchaseOrderDetailID);
SendCashShopCashRefund(pCash->biPurchaseOrderDetailID, ERROR_NONE, (int)GetCashBalance());
break;
}
}
else if( pCash->cItemType == 2) // <20><>Ű<EFBFBD><C5B0>
{
TPaymentPackageItemInfoEx* PaymentPackageItemInfo = m_pItem->GetPaymentPackageItem(pCash->biPurchaseOrderDetailID);
if( PaymentPackageItemInfo ) //<2F>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD>.
{
// ȯ<><C8AF> ij<><C4B3> <20><><EFBFBD><EFBFBD>..
AddCashBalance(PaymentPackageItemInfo->nPrice);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
m_pItem->DelPaymentPackageItem(pCash->biPurchaseOrderDetailID);
SendCashShopCashRefund(pCash->biPurchaseOrderDetailID, ERROR_NONE, (int)GetCashBalance());
break;
}
}
}
SendCashShopCashRefund(pCash->biPurchaseOrderDetailID, pCash->nResult, (int)GetCashBalance() );
}
break;
#endif
}
}
void CDNUserBase::DBMessageProcess(int nMainCmd, int nSubCmd, char *pData, int nLen)
{
DelDataBaseMessageSequence(nMainCmd, nSubCmd);
switch(nMainCmd)
{
case MAINCMD_AUTH: OnDBRecvAuth(nSubCmd, pData); break;
case MAINCMD_STATUS: OnDBRecvCharInfo(nSubCmd, pData); break;
case MAINCMD_ETC: OnDBRecvEtc(nSubCmd, pData); break;
case MAINCMD_QUEST: OnDBRecvQuest(nSubCmd, pData); break;
case MAINCMD_MISSION: OnDBRecvMission(nSubCmd, pData); break;
case MAINCMD_SKILL: OnDBRecvSkill(nSubCmd, pData); break;
case MAINCMD_FRIEND: OnDBRecvFriend(nSubCmd, pData); break;
case MAINCMD_ISOLATE: OnDBRecvIsolate(nSubCmd, pData); break;
case MAINCMD_PVP: OnDBRecvPvP(nSubCmd, pData); break;
case MAINCMD_DARKLAIR: OnDBRecvDarkLair(nSubCmd, pData); break;
case MAINCMD_GUILD: OnDBRecvGuild(nSubCmd, pData); break;
case MAINCMD_MAIL: OnDBRecvMail(nSubCmd, pData); break;
case MAINCMD_MARKET: OnDBRecvMarket(nSubCmd, pData); break;
case MAINCMD_ITEM: OnDBRecvItem(nSubCmd, pData); break;
case MAINCMD_CASH: OnDBRecvCash(nSubCmd, pData); break;
case MAINCMD_MSGADJUST: OnDBRecvMsgadjustment(nSubCmd, pData); break;
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
case MAINCMD_REPUTATION: OnDBRecvReputation(nSubCmd, pData); break;
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
case MAINCMD_MASTERSYSTEM: OnDBRecvMasterSystem( nSubCmd, pData ); break;
#if defined( PRE_ADD_SECONDARY_SKILL )
case MAINCMD_SECONDARYSKILL: OnDBRecvSecondarySkill( nSubCmd, pData ); break;
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
case MAINCMD_FARM: OnDBRecvFarm(nSubCmd, pData); break;
case MAINCMD_GUILDRECRUIT: OnDBRecvGuildRecruit( nSubCmd, pData ); break;
#if defined (PRE_ADD_DONATION)
case MAINCMD_DONATION: OnDBRecvDonation(nSubCmd, pData); break;
#endif // #if defined (PRE_ADD_DONATION)
#if defined( PRE_PARTY_DB )
case MAINCMD_PARTY: OnDBRecvParty( nSubCmd, pData ); break;
#endif // #if defined( PRE_PARTY_DB )
#if defined (PRE_ADD_BESTFRIEND)
case MAINCMD_BESTFRIEND: OnDBRecvBestFriend(nSubCmd, pData); break;
#endif // #if defined (PRE_ADD_BESTFRIEND)
#if defined (PRE_PRIVATECHAT_CHANNEL)
case MAINCMD_PRIVATECHATCHANNEL: OnDBRecvPrivateChatChannel(nSubCmd, pData); break;
#endif // #if defined (PRE_PRIVATECHATCHANNEL)
#if defined( PRE_ADD_STAMPSYSTEM )
case MAINCMD_STAMPSYSTEM: OnDBRecvStampSystem(nSubCmd, pData); break;
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
#if defined( PRE_ALTEIAWORLD_EXPLORE )
case MAINCMD_ALTEIAWORLD: OnDBRecvAlteiaWorld(nSubCmd, pData); break;
#endif
#if defined(PRE_ADD_DWC)
case MAINCMD_DWC: OnDBRecvDWC(nSubCmd, pData); break;
#endif
}
}
void CDNUserBase::OnDBRecvAuth(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
case QUERY_BEGINAUTH:
{
// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
break;
case QUERY_STOREAUTH: // VI -> CL(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) / VI -> CL(ij<><C4B3><EFBFBD><EFBFBD> <20><EFBFBD><E7BCB1>)
{
const TAStoreAuth *pA = (TAStoreAuth*)pData;
// <20>α<EFBFBD> <20><><EFBFBD><EFBFBD>
g_Log.Log((ERROR_NONE != pA->nRetCode)?(LogType::_ERROR):(LogType::_NORMAL), m_pSession, L"[Auth] StoreAuth(ACK) - Result:%d, nAccountDBID:%d(%s/%s), CertifyingKey:%I64d\r\n", pA->nRetCode, GetAccountDBID(), GetAccountName(), GetCharacterName(), GetCertifyingKey());
if (ERROR_NONE != pA->nRetCode) {
if( m_bCertified ) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> Ǯ<><C7AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
m_bCertified = false;
m_pSession->DetachConnection(L"QUERY_STOREAUTH Fail");
break;
}
#if defined(_VILLAGESERVER)
switch(m_pSession->m_eUserState) {
case STATE_READYTOVILLAGE: m_pSession->UpdateMoveToVillageUserData(); break;
case STATE_READYTOGAME: m_pSession->UpdateMoveToGameUserData(); break;
case STATE_READYTOLOGIN: m_pSession->ReconnectLogin(ERROR_NONE); break;
default:
break;
}
#elif defined(_GAMESERVER)
// GA->VI, GA->LO <20><><EFBFBD><EFBFBD> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD>
m_pSession->DecreaseFatigue();
switch(m_pSession->GetState())
{
case SESSION_STATE_READY_TO_VILLAGE:
m_pSession->ChangeServerUserData();
break;
case SESSION_STATE_READY_TO_LOGIN:
{
m_pSession->SetSessionState(SESSION_STATE_RECONNECTLOGIN);
SendReconnectLogin(ERROR_NONE, GetAccountDBID(), GetCertifyingKey());
}
break;
default: // <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4> ?
break;
}
#endif
m_bCertified = false;
}
break;
case QUERY_CHECKAUTH: // VI <-> DB(<28><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD>) / VI <-> DB(ij<><C4B3><EFBFBD><EFBFBD> <20><EFBFBD><E7BCB1>) / VI <-> DB(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
{
const TACheckAuth *pA = (TACheckAuth*)pData;
// <20>α<EFBFBD> <20><><EFBFBD><EFBFBD>
g_Log.Log((ERROR_NONE != pA->nRetCode)?(LogType::_ERROR):(LogType::_NORMAL), m_pSession, L"[Auth] CheckAuth(ACK) - Result:%d, nAccountDBID:%d, CertifyingKey:%I64d, CerServerID:%d\r\n", pA->nRetCode, GetAccountDBID(), GetCertifyingKey(), g_pAuthManager->GetServerID());
if (ERROR_NONE != pA->nRetCode) {
#if defined(_GAMESERVER)
m_pSession->SetSessionState(SESSION_STATE_GAME_PLAY);
#endif
if( m_bCertified ) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> Ǯ<><C7AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
m_bCertified = false;
m_pSession->DetachConnection(L"CheckAuth Fail");
break;
}
m_bCertified = true;
m_cAge = pA->nAge;
m_cDailyCreateCount = pA->nDailyCreateCount;
m_nPrmInt1 = pA->nPrmInt1;
m_cLastServerType = pA->cLastServerType;
#if defined(_VILLAGESERVER)
if (g_pMasterConnection && g_pMasterConnection->GetActive())
g_pMasterConnection->SendCheckUser(m_nSessionID);
else
m_pSession->DetachConnection(L"MasterCon Not Found");
#endif
#if defined(_KR) || defined(_US)
m_nNexonSN = m_nPrmInt1;
#endif // _KR
#if defined(_ID)
m_dwKreonCN = m_nPrmInt1;
#endif // _ID
}
break;
case QUERY_RESETAUTH:
{
// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
break;
}
}
void CDNUserBase::OnDBRecvCharInfo(int nSubCmd, char *pData)
{
switch( nSubCmd )
{
case QUERY_GETLISTEFFECTITEM:
{
const TAEffectItem* pPacket = reinterpret_cast<TAEffectItem*>(pData);
if( !GetEffectRepository() || !GetEffectRepository()->Add( pPacket->ItemInfo.biItemSerial, pPacket->ItemInfo.iItemID, pPacket->ItemInfo.ExpireDate ) )
{
g_Log.Log(LogType::_ERROR, m_pSession, L"QUERY_GETLISTEFFECTITEM ItemID:%d", pPacket->ItemInfo.iItemID );
#if defined( _WORK )
// _WORK <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#else
m_pSession->DetachConnection(L"QUERY_GETLISTEFFECTITEM");
#endif // #if defined( _WORK )
}
break;
}
case QUERY_GETLIST_ETCPOINT:
{
const TAGetListEtcPoint *pPacket = reinterpret_cast<TAGetListEtcPoint*>(pData);
if (ERROR_NONE != pPacket->nRetCode) return;
SetEtcPointList( pPacket );
}
break;
case QUERY_ADD_ETCPOINT:
{
const TAAddEtcPoint* pPacket = reinterpret_cast<TAAddEtcPoint*>(pData);
if( pPacket->nRetCode != ERROR_NONE ) return;
SetEtcPointEach(pPacket->cType, pPacket->biLeftPoint);
}
break;
case QUERY_USE_ETCPOINT:
{
const TAUseEtcPoint* pPacket = reinterpret_cast<TAUseEtcPoint*>(pData);
if( pPacket->nRetCode != ERROR_NONE ) return;
SetEtcPointEach(pPacket->cType, pPacket->biLeftPoint);
}
break;
#ifdef _VILLAGESERVER
#ifdef PRE_ADD_CHANGEJOB_CASHITEM
case QUERY_CHANGEJOBCODE:
{
const TAChangeJobCode* pPacket = reinterpret_cast<TAChangeJobCode*>(pData);
int nChangeFirstJob = m_pSession->GetItem()->GetChangeFirstJobID();
int nChangeSecondJob = m_pSession->GetItem()->GetChangeSecondJobID();
if( pPacket->nRetCode == ERROR_NONE )
{
m_pSession->GetSkill()->OnResponseChangeJobCode( pPacket->wTotalSkillPoint );
m_pSession->GetItem()->OnResponseChangeJobCode( true );
CDNGuildBase* pGuild = g_pGuildManager->At(m_pSession->GetGuildUID());
if (pGuild)
{
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) break;
#endif
g_pGuildManager->MaModifyMembJob(pGuild, m_pSession->GetCharacterDBID(), m_pSession->GetStatusData()->cJob);
}
if (g_pMasterConnection)
g_pMasterConnection->SendChangeGuildMemberInfo(m_pSession->GetGuildUID(), m_pSession->GetAccountDBID(), m_pSession->GetCharacterDBID(), 0, 0, GUILDMEMBUPDATE_TYPE_JOBCODE, nChangeFirstJob, nChangeSecondJob, 0, 0);
}
else
{
m_pSession->GetItem()->OnResponseChangeJobCode( false );
}
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
SendChangeJobCashItemRes( pPacket->nRetCode, pPacket->wTotalSkillPoint, nChangeFirstJob, nChangeSecondJob );
}
break;
#endif // #ifdef PRE_ADD_CHANGEJOB_CASHITEM
#endif // #ifdef _VILLAGESERVER
case QUERY_GETLIST_VARIABLERESET:
{
const TAGetListVariableReset* pA = reinterpret_cast<TAGetListVariableReset*>(pData);
bool bInitialize = false;
if( pA->nRetCode == ERROR_NONE )
{
bInitialize = m_pCommonVariable->InitializeData( pA );
}
if( bInitialize == false )
{
g_Log.Log(LogType::_ERROR, m_pSession, L"QUERY_GETLIST_VARIABLERESET AccountID:%d Ret:%d\r\n", pA->nAccountDBID, pA->nRetCode );
#if defined( _WORK )
// _WORK <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#else
m_pSession->DetachConnection(L"QUERY_GETLIST_VARIABLERESET");
#endif // #if defined( _WORK )
}
break;
}
case QUERY_OWNCHRACTERLEVEL:
{
const TAOwnChracterLevel * pPacket = (TAOwnChracterLevel*)pData;
for (int i = 0; i < pPacket->cCount; i++)
{
m_OwnCharacterLevelList[i] = pPacket->Level[i];
}
}
break;
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
case QUERY_GET_TOTALSKILLLEVEL:
{
const TAGetTotalLevelSkill * pPacket = (TAGetTotalLevelSkill*)pData;
m_nTotalLevelSKillLevel = pPacket->nTotalSkillLevel;
for(int i=0;i<TotalLevelSkill::Common::MAXSLOTCOUNT;i++)
{
if(pPacket->TotalSkill[i].nSkillID > 0)
{
m_nTotalLevelSKillData[i] = pPacket->TotalSkill[i].nSkillID;
}
}
}
break;
#endif
#ifdef PRE_ADD_PRESET_SKILLTREE
case QUERY_GET_SKILLPRESET_LIST:
{
TAGetSKillPreSetList * pPacket = (TAGetSKillPreSetList*)pData;
if (m_pSession)
{
if (pPacket->nRetCode == ERROR_NONE)
m_pSession->SendSkillPresetList(pPacket->SKillIndex, pPacket->SKills, pPacket->nRetCode);
else
m_pSession->SendSkillPresetList(NULL, NULL, pPacket->nRetCode);
}
}
break;
case QUERY_ADD_SKILLPRESET:
{
TAAddSkillPreSet * pPacket = (TAAddSkillPreSet*)pData;
if (m_pSession)
m_pSession->SendSkillPresetAddResult(pPacket->nRetCode);
}
break;
case QUERY_DEL_SKILLPRESET:
{
TADelSkillPreSet * pPacket = (TADelSkillPreSet*)pData;
if (m_pSession)
m_pSession->SendSkillPresetDelResult(pPacket->nRetCode);
}
break;
#endif //#ifdef PRE_ADD_PRESET_SKILLTREE
}
}
void CDNUserBase::OnDBRecvEtc(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
case QUERY_DBRESULTERROR:
{
const TADBResultError *pResult = (TADBResultError*)pData;
#if defined( PRE_ADD_SECONDARY_SKILL )
if( pResult->cMainCmd == MAINCMD_SECONDARYSKILL )
_ASSERT(0);
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
g_Log.Log(LogType::_ERROR, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"QUERY_DBRESULTERROR [M:%d S:%d] Ret:%d", pResult->cMainCmd, pResult->cSubCmd, pResult->nRetCode);
SendCompleteDetachMsg(ERROR_GENERIC_INVALIDREQUEST, L"QUERY_DBRESULTERROR" ); // <20>߸<EFBFBD><DFB8><EFBFBD> <20><>û(?)
}
break;
case QUERY_GETGAMEOPTION:
{
const TAGetGameOption * pPacket = (TAGetGameOption*)pData;
if (pPacket->nRetCode == ERROR_NONE)
memcpy_s(&m_GameOption, sizeof(TGameOptions), &pPacket->Option, sizeof(TGameOptions));
}
break;
case QUERY_RESTRAINT:
{
const TARestraint * pPacket = (TARestraint*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
TRestraintData Restraint;
memset(&Restraint, 0, sizeof(TRestraintData));
for (int i = 0;( i < RESTRAINTMAX ) && ( i < pPacket->cCount ); i++)
memcpy(&Restraint.Restraint[i], &pPacket->restraint[i], sizeof(TRestraint));
#if defined( PRE_ADD_DWC )
if (m_pRestraint->LoadRestraint(&Restraint, m_UserData.Status.cAccountLevel) == false)
#else // #if defined( PRE_ADD_DWC )
if (m_pRestraint->LoadRestraint(&Restraint) == false)
#endif // #if defined( PRE_ADD_DWC )
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD>
m_pSession->DetachConnection(L"QUERY_RESTRAINT UserBlocked");
break;
}
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>ij <20>ؾ<EFBFBD><D8BE>ұ<EFBFBD>........©<><C2A9><EFBFBD><EFBFBD> <20>ϰ<EFBFBD><CFB0><EFBFBD>?
m_pSession->DetachConnection(L"QUERY_RESTRAINT failed");
}
}
break;
case QUERY_VALIDATE_SECONDAUTH:
{
const TAValidateSecondAuth* pPacket = reinterpret_cast<TAValidateSecondAuth*>(pData);
SendSecondAuthValidate(pPacket->nRetCode, pPacket->nAuthCheckType, pPacket->cFailCount);
break;
}
case QUERY_GET_PROFILE:
{
const TAGetProfile* pPacket = (TAGetProfile*)pData;
if( pPacket->nRetCode == ERROR_NONE )
{
memcpy_s( &m_Profile, sizeof(TProfile), &pPacket->sProfile, sizeof(TProfile) );
}
}
break;
case QUERY_SET_PROFILE:
{
const TASetProfile* pPacket = (TASetProfile*)pData;
if( pPacket->nRetCode == ERROR_NONE )
{
memcpy_s( &m_Profile, sizeof(TProfile), &pPacket->sProfile, sizeof(TProfile) );
}
}
break;
case QUERY_GET_ABUSEMONITOR:
{
const TAGetAbuseMonitor* pPacket = reinterpret_cast<TAGetAbuseMonitor*>(pData);
if( pPacket->nRetCode == ERROR_NONE )
{
m_iHackAbuseDBValue = pPacket->iAbuseCount;
m_iHackAbuseDBCallCount = pPacket->iCallCount;
m_iHackPlayRestraintValue = pPacket->iPlayRestraintValue;
m_iHackResetRestraintValue = pPacket->iDBResetRestraintValue;
}
break;
}
case QUERY_GET_WHOLE_ABUSEMONITOR:
{
#if defined(_GAMESERVER) && defined(PRE_ADD_ABUSE_ACCOUNT_RESTRAINT)
const TAGetWholeAbuseMonitor * pPacket = (TAGetWholeAbuseMonitor*)pData;
int nHackAbuseCharacterCnt = 0;
if (pPacket->nRetCode == ERROR_NONE)
{
for (int i = 0; i < pPacket->cCount; i++)
{
if (pPacket->Abuse[i].iAbuseCount > pPacket->Abuse[i].iPlayRestraintValue)
{
if (pPacket->Abuse[i].biCharacterDBID != GetCharacterDBID())
m_nHackAbuseCharacterCntWithoutMe++;
nHackAbuseCharacterCnt++;
}
}
}
if (nHackAbuseCharacterCnt >= 2)
{
#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 100070, pPacket->cSelectedLang);
std::wstring wszRestraintReasonForDolis = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 100071, pPacket->cSelectedLang);
#else //#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 100070);
std::wstring wszRestraintReasonForDolis = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 100071);
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
GetDBConnection()->QueryAddRestraint(m_pSession, DBDNWorldDef::RestraintTargetCode::Account, DBDNWorldDef::RestraintTypeCode::ConnectRestraint,
wszRestraintReason.c_str(), wszRestraintReasonForDolis.c_str(), 9999, DBDNWorldDef::RestraintDolisReasonCode::AbuseRestraintCode);
m_pSession->DetachConnection(L"AddAccountRestraint");
}
#endif
break;
}
#if defined( PRE_ADD_GAMEQUIT_REWARD )
case QUERY_MOD_NEWBIE_REWARDFLAG:
{
const TAHeader* pPacket = (TAHeader*)pData;
if(pPacket->nRetCode== ERROR_NONE)
{
if(SetGameQuitRewardItem(TLevelupEvent::NewbieReconnectReward, DBDNWorldDef::AddMaterializedItem::NewbiewReConnectReward))
g_Log.Log(LogType::_GAMEQUITREWARD, m_pSession, L"AccountDBID[%d] ReConnectNewbieReward Success\n", GetAccountDBID());
}
else
g_Log.Log(LogType::_GAMEQUITREWARD, m_pSession, L"AccountDBID[%d] ReConnectNewbieReward Failed(Ret : %d)\n", GetAccountDBID(), pPacket->nRetCode);
}
break;
#endif // #if defined( PRE_ADD_GAMEQUIT_REWARD )
#if defined(PRE_ADD_CP_RANK) && defined(_GAMESERVER)
case QUERY_GET_STAGE_CLEAR_BEST :
{
const TAGetStageClearBest* pPacket = (TAGetStageClearBest*)pData;
if( pPacket->nRetCode == ERROR_NONE )
{
CDNGameRoom * pGameRoom = m_pSession->GetGameRoom();
if (pGameRoom)
{
pGameRoom->SetAbyssStageClearBest(pPacket);
}
}
else
g_Log.Log(LogType::_ERROR, m_pSession, L"Get Stage Clear Best DBError(Ret : %d)\n", pPacket->nRetCode);
}
break;
case QUERY_GET_STAGE_PERSONAL_BEST :
{
const TAGetStageClearPersonalBest* pPacket = (TAGetStageClearPersonalBest*)pData;
if( pPacket->nRetCode == ERROR_NONE )
{
m_nStageClearBestCP = pPacket->nClearPoint;
if( pPacket->Code > 0)
m_cStageClearBestRank = (char)pPacket->Code-DBDNWorldDef::ClearGradeCode::eCode::SSS;
else
m_cStageClearBestRank = 0;
}
else
g_Log.Log(LogType::_ERROR, m_pSession, L"Get Stage Personal Best DBError(Ret : %d)\n", pPacket->nRetCode);
}
break;
#endif //#if defined(PRE_ADD_CP_RANK) && defined(_GAMESERVER)
}
}
void CDNUserBase::OnDBRecvQuest(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
case QUERY_DELETE_CHARACTER_PERIODQUEST:
{
const TADeletePeriodQuest * pPacket = (TADeletePeriodQuest*)pData;
if (pPacket->nRetCode != ERROR_NONE)
{
g_Log.Log(LogType::_ERROR, L"QUERY_DELETE_CHARACTER_PERIODQUEST FAIL\r\n");
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ش<EFBFBD>.
TQuestGroup* pQuest = GetQuestData();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AddQuest<73><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>.
int nSlot = 0;
int nQuestID = 0;
for (int i=0; i<pPacket->nQuestCount; i++)
{
nQuestID = pPacket->nQuestIDs[i];
nSlot = GetQuest()->FindPlayingQuest(nQuestID);
if( nSlot < 0 ) continue;
pQuest->Quest[nSlot].nQuestID = 0;
pQuest->Quest[nSlot].cQuestState = QuestState_None;
ZeroMemory( &(pQuest->Quest[nSlot]), sizeof(TQuest));
}
// <20><EFBFBD><E2B0A3> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
g_pPeriodQuestSystem->RefreshPeriodQuest(pPacket->nPeriodQuestType, m_pQuest);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
m_pQuest->CheckAcceptWaitRemoteQuestList();
m_pQuest->SendAllQuestRefresh();
}
break;
// <20><EFBFBD><E2B0A3> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
case QUERY_GET_CHARACTER_PERIODQUESTDATE:
{
const TAGetPeriodQuestDate * pPacket = (TAGetPeriodQuestDate*)pData;
if (pPacket->nRetCode != ERROR_NONE)
{
g_Log.Log(LogType::_ERROR, L"QUERY_GET_CHARACTER_PERIODQUESTDATE FAIL\r\n");
break;
}
CheckResetPeriodQuest(pPacket); // <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD>
}
break;
// <20>Ϸ<EFBFBD><CFB7><EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>Ʈ ó<><C3B3>
case QUERY_GET_LISTCOMPLETE_EVENTQUEST:
{
const TAGetListCompleteEventQuest * pPacket = (TAGetListCompleteEventQuest*)pData;
if (pPacket->nRetCode != ERROR_NONE)
{
g_Log.Log(LogType::_ERROR, L"QUERY_GET_LISTCOMPLETE_EVENTQUEST FAIL\r\n");
break;
}
g_pPeriodQuestSystem->RefreshEventQuest(m_pQuest, pPacket->nCount, pPacket->EventQuestList);
m_pQuest->SendAllQuestRefresh();
}
break;
case QUERY_COMPLETE_EVENTQUEST:
{
const TACompleteEventQuest * pPacket = (TACompleteEventQuest*)pData;
if (pPacket->nRetCode != ERROR_NONE)
{
g_Log.Log(LogType::_ERROR, L"QUERY_COMPLETE_EVENTQUEST FAIL\r\n");
break;
}
}
break;
}
}
void CDNUserBase::OnDBRecvMission(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
case QUERY_CLEARMISSION :
{
const TAHeader* pPacket = (TAHeader*)pData;
if(pPacket->nRetCode == ERROR_NONE )
{
wstring wszString = FormatW(L"<EFBFBD>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD>..ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!.\r\n");
SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
}
}
break;
}
}
void CDNUserBase::OnDBRecvSkill(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
case QUERY_RESETSKILL:
{
const TAResetSkill *pUpdate = (TAResetSkill*)pData;
switch(pUpdate->nRetCode)
{
case 103105:
case ERROR_NONE:
// ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> SP <20><> ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
SetSkillPoint( pUpdate->wTotalSkillPoint, pUpdate->cSkillPage );
SendSkillReset( pUpdate->wTotalSkillPoint, pUpdate->cSkillPage );
break;
default:
g_Log.Log(LogType::_FILELOG, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"[M:%d S:%d] Ret:%d", MAINCMD_SKILL, nSubCmd, pUpdate->nRetCode);
m_pSession->DetachConnection(L"QUERY_DBRESULTERROR");
}
}
break;
case QUERY_RESETSKILLBYSKILLIDS:
{
const TAResetSkillBySkillIDS* pUpdate = reinterpret_cast<TAResetSkillBySkillIDS*>(pData);
if( pUpdate->nRetCode == ERROR_NONE )
{
SetSkillPoint( pUpdate->nTotalSkillPoint, pUpdate->cSkillPage);
#ifdef _VILLAGESERVER
m_pSession->GetSkill()->OnResponseSkillResetCashItemFromDBServer( true );
#endif
SendUseSkillResetCashItemRes( pUpdate->nRetCode, pUpdate->nTotalSkillPoint, pUpdate->cSkillPage );
}
else
{
#ifdef _VILLAGESERVER
m_pSession->GetSkill()->OnResponseSkillResetCashItemFromDBServer( false );
#endif
m_pSession->DetachConnection(L"QUERY_RESETSKILLBYSKILLIDS:ERROR");
}
break;
}
#if defined( _VILLAGESERVER )
case QUERY_USEEXPANDSKILLPAGE:
{
const TAUseExpandSkillPage* pUpdate = reinterpret_cast<TAUseExpandSkillPage*>(pData);
if( pUpdate->nRetCode == ERROR_NONE )
{
m_pSession->GetItem()->SetSkillPageCount( DualSkill::Type::MAX );
m_pSession->GetSkill()->ApplyExpendedSkillPage( DualSkill::Type::Secondary );
SendExpandSkillPageResult(ERROR_NONE);
SendSkillReset( m_pSession->GetSkillPoint( DualSkill::Type::Secondary ), DualSkill::Type::Secondary );
SendSkill(m_UserData.Skill[DualSkill::Type::Secondary].SkillList, DualSkill::Type::Secondary);
SendSkillPageCount(m_pSession->GetItem()->GetSkillPageCount());
}
else
{
m_pSession->DetachConnection(L"QUERY_USEEXPANDSKILLPAGE:ERROR");
}
}
break;
#endif
}
}
void CDNUserBase::OnDBRecvFriend(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
case QUERY_FRIENDLIST:
{
const TAFriendList * pPacket = (TAFriendList*)pData;
if (pPacket->nRetCode != ERROR_NONE)
{
SendFriendResult(ERROR_FRIEND_GETLISTFAIL);
g_Log.Log(LogType::_ERROR, m_pSession, L"[ADBID:%u, CDBID:%I64d, SID:%u] QUERY_FRIENDLIST Ret:%d\r\n", pPacket->nAccountDBID, m_biCharacterDBID, m_nSessionID, pPacket->nRetCode);
return;
}
for (int i = 0; i < pPacket->cCount; i++)
{
if (pPacket->FriendData[i].nGroupDBID > 0)
m_pFriend->AddGroup(pPacket->FriendData[i].nGroupDBID, pPacket->FriendData[i].wszGroupName);
if (pPacket->FriendData[i].nFriendAccountDBID > 0)
{
if (pPacket->FriendData[i].biFriendCharacterDBID == GetCharacterDBID())
continue;
#ifdef PRE_ADD_DOORS
m_pFriend->AddFriend(pPacket->FriendData[i].nFriendAccountDBID, pPacket->FriendData[i].biFriendCharacterDBID, pPacket->FriendData[i].wszFriendCharacterName, pPacket->FriendData[i].nGroupDBID, pPacket->FriendData[i].bMobileAuthentication);
#else //#ifdef PRE_ADD_DOORS
m_pFriend->AddFriend(pPacket->FriendData[i].nFriendAccountDBID, pPacket->FriendData[i].biFriendCharacterDBID, pPacket->FriendData[i].wszFriendCharacterName, pPacket->FriendData[i].nGroupDBID, false);
#endif //#ifdef PRE_ADD_DOORS
}
}
}
break;
case QUERY_ADDGROUP:
{
const TAAddGroup * pPacket = (TAAddGroup*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
if (m_pFriend->AddGroup(pPacket->nGroupDBID, pPacket->wszGroupName) == true)
SendFriendGroupAdded(pPacket->nGroupDBID, pPacket->wszGroupName, pPacket->nRetCode);
else
SendFriendGroupAdded(pPacket->nGroupDBID, pPacket->wszGroupName, ERROR_FRIEND_ADDGROUPFAIL);
}
else
SendFriendGroupAdded(pPacket->nGroupDBID, pPacket->wszGroupName, pPacket->nRetCode);
}
break;
case QUERY_MODGROUPNAME:
{
const TAModGroupName * pPacket = (TAModGroupName*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
if (m_pFriend->UpdateGroup(pPacket->nGroupDBID, pPacket->wszGroupName))
SendFriendGroupUpdated(pPacket->nGroupDBID, pPacket->wszGroupName, pPacket->nRetCode);
else
SendFriendGroupUpdated(pPacket->nGroupDBID, pPacket->wszGroupName, ERROR_FRIEND_GROUP_NOTFOUND);
}
else
SendFriendGroupUpdated(pPacket->nGroupDBID, pPacket->wszGroupName, pPacket->nRetCode);
}
break;
case QUERY_DELGROUP:
{
const TADelGroup * pPacket = (TADelGroup*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
if (m_pFriend->DelGroup(pPacket->nGroupDBID))
SendFriendGroupDeleted(pPacket->nGroupDBID, pPacket->nRetCode);
else
SendFriendGroupDeleted(pPacket->nGroupDBID, ERROR_FRIEND_GROUP_NOTFOUND);
}
else
SendFriendGroupDeleted(pPacket->nGroupDBID, pPacket->nRetCode);
}
break;
case QUERY_MODFRIENDANDGROUPMAPPING:
{
TAModFriendAndGroupMapping * pPacket = (TAModFriendAndGroupMapping*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
for (int i = 0; i < pPacket->cCount; i++)
{
if (m_pFriend->UpdateFriend(pPacket->biFriendCharacterDBIDs[i], pPacket->nGroupDBID, NULL) == false)
{
_DANGER_POINT();
pPacket->biFriendCharacterDBIDs[i] = 0;
}
}
}
SendFriendUpdated(pPacket->cCount, pPacket->biFriendCharacterDBIDs, pPacket->nGroupDBID, pPacket->nRetCode);
}
break;
case QUERY_ADDFRIEND:
{
const TAAddFriend * pPacket = (TAAddFriend*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
if (m_pFriend->AddFriend(pPacket->nFriendAccountDBID, pPacket->biFriendCharacterDBID, pPacket->wszFriendName, pPacket->nGroupDBID, false))
{
TFriendGroup * pGroup = NULL;
if (pPacket->nGroupDBID > 0)
{
pGroup = m_pFriend->GetGroup(pPacket->nGroupDBID);
if (pGroup == NULL)
_DANGER_POINT();
}
if (pPacket->cNeedDelIsolate > 0)
{
if (m_pIsolate->DelIsolateItem(pPacket->biFriendCharacterDBID) == false)
{
_DANGER_POINT();
}
else
{
SendIsolateDel(pPacket->wszFriendName);
}
}
//<2F>߰<EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD><CCBC><EFBFBD> <20><><EFBFBD><EFBFBD>
sWorldUserState State;
if (g_pWorldUserState->GetUserState(pPacket->wszFriendName, pPacket->biFriendCharacterDBID, &State) == false)
State.nLocationState = _LOCATION_NONE;
SendFriendAdded(pPacket->biFriendCharacterDBID, (pGroup == NULL ? 0 : pGroup->nGroupDBID), pPacket->wszFriendName, &State, pPacket->nRetCode);
if (State.nLocationState != _LOCATION_NONE){
#if defined(_VILLAGESERVER)
g_pMasterConnection->SendFriendAddNotify(pPacket->nFriendAccountDBID, GetCharacterName());
#elif defined(_GAMESERVER)
g_pMasterConnectionManager->SendFriendAddNotify(GetWorldSetID(), pPacket->nFriendAccountDBID, GetCharacterName());
#endif
}
if( m_pFriend->GetFriendCount() == FRIEND_MAXCOUNT )
GetEventSystem()->OnEvent( EventSystem::OnFriendFull );
#if defined(_GAMESERVER)
if (m_pSession)
m_pSession->GetGameRoom()->UpdateAppliedEventValue();
#elif defined(_VILLAGESERVER)
if (m_pSession)
{
if (m_pSession->GetPartyID() > 0)
{
CDNParty * pParty = g_pPartyManager->GetParty(m_pSession->GetPartyID());
if (pParty)
pParty->SendAllRefreshParty(PARTYREFRESH_NONE);
else
_DANGER_POINT();
}
}
#endif //#elif defined(_VILLAGESERVER)
break;
}
}
else
SendFriendResult(pPacket->nRetCode);
}
break;
case QUERY_DELFRIEND:
{
const TADelFriend * pPacket = (TADelFriend*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
for (int i = 0; i < pPacket->cCount; i++)
{
if (m_pFriend->DelFriend(pPacket->biFriendCharacterDBIDs[i]) == false)
_DANGER_POINT();
}
SendFriendDeleted(pPacket->cCount, pPacket->biFriendCharacterDBIDs, pPacket->nRetCode);
#if defined(_GAMESERVER)
if (m_pSession)
m_pSession->GetGameRoom()->UpdateAppliedEventValue();
#elif defined(_VILLAGESERVER)
if (m_pSession)
{
if (m_pSession->GetPartyID() > 0)
{
CDNParty * pParty = g_pPartyManager->GetParty(m_pSession->GetPartyID());
if (pParty)
pParty->SendAllRefreshParty(PARTYREFRESH_NONE);
else
_DANGER_POINT();
}
}
#endif //#elif defined(_VILLAGESERVER)
}
else
SendFriendDeleted(0, NULL, pPacket->nRetCode);
}
break;
}
}
void CDNUserBase::OnDBRecvIsolate(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
// Isolate
case QUERY_GETISOLATELIST:
{
const TAGetIsolateList * pPacket = (TAGetIsolateList*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
for (int i = 0; i < pPacket->cCount; i++)
{
if (m_pIsolate->AddIsolateItem(&pPacket->Isolate[i]) == false)
_DANGER_POINT();
}
}
}
break;
case QUERY_ADDISOLATE:
{
const TAAddIsolate * pPacket = (TAAddIsolate*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
if (m_pIsolate->AddIsolateItem(&pPacket->IsolateItem))
{
if (pPacket->cNeedDelFriend > 0)
{
if (m_pFriend->DelFriend(pPacket->IsolateItem.biIsolateCharacterDBID) == false)
{
_DANGER_POINT();
}
else
SendFriendDeleted(1, &pPacket->IsolateItem.biIsolateCharacterDBID, ERROR_NONE);
}
else
{
//<2F><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> ģ<><C4A3><EFBFBD>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӵǾ<D3B5> <20>ִ<EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD><D2B0><EFBFBD> <20><><EFBFBD>񿡼<EFBFBD><F1BFA1BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
//pPacket->cNeedDelFriend<6E><64> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD>Եȴ<D4B5>. <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>޸𸮻󿡼<F0B8AEBB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><20>ٽ<EFBFBD> <20>°Եȴ<D4B5>.
INT64 biDelFriendDBID = m_pFriend->DelFriend(pPacket->IsolateItem.wszIsolateName);
if (biDelFriendDBID > 0)
SendFriendDeleted(1, &biDelFriendDBID, ERROR_NONE);
}
SendIsolateAdd(pPacket->IsolateItem.wszIsolateName);
break;
}
}
else
{
SendIsolateResult(pPacket->nRetCode);
}
}
break;
case QUERY_DELISOLATE:
{
const TADelIsolate * pPacket = (TADelIsolate*)pData;
if (pPacket->nRetCode == ERROR_NONE)
{
WCHAR szName[NAMELENMAX];
std::vector <std::wstring> vList;
for (int i = 0; i < pPacket->cCount; i++)
{
memset(szName, 0, sizeof(szName));
if (m_pIsolate->GetIsolateChrName(pPacket->biIsolateCharacterDBIDs[i], szName))
{
if (m_pIsolate->DelIsolateItem(pPacket->biIsolateCharacterDBIDs[i]) == false)
{
_DANGER_POINT();
}
else
vList.push_back(szName);
}
}
SendIsolateDel(&vList);
}
else
SendIsolateResult(pPacket->nRetCode);
}
break;
}
}
void CDNUserBase::OnDBRecvPvP(int nSubCmd, char *pData)
{
switch( nSubCmd )
{
case QUERY_GETLIST_PVP_LADDERSCORE:
{
TAGetListPvPLadderScore* pA = reinterpret_cast<TAGetListPvPLadderScore*>(pData);
if( pA->nRetCode == ERROR_NONE )
{
memset( &m_PvPLadderScoreInfo, 0, sizeof(m_PvPLadderScoreInfo) );
int iSize = sizeof(pA->Data)-sizeof(pA->Data.LadderScore)+pA->Data.cLadderTypeCount*sizeof(pA->Data.LadderScore[0]);
memcpy( &m_PvPLadderScoreInfo, &pA->Data, iSize );
}
else
{
m_pSession->DetachConnection(L"QUERY_GETLIST_PVP_LADDERSCORE Failed!");
}
break;
}
case QUERY_GETLIST_PVP_LADDERSCORE_BYJOB:
{
TAGetListPvPLadderScoreByJob* pA = reinterpret_cast<TAGetListPvPLadderScoreByJob*>(pData);
if( pA->nRetCode == ERROR_NONE )
{
m_PvPLadderScoreInfoByJob.bInit = true;
int iSize = sizeof(pA->Data)-sizeof(pA->Data.LadderScoreByJob)+pA->Data.cJobCount*sizeof(pA->Data.LadderScoreByJob[0]);
memcpy( &m_PvPLadderScoreInfoByJob.Data, &pA->Data, iSize );
}
SendPvPLadderScoreInfoByJob( pA );
break;
}
case QUERY_MOD_PVP_LADDERSCORE_FORCHEAT:
{
TAModPvPLadderScoresForCheat* pA = reinterpret_cast<TAModPvPLadderScoresForCheat*>(pData);
if( pA->nRetCode != ERROR_NONE )
break;
const_cast<TPvPLadderScoreInfo*>(GetPvPLadderScoreInfoPtr())->SetLadderScoreForCheat( static_cast<LadderSystem::MatchType::eCode>(pA->cPvPLadderCode), pA->iPvPLadderPoint, pA->iPvPLadderGradePoint, pA->iHiddenPvPLadderGradePoint );
SendPvPLadderScoreInfo( GetPvPLadderScoreInfoPtr() );
break;
}
case QUERY_GET_PVP_GHOULSCORES :
{
TAGetPVPGhoulScores* pA = reinterpret_cast<TAGetPVPGhoulScores*>(pData);
if( pA->nRetCode == ERROR_NONE )
{
m_PvPTotalGhoulScores.nPoint[GhoulMode::PointType::PlayCount] = pA->nPlayCount;
m_PvPTotalGhoulScores.nPoint[GhoulMode::PointType::GhoulWin] = pA->nGhoulWin;
m_PvPTotalGhoulScores.nPoint[GhoulMode::PointType::HumanWin] = pA->nHumanWin;
m_PvPTotalGhoulScores.nPoint[GhoulMode::PointType::TimeOver] = pA->nTimeOver;
m_PvPTotalGhoulScores.nPoint[GhoulMode::PointType::GhoulKill] = pA->nGhoulKill;
m_PvPTotalGhoulScores.nPoint[GhoulMode::PointType::HumanKill] = pA->nHumanKill;
m_PvPTotalGhoulScores.nPoint[GhoulMode::PointType::HolyWaterUse] = pA->nHolyWaterUse;
}
else
{
m_pSession->DetachConnection(L"QUERY_GET_PVP_GHOULSCORES Failed!");
}
}
break;
}
}
void CDNUserBase::OnDBRecvDarkLair(int nSubCmd, char *pData)
{
}
void CDNUserBase::OnDBRecvGuild(int nSubCmd, char *pData)
{
}
void CDNUserBase::OnDBRecvMail(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
case QUERY_GETCOUNTRECEIVEMAIL:
{
TAGetCountReceiveMail *pMail = (TAGetCountReceiveMail*)pData;
if (pMail->nRetCode == ERROR_NONE){
SendNotifyMail(pMail->iTotalMailCount, pMail->iNotReadMailCount, pMail->i7DaysLeftMailCount, false);
}
}
break;
case QUERY_SENDSYSTEMMAIL:
{
TASendSystemMail *pMail = (TASendSystemMail*)pData;
if (pMail->nRetCode == ERROR_NONE){
SendNotifyMail(pMail->iTotalMailCount, pMail->iNotReadMailCount, pMail->i7DaysLeftMailCount, true);
}
}
break;
#if defined(PRE_SPECIALBOX)
case QUERY_ADDEVENTREWARD:
{
TAAddEventReward *pSpecialBox = (TAAddEventReward*)pData;
if (pSpecialBox->nRetCode == ERROR_NONE){
if (pSpecialBox->nEventTotalCount > 0)
SendNotifySpecialBoxCount(pSpecialBox->nEventTotalCount, true);
}
}
break;
case QUERY_GETCOUNTEVENTREWARD:
{
TAGetCountEventReward *pSpecialBox = (TAGetCountEventReward*)pData;
if (pSpecialBox->nRetCode == ERROR_NONE){
if (pSpecialBox->nEventTotalCount > 0)
SendNotifySpecialBoxCount(pSpecialBox->nEventTotalCount, false);
}
}
break;
case QUERY_GETLISTEVENTREWARD:
{
TAGetListEventReward *pSpecialBox = (TAGetListEventReward*)pData;
if (pSpecialBox->nRetCode == ERROR_NONE)
m_pItem->SetSpecialBoxInfoList(pSpecialBox);
SendSpecialBoxList(pSpecialBox->nRetCode, pSpecialBox->cCount, pSpecialBox->SpecialBoxInfo);
}
break;
case QUERY_GETLISTEVENTREWARDITEM:
{
TAGetListEventRewardItem *pSpecialBox = (TAGetListEventRewardItem*)pData;
if (pSpecialBox->nRetCode == ERROR_NONE){
m_pItem->SetSelectSpecialBoxItems(pSpecialBox);
}
SendSpecialBoxItemList(pSpecialBox->nRetCode, pSpecialBox->cCount, pSpecialBox->SpecialBoxItem, m_pItem->GetSelectSpecialBoxRewardCoin(pSpecialBox->nEventRewardID));
}
break;
case QUERY_ADDEVENTREWARDRECEIVER:
{
TAAddEventRewardReceiver *pSpecialBox = (TAAddEventRewardReceiver*)pData;
int nRet = pSpecialBox->nRetCode;
if (pSpecialBox->nRetCode == ERROR_NONE)
nRet = m_pItem->ReceiveSpecialBox(pSpecialBox->nEventRewardID, pSpecialBox->nItemID);
SendReceiveSpecialBoxItem(nRet);
}
break;
#endif // #if defined(PRE_SPECIALBOX)
#if defined( PRE_MOD_71820 )
#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())
{
#if defined(_VILLAGESERVER)
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);
}
#elif defined(_GAMESERVER)
CDNRUDPGameServer * pGameServer = g_pGameServerManager->GetGameServerByAID(pPacket->nReceiverAccountDBID); // <20>޴<EFBFBD><DEB4><EFBFBD> ã<><C3A3>
if(pGameServer){
CDNUserSession *pUserObj = pGameServer->GetUserSession(pPacket->nReceiverAccountDBID);
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_pMasterConnectionManager->SendNotifyMail(pPacket->cWorldSetID, pPacket->nReceiverAccountDBID, pPacket->biReceiverCharacterDBID, pPacket->iTotalMailCount, pPacket->iNotReadMailCount, pPacket->i7DaysLeftMailCount, true);
}
#endif // #if defined(_VILLAGESERVER)
}
}
}
break;
#endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT
#endif // #if defined( PRE_MOD_71820 )
}
}
void CDNUserBase::OnDBRecvMarket(int nSubCmd, char *pData)
{
}
void CDNUserBase::OnDBRecvItem(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
case QUERY_GETLIST_REPURCHASEITEM:
{
TAGetListRepurchaseItem* pA = reinterpret_cast<TAGetListRepurchaseItem*>(pData);
GetItem()->OnRecvGetListRepurchaseItem( pA );
break;
}
case QUERY_GETPAGEMATERIALIZEDITEM:
{
TAGetPageMaterializedItem *pItem = (TAGetPageMaterializedItem*)pData;
if (pItem->nRetCode != ERROR_NONE){
m_pSession->DetachConnection(L"QUERY_GETPAGEMATERIALIZEDITEM LoadCashInvenList failed!");
return;
}
m_pItem->LoadCashInventory(pItem->wPageNumber, pItem->nTotalListCount, pItem->cCount, pItem->CashItem);
int nRemain = m_pItem->GetCashInventoryTotalCount() - m_pItem->GetCashInventoryCount();
if (nRemain > 0){
m_pSession->GetDBConnection()->QueryGetPageMaterializedItem(m_pSession->GetDBThreadID(), m_pSession, m_pItem->GetCashInventoryPage(), CASHINVENTORYPAGEMAX);
}
}
break;
case QUERY_GETPAGEVEHICLE:
{
TAGetPageVehicle *pItem = (TAGetPageVehicle*)pData;
if (pItem->nRetCode != ERROR_NONE){
m_pSession->DetachConnection(L"QUERY_GETPAGEVEHICLE LoadVehicleInventory failed!");
return;
}
m_pItem->LoadVehicleInventory(pItem);
#if defined( _VILLAGESERVER )
GetEventSystem()->OnEvent( EventSystem::OnPetLevelUp );
#endif
}
break;
case QUERY_CHANGEPETNAME:
{
const TAChangePetName *pPacket = reinterpret_cast<TAChangePetName*>(pData);
if (pPacket->nRetCode != ERROR_NONE)
{
SendChangePetNameResult(pPacket->nRetCode, m_pSession->GetSessionID(), pPacket->petSerial, pPacket->name);
break;
}
int nRet = m_pItem->ChangePetName(pPacket);
SendChangePetNameResult(pPacket->nRetCode, m_pSession->GetSessionID(), pPacket->petSerial, pPacket->name);
}
break;
case QUERY_ITEMEXPIREBYCHEAT :
{
const TAItemExpire* pPacket = reinterpret_cast<TAItemExpire*>(pData);
const TItem* pItem = m_pItem->GetCashInventory(pPacket->biSerial);
if( pPacket->nRetCode == ERROR_NONE && pItem )
{
// ij<><C4B3><EFBFBD>κ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
m_pItem->DeleteCashInventoryBySerial(pPacket->biSerial, 1, false);
}
}
break;
case QUERY_MODITEMEXPIREDATE:
{
const TAModItemExpireDate *pPacket = reinterpret_cast<TAModItemExpireDate*>(pData);
if( pPacket->nRetCode != ERROR_NONE )
{
if (m_pSession)
{
m_pSession->DetachConnection(L"QUERY_MODITEMEXPIREDATE failed!");
return;
}
}
SendItemModItemExpireDate(pPacket->nRetCode);
m_pItem->ModPetExpireDate(pPacket);
}
break;
case QUERY_MODPETEXP:
{
const TAModPetExp* pPacket = reinterpret_cast<TAModPetExp*>(pData);
if( pPacket->nRetCode != ERROR_NONE )
{
if (m_pSession)
{
m_pSession->DetachConnection(L"QUERY_MODITEMEXPIREDATE failed!");
return;
}
}
}
break;
case QUERY_MISSINGITEMLIST:
{
TAMissingItemList *pItem = (TAMissingItemList*)pData;
if (pItem->nRetCode == ERROR_NONE){
m_pItem->CalcMissingItem(pItem);
}
}
break;
case QUERY_RECOVERMISSINGITEM:
{
TARecoverMissingItem *pItem = (TARecoverMissingItem*)pData;
if (pItem->nRetCode == ERROR_NONE){
m_pItem->RecoverMissingItem(pItem);
}
}
break;
case QUERY_MODADDITIVEITEM:
{
TAModAdditiveItem *pItem = (TAModAdditiveItem*)pData;
m_pItem->CompleteCostumeDesign(pItem);
}
break;
#if defined (PRE_ADD_COSRANDMIX) && defined (_VILLAGESERVER)
case QUERY_MODRANDOMITEM:
{
TAModRandomItem *pItem = (TAModRandomItem*)pData;
m_pItem->CompleteRandomDesign(pItem);
}
break;
#endif
case QUERY_DELEXPIREITEM:
{
TADelExpiritem *pItem = (TADelExpiritem*)pData;
m_pItem->RefreshExpireitem(pItem);
}
break;
case QUERY_DELCASHITEM:
{
TADelCashItem *pItem = (TADelCashItem*)pData;
m_pItem->OnRemoveCashItem(pItem);
}
break;
case QUERY_RECOVERCASHITEM:
{
TARecoverCashItem *pItem = (TARecoverCashItem*)pData;
m_pItem->OnRecoverCashItem(pItem);
}
break;
#if defined (PRE_ADD_EXCHANGE_POTENTIAL)
case QUERY_MOVEPOTENTIAL:
{
TAMovePotential * pPacket = (TAMovePotential*)pData;
if (pPacket->nRetCode != ERROR_NONE)
_DANGER_POINT_MSG(L"QUERY_MOVEPOTENTIAL Recv Error");
}
break;
#endif //#if defined (PRE_ADD_EXCHANGE_POTENTIAL)
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
case QUERY_CHEATCHECK_NAMEDITEMCOUNT:
{
TACheckNamedItemCount* pA = reinterpret_cast<TACheckNamedItemCount*>(pData);
WCHAR wszBuf[MAX_PATH];
wsprintf( wszBuf, L"[NamedItem] Nameditem Count:%d", pA->nCount );
SendDebugChat( wszBuf );
}
break;
#endif
#if defined( PRE_ADD_LIMITED_SHOP )
case QUERY_GETLIMITEDSHOPITEM:
{
TAGetLimitedShopItem* pPacket = reinterpret_cast<TAGetLimitedShopItem*>(pData);
for (int i = 0; i < pPacket->nCount; ++i)
{
#if defined( PRE_FIX_74404 )
AddLimitedShopBuyedItem(pPacket->ItemData[i].nShopID, pPacket->ItemData[i].nItemID, pPacket->ItemData[i].nBuyCount, pPacket->ItemData[i].nResetCycle, false);
#else
AddLimitedShopBuyedItem(pPacket->ItemData[i].nItemID, pPacket->ItemData[i].nBuyCount, pPacket->ItemData[i].nResetCycle, false);
#endif
}
}
break;
#endif
#if defined(PRE_FIX_74387)
case QUERY_RESELLITEM :
{
TAHeader* pA = reinterpret_cast<TAHeader*>(pData);
m_pSession->SendShopSellResult(pA->nRetCode);
m_pSession->SetNowResellItem(false);
}
break;
#endif //#if defined(PRE_FIX_74387)
#if defined(PRE_ADD_CHNC2C)
case QUERY_KEEP_GAMEMONEY :
{
const TAKeepGameMoney* pA = reinterpret_cast<const TAKeepGameMoney*>(pData);
if( pA->nRetCode == ERROR_NONE )
DelCoin(pA->biReduceCoin, 0, 0);
}
break;
case QUERY_TRANSFER_GAMEMONEY :
{
const TATransferGameMoney* pA = reinterpret_cast<const TATransferGameMoney*>(pData);
if( pA->nRetCode == ERROR_NONE )
AddCoin(pA->biAddCoin, 0, 0);
}
break;
#endif //#if defined(PRE_ADD_CHNC2C)
#if defined(PRE_ADD_EQUIPLOCK)
case QUERY_ADDLOCK_ITEM:
{
const TALockItemInfo* pA = reinterpret_cast<const TALockItemInfo*>(pData);
if( pA->nRetCode == ERROR_NONE )
GetItem()->LockEquipItem(pA->Code, pA->cItemSlotIndex, pA->tLockDate);
SendAddLockItem(pA->nRetCode, pA->Code, pA->cItemSlotIndex, pA->tLockDate);
}
break;
case QUERY_REQUEST_ITEMUNLOCK:
{
const TAUnLockRequestItemInfo* pA = reinterpret_cast<const TAUnLockRequestItemInfo*>(pData);
if(pA->nRetCode == ERROR_NONE)
GetItem()->RequestUnLockEquipItem(pA->Code, pA->cItemSlotIndex, pA->tUnLockDate, pA->tUnLockRequestDate);
SendRequestUnlockItem(pA->nRetCode, pA->Code, pA->cItemSlotIndex, pA->tUnLockDate, pA->tUnLockRequestDate);
}
break;
case QUERY_GET_LIST_LOCKEDITEMS:
{
const TAGetListLockedItems* pA = reinterpret_cast<TAGetListLockedItems*>(pData);
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, Ŭ<>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>)
if( pA->nRetCode == ERROR_NONE && pA->nCount > 0 )
m_pItem->LoadLockItem(pA);
}
break;
#endif // #if defined(PRE_ADD_EQUIPLOCK)
}
}
void CDNUserBase::OnDBRecvCash(int nSubCmd, char *pData)
{
switch(nSubCmd)
{
case QUERY_NOTIFYGIFT:
{
TANotifyGift *pCashShop = (TANotifyGift*)pData;
if (pCashShop->nRetCode == ERROR_NONE){
if (pCashShop->nGiftCount > 0) SendCashshopNotifyGift(pCashShop->bNew, pCashShop->nGiftCount);
}
}
break;
case QUERY_GETLISTGIVEFAILITEM:
{
TAGetListGiveFailItem *pCashShop = (TAGetListGiveFailItem*)pData;
m_pItem->DBQueryCashFailItemApply(pCashShop);
}
break;
case QUERY_MODGIVEFAILFLAG: // ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> fail<69><6C><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20>־<EFBFBD><D6BE>ִ<EFBFBD> ó<><C3B3>
{
TAModGiveFailFlag *pCash = (TAModGiveFailFlag*)pData;
for (int i = 0; i < pCash->nCount; i++){
m_pItem->ApplyCashShopItem(pCash->CashItem[i]);
}
}
break;
case QUERY_CHECKGIFTRECEIVER:
{
TACheckGiftReceiver *pCashShop = (TACheckGiftReceiver*)pData;
SendCashShopCheckReceiver(pCashShop->cLevel, pCashShop->cJob, pCashShop->nRetCode);
}
break;
case QUERY_GETLISTGIFTBOX:
{
TAGetListGiftBox *pCashShop = (TAGetListGiftBox*)pData;
#if defined(PRE_ADD_MULTILANGUAGE)
CDNMailSender::ModifyGiftData(pCashShop->GiftBox, pCashShop->cCount, pCashShop->cSelectedLang);
#else //#if defined(PRE_ADD_MULTILANGUAGE)
CDNMailSender::ModifyGiftData(pCashShop->GiftBox, pCashShop->cCount);
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
SendCashShopGiftList(pCashShop->nRetCode, pCashShop->cCount, pCashShop->GiftBox);
}
break;
case QUERY_MODGIFTRECEIVEFLAG:
{
TAModGiftReceiveFlag *pCashShop = (TAModGiftReceiveFlag*)pData;
int nRet = ERROR_NONE;
#if defined(PRE_RECEIVEGIFTALL)
if (pCashShop->cCount > 1){
nRet = m_pItem->CheckModGiftReceive(pCashShop);
if (nRet != ERROR_NONE){
if (pCashShop->bReceiveAll)
SendCashShopReceiveGiftAll(m_VecReceiveGiftResultList, nRet);
else
SendCashShopReceiveGift(pCashShop->ReceiveGift[0].GiftData.nGiftDBID, nRet);
break;
}
if (m_VecReceiveGiftResultList.empty()){
SendCashShopReceiveGiftAll(m_VecReceiveGiftResultList, ERROR_ITEM_FAIL);
break;
}
}
#endif // #if defined(PRE_RECEIVEGIFTALL)
nRet = m_pItem->ModGiftReceiveFlag(pCashShop);
if (nRet != ERROR_NONE){
#if defined(PRE_RECEIVEGIFTALL)
if (pCashShop->bReceiveAll)
SendCashShopReceiveGiftAll(m_VecReceiveGiftResultList, nRet);
else
#endif // #if defined(PRE_RECEIVEGIFTALL)
SendCashShopReceiveGift(pCashShop->ReceiveGift[0].GiftData.nGiftDBID, nRet);
break;
}
}
break;
case QUERY_RECEIVEGIFT:
{
TAReceiveGift *pCashShop = (TAReceiveGift*)pData;
if (pCashShop->nRetCode == ERROR_NONE){
if (pCashShop->cCount > 1){ // package
for (int i = 0; i < pCashShop->cCount; i++){
m_pItem->ApplyCashShopItem(pCashShop->GiftItem[i].nItemSN, pCashShop->GiftItem[i].AddItem, pCashShop->GiftItem[i].dwPartsColor1, pCashShop->GiftItem[i].dwPartsColor2,
&(pCashShop->GiftItem[i].VehiclePart1), &(pCashShop->GiftItem[i].VehiclePart2));
}
}
else{
#if defined(PRE_ADD_VIP)
if (g_pDataManager->GetItemMainType(pCashShop->GiftItem[0].AddItem.nItemID) == ITEMTYPE_VIP){
TCashCommodityData CashData;
if (!g_pDataManager->GetCashCommodityData(pCashShop->nItemSN, CashData)){
SendCashShopReceiveGift(pCashShop->biPurchaseOrderID, ERROR_ITEM_FAIL);
return;
}
TCashCommodityData *pCashData = &CashData;
if (!m_bVIPAutoPay)
m_bVIPAutoPay = pCashData->bAutomaticPay;
m_pDBCon->QueryIncreaseVIPPoint(m_pSession, pCashData->nVIPPoint, pCashShop->biPurchaseOrderID, pCashData->wPeriod, m_bVIPAutoPay);
if (pCashShop->cPayMethodCode != DBDNWorldDef::PayMethodCode::LevelupEvent)
_MakeGiftVIPMonthItemByItemSN(pCashShop->nItemSN);
}
else
#endif // #if defined(PRE_ADD_VIP)
m_pItem->ApplyCashShopItem(pCashShop->nItemSN, pCashShop->GiftItem[0].AddItem, pCashShop->GiftItem[0].dwPartsColor1, pCashShop->GiftItem[0].dwPartsColor2, &(pCashShop->GiftItem[0].VehiclePart1), &(pCashShop->GiftItem[0].VehiclePart2));
}
if (pCashShop->nReceiverAccountDBID != m_nAccountDBID){
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSessionByAccountDBID(pCashShop->nReceiverAccountDBID); // <20>޴<EFBFBD><DEB4><EFBFBD> ã<><C3A3>
if (pUserSession && (pUserSession->GetCharacterDBID() == pCashShop->biReceiverCharacterDBID)){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><> ó<><C3B3>
pUserSession->SendNotifyMail(pCashShop->nReceiverTotalMailCount, pCashShop->nReceiverNotReadMailCount, pCashShop->nReceiver7DaysLeftMailCount, true); // <20><><EFBFBD><EFBFBD> <20>°<EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> master<65><72>
g_pMasterConnection->SendNotifyMail(pCashShop->nReceiverAccountDBID, pCashShop->biReceiverCharacterDBID, pCashShop->nReceiverTotalMailCount, pCashShop->nReceiverNotReadMailCount, pCashShop->nReceiver7DaysLeftMailCount, true);
}
#endif
}
}
#if defined(PRE_RECEIVEGIFTALL)
if (pCashShop->bReceiveAll)
{
#if defined(PRE_RECEIVEGIFTALL)
m_nReceiveGiftPageCount++;
#endif // #if defined(PRE_RECEIVEGIFTALL)
if (m_nReceiveGiftPageCount == pCashShop->cTotalCount){
SendCashShopReceiveGiftAll(m_VecReceiveGiftResultList, pCashShop->nRetCode);
}
}
else
#endif // #if defined(PRE_RECEIVEGIFTALL)
SendCashShopReceiveGift(pCashShop->biPurchaseOrderID, pCashShop->nRetCode);
}
break;
case QUERY_MAKEGIFTBYQUEST:
{
TAMakeGiftByQuest *pCash = (TAMakeGiftByQuest*)pData;
if (pCash->nRetCode == ERROR_NONE){
if (pCash->nGiftCount > 0) SendCashshopNotifyGift(true, pCash->nGiftCount);
}
}
break;
case QUERY_MAKEGIFTBYMISSION:
{
TAMakeGiftByMission *pCash = (TAMakeGiftByMission*)pData;
if (pCash->nRetCode == ERROR_NONE){
if (pCash->nGiftCount > 0) SendCashshopNotifyGift(true, pCash->nGiftCount);
}
}
break;
case QUERY_MAKEGIFT:
{
TAMakeGift *pCash = (TAMakeGift*)pData;
if (pCash->nRetCode == ERROR_NONE){
if (pCash->nGiftCount > 0) SendCashshopNotifyGift(true, pCash->nGiftCount);
}
}
break;
#if defined(PRE_ADD_VIP)
case QUERY_INCREASEVIPPOINT:
{
TAIncreaseVIPPoint *pCash = (TAIncreaseVIPPoint*)pData;
if (pCash->nRetCode == ERROR_NONE){
if (pCash->tVIPEndDate > 0){
if (!m_bVIP){ // <20>̹<EFBFBD> vip<69><70> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD>
m_bVIP = true; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
SetDefaultVIPFatigue(); // vip<69>Ƿε<C7B7> <20><><EFBFBD><EFBFBD>
}
m_bVIP = true;
m_nVIPTotalPoint = pCash->nVIPTotalPoint;
m_tVIPEndDate = pCash->tVIPEndDate;
}
SendVIPInfo(m_nVIPTotalPoint, m_tVIPEndDate, m_bVIPAutoPay, m_bVIP);
}
}
break;
case QUERY_GETVIPPOINT:
{
TAGetVIPPoint *pCash = (TAGetVIPPoint*)pData;
if (pCash->nRetCode == ERROR_NONE){
m_nVIPTotalPoint = pCash->nVIPTotalPoint;
m_tVIPEndDate = pCash->tVIPEndDate;
m_bVIPAutoPay = pCash->bAutoPay;
__time64_t tCur;
time(&tCur);
if (m_tVIPEndDate >= tCur)
m_bVIP = true;
SendVIPInfo(m_nVIPTotalPoint, m_tVIPEndDate, m_bVIPAutoPay, m_bVIP);
}
}
break;
case QUERY_MODVIPAUTOPAYFLAG:
{
TAModVIPAutoPayFlag *pCash = (TAModVIPAutoPayFlag*)pData;
if (pCash->nRetCode == ERROR_NONE){
m_bVIPAutoPay = pCash->bAutoPay;
}
}
break;
#endif // #if defined(PRE_ADD_VIP)
case QUERY_PETAL:
{
TAPetal *pCash = (TAPetal*)pData;
if (pCash->nRetCode == ERROR_NONE){
m_pItem->DeleteItemByUse(pCash->cInvenType, pCash->cInvenIndex, pCash->biInvenSerial, false );
SetPetal(pCash->nTotalPetal);
SendPetalTokenResult(pCash->nUseItemID, pCash->nTotalPetal);
}
}
break;
#if defined(_VILLAGESERVER)
#if defined(PRE_ADD_GIFT_RETURN)
case QUERY_GIFTRETURN :
{
TAGiftReturn *pCash = (TAGiftReturn*)pData;
if (pCash->nRetCode == ERROR_NONE)
{
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSessionByAccountDBID(pCash->nReceiverAccountDBID); // <20>޴<EFBFBD><DEB4><EFBFBD> ã<><C3A3>
if (pUserSession && (pUserSession->GetCharacterDBID() == pCash->biReceiverCharacterDBID)){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><> ó<><C3B3>
pUserSession->SendCashshopNotifyGift(true, pCash->nReceiverTotalMailCount); // <20>ݼ<EFBFBD> <20>Ȱ<EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> master<65><72>
g_pMasterConnection->SendNotifyGift(pCash->nReceiverAccountDBID, pCash->biReceiverCharacterDBID, true, pCash->nReceiverTotalMailCount);
}
}
SendCashShopGiftReturn(pCash->biPurchaseOrderID, pCash->nRetCode);
}
break;
#endif // #if defined(PRE_ADD_GIFT_RETURN)
#if defined(PRE_ADD_CASH_REFUND)
case QUERY_PAYMENTINVEN_LIST :
{
TAPaymentItemList* pPaymentItemList = (TAPaymentItemList*)pData;
if ( pPaymentItemList->nRetCode == ERROR_NONE)
m_pItem->LoadPaymentItem(pPaymentItemList);
}
break;
case QUERY_PAYMENTINVEN_PAKAGELIST :
{
TAPaymentPackageItemList* pPaymentPackageItemList = (TAPaymentPackageItemList*)pData;
if ( pPaymentPackageItemList->nRetCode == ERROR_NONE)
m_pItem->LoadPaymentPackageItem(pPaymentPackageItemList);
}
break;
#endif // #if defined(PRE_ADD_CASH_REFUND)
#endif //#if defined(_VILLAGESERVER)
}
}
int CDNUserBase::OnRecvCharMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case eChar::CS_ADDQUICKSLOT:
{
if (sizeof(CSAddQuickSlot) != nLen)
return ERROR_INVALIDPACKET;
CSAddQuickSlot *pAddSlot = (CSAddQuickSlot*)pData;
AddQuickSlot(pAddSlot->cSlotIndex, pAddSlot->cSlotType, pAddSlot->nID);
// SendAddQuickSlot(pAddSlot->cSlotIndex, pAddSlot->cSlotType, pAddSlot->nID, nRet);
return ERROR_NONE;
}
break;
case eChar::CS_DELQUICKSLOT:
{
if (sizeof(CSDelQuickSlot) != nLen)
return ERROR_INVALIDPACKET;
CSDelQuickSlot *pDelSlot = (CSDelQuickSlot*)pData;
DelQuickSlot(pDelSlot->cSlotIndex);
// SendDelQuickSlot(pDelSlot->cSlotIndex, nRet);
return ERROR_NONE;
}
break;
#if defined( PRE_ADD_NOTIFY_ITEM_COMPOUND )
case eChar::CS_COMPOUND_NOTIFY:
{
if (sizeof(CSCompoundNotify) != nLen)
return ERROR_INVALIDPACKET;
SetCompoundNotify((CSCompoundNotify*)pData);
return ERROR_NONE;
}
break;
#endif
//rlkt_rebirth
case eChar::CS_DOREBIRTH:
{
if (this->GetLevel() == 90)//to be done
{
int nExp = g_pDataManager->GetExp(m_pSession->GetUserJob(), 1);
m_pSession->SetExp(1, DBDNWorldDef::CharacterExpChangeCode::Cheat, 0, false);
m_pSession->SetLevel(1, DBDNWorldDef::CharacterLevelChangeCode::Cheat, true);
m_pSession->SetExp(nExp, DBDNWorldDef::CharacterExpChangeCode::Cheat, 0, true);
printf("[REBIRTH SYSTEM] %s set level , cur lvl: %d\n",this->GetCharacterNameA(),this->GetLevel());
}
return ERROR_NONE;
}
break;
case eChar::CS_DOSPECIALIZE:
{
if (sizeof(CSSpecialize) != nLen)
return ERROR_INVALIDPACKET;
CSSpecialize* pPacket = (CSSpecialize*)pData;
DNTableFileFormat* pJobTable = GetDNTable(CDnTableDB::TJOB);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ谪<DCB0><E8B0AA> <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int iNowJob = m_pSession->GetUserJob();
int iNowJobDeep = 0;
int iNowRootJob = 0;
for (int i = 0; i < pJobTable->GetItemCount(); ++i)
{
int iItemID = pJobTable->GetItemID(i);
if (iItemID == iNowJob)
{
iNowJobDeep = pJobTable->GetFieldFromLablePtr(iItemID, "_JobNumber")->GetInteger();
iNowRootJob = pJobTable->GetFieldFromLablePtr(iItemID, "_BaseClass")->GetInteger();
break;
}
}
int iJobIDToChange = pPacket->nSelectedClass;
// <20>ٲٱ<D9B2> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ谡 <20><><EFBFBD>ų<EFBFBD> ū<><C5AB> Ȯ<><C8AE>.
bool bSuccess = false;
map<int, int> mapRootJob;
for (int i = 0; i < pJobTable->GetItemCount(); ++i)
{
int iItemID = pJobTable->GetItemID(i);
if (iItemID == iJobIDToChange)
{
int iJobRootToChange = pJobTable->GetFieldFromLablePtr(iItemID, "_BaseClass")->GetInteger();
if (iNowRootJob == iJobRootToChange)
{
int iJobDeepToChange = pJobTable->GetFieldFromLablePtr(iItemID, "_JobNumber")->GetInteger();
if (iNowJobDeep < iJobDeepToChange)
{
// <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>¾ƾ<C2BE> <20><>.
int iParentJobID = pJobTable->GetFieldFromLablePtr(iItemID, "_ParentJob")->GetInteger();
if (iParentJobID == iNowJob)
{
m_pSession->SetUserJob(iJobIDToChange);
// <20>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.(#19141)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ġƮŰ<C6AE><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>ų <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
#ifdef _VILLAGESERVER
for (int nSkillPage = DualSkill::Type::Primary; nSkillPage < DualSkill::Type::MAX; nSkillPage++)
m_pSession->GetSkill()->ResetSkill(nSkillPage);
#endif // #ifdef _VILLAGESERVER
bSuccess = true;
}
else
{
// <20>ٲٰ<D9B2><D9B0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>.
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.!!\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
return false;
}
}
else
{
// <20>ٲٰ<D9B2><D9B0><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD>. <20><><EFBFBD>ٲ<EFBFBD>.
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!!\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
return false;
}
}
else
{
// <20>ٲٰ<D9B2><D9B0><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD>ٲ<EFBFBD>.
wstring wszString = FormatW(L"<EFBFBD>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!!\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
return false;
}
}
}
if (false == bSuccess)
{
wstring wszString = FormatW(L"<EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> Job ID <20>Դϴ<D4B4>..\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size() * sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
return false;
}
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvItemMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case eItem::CS_REMOVECASH:
{
if (sizeof(CSRemoveCash) != nLen)
return ERROR_INVALIDPACKET;
CSRemoveCash *pItem = (CSRemoveCash*)pData;
if (!IsNoneWindowState() && !IsWindowState(WINDOW_BLIND)){
SendRemoveCash(NULL, ERROR_ITEM_FAIL);
return ERROR_NONE;
}
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
int nRet = m_pItem->OnRecvRemoveCash(pItem->biItemSerial, pItem->bRecovery);
if (nRet != ERROR_NONE)
SendRemoveCash(NULL, nRet);
return ERROR_NONE;
}
break;
#if defined(PRE_ADD_EQUIPLOCK)
case eItem::CS_ITEM_LOCK_REQ:
{
if(sizeof(CSItemLockReq) != nLen)
return ERROR_INVALIDPACKET;
CSItemLockReq *pItem = (CSItemLockReq*)pData;
DBDNWorldDef::ItemLocation::eCode Code;
if(pItem->IsCashEquip)
Code = DBDNWorldDef::ItemLocation::CashEquip;
else
Code = DBDNWorldDef::ItemLocation::Equip;
//<2F>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><><C8A4> <20>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><>ġ<EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> Ȯ<><C8AE>
if( !m_pItem->IsValidEquipLockSlot(Code, pItem->nItemSlotIndex, pItem->biItemSerial) )
return ERROR_ITEM_NOTFOUND;
#if defined(_GAMESERVER)
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>
if (!m_pSession->GetGameRoom() || m_pSession->GetGameRoom()->bIsZombieMode())
return ERROR_NONE;
#endif // #if defined(_GAMESERVER)
GetDBConnection()->QueryAddLockItem(static_cast<CDNUserSession*>(this), Code, pItem->nItemSlotIndex);
return ERROR_NONE;
}
break;
case eItem::CS_ITEM_UNLOCK_REQ:
{
if(sizeof(CSItemLockReq) != nLen)
return ERROR_INVALIDPACKET;
CSItemLockReq *pItem = (CSItemLockReq*)pData;
DBDNWorldDef::ItemLocation::eCode Code;
if(pItem->IsCashEquip)
Code = DBDNWorldDef::ItemLocation::CashEquip;
else
Code = DBDNWorldDef::ItemLocation::Equip;
//<2F>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><><C8A4> <20>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><>ġ<EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> Ȯ<><C8AE>
if( !m_pItem->IsValidEquipLockSlot(Code, pItem->nItemSlotIndex, pItem->biItemSerial) )
return ERROR_ITEM_NOTFOUND;
#if defined(_GAMESERVER)
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>
if (!m_pSession->GetGameRoom() || m_pSession->GetGameRoom()->bIsZombieMode())
return ERROR_NONE;
#endif // #if defined(_GAMESERVER)
GetDBConnection()->QueryRequestItemLock(static_cast<CDNUserSession*>(this), Code, pItem->nItemSlotIndex, (int)CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::ItemUnLockWaitTime));
return ERROR_NONE;
}
break;
#endif // #if defined(PRE_ADD_EQUIPLOCK)
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvItemGoodsMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case eItemGoods::CS_UNSEAL:
{
if (sizeof(CSUnSealItem) != nLen)
return ERROR_INVALIDPACKET;
CSUnSealItem* pItem = (CSUnSealItem*)pData;
int nRet = m_pItem->UnsealItem(pItem->cInvenIndex, pItem->biInvenSerial);
SendUnsealItemResult(nRet, pItem->cInvenIndex);
return ERROR_NONE;
}
break;
case eItemGoods::CS_SEAL:
{
if (sizeof(CSSealItem) != nLen)
return ERROR_INVALIDPACKET;
CSSealItem *pItem = (CSSealItem*)pData;
int nRet = m_pItem->SealItem(pItem->cInvenIndex, pItem->biInvenSerial, pItem->biItemSerial);
SendSealItemResult(nRet, pItem->cInvenIndex);
return ERROR_NONE;
}
break;
case eItemGoods::CS_POTENTIALJEWEL:
{
if (sizeof(CSPotentialItem) != nLen)
return ERROR_INVALIDPACKET;
#if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
m_pItem->ResetPrevPotentialData();
#endif // #if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
CSPotentialItem *pItem = (CSPotentialItem *)pData;
int nRet = m_pItem->PotentialItem( pItem->cInvenIndex, pItem->biInvenSerial, pItem->biItemSerial );
SendPotentialItemResult( nRet, pItem->cInvenIndex );
return ERROR_NONE;
}
break;
case eItemGoods::CS_POTENTIALJEWEL888:
{
if (sizeof(CSPotentialItem) != nLen)
return ERROR_INVALIDPACKET;
#if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
m_pItem->ResetPrevPotentialData();
#endif // #if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
CSPotentialItem *pItem = (CSPotentialItem *)pData;
int nRet = m_pItem->PotentialItem888(pItem->cInvenIndex, pItem->biInvenSerial, pItem->biItemSerial);
SendPotentialItemResult(nRet, pItem->cInvenIndex);
return ERROR_NONE;
}
break;
case eItemGoods::CS_POTENTIALJEWEL999:
{
if (sizeof(CSPotentialItem) != nLen)
return ERROR_INVALIDPACKET;
#if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
m_pItem->ResetPrevPotentialData();
#endif // #if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
CSPotentialItem *pItem = (CSPotentialItem *)pData;
int nRet = m_pItem->PotentialItem999(pItem->cInvenIndex, pItem->biInvenSerial, pItem->biItemSerial);
SendPotentialItemResult(nRet, pItem->cInvenIndex);
return ERROR_NONE;
}
break;
#if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
case eItemGoods::CS_POTENTIALJEWEL_ROLLBACK:
{
if (sizeof(CSPotentialItem) != nLen)
return ERROR_INVALIDPACKET;
CSPotentialItem *pItem = (CSPotentialItem *)pData;
int nRet = m_pItem->RollbackPotentialItem(pItem->cInvenIndex, pItem->biInvenSerial, pItem->biItemSerial);
m_pItem->ResetPrevPotentialData();
SendPotentialItemRollbackResult(nRet);
return ERROR_NONE;
}
break;
#endif //#if defined(PRE_MOD_POTENTIAL_JEWEL_RENEWAL)
case eItemGoods::CS_GUILDRENAME :
{
if (sizeof(CSGuildRename) != nLen)
return ERROR_INVALIDPACKET;
CSGuildRename *pGuildRename = (CSGuildRename*)pData;
m_pItem->RequestChangeGuildNameItem(pGuildRename);
return ERROR_NONE;
}
break;
case eItemGoods::CS_CHARACTERRENAME:
{
if (sizeof(CSCharacterRename) != nLen)
return ERROR_INVALIDPACKET;
CSCharacterRename *pPacket = (CSCharacterRename*)pData;
m_pItem->RequestChangeCharacterNameItem(pPacket);
return ERROR_NONE;
}
break;
case eItemGoods::CS_CHANGEPETNAME:
{
if (sizeof(CSChangePetName) != nLen)
return ERROR_INVALIDPACKET;
CSChangePetName *pPacket = (CSChangePetName*)pData;
m_pItem->RequestChangePetName(pPacket);
return ERROR_NONE;
}
break;
case eItemGoods::CS_GUILDMARK :
{
if (sizeof(CSGuildMark) != nLen)
return ERROR_INVALIDPACKET;
CSGuildMark *pGuildMark = (CSGuildMark*)pData;
int nRet = m_pItem->ChangeGuildMark(pGuildMark);
if (nRet != ERROR_NONE)
SendGuildMarkResult(nRet, 0, 0, 0);
return ERROR_NONE;
}
break;
case eItemGoods::CS_CHARMITEMREQUEST:
{
if (sizeof(CSCharmItemRequest) != nLen)
return ERROR_INVALIDPACKET;
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
CSCharmItemRequest *pItem = (CSCharmItemRequest*)pData;
int nRet = m_pItem->RequestCharmItem(pItem);
if (nRet != ERROR_NONE){
IsWindowStateNoneSet(WINDOW_PROGRESS);
SendCharmItemRequest(pItem->cInvenType, -1, 0, nRet);
}
return ERROR_NONE;
}
break;
case eItemGoods::CS_CHARMITEMCOMPLETE:
{
if (!m_pItem->IsValidRequestTimer(CDNUserItem::RequestType_UseRandomItem)) break;
if (sizeof(CSCharmItemComplete) != nLen)
return ERROR_INVALIDPACKET;
CSCharmItemComplete *pItem = (CSCharmItemComplete *)pData;
int nRet = m_pItem->CompleteCharmItem(pItem);
if (nRet != ERROR_NONE){
SendCharmItemComplete(pItem->cInvenType, -1, 0, 0, nRet);
}
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
case eItemGoods::CS_CHARMITEMCANCEL:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
m_pItem->SetRequestTimer(CDNUserItem::RequestType_None, 0);
m_pSession->BroadcastingEffect(EffectType_Random, EffectState_Cancel);
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
#if defined (PRE_ADD_CHAOSCUBE)
case eItemGoods::CS_CHAOSCUBEREQUEST:
{
if (sizeof(CSChaosCubeRequest) != nLen)
return ERROR_INVALIDPACKET;
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
CSChaosCubeRequest *pItem = (CSChaosCubeRequest*)pData;
if (!m_pItem->RequestChaosCube(pItem))
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
case eItemGoods::CS_CHAOSCUBECOMPLETE:
{
if (!m_pItem->IsValidRequestTimer(CDNUserItem::RequestType_UseRandomItem))
break;
if (sizeof(CSChaosCubeComplete) != nLen)
return ERROR_INVALIDPACKET;
CSChaosCubeComplete *pItem = (CSChaosCubeComplete *)pData;
if (m_pItem->CompleteChaosCube(pItem) == false)
_DANGER_POINT();
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
case eItemGoods::CS_CHAOSCUBECANCEL:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
m_pItem->SetRequestTimer(CDNUserItem::RequestType_None, 0);
m_pSession->BroadcastingEffect(EffectType_Random, EffectState_Cancel);
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
#endif // #if defined (PRE_ADD_CHAOSCUBE)
#if defined (PRE_ADD_BESTFRIEND)
case eItemGoods::CS_BESTFRIENDREQUEST:
{
if (sizeof(CSBestFriendItemRequest) != nLen)
return ERROR_INVALIDPACKET;
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
CSBestFriendItemRequest *pItem = (CSBestFriendItemRequest*)pData;
if (!m_pItem->RequestBestFriendItem(pItem))
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
case eItemGoods::CS_BESTFRIENDCOMPLETE:
{
if (!m_pItem->IsValidRequestTimer(CDNUserItem::RequestType_UseRandomItem)) break;
if (sizeof(CSBestFriendItemComplete) != nLen)
return ERROR_INVALIDPACKET;
CSBestFriendItemComplete *pItem = (CSBestFriendItemComplete *)pData;
if (m_pItem->CompleteBestFriendItem(pItem) == false)
_DANGER_POINT();
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
case eItemGoods::CS_BESTFRIENDCANCEL:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
m_pItem->SetRequestTimer(CDNUserItem::RequestType_None, 0);
m_pSession->BroadcastingEffect(EffectType_Random, EffectState_Cancel);
IsWindowStateNoneSet(WINDOW_PROGRESS);
return ERROR_NONE;
}
break;
#endif // #if defined (PRE_ADD_BESTFRIEND)
case eItemGoods::CS_ENCHANTJEWEL:
{
if (sizeof(CSEnchantJewelItem) != nLen)
return ERROR_INVALIDPACKET;
CSEnchantJewelItem *pItem = (CSEnchantJewelItem *)pData;
int nRet = m_pItem->EnchantJewel( pItem->cInvenIndex, pItem->biInvenSerial, pItem->biItemSerial );
SendEnchantJewelItemResult( nRet, pItem->cInvenIndex );
return ERROR_NONE;
}
break;
#if defined(PRE_ADD_REMOVE_PREFIX)
case eItemGoods::CS_REMOVE_PREFIX:
{
if (sizeof(CSEnchantJewelItem) != nLen)
return ERROR_INVALIDPACKET;
CSEnchantJewelItem *pItem = (CSEnchantJewelItem *)pData;
int nRet = m_pItem->RemovePrefix( pItem->cInvenIndex, pItem->biInvenSerial, pItem->biItemSerial );
SendRemovePrefixItemResult( nRet, pItem->cInvenIndex );
return ERROR_NONE;
}
break;
#endif // PRE_ADD_REMOVE_PREFIX
case eItemGoods::CS_PETSKILLITEM :
{
if( sizeof(CSPetSkillItem) != nLen)
return ERROR_INVALIDPACKET;
CSPetSkillItem *pItem = (CSPetSkillItem*)pData;
char cSlotNum = 0;
int nSkillID = 0;
int nRet = m_pItem->AddPetSkill( pItem->biItemSerial, cSlotNum, nSkillID );
SendPetSkillItemResult(nRet, cSlotNum, nSkillID);
return ERROR_NONE;
}
break;
case eItemGoods::CS_PETSKILLEXPAND :
{
if( sizeof(CSPetSkillExpand) != nLen)
return ERROR_INVALIDPACKET;
CSPetSkillExpand *pItem = (CSPetSkillExpand*)pData;
int nRet = m_pItem->PetSkillExpand(pItem->biItemSerial);
SendPetSkillExpandResult(nRet);
return ERROR_NONE;
}
break;
case eItemGoods::CS_WARP_VILLAGE_LIST:
{
if (nLen != sizeof(CSWarpVillageList))
return ERROR_INVALIDPACKET;
return OnRecvWarpVillageList((CSWarpVillageList*)pData);
}
break;
case eItemGoods::CS_WARP_VILLAGE:
{
if (nLen != sizeof(CSWarpVillage))
return ERROR_INVALIDPACKET;
return OnRecvWarpVillage((CSWarpVillage*)pData);
}
break;
#ifdef PRE_ADD_EXCHANGE_POTENTIAL
case eItemGoods::CS_EXCHANGE_POTENTIAL:
{
CSExchangePotential * pPacket = (CSExchangePotential*)pData;
// <20><><EFBFBD><EFBFBD> - <20>ٸ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>.
if( !IsNoneWindowState() || IsWindowState(WINDOW_BLIND) )
{
_DANGER_POINT_MSG(L"EXCHANGE_POTENTIAL window");
SendExchangePotoential(ERROR_GENERIC_INVALIDREQUEST);
}
else
{
if (GetItem() == NULL)
{
_DANGER_POINT_MSG(L"EXCHANGE_POTENTIAL GetItem");
SendExchangePotoential(ERROR_GENERIC_UNKNOWNERROR);
return ERROR_NONE;
}
//<2F>ϴ<EFBFBD><CFB4><EFBFBD> <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
int nRetCode = GetItem()->ExchangePotential(pPacket);
SendExchangePotoential(nRetCode);
}
return ERROR_NONE;
}
break;
#endif //#ifdef PRE_ADD_EXCHANGE_POTENTIAL
#if defined(PRE_ADD_EXCHANGE_ENCHANT)
case eItemGoods::CS_EXCHANGE_ENCHANT:
{
CSExchangeEnchant * pPacket = (CSExchangeEnchant*)pData;
// <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><>..
if( !IsWindowState(WINDOW_BLIND))
SendExchangeEnchant(ERROR_GENERIC_INVALIDREQUEST);
else
{
int nRetCode = m_pItem->ExchangeEnchant(pPacket);
SendExchangeEnchant(nRetCode);
}
return ERROR_NONE;
}
break;
#endif //#if defined(PRE_ADD_EXCHANGE_ENCHANT)
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::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 eTrade::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 eTrade::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 && AccountLevel_DWC != GetAccountLevel())
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>..
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 eTrade::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 eTrade::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( m_pSession );
return ERROR_NONE;
}
case eTrade::CS_REPAIR_EQUIP: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
//rlkt_repair
// 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 eTrade::CS_REPAIR_ALL: // <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>
{
//rlkt_repair
// 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)
// exchange <20><><EFBFBD>ΰŷ<CEB0>
case eTrade::CS_EXCHANGE_REQUEST: // <20>ŷ<EFBFBD> <20><>û
{
if (sizeof(CSExchangeRequest) != nLen)
return ERROR_INVALIDPACKET;
CSExchangeRequest *pRequest = (CSExchangeRequest*)pData;
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ִ°<D6B4><C2B0><EFBFBD>
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
{
SendExchangeReject(pRequest->nReceiverSessionID, ERROR_EXCHANGE_CANTEXCHANGE);
return ERROR_NONE;
}
if( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::LimitLevel_Exchange )) )
{
SendExchangeReject(pRequest->nReceiverSessionID, ERROR_GENERIC_LEVELLIMIT);
return ERROR_NONE;
}
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSession(pRequest->nReceiverSessionID);
#elif defined(_GAMESERVER)
CDNUserSession *pUserSession = m_pSession->FindUserSession(pRequest->nReceiverSessionID); // <20><><EFBFBD><EFBFBD> ã<><C3A3>
#endif
if (!pUserSession){
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_USERNOTFOUND);
return ERROR_NONE;
}
// <20><EFBFBD><EEBFB5> <20>ŷ<EFBFBD> üũ
if ((GetAccountLevel() >= AccountLevel_New) && (GetAccountLevel() < AccountLevel_Master)){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD>
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
#if defined(PRE_ADD_36935)
// <20>ŷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ŷ<EFBFBD> üũ
if ((pUserSession->GetAccountLevel() >= AccountLevel_New) && (pUserSession->GetAccountLevel() < AccountLevel_Master)){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD>
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
#endif // #if defined(PRE_ADD_36935)
#if defined(_VILLAGESERVER)
if (GetChannelID() != pUserSession->GetChannelID()){ // <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
#elif defined(_GAMESERVER)
#if defined( PRE_WORLDCOMBINE_PARTY )
if( m_pSession->GetGameRoom()->bIsWorldCombineParty() )
{
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
if (GetRoomID() != pUserSession->GetRoomID()){ // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
if (m_pSession->GetPlayerActor()->IsDie() || m_pSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
if (pUserSession->GetPlayerActor()->IsDie() || pUserSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
#if defined(PRE_ADD_EQUIPLOCK)
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD>
if (!pUserSession->GetGameRoom() || pUserSession->GetGameRoom()->bIsZombieMode())
{
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
#endif // #if defined(PRE_ADD_EQUIPLOCK)
#endif
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>ŷ<EFBFBD> <20><>û<EFBFBD>Ұ<EFBFBD>
if( m_pIsolate && m_pIsolate->IsIsolateItem(pUserSession->GetCharacterName()))
{
SendIsolateResult(ERROR_ISOLATE_REQUESTFAIL);
return ERROR_NONE;
}
//<2F>ŷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD>
if( pUserSession->GetIsolate() && pUserSession->GetIsolate()->IsIsolateItem(GetCharacterName()))
{
SendExchangeReject(pRequest->nReceiverSessionID);
return ERROR_NONE;
}
//<2F>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0BCAE> <20>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (pUserSession->GetRestraint()->CheckRestraint(_RESTRAINTTYPE_TRADE, false) == false)
{
SendExchangeReject(pRequest->nReceiverSessionID, ERROR_EXCHANGE_CANTEXCHANGE);
return ERROR_NONE;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӿɼ<D3BF> üũ
if (pUserSession->IsAcceptAbleOption(GetCharacterDBID(), GetAccountDBID(), _ACCEPTABLE_CHECKTYPE_TRADEREQUEST) == false)
{
SendExchangeReject(pRequest->nReceiverSessionID, ERROR_EXCHANGE_CANTEXCHANGE);
return ERROR_NONE;
}
if( pUserSession->GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::LimitLevel_Exchange )) )
{
SendExchangeReject(pRequest->nReceiverSessionID, ERROR_GENERIC_LEVELLIMIT);
return ERROR_NONE;
}
if( !IsNoneWindowState() || !pUserSession->IsNoneWindowState() )
{
// <20><><EFBFBD><EFBFBD> None <20><><EFBFBD>°<EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20>ϼ<EFBFBD> <20>ִ<EFBFBD>.
if( IsWindowState(WINDOW_EXCHANGE) && pRequest->bCancel && pUserSession->IsWindowState(WINDOW_EXCHANGE) && m_nExchangeReceiverSID == pRequest->nReceiverSessionID)
{
pUserSession->SendExchangeRequest(m_nSessionID, ERROR_EXCHANGE_SENDERCANCEL); // <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ưâ <20><><EFBFBD>ֱ<EFBFBD>
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
// <20>װ<EFBFBD> <20>ƴϸ<C6B4> <20>׳<EFBFBD> <20>ŷ<EFBFBD> <20>ȵǿ<C8B5>..(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>)
SendExchangeRequest(pRequest->nReceiverSessionID, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
SetWindowState(WINDOW_EXCHANGE);
pUserSession->SetWindowState(WINDOW_EXCHANGE);
pUserSession->SendExchangeRequest(m_nSessionID, ERROR_NONE); // <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ưâ <20><>û
m_nExchangeReceiverSID = pRequest->nReceiverSessionID; // <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pUserSession->m_nExchangeSenderSID = m_nSessionID;
return ERROR_NONE;
}
break;
case eTrade::CS_EXCHANGE_ACCEPT: // <20>ŷ<EFBFBD> <20><><EFBFBD><EFBFBD>
{
if (sizeof(CSExchangeAccept) != nLen)
return ERROR_INVALIDPACKET;
CSExchangeAccept *pAccept = (CSExchangeAccept*)pData;
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSession(pAccept->nSenderSessionID);
#elif defined(_GAMESERVER)
CDNUserSession *pUserSession = m_pSession->FindUserSession(pAccept->nSenderSessionID); // <20><><EFBFBD><EFBFBD> ã<><C3A3>
#endif
if (!pUserSession){
SendExchangeStart(pAccept->nSenderSessionID, ERROR_EXCHANGE_USERNOTFOUND);
ClearExchangeInfo();
return ERROR_NONE;
}
// <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> WINDOW_EXCHANGE <20><> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><>
if( !IsWindowState(WINDOW_EXCHANGE) || !pUserSession->IsWindowState(WINDOW_EXCHANGE) )
{
SendExchangeStart(pAccept->nSenderSessionID, ERROR_EXCHANGE_FAIL);
pUserSession->SendExchangeStart(m_nSessionID, ERROR_EXCHANGE_FAIL);
#ifdef PRE_FIX_CANCELTRADE
if (pUserSession->IsWindowState(WINDOW_EXCHANGE))
pUserSession->ClearExchangeInfo();
#endif
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
else
{
if( pUserSession->m_nExchangeReceiverSID != m_nSessionID || m_nExchangeSenderSID != pAccept->nSenderSessionID )
{
//<2F><><EFBFBD><EFBFBD> ¦<><C2A6> <20>ȸ<EFBFBD><C8B8><EFBFBD>..<2E>̰<EFBFBD> <20><><EFBFBD><EFBFBD>..?
SendExchangeStart(pAccept->nSenderSessionID, ERROR_EXCHANGE_FAIL);
ClearExchangeInfo();
return ERROR_NONE;
}
}
#if defined(_VILLAGESERVER)
if (GetChannelID() != pUserSession->GetChannelID()){ // <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
SendExchangeStart(pAccept->nSenderSessionID, ERROR_EXCHANGE_FAIL);
pUserSession->SendExchangeStart(m_nSessionID, ERROR_EXCHANGE_FAIL);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#elif defined(_GAMESERVER)
if (GetRoomID() != pUserSession->GetRoomID()){
SendExchangeStart(pAccept->nSenderSessionID, ERROR_EXCHANGE_FAIL);
pUserSession->SendExchangeStart(m_nSessionID, ERROR_EXCHANGE_FAIL);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (m_pSession->GetPlayerActor()->IsDie() || m_pSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeStart(pAccept->nSenderSessionID, ERROR_EXCHANGE_FAIL);
pUserSession->SendExchangeStart(m_nSessionID, ERROR_EXCHANGE_FAIL);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (pUserSession->GetPlayerActor()->IsDie() || pUserSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeStart(pAccept->nSenderSessionID, ERROR_EXCHANGE_FAIL);
pUserSession->SendExchangeStart(m_nSessionID, ERROR_EXCHANGE_FAIL);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#if defined(PRE_ADD_EQUIPLOCK)
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD>
if (!pUserSession->GetGameRoom() || pUserSession->GetGameRoom()->bIsZombieMode())
{
SendExchangeStart(pAccept->nSenderSessionID, ERROR_EXCHANGE_FAIL);
pUserSession->SendExchangeStart(m_nSessionID, ERROR_EXCHANGE_FAIL);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#endif // #if defined(PRE_ADD_EQUIPLOCK)
#endif
if (pAccept->bAccept){ // <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SetExchangeTargetSessionID(pAccept->nSenderSessionID);
SendExchangeStart(pAccept->nSenderSessionID, ERROR_NONE);
// <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pUserSession->SetExchangeTargetSessionID(m_nSessionID);
pUserSession->SendExchangeStart(m_nSessionID, ERROR_NONE);
}
else { // <20><><EFBFBD><EFBFBD>
pUserSession->SendExchangeReject(m_nSessionID);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
}
return ERROR_NONE;
}
break;
case eTrade::CS_EXCHANGE_ADDITEM: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
if (sizeof(CSExchangeAddItem) != nLen)
return ERROR_INVALIDPACKET;
CSExchangeAddItem *pAddItem = (CSExchangeAddItem*)pData;
// #23747 ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̻<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ũ <20><><EFBFBD><EFBFBD>
if( pAddItem->wCount <= 0 )
return ERROR_INVALIDPACKET;
TItem Item = { 0, };
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSession(m_nExchangeTargetSessionID);
#elif defined(_GAMESERVER)
CDNUserSession *pUserSession = m_pSession->FindUserSession(m_nExchangeTargetSessionID); // <20><><EFBFBD><EFBFBD> ã<><C3A3>
#endif
if (!pUserSession){
SendExchangeAddItem(m_nSessionID, pAddItem->cExchangeIndex, -1, Item, ERROR_EXCHANGE_USERNOTFOUND);
return ERROR_NONE;
}
#if defined(_VILLAGESERVER)
if (GetChannelID() != pUserSession->GetChannelID()){ // <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#elif defined(_GAMESERVER)
if (GetRoomID() != pUserSession->GetRoomID()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (m_pSession->GetPlayerActor()->IsDie() || m_pSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (pUserSession->GetPlayerActor()->IsDie() || pUserSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#endif
if ( !IsWindowState(WINDOW_EXCHANGE) ){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>߰<EFBFBD><DFB0>Ѵٸ<D1B4>
if (m_pItem->GetExchangeRegist()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>߰<EFBFBD><DFB0>Ѵٸ<D1B4>
if (m_pItem->GetExchangeConfirm()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
char cExchangeIndex = -1;
int nRet = m_pItem->AddExchangeItem(pAddItem);
if (nRet != ERROR_NONE){
SendExchangeAddItem(m_nSessionID, pAddItem->cExchangeIndex, -1, Item, nRet);
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>
if (m_pItem->GetInventory(pAddItem->cInvenIndex)){
Item = *(m_pItem->GetInventory(pAddItem->cInvenIndex));
Item.wCount = pAddItem->wCount;
}
SendExchangeAddItem(m_nSessionID, cExchangeIndex, pAddItem->cInvenIndex, Item, ERROR_NONE);
pUserSession->SendExchangeAddItem(m_nSessionID, pAddItem->cExchangeIndex, pAddItem->cInvenIndex, Item, ERROR_NONE);
return ERROR_NONE;
}
break;
case eTrade::CS_EXCHANGE_DELETEITEM: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (sizeof(CSExchangeDeleteItem) != nLen)
return ERROR_INVALIDPACKET;
CSExchangeDeleteItem *pDeleteItem = (CSExchangeDeleteItem*)pData;
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSession(m_nExchangeTargetSessionID);
#elif defined(_GAMESERVER)
CDNUserSession *pUserSession = m_pSession->FindUserSession(m_nExchangeTargetSessionID); // <20><><EFBFBD><EFBFBD> ã<><C3A3>
#endif
if (!pUserSession){
SendExchangeDeleteItem(m_nSessionID, pDeleteItem->cExchangeIndex, ERROR_EXCHANGE_USERNOTFOUND);
return ERROR_NONE;
}
#if defined(_VILLAGESERVER)
if (GetChannelID() != pUserSession->GetChannelID()){ // <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#elif defined(_GAMESERVER)
if (GetRoomID() != pUserSession->GetRoomID()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (m_pSession->GetPlayerActor()->IsDie() || m_pSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (pUserSession->GetPlayerActor()->IsDie() || pUserSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#endif
if ( !IsWindowState(WINDOW_EXCHANGE) ){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<D1B4>
if (m_pItem->GetExchangeRegist()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<D1B4>
if (m_pItem->GetExchangeConfirm()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
int nRet = m_pItem->DeleteExchangeItem(pDeleteItem->cExchangeIndex);
if (nRet != ERROR_NONE){
SendExchangeDeleteItem(m_nSessionID, pDeleteItem->cExchangeIndex, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>
SendExchangeDeleteItem(m_nSessionID, pDeleteItem->cExchangeIndex, ERROR_NONE);
pUserSession->SendExchangeDeleteItem(m_nSessionID, pDeleteItem->cExchangeIndex, ERROR_NONE);
return ERROR_NONE;
}
break;
case eTrade::CS_EXCHANGE_ADDCOIN: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
if (sizeof(CSExchangeAddCoin) != nLen)
return ERROR_INVALIDPACKET;
CSExchangeAddCoin *pAddCoin = (CSExchangeAddCoin*)pData;
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSession(m_nExchangeTargetSessionID);
#elif defined(_GAMESERVER)
CDNUserSession *pUserSession = m_pSession->FindUserSession(m_nExchangeTargetSessionID); // <20><><EFBFBD><EFBFBD> ã<><C3A3>
#endif
if (!pUserSession){
SendExchangeAddCoin(m_nSessionID, pAddCoin->nCoin, ERROR_EXCHANGE_USERNOTFOUND);
return ERROR_NONE;
}
#if defined(_VILLAGESERVER)
if (GetChannelID() != pUserSession->GetChannelID()){ // <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#elif defined(_GAMESERVER)
if (GetRoomID() != pUserSession->GetRoomID()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (m_pSession->GetPlayerActor()->IsDie() || m_pSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (pUserSession->GetPlayerActor()->IsDie() || pUserSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#endif
if ( !IsWindowState(WINDOW_EXCHANGE) ){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD>
if (m_pItem->GetExchangeRegist()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD>
if (m_pItem->GetExchangeConfirm()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (!CheckEnoughCoin(pAddCoin->nCoin)){
SendExchangeAddCoin(m_nSessionID, pAddCoin->nCoin, ERROR_ITEM_INSUFFICIENCY_MONEY);
return ERROR_NONE;
}
int nRet = m_pItem->AddExchangeCoin(pAddCoin->nCoin);
if (nRet != ERROR_NONE){
SendExchangeAddCoin(m_nSessionID, pAddCoin->nCoin, ERROR_EXCHANGE_FAIL);
return ERROR_NONE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>
SendExchangeAddCoin(m_nSessionID, pAddCoin->nCoin, ERROR_NONE);
pUserSession->SendExchangeAddCoin(m_nSessionID, pAddCoin->nCoin, ERROR_NONE);
return ERROR_NONE;
}
break;
case eTrade::CS_EXCHANGE_CONFIRM: // Ȯ<><C8AE>
{
if (sizeof(CSExchangeConfirm) != nLen)
return ERROR_INVALIDPACKET;
CSExchangeConfirm *pConfirm = (CSExchangeConfirm*)pData;
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSession(m_nExchangeTargetSessionID);
#elif defined(_GAMESERVER)
CDNUserSession *pUserSession = m_pSession->FindUserSession(m_nExchangeTargetSessionID); // <20><><EFBFBD><EFBFBD> ã<><C3A3>
#endif
if (!pUserSession){
SendExchangeCancel();
ClearExchangeInfo();
return ERROR_NONE;
}
// <20>߱<EFBFBD> <20><><EFBFBD>۳<EFBFBD><DBB3><EFBFBD>
if ( GetAccountDBID() == pUserSession->GetAccountDBID() )
{
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
m_pSession->DetachConnection(L"TradeHack");
g_Log.Log(LogType::_HACK, m_pSession, L"[ADBID:%u CDBID:%I64d SID:%u] Same Account Trade Hack\r\n", m_nAccountDBID, m_biCharacterDBID, m_nSessionID);
pUserSession->DetachConnection(L"TradeHack");
g_Log.Log(LogType::_HACK, m_pSession, L"[ADBID:%u CDBID:%I64d SID:%u] Same Account Trade Hack\r\n", pUserSession->GetAccountDBID(), pUserSession->GetCharacterDBID(), pUserSession->GetSessionID() );
return ERROR_NONE;
}
//<2F>ŷ<EFBFBD><C5B7><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20>̾ <20><> <20><><EFBFBD><EFBFBD>
if (m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false || \
pUserSession->GetRestraint()->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
{
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#if defined(_VILLAGESERVER)
if (GetChannelID() != pUserSession->GetChannelID()){ // <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#elif defined(_GAMESERVER)
if (GetRoomID() != pUserSession->GetRoomID()){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (m_pSession->GetPlayerActor()->IsDie() || m_pSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
if (pUserSession->GetPlayerActor()->IsDie() || pUserSession->GetPlayerActor()->IsGhost()){ // <20>׾<EFBFBD><D7BE>ų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20>ȵ<EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#if defined(PRE_ADD_EQUIPLOCK)
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD>
if (!pUserSession->GetGameRoom() || pUserSession->GetGameRoom()->bIsZombieMode())
{
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
#endif // #if defined(PRE_ADD_EQUIPLOCK)
#endif
if ( !IsWindowState(WINDOW_EXCHANGE) ){
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
switch(pConfirm->cType)
{
case EXCHANGE_REGIST:
{
if (m_pItem->GetExchangeRegist() || m_pItem->GetExchangeConfirm()){ // <20>̹<EFBFBD> <20><><EFBFBD>ϻ<EFBFBD><CFBB>°ų<C2B0> <20><><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE><EFBFBD>ε<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
m_pItem->SetExchangeRegist(); // <20><>ư <20><><EFBFBD><EFBFBD>
SendExchangeConfirm(m_nSessionID, pConfirm->cType);
pUserSession->SendExchangeConfirm(m_nSessionID, pConfirm->cType);
break;
}
case EXCHANGE_CONFIRM:
{
if (!m_pItem->GetExchangeRegist() || m_pItem->GetExchangeConfirm()){ // <20><><EFBFBD>ϻ<EFBFBD><CFBB>°<EFBFBD> <20>ƴϰų<CFB0> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD>Ȯ<EFBFBD>λ<EFBFBD><CEBB>¸<EFBFBD> <20><><EFBFBD><EFBFBD>
SendExchangeCancel();
ClearExchangeInfo();
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
m_pItem->SetExchangeConfirm(); // <20><>ư <20><><EFBFBD><EFBFBD>
SendExchangeConfirm(m_nSessionID, pConfirm->cType);
pUserSession->SendExchangeConfirm(m_nSessionID, pConfirm->cType);
}
break;
}
// <20>Ѵ<EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD>...
if (m_pItem->GetExchangeConfirm() && pUserSession->GetItem()->GetExchangeConfirm()){
// <20><><EFBFBD><EFBFBD>üũ
if (!CheckMaxCoin(pUserSession->GetItem()->GetExchangeCoin()) || !pUserSession->CheckMaxCoin(m_pItem->GetExchangeCoin())){
SendExchangeComplete(ERROR_EXCHANGE_OVERFLOWMONEY);
pUserSession->SendExchangeComplete(ERROR_EXCHANGE_OVERFLOWMONEY);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
// <20>κ<EFBFBD> <20><><EFBFBD><EFBFBD>
if ((!m_pItem->IsValidExchange(pUserSession->GetItem()->FindExchangeCount())) ||(!pUserSession->GetItem()->IsValidExchange(m_pItem->FindExchangeCount()))){
SendExchangeComplete(ERROR_ITEM_INVENTORY_NOTENOUGH);
pUserSession->SendExchangeComplete(ERROR_ITEM_INVENTORY_NOTENOUGH);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
DBPacket::TExchangeItem ExchangeInfo[EXCHANGEMAX] = { 0, }, TargetExchangeInfo[EXCHANGEMAX] = { 0, };
int nExchangeTax = 0, nTargetExchangeTax = 0;
if ((!m_pItem->CompleteExchange(pUserSession, ExchangeInfo, nExchangeTax)) ||(!pUserSession->GetItem()->CompleteExchange(m_pSession, TargetExchangeInfo, nTargetExchangeTax))){
SendExchangeComplete(ERROR_EXCHANGE_FAIL);
pUserSession->SendExchangeComplete(ERROR_EXCHANGE_FAIL);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
return ERROR_NONE;
}
m_pDBCon->QueryExchangeProperty(m_pSession, ExchangeInfo, m_pItem->GetExchangeCoin(), nExchangeTax, pUserSession->GetCharacterDBID(),
TargetExchangeInfo, pUserSession->GetItem()->GetExchangeCoin(), nTargetExchangeTax, pUserSession->GetAccountDBID());
SendExchangeComplete(ERROR_NONE);
pUserSession->SendExchangeComplete(ERROR_NONE);
ClearExchangeInfo();
pUserSession->ClearExchangeInfo();
}
return ERROR_NONE;
}
break;
case eTrade::CS_EXCHANGE_CANCEL: // <20><><EFBFBD><EFBFBD>
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
#if defined(_VILLAGESERVER)
CDNUserSession *pUserSession = g_pUserSessionManager->FindUserSession(m_nExchangeTargetSessionID);
#elif defined(_GAMESERVER)
CDNUserSession *pUserSession = m_pSession->FindUserSession(m_nExchangeTargetSessionID); // <20><><EFBFBD><EFBFBD> ã<><C3A3>
#endif
if (pUserSession){
pUserSession->SendExchangeCancel();
pUserSession->ClearExchangeInfo();
}
SendExchangeCancel();
ClearExchangeInfo();
return ERROR_NONE;
}
break;
#if defined(PRE_SPECIALBOX)
case eTrade::CS_SPECIALBOX_LIST:
{
m_pDBCon->QueryGetListEventReward(m_pSession);
}
break;
case eTrade::CS_SPECIALBOX_ITEMLIST:
{
if (!IsWindowState(WINDOW_BLIND)){
SendSpecialBoxItemList(ERROR_GENERIC_INVALIDREQUEST, 0, NULL, 0);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (sizeof(CSSpecialBoxItemList) != nLen)
return ERROR_INVALIDPACKET;
CSSpecialBoxItemList *pSpecialBox = (CSSpecialBoxItemList*)pData;
if (pSpecialBox->nEventRewardID <= 0){
SendSpecialBoxItemList(ERROR_GENERIC_INVALIDREQUEST, 0, NULL, 0);
return ERROR_NONE;
}
m_pDBCon->QueryGetListEventRewardItem(m_pSession, pSpecialBox->nEventRewardID);
}
break;
case eTrade::CS_SPECIALBOX_RECEIVEITEM:
{
if (!IsWindowState(WINDOW_BLIND)){
SendReceiveSpecialBoxItem(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE; // <20>ٸ<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>
}
if (sizeof(CSReceiveSpecialBoxItem) != nLen)
return ERROR_INVALIDPACKET;
CSReceiveSpecialBoxItem *pSpecialBox = (CSReceiveSpecialBoxItem*)pData;
if (pSpecialBox->nEventRewardID <= 0){
SendReceiveSpecialBoxItem(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
int nRet = m_pItem->CheckReceiveSpecialBox(pSpecialBox->nEventRewardID, pSpecialBox->nItemID);
if (nRet != ERROR_NONE){
SendReceiveSpecialBoxItem(nRet);
return ERROR_NONE;
}
m_pDBCon->QueryAddEventRewardReceiver(m_pSession, pSpecialBox->nEventRewardID, pSpecialBox->nItemID);
}
break;
#endif // #if defined(PRE_SPECIALBOX)
}
return ERROR_NONE;
}
int CDNUserBase::OnRecvCashShopMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case eCashShop::CS_BALANCEINQUIRY:
{
int nRet = _OnCashBalanceInquiry();
if (nRet != ERROR_NONE)
SendCashShopBalanceInquiry(nRet, 0, 0);
}
break;
case eCashShop::CS_SHOPOPEN:
{
int nRet = _OnCashShopOpen();
if (nRet != ERROR_NONE)
SendCashShopOpen((UINT)GetCashBalance(), GetPetal(), nRet, NULL);
}
break;
case eCashShop::CS_SHOPCLOSE:
{
IsWindowStateNoneSet(WINDOW_CASHSHOP);
SendCashShopClose(ERROR_NONE);
}
break;
case eCashShop::CS_BUY:
{
CSCashShopBuy *pCashShop = (CSCashShopBuy*)pData;
int nRet = _OnCashBuy(pCashShop);
if (nRet != ERROR_NONE)
SendCashShopBuy(0, 0, nRet, pCashShop->cType, 0, NULL);
}
break;
case eCashShop::CS_PACKAGEBUY:
{
CSCashShopPackageBuy *pCashShop = (CSCashShopPackageBuy*)pData;
int nRet = _OnCashPackageBuy(pCashShop);
if (nRet != ERROR_NONE)
SendCashShopPackageBuy(pCashShop->nPackageSN, 0, 0, nRet);
}
break;
case eCashShop::CS_CHECKRECEIVER:
{
CSCashShopCheckReceiver *pCashShop = (CSCashShopCheckReceiver*)pData;
int nRet = _OnCashCheckReceiver(pCashShop);
if (nRet != ERROR_NONE)
SendCashShopCheckReceiver(0, 0, nRet);
}
break;
#if defined(PRE_ADD_CADGE_CASH)
case eCashShop::CS_CADGE:
{
CSCashShopCadge *pCashShop = (CSCashShopCadge*)pData;
int nRet = _OnCashCadge(pCashShop);
if (nRet != ERROR_NONE)
SendCashShopCadge(nRet);
}
break;
#endif // #if defined(PRE_ADD_CADGE_CASH)
case eCashShop::CS_GIFT:
{
CSCashShopGift *pCashShop = (CSCashShopGift*)pData;
int nRet = _OnCashGift(pCashShop);
if (nRet != ERROR_NONE)
SendCashShopGift(0, 0, nRet, 0, 0, NULL);
}
break;
case eCashShop::CS_PACKAGEGIFT:
{
CSCashShopPackageGift *pCashShop = (CSCashShopPackageGift*)pData;
int nRet = _OnCashPackageGift(pCashShop);
if (nRet != ERROR_NONE)
SendCashShopPackageGift(pCashShop->nPackageSN, 0, 0, nRet);
}
break;
case eCashShop::CS_GIFTLIST:
{
if( !IsWindowState(WINDOW_CASHSHOP) ){
SendCashShopGiftList(ERROR_GENERIC_INVALIDREQUEST, 0, NULL);
break;
}
m_pDBCon->QueryGetListGiftBox(m_pSession);
}
break;
#if defined(PRE_ADD_68286)
case eCashShop::CS_GIFTLIST_BY_SHORTCUT:
{
SetWindowState(WINDOW_CASHSHOP);
m_pDBCon->QueryGetListGiftBox(m_pSession);
}
break;
#endif // PRE_ADD_68286
case eCashShop::CS_RECEIVEGIFT:
{
if( !IsWindowState(WINDOW_CASHSHOP) ){
SendCashShopReceiveGift(0, ERROR_GENERIC_INVALIDREQUEST);
break;
}
CSCashShopReceiveGift *pCashShop = (CSCashShopReceiveGift*)pData;
#if defined(PRE_RECEIVEGIFTALL)
m_VecReceiveGiftResultList.clear();
m_nReceiveGiftPageCount = 0;
#endif // #if defined(PRE_RECEIVEGIFTALL)
TReceiveGiftData GiftData[GIFTPAGEMAX] = {0,};
GiftData[0] = pCashShop->GiftData;
m_pDBCon->QueryModGiftReceive(m_pSession, false, GiftData);
}
break;
#if defined(PRE_RECEIVEGIFTALL)
case eCashShop::CS_RECEIVEGIFTALL:
{
if( !IsWindowState(WINDOW_CASHSHOP) ){
SendCashShopReceiveGift(0, ERROR_GENERIC_INVALIDREQUEST);
break;
}
if (sizeof(CSCashShopReceiveGiftAll) != nLen)
return ERROR_GENERIC_INVALIDREQUEST;
CSCashShopReceiveGiftAll *pCashShop = (CSCashShopReceiveGiftAll*)pData;
m_VecReceiveGiftResultList.clear();
m_nReceiveGiftPageCount = 0;
if(pCashShop->cCount < 0 || pCashShop->cCount > GIFTPAGEMAX)
return ERROR_GENERIC_INVALIDREQUEST;
TReceiveGiftData GiftData[GIFTPAGEMAX] = {0,};
memcpy(GiftData, pCashShop->GiftData, sizeof(TReceiveGiftData) * pCashShop->cCount);
for (int i = 0; i < pCashShop->cCount; i++){
if (pCashShop->GiftData[i].nGiftDBID <= 0) continue;
if (find(m_VecReceiveGiftResultList.begin(), m_VecReceiveGiftResultList.end(), GiftData[i].nGiftDBID) == m_VecReceiveGiftResultList.end()){
m_VecReceiveGiftResultList.push_back(GiftData[i].nGiftDBID);
}
else{
memset(&(GiftData[i]), 0, sizeof(TReceiveGiftData));
}
}
m_pDBCon->QueryModGiftReceive(m_pSession, true, GiftData);
}
break;
#endif // #if defined(PRE_RECEIVEGIFTALL)
#if defined(PRE_ADD_GIFT_RETURN)
case eCashShop::CS_GIFT_RETURN:
{
if( !IsWindowState(WINDOW_CASHSHOP) ){
SendCashShopGiftReturn(0, ERROR_GENERIC_INVALIDREQUEST);
break;
}
CSCashShopGiftReturn *pCashShop = (CSCashShopGiftReturn*)pData;
m_pDBCon->QueryModGiftRejectFlag(m_pSession, pCashShop->nGiftDBID );
}
break;
#endif
case eCashShop::CS_COUPON:
{
CSCashShopCoupon *pCashShop = (CSCashShopCoupon*)pData;
int nRet = _OnCashCoupon(pCashShop);
if (nRet != ERROR_NONE)
SendCoupon(nRet);
}
break;
#if defined(PRE_ADD_VIP)
case eCashShop::CS_VIPBUY:
{
CSVIPBuy *pCashShop = (CSVIPBuy*)pData;
int nRet = _OnCashVIPBuy(pCashShop);
if (nRet != ERROR_NONE)
SendVIPBuy((UINT)GetCashBalance(), GetPetal(), ERROR_GENERIC_INVALIDREQUEST, 0, 0, false, 0);
}
break;
case eCashShop::CS_VIPGIFT:
{
CSVIPGift *pCashShop = (CSVIPGift*)pData;
int nRet = _OnCashVIPGift(pCashShop);
if (nRet != ERROR_NONE)
SendVIPGift((UINT)GetCashBalance(), GetPetal(), ERROR_GENERIC_INVALIDREQUEST, 0);
}
break;
#endif // #if defined(PRE_ADD_VIP)
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
case eCashShop::CS_MOVE_CASHINVEN:
{
CSMoveCashInven* pCashShop = (CSMoveCashInven*)pData;
int nRet = _OnMoveCashInven(pCashShop);
if (nRet != ERROR_NONE)
SendCashShopMoveCashinven(0, nRet, 0, 0);
}
break;
case eCashShop::CS_CASH_REFUND:
{
CSCashRefund* pCashShop = (CSCashRefund*)pData;
int nRet = _OnCashRefund(pCashShop);
if (nRet != ERROR_NONE)
SendCashShopCashRefund(0, nRet);
}
break;
#endif // #if defined(PRE_ADD_CASH_REFUND)
case eCashShop::CS_CHARGE_TIME:
{
__time64_t tTime;
time(&tTime);
SendCashShopServerTimeForCharge(tTime);
}
break;
#ifdef PRE_ADD_LIMITED_CASHITEM
case eCashShop::CS_LIMITEDCASHITEM:
{
std::vector<LimitedCashItem::TLimitedQuantityCashItem> vList;
g_pLimitedCashItemRepository->GetLimitedItemList(vList);
SendQuantityLimitedItemList(vList);
std::vector<LimitedCashItem::TChangedLimitedQuantity> vChanged;
g_pLimitedCashItemRepository->GetChangedLimitedItemList(vChanged);
SendChangedQuantityItemList(vChanged);
}
break;
#endif //#ifdef PRE_ADD_LIMITED_CASHITEM
}
return ERROR_NONE;
}
int CDNUserBase::OnRecvQuestMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case eQuest::CS_CANCEL_QUEST:
{
if (sizeof(CSCancelQuest) != nLen) {
return ERROR_INVALIDPACKET;
}
CSCancelQuest* pPacket = (CSCancelQuest*)pData;
m_pQuest->OnCancelQuest(pPacket->nQuestIndex);
}
return ERROR_NONE;
case eQuest::CS_SELECT_QUEST_REWARD:
{
if (!IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if (sizeof(CSSelectQuestReward) != nLen) {
return ERROR_INVALIDPACKET;
}
CSSelectQuestReward* pPacket = (CSSelectQuestReward*)pData;
m_pQuest->SavePacketReward(pPacket);
}
return ERROR_NONE;
case eQuest::CS_SHORTCUT_QUEST:
{
#if defined(_VILLAGESERVER)
if (sizeof(CSShortCutQuest) != nLen) {
return ERROR_INVALIDPACKET;
}
CSShortCutQuest* pPacket = (CSShortCutQuest*)pData;
//<2F>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۾<EFBFBD> <20>߰<EFBFBD>
if( pPacket->nQuestID < 3000 || pPacket->nQuestID > 3999) //<2F><><EFBFBD><EFBFBD> <20>Խ<EFBFBD><D4BD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>
{
_DANGER_POINT();
return ERROR_NONE;
}
#if !defined(PRE_FIX_QUEST_GUILD_BOARD) //RewardAfterCompletingQuest <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
if( GetQuest()->GetQuestStep(pPacket->nQuestID) != 2 ) //<2F><><EFBFBD><EFBFBD> <20>Խ<EFBFBD><D4BD><EFBFBD> <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> 2(<28>ӽ<EFBFBD>üũ)
{
_DANGER_POINT();
return ERROR_NONE;
}
#endif
if (m_pQuest->PreparePacketReward(pPacket->nQuestID))
m_pQuest->RewardAfterCompletingQuest(pPacket->nQuestID, true);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
m_pQuest->ResetRewardFlag();
#endif
}
return ERROR_NONE;
#if defined(PRE_ADD_REMOTE_QUEST)
case eQuest::CS_ACCEPT_REMOTE_QEUST:
{
if (sizeof(CSAcceptRemoteQuest) != nLen) {
return ERROR_INVALIDPACKET;
}
CSAcceptRemoteQuest* pPacket = (CSAcceptRemoteQuest*)pData;
GetQuest()->AcceptRemoteQuest(pPacket->nQuestID);
}
return ERROR_NONE;
case eQuest::CS_COMPLETE_REMOTE_QUEST:
{
if (sizeof(CSCompleteRemoteQuest) != nLen) {
return ERROR_INVALIDPACKET;
}
CSCompleteRemoteQuest* pPacket = (CSCompleteRemoteQuest*)pData;
GetQuest()->CompleteRemoteQuest(pPacket->nQuestID, pPacket);
}
return ERROR_NONE;
case eQuest::CS_CANCEL_REMOTE_QUEST:
{
if (sizeof(CSCancelRemoteQuest) != nLen) {
return ERROR_INVALIDPACKET;
}
CSCancelRemoteQuest* pPacket = (CSCancelRemoteQuest*)pData;
GetQuest()->CancelRemoteQuest(pPacket->nQuestID);
}
return ERROR_NONE;
#endif
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvSystemMessage(int nSubCmd, char *pData, int nLen)
{
#pragma warning(disable:4065)
switch(nSubCmd)
{
case eSystem::CS_TCP_PING:
{
if (sizeof(CSTCPPing) != nLen)
return ERROR_INVALIDPACKET;
CSTCPPing* pPacket = reinterpret_cast<CSTCPPing*>(pData);
DWORD dwCur = timeGetTime();
if( dwCur < pPacket->dwTick )
{
_DANGER_POINT();
return ERROR_NONE;
}
DWORD dwGap = (dwCur-pPacket->dwTick);
//rlkt_test
#if defined(_GAMESERVER)
SCFieldPing TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.dwTick = dwGap;
m_pSession->AddSendData( SC_SYSTEM, eSystem::SC_TCP_FIELD_PING, reinterpret_cast<char*>(&TxPacket), sizeof(TxPacket) );
//
#endif
#if defined( _WORK )
//std::cout << "TCPPing=" << dwGap << std::endl;
#endif // #if defined( _WORK )
m_pairTcpPing.first += dwGap;
++m_pairTcpPing.second;
break;
}
#if defined(PRE_ADD_VIP)
case eSystem::CS_VIPAUTOMATICPAY:
{
if (sizeof(CSVIPAutomaticPay) != nLen)
return ERROR_INVALIDPACKET;
CSVIPAutomaticPay *pSystem = (CSVIPAutomaticPay*)pData;
m_bVIPAutoPay = pSystem->bAutomaticPay;
SendVIPAutomaticPay(m_bVIPAutoPay);
}
break;
#endif // #if defined(PRE_ADD_VIP)
#if defined(_GPK)
case eSystem::CS_CHN_GPKDATA:
{
if (sizeof(CSGPKData) != nLen)
return ERROR_INVALIDPACKET;
CSGPKData *pGpk = (CSGPKData*)pData;
m_dwRecvGPKTick = 0;
m_bRespondErr = false;
if (!g_Config.pDynCode->Decode((unsigned char*)pGpk->Data, GPKDATALENMAX, m_nCodeIndex)){
//g_Config.pDynCode->Release();
g_Log.Log(LogType::_GPKERROR, m_pSession, L"[ADBID:%u CDBID:%I64d SID:%u] RequestGPKData error\r\n", m_nAccountDBID, m_biCharacterDBID, m_nSessionID);
return ERROR_NONE;
}
return ERROR_NONE;
}
break;
case eSystem::CS_CHN_GPKAUTHDATA:
{
if (!g_Config.pGpkCmd) break;
if (sizeof(CSGPKAuthData) != nLen)
return ERROR_INVALIDPACKET;
CSGPKAuthData *pGpk = (CSGPKAuthData*)pData;
const unsigned char *p = NULL;
int nRet = g_Config.pGpkCmd->CheckAuthReply(&p, pGpk->Data, pGpk->nLen);
return ERROR_NONE;
}
break;
#endif // #if defined(_GPK)
#if defined(_HSHIELD)
case eSystem::CS_MAKERESPONSE: // HackShield
{
if (sizeof(AHNHS_TRANS_BUFFER) != nLen)
return ERROR_INVALIDPACKET;
DWORD dwCurTick = timeGetTime();
if (dwCurTick - m_dwHShieldResponseTick >= CHECKRESPONSETICK){
#if !defined( _JP )
if (GetAccountLevel() != AccountLevel_Developer)
m_pSession->DetachConnection(L"CS_MAKERESPONSE CHECKRESPONSETICK");
#endif // #if !defined( _JP )
g_Log.Log(LogType::_HACKSHIELD, GetWorldSetID(), m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"[ADBID:%u, CDBID:%I64d, SID:%u] CS_ACKCRC response Error(%d)\r\n", m_nAccountDBID, m_biCharacterDBID, m_nSessionID, dwCurTick - m_dwHShieldResponseTick);
return ERROR_NONE;
}
AHNHS_TRANS_BUFFER *pResponse = (AHNHS_TRANS_BUFFER*)pData;
unsigned long ulErrorCode = 0;
unsigned long ulSpecificErrorCode = 0;
#if defined( PRE_ADD_HSHIELD_LOG )
g_Log.Log(LogType::_HACKSHIELD, m_pSession, L"[_AhnHS_VerifyResponseEx_WithInfo before - (%d) ] ClientHandle[%x] Length[%x]: (0x%x) (0x%x)\r\n", m_pSession->GetSessionID(), m_hHSClient, pResponse->nLength, ulErrorCode, ulSpecificErrorCode);
#endif
unsigned long ulRet = _AhnHS_VerifyResponseEx_WithInfo(m_hHSClient, pResponse->byBuffer, pResponse->nLength, &ulErrorCode, &ulSpecificErrorCode );
#if defined( PRE_ADD_HSHIELD_LOG )
g_Log.Log(LogType::_HACKSHIELD, m_pSession, L"[_AhnHS_VerifyResponseEx_WithInfo after - (%d) ] ClientHandle[%x] Length[%x]: 0x%x(0x%x) (0x%x)\r\n", m_pSession->GetSessionID(), m_hHSClient, pResponse->nLength, ulRet, ulErrorCode, ulSpecificErrorCode);
#endif
if (ulRet == ANTICPX_RECOMMAND_CLOSE_SESSION)
{
switch( ulErrorCode )
{
case ERROR_ANTICPXSVR_REPLY_ATTACK: // <20><>Ŷ <20>м<EFBFBD><D0BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD> (ANTICPXSVR_BASECODE_ERROR + 0x9)
case ERROR_ANTICPXSVR_HSHIELD_FILE_ATTACK: // <20>ٽ<EFBFBD><D9BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD> (ANTICPXSVR_BASECODE_ERROR + 0xA)
case ERROR_ANTICPXSVR_CLIENT_FILE_ATTACK: // Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD> (ANTICPXSVR_BASECODE_ERROR + 0xB)
case ERROR_ANTICPXSVR_MEMORY_ATTACK: // <20>޸<EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD> (ANTICPXSVR_BASECODE_ERROR + 0xC)
case ERROR_ANTICPXSVR_UNKNOWN_CLIENT: // HSB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD><D9BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ¦<><C2A6> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD> (ANTICPXSVR_BASECODE_ERROR + 0xE)
case ERROR_ANTICPXSVR_V3SENGINE_FILE_ATTACK: // V3 Small Engine <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. (ANTICPXSVR_BASECODE_ERROR + 0xF)
case ERROR_ANTICPXSVR_NANOENGINE_FILE_ATTACK: // Nano Engine <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. (ANTICPXSVR_BASECODE_ERROR + 0x10)
case ERROR_ANTICPXSVR_ABNORMAL_HACKSHIELD_STATUS: // <20>ٽ<EFBFBD><D9BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.
case ERROR_ANTICPXSVR_BAD_MESSAGE: // <20>ۼ<EFBFBD><DBBC>ŵ<EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>
case ERROR_ANTICPXSVR_DETECT_CALLBACK_IS_NOTIFIED: // <20>ٽ<EFBFBD><D9BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.
{
#if !defined( _JP )
if (GetAccountLevel() != AccountLevel_Developer)
SendCompleteDetachMsg( ERROR_GENERIC_HACKSHIELD, L"HackShield" );
#else // #if !defined( _JP )
if (GetAccountLevel() != AccountLevel_Developer)
{
WCHAR wszBuf[100];
wsprintf( wszBuf, L"HackShield Error!!");
m_pDBCon->QueryAddAbuseLog(m_pSession, ABUSE_HACKSHIELD, wszBuf);
}
#endif // #if !defined( _JP )
break;
}
case ERROR_ANTICPXSVR_OLD_VERSION_CLIENT_EXPIRED:
{
// <20><> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>
//(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> HSB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD> HSB <20><>å<EFBFBD><C3A5> <20><> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD> <20><> <20>ִ<EFBFBD>. <20><>å<EFBFBD><C3A5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϴ<C6B4>.)
// 2010.08.27 Ŀ<><C4BF>Ʈ <20>߰<EFBFBD>
// <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>߻<EFBFBD><DFBB>ϸ<EFBFBD> <20>ȵǴ<C8B5> <20><><EFBFBD><EFBFBD><ECBFA9> <20><><EFBFBD>´<EFBFBD>.
#if !defined( _JP )
if (GetAccountLevel() != AccountLevel_Developer)
SendCompleteDetachMsg( ERROR_GENERIC_HACKSHIELD, L"HackShield" );
#else // #if !defined( _JP )
if (GetAccountLevel() != AccountLevel_Developer)
{
WCHAR wszBuf[100];
wsprintf( wszBuf, L"HackShield Error!!");
m_pDBCon->QueryAddAbuseLog(m_pSession, ABUSE_HACKSHIELD, wszBuf);
}
#endif // #if !defined( _JP )
break;
}
default:
{
#if !defined( _JP )
if (GetAccountLevel() != AccountLevel_Developer)
m_pSession->DetachConnection( L"ERROR_ANTICPXSVR" );
#endif // #if !defined( _JP )
break;
}
}
g_Log.Log(LogType::_HACKSHIELD, GetWorldSetID(), GetAccountDBID(), GetCharacterDBID(), m_nSessionID, L"Connect|[ADBID:%u, SID:%u] _AhnHS_VerifyResponseEx Error: %d(%x)(%x)\r\n", m_nAccountDBID, m_nSessionID, ulRet, ulErrorCode, ulSpecificErrorCode );
return ERROR_NONE;
}
return ERROR_NONE;
}
break;
#endif // #if defined(_HSHIELD)
default:
break;
}
#pragma warning(default:4065)
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvFriendMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case eFriend::CS_FRIEND_GROUP_ADD:
{
CSFriendAddGroup * pPacket = (CSFriendAddGroup*)pData;
if (sizeof(CSFriendAddGroup) - sizeof(pPacket->wszBuf) +(pPacket->cNameLen * sizeof(WCHAR)) != nLen)
return ERROR_INVALIDPACKET;
if (pPacket->cNameLen <= 0 || pPacket->cNameLen >= FRIEND_GROUP_NAMELENMAX)
{
SendFriendResult(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
WCHAR wszName[FRIEND_GROUP_NAMELENMAX];
_wcscpy(wszName, FRIEND_GROUP_NAMELENMAX, pPacket->wszBuf, pPacket->cNameLen);
m_pDBCon->QueryAddGroup(m_pSession, wszName);
return ERROR_NONE;
}
break;
case eFriend::CS_FRIEND_GROUP_DELETE:
{
CSFriendDelGourp * pPacket = (CSFriendDelGourp*)pData;
if (sizeof(CSFriendDelGourp) != nLen)
return ERROR_INVALIDPACKET;
TFriendGroup * pGroup = m_pFriend->GetGroup(pPacket->nGroupDBID);
if (pGroup == NULL)
return ERROR_GENERIC_UNKNOWNERROR;
m_pDBCon->QueryDelGroup(m_pSession, pPacket->nGroupDBID);
return ERROR_NONE;
}
break;
case eFriend::CS_FRIEND_GROUP_STATEUPDATE:
{
CSFriendGroupUpdate * pPacket = (CSFriendGroupUpdate*)pData;
if (sizeof(CSFriendGroupUpdate) - sizeof(pPacket->wszBuf) +(pPacket->cNameLen * sizeof(WCHAR)) != nLen)
return ERROR_INVALIDPACKET;
if (pPacket->cNameLen <= 0 || pPacket->cNameLen >= FRIEND_GROUP_NAMELENMAX)
{
_DANGER_POINT();
SendFriendGroupUpdated(pPacket->nGroupDBID, NULL, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (m_pFriend->GetGroup(pPacket->nGroupDBID) == NULL)
{
SendFriendGroupUpdated(pPacket->nGroupDBID, NULL, ERROR_FRIEND_GROUP_NOTFOUND);
return ERROR_NONE;
}
WCHAR wszName[FRIEND_GROUP_NAMELENMAX];
_wcscpy(wszName, FRIEND_GROUP_NAMELENMAX, pPacket->wszBuf, pPacket->cNameLen);
m_pDBCon->QueryModGroupName(m_pSession, pPacket->nGroupDBID, wszName);
return ERROR_NONE;
}
break;
case eFriend::CS_FRIEND_ADD:
{
CSFriendAdd * pPacket = (CSFriendAdd*)pData;
if (sizeof(CSFriendAdd) - sizeof(pPacket->wszBuf) +(pPacket->cNameLen * sizeof(WCHAR)) != nLen)
return ERROR_INVALIDPACKET;
if (m_pFriend->GetFriendCount() >= FRIEND_MAXCOUNT)
{
SendFriendAdded(0, 0, 0, NULL, ERROR_FRIEND_ALREADYMAX);
return ERROR_GENERIC_INVALIDREQUEST;
}
if (pPacket->cNameLen <= 0 || pPacket->cNameLen >= NAMELENMAX)
{
SendFriendAdded(0, 0, 0, NULL, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_GENERIC_INVALIDREQUEST;
}
WCHAR wszName[NAMELENMAX];
_wcscpy(wszName, NAMELENMAX, pPacket->wszBuf, pPacket->cNameLen);
if (CheckLastSpace(wszName))
{
SendFriendAdded(0, 0, 0, NULL, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_GENERIC_INVALIDREQUEST;
}
if (!__wcsicmp_l(GetCharacterName(), wszName))
{
SendFriendAdded(0, 0, 0, NULL, ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
if (m_pFriend->HasFriend(wszName) == true)
{
SendFriendAdded(0, 0, 0, NULL, ERROR_FRIEND_DESTUSER_ALREADYFRIEND);
return ERROR_NONE;
}
TFriendGroup * pGroup = NULL;
if (pPacket->nGroupDBID > 0)
{
pGroup = m_pFriend->GetGroup(pPacket->nGroupDBID);
if (pGroup == NULL)
{
SendFriendAdded(0, 0, 0, NULL, ERROR_FRIEND_GROUP_NOTFOUND);
return ERROR_NONE;
}
}
m_pDBCon->QueryAddFriend(m_pSession, wszName, pPacket->nGroupDBID);
return ERROR_NONE;
}
break;
case eFriend::CS_FRIEND_DELETE:
{
CSFriendDelete * pPacket = (CSFriendDelete*)pData;
if (sizeof(CSFriendDelete) != nLen)
return ERROR_INVALIDPACKET;
if (m_pFriend->HasFriend(pPacket->biFriendCharacterDBID) == false)
{
SendFriendDeleted(0, NULL, ERROR_FRIEND_FRIEND_NORFOUND);
return ERROR_NONE;
}
m_pDBCon->QueryDelFriend(m_pSession, 1, &pPacket->biFriendCharacterDBID);
return ERROR_NONE;
}
break;
case eFriend::CS_FRIEND_STATEUPDATE:
{
CSFriendUpdate * pPacket = (CSFriendUpdate*)pData;
if (sizeof(CSFriendUpdate) != nLen)
return ERROR_INVALIDPACKET;
if (m_pFriend->HasFriend(pPacket->biFriendCharacterDBID) == false)
{
SendFriendUpdated(0, &pPacket->biFriendCharacterDBID, 0, ERROR_FRIEND_FRIEND_NORFOUND);
return ERROR_NONE;
}
TFriendGroup * pGroup = NULL;
if (pPacket->nGroupDBID > 0)
{
pGroup = m_pFriend->GetGroup(pPacket->nGroupDBID);
if (pGroup == NULL)
{
SendFriendGroupUpdated(pPacket->nGroupDBID, NULL, ERROR_FRIEND_GROUP_NOTFOUND);
return ERROR_NONE;
}
}
m_pDBCon->QueryModFriendAndGroupMapping(m_pSession, pPacket->nGroupDBID, 1, &pPacket->biFriendCharacterDBID);
return ERROR_NONE;
}
break;
case eFriend::CS_FRIEND_INFO:
{
CSFriendDetailInfo * pPacket = (CSFriendDetailInfo*)pData;
if (sizeof(CSFriendDetailInfo) != nLen)
return ERROR_INVALIDPACKET;
TFriend * pFriend = m_pFriend->GetFriend(pPacket->biFriendCharacterDBID);
if (pFriend == NULL)
{
SendFriendResult(ERROR_FRIEND_FRIEND_NORFOUND);
return ERROR_NONE;
}
if (m_pDBCon && m_pDBCon->GetActive()) m_pDBCon->QueryGetCharacterPartialyByName(m_pSession, pFriend->wszCharacterName, _REQCHARACTERPARTIALY_FRIEND);
return ERROR_NONE;
}
break;
case eFriend::CS_FRIEND_REQ_LIST:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
m_pFriend->SendFriendList();
return ERROR_NONE;
}
break;
case eFriend::CS_FRIEND_REQ_LOCATION:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
m_pFriend->SendFriendLocation();
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvIsolateMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case eIsolate::CS_ISOLATE_GET:
{
if (nLen != 0)
return ERROR_INVALIDPACKET;
SCIsolateList packet;
memset(&packet, 0, sizeof(packet));
int nSize = 0;
m_pIsolate->GetIsolateList(&packet, nSize);
if (packet.cCount > 0)
SendIsolateList(&packet, nSize);
return ERROR_NONE;
}
break;
case eIsolate::CS_ISOLATE_ADD:
{
CSIsolateAdd * pPacket = (CSIsolateAdd*)pData;
if (sizeof(CSIsolateAdd) != nLen)
return ERROR_INVALIDPACKET;
if (CheckLastSpace(pPacket->wszIsolateName))
{
SendIsolateResult(ERROR_ISOLATE_ADDFAIL);
return ERROR_NONE;
}
if (!__wcsicmp_l(pPacket->wszIsolateName, GetCharacterName()))
{
SendIsolateResult(ERROR_ISOLATE_ADDFAIL);
return ERROR_NONE;
}
if ( m_pIsolate && m_pIsolate->IsIsolateItem(pPacket->wszIsolateName) == true)
{
SendIsolateResult(ERROR_ISOLATE_ALREADYADDED);
return ERROR_NONE;
}
m_pDBCon->QueryAddIsolate(m_pSession, pPacket->wszIsolateName);
return ERROR_NONE;
}
break;
case eIsolate::CS_ISOLATE_DELETE:
{
CSIsoLateDelete * pPacket = (CSIsoLateDelete*)pData;
if (sizeof(CSIsoLateDelete) != nLen)
return ERROR_INVALIDPACKET;
INT64 biIsolateCharDBID = m_pIsolate->GetIsolateCharDBID(pPacket->wszIsolateName);
if (biIsolateCharDBID <= 0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>
SendIsolateResult(ERROR_GENERIC_INVALIDREQUEST);
return ERROR_NONE;
}
m_pDBCon->QueryDelIsolate( m_pSession, biIsolateCharDBID );
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvGameOptionMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case eGameOption::CS_GAMEOPTION_UPDATEOPTION:
{
CSGameOptionUpdate * pPacket = (CSGameOptionUpdate*)pData;
if (sizeof(CSGameOptionUpdate) != nLen)
return ERROR_INVALIDPACKET;
m_bNeedUpdateOption = true;
memcpy_s(&m_GameOption, sizeof(TGameOptions), &pPacket->Option, sizeof(TGameOptions));
return ERROR_NONE;
}
case eGameOption::CS_GAMEOPTION_REQCOMMOPTION:
{
CSGameOptionReqComm * pPacket = (CSGameOptionReqComm*)pData;
if (sizeof(CSGameOptionReqComm) != nLen)
return ERROR_INVALIDPACKET;
#if defined(_VILLAGESERVER)
CDNUserSession *pSession = g_pUserSessionManager->FindUserSession(pPacket->nSessionID);
#elif defined(_GAMESERVER)
CDNUserSession * pSession = m_pSession->FindUserSession(pPacket->nSessionID);
#endif
if (pSession)
{
const TGameOptions * pOption = pSession->GetGameOption();
if (pOption)
{
#if defined(_VILLAGESERVER)
SendGameOption(pPacket->nSessionID, pOption, pSession->GetPartyID());
#elif defined(_GAMESERVER)
if (pSession->GetGameRoom())
SendGameOption(pPacket->nSessionID, pOption, pSession->GetGameRoom()->GetPartyIndex());
else
_DANGER_POINT();
#endif
}
else
_DANGER_POINT();
}
else
_DANGER_POINT();
return ERROR_NONE;
}
case eGameOption::CS_GAMEOPTION_QUEST_NOTIFIER:
{
if (sizeof(CSGameOptionQuestNotifier) != nLen)
return ERROR_INVALIDPACKET;
int iRet = _CmdSetQuestNotifier( reinterpret_cast<CSGameOptionQuestNotifier*>(pData) );
if ( iRet != ERROR_NONE )
{
SendGameOptionRefreshNotifier();
}
return iRet;
}
case eGameOption::CS_GAMEOPTION_MISSION_NOTIFIER:
{
if (sizeof(CSGameOptionMissionNotifier) != nLen)
return ERROR_INVALIDPACKET;
int iRet = _CmdSetMissionNotifier( reinterpret_cast<CSGameOptionMissionNotifier*>(pData) );
if ( iRet != ERROR_NONE )
{
SendGameOptionRefreshNotifier();
}
return iRet;
}
case eGameOption::CS_GAMEOPTION_UPDATE_KEYSETTING:
{
CSGameOptionUpdateKeySetting* pPacket = reinterpret_cast<CSGameOptionUpdateKeySetting*>(pData);
if (m_pDBCon && m_pDBCon->GetActive())
m_pDBCon->QueryUpdateKeySetting( m_cDBThreadID, GetWorldSetID(), GetAccountDBID(), pPacket );
return ERROR_NONE;
}
case eGameOption::CS_GAMEOPTION_UPDATE_PADSETTING:
{
CSGameOptionUpdatePadSetting* pPacket = reinterpret_cast<CSGameOptionUpdatePadSetting*>(pData);
if (m_pDBCon && m_pDBCon->GetActive())
m_pDBCon->QueryUpdatePadSetting( m_cDBThreadID, GetWorldSetID(), GetAccountDBID(), pPacket );
return ERROR_NONE;
}
case eGameOption::CS_GAMEOPTION_VALIDATE_SECONDAUTH:
{
CSGameOptionValidateSecondAuth* pPacket = reinterpret_cast<CSGameOptionValidateSecondAuth*>(pData);
if (bIsSetSecondAuthPW() == false)
{
SendSecondAuthValidate(ERROR_SECONDAUTH_NOTEXIST, pPacket->nAuthCheckType, 0);
return ERROR_NONE;
}
if (m_pDBCon && m_pDBCon->GetActive())
m_pDBCon->QueryValidateSecondAuth( m_cDBThreadID, GetAccountDBID(), MakeSecondPasswordString( szVersion, pPacket->nSeed, pPacket->nValue ).c_str(), pPacket->nAuthCheckType);
return ERROR_NONE;
}
case eGameOption::CS_GAMEOPTION_GET_PROFILE:
{
if( 0 != nLen ) return ERROR_INVALIDPACKET;
SendProfile( m_Profile );
return ERROR_NONE;
}
break;
case eGameOption::CS_GAMEOPTION_SET_PROFILE:
{
CSGameOptionSetProfile * pPacket = reinterpret_cast<CSGameOptionSetProfile*>(pData);
if( sizeof(CSGameOptionSetProfile) != nLen ) return ERROR_INVALIDPACKET;
if( m_pDBCon && m_pDBCon->GetActive() )
m_pDBCon->QuerySetProfile( m_pSession, pPacket->sProfile.cGender, pPacket->sProfile.wszGreeting, pPacket->sProfile.bOpenPublic );
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvRadioMessage(int nSubCmd, char *pData, int nLen)
{
return ERROR_NONE;
}
int CDNUserBase::OnRecvGuildMessage(int nSubCmd, char *pData, int nLen)
{
return ERROR_NONE;
}
int CDNUserBase::OnRecvEtcMessage(int nSubCmd, char *pData, int nLen)
{
switch( nSubCmd )
{
case eEtc::CS_DARKLAIR_RANK_BOARD:
{
if( CheckDBConnection() == false )
return ERROR_GENERIC_DBCON_NOT_FOUND;
if( sizeof(CSDarkLairRankBoard) != nLen )
return ERROR_INVALIDPACKET;
CSDarkLairRankBoard* pPacket = reinterpret_cast<CSDarkLairRankBoard*>(pData);
#if defined(PRE_ADD_CHALLENGE_DARKLAIR)
if(pPacket->iMapIndex > DarkLair::TopFloorAbstractMapIndex)
{
int iMapIndex = pPacket->iMapIndex%DarkLair::TopFloorAbstractMapIndex;
if( g_pDataManager->IsCloseGateByTime(iMapIndex) )
{ //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD>. <20>ųʿ<C5B3>.
SCDarkLairRankBoard TxPacket;
memset( &TxPacket, 0, sizeof(TxPacket) );
TxPacket.iRet = ERROR_NOT_AVAILABLE_CHECK_RANKING_TIME;
int iSize = sizeof(TxPacket.iRet);
m_pSession->AddSendData( SC_ETC, eEtc::SC_DARKLAIR_RANK_BOARD, reinterpret_cast<char*>(&TxPacket), iSize );
return ERROR_NONE;
}
}
#endif
m_pDBCon->QueryGetDarkLairRankBoard( m_pSession, pPacket->iMapIndex, pPacket->cPartyUserCount );
return ERROR_NONE;
}
case eEtc::CS_PVPLADDER_RANK_BOARD:
{
if( CheckDBConnection() == false )
return ERROR_GENERIC_DBCON_NOT_FOUND;
if( sizeof(CSPvPLadderRankBoard) != nLen )
return ERROR_INVALIDPACKET;
CSPvPLadderRankBoard* pPacket = reinterpret_cast<CSPvPLadderRankBoard*>(pData);
m_pDBCon->QueryGetPvPLadderRankBoard( m_pSession, pPacket->MatchType );
return ERROR_NONE;
}
case eEtc::CS_WINDOW_STATE :
{
if( sizeof(CSWindowState) != nLen )
return ERROR_INVALIDPACKET;
CSWindowState* pPacket = reinterpret_cast<CSWindowState*>(pData);
if( pPacket->sWinState == WINDOW_NONE )
{
SetNoneWindowState();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CS_CLOSE_UIWINDOW <20><><EFBFBD>⼭ ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WINDOW_BLIND <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD>⼭ ó<><C3B3><EFBFBD><EFBFBD>..
if( GetRemoteEnchantItemID() )
SetRemoteEnchantItemID(0);
if( GetRemoteItemCompoundItemID())
SetRemoteItemCompoundItemID(0);
}
else
SetWindowState((eWindowState)pPacket->sWinState);
return ERROR_NONE;
}
break;
#if defined(PRE_ADD_PVP_RANKING)
case eEtc::CS_PVP_RANK_BOARD:
{
#if defined( _VILLAGESERVER )
if( CheckDBConnection() == false )
return ERROR_GENERIC_DBCON_NOT_FOUND;
m_pDBCon->QueryGetPvPRankBoard( m_pSession );
#endif
return ERROR_NONE;
}
break;
case eEtc::CS_PVP_RANK_LIST:
{
#if defined( _VILLAGESERVER )
if( CheckDBConnection() == false )
return ERROR_GENERIC_DBCON_NOT_FOUND;
if( sizeof(CSPvPRankList) != nLen )
return ERROR_INVALIDPACKET;
CSPvPRankList* pPacket = reinterpret_cast<CSPvPRankList*>(pData);
m_pDBCon->QueryGetPvPRankList( m_pSession, pPacket->iPage, pPacket->cClassCode, pPacket->cSubClassCode, pPacket->wszGuildName );
#endif
return ERROR_NONE;
}
break;
case eEtc::CS_PVP_RANK_INFO:
{
#if defined( _VILLAGESERVER )
if( CheckDBConnection() == false )
return ERROR_GENERIC_DBCON_NOT_FOUND;
if( sizeof(CSPvPRankInfo) != nLen )
return ERROR_INVALIDPACKET;
CSPvPRankInfo* pPacket = reinterpret_cast<CSPvPRankInfo*>(pData);
m_pDBCon->QueryGetPvPRankInfo( m_pSession, pPacket->wszCharName );
#endif
return ERROR_NONE;
}
break;
case eEtc::CS_PVP_LADDER_RANK_BOARD:
{
#if defined( _VILLAGESERVER )
if( CheckDBConnection() == false )
return ERROR_GENERIC_DBCON_NOT_FOUND;
if( sizeof(CSPvPLadderRankBoard2) != nLen )
return ERROR_INVALIDPACKET;
CSPvPLadderRankBoard2* pPacket = reinterpret_cast<CSPvPLadderRankBoard2*>(pData);
m_pDBCon->QueryGetPvPLadderRankBoard2( m_pSession, pPacket->MatchType );
#endif
return ERROR_NONE;
}
break;
case eEtc::CS_PVP_LADDER_RANK_LIST:
{
#if defined( _VILLAGESERVER )
if( CheckDBConnection() == false )
return ERROR_GENERIC_DBCON_NOT_FOUND;
if( sizeof(CSPvPLadderRankList) != nLen )
return ERROR_INVALIDPACKET;
CSPvPLadderRankList* pPacket = reinterpret_cast<CSPvPLadderRankList*>(pData);
m_pDBCon->QueryGetPvPLadderRankList( m_pSession, pPacket->MatchType, pPacket->iPage, pPacket->cClassCode, pPacket->cSubClassCode, pPacket->wszGuildName );
#endif
return ERROR_NONE;
}
break;
case eEtc::CS_PVP_LADDER_RANK_INFO:
{
#if defined( _VILLAGESERVER )
if( CheckDBConnection() == false )
return ERROR_GENERIC_DBCON_NOT_FOUND;
if( sizeof(CSPvPLadderRankInfo) != nLen )
return ERROR_INVALIDPACKET;
CSPvPLadderRankInfo* pPacket = reinterpret_cast<CSPvPLadderRankInfo*>(pData);
m_pDBCon->QueryGetPvPLadderRankInfo( m_pSession, pPacket->MatchType, pPacket->wszCharName );
#endif
return ERROR_NONE;
}
break;
#endif
#if defined(PRE_ADD_GAMEQUIT_REWARD)
case eEtc::CS_GAMEQUIT_REWARDCHECK_REQ:
{
SendGameQuitRewardType(m_eUserGameQuitRewardType);
return ERROR_NONE;
}
break;
case eEtc::CS_GAMEQUIT_REWARD_REQ:
{
if(sizeof(CSGameQuitRewardReq) != nLen)
return ERROR_INVALIDPACKET;
CSGameQuitRewardReq *pPacket = (CSGameQuitRewardReq*)pData;
int nRet = ERROR_NONE;
bool IsSuccess = false;
if(pPacket->eRewardType == m_eUserGameQuitRewardType && pPacket->eRewardType != GameQuitReward::RewardType::None)
{
switch(pPacket->eRewardType)
{
case GameQuitReward::RewardType::ComeBackReward:
IsSuccess = SetGameQuitRewardItem(TLevelupEvent::ComeBackUserQuitReward, DBDNWorldDef::AddMaterializedItem::ComebackGameQuitReward);
break;
case GameQuitReward::RewardType::NewbieReward:
IsSuccess = SetGameQuitRewardItem(TLevelupEvent::NewbieQuitReward, DBDNWorldDef::AddMaterializedItem::NewbieGameQuitReward);
break;
}
}
if(!IsSuccess)
{
nRet = ERROR_ITEM_NOTFOUND;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD>
g_Log.Log(LogType::_GAMEQUITREWARD, m_pSession, L"[SetGameQuitRewardItem][Type:%d(Recv:%d)] LevelupEventTable Data Error(Lev[%d] Class[%d] Job[%d]\n", m_eUserGameQuitRewardType, pPacket->eRewardType, GetLevel(), GetClassID(), GetUserJob());
}
m_eUserGameQuitRewardType = GameQuitReward::RewardType::None;
SendGameQuitRewardResult(nRet);
return ERROR_NONE;
}
break;
#endif // #if defined(PRE_ADD_GAMEQUIT_REWARD)
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvChatRoomMessage(int nSubCmd, char *pData, int nLen)
{
return ERROR_NONE;
}
int CDNUserBase::OnRecvMasterSystemMessage( int nSubCmd, char* pData, int nLen )
{
switch( nSubCmd )
{
case eMasterSystem::CS_MASTERCHARACTERINFO:
{
if( nLen != 0 )
return ERROR_INVALIDPACKET;
// üũ
if( GetLevel() < static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_MasterMinLevel )) )
{
SendMasterSystemMasterCharacterInfo( ERROR_GENERIC_INVALIDREQUEST );
return ERROR_NONE;
}
MasterSystem::CCacheRepository::GetInstance().GetMasterCharacter( static_cast<CDNUserSession*>(this), GetCharacterDBID() );
return ERROR_NONE;
}
case eMasterSystem::CS_MASTERANDCLASSMATE:
{
if( nLen != 0 )
return ERROR_INVALIDPACKET;
// üũ
if( GetLevel() > static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_PupilMaxLevel )) )
{
SendMasterSystemMasterAndClassmateInfo( ERROR_GENERIC_INVALIDREQUEST, std::vector<TMasterAndClassmateInfo>() );
return ERROR_NONE;
}
MasterSystem::CCacheRepository::GetInstance().GetMasterClassmateList( static_cast<CDNUserSession*>(this), GetCharacterDBID(), true );
return ERROR_NONE;
}
}
return ERROR_UNKNOWN_HEADER;
}
#if defined( PRE_ADD_SECONDARY_SKILL )
int CDNUserBase::OnRecvSecondarySkillMessage(int nSubCmd, char *pData, int nLen)
{
_ASSERT( dynamic_cast<CSecondarySkillRepositoryServer*>(m_pSecondarySkillRepository) );
switch( nSubCmd )
{
case eSecondarySkill::CS_DELETE:
{
if( sizeof(SecondarySkill::CSDelete) != nLen )
return ERROR_INVALIDPACKET;
SecondarySkill::CSDelete* pPacket = reinterpret_cast<SecondarySkill::CSDelete*>(pData);
if( m_pSecondarySkillRepository->Delete( pPacket->iSkillID ) == false )
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendDelSecondarySkill( ERROR_SECONDARYSKILL_DELETE_FAILED, pPacket->iSkillID );
}
return ERROR_NONE;
}
case eSecondarySkill::CS_ADD_RECIPE:
{
if( sizeof(SecondarySkill::CSAddRecipe) != nLen )
return ERROR_INVALIDPACKET;
SecondarySkill::CSAddRecipe* pPacket = reinterpret_cast<SecondarySkill::CSAddRecipe*>(pData);
int iRet = static_cast<CSecondarySkillRepositoryServer*>(m_pSecondarySkillRepository)->AddRecipe( pPacket );
if( iRet != ERROR_NONE )
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendAddSecondarySkillRecipe( iRet, NULL );
}
return ERROR_NONE;
}
case eSecondarySkill::CS_DELETE_RECIPE:
{
if( sizeof(SecondarySkill::CSDeleteRecipe) != nLen )
return ERROR_INVALIDPACKET;
SecondarySkill::CSDeleteRecipe* pPacket = reinterpret_cast<SecondarySkill::CSDeleteRecipe*>(pData);
if( static_cast<CSecondarySkillRepositoryServer*>(m_pSecondarySkillRepository)->DeleteRecipe( pPacket ) == false )
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendDeleteSecondarySkillRecipe( ERROR_SECONDARYSKILL_DELETERECIPE_FAILED, pPacket->iSkillID, pPacket->iItemID );
}
return ERROR_NONE;
}
case eSecondarySkill::CS_EXTRACT_RECIPE:
{
if( sizeof(SecondarySkill::CSExtractRecipe) != nLen )
return ERROR_INVALIDPACKET;
SecondarySkill::CSExtractRecipe* pPacket = reinterpret_cast<SecondarySkill::CSExtractRecipe*>(pData);
if( static_cast<CSecondarySkillRepositoryServer*>(m_pSecondarySkillRepository)->ExtractRecipe( pPacket ) == false )
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendExtractSecondarySkillRecipe( ERROR_SECONDARYSKILL_EXTRACTRECIPE_FAILED, pPacket->iSkillID, pPacket->iItemID );
}
return ERROR_NONE;
}
case eSecondarySkill::CS_MANUFACTURE:
{
if( sizeof(SecondarySkill::CSManufacture) != nLen )
return ERROR_INVALIDPACKET;
SecondarySkill::CSManufacture* pPacket = reinterpret_cast<SecondarySkill::CSManufacture*>(pData);
int iRet = static_cast<CSecondarySkillRepositoryServer*>(m_pSecondarySkillRepository)->DoManufacture( pPacket );
if( iRet != ERROR_NONE )
{
if( pPacket->bIsStart == false )
{
CManufactureSkill* pManufactureSkill = m_pSecondarySkillRepository->GetManufactureSkill( pPacket->iSkillID );
if( pManufactureSkill )
{
// Tick <20>ʱ<EFBFBD>ȭ
pManufactureSkill->ClearManufactureTick();
// Flag <20><><EFBFBD><EFBFBD>
static_cast<CSecondarySkillRepositoryServer*>(m_pSession->GetSecondarySkillRepository())->SetManufacturingFlag( false );
}
}
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendManufactureSecondarySkill( iRet, pPacket->bIsStart, pPacket->iSkillID, pPacket->iItemID );
}
return ERROR_NONE;
}
case eSecondarySkill::CS_CANCEL_MANUFACTURE:
{
if( nLen != 0 )
return ERROR_INVALIDPACKET;
static_cast<CSecondarySkillRepositoryServer*>(m_pSecondarySkillRepository)->CancelManufacture( false );
return ERROR_NONE;
}
}
return ERROR_UNKNOWN_HEADER;
}
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
int CDNUserBase::OnRecvReputationMessage( int nSubCmd, char* pData, int nLen )
{
switch( nSubCmd )
{
case eReputation::CS_GIVENPCPRESENT:
{
if( sizeof(CSGiveNpcPresent) != nLen )
return ERROR_INVALIDPACKET;
CSGiveNpcPresent* pPacket = (CSGiveNpcPresent*)pData;
CNpcReputationProcessor::PresentProcess( static_cast<CDNUserSession*>(this), pPacket->nNpcID, pPacket->nPresentID, pPacket->nPresentCount );
}
return ERROR_NONE;
}
return ERROR_UNKNOWN_HEADER;
}
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
int CDNUserBase::OnRecvGestureMessage(int nSubCmd, char *pData, int nLen)
{
switch(nSubCmd)
{
case eGesture::CS_USEGESTURE:
{
if (sizeof(CSUseGesture) != nLen)
return ERROR_INVALIDPACKET;
CSUseGesture *pUseGesture = (CSUseGesture*)pData;
int nGestureID = pUseGesture->nGestureID;
//ValidCheck
if (HasGesture(nGestureID)) {
if (CheckPapering(eGesturePapering))
break;
SendUseGesture(nGestureID);
GetEventSystem()->OnEvent( EventSystem::OnSocialAction, 1,
EventSystem::SocialActionID, nGestureID );
}
else
_DANGER_POINT();
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvPlayerCustomEventUI(int nSubCmd, char * pData, int nLen)
{
switch (nSubCmd)
{
case ePlayerCustomEventUI::CS_GETPLAYERUI:
{
CSGetPlayerCustomEventUI * pPacket = (CSGetPlayerCustomEventUI*)pData;
CDNUserSession * pSession = NULL;
#ifdef _VILLAGESERVER
pSession = g_pUserSessionManager->FindUserSession(pPacket->nSessionID);
#elif _GAMESERVER
if (m_pSession)
{
CDNGameRoom * pGameRoom = m_pSession->GetGameRoom();
if (pGameRoom)
pSession = pGameRoom->GetUserSession(pPacket->nSessionID);
}
#endif //#ifdef _VILLAGESERVER
if (pSession == NULL)
{
_DANGER_POINT_MSG(L"CS_GETPLAYERUI pSession NULL");
return ERROR_NONE;
}
std::vector <int> vList;
g_pDataManager->GetPlayerCustomEventUIList(vList);
int nSize = (int)vList.size();
if (nSize == 0 || nSize >= PlayerCustomEventUI::PlayerCustomEventUIMax)
{
_DANGER_POINT_MSG(L"CS_GETPLAYERUI Size MisMatch");
return ERROR_NONE;
}
TMissionGroup *pMission = pSession->GetMissionData();
if (pMission == NULL)
{
_DANGER_POINT_MSG(L"CS_GETPLAYERUI pMission NULL");
return ERROR_NONE;
}
SCGetPlayerCustomEventUI packet;
memset(&packet, 0, sizeof(SCGetPlayerCustomEventUI));
packet.cCount = nSize;
int i = 0;
for (std::vector <int>::iterator ii = vList.begin(); ii != vList.end(); ii++)
{
packet.UIs[i].nMissionID = (*ii);
packet.UIs[i].cFlag = GetBitFlag(pMission->MissionAchieve, (*ii) - 1) == true ? 1 : 0;
i++;
}
SendPlayerCustomEventUI(&packet);
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
int CDNUserBase::OnRecvGuildRecruitMessage( int nSubCmd, char* pData, int nLen )
{
switch( nSubCmd )
{
case eGuildRecruit::CS_GUILDRECRUIT_LIST:
{
if( sizeof(GuildRecruitSystem::CSGuildRecruitList) != nLen )
return ERROR_INVALIDPACKET;
// üũ
if( GetGuildUID().IsSet() )
{
SendGuildRecruitList( ERROR_GENERIC_INVALIDREQUEST, 0, std::vector<TGuildRecruitInfo>() );
return ERROR_NONE;
}
GuildRecruitSystem::CSGuildRecruitList* pPacket = reinterpret_cast<GuildRecruitSystem::CSGuildRecruitList*>(pData);
#if defined( PRE_ADD_GUILD_EASYSYSTEM )
GuildRecruitSystem::CCacheRepository::GetInstance().GetGuildRecruitList( static_cast<CDNUserSession*>(this), pPacket->uiPage, GetClassID(), GetLevel(), pPacket->cPurposeCode, pPacket->wszGuildName, pPacket->cSortType );
#else
GuildRecruitSystem::CCacheRepository::GetInstance().GetGuildRecruitList( static_cast<CDNUserSession*>(this), pPacket->uiPage, GetClassID(), GetLevel() );
#endif
return ERROR_NONE;
}
break;
case eGuildRecruit::CS_GUILDRECRUIT_MYLIST:
{
if( nLen != 0 )
return ERROR_INVALIDPACKET;
// üũ
if( GetGuildUID().IsSet() )
{
SendMyGuildRecruit( ERROR_GENERIC_INVALIDREQUEST, std::vector<TGuildRecruitInfo>() );
return ERROR_NONE;
}
GuildRecruitSystem::CCacheRepository::GetInstance().GetMyGuildRecruit( static_cast<CDNUserSession*>(this) );
return ERROR_NONE;
}
break;
case eGuildRecruit::CS_GUILDRECRUIT_REQUESTCOUNT:
{
if( nLen != 0 )
return ERROR_INVALIDPACKET;
// üũ
if( GetGuildUID().IsSet() )
{
SendGuildRecruitRequestCount( ERROR_GENERIC_INVALIDREQUEST, 0, GuildRecruitSystem::Max::MaxRequestCount );
return ERROR_NONE;
}
GetDBConnection()->QueryGetGuildRecruitRequestCount( m_pSession );
return ERROR_NONE;
}
break;
case eGuildRecruit::CS_GUILDRECRUIT_CHARACTER:
{
if( nLen != 0 )
return ERROR_INVALIDPACKET;
// üũ
if( !GetGuildUID().IsSet() )
{
SendGuildRecruitCharacter( ERROR_GENERIC_INVALIDREQUEST, std::vector<TGuildRecruitCharacter>() );
return ERROR_NONE;
}
GuildRecruitSystem::CCacheRepository::GetInstance().GetGuildRecruitCharacter( static_cast<CDNUserSession*>(this), GetGuildUID() );
return ERROR_NONE;
}
break;
case eGuildRecruit::CS_GUILDRECRUIT_REGISTERINFO:
{
if( nLen != 0 )
return ERROR_INVALIDPACKET;
// üũ
if( !GetGuildUID().IsSet() )
{
SendGuildRecruitCharacter( ERROR_GENERIC_INVALIDREQUEST, std::vector<TGuildRecruitCharacter>() );
return ERROR_NONE;
}
GetDBConnection()->QueryRegisterInfoGuildRecruit( m_pSession );
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
#if defined (PRE_ADD_BESTFRIEND)
int CDNUserBase::OnRecvBestFriendMessage(int nSubCmd, char *pData, int nLen)
{
switch( nSubCmd )
{
case eBestFriend::CS_GETINFO:
{
if (false == m_pBestFriend->IsRegistered())
{
TBestFriendInfo Info = {0,};
SendGetBestFriend(ERROR_BESTFRIEND_NOT_REGISTERED, Info);
return ERROR_BESTFRIEND_NOT_REGISTERED;
}
m_pBestFriend->CheckAndSendData();
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
int CDNUserBase::OnRecvPrivateChatChannelMessage(int nSubCmd, char *pData, int nLen)
{
switch( nSubCmd )
{
case ePrivateChatChannel::CS_PRIVATECHAT_CHANNEL_ADD:
{
PrivateChatChannel::CSPrivateChatChannleAdd *pPacket = reinterpret_cast<PrivateChatChannel::CSPrivateChatChannleAdd*>(pData);
if (sizeof(PrivateChatChannel::CSPrivateChatChannleAdd) != nLen)
return ERROR_INVALIDPACKET;
int nRet = CheckInvalidChannelName(pPacket->wszChannelName);
if( nRet != ERROR_NONE )
{
return nRet;
}
#if defined(PRE_ADD_DWC)
if( IsDWCCharacter() )
{
SendPrivateChatChannelResult(ERROR_DWC_LIMIT);
return ERROR_DWC_LIMIT;
}
#endif
if(g_pPrivateChatChannelManager->GetPrivateChatChannelId(GetWorldSetID(), pPacket->wszChannelName) > 0)
{
SendPrivateChatChannelResult(ERROR_ALREADY_CHANNELNAME);
return ERROR_ALREADY_CHANNELNAME;
}
SetPrivateChannelID(PrivateChatChannel::Common::WaitDBResult);
// DB ó<><C3B3>
#if defined( PRE_ADD_PRIVATECHAT_CHANNEL)
m_pDBCon->QueryAddPrivateChatChannel( m_pSession, pPacket->wszChannelName, pPacket->nPassWord );
#else
m_pDBCon->QueryAddPrivateChatChannel( m_pSession, pPacket->wszChannelName, -1 );
#endif
return ERROR_NONE;
}
break;
case ePrivateChatChannel::CS_PRIVATECHAT_CHANNEL_JOIN:
{
PrivateChatChannel::CSPrivateChatChannleJoin *pPacket = reinterpret_cast<PrivateChatChannel::CSPrivateChatChannleJoin*>(pData);
if (sizeof(PrivateChatChannel::CSPrivateChatChannleJoin) != nLen)
return ERROR_INVALIDPACKET;
#if defined(PRE_ADD_DWC)
if( IsDWCCharacter() )
{
SendPrivateChatChannelResult(ERROR_DWC_LIMIT);
return ERROR_DWC_LIMIT;
}
#endif
int nRet = CheckInvalidChannelName(pPacket->wszChannelName);
if( nRet != ERROR_NONE )
{
return nRet;
}
INT64 nChannelID = 0;
if(g_pPrivateChatChannelManager)
{
nChannelID = g_pPrivateChatChannelManager->GetPrivateChatChannelId(GetWorldSetID(), pPacket->wszChannelName);
}
else
break;
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo(GetWorldSetID(), nChannelID );
if( pPrivateChatChannel )
{
if( pPacket->nPassWord == -1 )
{
if(pPrivateChatChannel->GetChannelPassword() >= 0)
{
SendPrivateChatChannelJoinResult( PrivateChatChannel::Common::NeedPassWord, pPrivateChatChannel->GetChannelName());
return ERROR_NONE;
}
}
else if(pPacket->nPassWord !=pPrivateChatChannel->GetChannelPassword())
{
SendPrivateChatChannelResult( ERROR_INVALID_PRIVATECHATCHANNELPASSWORD );
return ERROR_INVALID_PRIVATECHATCHANNELPASSWORD;
}
SetPrivateChannelID(pPrivateChatChannel->GetChannelID());
}
else
{
SendPrivateChatChannelResult(ERROR_NOTEXIST_CHANNELNAME);
return ERROR_NOTEXIST_CHANNELNAME;
}
// DB ó<><C3B3>
m_pDBCon->QueryAddPrivateChatChannelMember( m_pSession, nChannelID, PrivateChatChannel::Common::JoinMember );
return ERROR_NONE;
}
break;
case ePrivateChatChannel::CS_PRIVATECHAT_CHANNEL_INVITE:
{
PrivateChatChannel::CSPrivateChatChannleInvite *pPacket = reinterpret_cast<PrivateChatChannel::CSPrivateChatChannleInvite*>(pData);
if (sizeof(PrivateChatChannel::CSPrivateChatChannleInvite) != nLen)
return ERROR_INVALIDPACKET;
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( GetWorldSetID(), GetPrivateChannelID() );
if( pPrivateChatChannel )
{
if( GetCharacterDBID() != pPrivateChatChannel->GetMasterCharacterDBID() )
return ERROR_INVALIDPACKET;
#if defined( _VILLAGESERVER )
CDNUserSession* pSession = g_pUserSessionManager->FindUserSessionByName(pPacket->wszCharacterName);
if(pSession)
{
#if defined(PRE_ADD_DWC)
if(pSession->IsDWCCharacter())
{
SendPrivateChatChannelInviteResult(ERROR_NOTEXIST_INVITEUSER);
return ERROR_NOTEXIST_INVITEUSER;
}
#endif
if(pSession->GetPrivateChannelID())
{
SendPrivateChatChannelInviteResult(ERROR_ALREADY_JOINCHANNEL);
return ERROR_ALREADY_JOINCHANNEL;
}
else
{
pSession->SetPrivateChannelID(pPrivateChatChannel->GetChannelID());
pSession->GetDBConnection()->QueryInvitePrivateChatChannelMember(pSession, pPrivateChatChannel->GetChannelID(), GetAccountDBID());
}
return ERROR_NONE;
}
#endif
#if defined( _VILLAGESERVER )
if(g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendInvitePrivateChatChannel(pPrivateChatChannel->GetChannelID(), GetAccountDBID(), pPacket->wszCharacterName);
}
#elif defined( _GAMESERVER )
if(g_pMasterConnectionManager )
{
g_pMasterConnectionManager->SendInvitePrivateChatChannel(GetWorldSetID(), pPrivateChatChannel->GetChannelID(), GetAccountDBID(), pPacket->wszCharacterName);
}
#endif
}
return ERROR_NONE;
}
break;
case ePrivateChatChannel::CS_PRIVATECHAT_CHANNEL_OUT:
{
PrivateChatChannel::CSPrivateChatChannleOut *pPacket = reinterpret_cast<PrivateChatChannel::CSPrivateChatChannleOut*>(pData);
if (sizeof(PrivateChatChannel::CSPrivateChatChannleOut) != nLen)
return ERROR_INVALIDPACKET;
if(GetPrivateChannelID() <= 0)
{
return ERROR_NONE;
}
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( GetWorldSetID(), GetPrivateChannelID() );
if(pPrivateChatChannel)
{
pPrivateChatChannel->DelPrivateChannelMember( PrivateChatChannel::Common::OutMember, GetCharacterDBID() );
SendPrivateChatChannelOutResult( ERROR_NONE );
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 defined( _VILLAGESERVER )
if(g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendModPrivateChatChannelInfo( pPrivateChatChannel->GetChannelID(), PrivateChatChannel::Common::ChangeMaster, pPrivateChatChannel->GetChannelPassword(), pPrivateChatChannel->GetMasterCharacterDBID() );
}
#elif defined( _GAMESERVER )
if(g_pMasterConnectionManager )
{
g_pMasterConnectionManager->SendModPrivateChatChannelInfo( GetWorldSetID(), pPrivateChatChannel->GetChannelID(), PrivateChatChannel::Common::ChangeMaster, pPrivateChatChannel->GetChannelPassword(), pPrivateChatChannel->GetMasterCharacterDBID() );
}
#endif
}
#if defined( _VILLAGESERVER )
if(g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendDelPrivateChatChannelMember( PrivateChatChannel::Common::OutMember, GetPrivateChannelID(), GetCharacterDBID(), GetCharacterName() );
}
#elif defined( _GAMESERVER )
if(g_pMasterConnectionManager )
{
g_pMasterConnectionManager->SendDelPrivateChatChannelMember( GetWorldSetID(), PrivateChatChannel::Common::OutMember, GetPrivateChannelID(), GetCharacterDBID(), GetCharacterName() );
}
#endif
}
m_pDBCon->QueryOutPrivateChatChannelMember( m_pSession, PrivateChatChannel::Common::OutMember );
SetPrivateChannelID(0);
return ERROR_NONE;
}
break;
case ePrivateChatChannel::CS_PRIVATECHAT_CHANNEL_KICK:
{
PrivateChatChannel::CSPrivateChatChannleKick *pPacket = reinterpret_cast<PrivateChatChannel::CSPrivateChatChannleKick*>(pData);
if (sizeof(PrivateChatChannel::CSPrivateChatChannleKick) != nLen)
return ERROR_INVALIDPACKET;
if(GetPrivateChannelID() <= 0)
{
return ERROR_NONE;
}
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( GetWorldSetID(), GetPrivateChannelID() );
if(pPrivateChatChannel)
{
if( GetCharacterDBID() == pPrivateChatChannel->GetMasterCharacterDBID() )
{
TPrivateChatChannelMember Member = pPrivateChatChannel->GetPrivateChannelMember(pPacket->wszCharacterName);
if(Member.biCharacterDBID > 0)
m_pDBCon->QueryKickPrivateChatChannelMember( m_pSession, pPacket->wszCharacterName, Member.biCharacterDBID );
else
SendPrivateChatChannelKickResult(ERROR_INVALID_PIRVATECHATMEMBERNAME, false);
}
else
return ERROR_GENERIC_INVALIDREQUEST;
}
return ERROR_NONE;
}
break;
case ePrivateChatChannel::CS_PRIVATECHAT_CHANNEL_MOD:
{
PrivateChatChannel::CSPrivateChatChannleMod *pPacket = reinterpret_cast<PrivateChatChannel::CSPrivateChatChannleMod*>(pData);
if (sizeof(PrivateChatChannel::CSPrivateChatChannleMod) != nLen)
return ERROR_INVALIDPACKET;
if(GetPrivateChannelID() <= 0)
{
return ERROR_NONE;
}
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( GetWorldSetID(), GetPrivateChannelID() );
if(pPrivateChatChannel)
{
if( GetCharacterDBID() == pPrivateChatChannel->GetMasterCharacterDBID() )
{
if(pPacket->nModType == PrivateChatChannel::Common::ChangeMaster )
{
if(pPrivateChatChannel->CheckPrivateChannelMember(pPacket->biCharacterDBID))
{
pPrivateChatChannel->ModPrivateChannelInfo( PrivateChatChannel::Common::ChangeMaster, pPrivateChatChannel->GetChannelPassword(), pPacket->biCharacterDBID );
m_pDBCon->QueryModPrivateChatChannelInfo( m_pSession, pPrivateChatChannel->GetChannelName(), pPacket->nModType, pPrivateChatChannel->GetChannelPassword(), pPacket->biCharacterDBID );
}
else
{
SendPrivateChatChannelResult(ERROR_NOTEXIST_CHANNELMEMBER);
return ERROR_NOTEXIST_CHANNELMEMBER;
}
}
else if(pPacket->nModType == PrivateChatChannel::Common::ChangePassWord && pPacket->nPassWord >= -1 )
{
pPrivateChatChannel->ModPrivateChannelInfo( PrivateChatChannel::Common::ChangePassWord, pPacket->nPassWord, GetCharacterDBID() );
m_pDBCon->QueryModPrivateChatChannelInfo( m_pSession, pPrivateChatChannel->GetChannelName(), pPacket->nModType, pPacket->nPassWord, GetCharacterDBID() );
}
else
return ERROR_GENERIC_INVALIDREQUEST;
#if defined( _VILLAGESERVER )
if(g_pMasterConnection && g_pMasterConnection->GetActive() )
{
g_pMasterConnection->SendModPrivateChatChannelInfo( pPrivateChatChannel->GetChannelID(), (PrivateChatChannel::Common::eModType)pPacket->nModType, pPrivateChatChannel->GetChannelPassword(), pPrivateChatChannel->GetMasterCharacterDBID() );
}
#elif defined( _GAMESERVER )
if(g_pMasterConnectionManager )
{
g_pMasterConnectionManager->SendModPrivateChatChannelInfo( GetWorldSetID(), pPrivateChatChannel->GetChannelID(), (PrivateChatChannel::Common::eModType)pPacket->nModType, pPrivateChatChannel->GetChannelPassword(), pPrivateChatChannel->GetMasterCharacterDBID() );
}
#endif
}
else
return ERROR_GENERIC_INVALIDREQUEST;
}
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
#endif
#if defined( PRE_ALTEIAWORLD_EXPLORE )
int CDNUserBase::OnRecvWorldAlteiaMessage(int nSubCmd, char *pData, int nLen)
{
// switch( nSubCmd )
// {
// }
return ERROR_UNKNOWN_HEADER;
}
#endif // #if defined( PRE_ALTEIAWORLD_EXPLORE )
#if defined(PRE_ADD_DWC)
int CDNUserBase::OnRecvDWCMessage(int nSubCmd, char *pData, int nLen)
{
return ERROR_NONE;
}
#endif
#if defined(PRE_ADD_CHAT_MISSION)
int CDNUserBase::OnRecvMissionMessage( int nSubCmd, char* pData, int nLen )
{
switch( nSubCmd )
{
case eMission::CS_CHAT_MISSION:
{
if (sizeof(CSChatMission) != nLen)
return ERROR_INVALIDPACKET;
CSChatMission *pPacket = (CSChatMission*)pData;
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> MID <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ -> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4> <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Է<EFBFBD><D4B7>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ξ<EFBFBD> <20><><EFBFBD>ٰ<EFBFBD> <20>ǴܵǾ<DCB5> <20><> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>н<EFBFBD>
if(!g_pDataManager->CheckTypingData(pPacket->nUIStringMid))
return ERROR_INVALIDPACKET; //<2F><>Ŷ<EFBFBD><C5B6> Mid <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>峭ġ<E5B3AD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GetEventSystem()->OnEvent( EventSystem::OnChatMission, 1, EventSystem::UIStringMID, pPacket->nUIStringMid );
return ERROR_NONE;
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
#endif
TSkillGroup *CDNUserBase::GetSkillData( bool bEntireData/* = false*/ )
{
if(!bEntireData && m_UserData.Status.cSkillPage >= DualSkill::Type::Primary && m_UserData.Status.cSkillPage < DualSkill::Type::MAX)
return &m_UserData.Skill[m_UserData.Status.cSkillPage];
return m_UserData.Skill;
}
void CDNUserBase::SetAccountName(WCHAR *pAccountName)
{
if ( !pAccountName ) return;
_wcscpy(m_wszAccountName, _countof(m_wszAccountName), pAccountName, (int)wcslen(pAccountName));
WideCharToMultiByte(CP_ACP, 0, m_wszAccountName, -1, m_szAccountName, IDLENMAX, NULL, NULL);
}
void CDNUserBase::SetCharacterName(const WCHAR* pwszName)
{
if (!pwszName) return;
_wcscpy(m_UserData.Status.wszCharacterName, _countof(m_UserData.Status.wszCharacterName), pwszName, (int)wcslen(pwszName));
WideCharToMultiByte(CP_ACP, 0, GetCharacterName(), -1, m_szCharacterName, NAMELENMAX, NULL, NULL);
}
void CDNUserBase::SetMapIndex(int nMapIndex)
{
if (nMapIndex <= 0) return;
m_UserData.Status.nMapIndex = nMapIndex;
}
void CDNUserBase::SetLastMapIndex( int nMapIndex )
{
if (nMapIndex <= 0) return;
#if defined( _VILLAGESERVER )
const sChannelInfo* pChannelInfo = g_pMasterConnection->GetChannelInfoFromMapIndex( nMapIndex );
if( pChannelInfo && !(pChannelInfo->nChannelAttribute&GlobalEnum::CHANNEL_ATT_USELASTMAPINDEX) )
{
m_UserData.Status.nLastVillageMapIndex = nMapIndex;
}
#elif defined(_GAMESERVER)
int nAttribute = g_pDataManager->GetChannelMapAtt(GetWorldSetID(), nMapIndex);
if (nAttribute == 0) return;
if( !(nAttribute&GlobalEnum::CHANNEL_ATT_USELASTMAPINDEX) )
{
m_UserData.Status.nLastVillageMapIndex = nMapIndex;
}
#endif
}
#if defined(PRE_ADD_EXPUP_ITEM)
void CDNUserBase::ChangeExp(int nChangeExp, int nLogCode, INT64 biFKey, bool bAbsolute)
#else
void CDNUserBase::ChangeExp(int nChangeExp, int nLogCode, INT64 biFKey)
#endif
{
if( nLogCode != DBDNWorldDef::CharacterExpChangeCode::Admin && nChangeExp == 0)
return;
#ifndef _WORK
if( m_UserData.Status.cAccountLevel < AccountLevel_Master ) {
int nLevelLimit = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PlayerLevelLimit );
if( m_UserData.Status.cLevel >= nLevelLimit ) return;
}
#endif
#if defined( _VILLAGESERVER )
#if defined(PRE_ADD_EXPUP_ITEM)
if( nChangeExp > 0 && !bAbsolute ) // <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD>
#else
if( nChangeExp > 0 )
#endif
{
TPlayerCommonLevelTableInfo* pPlayerCommonLevelTableInfo = g_pDataManager->GetPlayerCommonLevelTable(GetLevel());
if( pPlayerCommonLevelTableInfo )
{
//<2F><><EFBFBD>⼭ 1.5<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ִ°<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>....dyss)
nChangeExp = (int)(nChangeExp * pPlayerCommonLevelTableInfo->fAddGainExp);
}
#if defined(PRE_ADD_WEEKLYEVENT)
int nThreadID = 0;
#ifdef _GAMESERVER
nThreadID = m_pSession->GetGameRoom()->GetServerID();
#endif //#ifdef _GAMESERVER
float fEventValue = g_pDataManager->GetWeeklyEventValuef(WeeklyEvent::Player, GetClassID(), WeeklyEvent::Event_5, nThreadID);
if (fEventValue != 0.f)
nChangeExp += (int)(nChangeExp * fEventValue);
#endif // #if defined(PRE_ADD_WEEKLYEVENT)
}
#endif // #if defined( _VILLAGESERVER )
int nExp = nChangeExp;
#if defined(_CH) && defined(_VILLAGESERVER)
#if defined(PRE_ADD_EXPUP_ITEM)
if( !bAbsolute )
#endif
{
if (GetFCMState() == FCMSTATE_HALF){
nExp = nChangeExp / 2;
}
else if (GetFCMState() == FCMSTATE_ZERO){
nExp = 0;
return;
}
}
#endif // _CH
m_UserData.Status.nExp += nExp;
#ifndef _WORK
if( m_UserData.Status.cAccountLevel < AccountLevel_Master ) {
int nLevelLimit = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PlayerLevelLimit );
int nLimitExp = g_pDataManager->GetExp( GetUserJob(), nLevelLimit );
// if( m_UserData.Status.nExp == nLimitExp ) return;
// else
if( m_UserData.Status.nExp > nLimitExp ) m_UserData.Status.nExp = nLimitExp;
}
#endif
BYTE cLevel = g_pDataManager->GetLevel(GetUserJob(), GetExp());
#ifndef _WORK
if( m_UserData.Status.cAccountLevel < AccountLevel_Master ) {
int nLevelLimit = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PlayerLevelLimit );
if (cLevel > nLevelLimit) cLevel = nLevelLimit;
}
#else
if (cLevel > CHARLEVELMAX) cLevel = CHARLEVELMAX;
#endif
if (cLevel > m_UserData.Status.cLevel){ // <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, true); // <20><><EFBFBD>⼭ db<64><62><EFBFBD><EFBFBD>
if( IsPCBang() )
{
//<2F>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ҋ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EBB0A1><EFBFBD><EFBFBD> Īȣ<C4AA><C8A3> <20>ִ<EFBFBD><D6B4><EFBFBD> üũ <20><> <20><><EFBFBD><EFBFBD>
m_pAppellation->SetPCbangAppellation(true);
}
m_pDBCon->QueryExp(m_pSession, nLogCode, biFKey);
}
else{
if (nLogCode != DBDNWorldDef::CharacterExpChangeCode::Dungeon) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ´<CAB4>
{
m_pDBCon->QueryExp(m_pSession, nLogCode, biFKey);
}
#if defined(_VILLAGESERVER)
if( nExp > 0 )
SendAddExp(m_nSessionID, m_UserData.Status.nExp, nExp);
#endif
}
}
void CDNUserBase::SetExp(UINT nExp, int nLogCode, INT64 biFKey, bool bDBSave)
{
if (m_UserData.Status.nExp == nExp) return;
int nGapExp = nExp - m_UserData.Status.nExp;
m_UserData.Status.nExp = nExp;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#ifndef _WORK
if( m_UserData.Status.cAccountLevel < AccountLevel_Master ) {
int nLevelLimit = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PlayerLevelLimit );
int nLimitExp = g_pDataManager->GetExp( GetUserJob(), nLevelLimit );
if( m_UserData.Status.nExp > nLimitExp ) {
m_UserData.Status.nExp = nLimitExp;
}
}
#endif
if (bDBSave)
{
m_pDBCon->QueryExp(m_pSession, nLogCode, biFKey);
}
}
void CDNUserBase::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 defined(PRE_ADD_EXPUP_ITEM)
BYTE cPreLevel = GetLevel();
#endif
m_UserData.Status.cLevel = cLevel;
if (bDBSave){
m_pDBCon->QueryLevel(m_pSession, nLogCode); // level db<64><62><EFBFBD><EFBFBD> 20100128
}
#if defined(PRE_ADD_EXPUP_ITEM)
if (cPreLevel < cLevel)
{
for( BYTE bCurLevel=cPreLevel+1; bCurLevel<=cLevel; ++bCurLevel)
{
SendLevelupEventMail(bCurLevel, GetClassID(), GetUserJob());
}
}
#else
SendLevelupEventMail(GetLevel(), GetClassID(), GetUserJob());
#endif // #if defined(PRE_ADD_EXPUP_ITEM)
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
if (cPreLevel < cLevel)
{
AddTotalLevelSkillLevel(cLevel - cPreLevel);
SendTotalLevel( m_pSession->GetSessionID(), GetTotalLevelSkillLevel() );
}
#endif
#if defined( PRE_MOD_71820 )
const TGuildUID GuildUID = GetGuildUID();
if (GuildUID.IsSet())
{
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (pGuild)
{
#if defined(PRE_ADD_JOINGUILD_SUPPORT)
if (GetDBConnection() && bDBSave)
GetDBConnection()->QueryGuildSupportRewardInfo(m_pSession);
#endif //#if defined(PRE_ADD_JOINGUILD_SUPPORT)
}
else
_DANGER_POINT();
}
#endif // #if defined( PRE_MOD_71820 )
#if defined(_KRAZ)
m_pDBCon->QueryActozUpdateCharacterInfo(m_pSession, ActozCommon::UpdateType::Levelup);
#endif // #if defined(_KRAZ)
}
unsigned char CDNUserBase::GetLevel()
{
if (m_UserData.Status.cLevel <= 0) m_UserData.Status.cLevel = 1;
if (m_UserData.Status.cLevel > CHARLEVELMAX) m_UserData.Status.cLevel = CHARLEVELMAX;
return m_UserData.Status.cLevel;
}
#if defined(PRE_ADD_PVPLEVEL_MISSION)
void CDNUserBase::SetPvPLevel(BYTE cLevel, bool bCallEvent)
{
m_UserData.PvP.cLevel = cLevel;
if(bCallEvent)
GetEventSystem()->OnEvent( EventSystem::OnPvPLevelChange );
}
#endif
void CDNUserBase::SetUserJob(BYTE cJob)
{
m_UserData.Status.cJob = cJob;
m_pDBCon->QueryJob(m_pSession, cJob);
GetEventSystem()->OnEvent( EventSystem::OnJobChange );
for (int i = 0; i < JOBMAX; i++)
{
if (m_UserData.Status.cJobArray[i] > 0)
continue;
m_UserData.Status.cJobArray[i] = cJob;
#if defined(_VILLAGESERVER)
if( GetPartyID() > 0)
{
CDNParty *Party = g_pPartyManager->GetParty(GetPartyID());
if(Party)
{
Party->SendAllRefreshParty( PARTYREFRESH_NONE );
}
}
#endif
return;
}
}
// Coin
bool CDNUserBase::AddCoin(INT64 nCoin, int nLogCode, INT64 biFKey, bool bSend)
{
if ((nCoin <= 0) ||(nCoin > COINMAX)) return false;
if (m_UserData.Status.nCoin + nCoin > COINMAX) return false;
INT64 nTotalCoin = m_UserData.Status.nCoin;
m_UserData.Status.nCoin += nCoin;
if (m_UserData.Status.nCoin <= 0) m_UserData.Status.nCoin = 0;
if (m_UserData.Status.nCoin >= COINMAX) m_UserData.Status.nCoin = COINMAX; // <20>ϴ<EFBFBD> 42<34><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (nLogCode > 0)
m_pDBCon->QueryCoin(m_pSession, nLogCode, biFKey, nCoin, m_UserData.Status.nCoin); // coin db<64><62><EFBFBD><EFBFBD>
if (bSend) SendAddCoin(m_nSessionID, nTotalCoin, nCoin);
// <20><> ȹ<><C8B9><EFBFBD>ÿ<EFBFBD> ItemID <20><> 0
GetEventSystem()->OnEvent( EventSystem::OnItemGain, 2, EventSystem::ItemID, 0, EventSystem::UseCoinCount, (int)nCoin );
return true;
}
bool CDNUserBase::DelCoin(INT64 nCoin, int nLogCode, INT64 biFKey, bool bSend)
{
if ((nCoin <= 0) ||(nCoin > COINMAX)) return false;
if (m_UserData.Status.nCoin < nCoin) return false;
INT64 nTotalCoin = m_UserData.Status.nCoin;
m_UserData.Status.nCoin -= nCoin;
if (m_UserData.Status.nCoin <= 0) m_UserData.Status.nCoin = 0;
if (m_UserData.Status.nCoin >= COINMAX) m_UserData.Status.nCoin = COINMAX; // <20>ϴ<EFBFBD> 42<34><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (nLogCode > 0)
m_pDBCon->QueryCoin(m_pSession, nLogCode, biFKey, -nCoin, m_UserData.Status.nCoin); // coin db<64><62><EFBFBD><EFBFBD>
if (bSend) SendAddCoin(m_nSessionID, nTotalCoin, -nCoin);
return true;
}
INT64 CDNUserBase::GetCoin()
{
if (m_UserData.Status.nCoin <= 0) m_UserData.Status.nCoin = 0;
if (m_UserData.Status.nCoin >= COINMAX) m_UserData.Status.nCoin = COINMAX; // <20>ϴ<EFBFBD> 42<34><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
return m_UserData.Status.nCoin;
}
bool CDNUserBase::CheckEnoughCoin(INT64 nCheckCoin)
{
if (nCheckCoin < 0) return false; // Ȥ<>ø<EFBFBD><C3B8><EFBFBD> overflow<6F>Ȱ<EFBFBD> üũ
if (nCheckCoin > GetCoin()) return false; // <20>ָӴϿ<D3B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~
return true;
}
bool CDNUserBase::CheckMaxCoin(INT64 nCheckCoin)
{
if (GetCoin() + nCheckCoin > COINMAX) return false; // max<61><78> <20>Ѿ<EFBFBD><D1BE><EFBFBD>
return true;
}
void CDNUserBase::SetWarehouseCoin(INT64 nCoin)
{
if ((nCoin <= 0) ||(nCoin > COINMAX)) return;
if (m_UserData.Status.nWarehouseCoin == nCoin) return;
m_UserData.Status.nWarehouseCoin = nCoin;
if (m_UserData.Status.nWarehouseCoin > COINMAX) m_UserData.Status.nWarehouseCoin = COINMAX;
m_pDBCon->QueryWarehouseCoin(m_pSession, DBDNWorldDef::CoinChangeCode::Use, nCoin, GetCoin(), GetWarehouseCoin()); // warehousecoin db<64><62><EFBFBD><EFBFBD>
}
void CDNUserBase::AddWarehouseCoin(INT64 nCoin, int nLogCode, INT64 biFKey)
{
if ((nCoin <= 0) ||(nCoin > COINMAX)) return;
if (m_UserData.Status.nWarehouseCoin + nCoin > COINMAX) return;
m_UserData.Status.nWarehouseCoin += nCoin;
if (m_UserData.Status.nWarehouseCoin > COINMAX) m_UserData.Status.nWarehouseCoin = COINMAX;
if (m_UserData.Status.nWarehouseCoin < 0) m_UserData.Status.nWarehouseCoin = 0;
if (nLogCode > 0)
m_pDBCon->QueryWarehouseCoin(m_pSession, nLogCode, nCoin, GetCoin(), GetWarehouseCoin()); // warehousecoin db<64><62><EFBFBD><EFBFBD>
}
void CDNUserBase::DelWarehouseCoin(INT64 nCoin, int nLogCode, INT64 biFKey)
{
if ((nCoin <= 0) ||(nCoin > COINMAX)) return;
if (nCoin > m_UserData.Status.nWarehouseCoin) return;
m_UserData.Status.nWarehouseCoin -= nCoin;
if (m_UserData.Status.nWarehouseCoin > COINMAX) m_UserData.Status.nWarehouseCoin = COINMAX;
if (m_UserData.Status.nWarehouseCoin < 0) m_UserData.Status.nWarehouseCoin = 0;
if (nLogCode > 0)
m_pDBCon->QueryWarehouseCoin(m_pSession, nLogCode, nCoin, GetCoin()+nCoin, GetWarehouseCoin()); // warehousecoin db<64><62><EFBFBD><EFBFBD>
}
INT64 CDNUserBase::GetWarehouseCoin()
{
if (m_UserData.Status.nWarehouseCoin <= 0) m_UserData.Status.nWarehouseCoin = 0;
if (m_UserData.Status.nWarehouseCoin >= COINMAX) m_UserData.Status.nWarehouseCoin = COINMAX; // <20>ϴ<EFBFBD> 42<34><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
return m_UserData.Status.nWarehouseCoin;
}
bool CDNUserBase::CheckEnoughWarehouseCoin(INT64 nCheckCoin)
{
if (nCheckCoin > GetWarehouseCoin()) return false; // <20>ָӴϿ<D3B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~
return true;
}
bool CDNUserBase::CheckMaxWarehouseCoin(INT64 nCheckCoin)
{
if (GetWarehouseCoin() + nCheckCoin > COINMAX) return false; // max<61><78> <20>Ѿ<EFBFBD><D1BE><EFBFBD>
return true;
}
// SkillPoint
void CDNUserBase::ChangeSkillPoint(unsigned short nPoint, int nSkillID, bool bDBSave, int nLogCode, char cSkillPage)
{
if (nPoint == 0) return;
if (cSkillPage == DualSkill::Type::MAX)
{
cSkillPage = GetSkillPage();
}
if(cSkillPage < DualSkill::Type::Primary || cSkillPage >= DualSkill::Type::MAX)
return;
m_UserData.Skill[cSkillPage].wSkillPoint += nPoint;
if (m_UserData.Skill[cSkillPage].wSkillPoint <= 0) m_UserData.Skill[cSkillPage].wSkillPoint = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (bDBSave){
m_pDBCon->QueryIncreaseSkillPoint(m_pSession, nPoint, nLogCode, cSkillPage); // <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ db<64><62><EFBFBD><EFBFBD>
}
}
void CDNUserBase::SetSkillPoint(USHORT nPoint, char cSkillPage)
{
if (nPoint == 0) return;
//// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD>ų<EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>~
//if ( nPoint <= GetSkillPoint() ) return;
if( cSkillPage < DualSkill::Type::Primary || cSkillPage >= DualSkill::Type::MAX)
return;
m_UserData.Skill[cSkillPage].wSkillPoint = nPoint;
if (m_UserData.Skill[cSkillPage].wSkillPoint <= 0) m_UserData.Skill[cSkillPage].wSkillPoint = 0;
}
// SkillPoint <20><><EFBFBD><EFBFBD>. ġƮŰ<C6AE><C5B0> <20><>ų <20><><EFBFBD><EFBFBD> <20>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
void CDNUserBase::SetCheatSkillPoint(unsigned short nPoint, int nSkillID)
{
if (nPoint == 0) return;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD>ų<EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>~
if ( nPoint <= GetSkillPoint() )
return;
USHORT unIncreasePoint = nPoint-GetSkillPoint();
m_UserData.Skill[GetSkillPage()].wSkillPoint = nPoint;
if (m_UserData.Skill[GetSkillPage()].wSkillPoint <= 0) m_UserData.Skill[GetSkillPage()].wSkillPoint = 0;
m_pDBCon->QueryIncreaseSkillPoint(m_pSession, unIncreasePoint, DBDNWorldDef::SkillPointCode::LevelUp, GetSkillPage());
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵Ǵ<DBB5> <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> cheatset <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǾ<D4B5> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
SendPushSkillPoint( nPoint );
}
USHORT CDNUserBase::GetSkillPoint() //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><>ųƮ<C5B3><C6AE> <20><><EFBFBD><EFBFBD>Ʈ
{
return m_UserData.Skill[m_UserData.Status.cSkillPage].wSkillPoint;
}
//Ư<><C6AF> <20><>ųƮ<C5B3><C6AE> <20><><EFBFBD><EFBFBD>Ʈ
USHORT CDNUserBase::GetSkillPoint(int nSkillPageIndex)
{
if(nSkillPageIndex >= DualSkill::Type::Primary && nSkillPageIndex <= DualSkill::Type::Secondary)
return m_UserData.Skill[nSkillPageIndex].wSkillPoint;
return 0;
}
float CDNUserBase::GetAvailSkillPointRatioByJob( int nSkillID )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
const TSkillData* pSkillData = g_pDataManager->GetSkillData( nSkillID );
if (!pSkillData) return 0.f;
//const TJobTableData* pJobData = g_pDataManager->GetJobTableData( pSkillData->nNeedJobID );
const TJobTableData* pJobData = g_pDataManager->GetJobTableData( GetUserJob() );
if (!pJobData) return 0.f;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
float fLimitRatio = pJobData->afMaxUsingSP[ g_pDataManager->GetJobNumber( pSkillData->nNeedJobID ) ];
//int iSkillPoint = GetSkillPoint();
// <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> SP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ + <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ = (ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - 1) * 20
//int nTotalSP = m_pUserSession->GetSkillPoint() + nUseSkillPoint - m_pUserSession->GetStatusData()->wEternityItem[ETERNITY_SP - 1];
return fLimitRatio;
}
void CDNUserBase::SetCheatMaxFatigue()
{
int nMax = g_pDataManager->GetFatigue(GetUserJob(), GetLevel());
if (GetFatigue() != nMax){
m_UserData.Status.wFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Daily, nMax);
}
nMax = g_pDataManager->GetWeeklyFatigue(GetUserJob(), GetLevel());
if (GetWeeklyFatigue() != nMax){
m_UserData.Status.wWeeklyFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Weekly, nMax);
}
nMax = g_pDataManager->GetPCBangParam1(PCBang::Type::Fatigue, GetPCBangGrade());
if (GetPCBangFatigue() != nMax){
m_UserData.Status.wPCBangFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::PCBang, nMax);
}
#if defined(PRE_ADD_VIP)
nMax = g_pDataManager->GetVIPFatigue(GetClassID(), GetLevel());
if (GetVIPFatigue() != nMax){
m_UserData.Status.wVIPFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::VIP, nMax);
}
#endif // #if defined(PRE_ADD_VIP)
SendFatigue(m_nSessionID, GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
void CDNUserBase::SetCheatFatigue(int nFatigue, int nWeeklyFatigue, int nPCBangFatigue, int nEventFatigue, int nVIPFatigue)
{
if ((nFatigue > 0) && (m_UserData.Status.wFatigue != nFatigue)){
int nMax = g_pDataManager->GetFatigue(GetUserJob(), GetLevel());
if (nFatigue != nMax){
if (nFatigue > nMax) nFatigue = nMax;
m_UserData.Status.wFatigue = nFatigue;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Daily, nFatigue);
}
}
if ((nWeeklyFatigue > 0) && (m_UserData.Status.wWeeklyFatigue != nWeeklyFatigue)){
int nMax = g_pDataManager->GetWeeklyFatigue(GetUserJob(), GetLevel());
if (nWeeklyFatigue != nMax){
if (nWeeklyFatigue > nMax) nWeeklyFatigue = nMax;
m_UserData.Status.wWeeklyFatigue = nWeeklyFatigue;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Weekly, nWeeklyFatigue);
}
}
if ((nPCBangFatigue > 0) && (m_UserData.Status.wPCBangFatigue != nPCBangFatigue)){
int nMax = g_pDataManager->GetPCBangParam1(PCBang::Type::Fatigue, GetPCBangGrade());
if (nPCBangFatigue != nMax){
if (nPCBangFatigue > nMax) nPCBangFatigue = nMax;
m_UserData.Status.wPCBangFatigue = nPCBangFatigue;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::PCBang, nPCBangFatigue);
}
}
if ((nEventFatigue > 0) && (m_UserData.Status.wEventFatigue != nEventFatigue)){
int nMax = GetMaxEventFatigue();
if (nEventFatigue != nMax){
if (nEventFatigue > nMax) nEventFatigue = nMax;
m_UserData.Status.wEventFatigue = nEventFatigue;
m_pDBCon->QueryEventFatigue(m_pSession, nEventFatigue, false, 0);
}
}
#if defined(PRE_ADD_VIP)
if ((nVIPFatigue > 0) && (m_UserData.Status.wVIPFatigue != nVIPFatigue)){
int nMax = g_pDataManager->GetVIPFatigue(GetClassID(), GetLevel());
if (nVIPFatigue != nMax){
if (nVIPFatigue > nMax) nVIPFatigue = nMax;
m_UserData.Status.wVIPFatigue = nVIPFatigue;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::VIP, nVIPFatigue);
}
}
#endif // #if defined(PRE_ADD_VIP)
SendFatigue(m_nSessionID, GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
void CDNUserBase::SetDefaultMaxFatigue(bool bSend)
{
int nMax = g_pDataManager->GetFatigue(GetUserJob(), GetLevel());
m_UserData.Status.wFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Daily, nMax);
#if defined(_CH)
nMax = 0;
#else // #if defined(_CH)
// <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>̵<EFBFBD> <20>ƴϵ<C6B4> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>Ϲݿ<CFB9><DDBF><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>;<EFBFBD><CDBE><EFBFBD>)
nMax = g_pDataManager->GetPCBangParam1(PCBang::Type::Fatigue, PCBang::Grade::Normal);
#endif // #if !defined(_CH)
m_UserData.Status.wPCBangFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::PCBang, nMax);
#if defined(PRE_ADD_VIP)
nMax = g_pDataManager->GetVIPFatigue(GetClassID(), GetLevel());
m_UserData.Status.wVIPFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::VIP, nMax);
#endif // #if defined(PRE_ADD_VIP)
if (bSend) SendFatigue(m_nSessionID, GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
void CDNUserBase::SetDefaultMaxWeeklyFatigue(bool bSend)
{
int nMax = g_pDataManager->GetWeeklyFatigue(GetUserJob(), GetLevel());
m_UserData.Status.wWeeklyFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Weekly, nMax);
if (bSend) SendFatigue(m_nSessionID, GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
#if defined(PRE_ADD_VIP)
void CDNUserBase::SetDefaultVIPFatigue()
{
int nMax = g_pDataManager->GetVIPFatigue(GetClassID(), GetLevel());
m_UserData.Status.wVIPFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::VIP, nMax);
SendFatigue(m_nSessionID, GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
// VIPRebirthCoin<69><6E> <20><><EFBFBD><20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_cVIPRebirthCoin = g_pDataManager->GetVIPRebirthCoinCount(GetLevel());
m_pDBCon->QueryRebirthCoin(m_pSession, GetRebirthCoin(), GetPCBangRebirthCoin(), m_cVIPRebirthCoin);
SendRebirthCoin(ERROR_NONE, 0, _REBIRTH_SELF, m_nSessionID);
}
#endif // #if defined(PRE_ADD_VIP)
void CDNUserBase::SetDefaultPCBangFatigue()
{
int nMax = g_pDataManager->GetPCBangParam1(PCBang::Type::Fatigue, GetPCBangGrade());
m_UserData.Status.wPCBangFatigue += nMax; // <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD>޺<EFBFBD><DEBA><EFBFBD> <20>ŰܴٴҼ<D9B4><D2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::PCBang, m_UserData.Status.wPCBangFatigue);
SendFatigue(m_nSessionID, GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
void CDNUserBase::SetFatigue(int nFatigue, int nWeeklyFatigue, int nPCBangFatigue, int nEventFatigue, int nVIPFatigue, bool bDBSave/* = true*/)
{
if ((nFatigue > 0) && (m_UserData.Status.wFatigue != nFatigue)){
int nMax = g_pDataManager->GetFatigue(GetUserJob(), GetLevel());
if (nFatigue != nMax){
if (nFatigue > nMax) nFatigue = nMax;
m_UserData.Status.wFatigue = nFatigue;
if (bDBSave) m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Daily, nFatigue);
}
}
if ((nWeeklyFatigue > 0) && (m_UserData.Status.wWeeklyFatigue != nWeeklyFatigue)){
int nMax = g_pDataManager->GetWeeklyFatigue(GetUserJob(), GetLevel());
if (nWeeklyFatigue != nMax){
if (nWeeklyFatigue > nMax) nWeeklyFatigue = nMax;
m_UserData.Status.wWeeklyFatigue = nWeeklyFatigue;
if (bDBSave) m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Weekly, nWeeklyFatigue);
}
}
if ((nPCBangFatigue > 0) && (m_UserData.Status.wPCBangFatigue != nPCBangFatigue)){
int nMax = g_pDataManager->GetPCBangParam1(PCBang::Type::Fatigue, GetPCBangGrade());
if (nPCBangFatigue != nMax){
if (nPCBangFatigue > nMax) nPCBangFatigue = nMax;
m_UserData.Status.wPCBangFatigue = nPCBangFatigue;
if (bDBSave) m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::PCBang, nPCBangFatigue);
}
}
if ((nEventFatigue > 0) && (m_UserData.Status.wEventFatigue != nEventFatigue)){
int nMax = GetMaxEventFatigue();
if (nEventFatigue != nMax){
if (nEventFatigue > nMax) nEventFatigue = nMax;
m_UserData.Status.wEventFatigue = nEventFatigue;
if (bDBSave)
m_pDBCon->QueryEventFatigue(m_pSession, nEventFatigue, false, 0);
}
}
#if defined(PRE_ADD_VIP)
if ((nVIPFatigue > 0) && (m_UserData.Status.wVIPFatigue != nVIPFatigue)){
int nMax = g_pDataManager->GetVIPFatigue(GetClassID(), GetLevel());
if (nVIPFatigue != nMax){
if (nVIPFatigue > nMax) nVIPFatigue = nMax;
m_UserData.Status.wVIPFatigue = nVIPFatigue;
if (bDBSave) m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::VIP, nVIPFatigue);
}
}
#endif // #if defined(PRE_ADD_VIP)
SendFatigue(m_nSessionID, GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
void CDNUserBase::DecreaseFatigue(int nGap)
{
// Event > PC<50><43>(PCBangFatigue) > VIP > <20><><EFBFBD><EFBFBD>(Fatigue) > <20>ְ<EFBFBD>(WeeklyFatigue)
int nRemainEvent = nGap;
if (GetEventFatigue() > 0){
if (GetEventFatigue() < nRemainEvent)
nRemainEvent -= GetEventFatigue();
else
nRemainEvent -= nGap;
DelEventFatigue(nGap - nRemainEvent);
}
if (nRemainEvent == 0) return;
int nRemainPCBang = nRemainEvent;
if (GetPCBangFatigue() > 0){
if (GetPCBangFatigue() < nRemainPCBang)
nRemainPCBang -= GetPCBangFatigue();
else
nRemainPCBang -= nRemainEvent;
DelPCBangFatigue(nRemainEvent - nRemainPCBang);
}
if (nRemainPCBang == 0) return;
#if defined(PRE_ADD_VIP)
int nRemainVIP = nRemainPCBang;
if (GetVIPFatigue() > 0){
if (GetVIPFatigue() < nRemainVIP)
nRemainVIP -= GetVIPFatigue();
else
nRemainVIP -= nRemainPCBang;
DelVIPFatigue(nRemainPCBang - nRemainVIP);
}
if (nRemainVIP == 0) return;
int nRemain = nRemainVIP;
if (GetFatigue() > 0){
if (GetFatigue() < nRemain)
nRemain -= GetFatigue();
else
nRemain -= nRemainVIP;
DelFatigue(nRemainVIP - nRemain);
}
if (nRemain == 0) return;
#else // #if defined(PRE_ADD_VIP)
int nRemain = nRemainPCBang;
if (GetFatigue() > 0){
if (GetFatigue() < nRemain)
nRemain -= GetFatigue();
else
nRemain -= nRemainPCBang;
DelFatigue(nRemainPCBang - nRemain);
}
if (nRemain == 0) return;
#endif // #if defined(PRE_ADD_VIP)
int nRemainWeekly = nRemain;
if (GetWeeklyFatigue() > 0){
if (GetWeeklyFatigue() < nRemainWeekly)
nRemainWeekly -= GetWeeklyFatigue();
else
nRemainWeekly -= nRemain;
DelWeeklyFatigue(nRemain - nRemainWeekly);
}
if (nRemainWeekly == 0) return;
}
void CDNUserBase::IncreaseFatigue(int nGap)
{
if (nGap > 0){
int nMax = g_pDataManager->GetFatigue(GetUserJob(), GetLevel());
m_UserData.Status.wFatigue += nGap;
if (m_UserData.Status.wFatigue > nMax) m_UserData.Status.wFatigue = nMax;
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Daily, m_UserData.Status.wFatigue);
}
}
int CDNUserBase::GetPCBangFatigue()
{
if (m_bPCBang) return m_UserData.Status.wPCBangFatigue;
return 0;
}
int CDNUserBase::GetVIPFatigue()
{
if (m_bVIP) return m_UserData.Status.wVIPFatigue;
return 0;
}
int CDNUserBase::GetMaxEventFatigue()
{
#if defined(PRE_ADD_WORLD_EVENT)
int nMax = g_pEvent->GetExtendFatigue(GetClassID());
#else
int nMax = g_pEvent->GetExtendFatigue();
#endif //#if defined(PRE_ADD_WORLD_EVENT)
if (nMax <= 0)
nMax = g_pDataManager->GetFatigue(GetUserJob(), GetLevel());
return nMax;
}
void CDNUserBase::ResetEventFatigue(int nResetTime)
{
m_UserData.Status.wEventFatigue = 0;
m_pDBCon->QueryEventFatigue(m_pSession, 0, true, nResetTime);
SendFatigue(m_nSessionID, GetFatigue(), GetWeeklyFatigue(), GetPCBangFatigue(), GetEventFatigue(), GetVIPFatigue());
}
int CDNUserBase::GetAllFatigue()
{
return GetFatigue()+GetWeeklyFatigue()+GetPCBangFatigue()+GetVIPFatigue()+GetEventFatigue();
}
void CDNUserBase::AddCashRebirthCoin(int nRebirthCount)
{
if (nRebirthCount < 0) return;
if( nRebirthCount == 0 )
{
// <20>α<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͻ<EFBFBD>Ŵ
g_Log.Log( LogType::_ERROR, m_pSession, L"AddCashRebirthCoin|[ADBID:%u, CDBID:%I64d, SID:%u] AddCashRebirthCoin Failed!", GetAccountDBID(), GetCharacterDBID(), m_pSession->GetSessionID() );
return;
}
m_UserData.Status.wCashRebirthCoin += nRebirthCount;
int nMax = g_pDataManager->GetCashCoinLimit(GetLevel());
if (m_UserData.Status.wCashRebirthCoin > nMax)
m_UserData.Status.wCashRebirthCoin = nMax;
#if defined(_VILLAGESERVER)
SendRebirthCoin(ERROR_NONE, 0, _REBIRTH_SELF, m_nSessionID);
#elif defined(_GAMESERVER)
if(m_pSession && m_pSession->GetPlayerActor() && m_pSession->GetPlayerActor()->GetPartyData())
SendRebirthCoin(ERROR_NONE, m_pSession->GetPlayerActor()->GetPartyData()->nUsableRebirthCoin, _REBIRTH_SELF, m_nSessionID);
#endif // #if defined(_VILLAGESERVER)
}
void CDNUserBase::SetDefaultMaxRebirthCoin(bool bSend)
{
int nMax = g_pDataManager->GetCoinCount(GetLevel(), GetWorldSetID());
m_UserData.Status.cRebirthCoin = nMax;
#if defined(PRE_ADD_VIP)
if (IsVIP()){
m_cVIPRebirthCoin = g_pDataManager->GetVIPRebirthCoinCount(GetLevel());
}
#endif // #if defined(PRE_ADD_VIP)
int nPCMax = 0;
#if !defined(_CH)
nPCMax = g_pDataManager->GetPCBangParam1(PCBang::Type::RebirthCoin, PCBang::Grade::Normal);
#endif // #if !defined(_CH)
m_UserData.Status.cPCBangRebirthCoin = nPCMax;
m_pDBCon->QueryRebirthCoin(m_pSession, nMax, nPCMax, GetVIPRebirthCoin());
}
void CDNUserBase::SetDefaultPCBangRebirthCoin()
{
int nPCMax = g_pDataManager->GetPCBangParam1(PCBang::Type::RebirthCoin, GetPCBangGrade());
m_UserData.Status.cPCBangRebirthCoin += nPCMax; // <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD>޺<EFBFBD><DEBA><EFBFBD> <20>ŰܴٴҼ<D9B4><D2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
m_pDBCon->QueryRebirthCoin(m_pSession, GetRebirthCoin(), m_UserData.Status.cPCBangRebirthCoin, GetVIPRebirthCoin());
SendRebirthCoin(ERROR_NONE, 0, _REBIRTH_SELF, m_nSessionID);
}
void CDNUserBase::SetRebirthCoin(int nRebirthCoin, int nPCBangRebirthCoin, int nRebirthCashCoin)
{
if ((nRebirthCoin > 0) && (m_UserData.Status.cRebirthCoin != nRebirthCoin)){
int nMax = g_pDataManager->GetCoinLimit(GetLevel());
if (nRebirthCoin > nMax) nRebirthCoin = nMax;
m_UserData.Status.cRebirthCoin = nRebirthCoin;
}
if ((nPCBangRebirthCoin > 0) && (m_UserData.Status.cPCBangRebirthCoin != nPCBangRebirthCoin)){
int nMax = g_pDataManager->GetPCBangParam1(PCBang::Type::RebirthCoin, GetPCBangGrade());
if (nPCBangRebirthCoin > nMax) nPCBangRebirthCoin = nMax;
m_UserData.Status.cPCBangRebirthCoin = nPCBangRebirthCoin;
}
if ((nRebirthCashCoin > 0) && (m_UserData.Status.wCashRebirthCoin != nRebirthCashCoin)){
m_UserData.Status.wCashRebirthCoin += nRebirthCashCoin;
int nMax = g_pDataManager->GetCashCoinLimit(GetLevel());
if (m_UserData.Status.wCashRebirthCoin > nMax) m_UserData.Status.wCashRebirthCoin = nMax;
m_pDBCon->QueryAddCashRebirthCoin(m_pSession, nRebirthCashCoin, 0, DBDNWorldDef::CashRebirthCode::Admin, 0);
}
}
void CDNUserBase::AddRebirthCoin(int nRebirthCoin, int nRebirthCashCoin)
{
//CheckRebirthCoin<69><6E><EFBFBD><EFBFBD> <20>ƽ<EFBFBD><C6BD><EFBFBD> üũ<C3BC>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2BCAD> üũ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (nRebirthCoin > 0)
{
m_UserData.Status.cRebirthCoin += nRebirthCoin;
m_pDBCon->QueryRebirthCoin(m_pSession, m_UserData.Status.cRebirthCoin, m_UserData.Status.cPCBangRebirthCoin, 0);
}
else if (nRebirthCashCoin > 0)
{
m_UserData.Status.wCashRebirthCoin += nRebirthCashCoin;
m_pDBCon->QueryAddCashRebirthCoin(m_pSession, nRebirthCashCoin, 0, DBDNWorldDef::CashRebirthCode::Item, 0);
}
#if defined( _GAMESERVER )
if(m_pSession && m_pSession->GetPlayerActor() && m_pSession->GetPlayerActor()->GetPartyData())
SendRebirthCoin(ERROR_NONE, m_pSession->GetPlayerActor()->GetPartyData()->nUsableRebirthCoin, _REBIRTH_SELF, m_nSessionID);
#else
SendRebirthCoin(ERROR_NONE, 0, _REBIRTH_SELF, m_nSessionID);
#endif
}
bool CDNUserBase::CheckRebirthCoin(int nRebirthCoin, int nRebirthCashCoin)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD> <20>÷<EFBFBD><C3B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>°ɷ<C2B0> <20>ڵ<EFBFBD><DAB5>ϰ<EFBFBD> <20><><EFBFBD>߿<EFBFBD> Ȥ<><C8A4> <20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (nRebirthCoin > 0)
{
int nMax = g_pDataManager->GetCoinLimit(GetLevel());
if ( nMax >= m_UserData.Status.cRebirthCoin + nRebirthCoin )
{
return true;
}
}
else if (nRebirthCashCoin > 0)
{
int nMax = g_pDataManager->GetCashCoinLimit(GetLevel());
if (nMax >= m_UserData.Status.wCashRebirthCoin + nRebirthCashCoin)
{
return true;
}
}
return false;
}
bool CDNUserBase::DecreaseRebirthCoin(int nGap)
{
// PC<50><43>(PCBangRebirthCoin) > vip > <20><><EFBFBD><EFBFBD>(RebirthCoin) > ij<><C4B3>(RebirthCashCoin)
int nPCBangRemain = nGap;
if (GetPCBangRebirthCoin() > 0){
if (GetPCBangRebirthCoin() < nPCBangRemain)
nPCBangRemain -= GetPCBangRebirthCoin();
else
nPCBangRemain -= nGap;
DelPCBangRebirthCoin(nGap - nPCBangRemain);
}
if (nPCBangRemain == 0) return true;
int nVIPRemain = nPCBangRemain;
#if defined(PRE_ADD_VIP)
if (GetVIPRebirthCoin() > 0){
if (GetVIPRebirthCoin() < nVIPRemain)
nVIPRemain -= GetVIPRebirthCoin();
else
nVIPRemain -= nPCBangRemain;
DelVIPRebirthCoin(nPCBangRemain - nVIPRemain);
}
if (nVIPRemain == 0) return true;
#endif // #if defined(PRE_ADD_VIP)
int nRemain = nVIPRemain;
if (GetRebirthCoin() > 0){
if (GetRebirthCoin() < nRemain)
nRemain -= GetRebirthCoin();
else
nRemain -= nPCBangRemain;
DelRebirthCoin(nPCBangRemain - nRemain);
}
if (nRemain == 0) return true;
int nCashRemain = nRemain;
if (GetRebirthCashCoin() > 0){
if (GetRebirthCashCoin() < nCashRemain)
nCashRemain -= GetRebirthCashCoin();
else
nCashRemain -= nRemain;
DelCashRebirthCoin(nRemain - nCashRemain);
}
if (nCashRemain == 0) return true;
return false;
}
int CDNUserBase::GetPCBangRebirthCoin()
{
if (m_bPCBang) return m_UserData.Status.cPCBangRebirthCoin;
return 0;
}
BYTE CDNUserBase::GetVIPRebirthCoin()
{
if (m_bVIP) return m_cVIPRebirthCoin;
return 0;
}
int CDNUserBase::GetTotalRebirthCoin()
{
int iTotal = GetPCBangRebirthCoin()+GetRebirthCoin()+GetRebirthCashCoin();
#if defined(PRE_ADD_VIP)
iTotal += GetVIPRebirthCoin();
#endif // #if defined(PRE_ADD_VIP)
return iTotal;
}
// <20>̽<EFBFBD> #4036 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>...
bool CDNUserBase::ChangeDyeColor( int nItemType, int *pTypeParam )
{
DWORD dwColor = pTypeParam[0];
/*
if( pTypeParam[0] >= 0 ) {
dwColor = pTypeParam[0];
}
else { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
TItemDropData *pDropData = g_pDataManager->GetItemDropData( pTypeParam[1] );
int nTotalProb = 0;
for( int i = 0; i < 20; i++) {
if( pDropData->nProb[i] <= 0 ) continue;
if( pDropData->nInfo[i] < 1 ) continue;
nTotalProb += pDropData->nProb[i];
}
#if defined(_GAMESERVER)
int nMagicNumber = _rand(m_pSession->GetGameRoom()) % nTotalProb;
#elif defined(_VILLAGESERVER)
int nMagicNumber = _rand() % nTotalProb;
#endif
int nOffset = 0;
for( int i = 0; i < 20; i++) {
if( pDropData->nProb[i] <= 0 ) continue;
if( pDropData->nInfo[i] < 1 ) continue;
if( nOffset <= nMagicNumber && nMagicNumber < nOffset + pDropData->nProb[i] ) {
dwColor = (DWORD)(pDropData->nIndex[ i ]);
break;
}
nOffset += pDropData->nProb[i];
}
}
*/
switch(nItemType){
case ITEMTYPE_HAIRDYE:
if( GetStatusData()->dwHairColor == dwColor ) return false;
GetStatusData()->dwHairColor = dwColor;
break;
case ITEMTYPE_SKINDYE:
if( GetStatusData()->dwSkinColor == dwColor ) return false;
GetStatusData()->dwSkinColor = dwColor;
break;
case ITEMTYPE_EYEDYE:
if( GetStatusData()->dwEyeColor == dwColor ) return false;
GetStatusData()->dwEyeColor = dwColor;
break;
}
BroadcastChangeColor(nItemType, dwColor);
m_pDBCon->QueryColor(m_pSession, nItemType, dwColor);
return true;
}
void CDNUserBase::BroadcastChangeColor(int nItemType, DWORD dwColor)
{
#if defined(_VILLAGESERVER)
if (!m_pSession) return;
m_pSession->GetParamData()->cType = nItemType;
m_pSession->GetParamData()->dwColor = dwColor;
m_pSession->SendUserLocalMessage(0, FM_CHANGECOLOR);
if (m_pSession->GetPartyID() > 0){
CDNParty * pParty = g_pPartyManager->GetParty(m_pSession->GetPartyID());
if (pParty) pParty->SendAllRefreshParty(PARTYREFRESH_NONE);
}
#elif defined(_GAMESERVER)
if (!m_pSession->GetGameRoom()) return;
for(DWORD i = 0; i < m_pSession->GetGameRoom()->GetUserCount(); i++) {
CDNGameRoom::PartyStruct *pStruct = m_pSession->GetGameRoom()->GetPartyData(i);
if( pStruct == NULL ) continue;
pStruct->pSession->SendChangeColor(m_pSession->GetSessionID(), nItemType, dwColor);
}
#endif
}
// QuickSlot
int CDNUserBase::AddQuickSlot(BYTE cSlotIndex, BYTE cSlotType, INT64 nID)
{
if (cSlotIndex >= QUICKSLOTMAX) return ERROR_CHARACTER_QUICKSLOT_NOTFOUND;
if (nID <= 0) return ERROR_CHARACTER_QUICKSLOT_NOTFOUND;
bool bClear = false;
switch(cSlotType)
{
case QUICKSLOTTYPE_NONE: // none
bClear = true;
break;
case QUICKSLOTTYPE_ITEM: // item
{
TItemData *pItemData = g_pDataManager->GetItemData((int)nID);
if (!pItemData) bClear = true;
}
break;
case QUICKSLOTTYPE_SKILL: // skill
{
TSkillData *pSkillData = g_pDataManager->GetSkillData((int)nID);
if (!pSkillData) bClear = true;
}
break;
case QUICKSLOTTYPE_GESTURE: // Gesture
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ѻ<EFBFBD><D1BB><EFBFBD>
if (cSlotIndex < QUICKSLOTSEPARATE) bClear = true;
}
break;
}
if (bClear){
m_UserData.Status.QuickSlot[cSlotIndex].cType = 0;
m_UserData.Status.QuickSlot[cSlotIndex].nID = 0;
}
else{
m_UserData.Status.QuickSlot[cSlotIndex].cType = cSlotType;
m_UserData.Status.QuickSlot[cSlotIndex].nID = nID;
}
return ERROR_NONE;
}
int CDNUserBase::DelQuickSlot(BYTE cSlotIndex)
{
if (cSlotIndex >= QUICKSLOTMAX) return ERROR_CHARACTER_QUICKSLOT_NOTFOUND;
memset(&m_UserData.Status.QuickSlot[cSlotIndex], 0, sizeof(TQuickSlot));
return ERROR_NONE;
}
#if !defined(PRE_DELETE_DUNGEONCLEAR)
//Dungeon
int CDNUserBase::GetDungeonLevelIndex( int nMapTableID, bool *bExist )
{
int nEmptySlot = -1;
for( int i=0; i<DUNGEONCLEARMAX; i++ ) {
if( GetDungeonClearMapIndex(i) == 0 ) {
if( nEmptySlot == -1 ) nEmptySlot = i;
continue;
}
if( GetDungeonClearMapIndex(i) == nMapTableID ) {
if( bExist ) *bExist = true;
return i;
}
}
if( bExist ) *bExist = false;
return nEmptySlot;
}
bool CDNUserBase::CheckDungeonEnterLevel( int nMapTableID )
{
bool bExist;
int nSlotIndex = GetDungeonLevelIndex( nMapTableID, &bExist );
if( nSlotIndex > -1 ) {
if( !bExist ) {
SetDungeonClear(nSlotIndex, nMapTableID, 0); // db<64><62><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 090731
}
}
return true;
}
void CDNUserBase::CalcDungeonEnterLevel(int nMapTableID, char &cOpenHard, char &cOpenVeryHard)
{
if( CheckDungeonEnterLevel( nMapTableID ) == false ) {
cOpenHard = true;
cOpenVeryHard = true;
return;
}
int nSlotIndex = GetDungeonLevelIndex( nMapTableID, NULL );
cOpenHard = false;
cOpenVeryHard = false;
// bOpenNightmare = false;
if( GetDungeonClearType(nSlotIndex) >= 1 ) cOpenHard = true;
if( GetDungeonClearType(nSlotIndex) >= 2 ) cOpenVeryHard = true;
// if( GetDungeonClearType(nSlotIndex) >= 3 ) bOpenNightmare = true;
}
// Dungeon Clear
void CDNUserBase::SetDungeonClear(int nSlotIndex, int nMapIndex, int nType)
{
if ((nSlotIndex < 0) ||(nSlotIndex >= DUNGEONCLEARMAX)) return;
m_UserData.Status.DungeonClear[nSlotIndex].nMapIndex = nMapIndex;
m_UserData.Status.DungeonClear[nSlotIndex].cType = nType;
m_pDBCon->QueryDungeonClear(m_pSession, nType, nMapIndex);
}
void CDNUserBase::SetDungeonClearType(int nSlotIndex, int nType)
{
if ((nSlotIndex < 0) ||(nSlotIndex >= DUNGEONCLEARMAX)) return;
m_UserData.Status.DungeonClear[nSlotIndex].cType = nType;
m_pDBCon->QueryDungeonClear(m_pSession, nType, m_UserData.Status.DungeonClear[nSlotIndex].nMapIndex);
}
int CDNUserBase::GetDungeonClearMapIndex(int nSlotIndex)
{
if ((nSlotIndex < 0) ||(nSlotIndex >= DUNGEONCLEARMAX)) return -1;
return m_UserData.Status.DungeonClear[nSlotIndex].nMapIndex;
}
char CDNUserBase::GetDungeonClearType(int nSlotIndex)
{
if ((nSlotIndex < 0) ||(nSlotIndex >= DUNGEONCLEARMAX)) return -1;
return m_UserData.Status.DungeonClear[nSlotIndex].cType;
}
#endif // #if !defined(PRE_DELETE_DUNGEONCLEAR)
// Nest Clear
void CDNUserBase::AddNestClear(int nMapIndex)
{
int nSlotIndex = -1;
for( int i=0; i<NESTCLEARMAX; i++ ) {
if( m_UserData.Status.NestClear[i].nMapIndex == nMapIndex ) {
nSlotIndex = i;
break;
}
}
if( nSlotIndex == -1 ) {
for( int i=0; i<NESTCLEARMAX; i++ ) {
if( m_UserData.Status.NestClear[i].nMapIndex == 0 ) {
nSlotIndex = i;
break;
}
}
}
if( nSlotIndex == -1 ) return;
m_UserData.Status.NestClear[nSlotIndex].nMapIndex = nMapIndex;
char cClearType = NestClear::Type::Normal;
if (IsPCBang()){
int nNestClearCount = g_pDataManager->GetPCBangNestClearCount(GetPCBangGrade(), nMapIndex);
if (m_UserData.Status.NestClear[nSlotIndex].cPCBangClearCount >= nNestClearCount){
m_UserData.Status.NestClear[nSlotIndex].cClearCount += 1;
}
else{
m_UserData.Status.NestClear[nSlotIndex].cPCBangClearCount += 1;
cClearType = NestClear::Type::PCBang;
}
}
else
m_UserData.Status.NestClear[nSlotIndex].cClearCount += 1;
m_pDBCon->QueryNestClear(m_pSession, nMapIndex, cClearType);
}
char CDNUserBase::GetNestClearTotalCount(int nMapIndex)
{
int nNestClearCount = g_pDataManager->GetPCBangNestClearCount(GetPCBangGrade(), nMapIndex);
for (int i = 0; i < NESTCLEARMAX; i++){
if (m_UserData.Status.NestClear[i].nMapIndex <= 0) continue;
if (m_UserData.Status.NestClear[i].nMapIndex == nMapIndex){
int nPCBangCount = m_UserData.Status.NestClear[i].cPCBangClearCount;
if (m_UserData.Status.NestClear[i].cPCBangClearCount > nNestClearCount)
nPCBangCount = nNestClearCount;
return m_UserData.Status.NestClear[i].cClearCount + nPCBangCount;
}
}
return 0;
}
TNestClearData *CDNUserBase::GetNestClearCount(int nMapIndex)
{
for (int i = 0; i < NESTCLEARMAX; i++){
if (m_UserData.Status.NestClear[i].nMapIndex <= 0) continue;
if (m_UserData.Status.NestClear[i].nMapIndex == nMapIndex){
return &(m_UserData.Status.NestClear[i]);
}
}
return NULL;
}
void CDNUserBase::InitNestClear(bool bSend)
{
m_pDBCon->QueryInitNestClearCount(m_pSession);
memset(m_UserData.Status.NestClear, 0, sizeof(m_UserData.Status.NestClear));
if (bSend) SendNestClear(m_UserData.Status.NestClear);
}
void CDNUserBase::InitLadderGradePoint( bool bSend )
{
g_Log.Log( LogType::_LADDER, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"InitLadderGradePoint() Count=%d\r\n", static_cast<int>(m_PvPLadderScoreInfo.cLadderTypeCount) );
if( m_PvPLadderScoreInfo.cLadderTypeCount == 0 )
return;
#if defined( _WORK )
std::cout << "[Ladder] CharDBID:" << GetCharacterDBID() << " <20>ְ<EFBFBD><D6B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ʱ<EFBFBD>ȭ" << std::endl;
#endif // #if defined( _WORK )
int iAddedLadderPoint = m_PvPLadderScoreInfo.GetTopExchangeLadderPoint();
if( m_PvPLadderScoreInfo.iPvPLadderPoint + iAddedLadderPoint > static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PvPLadder_LimitPoint )) )
iAddedLadderPoint = static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PvPLadder_LimitPoint )) - m_PvPLadderScoreInfo.iPvPLadderPoint;
for( int i=0 ; i<m_PvPLadderScoreInfo.cLadderTypeCount ; ++i )
{
int iLP = (i==0) ? iAddedLadderPoint : 0;
GetDBConnection()->QueryInitPvPLadderGradePoint( m_pSession, static_cast<LadderSystem::MatchType::eCode>(m_PvPLadderScoreInfo.LadderScore[i].cPvPLadderCode), iLP, m_PvPLadderScoreInfo.LadderScore[i].iPvPLadderGradePoint );
m_PvPLadderScoreInfo.LadderScore[i].InitWeeklyGradePoint();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
m_PvPLadderScoreInfo.iPvPLadderPoint += iAddedLadderPoint;
if( bSend )
{
SendPvPLadderScoreInfo( &m_PvPLadderScoreInfo );
}
}
void CDNUserBase::SetViewCashEquipBitmap(char cEquipIndex, bool bFlag)
{
bool bValid = false;
if( cEquipIndex >= 0 && cEquipIndex < CASHEQUIPMAX ) bValid = true;
if( cEquipIndex == HIDEHELMET_BITINDEX ) bValid = true;
if( !bValid ) return;
SetBitFlag(m_UserData.Status.cViewCashEquipBitmap, cEquipIndex, bFlag);
}
char* CDNUserBase::GetViewCashEquipBitmap()
{
return m_UserData.Status.cViewCashEquipBitmap;
}
bool CDNUserBase::IsExistViewCashEquipBitmap(char cEquipIndex)
{
return GetBitFlag(m_UserData.Status.cViewCashEquipBitmap, cEquipIndex);
}
// Cash
void CDNUserBase::AddPetal(int nReserve)
{
if (nReserve <= 0) return;
m_UserData.Status.nPetal += nReserve;
if (m_UserData.Status.nPetal >= 2000000000) m_UserData.Status.nPetal = 2000000000;
// m_pDBCon->QueryReserve(m_cDBThreadID, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_CashData.nPetal);
}
void CDNUserBase::DelPetal(int nReserve)
{
if (nReserve <= 0) return;
m_UserData.Status.nPetal -= nReserve;
if (m_UserData.Status.nPetal <= 0) m_UserData.Status.nPetal = 0;
}
void CDNUserBase::SetPetal(int nReserve)
{
if (nReserve < 0) return;
m_UserData.Status.nPetal = nReserve;
if (m_UserData.Status.nPetal >= 2000000000) m_UserData.Status.nPetal = 2000000000;
}
DWORD CDNUserBase::GetTick(eTick pTick) const
{
DN_ASSERT(CHECK_LIMIT(pTick, eTickCnt), "Invalid!");
return(m_dwTick[pTick]);
}
VOID CDNUserBase::SetTick(eTick pTick) const
{
DN_ASSERT(CHECK_LIMIT(pTick, eTickCnt), "Invalid!");
m_dwTick[pTick] = ::GetTickCount();
m_dwTick[pTick] = (m_dwTick[pTick])?(m_dwTick[pTick]):(1);
}
VOID CDNUserBase::SetTick(eTick pTick, DWORD pTick32) const
{
DN_ASSERT(CHECK_LIMIT(pTick, eTickCnt), "Invalid!");
DN_ASSERT(0 != pTick32, "Invalid!");
m_dwTick[pTick] = (pTick32)?(pTick32):(1);
}
VOID CDNUserBase::ResetTick(eTick pTick) const
{
DN_ASSERT(CHECK_LIMIT(pTick, eTickCnt), "Invalid!");
m_dwTick[pTick] = 0;
}
BOOL CDNUserBase::IsTick(eTick pTick) const
{
DN_ASSERT(CHECK_LIMIT(pTick, eTickCnt), "Invalid!");
return(0 != m_dwTick[pTick]);
}
void CDNUserBase::OnScheduleEvent( ScheduleEventEnum ScheduleEvent, ScheduleStruct *pStruct, bool bInitialize )
{
switch( ScheduleEvent ) {
case CDNSchedule::ResetFatigue:
{
SetDefaultMaxFatigue(!bInitialize);
ModCommonVariableData(CommonVariable::Type::AddFatigue, 0);
#if defined(PRE_ADD_EXPUP_ITEM)
ModCommonVariableData(CommonVariable::Type::EXPUPITEM_COUNT, 0);
#endif
#if defined( PRE_ADD_PVP_EXPUP_ITEM )
ModCommonVariableData(CommonVariable::Type::PvPExpupItem_UseCount, 0);
#endif // #if defined( PRE_ADD_PVP_EXPUP_ITEM )
#if defined(PRE_ADD_VIP)
// VIP<49><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD> <20><><EFBFBD>ܼ<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if ((m_tVIPEndDate != -1) && (!m_bVIPAutoPay)){ // vip<69><70><EFBFBD><EFBFBD> <20>߰<EFBFBD>, <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4>
if (m_bVIP){
__time64_t Time;
time(&Time);
__time64_t nGap = m_tVIPEndDate - Time;
int nMailID = g_pDataManager->GetVIP7DaysLeftMailID();
if ((nGap > 518400) && (nGap < 691200)){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 7<><37><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>
if (nMailID > 0)
CDNMailSender::Process((CDNUserSession*)this, nMailID, 0, 0);
}
nMailID = g_pDataManager->GetVIP1DayLeftMailID();
if ((nGap > 0) && (nGap < 172800)){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>
if (nMailID > 0)
CDNMailSender::Process((CDNUserSession*)this, nMailID, 0, 0);
}
}
}
#endif // #if defined(PRE_ADD_VIP)
if( GetHackResetRestraintValue() <= 0 || GetHackAbuseDBValue() < GetHackResetRestraintValue() ) {
// <20>ϴ<EFBFBD> 1<><31><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ..(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>¡)
m_pDBCon->QueryDelAbuseMonitor( m_pSession, 1 );
}
}
break;
case CDNSchedule::ResetWeeklyFatigue:
{
SetDefaultMaxWeeklyFatigue();
InitNestClear(!bInitialize);
InitLadderGradePoint( !bInitialize );
break;
}
case CDNSchedule::ResetEventFatigue:
ResetEventFatigue(pStruct->cHour);
break;
case CDNSchedule::ResetRebirthCoin:
SetDefaultMaxRebirthCoin(!bInitialize);
break;
case CDNSchedule::ResetDailyMission:
{
time_t Time;
tm *pTime;
time(&Time);
pTime = localtime(&Time);
// int nRandomSeed = ( pTime->tm_year * 1000 ) +( pTime->tm_mon * 100 );
int nRandomSeed = GetDateValue( 1900 + pTime->tm_year, pTime->tm_mon + 1, 0 );
int nValue = (( pTime->tm_mday * 24 ) +( pTime->tm_hour - pStruct->cHour ) ) / 24;
nRandomSeed += nValue;
GetMissionSystem()->RequestDailyMissionList( CDNMissionSystem::Daily, nRandomSeed, !bInitialize );
#if defined( PRE_ALTEIAWORLD_EXPLORE )
#if defined( _VILLAGESERVER )
m_pSession->AlteiaWorldDailyResetInfo();
#endif
#if defined( _GAMESERVER )
m_pSession->SetAlteiaDailyPlayCount(0);
#endif
m_pDBCon->QueryResetAlteiaWorldPlayAlteia( m_pSession, AlteiaWorld::ResetType::DailyPlayCount );
m_pDBCon->QueryResetAlteiaWorldPlayAlteia( m_pSession, AlteiaWorld::ResetType::SendTicketList );
#endif
}
break;
case CDNSchedule::ResetWeeklyMission:
{
time_t Time;
tm *pTime;
time(&Time);
pTime = localtime(&Time);
// int nRandomSeed = ( pTime->tm_year * 1000 ) +( pTime->tm_mon * 100 );
int nWeek = pStruct->Cycle - CDNSchedule::Sunday;
int nRandomSeed = ( GetDateValue( 1900 + pTime->tm_year, pTime->tm_mon + 1, 0 ) - 4 - nWeek ) / 7;
int nValue = GetDateValue( 1900 + pTime->tm_year, pTime->tm_mon + 1, pTime->tm_mday ) - 4 - nWeek;
int nOffset = nValue % 7;
int nWeekCount = ( 7 +( pTime->tm_mday - nOffset ) +( nOffset / 7 ) ) / 7;
if( nOffset == 0 ) {
if( pTime->tm_hour < pStruct->cHour ) nWeekCount--;
}
nRandomSeed += nWeekCount;
GetMissionSystem()->RequestDailyMissionList( CDNMissionSystem::Weekly, nRandomSeed, !bInitialize );
GetMissionSystem()->RequestDailyMissionList( CDNMissionSystem::WeekendEvent, nRandomSeed, !bInitialize);
GetMissionSystem()->RequestDailyMissionList( CDNMissionSystem::WeekendRepeat, nRandomSeed, !bInitialize);
#if defined( PRE_ALTEIAWORLD_EXPLORE )
#if defined( _VILLAGESERVER )
m_pSession->AlteiaWorldWeeklyResetInfo();
#endif
m_pDBCon->QueryResetAlteiaWorldPlayAlteia( m_pSession, AlteiaWorld::ResetType::WeeklyPlayCount);
#endif
}
break;
#if defined( PRE_ADD_MONTHLY_MISSION )
case CDNSchedule::ResetMonthlyMission:
{
time_t Time;
tm *pTime;
time(&Time);
pTime = localtime(&Time);
int nWeek = pStruct->Cycle - CDNSchedule::Sunday;
int nRandomSeed = ( GetDateValue( 1900 + pTime->tm_year, pTime->tm_mon + 1, pTime->tm_mday) ) / 12;
GetMissionSystem()->RequestDailyMissionList( CDNMissionSystem::Monthly, nRandomSeed, !bInitialize );
}
break;
#endif // #if defined( PRE_ADD_MONTHLY_MISSION )
case CDNSchedule::AlarmResetDailyMission:
{
SetDefaultMaxDailyPeriodQuest(pStruct);
}
break;
case CDNSchedule::AlarmResetWeeklyMission:
{
SetDefaultMaxWeeklyPeriodQuest(pStruct);
}
break;
case CDNSchedule::ResetDailyTimeEvent:
{
if( m_pTimeEventSystem )
m_pTimeEventSystem->ResetDailyTimeEvent();
if( g_pDataManager->GetEveryDayEventRewardMailID(1) ) //<2F><20>̺<EFBFBD>Ʈ <20><EFBFBD><E2B0A3><EFBFBD><EFBFBD> <20>Լ<EFBFBD> ȣ<><C8A3>
UpdateAttendanceEventData(true);
#if defined( PRE_ADD_LIMITED_SHOP )
ResetLimitedShopDailyCount();
#endif
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
ResetTotalLevelSkillMedalCount();
#endif
}
break;
#if defined( PRE_ADD_STAMPSYSTEM )
case CDNSchedule::ResetWeeklyStamp:
{
GetStampSystem()->ResetWeeklyData( pStruct->tDate );
}
break;
case CDNSchedule::AlarmDailyStamp:
{
GetStampSystem()->ResetDailyData( pStruct->tDate );
}
break;
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
}
}
bool CDNUserBase::IsAcceptAbleOption(INT64 nCharacterDBID, UINT nAccountDBID, int nCheckType)
{
BYTE cCheckAcceptableType = _CA_OPTIONTYPE_ACCEPT;
switch(nCheckType)
{
case _ACCEPTABLE_CHECKTYPE_PARTYINVITE: cCheckAcceptableType = GetGameOption()->cPartyInviteAcceptable; break;
case _ACCEPTABLE_CHECKTYPE_GUILDINVITE: cCheckAcceptableType = GetGameOption()->cGuildInviteAcceptable; break;
case _ACCEPTABLE_CHECKTYPE_TRADEREQUEST: cCheckAcceptableType = GetGameOption()->cTradeRequestAcceptable; break;
case _ACCEPTABLE_CHECKTYPE_DUELREQUEST: cCheckAcceptableType = GetGameOption()->cDuelRequestAcceptable; break;
case _ACCEPTABLE_CHECKTYPE_LADDERINVITE: cCheckAcceptableType = GetGameOption()->cLadderInviteAcceptable; break;
case _ACCEPTABEL_CHECKTYPE_QUICKPVPINVITE: cCheckAcceptableType = GetGameOption()->cQuickPvPInviteAcceptable; break;
default: return false;
}
if (cCheckAcceptableType == _CA_OPTIONTYPE_DENYALL) return false;
if (cCheckAcceptableType == _CA_OPTIONTYPE_ACCEPT) return true;
if (cCheckAcceptableType == _CA_OPTIONTYPE_FRIEND_GUILD_ACCEPT)
{
if (m_pFriend->HasFriend(nCharacterDBID)) return true;
if (nCheckType == _ACCEPTABLE_CHECKTYPE_GUILDINVITE) return false;
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet()) return false;
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (pGuild)
{
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) return false;
#endif
DN_ASSERT(!pGuild->IsLock(), "Already Locked!");
if (pGuild->IsMemberExist(nCharacterDBID, NULL)) return true;
}
}
return false;
}
void CDNUserBase::SetExchangeTargetSessionID(UINT nSessionID)
{
m_nExchangeTargetSessionID = nSessionID;
m_nExchangeSenderSID = m_nExchangeReceiverSID = 0;
}
void CDNUserBase::ClearExchangeInfo()
{
SetExchangeTargetSessionID(0);
m_pItem->ClearExchangeData();
IsWindowStateNoneSet(WINDOW_EXCHANGE);
}
bool CDNUserBase::HasGesture(int nGestureID)
{
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGESTURE );
int iUnlockLv = pSox->GetFieldFromLablePtr( nGestureID, "_UnlockLv" )->GetInteger();
int iGettureType = pSox->GetFieldFromLablePtr( nGestureID, "_GestureType" )->GetInteger();
if( iGettureType == Gesture::Type::GuildRewardItem )
{
return m_pGesture->HasEffectItemGesture( nGestureID );
}
else if( iUnlockLv == GESTURE_UNLOCKLV_CASH )
{
return m_pGesture->HasCashGesture( nGestureID );
}
else
{
if( GetLevel() >= iUnlockLv )
return true;
}
return false;
}
void CDNUserBase::GetPartyMemberInfo(SPartyMemberInfo &Info)
{
Info.nSessionID = m_nSessionID;
Info.nExp = GetExp();
Info.cLevel = GetLevel();
memcpy( Info.cJobArray, m_UserData.Status.cJobArray, sizeof(Info.cJobArray) );
Info.cClassID = GetClassID();
Info.nMapIndex = GetMapIndex();
Info.nHairID = (m_pItem->GetEquip(EQUIP_HAIR) == NULL) ? 0 : m_pItem->GetEquip(EQUIP_HAIR)->nItemID;
Info.nFaceID = (m_pItem->GetEquip(EQUIP_FACE) == NULL) ? 0 : m_pItem->GetEquip(EQUIP_FACE)->nItemID;
Info.dwHairColor = GetHairColor();
Info.dwEyeColor = GetEyeColor();
Info.dwSkinColor = GetSkinColor();
Info.wFatigue = GetFatigue() + GetWeeklyFatigue() + GetPCBangFatigue() + GetEventFatigue();
Info.cPvPLevel = m_UserData.PvP.cLevel;
Info.wStdRebirthCoin = GetRebirthCoin() + GetPCBangRebirthCoin() + GetVIPRebirthCoin();
Info.wCashRebirthCoin = GetRebirthCashCoin();
_wcscpy(Info.wszCharacterName, _countof(Info.wszCharacterName), GetCharacterName(), (int)wcslen(GetCharacterName()));
int nEquipID = 0;
const TItem* pHelmetEquipItemData = m_pItem->GetEquip(EQUIP_HELMET);
if (pHelmetEquipItemData != NULL)
nEquipID = (pHelmetEquipItemData->nLookItemID != 0) ? pHelmetEquipItemData->nLookItemID : pHelmetEquipItemData->nItemID;
int nCashEquipID = 0;
const TItem* pCashHelmetEquipItemData = m_pItem->GetCashEquip(CASHEQUIP_HELMET);
if (pCashHelmetEquipItemData != NULL)
nCashEquipID = (pCashHelmetEquipItemData->nLookItemID != 0) ? pCashHelmetEquipItemData->nLookItemID : pCashHelmetEquipItemData->nItemID;
Info.nHelmetID = ( IsExistViewCashEquipBitmap(CASHEQUIP_HELMET) ) ? nCashEquipID : nEquipID;
if( IsExistViewCashEquipBitmap(HIDEHELMET_BITINDEX) ) Info.nHelmetID = 0;
nEquipID = (m_pItem->GetEquip(EQUIP_EARRING) == NULL) ? 0 : m_pItem->GetEquip(EQUIP_EARRING)->nItemID;
nCashEquipID = (m_pItem->GetCashEquip(CASHEQUIP_EARRING) == NULL) ? 0 : m_pItem->GetCashEquip(CASHEQUIP_EARRING)->nItemID;
Info.nEarringID = ( IsExistViewCashEquipBitmap(CASHEQUIP_EARRING) ) ? nCashEquipID : nEquipID;
Info.cMemberIndex = m_pSession->GetPartyMemberIndex();
Info.uiPvPUserState = m_pSession->GetPvPUserState();
#if defined( PRE_WORLDCOMBINE_PARTY )
Info.nWorldSetID = m_pSession->GetWorldSetID();
#endif
#if defined( PRE_ADD_NEWCOMEBACK )
if( m_pSession->GetComebackAppellation() > 0 )
Info.bCheckComebackAppellation = true;
#endif
}
void CDNUserBase::SetGuildSelfView(const TGuildView& pGuildView)
{
if ((*(static_cast<TGuildView*>(&m_GuildSelfView))) == pGuildView) {
return;
}
(*(static_cast<TGuildView*>(&m_GuildSelfView))) = pGuildView;
RefreshGuildSelfView();
}
void CDNUserBase::SetGuildSelfView(const TGuildSelfView& pGuildSelfView)
{
if (m_GuildSelfView == pGuildSelfView) {
return;
}
m_GuildSelfView = pGuildSelfView;
RefreshGuildSelfView();
}
void CDNUserBase::ResetGuildSelfView()
{
if (!m_GuildSelfView.IsSet()) {
return;
}
m_GuildSelfView.Reset();
RefreshGuildSelfView();
}
void CDNUserBase::RefreshGuildSelfView()
{
DN_ASSERT(0, "Can't be Called!");
}
void CDNUserBase::AddGuildPoint(char cPointType, int nPointValue, int nMissionID)
{
const TGuildUID GuildUID = GetGuildUID();
if (!GuildUID.IsSet())
return;
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if (pGuild)
{
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if (FALSE == pGuild->IsEnable()) return;
#endif
if (false == pGuild->AddPoint(cPointType, nPointValue, GetCharacterDBID(), nMissionID))
SendUpdateGuildExp(ERROR_GUILD_DAILYLIMIT, cPointType, 0, 0, 0, 0);
#if defined(PRE_ADD_GUILD_CONTRIBUTION) && defined(_VILLAGESERVER)
else
m_pDBCon->QueryGetGuildContributionPoint(m_cDBThreadID, g_Config.nWorldSetID, GetAccountDBID(), GetCharacterDBID());
#endif // #if defined(PRE_ADD_GUILD_CONTRIBUTION) && defined(_VILLAGESERVER)
}
}
#ifdef _USE_VOICECHAT
bool CDNUserBase::JoinVoiceChannel(UINT nVoiceChannelID, const char * pIP, TPosition * pPos, int nRotate, bool bForceSet, bool bMutePass)
{
if (bForceSet) m_bVoiceAvailable = true;
if (m_bVoiceAvailable == false || pIP == NULL || m_nVoiceChannelID > 0 || g_pVoiceChat == NULL) return false;
char szName[NAMELENMAX];
WideCharToMultiByte(CP_ACP, 0, GetCharacterName(), -1, szName, NAMELENMAX, NULL, NULL);
bool bRet = g_pVoiceChat->JoinChannel(nVoiceChannelID, GetAccountDBID(), szName, pIP, true, m_nVoiceJoinType);
if (bRet)
{
m_nVoiceChannelID = nVoiceChannelID;
if (m_nVoiceJoinType != _VOICEJOINTYPE_NONE)
{
if (pPos)
{
int nX, nY, nZ;
nX = pPos->nX / 1000;
nY = pPos->nY / 1000;
nZ = pPos->nZ / 1000;
SetVoicePos(nX, nY, nZ, nRotate);
}
else
{
SetVoicePos(0, 0, 0, 0);
}
if (bMutePass == false)
{
for (int i = 0; i < PARTYCOUNTMAX; i++)
{
if (m_nVoiceMutedList[i] <= 0) continue;
VoiceMuteOnetoOne(m_nVoiceMutedList[i], true);
}
}
}
return true;
}
return false;
}
void CDNUserBase::LeaveVoiceChannel()
{
if (m_nVoiceChannelID <= 0 || m_nVoiceJoinType == _VOICEJOINTYPE_NONE || g_pVoiceChat == NULL) return;
g_pVoiceChat->LeaveChannel(m_nVoiceChannelID, GetAccountDBID());
m_nVoiceChannelID = 0;
m_nVoiceJoinType = _VOICEJOINTYPE_NONE;
memset(m_nVoiceMutedList, 0, sizeof(m_nVoiceMutedList));
}
bool CDNUserBase::IsMutedUser(UINT nMuteID)
{
for (int i = 0; i < PARTYCOUNTMAX; i++)
if (m_nVoiceMutedList[i] == nMuteID)
return true;
return false;
}
void CDNUserBase::SetVoiceMute(UINT nMuteID, bool bMute)
{
int i;
if (bMute)
{
if (IsMutedUser(nMuteID))
return;
for(i = 0; i < PARTYCOUNTMAX; i++)
{
if (m_nVoiceMutedList[i] > 0) continue;
m_nVoiceMutedList[i] = nMuteID;
return;
}
}
else
{
for(i = 0; i < PARTYCOUNTMAX; i++)
{
if (m_nVoiceMutedList[i] == nMuteID)
{
m_nVoiceMutedList[i] = 0;
return;
}
}
}
}
void CDNUserBase::MakeMute()
{
for (int i = 0; i < PARTYCOUNTMAX; i++)
{
if (m_nVoiceMutedList[i] <= 0) continue;
VoiceMuteOnetoOne(m_nVoiceMutedList[i], true);
}
}
bool CDNUserBase::VoiceMuteOnetoOne(UINT nMuteAccountDBID, bool bMute)
{
if (g_pVoiceChat == NULL) return false;
if (g_pVoiceChat->MuteOneToOne(GetAccountDBID(), nMuteAccountDBID, bMute))
{
SetVoiceMute(nMuteAccountDBID, bMute);
return true;
}
return false;
}
bool CDNUserBase::VoiceComplaintRequest(UINT nComplaineeAccountDBID, const char * pCategory, const char * pSubject, const char * pMsg)
{
if (g_pVoiceChat == NULL) return false;
return g_pVoiceChat->ComplaintRequest(GetAccountDBID(), nComplaineeAccountDBID, nComplaineeAccountDBID, pCategory, pSubject, pMsg);
}
bool CDNUserBase::SetVoicePos(int nX, int nY, int nZ, int nRotate)
{
if (m_nVoiceChannelID <= 0) return false;
if (g_pVoiceChat->IsChannelSpartial(m_nVoiceChannelID))
return g_pVoiceChat->SetUserPos(GetAccountDBID(), nX, nY, nZ, nRotate);
return false;
}
bool CDNUserBase::IsTalking(BYTE * pTalking)
{
//<2F>ٷ<EFBFBD><D9B7><EFBFBD> <20><>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִٰ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> Ʈ<><20><>ȯ<EFBFBD>Ѵ<EFBFBD>. 0<><30> 0<><30> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>񱳹<EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>.
if (g_pVoiceChat == NULL) return false;
if (m_nVoiceJoinType == _VOICEJOINTYPE_NONE || m_nVoiceJoinType == _VOICEJOINTYPE_LISTENONLY) return false;
if (g_pVoiceChat->IsUserTalking(GetAccountDBID(), pTalking))
{
BYTE cOlder = m_cIsTalking;
m_cIsTalking = *pTalking;
if (cOlder > 0 && *pTalking <= 0)
return true;
if (cOlder <= 0 && *pTalking > 0)
return true;
}
return false;
}
#endif
void CDNUserBase::PCBangResult(MAPCBangResult *pResult)
{
#if defined(_KR)
if (pResult->nShutdownTime > 0){
switch (pResult->cPolicyError)
{
case 1:
SendCompleteDetachMsg(ERROR_NEXONAUTH_SHUTDOWNED_1, L"PolicyNo:10 error:1 Shutdowned");
return;
case 2:
SendCompleteDetachMsg(ERROR_NEXONAUTH_SHUTDOWNED_2, L"PolicyNo:10 error:2 Shutdowned");
return;
case 3:
SendCompleteDetachMsg(ERROR_NEXONAUTH_SHUTDOWNED_3, L"PolicyNo:10 error:3 Shutdowned");
return;
case 4:
SendCompleteDetachMsg(ERROR_NEXONAUTH_SHUTDOWNED_4, L"PolicyNo:10 error:4 Shutdowned");
return;
default:
SendPCBang(m_cPCBangGrade, pResult);
return;
}
}
switch(pResult->cResult)
{
case Result_Forbidden: // <20>̰<EFBFBD><CCB0><EFBFBD>PC<50><43> <20>Ǵ<EFBFBD> IP<49><50> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ʰ<EFBFBD><CAB0><EFBFBD> <20><><EFBFBD><EFBFBD>
switch(pResult->cAuthorizeType)
{
case AddressDesc_I: // ü<><C3BC><EFBFBD><EFBFBD>(Internet)
switch(pResult->cOption)
{
case Option_NoOption: // <20><EFBFBD><E2BABB>(<28>̰<EFBFBD><CCB0><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD>)
SendCompleteDetachMsg(ERROR_NEXONAUTH_I0, L"Result_Forbidden(Option_NoOption)");
return;
case Option_AddressMaxConnected: // ip<69><70> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.
SendCompleteDetachMsg(ERROR_NEXONAUTH, L"Result_Forbidden(Option_AddressMaxConnected)");
return;
case Option_AccountMachineIDBlocked:
SendCompleteDetachMsg(ERROR_NEXONAUTH_I28, L"Result_Forbidden(Option_AccountMachineIDBlocked)");
return;
}
break;
}
break;
case Result_Allowed: // <20><><EFBFBD>Ե<EFBFBD> PC<50><43>
{
SetPCBang(true);
SendPCBang(m_cPCBangGrade, pResult);
return;
}
break;
case Result_Trial: // <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
break;
case Result_Terminate: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF>ϴ<EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
switch(pResult->cAuthorizeType)
{
case AddressDesc_I:
case AddressDesc_F:
case AddressDesc_M:
switch(pResult->cOption)
{
case Option_PrepaidExhausted: // pc<70><63> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.
SendCompleteDetachMsg(ERROR_NEXONAUTH_I19, L"Result_Terminate(Option_PrepaidExhausted)");
return;
case Option_AddressMaxConnected: // ip<69><70> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.
SendCompleteDetachMsg(ERROR_NEXONAUTH_I2, L"Result_Terminate(Option_AddressMaxConnected)");
return;
case Option_DifferentIpNotAllowed: // pc<70><63> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴմϴ<D5B4>. <20>ؽ<EFBFBD> Pc<50><63> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD>ǹٶ<C7B9><D9B6>ϴ<EFBFBD>.(Local Ip<49><70> Server Ip<49><70> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
SendCompleteDetachMsg(ERROR_NEXONAUTH_I27, L"Result_Terminate(Option_DifferentIpNotAllowed)");
return;
case Option_AccountMachineIDBlocked:
SendCompleteDetachMsg(ERROR_NEXONAUTH_I28, L"Result_Terminate(Option_AccountMachineIDBlocked)");
return;
case Option_AccountShutdowned:
SendCompleteDetachMsg(ERROR_NEXONAUTH_SHUTDOWNED_3, L"Result_Terminate(Option_AccountShutdowned)");
return;
}
break;
}
break;
case Result_Message:
SendPCBang(m_cPCBangGrade, pResult);
return;
}
#else // #if defined(_KR)
#if defined(_ID)
if(pResult->bBlockPcCafe) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PCī<43><C4AB><EFBFBD≯<EFBFBD>..
{
SendCompleteDetachMsg(ERROR_KREON_BLOCK_PCCAFE, L"Kreon Block PCCAFE" );
return;
}
#endif //#if defined(_ID)
SetPCBangGrade(pResult->cPCBangGrade);
SendPCBang(m_cPCBangGrade, pResult);
#if defined(_KRAZ)
m_ShutdownData = pResult->ShutdownData;
#endif // #if defined(_KRAZ)
#endif // #if defined(_KR)
}
void CDNUserBase::SetPCBang(bool bPCBang)
{
m_bPCBang = bPCBang;
if (m_bPCBang){
m_cPCBangGrade = PCBang::Grade::Normal;
m_nPcBangBonusExp = g_pDataManager->GetPCBangParam1(PCBang::Type::Exp, PCBang::Grade::Normal);
#if defined(_CH)
GetEventSystem()->OnEvent(EventSystem::OnPCBang_Item);
GetEventSystem()->OnEvent(EventSystem::OnPCBang_Fatigue);
GetEventSystem()->OnEvent(EventSystem::OnPCBang_RebirthCoin);
#endif // #if defined(_CH)
}
}
void CDNUserBase::SetPCBangGrade(char cGrade)
{
m_cPCBangGrade = cGrade;
if (m_cPCBangGrade == PCBang::Grade::None)
m_bPCBang = false;
else{
m_bPCBang = true;
m_nPcBangBonusExp = g_pDataManager->GetPCBangParam1(PCBang::Type::Exp, GetPCBangGrade());
GetEventSystem()->OnEvent(EventSystem::OnPCBang_Item);
GetEventSystem()->OnEvent(EventSystem::OnPCBang_Fatigue);
GetEventSystem()->OnEvent(EventSystem::OnPCBang_RebirthCoin);
}
}
void CDNUserBase::RefreshPCBangMissionList()
{
int nRebirthCoin = g_pDataManager->GetPCBangParam1(PCBang::Type::RebirthCoin, PCBang::Grade::Normal);
if (nRebirthCoin == 0)
m_UserData.Status.cPCBangRebirthCoin = 0;
int nFatigue = g_pDataManager->GetPCBangParam1(PCBang::Type::Fatigue, PCBang::Grade::Normal);
if (nFatigue == 0)
m_UserData.Status.wPCBangFatigue = 0;
memset(m_UserData.Mission.PCBangMission, 0, sizeof(m_UserData.Mission.PCBangMission));
// <20>Ƿε<C7B7>
m_UserData.Mission.PCBangMission[0].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionFatigue, PCBang::Grade::Gold); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> PC<50><43> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> -<2D><><EFBFBD><EFBFBD> 600002
m_UserData.Mission.PCBangMission[1].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionFatigue, PCBang::Grade::Silver); // <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> PC<50><43> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> -<2D><><EFBFBD><EFBFBD> 600003
m_UserData.Mission.PCBangMission[2].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionFatigue, PCBang::Grade::Red); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> PC<50><43> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> -<2D><><EFBFBD><EFBFBD> 600004
m_UserData.Mission.PCBangMission[3].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionFatigue, PCBang::Grade::Premium); // <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> PC<50><43> <20>Ƿε<C7B7> <20><><EFBFBD><EFBFBD> -<2D><><EFBFBD><EFBFBD> 600010
// <20><><EFBFBD><EFBFBD>
m_UserData.Mission.PCBangMission[4].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionRebirthCoin, PCBang::Grade::Gold); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> PC<50><43> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -<2D><><EFBFBD><EFBFBD> 600006
m_UserData.Mission.PCBangMission[5].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionRebirthCoin, PCBang::Grade::Silver); // <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> PC<50><43> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -<2D><><EFBFBD><EFBFBD> 600007
m_UserData.Mission.PCBangMission[6].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionRebirthCoin, PCBang::Grade::Red); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> PC<50><43> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -<2D><><EFBFBD><EFBFBD> 600008
m_UserData.Mission.PCBangMission[7].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionRebirthCoin, PCBang::Grade::Premium); // <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> PC<50><43> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -<2D><><EFBFBD><EFBFBD> 600011
m_UserData.Mission.PCBangMission[8].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionReward, PCBang::Grade::Gold);
m_UserData.Mission.PCBangMission[9].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionReward, PCBang::Grade::Silver);
m_UserData.Mission.PCBangMission[10].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionReward, PCBang::Grade::Red);
m_UserData.Mission.PCBangMission[11].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionReward, PCBang::Grade::Premium);
m_UserData.Mission.PCBangMission[12].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionRewardCash, PCBang::Grade::Gold);
m_UserData.Mission.PCBangMission[13].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionRewardCash, PCBang::Grade::Silver);
m_UserData.Mission.PCBangMission[14].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionRewardCash, PCBang::Grade::Red);
m_UserData.Mission.PCBangMission[15].nMissionID = g_pDataManager->GetPCBangParam1(PCBang::Type::MissionRewardCash, PCBang::Grade::Premium);
}
void CDNUserBase::SetVIPTotalPoint(int nPoint)
{
if (nPoint < 0) return;
m_nVIPTotalPoint = nPoint;
if (m_nVIPTotalPoint > 10000) m_nVIPTotalPoint = 10000;
}
#if defined(_CH)
void CDNUserBase::SetFCMOnlineMin(int nOnlineMin, bool bSend)
{
m_nFCMOnlineMin = nOnlineMin;
m_cFCMState = FCMSTATE_NONE;
if ((nOnlineMin >= 180) && (nOnlineMin < 300)){ // 3-5<>ð<EFBFBD>
m_cFCMState = FCMSTATE_HALF;
}
else if (nOnlineMin >= 300){ // 5<>ð<EFBFBD><C3B0>̻<EFBFBD>
m_cFCMState = FCMSTATE_ZERO;
}
if (bSend) SendFCMState(m_nFCMOnlineMin);
g_Log.Log(LogType::_NORMAL, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"[ADBID:%u, CDBID:%I64d, SID:%u] MAVI_FCMSTATE(State:%d, OnlineMin:%d)\r\n", m_nAccountDBID, m_biCharacterDBID, m_nSessionID, m_cFCMState, nOnlineMin);
}
#endif // _CH
#if defined(_HSHIELD)
void CDNUserBase::SendMakeRequest()
{
#if defined( PRE_ADD_SECURITY_UPDATEFLAG )
if ( GetSecurityUpdateFlag() == false )
return;
#endif
#if defined( _GAMESERVER )
if ( m_pSession->GetTcpConnection() && m_pSession->GetTcpConnection()->GetActive() )
#elif defined( _VILLAGESERVER )
if ( m_pSession && m_pSession->GetActive() )
#endif
{
AHNHS_TRANS_BUFFER Packet = { 0, };
#if defined( PRE_ADD_HSHIELD_LOG )
g_Log.Log(LogType::_HACKSHIELD, m_pSession, L"[_AhnHS_MakeRequest before - (%d) ] ClientHandle[%x] Buffer[%x]\r\n", m_pSession->GetSessionID(), m_hHSClient, &Packet);
#endif
unsigned long nRet = _AhnHS_MakeRequest(m_hHSClient, &Packet);
#if defined( PRE_ADD_HSHIELD_LOG )
g_Log.Log(LogType::_HACKSHIELD, m_pSession, L"[_AhnHS_MakeRequest after - (%d) ] ClientHandle[%x] Buffer[%x]: 0x%x\r\n", m_pSession->GetSessionID(), m_hHSClient, &Packet, nRet);
#endif
if (nRet != ERROR_SUCCESS){ // <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>;;
g_Log.Log(LogType::_HACKSHIELD, GetWorldSetID(), GetAccountDBID(), GetCharacterDBID(), m_nSessionID, L"[] _AhnHS_MakeRequest Ret:%x\r\n", nRet);
#if !defined( _JP )
if (GetAccountLevel() != AccountLevel_Developer)
m_pSession->DetachConnection(L"Connect|_AhnHS_MakeRequest Error");
#endif // #if !defined( _JP )
return;
}
m_pSession->AddSendData(SC_SYSTEM, eSystem::SC_MAKEREQUEST, (char*)&Packet, sizeof(AHNHS_TRANS_BUFFER));
m_dwHShieldResponseTick = timeGetTime();
}
}
#endif // _HSHIELD
void CDNUserBase::SetCashBalance(int nBalance)
{
if (nBalance < 0) return;
m_nCashBalance = nBalance;
}
void CDNUserBase::DelCashBalance(int nCash)
{
if (nCash <= 0) return;
m_nCashBalance -= nCash;
if (m_nCashBalance < 0) m_nCashBalance = 0;
}
void CDNUserBase::DelCashByPaymentRules(int nBalance, char cPaymentRules)
{
switch(cPaymentRules)
{
case Cash::PaymentRules::None:
DelCashBalance(nBalance);
break;
#if defined(_US)
case Cash::PaymentRules::Credit:
DelNxACredit(nBalance);
break;
case Cash::PaymentRules::Prepaid:
DelCashBalance(nBalance);
DelNxAPrepaid(nBalance);
break;
#endif // #if defined(_US)
}
}
#if defined(PRE_ADD_CASH_REFUND)
void CDNUserBase::AddCashBalance(int nCash)
{
if ( nCash < 0) return;
m_nCashBalance += nCash;
}
#endif
bool CDNUserBase::CheckEnoughCashByPaymentRules(int nBalance, char cPaymentRules)
{
switch(cPaymentRules)
{
case Cash::PaymentRules::None:
if (!CheckEnoughCashBalance(nBalance)) return false;
break;
#if defined(_US)
case Cash::PaymentRules::Credit:
if (!CheckEnoughNxACredit(nBalance)) return false;
break;
case Cash::PaymentRules::Prepaid:
if (!CheckEnoughNxAPrepaid(nBalance)) return false;
break;
#endif // #if defined(_US)
}
return true;
}
bool CDNUserBase::CheckEnoughCashBalance(int nBalance)
{
if (nBalance > GetCashBalance()) return false;
return true;
}
bool CDNUserBase::CheckEnoughPetal(int nPetal)
{
if (GetPetal() < nPetal) return false;
return true;
}
#if defined(_US)
void CDNUserBase::SetNxAPrepaid(int nCash)
{
if (nCash < 0) return;
m_nNxAPrepaid = nCash;
}
void CDNUserBase::DelNxAPrepaid(int nCash)
{
if (nCash <= 0) return;
m_nNxAPrepaid -= nCash;
if (m_nNxAPrepaid < 0) m_nNxAPrepaid = 0;
}
bool CDNUserBase::CheckEnoughNxAPrepaid(int nCash)
{
if (nCash > GetNxAPrepaid()) return false;
return true;
}
void CDNUserBase::SetNxACredit(int nCash)
{
if (nCash < 0) return;
m_nNxACredit = nCash;
}
void CDNUserBase::DelNxACredit(int nCash)
{
if (nCash <= 0) return;
m_nNxACredit -= nCash;
if (m_nNxACredit < 0) m_nNxACredit = 0;
}
bool CDNUserBase::CheckEnoughNxACredit(int nCash)
{
if (nCash > GetNxACredit()) return false;
return true;
}
bool CDNUserBase::CheckNxACreditUsableLevel(int nItemSN)
{
if (!g_pDataManager->GetCashCommodityCreditAble(nItemSN)) return false;
int nNxACreditUsableMinLevel = g_pDataManager->GetCashCommodityCreditAbleLevel(nItemSN); // <20>ſ<EFBFBD>ī<EFBFBD><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20>ְ<EFBFBD> <20><><EFBFBD><EFBFBD>
int nLevelCount = GetLevelCharacterCount(nNxACreditUsableMinLevel); // <20><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ°<D6B4>?
if (nNxACreditUsableMinLevel > GetLevel()){
if (nLevelCount <= 0) return false;
}
return true;
}
#endif // #if defined(_US)
bool CDNUserBase::IsValidPacketByNpcClick()
{
EtVector2 vVec( 0.f , 0.f );
#if defined(_VILLAGESERVER)
if (m_nClickedNpcObjectID <= 0) return false;
CDNNpcObject* pNpc = g_pFieldManager->GetNpcObjectByNpcObjID(GetChannelID(), m_nClickedNpcObjectID);
if (!pNpc) return false;
if (pNpc->GetChannelID() != GetChannelID()) return false;
vVec.x = (pNpc->GetCurrentPos().nX - m_pSession->GetCurrentPos().nX) / 1000.0f;
vVec.y = (pNpc->GetCurrentPos().nZ - m_pSession->GetCurrentPos().nZ) / 1000.0f;
#elif defined(_GAMESERVER)
DnActorHandle hNPC = CDnActor::FindActorFromUniqueID(m_pSession->GetGameRoom(), m_nClickedNpcObjectID);
if (!hNPC) return false;
vVec.x = hNPC->GetPosition()->x - m_pSession->GetPlayerActor()->GetPosition()->x;
vVec.y = hNPC->GetPosition()->y - m_pSession->GetPlayerActor()->GetPosition()->y;
#endif
float fLength = EtVec2Length(&vVec);
if ((fLength > 1.f) && (fLength < 2000.f)){
return true;
}
//g_Log.Log(LogType::_FILELOG, L"Length:%f\r\n", fLength);
return false;
}
void CDNUserBase::MakeGiftByQuest(int nQuestID, int *nRewardItemList)
{
wstring wStr = FormatW(L"%d", nQuestID);
m_pDBCon->QueryMakeGiftByQuest(m_pSession, nQuestID, (WCHAR*)wStr.c_str(), nRewardItemList, true);
}
int CDNUserBase::_CmdSetQuestNotifier( const CSGameOptionQuestNotifier* pPacket )
{
for( UINT i=0 ; i<_countof(pPacket->data) ; ++i )
{
bool bRet = false;
int iQuestIndex = pPacket->data[i].iIndex;
if( pPacket->data[i].eType == DNNotifier::Type::MainQuest )
{
if( iQuestIndex >= 0 && !g_pQuestManager->bIsMainQuest( iQuestIndex ) ) // MainQuest <20>˻<EFBFBD>
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
if( i >(DNNotifier::RegisterCount::MainQuest-1) ) // Index <20>˻<EFBFBD>
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
bRet = m_NotifierRepository.RegisterMainQuest( iQuestIndex );
}
else if( pPacket->data[i].eType == DNNotifier::Type::SubQuest )
{
if( iQuestIndex >= 0 && !g_pQuestManager->bIsSubQuest( iQuestIndex ) ) // SubQuest <20>˻<EFBFBD>
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
if( i < DNNotifier::RegisterCount::MainQuest ) // Index <20>˻<EFBFBD>
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
bRet = m_NotifierRepository.RegisterSubQuest( i, iQuestIndex );
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD>
else if( pPacket->data[i].eType == DNNotifier::Type::Max )
{
bRet = true;
}
if( bRet )
{
m_UserData.Status.NotifierData[i].eType = pPacket->data[i].eType;
m_UserData.Status.NotifierData[i].iIndex = iQuestIndex;
m_pDBCon->QueryNotifier( m_pSession, i, pPacket->data[i].eType, iQuestIndex );
}
}
return ERROR_NONE;
}
int CDNUserBase::_CmdSetMissionNotifier( const CSGameOptionMissionNotifier* pPacket )
{
for( UINT i=0 ; i<_countof(pPacket->data) ; ++i )
{
bool bRet = false;
int iMissionIndex = pPacket->data[i].iIndex;
#if defined(PRE_MOD_MISSION_HELPER)
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD>
if( pPacket->data[i].eType == DNNotifier::Type::Max )
{
bRet = true;
}
else if(iMissionIndex >= 0)
{
if(!m_pMissionSystem->bCheckDailyMission(iMissionIndex, pPacket->data[i].eType))
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
bRet = m_NotifierRepository.RegisterMission( DNNotifier::RegisterCount::TotalQuest+i ,iMissionIndex, pPacket->data[i].eType );
}
#else
if( pPacket->data[i].eType == DNNotifier::Type::DailyMission )
{
if( iMissionIndex >= 0 && !m_pMissionSystem->bIsDailyMission( iMissionIndex ) ) // DailyMission <20>˻<EFBFBD>
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
if( i > DNNotifier::RegisterCount::DailyMission ) // Index <20>˻<EFBFBD>
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
bRet = m_NotifierRepository.RegisterDailyMission( iMissionIndex );
}
else if( pPacket->data[i].eType == DNNotifier::Type::WeeklyMission )
{
if( iMissionIndex >= 0 && !m_pMissionSystem->bIsWeeklyMission( iMissionIndex ) ) // WeeklyMission <20>˻<EFBFBD>
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
if( i < DNNotifier::RegisterCount::DailyMission ) // Index <20>˻<EFBFBD>
{
_DANGER_POINT();
return ERROR_GENERIC_INVALIDREQUEST;
}
bRet = m_NotifierRepository.RegisterWeeklyMission( iMissionIndex );
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD>
else if( pPacket->data[i].eType == DNNotifier::Type::Max )
{
bRet = true;
}
#endif
if( bRet )
{
int iIndex = i+DNNotifier::RegisterCount::MainQuest+DNNotifier::RegisterCount::SubQuest;
m_UserData.Status.NotifierData[iIndex].eType = pPacket->data[i].eType;
m_UserData.Status.NotifierData[iIndex].iIndex = iMissionIndex;
m_pDBCon->QueryNotifier( m_pSession, iIndex, pPacket->data[i].eType, iMissionIndex );
}
}
return ERROR_NONE;
}
int CDNUserBase::DelFatigue(int nGap)
{
if (m_UserData.Status.wFatigue == 0) return m_UserData.Status.wFatigue;
m_UserData.Status.wFatigue -= nGap;
if (m_UserData.Status.wFatigue < 0) m_UserData.Status.wFatigue = 0;
GetEventSystem()->OnEvent( EventSystem::OnDailyFatigue);
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Daily, m_UserData.Status.wFatigue);
return m_UserData.Status.wFatigue;
}
int CDNUserBase::DelWeeklyFatigue(int nGap)
{
if (m_UserData.Status.wWeeklyFatigue == 0) return m_UserData.Status.wWeeklyFatigue;
m_UserData.Status.wWeeklyFatigue -= nGap;
if (m_UserData.Status.wWeeklyFatigue < 0) m_UserData.Status.wWeeklyFatigue = 0;
GetEventSystem()->OnEvent( EventSystem::OnWeeklyFatigue);
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::Weekly, m_UserData.Status.wWeeklyFatigue);
return m_UserData.Status.wWeeklyFatigue;
}
int CDNUserBase::DelPCBangFatigue(int nGap)
{
if (m_UserData.Status.wPCBangFatigue == 0) return m_UserData.Status.wPCBangFatigue;
m_UserData.Status.wPCBangFatigue -= nGap;
if (m_UserData.Status.wPCBangFatigue < 0) m_UserData.Status.wPCBangFatigue = 0;
GetEventSystem()->OnEvent( EventSystem::OnPCBangFatigue);
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::PCBang, m_UserData.Status.wPCBangFatigue);
return m_UserData.Status.wPCBangFatigue;
}
int CDNUserBase::DelEventFatigue(int nGap)
{
if (m_UserData.Status.wEventFatigue == 0) return m_UserData.Status.wEventFatigue;
m_UserData.Status.wEventFatigue -= nGap;
if (m_UserData.Status.wEventFatigue < 0) m_UserData.Status.wEventFatigue = 0;
m_pDBCon->QueryEventFatigue(m_pSession, m_UserData.Status.wEventFatigue, false, 0);
return m_UserData.Status.wEventFatigue;
}
int CDNUserBase::DelVIPFatigue(int nGap)
{
if (m_UserData.Status.wVIPFatigue == 0) return m_UserData.Status.wVIPFatigue;
m_UserData.Status.wVIPFatigue -= nGap;
if (m_UserData.Status.wVIPFatigue < 0) m_UserData.Status.wVIPFatigue = 0;
#if defined(PRE_ADD_VIP)
GetEventSystem()->OnEvent( EventSystem::OnVIPFatigue);
#endif
m_pDBCon->QueryFatigue(m_pSession, DBDNWorldDef::FatigueTypeCode::VIP, m_UserData.Status.wVIPFatigue);
return m_UserData.Status.wVIPFatigue;
}
int CDNUserBase::DelRebirthCoin(int nGap)
{
if (m_UserData.Status.cRebirthCoin == 0) return m_UserData.Status.cRebirthCoin;
if( m_UserData.Status.cRebirthCoin > nGap )
m_UserData.Status.cRebirthCoin -= nGap;
else
m_UserData.Status.cRebirthCoin = 0;
return GetRebirthCoin();
}
int CDNUserBase::DelPCBangRebirthCoin(int nGap)
{
if (m_UserData.Status.cPCBangRebirthCoin == 0) return m_UserData.Status.cPCBangRebirthCoin;
if (m_UserData.Status.cPCBangRebirthCoin > nGap)
m_UserData.Status.cPCBangRebirthCoin -= nGap;
else
m_UserData.Status.cPCBangRebirthCoin = 0;
return GetPCBangRebirthCoin();
}
int CDNUserBase::DelVIPRebirthCoin(int nGap)
{
if (m_cVIPRebirthCoin == 0) return m_cVIPRebirthCoin;
if (m_cVIPRebirthCoin > nGap)
m_cVIPRebirthCoin -= nGap;
else
m_cVIPRebirthCoin = 0;
return GetVIPRebirthCoin();
}
int CDNUserBase::DelCashRebirthCoin(int nGap)
{
if (m_UserData.Status.wCashRebirthCoin == 0) return m_UserData.Status.wCashRebirthCoin;
if (m_UserData.Status.wCashRebirthCoin > nGap)
m_UserData.Status.wCashRebirthCoin -= nGap;
else
m_UserData.Status.wCashRebirthCoin = 0;
m_pDBCon->QueryCashRebirthCoin(m_pSession);
return GetRebirthCashCoin();
}
bool CDNUserBase::CheckPapering( eCheckPapering eType )
{
DWORD dwCurTime = timeGetTime();
DWORD dwCheckTime = 0;
DWORD dwRestrictionTime = 0;
int nCheckCount = 0;
switch( eType )
{
case eChatPapering:
{
dwCheckTime = CHAT_PAPERING_CHECKTIME*1000;
dwRestrictionTime = CHAT_PAPERING_RESTRICTIONTIME*1000;
nCheckCount = CHAT_PAPERING_CHECKCOUNT;
}
break;
case eGesturePapering:
{
dwCheckTime = GESTURE_PAPERING_CHECKTIME*1000;
dwRestrictionTime = GESTURE_PAPERING_RESTRICTIONTIME*1000;
nCheckCount = GESTURE_PAPERING_CHECKCOUNT;
}
break;
}
// <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ChatTime<6D><65> <20><><EFBFBD><EFBFBD>
std::list<DWORD>::iterator iter = m_listRecentCheckTime[eType].begin();
while( iter != m_listRecentCheckTime[eType].end() )
{
DWORD dwTime = *iter;
if( dwCurTime > dwTime + dwCheckTime )
{
iter = m_listRecentCheckTime[eType].erase( iter );
continue;
}
++iter;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ް<EFBFBD><DEB0>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if( m_dwCheckPaperingRemainTime[eType] )
{
if( dwCurTime < m_dwCheckPaperingRemainTime[eType] + dwRestrictionTime )
return true;
else
m_dwCheckPaperingRemainTime[eType] = 0;
}
// <20><><EFBFBD><EFBFBD> Ƚ<><C8BD> <20>˻<EFBFBD>
if((int)m_listRecentCheckTime[eType].size()+1 >= nCheckCount )
m_dwCheckPaperingRemainTime[eType] = dwCurTime;
m_listRecentCheckTime[eType].push_back( dwCurTime );
return false;
}
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
void CDNUserBase::OnDBRecvReputation(int nSubCmd, char * pData)
{
switch(nSubCmd)
{
case QUERT_GET_LISTNPCFAVOR:
{
TAGetListNpcFavor* pPacket = reinterpret_cast<TAGetListNpcFavor*>(pData);
LoadReputation( pPacket );
break;
}
}
}
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
void CDNUserBase::OnDBRecvMasterSystem(int nSubCmd, char* pData)
{
switch( nSubCmd )
{
case QUERY_GET_SIMPLEINFO:
{
TAGetMasterPupilInfo* pA = reinterpret_cast<TAGetMasterPupilInfo*>(pData);
if( pA->nRetCode == ERROR_NONE )
{
memset( &m_MasterSystemData, 0, sizeof(m_MasterSystemData) );
m_MasterSystemData.SimpleInfo.iMasterCount = pA->SimpleInfo.iMasterCount;
m_MasterSystemData.SimpleInfo.iPupilCount = pA->SimpleInfo.iPupilCount;
m_MasterSystemData.SimpleInfo.iGraduateCount = pA->SimpleInfo.iGraduateCount;
m_MasterSystemData.SimpleInfo.BlockDate = pA->SimpleInfo.BlockDate;
m_MasterSystemData.SimpleInfo.cCharacterDBIDCount = pA->SimpleInfo.cCharacterDBIDCount;
for( UINT i=0 ; i<pA->SimpleInfo.cCharacterDBIDCount ; ++i )
{
m_MasterSystemData.SimpleInfo.OppositeInfo[i].CharacterDBID = pA->SimpleInfo.OppositeInfo[i].CharacterDBID;
m_MasterSystemData.SimpleInfo.OppositeInfo[i].nFavorPoint = pA->SimpleInfo.OppositeInfo[i].nFavorPoint;
_wcscpy( m_MasterSystemData.SimpleInfo.OppositeInfo[i].wszCharName, _countof(m_MasterSystemData.SimpleInfo.OppositeInfo[i].wszCharName),
pA->SimpleInfo.OppositeInfo[i].wszCharName, (int)wcslen(pA->SimpleInfo.OppositeInfo[i].wszCharName) );
}
if( pA->bClientSend == true )
{
SendMasterSystemSimpleInfo( m_MasterSystemData.SimpleInfo );
}
OnMasterSystemEvent( pA->EventCode );
}
else
{
_DANGER_POINT();
}
break;
}
case QUERY_GET_COUNTINFO:
{
TAGetMasterSystemCountInfo* pA = reinterpret_cast<TAGetMasterSystemCountInfo*>(pData);
if( pA->bClientSend )
SendMasterSystemCountInfo( pA->iMasterCount, pA->iPupilCount, pA->iClassmateCount );
return;
}
case QUERY_GRADUATE:
{
TAGraduate* pA = reinterpret_cast<TAGraduate*>(pData);
SendMasterSystemGraduate( pA->wszPupilCharName );
break;
}
}
}
void CDNUserBase::OnMasterSystemEvent( MasterSystem::EventType::eCode EventCode )
{
switch( EventCode )
{
// Offline <20>϶<EFBFBD> Event üũ
case MasterSystem::EventType::VillageFirstConnect:
{
GetEventSystem()->OnEvent( EventSystem::OnMasterSystemJoin );
GetEventSystem()->OnEvent( EventSystem::OnMasterSystemGraduated );
break;
}
case MasterSystem::EventType::Join:
{
GetEventSystem()->OnEvent( EventSystem::OnMasterSystemJoin );
break;
}
case MasterSystem::EventType::Graduate:
{
GetEventSystem()->OnEvent( EventSystem::OnMasterSystemGraduate );
break;
}
case MasterSystem::EventType::Graduated:
{
GetEventSystem()->OnEvent( EventSystem::OnMasterSystemGraduated );
break;
}
}
}
bool CDNUserBase::bIsMasterApplicationPenalty()
{
#if !defined( _FINAL_BUILD )
#if defined( _VILLAGESERVER )
CDNUserSession* pSession = static_cast<CDNUserSession*>(this);
if( pSession->m_bIsMasterSystemSkipDate )
return false;
#endif // #if defined( _VILLAGESERVER )
#endif // #if !defined( _FINAL_BUILD )
CTimeSet CurTime;
/*
if( CurTime.GetTimeT64_LC()-m_MasterSystemData.SimpleInfo.BlockDate < MasterSystem::Penalty::PupilLeavePenaltySec )
return true;
*/
// BlockDate <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>г<EFBFBD>Ƽ<EFBFBD><20>ƴ<EFBFBD>
if( CurTime.GetTimeT64_LC() >= m_MasterSystemData.SimpleInfo.BlockDate )
return false;
return true;
}
#if defined( PRE_ADD_SECONDARY_SKILL )
void CDNUserBase::OnDBRecvSecondarySkill(int nSubCmd, char* pData)
{
switch( nSubCmd )
{
case QUERY_GETLIST_SECONDARYSKILL:
{
TAGetListSecondarySkill* pA = reinterpret_cast<TAGetListSecondarySkill*>(pData);
if( pA->nRetCode == ERROR_NONE )
{
for( UINT i=0 ; i<pA->cCount ; ++i )
{
if( m_pSecondarySkillRepository->Add( pA->SkillList[i].iSkillID, pA->SkillList[i].iExp ) == false )
{
_ASSERT(0);
g_Log.Log( LogType::_ERROR, m_pSession, L"SecondarySkill|[ADBID:%u, CDBID:%I64d, SID:%u] AddRecipe Failed! SkillID:%d Exp:%d", GetAccountDBID(), GetCharacterDBID(), m_pSession->GetSessionID(), pA->SkillList[i].iSkillID, pA->SkillList[i].iExp );
m_pSession->DetachConnection(L"AddSecondarySkill Failed!");
return;
}
}
}
else
{
_ASSERT(0);
g_Log.Log( LogType::_ERROR, m_pSession, L"SecondarySkill|[ADBID:%u, CDBID:%I64d, SID:%u] QUERY_GETLIST_SECONDARYSKILL Ret:%d", GetAccountDBID(), GetCharacterDBID(), m_pSession->GetSessionID(), pA->nRetCode );
m_pSession->DetachConnection(L"QUERY_GETLIST_SECONDARYSKILL Failed!");
}
break;
}
case QUERY_GETLIST_SECONDARYSKILL_RECIPE:
{
TAGetListManufactureSkillRecipe* pA = reinterpret_cast<TAGetListManufactureSkillRecipe*>(pData);
if( pA->nRetCode == ERROR_NONE )
{
_ASSERT( dynamic_cast<CSecondarySkillRepositoryServer*>(m_pSecondarySkillRepository) );
for( UINT i=0 ; i<pA->cCount ; ++i )
{
if( static_cast<CSecondarySkillRepositoryServer*>(m_pSecondarySkillRepository)->AddRecipe( &pA->RecipeList[i] ) == false )
{
_ASSERT(0);
g_Log.Log( LogType::_ERROR, m_pSession, L"SecondarySkillRecipe|[ADBID:%u, CDBID:%I64d, SID:%u] AddRecipe Failed! SkillID:%d ItemID:%d", GetAccountDBID(), GetCharacterDBID(), m_pSession->GetSessionID(), pA->RecipeList[i].iSkillID, pA->RecipeList[i].iItemID );
m_pSession->DetachConnection(L"AddRecipe Failed!");
return;
}
}
}
else
{
_ASSERT(0);
g_Log.Log( LogType::_ERROR, m_pSession, L"SecondarySkillRecipe|[ADBID:%u, CDBID:%I64d, SID:%u] QUERY_GETLIST_SECONDARYSKILL_RECIPE Ret:%d", GetAccountDBID(), GetCharacterDBID(), m_pSession->GetSessionID(), pA->nRetCode );
m_pSession->DetachConnection(L"QUERY_GETLIST_SECONDARYSKILL_RECIPE Failed!");
}
break;
}
}
}
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
void CDNUserBase::OnDBRecvFarm(int nSubCmd, char * pData)
{
switch(nSubCmd)
{
case QUERY_GETCOUNT_HARVESTDEPOTITEM:
{
TAGetCountHarvestDepotItem* pPacket = reinterpret_cast<TAGetCountHarvestDepotItem*>(pData);
if (pPacket->nRetCode == ERROR_NONE )
{
SendFarmWareHouseItemCount( pPacket->iCount );
}
}
break;
}
}
void CDNUserBase::OnDBRecvGuildRecruit(int nSubCmd, char * pData)
{
return;
}
#if defined( PRE_PARTY_DB )
void CDNUserBase::OnDBRecvParty( int nSubCmd, char* pData )
{
}
#endif // #if defined( PRE_PARTY_DB )
#if defined (PRE_ADD_BESTFRIEND)
void CDNUserBase::OnDBRecvBestFriend(int nSubCmd, char* pData)
{
switch( nSubCmd )
{
case QUERY_GET_BESTFRIEND:
{
const TAGetBestFriend *pPacket = reinterpret_cast<TAGetBestFriend*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
break;
m_pBestFriend->LoadData(pPacket);
}
break;
default:
break;
}
}
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
void CDNUserBase::OnDBRecvPrivateChatChannel(int nSubCmd, char* pData)
{
switch( nSubCmd )
{
case QUERY_GET_PRIVATECHATCHANNELMEMBER:
{
const TAPrivateChatChannelMember* pPacket = reinterpret_cast<const TAPrivateChatChannelMember*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SetPrivateChannelID(0);
SendPrivateChatChannelResult(pPacket->nRetCode);
return;
}
if(g_pPrivateChatChannelManager)
{
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( pPacket->cWorldSetID, pPacket->nPrivateChatChannelID);
if(pPrivateChatChannel)
{
SetPrivateChannelID(pPacket->nPrivateChatChannelID);
if( pPrivateChatChannel->CheckPrivateChannelMember(GetCharacterDBID()) )
{
SendPrivateChatChannel(pPrivateChatChannel);
SetPrivateChannelID(pPacket->nPrivateChatChannelID);
pPrivateChatChannel->SetPrivateChannelMemberAccountDBID(GetAccountDBID(), GetCharacterDBID());
m_pDBCon->QueryModPrivateMemberServerID( m_pSession );
}
else
m_pDBCon->QueryAddPrivateChatChannelMember( m_pSession, pPacket->nPrivateChatChannelID, PrivateChatChannel::Common::EnterMember );
}
}
}
break;
case QUERY_CREATE_PRIVATECHATCHANNEL:
{
const TAAddPrivateChatChannel *pPacket = reinterpret_cast<TAAddPrivateChatChannel*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SetPrivateChannelID(0);
SendPrivateChatChannelResult(ERROR_ALREADY_CHANNELNAME);
return;
}
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( pPacket->cWorldSetID, pPacket->tPrivateChatChannel.nPrivateChatChannelID);
if(pPrivateChatChannel)
{
SendPrivateChatChannelJoinResult(pPacket->nRetCode, pPrivateChatChannel->GetChannelName());
SendPrivateChatChannel(pPrivateChatChannel);
SetPrivateChannelID(pPacket->tPrivateChatChannel.nPrivateChatChannelID);
GetDBConnection()->QueryModPrivateMemberServerID( m_pSession );
}
}
break;
case QUERY_ADD_PRIVATECHATMEMBER:
{
const TAAddPrivateChatMember *pPacket = reinterpret_cast<TAAddPrivateChatMember*>(pData);
if (ERROR_NONE != pPacket->nRetCode && pPacket->nRetCode != 103345) // 103345<34><35> <20><><EFBFBD>񼭹<EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD> <20>߻<EFBFBD><DFBB>ϹǷ<CFB9> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>
{
switch(pPacket->nRetCode)
{
case 103329:
{
SendPrivateChatChannelResult(ERROR_NOTEXIST_CHANNELNAME);
}
break;
case 103347:
{
SendPrivateChatChannelResult(ERROR_MAX_CHANNELMEMBER);
}
break;
}
SetPrivateChannelID(0);
return;
}
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( pPacket->cWorldSetID, pPacket->nPrivateChatChannelID);
if(pPrivateChatChannel)
{
SendPrivateChatChannelJoinResult(pPacket->nRetCode, pPrivateChatChannel->GetChannelName());
SendPrivateChatChannel(pPrivateChatChannel);
SetPrivateChannelID(pPacket->nPrivateChatChannelID);
if( GetCharacterDBID() == pPrivateChatChannel->GetMasterCharacterDBID() )
m_pDBCon->QueryModPrivateChatChannelInfo( m_pSession, pPrivateChatChannel->GetChannelName(), PrivateChatChannel::Common::ChangeMaster, pPrivateChatChannel->GetChannelPassword(), GetCharacterDBID() );
GetDBConnection()->QueryModPrivateMemberServerID( m_pSession );
}
}
break;
case QUERY_DEL_PRIVATECHATMEMBER:
{
const TADelPrivateChatMember *pPacket = reinterpret_cast<TADelPrivateChatMember*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SetPrivateChannelID(0);
SendPrivateChatChannelResult(pPacket->nRetCode);
return;
}
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo(pPacket->cWorldSetID, pPacket->nPrivateChatChannelID);
if(pPrivateChatChannel)
{
pPrivateChatChannel->DelPrivateChannelMember(PrivateChatChannel::Common::OutMember, pPacket->biCharacterDBID );
SendPrivateChatChannelOutResult(pPacket->nRetCode);
}
}
break;
case QUERY_KICK_PRIVATECHATMEMBER:
{
const TADelPrivateChatMember *pPacket = reinterpret_cast<TADelPrivateChatMember*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SetPrivateChannelID(0);
SendPrivateChatChannelResult(pPacket->nRetCode);
return;
}
}
break;
case QUERY_MOD_PRIVATECHATCHANNELINFO:
{
const TAModPrivateChatChannelInfo *pPacket = reinterpret_cast<TAModPrivateChatChannelInfo*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SetPrivateChannelID(0);
SendPrivateChatChannelResult(pPacket->nRetCode);
return;
}
}
break;
case QUERY_INVITE_PRIVATECHATMEMBER:
{
const TAInvitePrivateChatMember *pPacket = reinterpret_cast<TAInvitePrivateChatMember*>(pData);
if (ERROR_NONE != pPacket->nRetCode)
{
SetPrivateChannelID(0);
return;
}
CDNPrivateChaChannel* pPrivateChatChannel = g_pPrivateChatChannelManager->GetPrivateChannelInfo( pPacket->cWorldSetID, pPacket->nPrivateChatChannelID);
if(pPrivateChatChannel)
{
SendPrivateChatChannelJoinResult(pPacket->nRetCode, pPrivateChatChannel->GetChannelName());
SendPrivateChatChannel(pPrivateChatChannel);
SetPrivateChannelID(pPacket->nPrivateChatChannelID);
}
}
break;
default:
break;
}
}
#endif
#if defined( PRE_ALTEIAWORLD_EXPLORE )
void CDNUserBase::OnDBRecvAlteiaWorld(int nSubCmd, char* pData)
{
// switch( nSubCmd )
// {
// default:
// break;
// }
}
#endif
#if defined( PRE_ADD_STAMPSYSTEM )
void CDNUserBase::OnDBRecvStampSystem( int nSubCmd, char* pData )
{
switch( nSubCmd )
{
case QUERY_GETLIST_COMPLETECHALLENGES:
{
const TAGetListCompleteChallenges* pPacket = reinterpret_cast<TAGetListCompleteChallenges*>(pData);
if( ERROR_NONE != pPacket->nRetCode )
{
return;
}
GetStampSystem()->InitCompleteSlot( pPacket->CompleteInfo );
}
break;
case QUERY_INIT_COMPLETECHALLENGE:
{
}
break;
case QUERY_ADD_COMPLETECHALLENGE:
{
}
break;
default:
break;
}
}
#endif // #if defined( PRE_ADD_STAMPSYSTEM )
#if defined(PRE_ADD_DWC)
void CDNUserBase::OnDBRecvDWC( int nSubCmd, char* pData )
{
}
#endif
void CDNUserBase::NotifyGuildMemberLevelUp(char cLevel)
{
if(GetGuildUID().IsSet())
{
const TGuildUID GuildUID = GetGuildUID();
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if(pGuild)
{
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if(FALSE == pGuild->IsEnable()) return;
#endif
pGuild->UpdateMemberLevel(GetCharacterDBID(), cLevel);
// <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
#if defined(_VILLAGESERVER)
g_pMasterConnection->SendGuildMemberLevelUp(pGuild->GetUID(), GetCharacterDBID(), cLevel);
#elif defined(_GAMESERVER)
g_pMasterConnectionManager->SendGuildMemberLevelUp(GetWorldSetID(), pGuild->GetUID(), GetCharacterDBID(), cLevel);
#endif
}
}
}
void CDNUserBase::ModifyCompleteQuest()
{
if(!m_pQuest)
return;
g_pPeriodQuestSystem->MarkingSelectQuest(m_pQuest);
m_pDBCon->QueryGetListCompleteEventQuest(m_pSession);
#if defined(PRE_ADD_REMOTE_QUEST)
m_pQuest->CheckAcceptWaitRemoteQuestList();
#endif
}
void CDNUserBase::ResetRepeatQuest()
{
if(!m_pQuest)
{
ASSERT(0);
return;
}
g_pQuestManager->ResetRepeatQuest(m_pQuest);
}
int CDNUserBase::GetGuildWareAllowCount()
{
const TGuildUID GuildUID = GetGuildSelfView().GuildUID;
if(!GuildUID.IsSet())
return -1;
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if(!pGuild)
return -1;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if(FALSE == pGuild->IsEnable()) return -1;
#endif
return pGuild->GetWareSize();
}
int CDNUserBase::GetGuildRoleType()
{
const TGuildUID GuildUID = GetGuildSelfView().GuildUID;
if(!GuildUID.IsSet())
return -1;
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if(!pGuild)
return -1;
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if(FALSE == pGuild->IsEnable()) return -1;
#endif
TGuildMember* pGuildMember = pGuild->GetMemberInfo(GetCharacterDBID());
if(!pGuildMember)
return -1;
return pGuildMember->btGuildRole;
}
void CDNUserBase::ExtendGuildWareAllowCount(int nTotalSize)
{
const TGuildUID GuildUID = GetGuildSelfView().GuildUID;
if(!GuildUID.IsSet())
{
_ASSERT( 0 );
return;
}
CDNGuildBase* pGuild = g_pGuildManager->At(GuildUID);
if(!pGuild)
{
_ASSERT( 0 );
return;
}
#if !defined( PRE_ADD_NODELETEGUILD )
CDetachAutoEx<CDNGuildBase> AutoDetach(pGuild);
if(FALSE == pGuild->IsEnable()) return;
#endif
pGuild->UpdateWareSize(this, (short)nTotalSize);
}
void CDNUserBase::UpdatePeriodQuest(int nWorldID, int nPeriodQuestType, std::vector<int>& vTotalQuestIDs)
{
// <20>ֱ<EFBFBD><D6B1><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> ó<><C3B3>
m_pDBCon->QueryDeletePeriodQuest( m_pSession, nPeriodQuestType, vTotalQuestIDs);
};
void CDNUserBase::CheckResetPeriodQuest(const TAGetPeriodQuestDate* pPacket)
{
if(pPacket->nCount > 0)
{
for (int i=0; i<pPacket->nCount; i++)
{
int nType = pPacket->PeriodQuestDate[i].nPeriodType;
if(m_UserData.Status.tLastPeriodQuestDate[nType] < 0)
m_UserData.Status.tLastPeriodQuestDate[nType] = 0;
m_UserData.Status.tLastPeriodQuestDate[nType] = pPacket->PeriodQuestDate[i].tAssignDate;
switch(nType)
{
case PERIODQUEST_RESET_DAILY:
{
RegisterSchedule(CDNSchedule::AlarmResetDailyMission, m_UserData.Status.tLastPeriodQuestDate[nType]);
}
break;
case PERIODQUEST_RESET_WEEKLY:
{
RegisterSchedule(CDNSchedule::AlarmResetWeeklyMission, m_UserData.Status.tLastPeriodQuestDate[nType]);
}
break;
default:
continue;
}
}
}
else
{
// DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>޾ƾ<DEBE><C6BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>½<EFBFBD><C2BD><EFBFBD> <20>ٽ<EFBFBD> <20>޵<EFBFBD><DEB5><EFBFBD> <20>Ѵ<EFBFBD>.
m_UserData.Status.tLastPeriodQuestDate[PERIODQUEST_RESET_DAILY] = 0;
m_UserData.Status.tLastPeriodQuestDate[PERIODQUEST_RESET_WEEKLY] = 0;
RegisterSchedule(CDNSchedule::AlarmResetDailyMission, m_UserData.Status.tLastPeriodQuestDate[PERIODQUEST_RESET_DAILY]);
RegisterSchedule(CDNSchedule::AlarmResetWeeklyMission, m_UserData.Status.tLastPeriodQuestDate[PERIODQUEST_RESET_WEEKLY]);
}
}
void CDNUserBase::ResetPeriodQuest(int nType)
{
std::vector<int> vTotalQuestIDs;
g_pPeriodQuestSystem->GetResetQuestList(m_pQuest, nType, vTotalQuestIDs);
UpdatePeriodQuest(m_nWorldSetID, nType, vTotalQuestIDs);
}
void CDNUserBase::ProcessPeriodQuest(DWORD dwCurTick)
{
for (int i=PERIODQUEST_RESET_EVENT; i<PERIODQUEST_RESET_MAX; i++)
{
if (!m_bPeriodQuestSchedule[i])
continue;
DWORD dwWaitingTick = (DWORD)((GetCharacterDBID() % MAX_PERIODQUEST_DISTRIBUTION) * PERIODQUEST_WAITTIME);
if (dwWaitingTick > GetTickTerm(m_dwPeriodQuestTick[i], dwCurTick))
continue;
m_bPeriodQuestSchedule[i] = false;
m_dwPeriodQuestTick[i] = dwCurTick;
ResetPeriodQuest(i);
}
}
void CDNUserBase::SetDefaultMaxDailyPeriodQuest(ScheduleStruct *pStruct)
{
CTimeSet tCurrentSet;
if (pStruct->cHour == tCurrentSet.GetHour())
{
if (pStruct->cMinute <= tCurrentSet.GetMinute() &&
tCurrentSet.GetMinute() <= pStruct->cMinute + MAX_PERIODQUEST_PROCESSMIN)
{
m_bPeriodQuestSchedule[PERIODQUEST_RESET_DAILY] = true;
m_dwPeriodQuestTick[PERIODQUEST_RESET_DAILY] = timeGetTime();
return;
}
}
ResetPeriodQuest(PERIODQUEST_RESET_DAILY);
}
void CDNUserBase::SetDefaultMaxWeeklyPeriodQuest(ScheduleStruct *pStruct)
{
CTimeSet tCurrentSet;
if (pStruct->cHour == tCurrentSet.GetHour())
{
if (pStruct->cMinute <= tCurrentSet.GetMinute() &&
tCurrentSet.GetMinute() <= pStruct->cMinute + MAX_PERIODQUEST_PROCESSMIN)
{
m_bPeriodQuestSchedule[PERIODQUEST_RESET_WEEKLY] = true;
m_dwPeriodQuestTick[PERIODQUEST_RESET_WEEKLY] = timeGetTime();
return;
}
}
ResetPeriodQuest(PERIODQUEST_RESET_WEEKLY);
}
void CDNUserBase::SetEtcPointList( const TAGetListEtcPoint *pPacket )
{
m_UnionReputePointInfo.SetUnionReputePoint(NpcReputation::UnionType::Commercial, pPacket->biEtcPoint[DBDNWorldDef::EtcPointCode::Union_Commercial]);
m_UnionReputePointInfo.SetUnionReputePoint(NpcReputation::UnionType::Royal, pPacket->biEtcPoint[DBDNWorldDef::EtcPointCode::Union_Royal]);
m_UnionReputePointInfo.SetUnionReputePoint(NpcReputation::UnionType::Liberty, pPacket->biEtcPoint[DBDNWorldDef::EtcPointCode::Union_Liberty]);
m_biGuildWarFestivalPoint = pPacket->biEtcPoint[DBDNWorldDef::EtcPointCode::GuildWar_Festival];
#if defined( PRE_ADD_NEW_MONEY_SEED )
m_nSeedPoint = pPacket->biEtcPoint[DBDNWorldDef::EtcPointCode::SeedPoint];
#endif
}
void CDNUserBase::SetEtcPointEach(int nType, INT64 biLeftPoint)
{
switch(nType)
{
case DBDNWorldDef::EtcPointCode::Union_Commercial:
{
m_UnionReputePointInfo.SetUnionReputePoint(NpcReputation::UnionType::Commercial, biLeftPoint);
SendUnionPoint();
}
break;
case DBDNWorldDef::EtcPointCode::Union_Royal:
{
m_UnionReputePointInfo.SetUnionReputePoint(NpcReputation::UnionType::Royal, biLeftPoint);
SendUnionPoint();
}
break;
case DBDNWorldDef::EtcPointCode::Union_Liberty:
{
m_UnionReputePointInfo.SetUnionReputePoint(NpcReputation::UnionType::Liberty, biLeftPoint);
SendUnionPoint();
}
break;
case DBDNWorldDef::EtcPointCode::GuildWar_Festival:
{
m_biGuildWarFestivalPoint = biLeftPoint;
SendGuildWarFestivalPoint();
}
break;
#if defined( PRE_ADD_NEW_MONEY_SEED )
case DBDNWorldDef::EtcPointCode::SeedPoint:
{
bool bInc = false;
if(m_nSeedPoint < biLeftPoint)
bInc = true;
m_nSeedPoint = biLeftPoint;
SendSeedPoint(bInc);
}
break;
#endif
}
}
void CDNUserBase::AddEtcPoint( BYTE cType, int nPlusPoint)
{
if(cType > DBDNWorldDef::EtcPointCode::None && nPlusPoint > 0)
m_pDBCon->QueryAddEtcPoint(m_pSession, cType, nPlusPoint);
}
void CDNUserBase::UseEtcPoint( BYTE cType, int nUsePoint )
{
if(cType > DBDNWorldDef::EtcPointCode::None && nUsePoint > 0)
m_pDBCon->QueryUseEtcPoint(m_pSession, cType, nUsePoint);
}
int CDNUserBase::ParseEnchant( CSEnchantItem* pPacket, int nLen )
{
if(bIsRemoteEnchant()==false && !IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if(sizeof(CSEnchantItem) != nLen)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND) ){
#if defined(PRE_ADD_EQUIPED_ITEM_ENCHANT)
SendEnchant(pPacket->cItemIndex, pPacket->bEnchantEquipedItem, ERROR_ITEM_ENCHANTFAIL, pPacket->bCashItem);
#else
SendEnchant(pPacket->cInvenIndex, ERROR_ITEM_ENCHANTFAIL);
#endif
return ERROR_NONE;
}
if(m_pRestraint->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
return ERROR_NONE;
if( bIsRemoteEnchant() == true )
{
if( m_pItem->GetCashItemCountByType( ITEMTYPE_REMOTE_ENCHANT ) <= 0 && m_pItem->GetInventoryItemCountByType( ITEMTYPE_REMOTE_ENCHANT ) <= 0 )
{
#if defined(PRE_ADD_EQUIPED_ITEM_ENCHANT)
SendEnchant(pPacket->cItemIndex, pPacket->bEnchantEquipedItem, ERROR_ITEM_INSUFFICIENCY_ITEMTYPE_REMOTEENCHANT, pPacket->bCashItem);
#else
SendEnchant(pPacket->cInvenIndex, ERROR_ITEM_INSUFFICIENCY_ITEMTYPE_REMOTEENCHANT);
#endif
return ERROR_NONE;
}
}
int nRet = m_pItem->CheckUpgradeEnchant(pPacket);
#if defined(PRE_ADD_EQUIPED_ITEM_ENCHANT)
SendEnchant(pPacket->cItemIndex, pPacket->bEnchantEquipedItem, nRet, pPacket->bCashItem);
#else
SendEnchant(pPacket->cInvenIndex, nRet);
#endif
if( nRet == ERROR_NONE ) m_pSession->BroadcastingEffect(EffectType_Enchant, EffectState_Start);
return ERROR_NONE;
}
int CDNUserBase::ParseEnchantComplete( CSEnchantItem* pPacket, int nLen )
{
if(!m_pItem->IsValidRequestTimer(CDNUserItem::RequestType_Enchant)) {
SendEnchantComplete(0, 0, 0, ERROR_ITEM_ENCHANTFAIL, pPacket->bCashItem);
return ERROR_NONE;
}
if(bIsRemoteEnchant()==false && !IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if(sizeof(CSEnchantItem) != nLen)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND) ){
SendEnchantComplete(0, 0, 0, ERROR_ITEM_ENCHANTFAIL, pPacket->bCashItem);
return ERROR_NONE;
}
if( bIsRemoteEnchant() == true )
{
if( m_pItem->UseItemByType( ITEMTYPE_REMOTE_ENCHANT, 1, DBDNWorldDef::UseItem::Use ) == false )
{
#if defined(PRE_ADD_EQUIPED_ITEM_ENCHANT)
SendEnchant(pPacket->cItemIndex, pPacket->bEnchantEquipedItem, ERROR_ITEM_INSUFFICIENCY_ITEMTYPE_REMOTEENCHANT, false);
#else
SendEnchant(pPacket->cInvenIndex, ERROR_ITEM_INSUFFICIENCY_ITEMTYPE_REMOTEENCHANT);
#endif
return ERROR_ITEM_FAIL;
}
}
int nRet = m_pItem->UpgradeEnchant(pPacket);
if(nRet != ERROR_NONE) SendEnchantComplete(0, 0, 0, nRet, false);
return ERROR_NONE;
}
int CDNUserBase::ParseEnchantCancel( int nLen )
{
if(!bIsRemoteEnchant() && !IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if(nLen != 0)
return ERROR_INVALIDPACKET;
SendEnchantCancel(ERROR_NONE);
m_pSession->BroadcastingEffect(EffectType_Enchant, EffectState_Cancel);
return ERROR_NONE;
}
int CDNUserBase::ParseItemCompound( CSItemCompoundOpenReq* pPacket, int nLen )
{
if( !bIsRemoteItemCompound() && !IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if(sizeof(CSItemCompoundOpenReq) != nLen)
return ERROR_INVALIDPACKET;
if( !IsWindowState(WINDOW_BLIND) ) {
SendEmblemCompoundRes( ERROR_ITEM_ITEM_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 = pPacket->nCompoundTableID;
ItemSettingInfo.iHasMoney = GetCoin(); // Note: GetCoin <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> INT64<36><34>.
g_pDataManager->GetItemCompounder()->GetCompoundInfo( pPacket->nCompoundTableID, &CompoundInfo );
bool bValidHaveItem = true;
int iItemSettingArrayCount = 0;
for( int i = 0; i < COMPOUNDITEMMAX; ++i )
{
if( 0 == CompoundInfo.aiItemID[ i ] )
break;
int iHaveCount = 0;
if( CompoundInfo.abResultItemIsNeedItem[i] ) {
std::vector<TItem *> pVecResultList;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD> <20>˻<EFBFBD>..
iHaveCount = m_pItem->GetInventoryItemListFromItemID( CompoundInfo.aiItemID[ i ], CompoundInfo.iCompoundPreliminaryID, pVecResultList );
if( iHaveCount ) {
bool bValidItem = false;
for( DWORD j=0; j<pVecResultList.size(); j++ ) {
if( pVecResultList[j]->nSerial == pPacket->biNeedItemSerialID ) {
bValidItem = true;
break;
}
}
if( !bValidItem ) {
bValidHaveItem = false;
break;
}
}
}
else iHaveCount = m_pItem->GetInventoryItemCount( CompoundInfo.aiItemID[ i ], -1 );
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_ITEM_COMPOUND_FAIL;
if( bValidHaveItem )
{
if( bIsRemoteItemCompound() == true )
{
const TItemData* pRemoteItemData = g_pDataManager->GetItemData( m_pSession->GetRemoteItemCompoundItemID() );
if( pRemoteItemData )
{
INT64 iDiscount = CompoundInfo.iCost * pRemoteItemData->nTypeParam[0] / 100;
ItemSettingInfo.iDiscountedCost = CompoundInfo.iCost - iDiscount;
}
}
if( GetCheatCommand()->m_bLucky ) g_pDataManager->GetItemCompounder()->CheckPossibility( false );
#if defined( _GAMESERVER )
g_pDataManager->ItemCompound( m_pSession->GetGameRoom(), ItemSettingInfo, &Output );
#else
g_pDataManager->ItemCompound( ItemSettingInfo, &Output );
#endif // #if defined( _GAMESERVER )
if( GetCheatCommand()->m_bLucky ) g_pDataManager->GetItemCompounder()->CheckPossibility( true );
if( CDnItemCompounder::R_SUCCESS == Output.eResultCode ||
CDnItemCompounder::R_POSSIBILITY_FAIL == Output.eResultCode )
{
iResult = ERROR_NONE;
m_pSession->BroadcastingEffect(EffectType_Compound, EffectState_Start);
}
}
SendItemCompoundOpen( iResult );
return ERROR_NONE;
}
int CDNUserBase::ParseItemCompoundComplete( CSCompoundItemReq* pCompoundItem, int nLen )
{
if( !bIsRemoteItemCompound() && !IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if(sizeof(CSCompoundItemReq) != 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>.
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>.
g_pDataManager->GetItemCompounder()->GetCompoundInfo( pCompoundItem->nCompoundTableID, &CompoundInfo );
bool bValidHaveItem = true;
int iItemSettingArrayCount = 0;
for( int i = 0; i < NUM_MAX_NEED_ITEM; ++i )
{
if( 0 == CompoundInfo.aiItemID[ i ] )
break;
int iHaveCount = 0;
if( CompoundInfo.abResultItemIsNeedItem[i] ) {
std::vector<TItem *> pVecResultList;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD> <20>˻<EFBFBD>..
iHaveCount = m_pItem->GetInventoryItemListFromItemID( CompoundInfo.aiItemID[ i ], CompoundInfo.iCompoundPreliminaryID, pVecResultList );
if( iHaveCount ) {
bool bValidItem = false;
for( DWORD j=0; j<pVecResultList.size(); j++ ) {
if( pVecResultList[j]->nSerial == pCompoundItem->biNeedItemSerialID ) {
bValidItem = true;
break;
}
}
if( !bValidItem ) {
bValidHaveItem = false;
break;
}
}
}
else iHaveCount = m_pItem->GetInventoryItemCount( CompoundInfo.aiItemID[ i ], -1 );
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;
std::vector<CDNUserItem::TSaveItemInfo> VecResultItemList;
if( bValidHaveItem )
{
iResult = ERROR_ITEM_ITEM_COMPOUND_FAIL;
if( IsWindowState(WINDOW_BLIND) )
{
if( bIsRemoteItemCompound() == true )
{
if( m_pItem->UseItemByItemID( GetRemoteItemCompoundItemID(), 1, DBDNWorldDef::UseItem::Use ) == false )
{
SendItemCompoundRes( iResult, 0, 0, 0 );
return ERROR_NONE;
}
const TItemData* pRemoteItemData = g_pDataManager->GetItemData( m_pSession->GetRemoteItemCompoundItemID() );
if( pRemoteItemData )
{
INT64 iDiscount = CompoundInfo.iCost * pRemoteItemData->nTypeParam[0] / 100;
ItemSettingInfo.iDiscountedCost = CompoundInfo.iCost - iDiscount;
}
}
if( GetCheatCommand()->m_bLucky ) g_pDataManager->GetItemCompounder()->CheckPossibility( false );
#if defined( _GAMESERVER )
g_pDataManager->ItemCompound( m_pSession->GetGameRoom(), ItemSettingInfo, &Output );
#else
g_pDataManager->ItemCompound( ItemSettingInfo, &Output );
#endif // #if defined( _GAMESERVER )
if( GetCheatCommand()->m_bLucky ) g_pDataManager->GetItemCompounder()->CheckPossibility( true );
if( CDnItemCompounder::R_SUCCESS == Output.eResultCode ||
CDnItemCompounder::R_POSSIBILITY_FAIL == Output.eResultCode )
{
if(!DelCoin( Output.iCost, DBDNWorldDef::CoinChangeCode::CompoundTax, m_nClickedNpcID ))
SendItemCompoundRes( ERROR_ITEM_EMBLEM_COMPOUND_FAIL, 0, 0, 0 );
// <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( m_pSession, 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();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȥ<><C8A4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>..<2E><><EFBFBD><EFBFBD>¡
if( nResultItemID > 0)
{
if( g_pDataManager->GetItemMainType(nResultItemID) == ITEMTYPE_GLYPH)
{
m_pSession->BroadcastingEffect(EffectType_Compound, EffectState_Fail);
SendItemCompoundRes( ERROR_ITEM_EMBLEM_COMPOUND_FAIL, 0, 0, 0 );
g_Log.Log(LogType::_ERROR, 0, GetAccountDBID(), GetCharacterDBID(), 0, L"ERROR Try Emblem Compound EmlbemID:%d!!\r\n", nResultItemID);
return ERROR_NONE;
}
}
if(!m_pItem->ItemCompoundComplete( nResultItemID, Output.cItemOptionIndex, CompoundInfo.aiItemID, CompoundInfo.aiItemCount, iItemSettingArrayCount, ( CompoundInfo.bResultItemIsNeedItem ) ? pCompoundItem->biNeedItemSerialID : 0, &VecResultItemList ))
SendItemCompoundRes( ERROR_ITEM_EMBLEM_COMPOUND_FAIL, 0, 0, 0 );
if( CDnItemCompounder::R_POSSIBILITY_FAIL == Output.eResultCode ){
iResult = ERROR_ITEM_ITEM_COMPOUND_POSSIBILITY_FAIL;
m_pSession->BroadcastingEffect(EffectType_Compound, EffectState_Fail);
}
else{
iResult = ERROR_NONE;
m_pSession->BroadcastingEffect(EffectType_Compound, EffectState_Success);
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ..
iResult = _MakeItemCompoundErrorCode( Output );
}
}
}
// Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
char cLevel = ( VecResultItemList.empty() ) ? 0 : VecResultItemList[0].Item.cLevel;
char cOption = ( VecResultItemList.empty() ) ? 0 : VecResultItemList[0].Item.cOption;
SendItemCompoundRes( iResult, nResultItemID, cLevel, cOption );
return ERROR_NONE;
}
int CDNUserBase::ParseItemCompoundCancel( CSItemCompoundCancelReq* pPacket, int nLen )
{
if( !bIsRemoteItemCompound() && !IsValidPacketByNpcClick()){ // npc <20>Ÿ<EFBFBD>üũ
return ERROR_GENERIC_INVALIDREQUEST;
}
if(sizeof(CSItemCompoundCancelReq) != nLen)
return ERROR_INVALIDPACKET;
SendItemCompoundCancel( ERROR_NONE );
m_pSession->BroadcastingEffect(EffectType_Compound, EffectState_Cancel);
return ERROR_NONE;
}
int CDNUserBase::_MakeItemCompoundErrorCode( CDnItemCompounder::S_OUTPUT &Output )
{
int iResult = ERROR_ITEM_ITEM_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_ITEM_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_ITEM_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_ITEM_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_ITEM_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_ITEM_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_ITEM_COMPOUND_NOT_ENOUGH_ITEM_COUNT;
break;
}
}
return iResult;
}
#if defined( PRE_ADD_VIP_FARM )
bool CDNUserBase::bIsFarmVip()
{
#if defined( _CH ) || defined( _TW )
// <20>߱<EFBFBD>,<2C><EFBFBD><EBB8B8> Vip <20><><EFBFBD>η<EFBFBD> Vip <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
if( IsVIP() == false )
{
return false;
}
else
{
CTimeSet VipEndTime( GetVIPEndDate(), true );
CTimeSet CurTime;
if( CurTime.GetTimeT64_LC() > VipEndTime.GetTimeT64_LC() )
return false;
}
#else
// <20>߱<EFBFBD>,<2C><20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EffectItem <20><><EFBFBD><EFBFBD> Vip <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
if( m_pEffectRepository->bIsExpiredItem( ITEMTYPE_FARM_VIP ) == true )
return false;
#endif // #if defined( _CH ) || defined( _TW )
return true;
}
#endif // #if defined( PRE_ADD_VIP_FARM )
void CDNUserBase::AddGhoulScore(GhoulMode::PointType::eCode Type)
{
++m_PvPTotalGhoulScores.nPoint[Type];
++m_PvPAddGhoulScores.nPoint[Type];
}
void CDNUserBase::ClearAddGhoulScore()
{
memset(&m_PvPAddGhoulScores, 0, sizeof(m_PvPAddGhoulScores));
}
int CDNUserBase::GetMaxLevelCharacterCount()
{
int nCount = 0;
int nLevelLimit = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PlayerLevelLimit );
for( int i=0; i<CHARCOUNTMAX; i++ ) {
if( m_OwnCharacterLevelList[i].cLevel >= nLevelLimit ) nCount++;
}
return nCount;
}
int CDNUserBase::GetLevelCharacterCount(int nLevel)
{
int nCount = 0;
for( int i=0; i<CHARCOUNTMAX; i++ ) {
if( m_OwnCharacterLevelList[i].cLevel >= nLevel ) nCount++;
}
return nCount;
}
void CDNUserBase::NextTalk(UINT nNpcObjectID, WCHAR* wszTalkIndex, WCHAR* wszTarget, std::vector<TalkParam>& talkParam )
{
SendNextTalk(nNpcObjectID, wszTalkIndex, wszTarget, talkParam);
}
void CDNUserBase::_MakeGiftVIPMonthItemByItemSN(int nItemSN)
{
#if defined(PRE_ADD_VIP)
TVIPData *pVIPData = g_pDataManager->GetVIPData();
if (pVIPData){
#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wstrMemo = FormatW(GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 2020011, m_eSelectedLanguage), g_pDataManager->GetCashCommodityCount(pVIPData->nMonthItemSN));
#else //#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wstrMemo = FormatW(GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 2020011), g_pDataManager->GetCashCommodityCount(pVIPData->nMonthItemSN));
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
int nGiftCount = g_pDataManager->GetCashCommodityPeriod(nItemSN) / 30;
int nItemList[5] = {0,};
nItemList[0] = pVIPData->nMonthItemSN;
for (int i = 0; i < nGiftCount; i++){
m_pDBCon->QueryMakeGift(m_cDBThreadID, GetWorldSetID(), GetAccountDBID(), GetCharacterDBID(), IsPCBang(), (WCHAR*)wstrMemo.c_str(), DBDNWorldDef::PayMethodCode::VIP, GetLevel(), (char*)m_pSession->GetIp(), nItemList, false);
}
}
#endif // #if defined(PRE_ADD_VIP)
}
int CDNUserBase::_OnCashBalanceInquiry()
{
if (!g_pCashConnection->GetActive()) return ERROR_GENERIC_INVALIDREQUEST;
g_pCashConnection->SendBalanceInquiry(m_pSession, false, false);
return ERROR_NONE;
}
int CDNUserBase::_OnCashShopOpen()
{
if( !IsNoneWindowState() )
return ERROR_GENERIC_INVALIDREQUEST;
#ifdef _VILLAGESERVER
if (m_pSession->m_bIsStartGame || m_pSession->m_bIsMove)
return ERROR_GENERIC_INVALIDREQUEST;
#endif //#ifdef _VILLAGESERVER
if (!g_pCashConnection->GetActive())
return ERROR_GENERIC_INVALIDREQUEST;
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD>..
SendPaymentItemList(m_pItem);
SendPaymentPackageItemList(m_pItem);
#endif
g_pCashConnection->SendBalanceInquiry(m_pSession, true, false);
SetWindowState(WINDOW_CASHSHOP);
return ERROR_NONE;
}
int CDNUserBase::_OnCashBuy(CSCashShopBuy *pCashShop)
{
#if defined(PRE_ADD_INSTANT_CASH_BUY)
if (pCashShop->cType >= InstantCashShopTypeMin){
if (pCashShop->cCount != 1) return ERROR_ITEM_FAIL;
#if defined(PRE_ADD_CASH_REFUND)
if (!pCashShop->bMoveCashInven) return ERROR_ITEM_FAIL;
#endif // #if defined(PRE_ADD_CASH_REFUND)
if (!g_pDataManager->IsCashBuyShortcut(pCashShop->cType - InstantCashShopTypeMin, m_pSession->GetMapIndex(), pCashShop->BuyList[0].nItemSN))
return ERROR_ITEM_FAIL;
}
else{
if (!IsWindowState(WINDOW_CASHSHOP)) return ERROR_GENERIC_INVALIDREQUEST;
if (pCashShop->cCount <= 0 || pCashShop->cCount > PREVIEWCARTLISTMAX){ // <20><>ǰ<EFBFBD><C7B0> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD>
g_Log.Log(LogType::_NORMAL, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"Invalid cash buy count(%d)\r\n", pCashShop->cCount);
return ERROR_ITEM_FAIL;
}
}
#else // #if defined(PRE_ADD_INSTANT_CASH_BUY)
if (!IsWindowState(WINDOW_CASHSHOP)) return ERROR_GENERIC_INVALIDREQUEST;
if (pCashShop->cCount <= 0 || pCashShop->cCount > PREVIEWCARTLISTMAX){ // <20><>ǰ<EFBFBD><C7B0> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD>
g_Log.Log(LogType::_NORMAL, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"Invalid cash buy count(%d)\r\n", pCashShop->cCount);
return ERROR_ITEM_FAIL;
}
#endif // #if defined(PRE_ADD_INSTANT_CASH_BUY)
#if defined(PRE_ADD_SALE_COUPON)
// Sale <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ <20><><EFBFBD>..
if( pCashShop->biSaleCouponSerial > 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD> <20><><EFBFBD><EFBFBD>..
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>.
if( pCashShop->cCount > 1 || !g_pDataManager->IsSaleCouponByItem(pCashShop->BuyList[0].nItemSN) )
return ERROR_ITEM_FAIL;
int nRet = _CheckSaleCoupon(pCashShop->nSaleCouponSN, pCashShop->biSaleCouponSerial, pCashShop->BuyList[0].nItemSN);
if (nRet != ERROR_NONE)
return nRet;
}
#endif // #if defined(PRE_ADD_SALE_COUPON)
std::vector<TEffectItemData> VecEffectItemList, VecCashList;
VecEffectItemList.clear();
VecCashList.clear();
for (int i = 0; i < pCashShop->cCount; i++){
if ((pCashShop->BuyList[i].nItemSN <= 0) ||(pCashShop->BuyList[i].nItemID <= 0)) return ERROR_ITEM_NOTFOUND;
if( !g_pDataManager->CheckCashSNItemID(pCashShop->BuyList[i].nItemSN, pCashShop->BuyList[i].nItemID) )
return ERROR_ITEM_NOTFOUND;
bool bPackage = g_pDataManager->IsCashPackageData(pCashShop->BuyList[i].nItemSN);
if (bPackage) return ERROR_ITEM_NOTFOUND;
#if defined(PRE_ADD_SALE_COUPON)
// Ȥ<>ó<EFBFBD> Sale <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if( g_pDataManager->IsSaleCouponByItem(pCashShop->BuyList[i].nItemSN) && pCashShop->biSaleCouponSerial <= 0)
return ERROR_ITEM_FAIL;
#endif
#if defined(PRE_ADD_VIP)
if (g_pDataManager->IsVIPSell(pCashShop->BuyList[i].nItemSN)){
if (m_nVIPTotalPoint <= 0) return ERROR_VIP_FAIL;
const CVIPGradeTable::SVIPGradeUnit* pUnit = CVIPGradeTable::GetInstance().GetValue(m_nVIPTotalPoint);
if (!pUnit) return ERROR_VIP_FAIL;
if (g_pDataManager->GetCashCommodityVIPLevel(pCashShop->BuyList[i].nItemSN) > pUnit->level) return ERROR_VIP_FAIL; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
#endif // #if defined(PRE_ADD_VIP)
#if defined(_US)
#if defined(PRE_ADD_CASHSHOP_CREDIT)
if (pCashShop->cPaymentRules == Cash::PaymentRules::Credit){
if (!CheckNxACreditUsableLevel(pCashShop->BuyList[i].nItemSN))
return ERROR_CASHSHOP_NXACREDIT;
}
#endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
#endif // _US
TEffectItemData CashInfo = {0,};
CashInfo.nItemSN = pCashShop->BuyList[i].nItemSN;
CashInfo.nItemID = pCashShop->BuyList[i].nItemID;
CashInfo.nCount = g_pDataManager->GetCashCommodityCount(pCashShop->BuyList[i].nItemSN);
VecCashList.push_back(CashInfo);
if (m_pItem->IsEffectCashItem(pCashShop->BuyList[i].nItemID)){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>
VecEffectItemList.push_back(CashInfo);
}
}
int nRet = m_pItem->CheckEffectItemListCountLimit(VecEffectItemList, false, false, false); // <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><EFBFBD><EEB0B3><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> max<61>˻<EFBFBD>
if (nRet != ERROR_NONE)
return nRet;
nRet = m_pItem->CheckCashDuplicationBuy(VecCashList, false);
if (nRet != ERROR_NONE)
return nRet;
TCashBuyItem CashBuyList[PREVIEWCARTLISTMAX];
memset(&CashBuyList, 0, sizeof(CashBuyList));
for (int i = 0; i < pCashShop->cCount; i++){
CashBuyList[i].cCartIndex = pCashShop->BuyList[i].cSlotIndex;
nRet = m_pItem->MakeBuyCashItem(pCashShop->BuyList[i].nItemSN, pCashShop->BuyList[i].nItemID, pCashShop->BuyList[i].nOptionIndex, CashBuyList[i]);
if (nRet != ERROR_NONE) return nRet;
}
int nTotalPrice = 0, nPrice = 0;
for (int i = 0; i < pCashShop->cCount; i++){
if (pCashShop->BuyList[i].nItemSN <= 0) continue;
if (g_pDataManager->GetItemOverlapCount(pCashShop->BuyList[i].nItemID) < g_pDataManager->GetCashCommodityCount(pCashShop->BuyList[i].nItemSN)) break;
nPrice = g_pDataManager->GetCashCommodityPrice(pCashShop->BuyList[i].nItemSN);
if (nPrice <= 0) continue;
nTotalPrice += nPrice;
}
char cPaymentRules = Cash::PaymentRules::None;
cPaymentRules = pCashShop->cPaymentRules;
if (pCashShop->cPaymentRules == Cash::PaymentRules::Petal){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>...
if (!CheckEnoughPetal(nTotalPrice))
return ERROR_CASHSHOP_RESERVE_NOTENOUGH; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>
for (int i = 0; i < pCashShop->cCount; i++){
if (g_pDataManager->IsReserveCommodity(pCashShop->BuyList[i].nItemSN)) continue;
if (pCashShop->BuyList[i].nItemID != 0) continue; // 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>
return ERROR_CASHSHOP_RESERVE_DISABLE;
}
}
#if defined( PRE_ADD_NEW_MONEY_SEED )
else if( pCashShop->cPaymentRules == Cash::PaymentRules::Seed ) // <20>õ屸<C3B5><E5B1B8>
{
if (!CheckEnoughSeed(nTotalPrice))
return ERROR_SEED_INSUFFICIENCY_SEEDPOINT; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>
for (int i = 0; i < pCashShop->cCount; i++){
if (g_pDataManager->IsSeedCommodity(pCashShop->BuyList[i].nItemSN)) continue;
if (pCashShop->BuyList[i].nItemID != 0) continue; // 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>
return ERROR_CASHSHOP_SEED_DISABLE;
}
}
#endif
else{
if (!CheckEnoughCashByPaymentRules(nTotalPrice, cPaymentRules))
return ERROR_CASHSHOP_CASH_NOTENOUGH;
}
if (!g_pCashConnection->GetActive()) return ERROR_GENERIC_INVALIDREQUEST;
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
m_pItem->SetCashMoveInven(pCashShop->bMoveCashInven);
#endif
g_pCashConnection->SendBuy(m_pSession, pCashShop, CashBuyList);
return ERROR_NONE;
}
int CDNUserBase::_OnCashPackageBuy(CSCashShopPackageBuy *pCashShop)
{
if( !IsWindowState(WINDOW_CASHSHOP) )
return ERROR_GENERIC_INVALIDREQUEST;
if (pCashShop->cCount <= 0 || pCashShop->cCount > PACKAGEITEMMAX){ // <20><>ǰ<EFBFBD><C7B0> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD>
g_Log.Log(LogType::_NORMAL, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"Invalid cash package buy count(%d)\r\n", pCashShop->cCount);
return ERROR_ITEM_FAIL;
}
std::vector<TEffectItemData> VecEffectItemList, VecCashList;
VecEffectItemList.clear();
VecCashList.clear();
TCashPackageData PackageData;
bool bPackage = g_pDataManager->GetCashPackageData(pCashShop->nPackageSN, PackageData);
if (!bPackage)
return ERROR_ITEM_NOTFOUND;
#if defined(PRE_ADD_SALE_COUPON)
// Sale <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ <20><><EFBFBD>..
if( pCashShop->biSaleCouponSerial > 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( !g_pDataManager->IsSaleCouponByItem(pCashShop->nPackageSN))
return ERROR_ITEM_FAIL;
int nRet = _CheckSaleCoupon(pCashShop->nSaleCouponSN, pCashShop->biSaleCouponSerial, pCashShop->nPackageSN);
if (nRet != ERROR_NONE)
return nRet;
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD> üũ...
if( g_pDataManager->IsSaleCouponByItem(pCashShop->nPackageSN) )
return ERROR_ITEM_FAIL;
}
#endif // #if defined(PRE_ADD_SALE_COUPON)
for (int i = 0; i < pCashShop->cCount; i++){
if ((pCashShop->BuyList[i].nItemSN <= 0) ||(pCashShop->BuyList[i].nItemID <= 0))
return ERROR_ITEM_NOTFOUND;
if( (int)(PackageData.nVecCommoditySN.size()) <= i || PackageData.nVecCommoditySN[i] != pCashShop->BuyList[i].nItemSN )
return ERROR_ITEM_NOTFOUND;
if( !g_pDataManager->CheckCashSNItemID(pCashShop->BuyList[i].nItemSN, pCashShop->BuyList[i].nItemID ) )
return ERROR_ITEM_NOTFOUND;
#if defined(PRE_ADD_VIP)
if (g_pDataManager->IsVIPSell(pCashShop->nPackageSN)){
if (m_nVIPTotalPoint <= 0)
return ERROR_VIP_FAIL;
const CVIPGradeTable::SVIPGradeUnit* pUnit = CVIPGradeTable::GetInstance().GetValue(m_nVIPTotalPoint);
if (!pUnit)
return ERROR_VIP_FAIL;
if (g_pDataManager->GetCashCommodityVIPLevel(pCashShop->nPackageSN) > pUnit->level)
return ERROR_VIP_FAIL; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
#endif // #if defined(PRE_ADD_VIP)
#if defined(_US)
#if defined(PRE_ADD_CASHSHOP_CREDIT)
if (pCashShop->cPaymentRules == Cash::PaymentRules::Credit){
if (!CheckNxACreditUsableLevel(pCashShop->nPackageSN))
return ERROR_CASHSHOP_NXACREDIT;
}
#endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
#endif // _US
TEffectItemData CashInfo = {0,};
CashInfo.nItemSN = pCashShop->BuyList[i].nItemSN;
CashInfo.nItemID = pCashShop->BuyList[i].nItemID;
CashInfo.nCount = g_pDataManager->GetCashCommodityCount(pCashShop->BuyList[i].nItemSN);
VecCashList.push_back(CashInfo);
if (m_pItem->IsEffectCashItem(pCashShop->BuyList[i].nItemID)){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>
VecEffectItemList.push_back(CashInfo);
}
}
int nRet = m_pItem->CheckEffectItemListCountLimit(VecEffectItemList, false, true, false); // ij<><C4B3><EFBFBD><EFBFBD> <20><EFBFBD><EEB0B3><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> max<61>˻<EFBFBD>
if (nRet != ERROR_NONE) return nRet;
nRet = m_pItem->CheckCashDuplicationBuy(VecCashList, false);
if (nRet != ERROR_NONE) return nRet;
TCashItemBase PackageList[PACKAGEITEMMAX];
for (int i = 0; i < pCashShop->cCount; i++){
nRet = m_pItem->MakeBuyCashItem(pCashShop->BuyList[i].nItemSN, pCashShop->BuyList[i].nItemID, pCashShop->BuyList[i].nOptionIndex, PackageList[i]);
if (nRet != ERROR_NONE) return nRet;
}
if (pCashShop->nPackageSN <= 0)
return ERROR_ITEM_FAIL;
int nTotalPrice = g_pDataManager->GetCashCommodityPrice(pCashShop->nPackageSN);
char cPaymentRules = Cash::PaymentRules::None;
cPaymentRules = pCashShop->cPaymentRules;
if (pCashShop->cPaymentRules == Cash::PaymentRules::Petal){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>...
for (int i = 0; i < pCashShop->cCount; i++){
if (g_pDataManager->IsReserveCommodity(pCashShop->BuyList[i].nItemSN)) continue;
if (pCashShop->BuyList[i].nItemID != 0) continue; // 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>
return ERROR_CASHSHOP_RESERVE_DISABLE;
}
if (!CheckEnoughPetal(nTotalPrice))
return ERROR_CASHSHOP_RESERVE_NOTENOUGH; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>
}
#if defined( PRE_ADD_NEW_MONEY_SEED )
else if( pCashShop->cPaymentRules == Cash::PaymentRules::Seed ) // <20>õ屸<C3B5><E5B1B8>
{
for (int i = 0; i < pCashShop->cCount; i++){
if (g_pDataManager->IsSeedCommodity(pCashShop->BuyList[i].nItemSN)) continue;
if (pCashShop->BuyList[i].nItemID != 0) continue; // 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>
return ERROR_CASHSHOP_SEED_DISABLE;
}
if (!CheckEnoughSeed(nTotalPrice))
return ERROR_SEED_INSUFFICIENCY_SEEDPOINT; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>
}
#endif
else{
if (!CheckEnoughCashByPaymentRules(nTotalPrice, cPaymentRules))
return ERROR_CASHSHOP_CASH_NOTENOUGH;
}
if (!g_pCashConnection->GetActive())
return ERROR_GENERIC_INVALIDREQUEST;
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
m_pItem->SetCashMoveInven(pCashShop->bMoveCashInven);
#endif
g_pCashConnection->SendPackageBuy(m_pSession, pCashShop, PackageList);
return ERROR_NONE;
}
int CDNUserBase::_OnCashCheckReceiver(CSCashShopCheckReceiver *pCashShop)
{
if( !IsWindowState(WINDOW_CASHSHOP) )
return ERROR_GENERIC_INVALIDREQUEST;
if (CheckLastSpace(pCashShop->wszToCharacterName))
return ERROR_GENERIC_INVALIDREQUEST;
if (__wcsicmp_l(pCashShop->wszToCharacterName, GetCharacterName()) == 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>
return ERROR_CASHSHOP_DONTSENDYOURSELF;
m_pDBCon->QueryCheckGiftReceiver(m_pSession, pCashShop->wszToCharacterName);
return ERROR_NONE;
}
#if defined(PRE_ADD_CADGE_CASH)
int CDNUserBase::_OnCashCadge(CSCashShopCadge *pCashShop)
{
if (!IsWindowState(WINDOW_CASHSHOP))
return ERROR_GENERIC_INVALIDREQUEST;
if (pCashShop->cCount <= 0 || pCashShop->cCount > PREVIEWCARTLISTMAX){
g_Log.Log(LogType::_NORMAL, m_pSession, L"Invalid cash cadge count(%d)\r\n", pCashShop->cCount);
return ERROR_ITEM_FAIL;
}
if (pCashShop->nPackageSN > 0){
if (!g_pDataManager->IsPresentCommodity(pCashShop->nPackageSN)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ERROR_GIFT_NOTFORSALE;
}
else{
for (int i = 0; i < pCashShop->cCount; i++){
if (!g_pDataManager->IsPresentCommodity(pCashShop->PackageGiftList[i].nItemSN)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ERROR_GIFT_NOTFORSALE;
}
}
m_pDBCon->QuerySendWishMail(m_pSession, pCashShop);
return ERROR_NONE;
}
#endif // #if defined(PRE_ADD_CADGE_CASH)
int CDNUserBase::_OnCashGift(CSCashShopGift *pCashShop)
{
if (!g_pCashConnection->GetActive())
return ERROR_GENERIC_INVALIDREQUEST;
if( !IsWindowState(WINDOW_CASHSHOP) )
return ERROR_GENERIC_INVALIDREQUEST;
#if defined(_US)
#if defined(PRE_ADD_CASHSHOP_CREDIT)
if (pCashShop->cPaymentRules == Cash::PaymentRules::Credit)
return ERROR_CASHSHOP_NXACREDITGIFT;
#endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
#endif // _US
if (pCashShop->cCount <= 0 || pCashShop->cCount > PREVIEWCARTLISTMAX){
g_Log.Log(LogType::_NORMAL, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"Invalid cash gift count(%d)\r\n", pCashShop->cCount);
return ERROR_ITEM_FAIL;
}
int nRet = 0;
TCashGiftItem CashGiftList[PREVIEWCARTLISTMAX] = {0, };
for (int i = 0; i < pCashShop->cCount; i++){
if (!g_pDataManager->IsPresentCommodity(pCashShop->GiftList[i].nItemSN)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ERROR_GIFT_NOTFORSALE;
if( !g_pDataManager->CheckCashSNItemID(pCashShop->GiftList[i].nItemSN, pCashShop->GiftList[i].nItemID) )
return ERROR_ITEM_NOTFOUND;
#if defined(PRE_ADD_SALE_COUPON)
// Ȥ<>ó<EFBFBD> Sale <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰڴٰ<DAB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if( g_pDataManager->IsSaleCouponByItem(pCashShop->GiftList[i].nItemSN))
return ERROR_ITEM_FAIL;
#endif//#if defined(PRE_ADD_SALE_COUPON)
CashGiftList[i].cCartIndex = pCashShop->GiftList[i].cSlotIndex;
CashGiftList[i].nItemSN = pCashShop->GiftList[i].nItemSN;
CashGiftList[i].nItemID = pCashShop->GiftList[i].nItemID;
CashGiftList[i].cItemOption = pCashShop->GiftList[i].nOptionIndex;
}
int nTotalPrice = 0, nPrice = 0;
for (int i = 0; i < pCashShop->cCount; i++){
if (pCashShop->GiftList[i].nItemSN <= 0) continue;
nPrice = g_pDataManager->GetCashCommodityPrice(pCashShop->GiftList[i].nItemSN);
if (nPrice <= 0) continue;
nTotalPrice += nPrice;
}
if (!CheckEnoughCashBalance(nTotalPrice)) // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>
return ERROR_CASHSHOP_CASH_NOTENOUGH;
g_pCashConnection->SendGift(m_pSession, pCashShop, CashGiftList);
return ERROR_NONE;
}
int CDNUserBase::_OnCashPackageGift(CSCashShopPackageGift *pCashShop)
{
if (!IsWindowState(WINDOW_CASHSHOP))
return ERROR_GENERIC_INVALIDREQUEST;
#if defined(_US)
#if defined(PRE_ADD_CASHSHOP_CREDIT)
if (pCashShop->cPaymentRules == Cash::PaymentRules::Credit)
return ERROR_CASHSHOP_NXACREDITGIFT;
#endif // #if defined(PRE_ADD_CASHSHOP_CREDIT)
#endif // _US
if (!g_pCashConnection->GetActive())
return ERROR_GENERIC_INVALIDREQUEST;
if (pCashShop->cCount <= 0 || pCashShop->cCount > PACKAGEITEMMAX){ // <20><>ǰ<EFBFBD><C7B0> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD>
g_Log.Log(LogType::_NORMAL, m_nWorldSetID, m_nAccountDBID, m_biCharacterDBID, m_nSessionID, L"Invalid cash package gift count(%d)\r\n", pCashShop->cCount);
return ERROR_ITEM_FAIL;
}
if (!g_pDataManager->IsPresentCommodity(pCashShop->nPackageSN)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ERROR_GIFT_NOTFORSALE;
TCashPackageData PackageData;
bool bPackage = g_pDataManager->GetCashPackageData(pCashShop->nPackageSN, PackageData);
if (!bPackage)
return ERROR_ITEM_NOTFOUND;
#if defined(PRE_ADD_SALE_COUPON)
// Ȥ<>ó<EFBFBD> Sale <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰڴٰ<DAB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if( g_pDataManager->IsSaleCouponByItem(pCashShop->nPackageSN))
return ERROR_ITEM_FAIL;
#endif//#if defined(PRE_ADD_SALE_COUPON)
int nRet = 0;
TCashPackageGiftItem PackageList[PACKAGEITEMMAX];
for (int i = 0; i < pCashShop->cCount; i++){
if( (int)(PackageData.nVecCommoditySN.size()) <= i || PackageData.nVecCommoditySN[i] != pCashShop->PackageGiftList[i].nItemSN )
return ERROR_ITEM_NOTFOUND;
if( !g_pDataManager->CheckCashSNItemID(pCashShop->PackageGiftList[i].nItemSN, pCashShop->PackageGiftList[i].nItemID ))
return ERROR_ITEM_NOTFOUND;
PackageList[i].nItemSN = pCashShop->PackageGiftList[i].nItemSN;
PackageList[i].nItemID = pCashShop->PackageGiftList[i].nItemID;
PackageList[i].cItemOption = pCashShop->PackageGiftList[i].nOptionIndex;
}
if (pCashShop->nPackageSN <= 0)
return ERROR_ITEM_FAIL;
int nTotalPrice = g_pDataManager->GetCashCommodityPrice(pCashShop->nPackageSN);
if (!CheckEnoughCashBalance(nTotalPrice)) // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>
return ERROR_CASHSHOP_CASH_NOTENOUGH;
g_pCashConnection->SendPackageGift(m_pSession, pCashShop, PackageList);
return ERROR_NONE;
}
int CDNUserBase::_OnCashCoupon(CSCashShopCoupon *pCashShop)
{
if (!g_pCashConnection->GetActive())
return ERROR_GENERIC_INVALIDREQUEST;
if (!IsWindowState(WINDOW_CASHSHOP))
return ERROR_GENERIC_INVALIDREQUEST;
g_pCashConnection->SendCoupon(m_pSession, pCashShop->wszCoupon);
return ERROR_NONE;
}
#if defined(PRE_ADD_VIP)
int CDNUserBase::_OnCashVIPBuy(CSVIPBuy *pCashShop)
{
if (!g_pCashConnection->GetActive())
return ERROR_GENERIC_INVALIDREQUEST;
if (!IsWindowState(WINDOW_CASHSHOP))
return ERROR_GENERIC_INVALIDREQUEST;
g_pCashConnection->SendVIPBuy(m_pSession, pCashShop->nItemSN, false);
return ERROR_NONE;
}
int CDNUserBase::_OnCashVIPGift(CSVIPGift *pCashShop)
{
if (!g_pCashConnection->GetActive())
return ERROR_GENERIC_INVALIDREQUEST;
if (!IsWindowState(WINDOW_CASHSHOP))
return ERROR_GENERIC_INVALIDREQUEST;
g_pCashConnection->SendVIPGift(m_pSession, pCashShop);
return ERROR_NONE;
}
#endif // #if defined(PRE_ADD_VIP)
#if defined(_VILLAGESERVER) && defined(PRE_ADD_CASH_REFUND)
int CDNUserBase::_OnMoveCashInven(CSMoveCashInven* pCashShop)
{
if (!g_pCashConnection->GetActive())
return ERROR_GENERIC_INVALIDREQUEST;
if (!IsWindowState(WINDOW_CASHSHOP))
return ERROR_GENERIC_INVALIDREQUEST;
if ( pCashShop->cItemType == 1) // <20>Ϲ<EFBFBD><CFB9><EFBFBD>
{
TPaymentItemInfoEx* pPaymentItem = m_pItem->GetPaymentItem(pCashShop->biDBID);
if ( pPaymentItem == NULL )
return ERROR_GENERIC_INVALIDREQUEST;
TCashItemBase CashItem;
memset(&CashItem, 0, sizeof(TItem));
int nRet = m_pItem->MakeBuyCashItem(pPaymentItem->PaymentItemInfo.ItemInfo.nItemSN, pPaymentItem->PaymentItemInfo.ItemInfo.nItemID, pPaymentItem->PaymentItemInfo.ItemInfo.cItemOption, CashItem);
if (nRet != ERROR_NONE)
return nRet;
g_pCashConnection->SendMoveCashInven(m_nAccountDBID, m_biCharacterDBID, GetWorldSetID(), GetMapIndex(), m_nChannelID, &CashItem, pPaymentItem);
}
else if( pCashShop->cItemType == 2) // <20><>Ű<EFBFBD><C5B0>
{
TPaymentPackageItemInfoEx* pPaymentPackageItem = m_pItem->GetPaymentPackageItem(pCashShop->biDBID);
if( pPaymentPackageItem == NULL )
return ERROR_GENERIC_INVALIDREQUEST;
TCashItemBase PackageList[PACKAGEITEMMAX];
for (int i = 0; i < PACKAGEITEMMAX; i++)
{
if( pPaymentPackageItem->PaymentPackageItemInfo.ItemInfoList[i].nItemID == 0)
break;
int nRet = m_pItem->MakeBuyCashItem(pPaymentPackageItem->PaymentPackageItemInfo.ItemInfoList[i].nItemSN, pPaymentPackageItem->PaymentPackageItemInfo.ItemInfoList[i].nItemID,
pPaymentPackageItem->PaymentPackageItemInfo.ItemInfoList[i].cItemOption, PackageList[i]);
if (nRet != ERROR_NONE)
return nRet;
}
g_pCashConnection->SendPackageMoveCashInven(m_nAccountDBID, m_biCharacterDBID, GetWorldSetID(), GetMapIndex(), m_nChannelID, PackageList, pPaymentPackageItem);
}
return ERROR_NONE;
}
int CDNUserBase::_OnCashRefund(CSCashRefund* pCashShop)
{
if (!g_pCashConnection->GetActive())
return ERROR_GENERIC_INVALIDREQUEST;
if( !IsWindowState(WINDOW_CASHSHOP) )
return ERROR_GENERIC_INVALIDREQUEST;
if( pCashShop->cItemType == 1) // <20>Ϲ<EFBFBD><CFB9><EFBFBD>
{
TPaymentItemInfoEx* pPaymentItem = m_pItem->GetPaymentItem(pCashShop->biDBID);
if( pPaymentItem == NULL )
return ERROR_GENERIC_INVALIDREQUEST;
// <20>Ⱓüũ<C3BC><C5A9> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
g_pCashConnection->SendCashRefund(m_nAccountDBID, pCashShop->cItemType, GetWorldSetID(), pPaymentItem->PaymentItemInfo.ItemInfo.nItemSN,
pPaymentItem->uiOrderNo, pPaymentItem->PaymentItemInfo.biDBID);
}
else if( pCashShop->cItemType == 2) // <20><>Ű<EFBFBD><C5B0>
{
TPaymentPackageItemInfoEx* pPaymentPackageItem = m_pItem->GetPaymentPackageItem(pCashShop->biDBID);
if( pPaymentPackageItem == NULL )
return ERROR_GENERIC_INVALIDREQUEST;
// <20>Ⱓüũ<C3BC><C5A9> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
g_pCashConnection->SendCashRefund(m_nAccountDBID, pCashShop->cItemType, GetWorldSetID(), pPaymentPackageItem->PaymentPackageItemInfo.nPackageSN,
pPaymentPackageItem->uiOrderNo, pPaymentPackageItem->PaymentPackageItemInfo.biDBID);
}
return ERROR_NONE;
}
#endif // #if defined(PRE_ADD_CASH_REFUND)
// <20>߰<EFBFBD>
void CDNUserBase::AddWindowState( eWindowState AddState )
{
m_sUserWindowState = m_sUserWindowState | AddState;
}
void CDNUserBase::SetWindowState( eWindowState SetState )
{
m_sUserWindowState = SetState;
}
// <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD>.
bool CDNUserBase::IsWindowState( eWindowState InclusionState) const
{
if( m_sUserWindowState & InclusionState )
return true;
return false;
}
// None<6E><65> <20><><EFBFBD><EFBFBD><ECBFA1> State<74>߰<EFBFBD>
bool CDNUserBase::IsNoneWindowStateAdd( eWindowState AddState )
{
if( m_sUserWindowState == WINDOW_NONE )
{
m_sUserWindowState = m_sUserWindowState | AddState;
return true;
}
return false;
}
bool CDNUserBase::IsNoneWindowStateSet( eWindowState SetState )
{
if( m_sUserWindowState == WINDOW_NONE )
{
m_sUserWindowState = SetState;
return true;
}
return false;
}
// <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> None <20><><EFBFBD><EFBFBD>
void CDNUserBase::IsWindowStateNoneSet( eWindowState InclusionState)
{
if( m_sUserWindowState & InclusionState )
m_sUserWindowState = WINDOW_NONE;
}
void CDNUserBase::SetNoneWindowState()
{
m_sUserWindowState = WINDOW_NONE;
}
bool CDNUserBase::IsNoneWindowState() const
{
return m_sUserWindowState == WINDOW_NONE;
}
int CDNUserBase::OnRecvWarpVillageList(const CSWarpVillageList* pPacket)
{
if (!m_pItem)
{
SendWarpVillageResult(ERROR_ITEM_FAIL);
return ERROR_NONE;
}
if (!m_pSession->IsNoneWindowState())
return ERROR_ITEM_FAIL;
int nResult = m_pItem->CheckWarpVillage(pPacket->nItemSerial);
if (nResult != ERROR_NONE)
{
SendWarpVillageResult(nResult);
return ERROR_NONE;
}
vector<WarpVillage::WarpVillageInfo> vList;
vector<int> vVillageMaps = g_pDataManager->GetVillageMaps();
for each (int nMapID in vVillageMaps)
{
int nLevel = g_pDataManager->GetMapPermitLevel(nMapID);
if (nLevel < 0)
{
const TChannelInfo* pChannelInfo = g_pDataManager->GetChannelInfo(m_pSession->GetWorldSetID(), nMapID);
if (!pChannelInfo)
continue;
#if defined(PRE_ADD_DWC)
if (pChannelInfo->nAttribute & (GlobalEnum::CHANNEL_ATT_PVP | GlobalEnum::CHANNEL_ATT_FARMTOWN | GlobalEnum::CHANNEL_ATT_DWC))
#else
if (pChannelInfo->nAttribute & (GlobalEnum::CHANNEL_ATT_PVP | GlobalEnum::CHANNEL_ATT_FARMTOWN))
#endif
nLevel = pChannelInfo->nLimitLevel;
else
continue;
}
vList.push_back(WarpVillage::WarpVillageInfo(nMapID, static_cast<BYTE>(nLevel)));
}
SetWindowState(WINDOW_BLIND);
m_pSession->SendWarpVillageList(vList);
return ERROR_NONE;
}
int CDNUserBase::OnRecvWarpVillage(const CSWarpVillage* pPacket)
{
if (!m_pItem)
{
SendWarpVillageResult(ERROR_ITEM_FAIL);
return ERROR_NONE;
}
int nResult = m_pItem->TryWarpVillage(pPacket->nMapIndex, pPacket->nItemSerial);
if (nResult != ERROR_NONE)
SendWarpVillageResult(nResult);
return ERROR_NONE;
}
bool CDNUserBase::DeleteWarpVillageItemByUse(INT64 nItemSerial)
{
if (nItemSerial > 0)
{
const TItem* pItem = m_pItem->GetCashInventory(nItemSerial);
if (!pItem)
return false;
const TItemData* pItemData = g_pDataManager->GetItemData(pItem->nItemID);
if (!pItemData)
return false;
switch (pItemData->nType)
{
case ITEMTYPE_FREE_PASS:
if (!m_pItem->DeleteItemByUse(ITEMPOSITION_CASHINVEN, -1, nItemSerial))
return false;
break;
case ITEMTYPE_UNLIMITED_FREE_PASS:
break;
default:
return false;
}
}
return true;
}
bool CDNUserBase::AddDataBaseMessageSequence(char cMainCmd, char cSubCmd)
{
if (CheckDataBaseMessageSequence(cMainCmd, cSubCmd))
return false;
TDatabaseMessageSequence seq;
memset(&seq, 0, sizeof(TDatabaseMessageSequence));
seq.cMainCmd = cMainCmd;
seq.cSubCmd = cSubCmd;
seq.dwAddTime = timeGetTime();
m_vDBMessageSequencer.push_back(seq);
return true;
}
void CDNUserBase::DelDataBaseMessageSequence(char cMainCmd, char cSubCmd)
{
if (m_vDBMessageSequencer.empty()) return;
std::vector <TDatabaseMessageSequence>::iterator ii;
for (ii = m_vDBMessageSequencer.begin(); ii != m_vDBMessageSequencer.end(); ii++)
{
if ((*ii).cMainCmd == cMainCmd && (*ii).cSubCmd == cSubCmd)
{
m_vDBMessageSequencer.erase(ii);
return;
}
}
}
bool CDNUserBase::CheckDataBaseMessageSequence(char cMainCmd, char cSubCmd)
{
std::vector <TDatabaseMessageSequence>::iterator ii;
for (ii = m_vDBMessageSequencer.begin(); ii != m_vDBMessageSequencer.end(); ii++)
{
if ((*ii).cMainCmd == cMainCmd && (*ii).cSubCmd == cSubCmd)
{
if ((*ii).dwAddTime + (1000*60) <= timeGetTime())
{
m_vDBMessageSequencer.erase(ii);
return false;
}
return true;
}
}
return false;
}
#if defined (PRE_ADD_DONATION)
int CDNUserBase::OnRecvDonation(int nSubCmd, char* pData, int nLen)
{
if (!CheckDBConnection())
return ERROR_GENERIC_DBCON_NOT_FOUND;
switch (nSubCmd)
{
case eDonation::CS_DONATE:
{
if (sizeof(CSDonate) != nLen)
return ERROR_INVALIDPACKET;
CSDonate* pPacket = reinterpret_cast<CSDonate*>(pData);
CTimeSet CurTime;
if (CurTime.GetDay() == 1 && CurTime.GetHour() == 0)
{
SendDonationResult(ERROR_NOT_AVAILABLE_DONATION_TIME);
return ERROR_NONE;
}
if (0 < pPacket->nCoin % 10000)
return ERROR_GENERIC_INVALIDREQUEST;
if (!CheckEnoughCoin(pPacket->nCoin))
return ERROR_MAIL_INSUFFICIENCY_MONEY;
DelCoin(pPacket->nCoin, DBDNWorldDef::CoinChangeCode::Donation, 0, true);
m_pDBCon->QueryDonate(m_pSession, CurTime.GetTimeT64_LC(), pPacket->nCoin);
}
break;
case eDonation::CS_DONATION_RANKING:
{
if (sizeof(CSDonationRanking) != nLen)
return ERROR_INVALIDPACKET;
m_pDBCon->QueryDonationRanking(m_pSession);
}
break;
}
return ERROR_UNKNOWN_HEADER;
}
#endif // #if defined (PRE_ADD_DONATION)
void CDNUserBase::SendLevelupEventMail(int nLevel, int nClass, int nJob)
{
// <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ִٸ<D6B4> <20><><EFBFBD><EFBFBD>~
std::vector<TLevelupEvent*> VecEventList;
g_pDataManager->GetLevelupEvent(nLevel, nClass, nJob, VecEventList);
if (VecEventList.empty()) return;
for (int j = 0; j <(int)VecEventList.size(); j++){
if ((VecEventList[j]->nEventType == TLevelupEvent::ShandaPromotion) && (!m_bIntroducer)) continue; // <20><>õ<EFBFBD><C3B5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((VecEventList[j]->nEventType == TLevelupEvent::CombackUser)) continue;
if ((VecEventList[j]->nEventType == TLevelupEvent::ComeBackUserInven)) continue;
#if defined(PRE_ADD_GAMEQUIT_REWARD)
if ((VecEventList[j]->nEventType == TLevelupEvent::NewbieQuitReward)) continue;
if ((VecEventList[j]->nEventType == TLevelupEvent::NewbieReconnectReward)) continue;
if ((VecEventList[j]->nEventType == TLevelupEvent::ComeBackUserQuitReward)) continue;
#endif // #if defined(PRE_ADD_GAMEQUIT_REWARD)
if (VecEventList[j]->nEventType == TLevelupEvent::LevelupNew){
INT64 biValue = 0;
GetCommonVariableDataValue(CommonVariable::Type::LevelupEventNew, biValue);
if (biValue > 0) return;
ModCommonVariableData(CommonVariable::Type::LevelupEventNew, 1);
}
if (VecEventList[j]->nMailID > 0){
CDNMailSender::Process(m_pSession, VecEventList[j]->nMailID, DBDNWorldDef::PayMethodCode::LevelupEvent, nLevel);
}
if (VecEventList[j]->nCashMailID > 0){
#if defined(PRE_LEVELUPREWARD_DIRECT)
bool bSendResult = false;
switch (VecEventList[j]->nEventType)
{
case TLevelupEvent::LevelupNew:
{
bSendResult = m_pItem->CreateCashInvenItemByMailID(VecEventList[j]->nCashMailID);
}
break;
default:
{
bSendResult = CDNMailSender::Process(m_pSession, VecEventList[j]->nCashMailID, DBDNWorldDef::PayMethodCode::LevelupEvent, nLevel);
}
break;
}
#else // #if defined(PRE_LEVELUPREWARD_DIRECT)
bool bSendResult = CDNMailSender::Process(m_pSession, VecEventList[j]->nCashMailID, DBDNWorldDef::PayMethodCode::LevelupEvent, nLevel);
#endif // #if defined(PRE_LEVELUPREWARD_DIRECT)
#if defined(PRE_ADD_LEVELUP_CASHGIFT_NOTIFY)
SendServerMsg( CHATTYPE_SYSTEM, CEtUIXML::idCategory1, SERVERMSG_INDEX626, 3, 3); // Caption3, 3<><33>
#endif // #if defined(PRE_ADD_LEVELUP_CASHGIFT_NOTIFY)
#if defined( PRE_ADD_DWC )
if( AccountLevel_DWC != GetAccountLevel() )
#endif // #if defined( PRE_ADD_DWC )
g_Log.Log(LogType::_NORMAL, m_pSession, L"Send LevelupEvent CashMail(ADBID:%d, CashMainID:%d, Level:%d, SendResult:%d)\r\n", GetAccountDBID(), VecEventList[j]->nCashMailID, nLevel, bSendResult);
}
}
}
#if defined( PRE_ADD_BESTFRIEND )
void CDNUserBase::CloseBestFirend()
{
if(m_pBestFriend)
m_pBestFriend->Close();
}
#endif
#if defined( PRE_ADD_LIMITED_SHOP )
void CDNUserBase::ResetLimitedShopDailyCount()
{
DelLimitedShopBuyedItem(LimitedShop::LimitedItemType::Day);
GetDBConnection()->QueryResetLimitedShopItem(m_pSession, LimitedShop::LimitedItemType::Day);
ResetLimitedShopWeeklyCount();
}
void CDNUserBase::ResetLimitedShopWeeklyCount()
{
__time64_t tLastModifyDate = 0;
m_pCommonVariable->GetDataModDate(CommonVariable::Type::LimitedShopWeek, tLastModifyDate);
tm pDate = *localtime(&tLastModifyDate);
int nWeek = CDNSchedule::Saturday - CDNSchedule::Sunday;
int nValue;
nValue = GetDateValue( 1900 + pDate.tm_year, pDate.tm_mon + 1, pDate.tm_mday ) - 4 - nWeek;
int nDBValue = nValue / 7;
if( nValue % 7 == 0 )
{
if( pDate.tm_hour < 0 ) nDBValue--;
}
time_t LocalTime;
tm pLocalTime;
time(&LocalTime);
pLocalTime = *localtime(&LocalTime);
nValue = GetDateValue( 1900 + pLocalTime.tm_year, pLocalTime.tm_mon + 1, pLocalTime.tm_mday ) - 4 - nWeek;
int nCurValue = nValue / 7;
if( nValue % 7 == 0 )
{
if( pLocalTime.tm_hour < 0 ) nCurValue--;
}
if( nDBValue != nCurValue )
{
DelLimitedShopBuyedItem(LimitedShop::LimitedItemType::Week);
ModCommonVariableData(CommonVariable::Type::LimitedShopWeek, 0);
GetDBConnection()->QueryResetLimitedShopItem(m_pSession, LimitedShop::LimitedItemType::Week);
}
}
#if defined( PRE_FIX_74404 )
int CDNUserBase::GetLimitedShopBuyedItem(int nShopID, int nItemID)
{
for(std::list<LimitedShop::LimitedItemData>::iterator itor=m_LimitedShopBuyedItemList.begin();itor!=m_LimitedShopBuyedItemList.end();itor++)
{
if( itor->nShopID == nShopID && itor->nItemID == nItemID )
return itor->nBuyCount;
}
return 0;
}
void CDNUserBase::AddLimitedShopBuyedItem(int nShopID, int nItemID, int nBuyCount, int nResetCycle, bool bDBSend/*=true*/)
{
LimitedShop::LimitedItemData ItemData;
bool bFlag = false;
for(std::list<LimitedShop::LimitedItemData>::iterator itor=m_LimitedShopBuyedItemList.begin();itor!=m_LimitedShopBuyedItemList.end();itor++)
{
if( itor->nShopID == nShopID && itor->nItemID == nItemID )
{
itor->nBuyCount += nBuyCount;
ItemData = *itor;
bFlag = true;
}
}
if( !bFlag )
{
ItemData.nShopID = nShopID;
ItemData.nItemID = nItemID;
ItemData.nBuyCount = nBuyCount;
ItemData.nResetCycle = nResetCycle;
m_LimitedShopBuyedItemList.push_back(ItemData);
}
if(bDBSend)
{
SendLimitedShopItemData(ItemData.nShopID, ItemData.nItemID, ItemData.nBuyCount, ItemData.nResetCycle);
GetDBConnection()->QueryAddLimitedShopItem(m_pSession, ItemData, nBuyCount);
}
}
void CDNUserBase::DelLimitedShopBuyedItem(int nResetCycle)
{
bool bSend = false;
for(std::list<LimitedShop::LimitedItemData>::iterator itor=m_LimitedShopBuyedItemList.begin();itor!=m_LimitedShopBuyedItemList.end();)
{
if(itor->nResetCycle == nResetCycle)
{
itor = m_LimitedShopBuyedItemList.erase(itor);
bSend = true;
}
else
itor++;
}
if(bSend)
{
SendLimitedShopItemData(m_LimitedShopBuyedItemList, true);
}
}
#else // #if defined( PRE_FIX_74404 )
int CDNUserBase::GetLimitedShopBuyedItem(int nItemID)
{
std::map<int, LimitedShop::LimitedItemData>::iterator itor = m_LimitedShopBuyedItem.find(nItemID);
if(itor != m_LimitedShopBuyedItem.end())
return itor->second.nBuyCount;
return 0;
}
void CDNUserBase::AddLimitedShopBuyedItem(int nItemID, int nBuyCount, int nResetCycle, bool bDBSend/*=true*/)
{
LimitedShop::LimitedItemData ItemData;
std::map<int, LimitedShop::LimitedItemData>::iterator itor = m_LimitedShopBuyedItem.find(nItemID);
if(itor != m_LimitedShopBuyedItem.end())
{
itor->second.nBuyCount += nBuyCount;
ItemData = itor->second;
}
else
{
ItemData.nItemID = nItemID;
ItemData.nBuyCount = nBuyCount;
ItemData.nResetCycle = nResetCycle;
m_LimitedShopBuyedItem.insert(std::make_pair(nItemID,ItemData));
}
if(bDBSend)
{
SendLimitedShopItemData(ItemData.nItemID, ItemData.nBuyCount, ItemData.nResetCycle);
GetDBConnection()->QueryAddLimitedShopItem(m_pSession, ItemData, nBuyCount);
}
}
void CDNUserBase::DelLimitedShopBuyedItem(int nResetCycle)
{
bool bSend = false;
for(std::map<int, LimitedShop::LimitedItemData>::iterator itor = m_LimitedShopBuyedItem.begin();itor != m_LimitedShopBuyedItem.end();)
{
if(itor->second.nResetCycle == nResetCycle)
{
itor = m_LimitedShopBuyedItem.erase(itor);
bSend = true;
}
else
itor++;
}
if(bSend)
{
SendLimitedShopItemData(m_LimitedShopBuyedItem, true);
}
}
#endif // #if defined( PRE_FIX_74404 )
#endif // #if defined( PRE_ADD_LIMITED_SHOP )
#if defined( PRE_ADD_NOTIFY_ITEM_COMPOUND )
void CDNUserBase::SetCompoundNotify(const CSCompoundNotify* pPacket)
{
ModCommonVariableData(CommonVariable::Type::NotifyCompound, MAKELONG64(pPacket->nItemID, pPacket->nItemOption));
}
#endif
#if defined( PRE_PRIVATECHAT_CHANNEL )
int CDNUserBase::CheckInvalidChannelName(WCHAR* wszName)
{
if( !wszName )
return ERROR_INVALID_CHANNELNAMELENGTH;
if(GetPrivateChannelID() != 0)
{
SendPrivateChatChannelResult(ERROR_DUPLICATE_CHANNELJOIN);
return ERROR_DUPLICATE_CHANNELJOIN;
}
if( wcslen(wszName) < PrivateChatChannel::Common::MinNameLen || wcslen(wszName) >= PrivateChatChannel::Common::MaxNameLen )
{
SendPrivateChatChannelResult(ERROR_INVALID_CHANNELNAMELENGTH);
return ERROR_INVALID_CHANNELNAMELENGTH;
}
DWORD dwCheckType = ALLOW_STRING_DEFAULT;
#if defined (_US)
dwCheckType = ALLOW_STRING_CHARACTERNAME_ENG;
#endif
if (!g_CountryUnicodeSet.Check(wszName, dwCheckType) || CheckLastSpace(wszName))
{
SendPrivateChatChannelResult(ERROR_INVALID_CHANNELNAME);
return ERROR_INVALID_CHANNELNAME;
}
#if defined(PRE_ADD_MULTILANGUAGE)
if (g_pDataManager->CheckProhibitWord(m_eSelectedLanguage, wszName))
#else
if (g_pDataManager->CheckProhibitWord(wszName))
#endif
{
SendPrivateChatChannelResult(ERROR_INVALID_CHANNELNAME);
return ERROR_INVALID_CHANNELNAME;
}
return ERROR_NONE;
}
void CDNUserBase::SendPrivateChatChannel( CDNPrivateChaChannel* pPrivateChatChannel )
{
if( pPrivateChatChannel )
{
std::list<TPrivateChatChannelMember> MemberList;
MemberList.clear();
pPrivateChatChannel->GetPrivateChannelMember(MemberList);
SendPrivateChatChannelInfo(pPrivateChatChannel->GetChannelInfo(), MemberList);
}
}
#endif
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
bool CDNUserBase::AddTotalLevelSkillData(BYTE cSlotIndex, int nSkillID, bool isInitialize/* = false*/)
{
#if defined(PRE_ADD_DWC)
if(IsDWCCharacter())
return false;
#endif
if( cSlotIndex < 0 || cSlotIndex >= TotalLevelSkill::Common::MAXSLOTCOUNT )
{
return false;
}
if( g_pDataManager->bIsTotalLevelSkillCashSlot(cSlotIndex) )
{
if(!m_bTotalLevelSkillCashSlot[cSlotIndex])
return false;
}
if(nSkillID > 0)
{
int nSkillType = g_pDataManager->GetTotalLevelSkillType(nSkillID);
for(int i=0;i<TotalLevelSkill::Common::MAXSLOTCOUNT;i++)
{
if( i == cSlotIndex )
continue;
if(nSkillID == m_nTotalLevelSKillData[i])
return false;
if( g_pDataManager->bIsTotalLevelSkillCashSlot(i) )
continue;
if(nSkillType == g_pDataManager->GetTotalLevelSkillType(m_nTotalLevelSKillData[i]) && !m_bTotalLevelSkillCashSlot[cSlotIndex])
return false;
}
}
if( nSkillID == 0 || g_pDataManager->bIsTotalLevelSkillLimitLevel( cSlotIndex, nSkillID, m_nTotalLevelSKillLevel, GetLevel() ) )
{
#if defined( _GAMESERVER )
if( m_pSession->GetPlayerActor() )
m_pSession->GetPlayerActor()->RemoveTotalLevelSkill(cSlotIndex);
#endif
m_nTotalLevelSKillData[cSlotIndex] = nSkillID;
GetDBConnection()->QueryAddTotalSkillLevel(m_pSession, cSlotIndex, nSkillID);
return true;
}
return false;
}
void CDNUserBase::ResetTotalLevelSkillMedalCount()
{
INT64 biValue = 0;
__time64_t tLastModifyDate = 0;
m_pCommonVariable->GetDataValue(CommonVariable::Type::TotalLevelSkillMedal, biValue);
m_pCommonVariable->GetDataModDate(CommonVariable::Type::TotalLevelSkillMedal, tLastModifyDate);
ModCommonVariableData(CommonVariable::Type::TotalLevelSkillMedal, 0);
}
int CDNUserBase::GetTotalLevelSkillMedalCount()
{
INT64 biValue = 0;
GetCommonVariableDataValue(CommonVariable::Type::TotalLevelSkillMedal, biValue);
return (int)biValue;
}
void CDNUserBase::AddTotalLevelSkillMedalCount( int nMedalCount )
{
INT64 biValue = 0;
GetCommonVariableDataValue(CommonVariable::Type::TotalLevelSkillMedal, biValue);
biValue += nMedalCount;
ModCommonVariableData(CommonVariable::Type::TotalLevelSkillMedal, biValue);
}
float CDNUserBase::GetTotalLevelSkillEffect( TotalLevelSkill::Common::eVillageEffectType eType )
{
float fValue = 0.0f;
for(int i=0;i<TotalLevelSkill::Common::MAXSLOTCOUNT;i++)
{
if( m_nTotalLevelSKillData[i] > 0 )
{
fValue += g_pDataManager->GetTotalLevelSkillValue( m_nTotalLevelSKillData[i], eType );
}
}
return fValue;
}
int CDNUserBase::GetintTotalLevelSkillEffect( TotalLevelSkill::Common::eVillageEffectType eType )
{
int nValue = 0;
for(int i=0;i<TotalLevelSkill::Common::MAXSLOTCOUNT;i++)
{
if( m_nTotalLevelSKillData[i] > 0 )
{
nValue = g_pDataManager->GetintTotalLevelSkillValue( m_nTotalLevelSKillData[i], eType );
if( nValue > 0 )
break;
}
}
return nValue;
}
#endif
#if defined( PRE_ADD_GAMEQUIT_REWARD )
bool CDNUserBase::SetGameQuitRewardItem(TLevelupEvent::eEventType eType, DBDNWorldDef::AddMaterializedItem::eCode eLogType)
{
std::vector<TLevelupEvent*> VecEventList;
g_pDataManager->GetLevelupEvent(GetLevel(), GetClassID(), GetUserJob(), VecEventList);
if (VecEventList.empty()) return false;
for(int i = 0; i < VecEventList.size(); i++)
{
if(VecEventList[i]->nEventType != eType) continue;
TMailTableData* pMailData = g_pDataManager->GetMailTableData(VecEventList[i]->nCashMailID);
if(!pMailData) return false;
TCashCommodityData CashData;
if(!g_pDataManager->GetCashCommodityData(pMailData->ItemSNArr[0], CashData)) return false;
TItemData* pItem = g_pDataManager->GetItemData(CashData.nItemID[0]);
if(!pItem) return false;
if(m_pItem->CreateCashInvenItem(pItem->nItemID, 1, eLogType) != ERROR_NONE) return false;
return true;
}
return false;
}
#endif // #if defined( PRE_ADD_GAMEQUIT_REWARD )
#if defined(_KRAZ)
void CDNUserBase::_CheckShutdown()
{
CTimeSet CurTime;
switch (m_ShutdownData.cType)
{
case Actoz::ShutdownType::Force:
{
if (CurTime.GetHour() <= 6){
if (m_bShutdownDetach) return;
SendCompleteDetachMsg(ERROR_NEXONAUTH_SHUTDOWNED_3, L"Shutdown(S)");
g_Log.Log(LogType::_ERROR, m_pSession, L"ShutdownType::Force\r\n");
m_bShutdownDetach = true;
}
}
break;
case Actoz::ShutdownType::Selective:
{
if ((CurTime.GetYear() == m_ShutdownData.nYear) && (CurTime.GetMonth() == m_ShutdownData.nMonth) && (CurTime.GetDay() == m_ShutdownData.nDay) && (CurTime.GetHour() == m_ShutdownData.nHour)){
if (m_bShutdownDetach) return;
SendCompleteDetachMsg(ERROR_NEXONAUTH_SHUTDOWNED_4, L"Shutdown(K)");
g_Log.Log(LogType::_ERROR, m_pSession, L"ShutdownType::Selective %d-%d-%d:%d\r\n", m_ShutdownData.nYear, m_ShutdownData.nMonth, m_ShutdownData.nDay, m_ShutdownData.nHour);
m_bShutdownDetach = true;
}
}
break;
}
}
#endif // #if defined(_KRAZ)
int CDNUserBase::_CheckSaleCoupon(int nSaleCouponSN, INT64 biSaleCouponSerial, int nBuyItemSN)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD>..
const TItem* pCouponItem = m_pItem->GetCashInventory(biSaleCouponSerial);
if( !pCouponItem )
return ERROR_ITEM_FAIL;
int nCouponItemID = g_pDataManager->GetCashCommodityItem0(nSaleCouponSN);
if( pCouponItem->nItemID != nCouponItemID )
return ERROR_ITEM_FAIL;
int nCouponID = g_pDataManager->GetItemTypeParam1(nCouponItemID);
if( !g_pDataManager->IsSaleCouponItemBuyItem(nCouponID, nBuyItemSN) )
return ERROR_ITEM_FAIL;
if (m_pItem->IsExpired(*pCouponItem)) // <20><><EFBFBD><EFBFBD> <20>Ⱓ üũ..
return ERROR_ITEM_FAIL;
#if defined(PRE_ADD_SALE_COUPON_LEVEL_LIMIT) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
const TItemData* pItemData = g_pDataManager->GetItemData(pCouponItem->nItemID);
if (!pItemData)
return ERROR_ITEM_FAIL;
if( GetLevel() < pItemData->cLevelLimit )
return ERROR_ITEM_FAIL;
#endif
return ERROR_NONE;
}
#if defined( PRE_ADD_NEW_MONEY_SEED )
void CDNUserBase::SetSeedPoint( INT64 nSeedPoint )
{
if( nSeedPoint <= 0 )
nSeedPoint = 0;
m_nSeedPoint = nSeedPoint;
}
void CDNUserBase::AddSeedPoint( INT64 nSeedPoint )
{
if( nSeedPoint <= 0 )
return;
m_nSeedPoint += nSeedPoint;
}
void CDNUserBase::DelSeedPoint( INT64 nSeedPoint )
{
if( nSeedPoint <= 0 )
return;
m_nSeedPoint -= nSeedPoint;
}
bool CDNUserBase::CheckEnoughSeed(int nSeed)
{
if (GetSeedPoint() < nSeed) return false;
return true;
}
#endif