Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

afk模块行为 #6

Closed
mcjunshi opened this issue Feb 26, 2024 · 5 comments
Closed

afk模块行为 #6

mcjunshi opened this issue Feb 26, 2024 · 5 comments

Comments

@mcjunshi
Copy link

afk模块 为什么使用定时afk玩家所有 而不是对每个玩家挂机倒计时?
预期行为:设置一个afk超时时间,玩家挂机超过这个时间就算afk
现在行为:设置一个cron表达式,玩家在两次cron运行中挂机算afk

@mcjunshi
Copy link
Author

我的想法:如if (System.nanoTime()/1000000 - player.getLastActionTime() > 600000) afk_player.fuji$setAfk(true);这样
awa

@sakurawald
Copy link
Owner

sakurawald commented Feb 26, 2024

我的想法:如if (System.nanoTime()/1000000 - player.getLastActionTime() > 600000) afk_player.fuji$setAfk(true);这样 awa

实际上, AfkChecker是一个全局的定时器. 它的检查周期是全局的, 但是根据每个玩家有一个lastActionTime. 换句话说, 如果AfkChecker的检查间隔为3分钟, 那么当1个玩家被标记为已挂机时, 该玩家的实际离开时间可能为3~6分钟.

之所以使用单个全局的AfkChecker, 并且使用一个较大的时间间隔. 是为了性能考虑.
AfkChecker实际上并不判断玩家是否处于挂机状态, 而只是简单地比较该玩家距离上次活动的时间差.
而当玩家发送活动封包时, 也只是简单地更新该时间戳.

这个设计和很多现成的方案相异. 当然, 使用你所提到的方案是更符合直觉的.

@mcjunshi
Copy link
Author

我的想法:如if (System.nanoTime()/1000000 - player.getLastActionTime() > 600000) afk_player.fuji$setAfk(true);这样 awa

实际上, AfkChecker是一个全局的定时器. 它的检查周期是全局的, 但是根据每个玩家有一个lastActionTime. 换句话说, 如果AfkChecker的检查间隔为3分钟, 那么当1个玩家被标记为已挂机时, 该玩家的实际离开时间可能为3~6分钟.

之所以使用单个全局的AfkChecker, 并且使用一个较大的时间间隔. 是为了性能考虑. AfkChecker实际上并不判断玩家是否处于挂机状态, 而只是简单地比较该玩家距离上次活动的时间差. 而当玩家发送活动封包时, 也只是简单地更新该时间戳.

这个设计和很多现成的方案相异. 当然, 使用你所提到的方案是更符合直觉的.

哦这样啊,但是还有一个问题是getLastActionTime是不会记录持续的移动的,所以当服里有几个人在划船/跑图的时候会突然几个人一起afk这样( )有点怪hh

@sakurawald
Copy link
Owner

我的想法:如if (System.nanoTime()/1000000 - player.getLastActionTime() > 600000) afk_player.fuji$setAfk(true);这样 awa

实际上, AfkChecker是一个全局的定时器. 它的检查周期是全局的, 但是根据每个玩家有一个lastActionTime. 换句话说, 如果AfkChecker的检查间隔为3分钟, 那么当1个玩家被标记为已挂机时, 该玩家的实际离开时间可能为3~6分钟.
之所以使用单个全局的AfkChecker, 并且使用一个较大的时间间隔. 是为了性能考虑. AfkChecker实际上并不判断玩家是否处于挂机状态, 而只是简单地比较该玩家距离上次活动的时间差. 而当玩家发送活动封包时, 也只是简单地更新该时间戳.
这个设计和很多现成的方案相异. 当然, 使用你所提到的方案是更符合直觉的.

哦这样啊,但是还有一个问题是getLastActionTime是不会记录持续的移动的,所以当服里有几个人在划船/跑图的时候会突然几个人一起afk这样( )有点怪hh

实际上, CMI的Afk检测模块也有类似的行为, 同时将多个已挂机的玩家进行标记. 而不是逐个进行标记.
如果需要的话, 你可以改成更精准的方式. 目前这个方法的实现比较简单, 但不是非常准确.

@sakurawald
Copy link
Owner

我的想法:如if (System.nanoTime()/1000000 - player.getLastActionTime() > 600000) afk_player.fuji$setAfk(true);这样 awa

实际上, AfkChecker是一个全局的定时器. 它的检查周期是全局的, 但是根据每个玩家有一个lastActionTime. 换句话说, 如果AfkChecker的检查间隔为3分钟, 那么当1个玩家被标记为已挂机时, 该玩家的实际离开时间可能为3~6分钟.
之所以使用单个全局的AfkChecker, 并且使用一个较大的时间间隔. 是为了性能考虑. AfkChecker实际上并不判断玩家是否处于挂机状态, 而只是简单地比较该玩家距离上次活动的时间差. 而当玩家发送活动封包时, 也只是简单地更新该时间戳.
这个设计和很多现成的方案相异. 当然, 使用你所提到的方案是更符合直觉的.

哦这样啊,但是还有一个问题是getLastActionTime是不会记录持续的移动的,所以当服里有几个人在划船/跑图的时候会突然几个人一起afk这样( )有点怪hh

Since fuji v1.4.7, we introduce a detection function to check the movement packet, so this should be fixed, and behaves more naturally.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants