62 lines
1.8 KiB
Kotlin
62 lines
1.8 KiB
Kotlin
/*
|
|||
|
|
* Copyright © 2026 RTAkland
|
||
|
|
* Author: RTAkland
|
||
|
|
* Date: 2026/9/7
|
||
|
|
*/
|
||
|
|
|
||
|
|
|
||
|
|
package test
|
||
|
|
|
||
|
|
import cn.rtast.libmc.primitives.FixedBitSet20
|
||
|
|
import cn.rtast.libmc.primitives.createFixedBitSet20
|
||
|
|
import cn.rtast.libmc.stream.BytesBuffer
|
||
|
|
import kotlin.uuid.Uuid
|
||
|
|
|
||
|
|
class ClientChatTracker {
|
||
|
|
private val lastSeenQueue = ArrayDeque<ByteArray>(20)
|
||
|
|
var pendingMessageCount: Int = 0
|
||
|
|
private set
|
||
|
|
|
||
|
|
fun onReceivePlayerChat(signature: ByteArray?) {
|
||
|
|
if (signature == null || signature.size != 256) return
|
||
|
|
if (lastSeenQueue.size >= 20) lastSeenQueue.removeFirst()
|
||
|
|
lastSeenQueue.addLast(signature)
|
||
|
|
pendingMessageCount++
|
||
|
|
}
|
||
|
|
|
||
|
|
fun prepareForOutgoingMessage(): ChatStateSnapshot {
|
||
|
|
val signatures = lastSeenQueue.toList()
|
||
|
|
val count = pendingMessageCount
|
||
|
|
pendingMessageCount = 0
|
||
|
|
return ChatStateSnapshot(signatures, count)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
data class ChatStateSnapshot(val lastSeenSignatures: List<ByteArray>, val messageCount: Int)
|
||
|
|
|
||
|
|
fun createAcknowledgedBitSet(lastSeenSignatures: List<ByteArray>): FixedBitSet20 {
|
||
|
|
val bitSet = createFixedBitSet20()
|
||
|
|
for (i in lastSeenSignatures.indices) {
|
||
|
|
if (i >= 20) break
|
||
|
|
bitSet[i] = true
|
||
|
|
}
|
||
|
|
return bitSet
|
||
|
|
}
|
||
|
|
|
||
|
|
object ChatPacketUtils {
|
||
|
|
fun computeByteArrayHashCode(bytes: ByteArray): Int {
|
||
|
|
var result = 1
|
||
|
|
for (element in bytes) result = 31 * result + element.toInt()
|
||
|
|
return result
|
||
|
|
}
|
||
|
|
|
||
|
|
fun computePacketChecksum(lastSeenSignatures: List<ByteArray>): Byte {
|
||
|
|
var combinedHash = 1
|
||
|
|
for (sig in lastSeenSignatures) {
|
||
|
|
val sigHash = computeByteArrayHashCode(sig)
|
||
|
|
combinedHash = 31 * combinedHash + sigHash
|
||
|
|
}
|
||
|
|
val resultByte = combinedHash.toByte()
|
||
|
|
return if (resultByte == 0.toByte()) 1.toByte() else resultByte
|
||
|
|
}
|
||
|
|
}
|