Merge pull request #5521 from Abextm/afk-notify
idlenotifier: Correctly warn about AFK kicking
This commit is contained in:
@@ -60,10 +60,11 @@ import net.runelite.client.plugins.PluginDescriptor;
|
|||||||
)
|
)
|
||||||
public class IdleNotifierPlugin extends Plugin
|
public class IdleNotifierPlugin extends Plugin
|
||||||
{
|
{
|
||||||
private static final int LOGOUT_WARNING_AFTER_TICKS = 280 * 50; // 4 minutes and 40 seconds
|
// This must be more than 500 client ticks (10 seconds) before you get AFK kicked
|
||||||
private static final long LOGOUT_WARNING_AFTER_MILLIS = (long) (LOGOUT_WARNING_AFTER_TICKS * 0.6 * 1000);
|
private static final int LOGOUT_WARNING_CLIENT_TICKS = ((4 * 60) + 40) * 50;// 4 minutes and 40 seconds
|
||||||
private static final int LOGOUT_WARNING_AFTER_TICKS_IN_COMBAT = 1140 * 50; // 19 minutes
|
private static final int COMBAT_WARNING_MILLIS = 19 * 60 * 1000; // 19 minutes
|
||||||
private static final long LOGOUT_WARNING_AFTER_MILLIS_IN_COMBAT = (long) (LOGOUT_WARNING_AFTER_TICKS_IN_COMBAT * 0.6 * 1000);
|
private static final int COMBAT_WARNING_CLIENT_TICKS = COMBAT_WARNING_MILLIS / 20;
|
||||||
|
|
||||||
private static final int HIGHEST_MONSTER_ATTACK_SPEED = 8; // Except Scarab Mage, but they are with other monsters
|
private static final int HIGHEST_MONSTER_ATTACK_SPEED = 8; // Except Scarab Mage, but they are with other monsters
|
||||||
private static final Duration SIX_HOUR_LOGOUT_WARNING_AFTER_DURATION = Duration.ofMinutes(340);
|
private static final Duration SIX_HOUR_LOGOUT_WARNING_AFTER_DURATION = Duration.ofMinutes(340);
|
||||||
|
|
||||||
@@ -424,32 +425,40 @@ public class IdleNotifierPlugin extends Plugin
|
|||||||
|
|
||||||
private boolean checkIdleLogout()
|
private boolean checkIdleLogout()
|
||||||
{
|
{
|
||||||
final long mouseDiff = System.currentTimeMillis() - client.getMouseLastPressedMillis();
|
// Check clientside AFK first, because this is required for the server to disconnect you for being first
|
||||||
|
int idleClientTicks = client.getKeyboardIdleTicks();
|
||||||
if (mouseDiff > LOGOUT_WARNING_AFTER_MILLIS
|
if (client.getMouseIdleTicks() < idleClientTicks)
|
||||||
&& client.getKeyboardIdleTicks() > LOGOUT_WARNING_AFTER_TICKS)
|
|
||||||
{
|
{
|
||||||
if (lastCombatCountdown > 0)
|
idleClientTicks = client.getMouseIdleTicks();
|
||||||
{
|
|
||||||
if (mouseDiff > LOGOUT_WARNING_AFTER_MILLIS_IN_COMBAT
|
|
||||||
&& client.getKeyboardIdleTicks() > LOGOUT_WARNING_AFTER_TICKS_IN_COMBAT && notifyIdleLogout)
|
|
||||||
{
|
|
||||||
notifyIdleLogout = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (notifyIdleLogout)
|
|
||||||
{
|
|
||||||
notifyIdleLogout = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (idleClientTicks < LOGOUT_WARNING_CLIENT_TICKS)
|
||||||
{
|
{
|
||||||
notifyIdleLogout = true;
|
notifyIdleLogout = true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
// If we are not receiving hitsplats then we can be afk kicked
|
||||||
|
if (lastCombatCountdown <= 0)
|
||||||
|
{
|
||||||
|
boolean warn = notifyIdleLogout;
|
||||||
|
notifyIdleLogout = false;
|
||||||
|
return warn;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are in combat, so now we have to check for the timer that knocks you out of combat
|
||||||
|
// I think there are other conditions that I don't know about, because during testing I just didn't
|
||||||
|
// get removed from combat sometimes.
|
||||||
|
final long lastInteractionAgo = System.currentTimeMillis() - client.getMouseLastPressedMillis();
|
||||||
|
if (lastInteractionAgo < COMBAT_WARNING_MILLIS || client.getKeyboardIdleTicks() < COMBAT_WARNING_CLIENT_TICKS)
|
||||||
|
{
|
||||||
|
notifyIdleLogout = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean warn = notifyIdleLogout;
|
||||||
|
notifyIdleLogout = false;
|
||||||
|
return warn;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean check6hrLogout()
|
private boolean check6hrLogout()
|
||||||
|
|||||||
@@ -231,8 +231,8 @@ public class IdleNotifierPluginTest
|
|||||||
@Test
|
@Test
|
||||||
public void checkCombatLogoutIdle()
|
public void checkCombatLogoutIdle()
|
||||||
{
|
{
|
||||||
// Player is idle
|
// Player is idle
|
||||||
when(client.getMouseLastPressedMillis()).thenReturn(System.currentTimeMillis() - 300_000L);
|
when(client.getMouseIdleTicks()).thenReturn(80_000);
|
||||||
|
|
||||||
// But player is being damaged (is in combat)
|
// But player is being damaged (is in combat)
|
||||||
final HitsplatApplied hitsplatApplied = new HitsplatApplied();
|
final HitsplatApplied hitsplatApplied = new HitsplatApplied();
|
||||||
@@ -242,4 +242,18 @@ public class IdleNotifierPluginTest
|
|||||||
plugin.onGameTick(new GameTick());
|
plugin.onGameTick(new GameTick());
|
||||||
verify(notifier, times(0)).notify(any());
|
verify(notifier, times(0)).notify(any());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void doubleNotifyOnMouseReset()
|
||||||
|
{
|
||||||
|
// Player is idle, but in combat so the idle packet is getting set repeatedly
|
||||||
|
// make sure we are not notifying
|
||||||
|
|
||||||
|
when(client.getKeyboardIdleTicks()).thenReturn(80_000);
|
||||||
|
when(client.getMouseIdleTicks()).thenReturn(14_500);
|
||||||
|
|
||||||
|
plugin.onGameTick(new GameTick());
|
||||||
|
plugin.onGameTick(new GameTick());
|
||||||
|
verify(notifier, times(1)).notify(any());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user