Skip to content

Commit 858553d

Browse files
committed
initial logger hud
1 parent 97ff0d2 commit 858553d

File tree

6 files changed

+303
-7
lines changed

6 files changed

+303
-7
lines changed

src/main/kotlin/com/lambda/gui/dsl/ImGuiBuilder.kt

Lines changed: 129 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,130 @@
3636

3737
package com.lambda.gui.dsl
3838

39-
import com.lambda.context.SafeContext
4039
import com.lambda.gui.dsl.ImGuiBuilder.text
4140
import com.lambda.module.modules.client.ClickGui
42-
import com.lambda.threading.runSafe
4341
import com.lambda.util.math.Vec2d
44-
import imgui.*
45-
import imgui.ImGui.*
46-
import imgui.flag.*
47-
import imgui.type.*
42+
import imgui.ImDrawList
43+
import imgui.ImFont
44+
import imgui.ImGui
45+
import imgui.ImGui.begin
46+
import imgui.ImGui.beginChild
47+
import imgui.ImGui.beginCombo
48+
import imgui.ImGui.beginDragDropSource
49+
import imgui.ImGui.beginDragDropTarget
50+
import imgui.ImGui.beginGroup
51+
import imgui.ImGui.beginMainMenuBar
52+
import imgui.ImGui.beginMenu
53+
import imgui.ImGui.beginMenuBar
54+
import imgui.ImGui.beginPopup
55+
import imgui.ImGui.beginPopupContextItem
56+
import imgui.ImGui.beginPopupContextVoid
57+
import imgui.ImGui.beginPopupContextWindow
58+
import imgui.ImGui.beginPopupModal
59+
import imgui.ImGui.beginTabBar
60+
import imgui.ImGui.beginTabItem
61+
import imgui.ImGui.beginTooltip
62+
import imgui.ImGui.calcTextSize
63+
import imgui.ImGui.collapsingHeader
64+
import imgui.ImGui.colorButton
65+
import imgui.ImGui.colorEdit4
66+
import imgui.ImGui.colorPicker4
67+
import imgui.ImGui.dragFloat
68+
import imgui.ImGui.dragInt
69+
import imgui.ImGui.end
70+
import imgui.ImGui.endChild
71+
import imgui.ImGui.endCombo
72+
import imgui.ImGui.endDragDropSource
73+
import imgui.ImGui.endDragDropTarget
74+
import imgui.ImGui.endGroup
75+
import imgui.ImGui.endMainMenuBar
76+
import imgui.ImGui.endMenu
77+
import imgui.ImGui.endMenuBar
78+
import imgui.ImGui.endPopup
79+
import imgui.ImGui.endTabBar
80+
import imgui.ImGui.endTabItem
81+
import imgui.ImGui.endTooltip
82+
import imgui.ImGui.getBackgroundDrawList
83+
import imgui.ImGui.getColorU32
84+
import imgui.ImGui.getFont
85+
import imgui.ImGui.getFontSize
86+
import imgui.ImGui.getForegroundDrawList
87+
import imgui.ImGui.getIO
88+
import imgui.ImGui.getItemID
89+
import imgui.ImGui.getStyle
90+
import imgui.ImGui.getVersion
91+
import imgui.ImGui.getWindowDrawList
92+
import imgui.ImGui.getWindowHeight
93+
import imgui.ImGui.getWindowPos
94+
import imgui.ImGui.getWindowPosX
95+
import imgui.ImGui.getWindowPosY
96+
import imgui.ImGui.getWindowSize
97+
import imgui.ImGui.getWindowViewport
98+
import imgui.ImGui.getWindowWidth
99+
import imgui.ImGui.inputDouble
100+
import imgui.ImGui.inputFloat
101+
import imgui.ImGui.inputFloat2
102+
import imgui.ImGui.inputFloat3
103+
import imgui.ImGui.inputFloat4
104+
import imgui.ImGui.isAnyItemActive
105+
import imgui.ImGui.isAnyItemFocused
106+
import imgui.ImGui.isAnyItemHovered
107+
import imgui.ImGui.isItemActivated
108+
import imgui.ImGui.isItemActive
109+
import imgui.ImGui.isItemClicked
110+
import imgui.ImGui.isItemDeactivated
111+
import imgui.ImGui.isItemDeactivatedAfterEdit
112+
import imgui.ImGui.isItemEdited
113+
import imgui.ImGui.isItemFocused
114+
import imgui.ImGui.isItemHovered
115+
import imgui.ImGui.isItemToggledOpen
116+
import imgui.ImGui.isMouseClicked
117+
import imgui.ImGui.isWindowAppearing
118+
import imgui.ImGui.isWindowCollapsed
119+
import imgui.ImGui.isWindowHovered
120+
import imgui.ImGui.popFont
121+
import imgui.ImGui.popID
122+
import imgui.ImGui.popItemWidth
123+
import imgui.ImGui.popStyleColor
124+
import imgui.ImGui.popStyleVar
125+
import imgui.ImGui.popTextWrapPos
126+
import imgui.ImGui.pushFont
127+
import imgui.ImGui.pushID
128+
import imgui.ImGui.pushItemWidth
129+
import imgui.ImGui.pushStyleColor
130+
import imgui.ImGui.pushStyleVar
131+
import imgui.ImGui.pushTextWrapPos
132+
import imgui.ImGui.setClipboardText
133+
import imgui.ImGui.setCursorPosX
134+
import imgui.ImGui.sliderFloat
135+
import imgui.ImGui.sliderInt
136+
import imgui.ImGui.textColored
137+
import imgui.ImGui.textUnformatted
138+
import imgui.ImGui.treeNode
139+
import imgui.ImGui.treePop
140+
import imgui.ImGuiIO
141+
import imgui.ImGuiStyle
142+
import imgui.ImGuiTextFilter
143+
import imgui.ImGuiViewport
144+
import imgui.ImVec2
145+
import imgui.flag.ImDrawListFlags
146+
import imgui.flag.ImGuiCol
147+
import imgui.flag.ImGuiColorEditFlags
148+
import imgui.flag.ImGuiComboFlags
149+
import imgui.flag.ImGuiDir
150+
import imgui.flag.ImGuiHoveredFlags
151+
import imgui.flag.ImGuiInputTextFlags
152+
import imgui.flag.ImGuiMouseButton
153+
import imgui.flag.ImGuiPopupFlags
154+
import imgui.flag.ImGuiSelectableFlags
155+
import imgui.flag.ImGuiTabBarFlags
156+
import imgui.flag.ImGuiTreeNodeFlags
157+
import imgui.flag.ImGuiWindowFlags
158+
import imgui.type.ImBoolean
159+
import imgui.type.ImDouble
160+
import imgui.type.ImFloat
161+
import imgui.type.ImInt
162+
import imgui.type.ImString
48163
import net.minecraft.util.math.Vec2f
49164
import net.minecraft.util.math.Vec3d
50165
import net.minecraft.util.math.Vec3i
@@ -314,6 +429,14 @@ object ImGuiBuilder {
314429
@ImGuiDsl
315430
fun text(text: String) = textUnformatted(text)
316431

432+
/**
433+
* Text with coloring
434+
*
435+
* @param text The text to display
436+
*/
437+
@ImGuiDsl
438+
fun textColored(text: String, color: Color) = textColored(getColorU32(color.rgb), text)
439+
317440
/**
318441
* Text with disabled coloring.
319442
*
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* Copyright 2025 Lambda
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
package com.lambda.interaction.request
19+
20+
import com.lambda.gui.dsl.ImGuiBuilder
21+
import com.lambda.module.HudModule
22+
import com.lambda.module.tag.ModuleTag
23+
import imgui.ImGui
24+
import imgui.type.ImBoolean
25+
import java.awt.Color
26+
import java.util.*
27+
28+
class DebugLogger(name: String, description: String) : HudModule(
29+
name, description, ModuleTag.HUD
30+
) {
31+
private val logs = LinkedList<LogEntry>()
32+
private var maxLogEntries: Int = 100
33+
34+
private val autoScroll = ImBoolean(true)
35+
private val wrapText = ImBoolean(false)
36+
private val showDebug = ImBoolean(true)
37+
private val showSuccess = ImBoolean(true)
38+
private val showWarning = ImBoolean(true)
39+
private val showError = ImBoolean(true)
40+
41+
fun log(message: String, logColor: LogType) {
42+
logs.add(LogEntry(message, logColor))
43+
if (logs.size > maxLogEntries) {
44+
logs.removeFirst()
45+
}
46+
}
47+
48+
fun logDebug(message: String) = log(message, LogType.Debug)
49+
fun logSuccess(message: String) = log(message, LogType.Success)
50+
fun logWarning(message: String) = log(message, LogType.Warning)
51+
fun logError(message: String) = log(message, LogType.Error)
52+
53+
override fun ImGuiBuilder.buildLayout() {
54+
checkbox("Auto-scroll", autoScroll)
55+
sameLine()
56+
checkbox("Debug", showDebug)
57+
sameLine()
58+
checkbox("Info", showSuccess)
59+
sameLine()
60+
checkbox("Warn", showWarning)
61+
sameLine()
62+
checkbox("Error", showError)
63+
64+
separator()
65+
66+
child("Log Content") {
67+
if (wrapText.get()) ImGui.pushTextWrapPos()
68+
69+
logs.forEach { logEntry ->
70+
if (shouldDisplay(logEntry)) {
71+
when (val type = logEntry.type) {
72+
LogType.Debug -> textColored("[DEBUG]", type.color)
73+
LogType.Success -> textColored("[SUCCESS]", type.color)
74+
LogType.Warning -> textColored("[WARNING]", type.color)
75+
LogType.Error -> textColored("[ERROR]", type.color)
76+
}
77+
78+
sameLine()
79+
}
80+
}
81+
82+
if (wrapText.get()) ImGui.popTextWrapPos()
83+
84+
if (autoScroll.get()) {
85+
ImGui.setScrollHereY(1f)
86+
}
87+
}
88+
89+
button("Clear") { clear() }
90+
}
91+
92+
fun shouldDisplay(logEntry: LogEntry) =
93+
when (logEntry.type) {
94+
LogType.Debug -> showDebug.get()
95+
LogType.Success -> showSuccess.get()
96+
LogType.Warning -> showWarning.get()
97+
LogType.Error -> showError.get()
98+
}
99+
100+
fun clear() = logs.clear()
101+
102+
103+
data class LogEntry(
104+
val message: String,
105+
val type: LogType
106+
)
107+
108+
enum class LogType(val color: Color) {
109+
Debug(Color.WHITE),
110+
Success(Color.GREEN),
111+
Warning(Color.YELLOW),
112+
Error(Color.RED)
113+
}
114+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright 2025 Lambda
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
package com.lambda.interaction.request
19+
20+
interface Logger {
21+
val logger: DebugLogger
22+
}

src/main/kotlin/com/lambda/interaction/request/ManagerUtils.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ object ManagerUtils {
2424
val managers = getInstances<RequestHandler<*>>()
2525
val accumulatedManagerPriority = managers.map { it.stagePriority }.reduce { acc, priority -> acc + priority }
2626
val positionBlockingManagers = getInstances<PositionBlocking>()
27+
val loggingManagers = getInstances<Logger>()
2728

2829
fun isPosBlocked(pos: BlockPos) =
2930
positionBlockingManagers.any { manager -> manager.blockedPositions.any { blocked -> blocked == pos } }

src/main/kotlin/com/lambda/interaction/request/breaking/BreakManager.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import com.lambda.interaction.construction.simulation.BuildSimulator.simulate
3939
import com.lambda.interaction.construction.verify.TargetState
4040
import com.lambda.interaction.material.StackSelection
4141
import com.lambda.interaction.material.StackSelection.Companion.select
42+
import com.lambda.interaction.request.Logger
4243
import com.lambda.interaction.request.ManagerUtils.isPosBlocked
4344
import com.lambda.interaction.request.PositionBlocking
4445
import com.lambda.interaction.request.RequestHandler
@@ -69,6 +70,7 @@ import com.lambda.interaction.request.breaking.SwapInfo.Companion.getSwapInfo
6970
import com.lambda.interaction.request.interacting.InteractionManager
7071
import com.lambda.interaction.request.placing.PlaceManager
7172
import com.lambda.interaction.request.rotating.RotationRequest
73+
import com.lambda.module.hud.BreakManagerDebug
7274
import com.lambda.threading.runSafe
7375
import com.lambda.util.BlockUtils.blockState
7476
import com.lambda.util.BlockUtils.calcItemBlockBreakingDelta
@@ -102,7 +104,7 @@ object BreakManager : RequestHandler<BreakRequest>(
102104
TickEvent.Player.Post,
103105
onOpen = { processRequest(activeRequest); simulateAbandoned() },
104106
onClose = { checkForCancels() }
105-
), PositionBlocking {
107+
), PositionBlocking, Logger by BreakManagerDebug {
106108
private val breakInfos = arrayOfNulls<BreakInfo>(2)
107109

108110
private val activeInfos
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright 2025 Lambda
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
package com.lambda.module.hud
19+
20+
import com.lambda.gui.dsl.ImGuiBuilder
21+
import com.lambda.interaction.request.DebugLogger
22+
import com.lambda.interaction.request.Logger
23+
import com.lambda.module.HudModule
24+
import com.lambda.module.tag.ModuleTag
25+
26+
object BreakManagerDebug : HudModule(
27+
"Break Manager Logger",
28+
"Logs most of the actions performed in the break manager to aid in debugging",
29+
ModuleTag.HUD
30+
), Logger {
31+
override val logger = DebugLogger(name, description)
32+
33+
override fun ImGuiBuilder.buildLayout() = with(logger) { buildLayout() }
34+
}

0 commit comments

Comments
 (0)