2024-12-21 10:04:04 +08:00
|
|
|
|
#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<>ʿ<EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> üũ<C3BC>ؼ<EFBFBD>
|
|
|
|
|
|
if( LocalTime - m_LastCheckTime > 1000 )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_LastCheckTime = LocalTime; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> m_nLastCheckTime -= 1000 <20><><EFBFBD>ϰ<EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20>Ҵϴ<D2B4>.
|
|
|
|
|
|
if( IsFloating() == true )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_nInvalidCount++;
|
|
|
|
|
|
// 3<>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD> Invalid <20><><EFBFBD><EFBFBD> <20><> üũ<C3BC><C5A9><EFBFBD>ݴϴ<DDB4>.
|
|
|
|
|
|
if( m_nInvalidCount == 3 )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_pActor && m_pActor->GetUserSession() )
|
|
|
|
|
|
g_Log.Log( LogType::_HACK, m_pActor->GetUserSession(), L"[CDnPlayerFloatingChecker] ġƮ <20>ǽ<EFBFBD> <20><><EFBFBD><EFBFBD>!!! CharName=%s", m_pActor->GetUserSession()->GetCharacterName() );
|
|
|
|
|
|
|
|
|
|
|
|
m_nInvalidCount = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else m_nInvalidCount = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
PROFILE_TIME_TEST_BLOCK_END();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnPlayerFloatingChecker::IsFloating()
|
|
|
|
|
|
{
|
|
|
|
|
|
// 2<><32><EFBFBD><EFBFBD> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
if( m_fVecHeightList.size() < 20 ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
float fAverage = 0.f;
|
|
|
|
|
|
for( DWORD i=0; i<m_fVecHeightList.size(); i++ ) {
|
|
|
|
|
|
fAverage += m_fVecHeightList[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
fAverage /= (float)m_fVecHeightList.size();
|
|
|
|
|
|
|
|
|
|
|
|
static float fLimitHeight = 200.f;
|
|
|
|
|
|
if( m_pActor->GetVelocity()->y == 0.f && abs( m_pActor->GetPosition()->y - fAverage ) > fLimitHeight ) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|