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

312 lines
10 KiB
C++

#pragma once
#include <BitsetOperation.h>
class Player;
struct MSG_DG_WAREHOUSE_PWD_SETTING_ACK;
//////////////////////////////////////////////////////////////////////////
//
struct sPACKET_PROTECT_BASE_INFO
{
enum
{ // Password 관련 작업중 필요한 세부 모드
CHECK_NONE = 4, //
CHECK_CMP_PWD = 1, // PWD 검사중
CHECK_CMP_SSN = 2, // SSN 검사중
APPLY_TRANSACTION = 3, // DB에의 반영, 응답대기중
CHECK_END = 4, // 트랜젝션 상태 종료
};
Player* pPlayer;
WAREINVEN_FILTER_BITFLAGS CONTROL_FIELD;
BYTE byPwdConfigureMode;
sSSN_ENCODED_STREAM SSN_ENCODED_STREAM;
};
struct sPASSWORD_BLOCK
{
sSSN_STREAM PWDnSSN;
inline VOID Init() { memset( PWDnSSN.GetBUFFER(), 0, PWDnSSN.GetBUFFER_LENGTH() ); }
inline BOOL IsEmpty() { return (BOOL)(PWDnSSN.GetBUFFER()[0] == '\0'); }
inline sSSN_STREAM& Get() { return PWDnSSN; }
inline VOID Set( CHAR* pStrSrc )
{
PWDnSSN.CopyFrom( pStrSrc );
PWDnSSN.MakeSafeString();
}
// 비번이 할당된 상태에서 비번으로서 허용 가능한지 여부 타전
static BOOL IsAcceptableFormat( CHAR* pwd );
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// 창고/인벤토리 잠금 기능 관련
//---------------------------------------------------------------------------
class ProtectorWarehouse
{
private: sPACKET_PROTECT_BASE_INFO& m_rINFO;
sPASSWORD_BLOCK m_Password;
#pragma warning(push)
#pragma warning(disable : 4201)
struct
{ // Addin-INFO
CODETYPE NPCCode; // 상점,인벤 관련 비번 설정시 임시 저장소
};
#pragma warning(pop)
public:
// 비번 공간 초기화는 DB로부터 값을 받아올 때 사용하기로 하자.
ProtectorWarehouse( sPACKET_PROTECT_BASE_INFO& rINFO ) : m_rINFO(rINFO) { }
// 유저 정보를 가져오는 시점에 비번 유무 확인 후 이 루틴을 수행한다.
VOID Block( BOOL bIsBlock, BOOL bDBUpdate = TRUE );
// 비번 미설정시 나 비번 입력 받고 인증되었을 때, 사용할 수 있도록 설정
inline VOID UnBlock();
// 창고 초기화 되었는지? (최소 한번은 열었는지?)
inline BOOL IsInitialized();
// 창고 초기화 되었다.
inline VOID Initialized();
// 비번 통과 했는지 여부
inline BOOL IsUsable();
// 비번 있는지
inline BOOL IsEmptyPassword();
// 비번 비교
inline BOOL IsEqualPassword( CHAR pszPwd[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH] );
// 비번 설정
inline BOOL SetPasswordFromDB( CHAR pszPwdinDB[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH] );
//
inline CHAR* GetPassword() { return PASSWORD().Get().GetBUFFER(); }
inline BYTE& PasswordTransactionMode() { return m_rINFO.byPwdConfigureMode; }
//
//
BOOL TEST_Transaction_PWD_CONFIG( BOOL bIsEnable );
// 비번 확인중일 경우, 비번 설정 중일 경우
BOOL TESTnSET_Transaction_PWD_CONFIG( BOOL bIsEnable );
//
inline DWORD GetControlFieldStream();
inline VOID SetControlFieldStream( DWORD dwFlagStream );
private:
inline Player& PLAYER() { return *m_rINFO.pPlayer; }
inline WAREINVEN_FILTER_BITFLAGS& CONTROL_FIELD() { return m_rINFO.CONTROL_FIELD; }
inline sPASSWORD_BLOCK& PASSWORD() { return m_Password; }
__DISABLE_COPY(ProtectorWarehouse);
};
class ProtectorInventory
{
private: sPACKET_PROTECT_BASE_INFO& m_rINFO;
sPASSWORD_BLOCK m_Password;
public: ProtectorInventory( sPACKET_PROTECT_BASE_INFO& rINFO ) : m_rINFO(rINFO) { }
// 유저 정보를 가져오는 시점에 비번 유무 확인 후 이 루틴을 수행한다.
VOID Block( BOOL bIsBlock, BOOL bDBUpdate = TRUE );
// 비번 통과 했는지 여부
inline BOOL IsUsable() const;
// 비번 있는지
inline BOOL IsEmptyPassword();
// 비번 비교 (유저가 입력한 암호로 현 DB에 설정되어 있을 암호와 비교)
inline BOOL IsEqualPassword( CHAR pszPwd[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH+1] );
// 비번 설정 (DB에서 값을 읽어들일 때, 설정)
inline BOOL SetPasswordFromDB( CHAR pszPwdinDB[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH] );
//
inline CHAR* GetPassword() { return PASSWORD().Get().GetBUFFER(); }
inline BYTE& PasswordTransactionMode() { return m_rINFO.byPwdConfigureMode; }
//
//
BOOL TEST_Transaction_PWD_CONFIG( BOOL bIsEnable );
// 비번 확인중일 경우, 비번 설정 중일 경우
BOOL TESTnSET_Transaction_PWD_CONFIG( BOOL bIsEnable );
//
inline DWORD GetControlFieldStream();
inline VOID SetControlFieldStream( DWORD dwFlagStream );
private: inline Player& PLAYER() { return *m_rINFO.pPlayer; }
inline WAREINVEN_FILTER_BITFLAGS& CONTROL_FIELD() const { return m_rINFO.CONTROL_FIELD; }
inline sPASSWORD_BLOCK& PASSWORD() { return m_Password; }
__DISABLE_COPY(ProtectorInventory);
};
//
//////////////////////////////////////////////////////////////////////////
//
class WarehouseInventoryProtector
{
private: sPACKET_PROTECT_BASE_INFO m_BASE_INFO;
ProtectorWarehouse m_WAREHOUSE;
ProtectorInventory m_INVENTORY;
public: WarehouseInventoryProtector() : m_WAREHOUSE( m_BASE_INFO ), m_INVENTORY( m_BASE_INFO ) {}
~WarehouseInventoryProtector() {}
inline VOID Init( Player* pPlayer )
{
m_BASE_INFO.pPlayer = pPlayer;
m_BASE_INFO.CONTROL_FIELD.ClearAll();
m_BASE_INFO.byPwdConfigureMode = sPACKET_PROTECT_BASE_INFO::CHECK_NONE;
CONTROL_FIELD().UnSet( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_USABLE );
}
public: ProtectorWarehouse& WAREHOUSE() { return m_WAREHOUSE; }
ProtectorInventory& INVENTORY() { return m_INVENTORY; }
public: BOOL IsEqualSSN( BYTE psSSN[MAX_SSN_STREAM_LENGTH] );
public: inline Player& USER() { return *m_BASE_INFO.pPlayer; }
inline WAREINVEN_FILTER_BITFLAGS& CONTROL_FIELD() { return m_BASE_INFO.CONTROL_FIELD; }
inline sSSN_ENCODED_STREAM& SSN_ENCODED_STREAM() { return m_BASE_INFO.SSN_ENCODED_STREAM; }
// <PACKET HANDLER>
public:
// <창고, 인벤> 비번 변경에 대한 결과
BOOL OnRecvDG_WAREHOUSE_PWD_SETTING_ACK( MSG_DG_WAREHOUSE_PWD_SETTING_ACK* pMsg, WORD wSize );
// <창고>
BOOL OnRecvCG_WAREHOUSE_PWD_LOCKING_SYN( MSG_CG_WAREHOUSE_PWD_LOCKING_SYN* pMsg, WORD wSize );
BOOL OnRecvCG_WAREHOUSE_PWD_SETTING_SYN( MSG_CG_WAREHOUSE_PWD_SETTING_SYN* pMsg, WORD wSize );
BOOL OnRecvCG_WAREHOUSE_PWD_CHECK_SYN( MSG_CG_WAREHOUSE_PWD_CHECK_SYN* pMsg, WORD wSize );
// <인벤토리>
BOOL OnRecvCG_ITEM_INVENTORY_PWD_LOCKING_SYN( MSG_CG_ITEM_INVENTORY_PWD_LOCKING_SYN* pMsg, WORD wSize );
BOOL OnRecvCG_ITEM_INVENTORY_PWD_SETTING_SYN( MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN* pMsg, WORD wSize );
BOOL OnRecvCG_ITEM_INVENTORY_PWD_CHECK_SYN( MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN* pMsg, WORD wSize );
__DISABLE_COPY(WarehouseInventoryProtector);
};
//
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// 창고 초기화 되었는지? (최소 한번은 열었는지?)
inline BOOL ProtectorWarehouse::IsInitialized()
{
return CONTROL_FIELD().IsSet( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_INITIALIZE );
}
inline VOID ProtectorWarehouse::Initialized()
{
return CONTROL_FIELD().Set( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_INITIALIZE );
}
// 비번 통과 했는지 여부
inline BOOL ProtectorWarehouse::IsUsable()
{
return CONTROL_FIELD().IsSet( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_USABLE );
}
// 비번 있는지
inline BOOL ProtectorWarehouse::IsEmptyPassword()
{
return PASSWORD().IsEmpty();
}
// 비번 비교
inline BOOL ProtectorWarehouse::IsEqualPassword( CHAR pszPwd[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH] )
{
if( 0 == strncmp( PASSWORD().Get().GetBUFFER(), pszPwd, MAX_WAREHOUSE_INVENTORY_PWD_LENGTH ) )
return TRUE;
return FALSE;
}
// 비번 설정
inline BOOL ProtectorWarehouse::SetPasswordFromDB( CHAR pszPwdinDB[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH] )
{
PASSWORD().Set( pszPwdinDB );
return TRUE;
}
inline DWORD ProtectorWarehouse::GetControlFieldStream()
{
const DWORD dwAcceptField = eWARE_INVEN_FILTER_FLAG_INFO::MASK_WAREHOUSE_FLAGS
& (~(1<<eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_PWD_TRANSACTION));
DWORD dwMaskedFields = dwAcceptField & (*(DWORD*)&m_rINFO.CONTROL_FIELD);
//const DWORD dwMASK_FIELD = (1<<eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_INITIALIZE)
// | (1<<eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_USABLE);
//DWORD dwMaskedFields = dwMASK_FIELD & (*(DWORD*)&m_rINFO.CONTROL_FIELD);
return dwMaskedFields;
}
inline VOID ProtectorWarehouse::SetControlFieldStream( DWORD dwFlagStream )
{
const DWORD dwMASK_ACCEPT =
(1<<eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_INITIALIZE)
| (1<<eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_USABLE);
dwFlagStream = dwMASK_ACCEPT & dwFlagStream;
DWORD& rFIELD = (*(DWORD*)&m_rINFO.CONTROL_FIELD);
rFIELD = rFIELD & dwFlagStream;
//if( (dwMASK_INIT|dwMASK_USABLE) & (dwFlagStream) )
//{
// if( dwMASK_INIT & dwFlagStream )
// CONTROL_FIELD().Set( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_INITIALIZE );
// else
// CONTROL_FIELD().UnSet( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_INITIALIZE );
// if( dwMASK_USABLE & dwFlagStream )
// CONTROL_FIELD().Set( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_USABLE );
// else
// CONTROL_FIELD().UnSet( eWARE_INVEN_FILTER_FLAG_INFO::WAREHOUSE_USABLE );
//}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 비번 미설정시 나 비번 입력 받고 인증되었을 때, 사용할 수 있도록 설정
//inline VOID ProtectorInventory::UnBlock()
// 비번 통과 했는지 여부
inline BOOL ProtectorInventory::IsUsable() const
{
return CONTROL_FIELD().IsSet( eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_USABLE );
}
// 비번 있는지
inline BOOL ProtectorInventory::IsEmptyPassword()
{
return PASSWORD().IsEmpty();
}
// 비번 비교 (유저가 입력한 암호로 현 DB에 설정되어 있을 암호와 비교)
inline BOOL ProtectorInventory::IsEqualPassword( CHAR pszPwd[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH+1] )
{
if( 0 == strncmp( PASSWORD().Get().GetBUFFER(), pszPwd, MAX_WAREHOUSE_INVENTORY_PWD_LENGTH ) )
return TRUE;
return FALSE;
}
// 비번 설정 (DB에서 값을 읽어들일 때, 설정)
inline BOOL ProtectorInventory::SetPasswordFromDB( CHAR pszPwdinDB[MAX_WAREHOUSE_INVENTORY_PWD_LENGTH] )
{
PASSWORD().Set( pszPwdinDB );
return TRUE;
}
inline DWORD ProtectorInventory::GetControlFieldStream()
{
DWORD dwMaskedFields =
(1<<eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_USABLE) & (*(DWORD*)&m_rINFO.CONTROL_FIELD);
return dwMaskedFields;
}
inline VOID ProtectorInventory::SetControlFieldStream( DWORD dwFlagStream )
{
if( (1<<eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_USABLE) & (dwFlagStream) )
CONTROL_FIELD().Set( eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_USABLE );
else
CONTROL_FIELD().UnSet( eWARE_INVEN_FILTER_FLAG_INFO::INVENTORY_USABLE );
}