204 lines
6.5 KiB
C++
204 lines
6.5 KiB
C++
#pragma once
|
|
|
|
#include <PacketStruct.h>
|
|
#include <PacketStruct_CG.h>
|
|
|
|
|
|
namespace nsPacket
|
|
{
|
|
template< BYTE category, BYTE category_pack >
|
|
struct CATEGORY_LINK_PAIR
|
|
{
|
|
static const BYTE value = category;
|
|
static const BYTE value_pack = category_pack;
|
|
};
|
|
|
|
#ifdef _NA000000_CW_PROTOCOL_UNIFICATION
|
|
#define DECL_CATEGORY_LIST_CW() \
|
|
DECL_CATEGORY_NODE(CW_CONNECTION , CW_CONNECTION_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_CHAT , CW_CHAT_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_GM , CW_GM_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_VIEWPORT , CW_VIEWPORT_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_ARMORKIT , CW_ARMORKIT_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_FRIEND , CW_FRIEND_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_GUILD , CW_GUILD_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_CRYPTOGRAPHY , CW_CRYPTOGRAPHY_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_COMMUNITY , CW_COMMUNITY_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_REVENGE , CW_REVENGE_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_MEMO , CW_MEMO_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_GROUP , CW_GROUP_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_LOTTO , CW_LOTTO_PACK ) \
|
|
DECL_CATEGORY_NODE(CW_PARTY , CW_PARTY_PACK )
|
|
#else
|
|
#define DECL_CATEGORY_LIST_CW()
|
|
#endif
|
|
|
|
//#define DECL_CATEGORY_NODE( cate, cate_pack )
|
|
#define DECL_CATEGORY_LIST() \
|
|
DECL_CATEGORY_NODE( CG_CONNECTION , CG_CONNECTION_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_CHARINFO , CG_CHARINFO_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_MAP , CG_MAP_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_SYNC , CG_SYNC_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_BATTLE , CG_BATTLE_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_STYLE , CG_STYLE_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_SKILL , CG_SKILL_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_CONVERSATION , CG_CONVERSATION_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_ZONE , CG_ZONE_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_ITEM , CG_ITEM_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_TRADE , CG_TRADE_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_PARTY , CG_PARTY_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_TRIGGER , CG_TRIGGER_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_GM , CG_GM_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_ETC , CG_ETC_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_STATUS , CG_STATUS_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_VENDOR , CG_VENDOR_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_WAREHOUSE , CG_WAREHOUSE_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_PVP , CG_PVP_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_SUMMON , CG_SUMMON_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_GUILD , CG_GUILD_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_EVENT , CG_EVENT_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_QUEST , CG_QUEST_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_CRYPTOGRAPHY , CG_CRYPTOGRAPHY_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_ARMORKIT , CG_ARMORKIT_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_CHUNTING , CG_CHUNTING_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_AREACONQUEST , CG_AREACONQUEST_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_MISSION , CG_MISSION_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_WAYPOINT , CG_WAYPOINT_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_CHAO , CG_CHAO_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_SHOP , CG_SHOP_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_ZONE_EX , CG_ZONE_EX_PACK ) \
|
|
DECL_CATEGORY_NODE( CG_COLLECT , CG_COLLECT_PACK ) \
|
|
DECL_CATEGORY_LIST_CW()
|
|
//DECL_CATEGORY_NODE( CG_MAX , CG_MAX_PACK )
|
|
|
|
#define DECL_CATEGORY_NODE( cate, cate_pack ) \
|
|
typedef CATEGORY_LINK_PAIR<cate, cate_pack> PAIR_##cate;
|
|
|
|
DECL_CATEGORY_LIST(); //type definitions
|
|
|
|
#ifdef _NA000000_CW_PROTOCOL_UNIFICATION
|
|
BOOST_STATIC_ASSERT(CATEGORY_GENERATOR_065 == CG_MAX);
|
|
BOOST_STATIC_ASSERT(CATEGORY_GENERATOR_165 == CG_MAX_PACK);
|
|
#else
|
|
BOOST_STATIC_ASSERT(CATEGORY_GENERATOR_037 == CG_MAX);
|
|
BOOST_STATIC_ASSERT(CATEGORY_GENERATOR_136 == CG_MAX_PACK);
|
|
#endif
|
|
//==================================================================================================
|
|
//
|
|
struct CategoryConverter
|
|
{
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
static WORD GetCategoryValue( const BYTE any_category )
|
|
{
|
|
switch( any_category )
|
|
{
|
|
#undef DECL_CATEGORY_NODE
|
|
#define DECL_CATEGORY_NODE( cate, cate_pack ) \
|
|
case PAIR_##cate::value: return PAIR_##cate::value;
|
|
|
|
DECL_CATEGORY_LIST();
|
|
|
|
#undef DECL_CATEGORY_NODE
|
|
#define DECL_CATEGORY_NODE( cate, cate_pack ) \
|
|
case PAIR_##cate::value_pack: return PAIR_##cate::value;
|
|
|
|
DECL_CATEGORY_LIST();
|
|
}
|
|
|
|
return (WORD)-1;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
static WORD GetCategoryPackValue( const BYTE any_category )
|
|
{
|
|
switch( any_category )
|
|
{
|
|
#undef DECL_CATEGORY_NODE
|
|
#define DECL_CATEGORY_NODE( cate, cate_pack ) \
|
|
case PAIR_##cate::value: return PAIR_##cate::value_pack;
|
|
|
|
DECL_CATEGORY_LIST();
|
|
|
|
#undef DECL_CATEGORY_NODE
|
|
#define DECL_CATEGORY_NODE( cate, cate_pack ) \
|
|
case PAIR_##cate::value_pack: return PAIR_##cate::value_pack;
|
|
|
|
DECL_CATEGORY_LIST();
|
|
}
|
|
|
|
return (WORD)-1;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
static BOOLEAN IsCategoryPacked( const BYTE check_category )
|
|
{
|
|
switch( check_category )
|
|
{
|
|
#undef DECL_CATEGORY_NODE
|
|
#define DECL_CATEGORY_NODE( cate, cate_pack ) \
|
|
case PAIR_##cate::value_pack: return TRUE;
|
|
|
|
DECL_CATEGORY_LIST();
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
static BOOLEAN SetPackInfo( MSG_BASE* const pMsg )
|
|
{
|
|
const BYTE category = pMsg->m_byCategory;
|
|
#ifdef _DEBUG
|
|
const BOOLEAN isPacketPacked = IsCategoryPacked( category );
|
|
if( isPacketPacked )
|
|
{
|
|
__debugbreak();
|
|
return FALSE;
|
|
}
|
|
#endif
|
|
|
|
switch( category )
|
|
{
|
|
#undef DECL_CATEGORY_NODE
|
|
#define DECL_CATEGORY_NODE( cate, cate_pack ) \
|
|
case PAIR_##cate::value: pMsg->m_byCategory = PAIR_##cate::value_pack; return TRUE;
|
|
|
|
DECL_CATEGORY_LIST();
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
static BOOLEAN SetUnPackInfo( MSG_BASE* const pMsg )
|
|
{
|
|
const BYTE category = pMsg->m_byCategory;
|
|
#ifdef _DEBUG
|
|
const BOOLEAN isPacketPacked = IsCategoryPacked( category );
|
|
if( !isPacketPacked )
|
|
{
|
|
__debugbreak();
|
|
return FALSE;
|
|
}
|
|
#endif
|
|
switch( category )
|
|
{
|
|
#undef DECL_CATEGORY_NODE
|
|
#define DECL_CATEGORY_NODE( cate, cate_pack ) \
|
|
case PAIR_##cate::value_pack: pMsg->m_byCategory = PAIR_##cate::value; return TRUE;
|
|
|
|
DECL_CATEGORY_LIST();
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
};
|
|
};
|
|
|
|
|