Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- object Decoder {
- var decoderListeners = List.empty[DecoderListener]
- val reconstructBuffer = MutableMap.empty[Int, Array[Byte]]
- def decode(packetType: Short, sequenceNumber: Int, data: Array[Byte]) {
- val packets = decodeRecursively(packetType, sequenceNumber, data)
- for (packet <- packets; listener <- listeners) {
- listener.packetReceived(packet)
- }
- }
- private def decodeRecursively(packetType: Short, sequenceNumber: Int, data: Array[Byte]): List[Packet] {
- if (packetType == 42) {
- List(HungerPacket(bytes))
- } else if (packetType == 43) {
- List(ReadClientMovePacket(bytes))
- } else if (packetType == 44) {
- val p1 = HungerPacket(bytes.take(12))
- val p2 = ReadClientMovePacket(bytes.drop(12))
- List(p1, p2)
- } else if (packetType == 45) {
- reconstructBuffer += sequenceNumber -> data
- if (reconstructBuffer.size == 10) {
- val bigBuffer = scala.collection.mutable.ArrayBuffer.empty[Byte]
- for (k <- 0 until packetTotal) {
- bigBuffer.appendAll(reconstructBuffer(k))
- }
- reconstructBuffer.clear()
- // split up somehow
- val b1 = bytes.take(12)
- val b2 = bytes.drop(12)
- decodeRecursively(42, 0, b1) ++
- decodeRecursively(43, 0, b2)
- } else {
- Nil // we don't have enough information yet
- }
- }
- }
- }
- trait DecoderListener {
- def packetReceived(packet: Packet): Unit
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement