Added offline monitor v2
The initial offline check is offloaded to a separate thread to not impact the game thread. The offline loop still executes on the game thread because we want it blocking on the game thread, because that's the point of the featu~~.~~
~~After !3828 (merged) gets merged maybe we will need to force isLoggingOut and isSaving to false in the Player class to ensure all players get saved. Either they are logging out already in which case they will be skipped because they have already been saved once they are logged out, or they will be logged out that same tick as part of the mass logout from the mass unloadPlayers which calls unregisterPlayer which calls player.logout().
Edited by ipkpjersi