Files
Sun1602/Server/AgentServer/Zone/SSQ/SSQPacketProcess.hxx
T
2022-10-26 12:25:11 +08:00

240 lines
7.7 KiB
C++

#pragma once
#include <ServerSessions/ServerSessionManager.h>
class SSQUpdateCtrl;
namespace nsSSQ_Util {};
namespace SSQControlInfo
{
struct SSQ_UPDATER_NODE;
};
using namespace nsSSQ;
using namespace nsSSQ_Util;
using namespace SSQControlInfo;
#pragma warning(push)
#pragma warning(disable : 4512)
// (NOTE) below objects have not default constructor, current specification have meaningful only
// base constructor 'xxxSender'
//==================================================================================================
//
template< typename _DERIVED, typename _PACKET_T >
class BROADCASTER_MSG_CG : public nsSSQ_Util::xxxSender< _DERIVED, _PACKET_T >
{
public:
typedef BROADCASTER_MSG_CG<_DERIVED, _PACKET_T> this_type;
inline packet_structure* const GetPacket() { return m_pPacket; }
VOID SendPacket(const USER_HASH_PAIR& rPAIR) const
{
User* const pUser = rPAIR.second;
pUser->SendPacket(m_pPacket, m_pPacket->GetSize());
}
VOID SendPacket(User* const pUser) const
{
pUser->SendPacket(m_pPacket, m_pPacket->GetSize());
}
VOID ProcessSSQUser(DungeonSSQ* const pDungeonSSQ) const
{
pDungeonSSQ->SendToAll(m_pPacket, m_pPacket->GetSize());
}
VOID ProcessAllUser() const
{
UserManager* const user_manager = UserManager::Instance();
user_manager->SendMessageToAllUsers(m_pPacket, m_pPacket->GetSize());
}
};
template< typename _SUBMSG >
class WAR_MSG_SINGLE_ASSEMBLER_SSQ_INFO_BRD : public WAR_MSG_SINGLE_ASSEMBLER< MSG_CG_STATUS_SSQ_INFO_BRD, _SUBMSG >
{
public:
VOID SendPacket(User* const pUser) const
{
pUser->SendPacket(m_pPacket, m_pPacket->GetSize());
}
VOID ProcessAllUser() const
{
UserManager* const user_manager = UserManager::Instance();
user_manager->SendMessageToAllUsers(m_pPacket, m_pPacket->GetSize());
}
};
class BROADCASTER_MSG_CG_STATUS_SSQ_INFO_BRD
: public BROADCASTER_MSG_CG< BROADCASTER_MSG_CG_STATUS_SSQ_INFO_BRD, MSG_CG_STATUS_SSQ_INFO_BRD >
{
};
class BROADCASTER_MSG_CG_ZONE_EX_SSQ_ROOM_CTRL_CMD
: public BROADCASTER_MSG_CG< BROADCASTER_MSG_CG_ZONE_EX_SSQ_ROOM_CTRL_CMD, MSG_CG_ZONE_EX_SSQ_ROOM_CTRL_CMD >
{
};
class BROADCASTER_MSG_CG_ZONE_EX_SSQ_ROOM_INFO_BRD
: public BROADCASTER_MSG_CG< BROADCASTER_MSG_CG_ZONE_EX_SSQ_ROOM_INFO_BRD, MSG_CG_ZONE_EX_SSQ_ROOM_INFO_BRD>
{
};
template< typename _DERIVED, typename _PACKET_T >
class UNICASTER_BETWEEN_SERVER : public nsSSQ_Util::xxxSender< _DERIVED, _PACKET_T >
{
public:
typedef UNICASTER_BETWEEN_SERVER<_DERIVED, _PACKET_T> this_type;
inline packet_structure* const GetPacket() { return m_pPacket; }
BOOL SendPacket(ServerSessionEx* const pServerSession, const KEYTYPE KeyOfSSQ) const
{
m_pPacket->m_dwKey = KeyOfSSQ;
pServerSession->SendPacket(m_pPacket, m_pPacket->GetSize());
//printf("%p\t%u\n"
// , const_cast<packet_structure*>(m_pPacket)
// , m_PacketSize
//);
}
};
class BROADCASTER_MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD
: public UNICASTER_BETWEEN_SERVER< BROADCASTER_MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD, MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD >
{
};
class BROADCASTER_MSG_AW_OPERATION_ROOM_CTRL_CMD
: public UNICASTER_BETWEEN_SERVER< BROADCASTER_MSG_AW_OPERATION_ROOM_CTRL_CMD, MSG_AW_OPERATION_ROOM_CTRL_CMD >
{
};
//template< typename _DRIVED, typename _PACKET >
//class BROADCASTER_IN_AGENTSERVER : public Broadcaster< _DRIVED, _PACKET >
//{
// typedef BROADCASTER_IN_AGENTSERVER<_DRIVED, _PACKET> this_type;
//public:
// inline MSG_BASE* GetPacketMsgHeader() { return m_pPacket; }
// inline WORD GetPacketMsgSize() { return m_PacketSize = m_pPacket->GetSize(); }
//
// SSQ_MSG_SCT_HDR* m_pMsgHeader;
// WAR_TAG_P m_pOffset;
//public:
// inline VOID Reset()
// {
// new (this) this_type();
// m_pOffset = MakeInit_SSQPacketStream(m_pMsgHeader);
// }
//
// inline SSQ_MSG_SCT_HDR*& RefMsgHeader() { return m_pMsgHeader; }
// inline WAR_TAG_P& RefMsgOffset() { return m_pOffset; }
//};
//class BROADCASTER_MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD
// : public BROADCASTER_IN_AGENTSERVER< BROADCASTER_MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD, MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD >
//{
//public:
// VOID SendPacket(ServerSession* const pGameServer, const KEYTYPE KeyOfSSQ) const
// {
////#define _WAVERIX_SSQ_TEST
////#ifndef _WAVERIX_SSQ_TEST
// m_pPacket->m_dwKey = KeyOfSSQ;
// pGameServer->SendPacket(m_pPacket, m_PacketSize);
////#else
// printf("%p\t%u\n"
// , const_cast<packet_structure*>(m_pPacket)
// , m_PacketSize
// );
////#endif
// }
//};
//==================================================================================================
// <SSQControlManager>
//
class SSQMsgRouterInAgent : public WarMsgRouter<SSQMsgRouterInAgent, ISSQHandler>
{
friend struct WarMsgRouter<SSQMsgRouterInAgent, ISSQHandler>;
public:
typedef sun_type_info<SSQMsgRouterInAgent> router_info;
DWORD m_LinkedServerSessionIdx; // Pointer 무결성 보장목적으로 키로 대체 Key
SSQUpdateCtrl* m_pUpdateCtrl;
BROADCASTER_MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD& m_msgCMD_AG;
BROADCASTER_MSG_CG_ZONE_EX_SSQ_ROOM_CTRL_CMD& m_msgCMD_CG;
static BROADCASTER_MSG_CG_STATUS_SSQ_INFO_BRD ms_msgBRD_CG;
static BROADCASTER_MSG_AW_OPERATION_ROOM_CTRL_CMD ms_msgCMD_AW;
SSQMsgRouterInAgent()
: m_LinkedServerSessionIdx(0)
, m_msgCMD_AG(*new BROADCASTER_MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD)
, m_msgCMD_CG(*new BROADCASTER_MSG_CG_ZONE_EX_SSQ_ROOM_CTRL_CMD)
, m_pUpdateCtrl(0)
{
m_msgCMD_AG.Reset();
m_msgCMD_CG.Reset();
ms_msgBRD_CG.Reset();
ms_msgCMD_AW.Reset();
}
~SSQMsgRouterInAgent()
{
delete &m_msgCMD_AG;
delete &m_msgCMD_CG;
m_pUpdateCtrl = NULL;
}
public:
inline BROADCASTER_MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD& GetCMD_AG() { return m_msgCMD_AG; }
inline BROADCASTER_MSG_CG_ZONE_EX_SSQ_ROOM_CTRL_CMD& GetCMD_CG() { return m_msgCMD_CG; }
inline static BROADCASTER_MSG_CG_STATUS_SSQ_INFO_BRD& GetBRD_CG() { return ms_msgBRD_CG; }
inline static BROADCASTER_MSG_AW_OPERATION_ROOM_CTRL_CMD& GetCMD_AW() { return ms_msgCMD_AW; }
inline VOID SetUpdateCtrl(SSQUpdateCtrl* const pCtrl) { m_pUpdateCtrl = pCtrl; }
inline SSQUpdateCtrl* GetUpdateCtrl() const { return m_pUpdateCtrl; }
inline DWORD GetSlotNumber() const { return (DWORD)m_Container.size(); }
inline VOID RegisterLinkedServer(const DWORD serverSessionIndex) { m_LinkedServerSessionIdx = serverSessionIndex; }
BOOLEAN RoutingC2G(const WAR_TAG_P IN pMsg, const WAR_MSG_HDR IN header,
User* const pUser, const nsSSQ::Rules::eC2G_ReqRule rules);
private:
BOOLEAN Routing(const WAR_TAG_P IN pMsg, const WAR_MSG_HDR IN header);
BOOLEAN RoutingSpecial(const WAR_TAG_P IN pMsg, const WAR_MSG_HDR IN header);
VOID SlotUpdate();
public:
VOID SlotClear(User* const pUser);
VOID UpdateSharedMsg();
VOID Update(const SSQCODE CodeOfSSQ);
//#undef SSQ_MODE_NODE
//#define SSQ_MODE_NODE(protocol) \
// BOOL On##protocol(const nsSSQ::SSQ_MSG_##protocol& rMsg) { \
// printf("OnRecv " #protocol "\n"); \
// BYTE* ptr = (BYTE*)&rMsg; \
// BYTE* ptrend = ptr+sizeof(rMsg); \
// for(; ptr != ptrend ; ++ptr) \
// printf("[%03u]", *ptr); \
// puts(""); \
// return TRUE; \
// }
};
namespace SSQControlInfo
{
typedef SSQMsgRouterInAgent::router_info router_info;
};
#pragma warning(pop)