aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/github/moulberry/notenoughupdates/events/ButtonExclusionZoneEvent.kt
blob: 3c8ce418c6c2d0ec1ff3221951f93a275452d02e (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
/*
 * Copyright (C) 2023 Linnea Gräf
 *
 * This file is part of NotEnoughUpdates.
 *
 * NotEnoughUpdates is free software: you can redistribute it
 * and/or modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation, either
 * version 3 of the License, or (at your option) any later version.
 *
 * NotEnoughUpdates is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
 */

package io.github.moulberry.notenoughupdates.events

import io.github.moulberry.notenoughupdates.events.ButtonExclusionZoneEvent.PushDirection.*
import io.github.moulberry.notenoughupdates.util.Rectangle
import net.minecraft.client.gui.GuiScreen
import java.util.*

class ButtonExclusionZoneEvent(
    val gui: GuiScreen,
    val guiBaseRect: Rectangle,
) : NEUEvent() {
    enum class PushDirection {
        TOWARDS_RIGHT,
        TOWARDS_LEFT,
        TOWARDS_TOP,
        TOWARDS_BOTTOM,
    }

    data class ExclusionZone(
        val area: Rectangle,
        val pushDirection: PushDirection,
    )

    val occupiedRects = mutableListOf<ExclusionZone>()
    fun blockArea(area: Rectangle, direction: PushDirection) {
        occupiedRects.add(ExclusionZone(area, direction))
    }

    @JvmOverloads
    fun findButtonPosition(button: Rectangle, margin: Int = 0): Rectangle {
        val processedAreas = IdentityHashMap<ExclusionZone, Unit>()

        var buttonPosition = button
        while (true) {
            val overlappingExclusionZone =
                occupiedRects.find { it !in processedAreas && it.area.intersects(buttonPosition) } ?: break
            buttonPosition = when (overlappingExclusionZone.pushDirection) {
                TOWARDS_RIGHT -> buttonPosition.copy(x = overlappingExclusionZone.area.right + margin)
                TOWARDS_LEFT -> buttonPosition.copy(x = overlappingExclusionZone.area.left - buttonPosition.width - margin)
                TOWARDS_TOP -> buttonPosition.copy(y = overlappingExclusionZone.area.top - buttonPosition.height - margin)
                TOWARDS_BOTTOM -> buttonPosition.copy(y = overlappingExclusionZone.area.bottom + margin)
            }
            processedAreas[overlappingExclusionZone] = Unit
        }

        return buttonPosition
    }


}