Files
2022-10-26 12:25:11 +08:00

168 lines
5.7 KiB
C++

#include "StdAfx.h"
#include ".\handler_gameserver.h"
#include <PacketStruct_GP.h>
#include <PacketStruct_DP.h>
#include ".\PortalServer.h"
#include <ArchiveOfStream.h>
#include "PortalRankingManager.h"
Handler_GameServer_IMPL(GP_RANKING_INFO_REQ_SYN)
{
MSG_GP_RANKING_INFO_REQ_SYN * pMsg = (MSG_GP_RANKING_INFO_REQ_SYN *)pRecvMsg;
// 이정보를 받을 시점에 이미 Ranking 정보가 Establish되어 있어야 한다.
// Establish후 Listen
static const int MAX_PAGE = 5;
static MSG_GP_RANKING_INFO_REQ_ACK msg;
for( int type = 0 ; type < eRANKING_MAX ; ++type )
{
for( int MissionNo = 0 ; MissionNo < MAX_MAPCODE_NUM ; ++MissionNo )
{
MissionRanking * pRanking = g_RankingMgr.FindMissionRanking( (eRANKING_TYPE)type, MissionNo );
if( !pRanking ) continue;
for( int page = 0 ; page < MAX_PAGE ; ++page )
{
msg.m_Type = type;
msg.m_MissionNo = MissionNo;
msg.m_Page = page;
msg.m_Size = msg.MAX_BUFFER_SIZE;
ArchiveOfStream lArchive(msg.m_pBUFFER, msg.m_Size);
pRanking->Serialize( msg.m_Page, lArchive, RANKING_SERIALIZE_LOAD );
msg.m_Size = lArchive.GetSize();
pServerSession->SendPacket( &msg, msg.GetSize() );
}
}
}
MSG_GP_RANKING_INFO_REQ_END_NTF ntf;
ntf.m_SettledYear = g_RankingMgr.GetOldSettledDate_Year();
ntf.m_SettledMonth = g_RankingMgr.GetOldSettledDate_Month();
ntf.m_SettledDay = g_RankingMgr.GetOldSettledDate_Day();
ntf.m_PeriodDay = g_RankingMgr.GetPeriod();
ntf.m_SuspendTime = g_RankingMgr.GetSuspendTime();
pServerSession->SendPacket( &ntf, sizeof(ntf) );
//static MSG_GP_RANKING_INFO_REQ_ACK msg;
//msg.m_Size = MSG_GP_RANKING_INFO_REQ_ACK::MAX_BUFFER_SIZE;
//g_RankingMgr.Serialize( msg.m_pBUFFER, msg.m_Size, RANKING_SERIALIZE_LOAD );
//pServerSession->SendPacket( &msg, msg.GetSize() );
}
Handler_GameServer_IMPL(GP_RANKING_MISSION_CLEAR_SYN)
{
MSG_GP_RANKING_MISSION_CLEAR_SYN * pMsg = (MSG_GP_RANKING_MISSION_CLEAR_SYN *)pRecvMsg;
RC::eRANKING_RESULT rt = g_RankingMgr.CanRegisterMissionRecord( pMsg->m_totalInfo );
if( rt == RC::RC_RANKING_SUCCESS )
{
MSG_DP_RANKING_MISSION_CLEAR_SYN msg;
msg.m_dwKey = pMsg->m_dwKey;
msg.m_Key = pMsg->m_Key;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
memcpy( &msg.m_totalInfo, &pMsg->m_totalInfo, pMsg->m_totalInfo.GetSize() );
if( g_PortalServer.SendDBProxy( &msg, msg.GetSize() ) )
{
g_RankingMgr.RegisterMissionRecordInTemp( pMsg->m_totalInfo, pMsg->m_Key );
return;
}
else
{
rt = RC::RC_RANKING_NETWORK_ERROR_FOR_DBPROXY;
}
}
MSG_GP_RANKING_MISSION_FAILED_NAK nmsg;
nmsg.m_dwKey = pMsg->m_dwKey;
nmsg.m_Key = pMsg->m_Key;
nmsg.m_MissionNo = pMsg->m_totalInfo.m_Info.m_MissionNo;
nmsg.m_dwErrorCode = rt;
pServerSession->SendPacket( &nmsg, sizeof(nmsg) );
}
Handler_GameServer_IMPL(GP_RANKING_MISSION_REWARD_SYN)
{
MSG_GP_RANKING_MISSION_REWARD_SYN * pMsg = (MSG_GP_RANKING_MISSION_REWARD_SYN *)pRecvMsg;
// 보상 여부 체크
// DoReward
// DB로 보상 쿼리
RC::eRANKING_RESULT rt = RC::RC_RANKING_NETWORK_ERROR_FOR_DBPROXY;
if( g_PortalServer.IsDBProxyConnected() )
{
rt = g_RankingMgr.DoReward( pMsg->m_MissionNo, pMsg->m_Key, pMsg->m_tszCharName );
if( rt == RC::RC_RANKING_SUCCESS )
{
MSG_DP_RANKING_MISSION_REWARD_SYN msg;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
msg.m_dwKey = pMsg->m_dwKey;
msg.m_Key = pMsg->m_Key; //< 보상받기를 원하는 지난주랭킹의 키(일련번호)
msg.m_MissionNo = pMsg->m_MissionNo;
_tcsncpy(msg.m_tszCharName, pMsg->m_tszCharName, MAX_CHARNAME_LENGTH);
msg.m_tszCharName[MAX_CHARNAME_LENGTH] = '\0';
g_PortalServer.SendDBProxy( &msg, msg.GetSize() );
return;
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
}
}
MSG_GP_RANKING_MISSION_REWARD_NAK nmsg;
nmsg.m_dwKey = pMsg->m_dwKey;
nmsg.m_byErrorCode = rt;
nmsg.m_Key = pMsg->m_Key; //< 보상받기를 원하는 지난주랭킹의 키(일련번호)
nmsg.m_MissionNo = pMsg->m_MissionNo;
_tcsncpy(nmsg.m_tszCharName, pMsg->m_tszCharName, MAX_CHARNAME_LENGTH);
nmsg.m_tszCharName[MAX_CHARNAME_LENGTH] = '\0';
pServerSession->SendPacket( &nmsg, nmsg.GetSize() );
}
Handler_GameServer_IMPL(GP_RANKING_SETTLE_CMD)
{
// 현재시간을 정산시간으로 맞추고
g_RankingMgr.DoTestCurSettle();
// 자동 정산됨
//g_RankingMgr.DoSettle();
// 중지기간을 원상태로 돌려놓는다?
//g_RankingMgr.InitComputation( tmdate->tm_year+1900, tmdate->tm_mon+1, tmdate->tm_mday,
// tmdate->tm_hour, tmdate->tm_min, tmdate->tm_sec, 1, 15 );
}
Handler_GameServer_IMPL(GP_RANKING_REGISTER_MISSION_POINT_SYN)
{
MSG_GP_RANKING_REGISTER_MISSION_POINT_SYN * pMsg = (MSG_GP_RANKING_REGISTER_MISSION_POINT_SYN *)pRecvMsg;
//정산중이면 등록 안함
if( g_RankingMgr.GetStatus() != eRANKING_STATUS_NORMAL )
return;
MSG_DP_RANKING_REGISTER_MISSION_POINT_SYN SynMsg;
SynMsg.m_dwSessionIndex = pServerSession->GetSessionIndex();
SynMsg.TotalInfo.m_Count = 1;
SynMsg.TotalInfo.m_Info = pMsg->RecordInfo;
SynMsg.TotalInfo.m_Member[0] = pMsg->MemberInfo;
SynMsg.SettledStartDate = g_RankingMgr.GetOldSettledDate();
SynMsg.Period = g_RankingMgr.GetPeriod();
SynMsg.DBKey = pMsg->DBKey;
SynMsg.TempKey = g_RankingMgr.RegisterMissionRecordInTemp( SynMsg.TotalInfo );
g_PortalServer.SendDBProxy( &SynMsg, SynMsg.GetSize() );
}
Handler_GameServer_IMPL(GP_MISSION_RANKING_SETTLE_DATE_SYN)
{
MSG_GP_MISSION_RANKING_SETTLE_DATE_SYN * pMsg = (MSG_GP_MISSION_RANKING_SETTLE_DATE_SYN *)pRecvMsg;
MSG_GP_MISSION_RANKING_SETTLE_DATE_ACK Ack;
Ack.RecordInfo = pMsg->RecordInfo;
Ack.MemberInfo = pMsg->MemberInfo;
Ack.SettledStartDate = g_RankingMgr.GetOldSettledDate();
Ack.Period = g_RankingMgr.GetPeriod();
pServerSession->SendPacket( &Ack, sizeof(Ack) );
}