DragonNest/Server/DNGameServer/DnPlayerFloatingChecker.cpp

63 lines
1.9 KiB
C++
Raw Permalink Normal View History

#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;
}