CheckBlockInteractionsRate() fixed & enabled
This commit is contained in:
parent
e2cbebe522
commit
c05a1db88d
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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))
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user