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
}
}
|