Skip to content
This repository was archived by the owner on Dec 10, 2025. It is now read-only.

Commit d4b5e5d

Browse files
committed
feat: implement AFK state management and update related packet handling
1 parent d61ed8e commit d4b5e5d

File tree

14 files changed

+75
-13
lines changed

14 files changed

+75
-13
lines changed

surf-cloud-api/surf-cloud-api-common/src/main/kotlin/dev/slne/surf/cloud/api/common/player/CloudPlayer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ interface CloudPlayer : Audience, OfflineCloudPlayer { // TODO: conversation but
3939
*/
4040
val connected get() = connectedToProxy || connectedToServer
4141

42-
suspend fun isAfk(): Boolean
42+
fun isAfk(): Boolean
4343
suspend fun currentSessionDuration(): Duration
4444

4545
/**

surf-cloud-bukkit/src/main/kotlin/dev/slne/surf/cloud/bukkit/CloudBukkitInstance.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import dev.slne.surf.cloud.api.common.CloudInstance
55
import dev.slne.surf.cloud.bukkit.command.PaperCommandManager
66
import dev.slne.surf.cloud.bukkit.listener.ListenerManager
77
import dev.slne.surf.cloud.bukkit.netty.BukkitNettyManager
8+
import dev.slne.surf.cloud.bukkit.placeholder.CloudPlaceholderExpansion
89
import dev.slne.surf.cloud.bukkit.processor.BukkitListenerProcessor
910
import dev.slne.surf.cloud.core.client.ClientCommonCloudInstance
1011
import dev.slne.surf.cloud.core.common.coreCloudInstance
1112
import dev.slne.surf.cloud.core.common.util.bean
1213
import dev.slne.surf.cloud.core.common.util.checkInstantiationByServiceLoader
14+
import dev.slne.surf.surfapi.bukkit.api.hook.papi.papiHook
1315

1416
@AutoService(CloudInstance::class)
1517
class CloudBukkitInstance : ClientCommonCloudInstance(BukkitNettyManager) {
@@ -23,12 +25,15 @@ class CloudBukkitInstance : ClientCommonCloudInstance(BukkitNettyManager) {
2325
PaperCommandManager.registerCommands()
2426
bean<BukkitListenerProcessor>().registerListeners()
2527
ListenerManager.registerListeners()
28+
29+
papiHook.register(CloudPlaceholderExpansion)
2630
}
2731

2832
override suspend fun onDisable() {
2933
super.onDisable()
3034

3135
ListenerManager.unregisterListeners()
36+
papiHook.unregister(CloudPlaceholderExpansion)
3237
}
3338
}
3439

surf-cloud-bukkit/src/main/kotlin/dev/slne/surf/cloud/bukkit/listener/player/PlayerAfkListener.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package dev.slne.surf.cloud.bukkit.listener.player
22

33
import dev.slne.surf.cloud.api.client.netty.packet.fireAndForget
4-
import dev.slne.surf.cloud.core.common.netty.network.protocol.running.ServerboundUpdateAFKState
4+
import dev.slne.surf.cloud.core.common.netty.network.protocol.running.UpdateAFKStatePacket
55
import dev.slne.surf.surfapi.core.api.util.mutableObject2BooleanMapOf
66
import dev.slne.surf.surfapi.core.api.util.mutableObject2LongMapOf
77
import org.bukkit.event.EventHandler
@@ -57,6 +57,6 @@ class PlayerAfkListener : Listener {
5757
}
5858

5959
private fun broadcastChange(uuid: UUID, isAfk: Boolean) {
60-
ServerboundUpdateAFKState(uuid, isAfk).fireAndForget()
60+
UpdateAFKStatePacket(uuid, isAfk).fireAndForget()
6161
}
6262
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dev.slne.surf.cloud.bukkit.placeholder
2+
3+
import dev.slne.surf.cloud.api.common.util.objectListOf
4+
import dev.slne.surf.cloud.bukkit.placeholder.afk.CloudAfkPlaceholder
5+
import dev.slne.surf.surfapi.bukkit.api.hook.papi.expansion.PapiExpansion
6+
7+
object CloudPlaceholderExpansion : PapiExpansion(
8+
"cloud",
9+
objectListOf(CloudAfkPlaceholder)
10+
)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package dev.slne.surf.cloud.bukkit.placeholder.afk
2+
3+
import dev.slne.surf.cloud.api.common.player.CloudPlayerManager
4+
import dev.slne.surf.surfapi.bukkit.api.hook.papi.expansion.PapiPlaceholder
5+
import dev.slne.surf.surfapi.core.api.messages.adventure.buildText
6+
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer
7+
import org.bukkit.OfflinePlayer
8+
9+
object CloudAfkPlaceholder : PapiPlaceholder("afk") {
10+
private const val NOT_AFK_STRING = ""
11+
private val afkString = LegacyComponentSerializer.legacySection().serialize(buildText {
12+
spacer("[")
13+
text("💤")
14+
spacer("]")
15+
})
16+
17+
override fun parse(
18+
player: OfflinePlayer,
19+
args: List<String>
20+
): String? {
21+
val cloudPlayer = CloudPlayerManager.getPlayer(player.uniqueId) ?: return null
22+
if (!cloudPlayer.isAfk()) {
23+
return NOT_AFK_STRING
24+
}
25+
26+
return afkString
27+
}
28+
}

surf-cloud-core/surf-cloud-core-client/src/main/kotlin/dev/slne/surf/cloud/core/client/netty/network/ClientRunningPacketListenerImpl.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import dev.slne.surf.cloud.api.common.netty.packet.NettyPacket
66
import dev.slne.surf.cloud.api.common.netty.packet.NettyPacketInfo
77
import dev.slne.surf.cloud.api.common.server.UserListImpl
88
import dev.slne.surf.cloud.core.client.netty.ClientNettyClientImpl
9+
import dev.slne.surf.cloud.core.client.player.ClientCloudPlayerImpl
910
import dev.slne.surf.cloud.core.client.player.commonPlayerManagerImpl
1011
import dev.slne.surf.cloud.core.client.server.serverManagerImpl
1112
import dev.slne.surf.cloud.core.client.util.getOrLoadUser
@@ -247,6 +248,13 @@ class ClientRunningPacketListenerImpl(
247248
})
248249
}
249250

251+
override fun handleUpdateAFKState(packet: UpdateAFKStatePacket) {
252+
playerManagerImpl.getPlayer(packet.uuid)?.let { player ->
253+
require(player is ClientCloudPlayerImpl<*>) { "Player $player is not a client player" }
254+
player.afk = packet.isAfk
255+
}
256+
}
257+
250258
override fun handlePacket(packet: NettyPacket) {
251259
val listeners = NettyListenerRegistry.getListeners(packet.javaClass) ?: return
252260
if (listeners.isEmpty()) return

surf-cloud-core/surf-cloud-core-client/src/main/kotlin/dev/slne/surf/cloud/core/client/player/ClientCloudPlayerImpl.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ abstract class ClientCloudPlayerImpl<PlatformPlayer : Audience>(uuid: UUID, name
4949

5050
@Volatile
5151
var serverUid: Long? = null
52+
53+
@Volatile
54+
var afk: Boolean = false
55+
5256
override val connectedToProxy get() = proxyServerUid != null
5357

5458
override val connectedToServer get() = serverUid != null
@@ -76,8 +80,8 @@ abstract class ClientCloudPlayerImpl<PlatformPlayer : Audience>(uuid: UUID, name
7680
return request<FirstSeen>(DataRequestType.FIRST_SEEN).firstSeen
7781
}
7882

79-
override suspend fun isAfk(): Boolean {
80-
return request<IsAFK>(DataRequestType.IS_AFK).isAfk
83+
override fun isAfk(): Boolean {
84+
return afk
8185
}
8286

8387
override suspend fun currentSessionDuration(): Duration {

surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/netty/network/ConnectionImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ class ConnectionImpl(
345345
is TeleportPlayerToPlayerPacket -> listener.handleTeleportPlayerToPlayer(msg)
346346
is ServerboundShutdownServerPacket -> listener.handleShutdownServer(msg)
347347
is ServerboundRequestPlayerDataPacket -> listener.handleRequestPlayerData(msg)
348-
is ServerboundUpdateAFKState -> listener.handleUpdateAFKState(msg)
348+
is UpdateAFKStatePacket -> listener.handleUpdateAFKState(msg)
349349

350350
else -> listener.handlePacket(msg) // handle other packets
351351
}
@@ -471,6 +471,7 @@ class ConnectionImpl(
471471
)
472472
is ClientboundTriggerShutdownPacket -> listener.handleTriggerShutdown(msg)
473473
is ClientboundBatchUpdateServer -> listener.handleBatchUpdateServer(msg)
474+
is UpdateAFKStatePacket -> listener.handleUpdateAFKState(msg)
474475

475476
else -> listener.handlePacket(msg)
476477
}

surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/netty/network/protocol/running/RunningClientPacketListener.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,7 @@ interface RunningClientPacketListener : ClientCommonPacketListener {
7575

7676
suspend fun handleBatchUpdateServer(packet: ClientboundBatchUpdateServer)
7777

78+
fun handleUpdateAFKState(packet: UpdateAFKStatePacket)
79+
7880
fun handlePacket(packet: NettyPacket)
7981
}

surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/netty/network/protocol/running/RunningProtocols.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package dev.slne.surf.cloud.core.common.netty.network.protocol.running
22

33
import dev.slne.surf.cloud.api.common.netty.network.ConnectionProtocol
44
import dev.slne.surf.cloud.api.common.netty.packet.createCodec
5-
import dev.slne.surf.cloud.api.common.netty.packet.findPacketCodec
65
import dev.slne.surf.cloud.api.common.netty.protocol.buffer.SurfByteBuf
76
import dev.slne.surf.cloud.core.common.netty.network.protocol.ProtocolInfoBuilder
87
import dev.slne.surf.cloud.core.common.netty.network.protocol.common.*
@@ -56,6 +55,7 @@ object RunningProtocols {
5655
.addPacket(PullPlayersToGroupResponsePacket::class.createCodec())
5756
.addPacket(SilentDisconnectPlayerPacket::class.createCodec())
5857
.addPacket(TeleportPlayerToPlayerPacket::class.createCodec())
58+
.addPacket(UpdateAFKStatePacket::class.createCodec())
5959
}
6060

6161
val CLIENTBOUND by lazy { CLIENTBOUND_TEMPLATE.freeze().bind(::SurfByteBuf) }
@@ -100,7 +100,7 @@ object RunningProtocols {
100100
.addPacket(ServerboundShutdownServerPacket.STREAM_CODEC)
101101
.addPacket(RequestOfflineDisplayNamePacket.STREAM_CODEC)
102102
.addPacket(ServerboundRequestPlayerDataPacket.STREAM_CODEC)
103-
.addPacket(ServerboundUpdateAFKState::class.createCodec())
103+
.addPacket(UpdateAFKStatePacket::class.createCodec())
104104
.addPacket(ServerboundPullPlayersToGroupPacket::class.createCodec())
105105
.addPacket(SilentDisconnectPlayerPacket::class.createCodec())
106106
.addPacket(TeleportPlayerToPlayerPacket::class.createCodec())

0 commit comments

Comments
 (0)