247 lines
12 KiB
C++
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__
|
|
|