Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Tablist Editor #1508

Draft
wants to merge 96 commits into
base: beta
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
1dea3a5
Add rounded rectangles
VixidDev Dec 28, 2023
873a2c5
Compatibility with translate and scale, also better error logging
VixidDev Jan 5, 2024
18b2bf9
Added Alignment
Thunderblade73 Jan 7, 2024
fcd801b
added Renderable support
Thunderblade73 Dec 28, 2023
653d1e2
moved alignment enums to renderUtils
Thunderblade73 Jan 15, 2024
b88dc7b
Merge branch 'beta' into renderable-Align
Thunderblade73 Feb 5, 2024
87080ba
Merge branch 'renderable-Align' into rounded-rects
Thunderblade73 Feb 5, 2024
ff6d2dc
Merge branch 'beta' into fork/rounded-rects
hannibal002 Feb 10, 2024
27030c7
Merge remote-tracking branch 'VixidDev/rounded-rects' into rounded-rects
Thunderblade73 Feb 14, 2024
029a502
Merge branch 'beta' into rounded-rects
Thunderblade73 Feb 26, 2024
b5895ae
Merge branch 'beta' into rounded-rects
Thunderblade73 Mar 7, 2024
e30247e
removed unintentional changes
Thunderblade73 Mar 7, 2024
ed3209e
init
Thunderblade73 Mar 8, 2024
72bc1b1
Merge branch 'beta' into widget
Thunderblade73 Mar 12, 2024
6a43b1e
added all widgets
Thunderblade73 Mar 12, 2024
4aec172
fixed pattern
Thunderblade73 Mar 12, 2024
d266204
formatting
Thunderblade73 Mar 12, 2024
3b5edd8
added updating the enum via repo
Thunderblade73 Mar 12, 2024
6468ebf
cleanup
Thunderblade73 Mar 12, 2024
c3e86d8
added garden patterns
Thunderblade73 Mar 12, 2024
ebc620c
added lines to enum
Thunderblade73 Mar 12, 2024
cef4edb
removed debug
Thunderblade73 Mar 12, 2024
eacc076
added to copyTabList
Thunderblade73 Mar 12, 2024
b2279f6
fixed patterns
Thunderblade73 Mar 12, 2024
89e6c4b
optimisation and cleanup
Thunderblade73 Mar 13, 2024
e7b08db
added verifyKeyShape and doc for RepoPatternManager.getUnusedPatterns
Thunderblade73 Mar 13, 2024
6d79c49
fix
Thunderblade73 Mar 13, 2024
55effdb
Update prefix and added a notice
Thunderblade73 Mar 14, 2024
ba5af7c
Merge branch 'beta' into widget
Thunderblade73 Mar 22, 2024
bff58f8
major fixes
Thunderblade73 Mar 22, 2024
30c83ff
Merge branch 'beta' into widget
Thunderblade73 Mar 24, 2024
b4a2013
added missing dungeon "widgets"
Thunderblade73 Mar 24, 2024
b0db6ed
fixed typo
Thunderblade73 Mar 25, 2024
b577ffc
Merge branch 'beta' into widget
Thunderblade73 Mar 25, 2024
5758c2c
Merge branch 'beta' into widget
Thunderblade73 Mar 28, 2024
0a0c1f9
added Renderable.verticalContainer
Thunderblade73 Mar 29, 2024
e320552
fix
Thunderblade73 Mar 30, 2024
72925f2
Merge branch 'beta' into widget
Thunderblade73 Mar 31, 2024
5ec3c9d
Merge branch 'renderable-vertical-container' into tab-editor
Thunderblade73 Mar 31, 2024
6aebfe4
Merge branch 'rounded-rects' into tab-editor
Thunderblade73 Mar 31, 2024
0d21fe4
init
Thunderblade73 Apr 1, 2024
3a68b13
hiding of inventory and neu
Thunderblade73 Apr 2, 2024
65ac5e8
Merge branch 'beta' into widget
Thunderblade73 Apr 3, 2024
f971784
Merge branch 'beta' into widget
Thunderblade73 Apr 3, 2024
d25375a
Merge branch 'beta' into widget
Thunderblade73 Apr 7, 2024
7b42911
Kdocs + add missing widget
Thunderblade73 Apr 7, 2024
a78e65c
Merge branch 'beta' into tab-editor
Thunderblade73 Apr 9, 2024
2536de8
added isKeyClicked
Thunderblade73 Apr 9, 2024
3717f1b
removed redundant delays
Thunderblade73 Apr 9, 2024
947e2c7
added multi clickable
Thunderblade73 Apr 9, 2024
e05122f
Merge branch 'widget' into tab-editor
Thunderblade73 Apr 9, 2024
65a8b23
Merge branch 'multi-key-clickable' into tab-editor
Thunderblade73 Apr 9, 2024
b333718
added multi clickable
Thunderblade73 Apr 9, 2024
7d22916
Merge branch 'beta' into widget
Thunderblade73 Apr 13, 2024
14e2c34
Merge branch 'beta' into tab-editor
Thunderblade73 Apr 15, 2024
4eda0e1
Merge branch 'beta' into widget
Thunderblade73 Apr 16, 2024
76f5a5b
Merge branch 'beta' into widget
Thunderblade73 Apr 17, 2024
ecb78db
Merge branch 'beta' into widget
Thunderblade73 Apr 18, 2024
18c6068
Merge branch 'beta' into widget
Thunderblade73 Apr 21, 2024
2edc66e
Merge branch 'widget' into tab-editor
Thunderblade73 Apr 21, 2024
343e161
fix errors
Thunderblade73 Apr 21, 2024
8fb0bf0
cleanup
Thunderblade73 Apr 21, 2024
7e7c355
init
Thunderblade73 Apr 21, 2024
2169c06
Merge branch 'gui-before-draw' into tab-editor
Thunderblade73 Apr 21, 2024
b7b6305
removed redundant part
Thunderblade73 Apr 21, 2024
e668aa3
fix
Thunderblade73 Apr 21, 2024
217e4f6
fix2
Thunderblade73 Apr 21, 2024
3a696ca
Merge branch 'gui-before-draw' into tab-editor
Thunderblade73 Apr 21, 2024
f10fb37
added else
Thunderblade73 Apr 21, 2024
8a316ad
Merge branch 'gui-before-draw' into tab-editor
Thunderblade73 Apr 21, 2024
3200b00
cancel more events
Thunderblade73 Apr 21, 2024
c405d91
cancel more events
Thunderblade73 Apr 21, 2024
2f8f361
Merge branch 'gui-before-draw' into tab-editor
Thunderblade73 Apr 21, 2024
89a983a
esc
Thunderblade73 Apr 21, 2024
4571658
esc 2
Thunderblade73 Apr 21, 2024
f1cb304
fixed more edge cases
Thunderblade73 Apr 22, 2024
189dea3
maybe fixed neu inventory buttons flashing
Thunderblade73 Apr 23, 2024
6791720
Merge branch 'beta' into widget
Thunderblade73 Apr 23, 2024
d9c868a
Merge branch 'widget' into tab-editor
Thunderblade73 Apr 23, 2024
ce7e0dd
Merge branch 'gui-before-draw' into tab-editor
Thunderblade73 Apr 23, 2024
fc322ed
Merge branch 'beta' into widget
Thunderblade73 Apr 24, 2024
0dff94e
Merge branch 'widget' into tab-editor
Thunderblade73 Apr 24, 2024
9a1e1d9
Merge branch 'beta' into gui-before-draw
Thunderblade73 Apr 24, 2024
7b1e493
Merge branch 'beta' into widget
Thunderblade73 Apr 25, 2024
9a300f2
Merge branch 'widget' into tab-editor
Thunderblade73 Apr 25, 2024
1614811
Merge branch 'beta' into gui-before-draw
Thunderblade73 Apr 26, 2024
92057f8
fix bug
Thunderblade73 Apr 26, 2024
81ecabd
shouldAllowLink updated
Thunderblade73 Apr 26, 2024
2752647
Merge branch 'beta' into gui-before-draw
Thunderblade73 May 2, 2024
ddb2fef
fix skyHanni guis bugging out the preDrawEventCanceled state
Thunderblade73 May 2, 2024
1b474d8
fix
Thunderblade73 May 2, 2024
67eb41e
Merge branch 'beta' into gui-before-draw
Thunderblade73 May 3, 2024
46eebee
Merge branch 'gui-before-draw' into tab-editor
Thunderblade73 May 3, 2024
7cdb545
Merge branch 'refs/heads/beta' into tab-editor
Thunderblade73 Jul 3, 2024
2b9fb68
updated
Thunderblade73 Jul 3, 2024
e6ccea4
cached inventory
Thunderblade73 Jul 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package at.hannibal2.skyhanni.config.storage;

import at.hannibal2.skyhanni.data.IslandType;
import at.hannibal2.skyhanni.features.bingo.card.goals.BingoGoal;
import at.hannibal2.skyhanni.features.fame.UpgradeReminder;
import at.hannibal2.skyhanni.utils.GenericWrapper;
Expand Down Expand Up @@ -75,4 +76,20 @@ public static class LimboStats {
@Expose
public float userLuck = 0f;
}

@Expose
public TabList tabList = new TabList();

public static class TabList {

@Expose
public TabProfile globaleTabProfile = new TabProfile();

@Expose
public Map<IslandType, TabProfile> tabSetting = new HashMap<>();

public static class TabProfile {

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package at.hannibal2.skyhanni.events;

Check failure on line 1 in src/main/java/at/hannibal2/skyhanni/events/NEUMBGuiRenderEvent.kt

View workflow job for this annotation

GitHub Actions / Check Style

[ktlint] reported by reviewdog 🐶 Unnecessary semicolon Raw Output: src/main/java/at/hannibal2/skyhanni/events/NEUMBGuiRenderEvent.kt:1:37: error: Unnecessary semicolon (standard:no-semi)

class NEUMBGuiRenderEvent : LorenzEvent()
18 changes: 18 additions & 0 deletions src/main/java/at/hannibal2/skyhanni/events/TabWidgetUpdate.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package at.hannibal2.skyhanni.events

import at.hannibal2.skyhanni.data.model.TabWidget

open class TabWidgetUpdate(
val widget: TabWidget,
) : LorenzEvent() {
class NewValues(
widget: TabWidget,
val lines: List<String>
) : TabWidgetUpdate(widget)

class Clear(
widget: TabWidget,
) : TabWidgetUpdate(widget)

fun isEventFor(widgetType: TabWidget) = widget == widgetType
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,29 +17,29 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
@SkyHanniModule
object TabWidgetSettings {
private val patternGroup = RepoPattern.group("tab.widget.setting")
private val mainPageSettingPattern by patternGroup.pattern(
val mainPageSettingPattern by patternGroup.pattern(
"gui",
"(Widgets in.*|Widgets on.*)"
"(Widgets in.*|Widgets on.*)",
)
private val mainPageWidgetPattern by patternGroup.pattern(
"main",
"§7Currently:.*"
"§7Currently:.*",
)
private val subPageWidgetPattern by patternGroup.pattern(
"sub",
"§eClick to .*"
"§eClick to .*",
)
private val shownSettingPattern by patternGroup.pattern(
val shownSettingPattern by patternGroup.pattern(
"show",
"Shown .* Setting.*|.*Widget Settings"
"Shown .* Setting.*|.*Widget Settings",
)
private val clickToDisablePattern by patternGroup.pattern(
"click.disable",
".*(disable!)"
".*(disable!)",
)
private val enabledPattern by patternGroup.pattern(
"is.enabled",
".*ENABLED"
".*ENABLED",
)

var inInventory = false
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
package at.hannibal2.skyhanni.features.misc.compacttablist

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.storage.PlayerSpecificStorage.TabList
import at.hannibal2.skyhanni.config.storage.PlayerSpecificStorage.TabList.TabProfile
import at.hannibal2.skyhanni.data.ProfileStorageData
import at.hannibal2.skyhanni.events.GuiContainerEvent
import at.hannibal2.skyhanni.events.InventoryCloseEvent
import at.hannibal2.skyhanni.events.InventoryUpdatedEvent
import at.hannibal2.skyhanni.events.LorenzToolTipEvent
import at.hannibal2.skyhanni.events.MessageSendToServerEvent
import at.hannibal2.skyhanni.features.dungeon.DungeonAPI
import at.hannibal2.skyhanni.features.misc.TabWidgetSettings
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.ChatUtils
import at.hannibal2.skyhanni.utils.ChatUtils.isCommand
import at.hannibal2.skyhanni.utils.ChatUtils.senderIsSkyhanni
import at.hannibal2.skyhanni.utils.CollectionUtils.toSingletonListOrEmpty
import at.hannibal2.skyhanni.utils.HypixelCommands
import at.hannibal2.skyhanni.utils.InventoryUtils
import at.hannibal2.skyhanni.utils.ItemUtils.cleanName
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.LorenzColor
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.RegexUtils.matches
import at.hannibal2.skyhanni.utils.RenderUtils
import at.hannibal2.skyhanni.utils.SimpleTimeMark
import at.hannibal2.skyhanni.utils.renderables.DragItem
import at.hannibal2.skyhanni.utils.renderables.DragNDrop
import at.hannibal2.skyhanni.utils.renderables.Droppable
import at.hannibal2.skyhanni.utils.renderables.Renderable
import at.hannibal2.skyhanni.utils.renderables.RenderableUtils.renderXYAligned
import at.hannibal2.skyhanni.utils.renderables.RenderableUtils.renderYAligned
import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.GlStateManager
import net.minecraft.init.Blocks
import net.minecraft.inventory.Slot
import net.minecraft.item.ItemBlock
import net.minecraft.item.ItemStack
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import kotlin.time.Duration.Companion.milliseconds

@SkyHanniModule
object TabEditor {

private val compactConfig get() = SkyHanniMod.feature.gui.compactTabList

val storage: TabList get() = ProfileStorageData.playerSpecific?.tabList!!
fun isEnabled() = LorenzUtils.inSkyBlock && !DungeonAPI.inDungeon()

val globalProfile by lazy {
storage.globaleTabProfile!!
}

private lateinit var activeStorage: TabProfile

private var inEditor = false

private fun updateStorage() {
if (inEditor) return
activeStorage = storage.tabSetting[LorenzUtils.skyBlockIsland] ?: run {
val new = TabProfile()
storage.tabSetting[LorenzUtils.skyBlockIsland] = new
new
}
inEditor = true
}

@SubscribeEvent
fun onMessageToServer(event: MessageSendToServerEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!event.isCommand("/widget")) return
if (event.senderIsSkyhanni()) return
if (DungeonAPI.inDungeon()) {
event.cancel()
ChatUtils.clickableChat("Tab Editor not available in Dungeon", { HypixelCommands.widget() }, "§eOpen widget anyway.")
return
}
updateStorage()
}

private var lastClicked = SimpleTimeMark.farPast()

private fun createItem(stack: ItemStack?, slotId: Int, windowId: Int) = if (stack == null) Renderable.placeholder(
0,
0,
) else Renderable.multiClickAndHover(
Renderable.drawInsideRoundedRect(
Renderable.itemStack(stack),
(TabWidgetSettings.highlights[slotId] ?: LorenzColor.GRAY).toColor(), // TODO
),
toolTips[slotId]?.let { listOf(stack.displayName) + it } ?: listOf("NULL"),
bypassChecks = true,
click = mapOf(
0 to {
DragNDrop.setDrag(TabItem(stack, slotId))
/* if (lastClicked.passedSince() > 500.milliseconds) {
Minecraft.getMinecraft().playerController.windowClick(
windowId, slot.slotIndex, 0, 0, Minecraft.getMinecraft().thePlayer,
)
lastClicked = SimpleTimeMark.now()
} */
},
1 to {
if (lastClicked.passedSince() > 500.milliseconds) {
Minecraft.getMinecraft().playerController.windowClick(
windowId, slotId, 1, 0, Minecraft.getMinecraft().thePlayer,
)
lastClicked = SimpleTimeMark.now()
}
},
2 to {
if (lastClicked.passedSince() > 500.milliseconds) {
Minecraft.getMinecraft().playerController.windowClick(
windowId, slotId, 0, 0, Minecraft.getMinecraft().thePlayer,
)
lastClicked = SimpleTimeMark.now()
}
},
),
)

private fun createItem(slot: Slot?, windowId: Int) = createItem(slot?.stack, slot?.slotNumber ?: 0, windowId)

private var mainInv = mutableMapOf<Int, ItemStack>()
private var secondInv = mutableMapOf<Int, ItemStack>()
private var lastNameOfSecond = ""

@SubscribeEvent
fun onInventoryUpdated(event: InventoryUpdatedEvent) {
if (!inEditor) return
val cache = when {
TabWidgetSettings.mainPageSettingPattern.matches(event.inventoryName) -> mainInv
TabWidgetSettings.shownSettingPattern.matches(event.inventoryName) -> secondInv
else -> return
}
if (cache === secondInv && event.inventoryName != lastNameOfSecond) {
secondInv.clear()
}
for ((slotID, item) in event.inventoryItemsWithNull) {
if (item == null) continue
cache[slotID] = item
}
}

private class TabTarget() : Droppable {
override fun handle(drop: Any?) {
val item = drop as TabItem
if (lastClicked.passedSince() < 500.milliseconds) return
InventoryUtils.clickSlot(item.slotId)
lastClicked = SimpleTimeMark.now()
}

override fun validTarget(item: Any?): Boolean = item is TabItem
}

private class TabItem(val stack: ItemStack, val slotId: Int) : DragItem<TabItem> {
override fun get(): TabItem = this

override fun onRender(mouseX: Int, mouseY: Int) {
Renderable.itemStack(stack).render(0, 0)
}

}

@SubscribeEvent
fun onDraw(event: GuiContainerEvent.PreDraw) {
if (!inEditor) return
val container = event.container
val windowId = container.windowId
mainInv.forEach { (slotNumber, stack) ->
toolTips[slotNumber] = stack.getLore()
}

GlStateManager.pushMatrix()
val pre = RenderUtils.absoluteTranslation
GlStateManager.loadIdentity()
val height = event.gui.height
val width = event.gui.width
val zLevel = pre.third + 270f
GlStateManager.translate(0f, 0f, zLevel)
event.drawDefaultBackground()
Renderable.withMousePosition(event.mouseX, event.mouseY) {
Renderable.horizontalContainer(
createItem(mainInv[13], 13, windowId).toSingletonListOrEmpty(),
verticalAlign = RenderUtils.VerticalAlignment.CENTER,
).renderYAligned(0, 0, height)

Renderable.horizontalContainer(
(19..39).mapNotNull {
val stack = mainInv[it] ?: return@mapNotNull null
if (stack.item == ItemBlock.getItemFromBlock(Blocks.stained_glass_pane)) return@mapNotNull null
it to stack
}.sortedBy { it.second.cleanName().drop(2) }.map { createItem(it.second, it.first, windowId) },
horizontalAlign = RenderUtils.HorizontalAlignment.CENTER,
verticalAlign = RenderUtils.VerticalAlignment.BOTTOM,
).renderXYAligned(0, 0, width, height)

drawTabList(width, height)
}
GlStateManager.popMatrix()
event.cancel()
}

private val toolTips = mutableMapOf<Int, List<String>>()

@SubscribeEvent
fun onToolTip(event: LorenzToolTipEvent) {
if (!inEditor) return
//event.toolTip.clear() // TODO
}

@SubscribeEvent
fun onInventoryClose(event: InventoryCloseEvent) {
if (event.reopenSameName) return
//inEditor = false // TODO
}

private val hypixelTabDisplay
get() = listOf(
toolTips[3] ?: emptyList(), toolTips[4] ?: emptyList(), toolTips[5] ?: emptyList(),
)

private fun drawTabList(width: Int, height: Int) = if (compactConfig.enabled.get()) {
TabListRenderer.drawTabList()
Unit
} else {
Renderable.verticalContainer(
listOf(
Renderable.placeholder(0, 15),
Renderable.drawInsideRoundedRect(
Renderable.horizontalContainer(
hypixelTabDisplay.map {
Renderable.verticalContainer(it.map { Renderable.string(it) })
},
),
LorenzColor.DARK_GRAY.toColor(), radius = 0,
),
),
horizontalAlign = RenderUtils.HorizontalAlignment.CENTER,
verticalAlign = RenderUtils.VerticalAlignment.TOP,
).renderXYAligned(0, 0, width, height)
Unit
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ object TabListRenderer {
}
}

private fun drawTabList() {
internal fun drawTabList() {
val columns = TabListReader.renderColumns

if (columns.isEmpty()) return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class GuiContainerHook(guiAny: Any) {
NEUApi.setInventoryButtonsToDisabled()
GuiData.preDrawEventCancelled = true
ci.cancel()
postDraw(mouseX, mouseY, partialTicks)
} else {
DelayedRun.runNextTick {
GuiData.preDrawEventCancelled = false
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/at/hannibal2/skyhanni/utils/HypixelCommands.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package at.hannibal2.skyhanni.utils

import at.hannibal2.skyhanni.api.GetFromSackAPI
import at.hannibal2.skyhanni.data.IslandType
import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName

object HypixelCommands {
Expand Down Expand Up @@ -137,6 +138,14 @@ object HypixelCommands {
send("chatprompt $prompt")
}

fun widget(islandType: IslandType? = null) {
if (islandType == null) {
send("widget")
} else {
send("widget $islandType")
}
}

private fun send(command: String) {
@Suppress("DEPRECATION")
// TODO rename function
Expand Down
Loading
Loading