1
0

CheckBlockInteractionsRate() fixed & enabled

This commit is contained in:
Tiger Wang 2014-03-01 21:24:36 +00:00
parent e2cbebe522
commit c05a1db88d
4 changed files with 23 additions and 65 deletions

View File

@ -52,6 +52,9 @@
/** Maximum number of explosions to send this tick, server will start dropping if exceeded */ /** Maximum number of explosions to send this tick, server will start dropping if exceeded */
#define MAX_EXPLOSIONS_PER_TICK 20 #define MAX_EXPLOSIONS_PER_TICK 20
/** Maximum number of block change interactions a player can perform per tick - exceeding this causes a kick */
#define MAX_BLOCK_CHANGE_INTERACTIONS 20
/** How many ticks before the socket is closed after the client is destroyed (#31) */ /** How many ticks before the socket is closed after the client is destroyed (#31) */
static const int TICKS_BEFORE_CLOSE = 20; static const int TICKS_BEFORE_CLOSE = 20;
@ -687,6 +690,14 @@ void cClientHandle::HandleLeftClick(int a_BlockX, int a_BlockY, int a_BlockZ, eB
a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_Status a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_Status
); );
m_NumBlockChangeInteractionsThisTick++;
if (!CheckBlockInteractionsRate())
{
Kick("Too many blocks were destroyed per unit time - hacked client?");
return;
}
cPluginManager * PlgMgr = cRoot::Get()->GetPluginManager(); cPluginManager * PlgMgr = cRoot::Get()->GetPluginManager();
if (PlgMgr->CallHookPlayerLeftClick(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_Status)) if (PlgMgr->CallHookPlayerLeftClick(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_Status))
{ {
@ -694,12 +705,6 @@ void cClientHandle::HandleLeftClick(int a_BlockX, int a_BlockY, int a_BlockZ, eB
m_Player->GetWorld()->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, m_Player); m_Player->GetWorld()->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, m_Player);
return; return;
} }
if (!CheckBlockInteractionsRate())
{
// Too many interactions per second, simply ignore. Probably a hacked client, so don't even send bak the block
return;
}
switch (a_Status) switch (a_Status)
{ {
@ -924,7 +929,7 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, e
if (PlgMgr->CallHookPlayerRightClick(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ)) if (PlgMgr->CallHookPlayerRightClick(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ))
{ {
// A plugin doesn't agree with the action, replace the block on the client and quit: // A plugin doesn't agree with the action, replace the block on the client and quit:
if (a_BlockFace > -1) if (a_BlockFace > BLOCK_FACE_NONE)
{ {
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace); AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
m_Player->GetWorld()->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, m_Player); m_Player->GetWorld()->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, m_Player);
@ -934,7 +939,7 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, e
if (!CheckBlockInteractionsRate()) if (!CheckBlockInteractionsRate())
{ {
LOGD("Too many block interactions, aborting placement"); Kick("Too many blocks were destroyed per unit time - hacked client?");
return; return;
} }
@ -1613,28 +1618,12 @@ bool cClientHandle::CheckBlockInteractionsRate(void)
{ {
ASSERT(m_Player != NULL); ASSERT(m_Player != NULL);
ASSERT(m_Player->GetWorld() != NULL); ASSERT(m_Player->GetWorld() != NULL);
/*
// TODO: _X 2012_11_01: This needs a total re-thinking and rewriting if (m_NumBlockChangeInteractionsThisTick > MAX_BLOCK_CHANGE_INTERACTIONS)
int LastActionCnt = m_Player->GetLastBlockActionCnt();
if ((m_Player->GetWorld()->GetTime() - m_Player->GetLastBlockActionTime()) < 0.1)
{ {
// Limit the number of block interactions per tick return false;
m_Player->SetLastBlockActionTime(); //Player tried to interact with a block. Reset last block interation time.
m_Player->SetLastBlockActionCnt(LastActionCnt + 1);
if (m_Player->GetLastBlockActionCnt() > MAXBLOCKCHANGEINTERACTIONS)
{
// Kick if more than MAXBLOCKCHANGEINTERACTIONS per tick
LOGWARN("Player %s tried to interact with a block too quickly! (could indicate bot) Was Kicked.", m_Username.c_str());
Kick("You're a baaaaaad boy!");
return false;
}
} }
else
{
m_Player->SetLastBlockActionCnt(0); // Reset count
m_Player->SetLastBlockActionTime(); // Player tried to interact with a block. Reset last block interation time.
}
*/
return true; return true;
} }
@ -1707,8 +1696,9 @@ void cClientHandle::Tick(float a_Dt)
} }
} }
// Reset explosion counter: // Reset explosion & block change counters:
m_NumExplosionsThisTick = 0; m_NumExplosionsThisTick = 0;
m_NumBlockChangeInteractionsThisTick = 0;
} }

View File

@ -46,7 +46,6 @@ class cClientHandle : // tolua_export
public cSocketThreads::cCallback public cSocketThreads::cCallback
{ // tolua_export { // tolua_export
public: public:
static const int MAXBLOCKCHANGEINTERACTIONS = 20; // 5 didn't help, 10 still doesn't work in Creative, 20 seems to have done the trick
#if defined(ANDROID_NDK) #if defined(ANDROID_NDK)
static const int DEFAULT_VIEW_DISTANCE = 4; // The default ViewDistance (used when no value is set in Settings.ini) static const int DEFAULT_VIEW_DISTANCE = 4; // The default ViewDistance (used when no value is set in Settings.ini)
@ -319,6 +318,9 @@ private:
/** Number of explosions sent this tick */ /** Number of explosions sent this tick */
int m_NumExplosionsThisTick; int m_NumExplosionsThisTick;
/** Number of place or break interactions this tick */
int m_NumBlockChangeInteractionsThisTick;
static int s_ClientCount; static int s_ClientCount;
int m_UniqueID; int m_UniqueID;

View File

@ -38,10 +38,7 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName)
, m_Inventory(*this) , m_Inventory(*this)
, m_CurrentWindow(NULL) , m_CurrentWindow(NULL)
, m_InventoryWindow(NULL) , m_InventoryWindow(NULL)
, m_TimeLastPickupCheck(0.f)
, m_Color('-') , m_Color('-')
, m_LastBlockActionTime(0)
, m_LastBlockActionCnt(0)
, m_GameMode(eGameMode_NotSet) , m_GameMode(eGameMode_NotSet)
, m_IP("") , m_IP("")
, m_ClientHandle(a_Client) , m_ClientHandle(a_Client)
@ -79,7 +76,6 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName)
m_LastPlayerListTime = t1.GetNowTime(); m_LastPlayerListTime = t1.GetNowTime();
m_TimeLastTeleportPacket = 0; m_TimeLastTeleportPacket = 0;
m_TimeLastPickupCheck = 0;
m_PlayerName = a_PlayerName; m_PlayerName = a_PlayerName;
m_bDirtyPosition = true; // So chunks are streamed to player at spawn m_bDirtyPosition = true; // So chunks are streamed to player at spawn
@ -1055,27 +1051,6 @@ void cPlayer::CloseWindowIfID(char a_WindowID, bool a_CanRefuse)
void cPlayer::SetLastBlockActionTime()
{
if (m_World != NULL)
{
m_LastBlockActionTime = m_World->GetWorldAge() / 20.0f;
}
}
void cPlayer::SetLastBlockActionCnt( int a_LastBlockActionCnt )
{
m_LastBlockActionCnt = a_LastBlockActionCnt;
}
void cPlayer::SetGameMode(eGameMode a_GameMode) void cPlayer::SetGameMode(eGameMode a_GameMode)
{ {
if ((a_GameMode < gmMin) || (a_GameMode >= gmMax)) if ((a_GameMode < gmMin) || (a_GameMode >= gmMax))

View File

@ -50,7 +50,7 @@ public:
/// Returns the curently equipped weapon; empty item if none /// Returns the curently equipped weapon; empty item if none
virtual cItem GetEquippedWeapon(void) const override { return m_Inventory.GetEquippedItem(); } virtual cItem GetEquippedWeapon(void) const override { return m_Inventory.GetEquippedItem(); }
/// Returns the currently equipped helmet; empty item if nonte /// Returns the currently equipped helmet; empty item if none
virtual cItem GetEquippedHelmet(void) const override { return m_Inventory.GetEquippedHelmet(); } virtual cItem GetEquippedHelmet(void) const override { return m_Inventory.GetEquippedHelmet(); }
/// Returns the currently equipped chestplate; empty item if none /// Returns the currently equipped chestplate; empty item if none
@ -165,11 +165,6 @@ public:
// tolua_end // tolua_end
void SetIP(const AString & a_IP); void SetIP(const AString & a_IP);
float GetLastBlockActionTime() { return m_LastBlockActionTime; }
int GetLastBlockActionCnt() { return m_LastBlockActionCnt; }
void SetLastBlockActionCnt( int );
void SetLastBlockActionTime();
// Sets the current gamemode, doesn't check validity, doesn't send update packets to client // Sets the current gamemode, doesn't check validity, doesn't send update packets to client
void LoginSetGameMode(eGameMode a_GameMode); void LoginSetGameMode(eGameMode a_GameMode);
@ -416,12 +411,8 @@ protected:
cWindow * m_CurrentWindow; cWindow * m_CurrentWindow;
cWindow * m_InventoryWindow; cWindow * m_InventoryWindow;
float m_TimeLastPickupCheck;
char m_Color; char m_Color;
float m_LastBlockActionTime;
int m_LastBlockActionCnt;
eGameMode m_GameMode; eGameMode m_GameMode;
AString m_IP; AString m_IP;