#pragma once #include 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; } // 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<