aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/event/diana/BurrowWarpHelper.kt
blob: 949b3c4e3d304b01716d894baf24ef3bc6374a49 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package at.hannibal2.skyhanni.features.event.diana

import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.utils.LocationUtils
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.LorenzUtils.sorted
import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.OSUtils.isActive
import net.minecraft.client.Minecraft
import net.minecraft.client.settings.KeyBinding
import net.minecraftforge.fml.client.registry.ClientRegistry
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import net.minecraftforge.fml.common.gameevent.TickEvent
import org.lwjgl.input.Keyboard

class BurrowWarpHelper {

    private val keyBinding = KeyBinding(
        "Nearest Burrow Warp",
        Keyboard.KEY_X,
        "SkyHanni"
    )

    private var lastWarpTime = 0L
    private var lastWarp: WarpPoint? = null

    init {
        ClientRegistry.registerKeyBinding(keyBinding)
    }

    @SubscribeEvent
    fun onClientTick(event: TickEvent.ClientTickEvent) {
        if (keyBinding.isActive()) {
            currentWarp?.let {
                if (System.currentTimeMillis() > lastWarpTime + 5_000) {
                    val thePlayer = Minecraft.getMinecraft().thePlayer
                    thePlayer.sendChatMessage("/warp " + currentWarp?.name)
                    lastWarp = currentWarp
                    lastWarpTime = System.currentTimeMillis()
                }
            }
        }
    }

    @SubscribeEvent
    fun onStatusBar(event: LorenzChatEvent) {
        if (!LorenzUtils.inSkyBlock) return

        if (event.message == "§cYou haven't unlocked this fast travel destination!") {
            val time = System.currentTimeMillis() - lastWarpTime
            if (time < 1_000) {
                lastWarp?.let {
                    it.enabled = false
                    LorenzUtils.chat(
                        "§e[SkyHanni] Detected not having access to warp point §b${it.displayName}§e!\n" +
                                "§e[SkyHanni] Use §c/shresetburrowwarps §eonce you have activated this travel scroll."
                    )
                    lastWarp = null
                    currentWarp = null
                }
            }
        }

    }

    companion object {
        var currentWarp: WarpPoint? = null

        fun shouldUseWarps(target: LorenzVec) {
            val playerLocation = LocationUtils.playerLocation()
            val warpPoint = getNearestWarpPoint(target)

            val playerDistance = playerLocation.distance(target)
            val warpDistance = warpPoint.distance(target)
//            println(" ")
//            println("shouldUseWarps")
//            println("playerDistance: ${playerDistance.round(1)}")
//            println("warpDistance: ${warpDistance.round(1)}")
            val difference = playerDistance - warpDistance
            currentWarp = if (difference > 10) {
                warpPoint
            } else {
                null
            }
        }

        private fun getNearestWarpPoint(location: LorenzVec): WarpPoint {
            val map = WarpPoint.values().filter { it.enabled }.map { it to it.distance(location) }
            return map.sorted().first().first
        }

        fun resetDisabledWarps() {
            WarpPoint.values().forEach { it.enabled = true }
            LorenzUtils.chat("§e[SkyHanni] Reset disabled burrow warps.")
        }
    }

    enum class WarpPoint(
        val displayName: String,
        private val location: LorenzVec,
        private val extraBlocks: Int,
        var enabled: Boolean = true,
    ) {
        HUB("Hub", LorenzVec(-3, 70, -70), 2),
        CASTLE("Castle", LorenzVec(-250, 130, 45), 10),

        //        CRYPT("Crypt", LorenzVec(-190, 74, -88), 25),
        DA("Dark Auction", LorenzVec(91, 74, 173), 2),
        MUSEUM("Museum", LorenzVec(-75, 76, 81), 2),
        ;

        fun distance(other: LorenzVec): Double = other.distance(location) + extraBlocks
    }
}