#include "StdAfx.h" #include "DnPlayerFloatingChecker.h" #include "DnWorld.h" #include "DnPlayerActor.h" #include "DNUserSession.h" CDnPlayerFloatingChecker::CDnPlayerFloatingChecker( CDnPlayerActor* pActor ) : IDnPlayerChecker( pActor ) { m_nInvalidCount = 0; m_LastCheckTime = 0; } CDnPlayerFloatingChecker::~CDnPlayerFloatingChecker() { } void CDnPlayerFloatingChecker::Process( LOCAL_TIME LocalTime, float fDelta ) { PROFILE_TIME_TEST_BLOCK_START( "CDnPlayerFloatingChecker" ); if( m_LastCheckTime == 0 ) m_LastCheckTime = LocalTime; else if( m_LastCheckTime > LocalTime ) m_LastCheckTime = LocalTime; m_fVecHeightList.push_back( m_pActor->GetMatEx()->m_vPosition.y ); if( m_fVecHeightList.size() > 20 ) m_fVecHeightList.erase( m_fVecHeightList.begin() ); // 1ÃÊ¿¡ Çѹø¾¿ Ã¼Å©ÇØ¼­ if( LocalTime - m_LastCheckTime > 1000 ) { m_LastCheckTime = LocalTime; // ¼­¹ö°¡ ´À·ÁÁö¸é üũ°¡ µÉ ¼ÒÁö°¡ ÀÖÀ¸¹Ç·Á m_nLastCheckTime -= 1000 ¾ÈÇÏ°í ±×³É ÇöÁ¦ ½Ã°£À¸·Î ³Ò´Ï´Ù. if( IsFloating() == true ) { m_nInvalidCount++; // 3Ãʵ¿¾È °è¼Ó Invalid ³ª¿Ã ½Ã Ã¼Å©ÇØÁÝ´Ï´Ù. if( m_nInvalidCount == 3 ) { if( m_pActor && m_pActor->GetUserSession() ) g_Log.Log( LogType::_HACK, m_pActor->GetUserSession(), L"[CDnPlayerFloatingChecker] ġƮ ÀÇ½É À¯Àú!!! CharName=%s", m_pActor->GetUserSession()->GetCharacterName() ); m_nInvalidCount = 0; } } else m_nInvalidCount = 0; } PROFILE_TIME_TEST_BLOCK_END(); } bool CDnPlayerFloatingChecker::IsFloating() { // 2¹ÌÅÍ ÀÌ»ó ¿ÀÂ÷°¡ ³¯ °æ¿ì if( m_fVecHeightList.size() < 20 ) return false; float fAverage = 0.f; for( DWORD i=0; iGetVelocity()->y == 0.f && abs( m_pActor->GetPosition()->y - fAverage ) > fLimitHeight ) { return true; } return false; }