aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/com/dulkirfabric/features/AotvHighlight.kt
blob: 5b1a81d19e17802301ad9e02822c9a81a9ff32d2 (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
package com.dulkirfabric.features

import com.dulkirfabric.DulkirModFabric.mc
import com.dulkirfabric.config.DulkirConfig
import com.dulkirfabric.events.ClientTickEvent
import com.dulkirfabric.events.LongUpdateEvent
import com.dulkirfabric.events.WorldRenderLastEvent
import com.dulkirfabric.util.TextUtils
import com.dulkirfabric.util.render.WorldRenderUtils
import meteordevelopment.orbit.EventHandler
import net.minecraft.client.MinecraftClient
import net.minecraft.client.util.InputUtil
import net.minecraft.component.DataComponentTypes
import net.minecraft.entity.Entity
import net.minecraft.nbt.NbtString
import net.minecraft.util.hit.BlockHitResult
import net.minecraft.util.hit.HitResult
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Vec3d
import net.minecraft.world.RaycastContext
import org.lwjgl.glfw.GLFW
import java.awt.Color

object AotvHighlight {
    private var heldItemID = ""

    @EventHandler
    fun onTick(event: ClientTickEvent) {
        heldItemID = getHeldItemID()
    }

    fun getHeldItemID(): String {
        val stack = mc.player?.mainHandStack ?: return ""
        val tag = stack.get(DataComponentTypes.CUSTOM_DATA)?.nbt ?: return ""
        val id = tag.get("id") as? NbtString ?: return ""
        return id.asString()
    }

    @EventHandler
    fun onWorldRenderLast(event: WorldRenderLastEvent) {
        if (!DulkirConfig.configOptions.showEtherwarpPreview) return
        // check that holding aotv
        if (heldItemID != "ASPECT_OF_THE_VOID") return
        val handle = MinecraftClient.getInstance().window.handle
        if (!InputUtil.isKeyPressed(handle, GLFW.GLFW_KEY_LEFT_SHIFT) || mc.currentScreen != null) return

        // Find the targeted block with a range of 60.9
        val entity = mc.cameraEntity
        if (mc.player == null) return
        val blockHit = raycast(entity!!, 60.9, mc.tickDelta)
        if (blockHit.type != HitResult.Type.BLOCK) return
        val pos: BlockPos = (blockHit as BlockHitResult).blockPos
        if (!isValidTeleportLocation(pos)) return

        // if found display box
        WorldRenderUtils.drawBox(event.context, pos.x.toDouble(), pos.y.toDouble(), pos.z.toDouble(), 1.0, 1.0, 1.0,
            Color(DulkirConfig.configOptions.etherwarpPreviewColor, true), false)
    }

    private fun isValidTeleportLocation(pos: BlockPos): Boolean {
        // TODO: Implement this (LOTS OF CASES, seems annoying)
        return true
    }

    private fun raycast(entity: Entity, maxDistance: Double, tickDelta: Float): HitResult {
        // 1.7 if not crouch, 1.54 if crouch
        val crouching = mc.player!!.isSneaking
        val vec3d: Vec3d = mc.player!!.pos.add(0.0, if (crouching) 1.54 else 1.7, 0.0)
        val vec3d2: Vec3d = entity.getRotationVec(tickDelta)
        val vec3d3 = vec3d.add(vec3d2.x * maxDistance, vec3d2.y * maxDistance, vec3d2.z * maxDistance)
        return mc.world!!
            .raycast(
                RaycastContext(
                    vec3d,
                    vec3d3,
                    RaycastContext.ShapeType.OUTLINE,
                    RaycastContext.FluidHandling.ANY,
                    entity
                )
            )
    }

    private fun err(): Boolean {
        TextUtils.info("§6Error in getting block info for AOTV highlight, please report.")
        return true
    }
}