aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/com/dulkirfabric/util/TablistUtils.kt
blob: b73134091fbed290bd2960abea4b71d1211d4e1e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.dulkirfabric.util

import com.dulkirfabric.DulkirModFabric.mc
import com.dulkirfabric.events.AreaChangeEvent
import com.dulkirfabric.events.LongUpdateEvent
import meteordevelopment.orbit.EventHandler
import net.minecraft.client.network.PlayerListEntry

object TablistUtils {
    var tablist: List<PlayerListEntry>? = null
    private val areaPattern = "Area: (.+)".toRegex()
    private val speedPattern = "^Speed: (.+)".toRegex()
    private val visitorPattern = "Visitors: \\((.+)\\)".toRegex()
    private val compostTimePattern = "Time Left: (.+)".toRegex()

    data class PersistentInfo(
        var area: String = "",
        var speed: String = "",
        var numVisitors: Int = 0,
        var nextVisitorTime: String = "",
        var compostTime: String = ""
    )

    var persistentInfo: PersistentInfo = PersistentInfo()

    @EventHandler
    fun onLongUpdate(event: LongUpdateEvent) {
        if (mc.player == null) return
        tablist = mc.inGameHud.playerListHud.collectPlayerEntries()
        updatePersistentData()
    }

    private fun updatePersistentData() {
        if (tablist == null) return
        tablist!!.forEach {
            val str = it.displayName?.string?.trim() ?: return@forEach
            areaPattern.find(str)?.let { result ->
                if (persistentInfo.area != result.groupValues[1]) {
                    AreaChangeEvent(result.groupValues[1], persistentInfo.area).post()
                    persistentInfo.area = result.groupValues[1]
                }
                return@forEach
            }

            speedPattern.matchEntire(str)?.let { result ->
                persistentInfo.speed = result.groupValues[1]
                return@forEach
            }

            visitorPattern.matchEntire(str)?.let { result ->
                persistentInfo.nextVisitorTime = result.groupValues[1]
                var index = tablist!!.indexOf(it) + 1
                var visitors = 0
                while (index < tablist!!.size && tablist!![index].displayName?.string != "" && visitors < 5) {
                    index++
                    visitors++
                }
                persistentInfo.numVisitors = visitors
                return@forEach
            }

            compostTimePattern.matchEntire(str)?.let { result ->
                persistentInfo.compostTime = result.groupValues[1]
                return@forEach
            }
        }
    }
}