Files
Sun1602/Server/GameServer/PacketHandler/Handler_Client.Shop.cpp
T
2022-10-26 12:25:11 +08:00

446 lines
16 KiB
C++

#include "StdAfx.h"
#include ".\handler_client.h"
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
#include <PacketStruct_CG.h>
#include <PacketStruct_GS.h>
#include <PacketStruct_DG.h>
#include <ArchiveOfStream.h>
#include "./Player.h"
#include "./PlayerManager.h"
#include <World/SSQ/SSQHandlerInGame.h>
#include "./GameShopManager.h"
#include "./GameServerEx.h"
// @history
// |10.02.08|waverix|remove '__NA001390_090915_RIDING_SYSTEM_ETC__',
// make connect status to shared logic|
// 샵 패킷
Handler_Client_IMPL( CG_SHOP_CASH_REQ_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
MSG_CG_SHOP_CASH_REQ_SYN * pMsg = (MSG_CG_SHOP_CASH_REQ_SYN *)pRecvMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() ) return;
// (CHANGES) (091018) (WAVERIX) pre-check whether shop server connected
if(g_pGameServer->IsConnected(SHOP_SERVER) == 0) {
MSG_CG_SHOP_CASH_REQ_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_SHOPSERVERDISCONNECTED;
pPlayer->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
RC::eSHOP_RESULT rt = g_GameShopManager.DoUserCash( pPlayer, pPlayer->GetUserGuid() );
if( rt != RC::RC_SHOP_PENDING && rt != RC::RC_SHOP_SUCCESS )
{
MSG_CG_SHOP_CASH_REQ_NAK msg;
msg.m_byErrorCode = rt;
pPlayer->SendPacket( &msg, sizeof(msg) );
}
}
Handler_Client_IMPL( CG_SHOP_ITEM_LIST_REQ_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
MSG_CG_SHOP_ITEM_LIST_REQ_SYN * pMsg = (MSG_CG_SHOP_ITEM_LIST_REQ_SYN *)pRecvMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() ) return;
// (CHANGES) (091018) (WAVERIX) pre-check whether shop server connected
if(g_pGameServer->IsConnected(SHOP_SERVER) == 0) {
MSG_CG_SHOP_ITEM_LIST_REQ_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_SHOPSERVERDISCONNECTED;
pPlayer->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
RC::eSHOP_RESULT result = RC::RC_SHOP_SUCCESS;
#ifdef _NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
GameShopUser* shopuser = (GameShopUser*)g_GameShopManager.FindShopUser(pPlayer->GetUserGuid());
if (shopuser == NULL)
{
MSG_CG_SHOP_ITEM_LIST_REQ_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_USERISNOTFOUND;
pPlayer->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
static GameShopManager::SearchInfo search_info;
ZeroMemory(&search_info, sizeof(search_info));
search_info.input.partition_index = (eSHOP_PARTITION)pMsg->partition_index;
search_info.input.category_index = (eSHOP_CATEGORY)pMsg->category_index;
search_info.input.page = pMsg->request_page;
search_info.input.filter = pMsg->item_filter;
if (g_GameShopManager.Search(shopuser, search_info))
{
static MSG_CG_SHOP_ITEM_LIST_REQ_ACK message;
uint16_t buffer_size = (uint16_t)(MSG_CG_SHOP_ITEM_LIST_REQ_ACK::MAX_BUFFER_SIZE);
result = g_GameShopManager.Serialize(search_info, message.buffer, buffer_size);
if (result == RC::RC_SHOP_SUCCESS || result == RC::RC_SHOP_PENDING)
{
message.partition_index = pMsg->partition_index;
message.category_index = pMsg->category_index;
message.item_filter = pMsg->item_filter;
message.buffer_size = buffer_size;
message.answer_page = search_info.output.page;
message.page_count = search_info.output.total_page;
message.guid_count = search_info.output.exist_guid_count;
memcpy(message.shopitem_guid, search_info.output.exist_guid, sizeof(uint) * MSG_CG_SHOP_ITEM_LIST_REQ_ACK::MAX_GUID);
pPlayer->SendPacket(&message, message.GetSize());
return;
}
}
MSG_CG_SHOP_ITEM_LIST_REQ_NAK nak_message;
nak_message.m_byErrorCode = RC::RC_SHOP_FAILED;
pPlayer->SendPacket(&nak_message, sizeof(nak_message));
#else
static MSG_CG_SHOP_ITEM_LIST_REQ_ACK msg;
msg.m_TotalPageNum = 0;
msg.m_Size = MSG_CG_SHOP_ITEM_LIST_REQ_ACK::MAX_BUFFER_SIZE;
result = g_GameShopManager.Serialize( pPlayer, pMsg->m_byCategorySeperate, pMsg->m_byCategoryIndex, pMsg->m_byPage, msg.m_pBUFFER, msg.m_Size, eSHOP_SERIALIZE_ITEM_LIST_LOAD );
if( result != RC::RC_SHOP_PENDING && result != RC::RC_SHOP_SUCCESS )
{
MSG_CG_SHOP_ITEM_LIST_REQ_NAK nmsg;
nmsg.m_byErrorCode = result;
pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
return;
}
ShopCategory * pCategory = g_GameShopManager.FindShopCategory( (const eSHOP_CATEGORY_SEPERATE)pMsg->m_byCategorySeperate, (const eSHOP_CATEGORY)pMsg->m_byCategoryIndex );
if( pCategory )
{
msg.m_TotalPageNum = pCategory->GetTotalPageNum();
}
SUNLOG( eDEV_LOG, "[Handler_Client_IMPL( CG_SHOP_ITEM_LIST_REQ_SYN )] Category = %d, TotalPage = %d", pMsg->m_byCategoryIndex, msg.m_TotalPageNum );
pPlayer->SendPacket( &msg, msg.GetSize() );
#endif // _NA_0_20101015_SOLAR_SHOP_TEMP_REFACTORING
}
Handler_Client_IMPL( CG_SHOP_ITEM_REQ_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
MSG_CG_SHOP_ITEM_REQ_SYN * pMsg = (MSG_CG_SHOP_ITEM_REQ_SYN *)pRecvMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer || !pPlayer->GetField() ) return;
// (CHANGES) (091018) (WAVERIX) pre-check whether shop server connected
if(g_pGameServer->IsConnected(SHOP_SERVER) == 0) {
MSG_CG_SHOP_ITEM_REQ_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_SHOPSERVERDISCONNECTED;
pPlayer->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
static MSG_CG_SHOP_ITEM_REQ_ACK msg;
msg.m_Size = MSG_CG_SHOP_ITEM_LIST_REQ_ACK::MAX_BUFFER_SIZE;
RC::eSHOP_RESULT rt = g_GameShopManager.SerializeItemDetail( pPlayer, pMsg->m_ItemGuid, msg.m_pBUFFER, msg.m_Size, eSHOP_SERIALIZE_ITEM_LOAD );
if( rt != RC::RC_SHOP_PENDING && rt != RC::RC_SHOP_SUCCESS )
{
MSG_CG_SHOP_ITEM_REQ_NAK nmsg;
nmsg.m_byErrorCode = rt;
pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
return;
}
pPlayer->SendPacket( &msg, msg.GetSize() );
}
Handler_Client_IMPL( CG_SHOP_ITEM_BUY_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
#if !defined(__NA000851_080122_APPLY_EFFECT_ITEM_ON_INVEN_FOR_CACHE__)
MSG_CG_SHOP_ITEM_BUY_SYN* pMsg = static_cast<MSG_CG_SHOP_ITEM_BUY_SYN*>(pRecvMsg);
Player* player = PlayerManager::Instance()->FindPlayerByUserKey(pMsg->m_dwKey);
if (FlowControl::FCAssert(player != NULL) == false) {
return;
}
if (player->GetField() == NULL) {
return;
}
// (CHANGES) (091018) (WAVERIX) pre-check whether shop server connected
if (g_pGameServer->IsConnected(SHOP_SERVER) == false)
{
MSG_CG_SHOP_ITEM_BUY_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_SHOPSERVERDISCONNECTED;
player->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
BOOLEAN purchase_pp_cash = false;
#ifdef _NA00XXXX_090111_CASH_TYPE_SUBDIVIDE_
; purchase_pp_cash = pMsg->m_PurchaseType == pMsg->PURCHASE_PPCASH;
#endif
RC::eSHOP_RESULT rt = g_GameShopManager.CanBuyNDoRequest(player, \
pMsg->m_Count, pMsg->m_PriceGuid, pMsg->m_SlotIndex, pMsg->m_SlotPos, purchase_pp_cash);
if (rt != RC::RC_SHOP_PENDING && rt != RC::RC_SHOP_SUCCESS)
{
MSG_CG_SHOP_ITEM_BUY_NAK nmsg;
nmsg.m_byErrorCode = rt;
player->SendPacket(&nmsg, sizeof(nmsg));
}
#else //__NA000851_080122_APPLY_EFFECT_ITEM_ON_INVEN_FOR_CACHE__
/*
const DWORD ERRCODE_DEFAULT = 100000;
MSG_CG_SHOP_ITEM_BUY_SYN* pMsg = (MSG_CG_SHOP_ITEM_BUY_SYN *)pRecvMsg;
Player* const player = PlayerManager::Instance()->FindPlayerByUserKey(pMsg->m_dwKey);
FlowControl flow;
FLOWCONTROL_START()
{
// start LOGIC_BLOCK
IfFailThenBreak(player && player->GetField(), ERRCODE_DEFAULT);
const DWORD arrcount = pMsg->m_Count;
IfFailThenBreak(0 < arrcount &&
arrcount <= MSG_CG_SHOP_ITEM_BUY_SYN::_MAX_BUY_LIST_NUM &&
pMsg->GetSize() == wSize,
RC::RC_SHOP_CANNOT_USE_SHOP);
RC::eSHOP_RESULT rt = g_GameShopManager.CanBuyNDoRequest(player, pMsg->m_Count, pMsg->m_PriceGuid, pMsg->m_SlotIndex, pMsg->m_SlotPos);
IfFailThenBreak(RC::RC_SHOP_SUCCESS == rt || RC::RC_SHOP_PENDING == rt, rt);
return;
}
FLOWCONTROL_END;
if (flow.GetErrorCode() != ERRCODE_DEFAULT)
{
MSG_CG_SHOP_ITEM_BUY_NAK nmsg;
nmsg.m_byErrorCode = (BYTE)flow.GetErrorCode();
player->SendPacket(&nmsg, sizeof(nmsg));
}
return;
*/
#endif
}
Handler_Client_IMPL( CG_SHOP_BUY_HISTORY_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
MSG_CG_SHOP_BUY_HISTORY_SYN * pMsg = (MSG_CG_SHOP_BUY_HISTORY_SYN *)pRecvMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() ) return;
DISPMSG( "[CG_SHOP_BUY_HISTORY_SYN]청唐茄君\n" );
}
//
//Handler_Client_IMPL( CG_SHOP_CHECK_CHAR_NAME_SYN )
//{
// MSG_CG_SHOP_CHECK_CHAR_NAME_SYN * pMsg = (MSG_CG_SHOP_CHECK_CHAR_NAME_SYN *)pRecvMsg;
// Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
// ASSERT( pPlayer );
// if( !pPlayer ) return ;
// if( !pPlayer->GetField() ) return;
//
// MSG_DG_OTHER_EXIST_CHARNAME_SYN msg;
// msg.m_Type = eCHARNAME_ACTION_SHOP_SEND_GIFT;
// _tcsncpy(msg.m_tszCharName, pMsg->m_tszCharName, MAX_CHARNAME_LENGTH);
// msg.m_tszCharName[MAX_CHARNAME_LENGTH] = '\0';
// if( !g_pGameServer->SendToServer( GAME_DBPROXY, &msg, sizeof(msg) ) )
// {
// MSG_CG_SHOP_CHECK_CHAR_NAME_NAK nmsg;
// nmsg.m_byErrorCode = RC::RC_SHOP_DB_ERROR;
// pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
// }
//}
#ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__
Handler_Client_IMPL( CG_SHOP_SEND_GIFT_RELAY_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
MSG_CG_SHOP_SEND_GIFT_RELAY_SYN* pMsg = static_cast<MSG_CG_SHOP_SEND_GIFT_RELAY_SYN*>(pRecvMsg);
Player* player = PlayerManager::Instance()->FindPlayerByUserKey(pMsg->m_dwKey);
if (FlowControl::FCAssert(player != NULL) == false) {
return;
}
if (player->GetField() == 0) {
return;
}
// (CHANGES) (091018) (WAVERIX) pre-check whether shop server connected
if(g_pGameServer->IsConnected(SHOP_SERVER) == 0) {
MSG_CG_SHOP_SEND_GIFT_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_SHOPSERVERDISCONNECTED;
player->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
BOOST_STATIC_ASSERT(sizeof(pMsg->gift_message_) == \
sizeof(((MSG_GS_SHOP_SEND_GIFT_SYN*)0)->szGiftMessage) &&
_countof(pMsg->gift_message_) == \
_countof(((MSG_GS_SHOP_SEND_GIFT_SYN*)0)->szGiftMessage));
BOOLEAN puchase_pp_cash = false;
; puchase_pp_cash = pMsg->purchase_type_ == pMsg->PURCHASE_PPCASH;
RC::eSHOP_RESULT rt = g_GameShopManager.OnSendGiftNDoRequest(player,
pMsg->item_type_,
pMsg->price_guid_,
puchase_pp_cash,
pMsg->user_info_,
pMsg->gift_message_);
if(rt != RC::RC_SHOP_PENDING && rt != RC::RC_SHOP_SUCCESS)
{
MSG_CG_SHOP_SEND_GIFT_NAK msgNAK;
msgNAK.m_byErrorCode = rt;
player->SendPacket(&msgNAK, sizeof(msgNAK));
}
}
#else //!__NA000000_SHOP_USERID_50_PASSING_PROC__
Handler_Client_IMPL( CG_SHOP_SEND_GIFT_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
MSG_CG_SHOP_SEND_GIFT_SYN * pMsg = (MSG_CG_SHOP_SEND_GIFT_SYN *)pRecvMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() ) return;
// (CHANGES) (091018) (WAVERIX) pre-check whether shop server connected
if(g_pGameServer->IsConnected(SHOP_SERVER) == 0) {
MSG_CG_SHOP_SEND_GIFT_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_SHOPSERVERDISCONNECTED;
pPlayer->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
RC::eSHOP_RESULT rt = g_GameShopManager.CanSendGiftNDoRequest( pPlayer,
pMsg->m_ItemType, pMsg->m_PriceGuid, pMsg->m_tszCharName, pMsg->m_tszGiftMessage );
if( rt != RC::RC_SHOP_PENDING && rt != RC::RC_SHOP_SUCCESS )
{
MSG_CG_SHOP_SEND_GIFT_NAK nmsg;
nmsg.m_byErrorCode = rt;
pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
}
}
#endif //!__NA000000_SHOP_USERID_50_PASSING_PROC__
Handler_Client_IMPL( CG_SHOP_ACTION_RECV_GIFT_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
MSG_CG_SHOP_ACTION_RECV_GIFT_SYN * pMsg = (MSG_CG_SHOP_ACTION_RECV_GIFT_SYN *)pRecvMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() ) return;
// (CHANGES) (091018) (WAVERIX) pre-check whether shop server connected
if(g_pGameServer->IsConnected(SHOP_SERVER) == 0) {
MSG_CG_SHOP_ACTION_RECV_GIFT_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_SHOPSERVERDISCONNECTED;
pPlayer->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
RC::eSHOP_RESULT rt = g_GameShopManager.CanActionRecvGiftNDoRequest( pPlayer, pMsg->m_ActionType, pMsg->m_GiftGuid, "" );
if( rt != RC::RC_SHOP_PENDING && rt != RC::RC_SHOP_SUCCESS )
{
MSG_CG_SHOP_ACTION_RECV_GIFT_NAK nmsg;
nmsg.m_byErrorCode = rt;
pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
}
}
Handler_Client_IMPL( CG_SHOP_IS_RECV_GIFT_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
MSG_CG_SHOP_IS_RECV_GIFT_SYN* pMsg = (MSG_CG_SHOP_IS_RECV_GIFT_SYN *)pRecvMsg;
Player* pPlayer = PlayerManager::Instance()->FindPlayerByUserKey(pMsg->m_dwKey);
ASSERT(pPlayer);
if(pPlayer == 0)
return;
GameField* pGameField = pPlayer->GetField();
if(pGameField == 0)
return;
//---------------------------------------------------------------------------------------------
// CHANGES: f100908.2L, change a process order
// because a server that is disconnected with a shop can't send a related inforamtion to player
//_NA000023_090323_ENHANCED_INVENTORY_SLOT_FUNCTIONALITY_DB_
;{ // (CHANGES) (f100714.2L) pre-fetch to support a delayed event query process
// 응모한 이벤트 정보를 요청
MSG_DG_EVENT_ITEM_STATUS_SYN msg_status;
msg_status.m_dwKey = pPlayer->GetUserGuid();
msg_status.m_CharGUID = pPlayer->GetCharGuid();
pPlayer->SendToGameDBPServer(&msg_status, sizeof(msg_status));
};
;{
MSG_CG_ITEM_INVENTORY_CONFIG_CHANGE_ACK msg_ack;
msg_ack.changed = pPlayer->inventory_config();
msg_ack.result = RC::RC_ITEM_SUCCESS;
pPlayer->SendPacket(&msg_ack, sizeof(msg_ack));
};
//---------------------------------------------------------------------------------------------
// (CHANGES) (091018) (WAVERIX) pre-check whether shop server connected
if(g_pGameServer->IsConnected(SHOP_SERVER) == 0) {
MSG_CG_SHOP_IS_RECV_GIFT_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_SHOPSERVERDISCONNECTED;
pPlayer->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
RC::eSHOP_RESULT rt = g_GameShopManager.RequestRecvGiftCount(pPlayer);
if(rt != RC::RC_SHOP_PENDING && rt != RC::RC_SHOP_SUCCESS)
{
MSG_CG_SHOP_IS_RECV_GIFT_NAK nmsg;
nmsg.m_byErrorCode = rt;
pPlayer->SendPacket(&nmsg, sizeof(nmsg));
}
}
Handler_Client_IMPL( CG_SHOP_RECV_GIFT_LIST_SYN )
{
__TOUCHED((pServerSession, pRecvMsg, wSize));
MSG_CG_SHOP_RECV_GIFT_LIST_SYN * pMsg = (MSG_CG_SHOP_RECV_GIFT_LIST_SYN *)pRecvMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() ) return;
// (CHANGES) (091018) (WAVERIX) pre-check whether shop server connected
if(g_pGameServer->IsConnected(SHOP_SERVER) == 0) {
MSG_CG_SHOP_RECV_GIFT_LIST_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_SHOP_SHOPSERVERDISCONNECTED;
pPlayer->SendPacket(&msgNAK, sizeof(msgNAK));
return;
}
RC::eSHOP_RESULT rt = g_GameShopManager.RequestRecvGiftList( pPlayer );
if( rt != RC::RC_SHOP_PENDING && rt != RC::RC_SHOP_SUCCESS )
{
MSG_CG_SHOP_RECV_GIFT_LIST_NAK nmsg;
nmsg.m_byErrorCode = rt;
pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
}
}
#endif // !defined _NA_0_20110613_GAME_SHOP_RENEWAL