Files
Sun1602/Server/MasterServer/Function/MasterServerInfoStruct.cpp
T
2022-10-26 12:25:11 +08:00

247 lines
12 KiB
C++

#include "stdafx.h"
#include <PacketStruct_GM.h>
#include <PacketStruct_MX.h>
#include <MasterServerEx.h>
//=================================================================================================
// MasterServer 구조체
// - MasterServer에서 사용하는 구조체 정의
//=================================================================================================
#ifndef __WAVERIX_FUNCTION_RESTRICT_EXTENDED__
//// 게임서버로 보낼 정보 만들기
//VOID
//sRESTRICT_MGR::MakePacket::Make_GM_OPERATION_FUNCRESTRICT_CMD( sRESTRICT_MGR* pBLOCK, MSG_GM_OPERATION_FUNCRESTRICT_CMD* pMsgCMD )
//{
// STRUCT_RESTRICT* pRESTRICT = pMsgCMD->SRESTRICT;
// DWORD dwCount = 0;
//
// DWORD dwFunctions = pBLOCK->m_dwFuncRestrict;
//
// for( DWORD dwRestrictFunc=1 ; dwRestrictFunc<mc_FUNCRESTRICT_DATABLOCK_ALLOWED_MASK ; dwRestrictFunc<<=1 )
// {
// BOOL bRestrict = (BOOL)(dwFunctions&dwRestrictFunc);
//
// // 금지된 경우만 추가한다.
// if( !bRestrict )
// {
// pRESTRICT->dwFunc = dwRestrictFunc;
// pRESTRICT->bAllow = FALSE;
// ++pRESTRICT;
// ++dwCount;
// }
// }
// pMsgCMD->byRestrictNum = (BYTE)dwCount;
//}
//
//// AccountDB로부터 받은 기능 제한 패킷을 통해 정보 설정
//VOID
//sRESTRICT_MGR::MakePacket::Parse_MX_FUNCRESTRICT_RELOAD_ANS( sRESTRICT_MGR* pBLOCK, MSG_MX_FUNCRESTRICT_RELOAD_ANS* pMsgANS, BOOL bLogging )
//{
// STRUCT_RESTRICT_MASTER* pRESTRICT = pMsgANS->sRestrict;
// DWORD dwCount = pMsgANS->byRestrictNum;
//
// pBLOCK->m_dwFuncRestrict = sRESTRICT_MGR::mc_FUNCRESTRICT_DATABLOCK_ALLOWED_MASK ;
//
// for( DWORD i=0 ; i<dwCount ; ++i, ++pRESTRICT )
// {
// if( !pRESTRICT->bAllow )
// {
// DWORD dwFunctions = pRESTRICT->dwFunc - 1;
// dwFunctions = 1<<dwFunctions;
// if( sRESTRICT_MGR::mc_FUNCRESTRICT_DATABLOCK_ALLOWED_MASK > dwFunctions )
// pBLOCK->FunctionRestrict( (eFUNCTIONALRESTRICT_TYPE) dwFunctions );
// }
//
// if( bLogging ) // DB값에 의하면, 1부터 시작되므로
// MessageOut( eFULL_LOG, _T("FUNC_RESTRICT SET[%u][%u][%s]"), i+1, pRESTRICT->bAllow, pRESTRICT->ptszDesc );
// }
//}
//
//// 파일로부터 기능제한을 읽어들이는 경우 처리루틴 : Parse_MX -> Make_GM -> SendToGameServer 루틴이 포함된다.
//VOID
//sRESTRICT_MGR::MakePacket::Read_FUNCRESTRICT_FROM_FILE( sRESTRICT_MGR* pBLOCK, BOOL bLogging )
//{
// MSG_MX_FUNCRESTRICT_RELOAD_ANS msgINFOs;
// STRUCT_RESTRICT_MASTER* pRESTRICT = msgINFOs.sRestrict;
// DWORD dwCount = 0;
//
//#define READ_FROM_FILE_FUNC_RESTRICT(func, attribute) \
// { pRESTRICT->dwFunc = func; \
// __READ_CONFIG_NUMBER( pRESTRICT->bAllow, "FUNCTIONALRESTRICT", attribute, 1, MASTER_SERVER_INFO_FILE_NAME ); \
// memcpy( pRESTRICT->ptszDesc, attribute, sizeof(pRESTRICT->ptszDesc) ); \
// ++dwCount; \
// ++pRESTRICT; };
//
// //READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_ALLOW ,
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_ENCHANT , "FUNCTIONALRESTRICT_ENCHANT");
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_RANKUP , "FUNCTIONALRESTRICT_RANKUP" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_ADDSOCKET , "FUNCTIONALRESTRICT_ADDSOCKET" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_FILLSOCKET , "FUNCTIONALRESTRICT_FILLSOCKET" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_EXTRACTSOCKET , "FUNCTIONALRESTRICT_EXTRACTSOCKET" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_COMPOSE , "FUNCTIONALRESTRICT_COMPOSE" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_CRYSTALIZE , "FUNCTIONALRESTRICT_CRYSTALIZE" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_EXTRASTONE, "FUNCTIONALRESTRICT_USE_EXTRASTONE");
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_WAREHOUSE , "FUNCTIONALRESTRICT_USE_WAREHOUSE" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_TRADE , "FUNCTIONALRESTRICT_USE_TRADE" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_VENDOR , "FUNCTIONALRESTRICT_USE_VENDOR" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_GUILD , "FUNCTIONALRESTRICT_USE_GUILD" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_MONSTERDROP, "FUNCTIONALRESTRICT_USE_MONSTERDRO");
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_COMBINE_ITEM , "FUNCTIONALRESTRICT_COMBINE_ITEM" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_DIVIDE_ITEM , "FUNCTIONALRESTRICT_DIVIDE_ITEM" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_REPAIR_ITEM , "FUNCTIONALRESTRICT_REPAIR_ITEM");
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_SELL_ITEM , "FUNCTIONALRESTRICT_SELL_ITEM" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_BUY_ITEM , "FUNCTIONALRESTRICT_BUY_ITEM" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_EXCHANGE_ITEM , "FUNCTIONALRESTRICT_EXCHANGE_ITEM" );
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_VENDOR_LIST_NPC, "FUNCTIONALRESTRICT_VENDOR_LIST_NP");
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_BUY_SHOPITEM, "FUNCTIONALRESTRICT_BUY_SHOPITEM");
// READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_SHOP_SERVICE, "FUNCTIONALRESTRICT_SHOP_SERVICE");
// //eFUNCTIONALRESTRICT_ALL
//
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_NOTICE, "RTTARESTRICT_NOTICE" );
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_DROPUSER, "RTTARESTRICT_DROPUSER" );
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_USERCOUNT, "RTTARESTRICT_USERCOUNT" );
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_BATTLEZONEINFO, "RTTARESTRICT_BATTLEZONEINFO" );
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_ARMORKIT, "RTTARESTRICT_ARMORKIT" );
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_ABUSE, "RTTARESTRICT_ABUSE" );
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_USERMONEY, "RTTARESTRICT_USERMONEY" );
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_SERVERSHUTDOWN, "RTTARESTRICT_SERVERSHUTDOWN" );
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_USERDISCONN, "RTTARESTRICT_USERDISCONN" );
// //READ_FROM_FILE_FUNC_RESTRICT( eRTTARESTRICT_GMSCOMMAND, "RTTARESTRICT_GMSCOMMAND" );
//
// msgINFOs.byRestrictNum = (BYTE)dwCount;
//
// Parse_MX_FUNCRESTRICT_RELOAD_ANS( pBLOCK, &msgINFOs, TRUE, TRUE );
//}
//////////////////////////////////////////////////////////////////////////
#else //__WAVERIX_FUNCTION_RESTRICT_EXTENDED__
//////////////////////////////////////////////////////////////////////////
// 게임서버로 보낼 정보 만들기
VOID
sRESTRICT_MGR::MakePacket::Make_GM_OPERATION_FUNCRESTRICT_CMD( sRESTRICT_MGR* pBLOCK, MSG_GM_OPERATION_FUNCRESTRICT_CMD* pMsgCMD )
{
STRUCT_RESTRICT* pRESTRICT = pMsgCMD->SRESTRICT;
DWORD dwCount = 0;
//DWORD dwFunctions = pBLOCK->m_dwFuncRestrict;
for( DWORD dwRestrictFunc=0 ; dwRestrictFunc<FUNCRESTRICT_DATABLOCK_LAST_CODE_ID ; ++dwRestrictFunc )
{
BOOL bAllowed = (BOOL)( pBLOCK->IsFunctionAllowd( (eFUNCTIONALRESTRICT_TYPE)dwRestrictFunc ) );
// 금지된 경우만 추가한다.
if( !bAllowed )
{
// bit 개수 오버될 경우에 대비해 나중에는 번호로 바꿀...까?
pRESTRICT->dwFunc = (1<<dwRestrictFunc);
pRESTRICT->bAllow = FALSE;
++pRESTRICT;
++dwCount;
}
}
pMsgCMD->byRestrictNum = (BYTE)dwCount;
}
static inline DWORD __FFS( DWORD dwVal )
{
DWORD dwIdx;
dwIdx = 31;
if (dwVal & 0x0000FFFF) { dwIdx -= 16; dwVal <<= 16; }
if (dwVal & 0x00FF0000) { dwIdx -= 8; dwVal <<= 8; }
if (dwVal & 0x0F000000) { dwIdx -= 4; dwVal <<= 4; }
if (dwVal & 0x30000000) { dwIdx -= 2; dwVal <<= 2; }
if (dwVal & 0x40000000) { dwIdx -= 1; }
return dwIdx;
}
// AccountDB로부터 받은 기능 제한 패킷을 통해 정보 설정
VOID
sRESTRICT_MGR::MakePacket::Parse_MX_FUNCRESTRICT_RELOAD_ANS( sRESTRICT_MGR* pBLOCK, MSG_MX_FUNCRESTRICT_RELOAD_ANS* pMsgANS, BOOL bFromFile, BOOL bLogging )
{
STRUCT_RESTRICT_MASTER* pRESTRICT = pMsgANS->sRestrict;
DWORD dwCount = pMsgANS->byRestrictNum;
pBLOCK->Clear();
for( DWORD i=0 ; i<dwCount ; ++i, ++pRESTRICT )
{
DWORD dwFunctions = bFromFile ? pRESTRICT->dwFunc : 1<<(pRESTRICT->dwFunc-1);
if( pRESTRICT->bAllow )
{
//if( !(FUNCRESTRICT_DATABLOCK_LAST_CODE_ID < dwFunctions) )
if( eFUNCTIONALRESTRICT_ALL & dwFunctions )
{
DWORD dwIdx = __FFS( dwFunctions );
pBLOCK->FunctionAllow( (eFUNCTIONALRESTRICT_TYPE) dwIdx );
}
else
{
MessageOut( eCRITICAL_LOG, _T("Invalid Function Restrict Code ID %u"), dwFunctions );
}
}
if( bLogging ) // DB값에 의하면, 1부터 시작되므로
MessageOut( eFULL_LOG, _T("FUNC_RESTRICT SET[%u][%u][%s]"), dwFunctions, pRESTRICT->bAllow, pRESTRICT->ptszDesc );
}
}
// 파일로부터 기능제한을 읽어들이는 경우 처리루틴 : Parse_MX -> Make_GM -> SendToGameServer 루틴이 포함된다.
VOID
sRESTRICT_MGR::MakePacket::Read_FUNCRESTRICT_FROM_FILE( sRESTRICT_MGR* pBLOCK, BOOL bLogging )
{
MSG_MX_FUNCRESTRICT_RELOAD_ANS msgINFOs;
STRUCT_RESTRICT_MASTER* pRESTRICT = msgINFOs.sRestrict;
DWORD dwCount = 0;
#define READ_FROM_FILE_FUNC_RESTRICT(func, attribute) \
{ pRESTRICT->dwFunc = func; \
__READ_CONFIG_NUMBER( pRESTRICT->bAllow, "FUNCTIONALRESTRICT", attribute, 1, MASTER_SERVER_INFO_FILE_NAME ); \
memcpy( pRESTRICT->ptszDesc, attribute, sizeof(pRESTRICT->ptszDesc) ); \
++dwCount; \
++pRESTRICT; };
//READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_ALLOW ,
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_ENCHANT , "FUNCTIONALRESTRICT_ENCHANT");
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_RANKUP , "FUNCTIONALRESTRICT_RANKUP" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_ADDSOCKET , "FUNCTIONALRESTRICT_ADDSOCKET" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_FILLSOCKET , "FUNCTIONALRESTRICT_FILLSOCKET" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_EXTRACTSOCKET , "FUNCTIONALRESTRICT_EXTRACTSOCKET" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_COMPOSE , "FUNCTIONALRESTRICT_COMPOSE" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_CRYSTALIZE , "FUNCTIONALRESTRICT_CRYSTALIZE" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_EXTRASTONE, "FUNCTIONALRESTRICT_USE_EXTRASTONE");
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_WAREHOUSE , "FUNCTIONALRESTRICT_USE_WAREHOUSE" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_TRADE , "FUNCTIONALRESTRICT_USE_TRADE" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_VENDOR , "FUNCTIONALRESTRICT_USE_VENDOR" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_GUILD , "FUNCTIONALRESTRICT_USE_GUILD" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_USE_MONSTERDROP, "FUNCTIONALRESTRICT_USE_MONSTERDRO");
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_COMBINE_ITEM , "FUNCTIONALRESTRICT_COMBINE_ITEM" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_DIVIDE_ITEM , "FUNCTIONALRESTRICT_DIVIDE_ITEM" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_REPAIR_ITEM , "FUNCTIONALRESTRICT_REPAIR_ITEM");
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_SELL_ITEM , "FUNCTIONALRESTRICT_SELL_ITEM" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_BUY_ITEM , "FUNCTIONALRESTRICT_BUY_ITEM" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_EXCHANGE_ITEM , "FUNCTIONALRESTRICT_EXCHANGE_ITEM" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_VENDOR_LIST_NPC, "FUNCTIONALRESTRICT_VENDOR_LIST_NP");
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_BUY_SHOPITEM, "FUNCTIONALRESTRICT_BUY_SHOPITEM");
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_SHOP_SERVICE, "FUNCTIONALRESTRICT_SHOP_SERVICE");
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_GM_COMMAND, "FUNCTIONALRESTRICT_GM_COMMAND");
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_PARTY_RETURN_FOR_UCUSER, "FUNCTIONALRESTRICT_PARTY_RETURN_FOR_UCUSER" );
READ_FROM_FILE_FUNC_RESTRICT( eFUNCTIONALRESTRICT_WAREINVEN_LOCK_BY_PWD, "FUNCTIONALRESTRICT_WAREINVEN_LOCK_BY_PWD" );
//eFUNCTIONALRESTRICT_ALL
msgINFOs.byRestrictNum = (BYTE)dwCount;
Parse_MX_FUNCRESTRICT_RELOAD_ANS( pBLOCK, &msgINFOs, TRUE, TRUE );
}
#endif //__WAVERIX_FUNCTION_RESTRICT_EXTENDED__