121 lines
No EOL
3.6 KiB
C++
121 lines
No EOL
3.6 KiB
C++
#include "StdAfx.h"
|
|
#include "DnPlayerDoNotEnterChecker.h"
|
|
#include "DnWorld.h"
|
|
#include "DnPlayerActor.h"
|
|
#include "DNUserSession.h"
|
|
|
|
CDnPlayerDoNotEnterChecker::CDnPlayerDoNotEnterChecker( CDnPlayerActor* pActor )
|
|
: IDnPlayerChecker( pActor )
|
|
{
|
|
m_nInvalidCount = 0;
|
|
m_nValidCount = 0;
|
|
m_LastCheckTime = 0;
|
|
m_nCheckerCount = 0;
|
|
}
|
|
|
|
CDnPlayerDoNotEnterChecker::~CDnPlayerDoNotEnterChecker()
|
|
{
|
|
}
|
|
|
|
void CDnPlayerDoNotEnterChecker::Process( LOCAL_TIME LocalTime, float fDelta )
|
|
{
|
|
if( m_LastCheckTime == 0 ) m_LastCheckTime = LocalTime;
|
|
else if( m_LastCheckTime > LocalTime ) m_LastCheckTime = LocalTime;
|
|
|
|
// 1초에 한번씩 체크해서
|
|
if( LocalTime - m_LastCheckTime > 1000 )
|
|
{
|
|
m_LastCheckTime = LocalTime; // 서버가 느려지면 체크가 될 소지가 있으므려 m_nLastCheckTime -= 1000 안하고 그냥 현제 시간으로 넙니다.
|
|
if( IsInvalidPosition() == true )
|
|
{
|
|
m_nValidCount = 0;
|
|
m_nInvalidCount++;
|
|
if( m_nInvalidCount == 1 )
|
|
{
|
|
if( m_pActor && m_pActor->GetUserSession() )
|
|
{
|
|
g_Log.Log( LogType::_HACK, m_pActor->GetUserSession(), L"HackChecker(DoNotEnter) : CharName=%s InvalidCount=%d, ValidCount=%d MapIndex=%d\n", m_pActor->GetUserSession()->GetCharacterName(), m_nInvalidCount, m_nValidCount, m_pActor->GetUserSession()->GetMapIndex() );
|
|
}
|
|
|
|
m_pActor->OnInvalidPlayerChecker( 5 );
|
|
m_nCheckerCount += 5;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_nValidCount++;
|
|
}
|
|
}
|
|
|
|
if( m_nValidCount > 10 )
|
|
{
|
|
m_nInvalidCount = 0;
|
|
m_nCheckerCount = 0;
|
|
}
|
|
}
|
|
|
|
bool CDnPlayerDoNotEnterChecker::IsInvalidPosition()
|
|
{
|
|
if( !m_pActor ) return false;
|
|
if( !CDnWorld::IsActive(m_pActor->GetRoom()) ) return false;
|
|
int nBlockSize = CDnWorld::GetInstance(m_pActor->GetRoom()).GetAttributeBlockSize( m_pActor->GetPosition()->x, m_pActor->GetPosition()->z );
|
|
int nBlockCount = 0;
|
|
|
|
EtVector3 vPos = *m_pActor->GetPosition();
|
|
|
|
EtVector2 vSize;
|
|
CDnWorld::GetInstance(m_pActor->GetRoom()).CalcWorldSize( vSize );
|
|
vSize /= 2.f;
|
|
|
|
if( vPos.x <= -vSize.x || vPos.x >= vSize.x || vPos.z <= -vSize.y || vPos.z >= vSize.y ) return true;
|
|
|
|
char cAttr = CDnWorld::GetInstance(m_pActor->GetRoom()).GetAttribute( vPos );
|
|
if( ( cAttr & 0x0f ) == 1 || ( cAttr & 0x0f ) == 2 )
|
|
{
|
|
nBlockCount++;
|
|
|
|
for( int i=-1; i<2; i++ )
|
|
{
|
|
for( int j=-1; j<2; j++ )
|
|
{
|
|
if( i == 0 && j == 0 ) continue;
|
|
|
|
vPos = *m_pActor->GetPosition() + EtVector3( (float)( nBlockSize * j ), 0.f, (float)( nBlockSize * i ) );
|
|
cAttr = CDnWorld::GetInstance(m_pActor->GetRoom()).GetAttribute( vPos );
|
|
|
|
if( ( cAttr & 0x0f ) == 1 || ( cAttr & 0x0f ) == 2 ||
|
|
( vPos.x <= -vSize.x || vPos.x >= vSize.x || vPos.z <= -vSize.y || vPos.z >= vSize.y ) )
|
|
{
|
|
nBlockCount++;
|
|
if( nBlockCount >= 9 )
|
|
{
|
|
if( m_nInvalidCount == 0 )
|
|
{
|
|
EtVector3 vPrevPos = *m_pActor->GetPosition();
|
|
g_Log.Log( LogType::_HACK, m_pActor->GetUserSession(), L"HackChecker(DoNotEnter:Position) : Prev Position X:%f Y:%f Z:%f\n", vPrevPos.x, vPrevPos.y, vPrevPos.z );
|
|
g_Log.Log( LogType::_HACK, m_pActor->GetUserSession(), L"HackChecker(DoNotEnter:Position) : Calc Position X:%f Y:%f Z:%f\n", vPos.x, vPos.y, vPos.z );
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CDnPlayerDoNotEnterChecker::IsInvalidPlayer()
|
|
{
|
|
return ( m_nInvalidCount > 0 ) ? true : false;
|
|
}
|
|
|
|
void CDnPlayerDoNotEnterChecker::ResetInvalid()
|
|
{
|
|
m_nInvalidCount = 0;
|
|
if( m_pActor && m_pActor->GetUserSession() )
|
|
{
|
|
m_pActor->OnInvalidPlayerChecker( -m_nCheckerCount );
|
|
m_nCheckerCount = 0;
|
|
g_Log.Log( LogType::_HACK, m_pActor->GetUserSession(), L"[CDnPlayerDoNotEnterChecker] 유져가 껴있었습니다.상위로그는 유효합니다. CharName=%s\n", m_pActor->GetUserSession()->GetCharacterName() );
|
|
}
|
|
} |