Try to prevent multiple scrollbars

Fixes #168
This commit is contained in:
DBotThePony 2022-10-24 17:39:05 +07:00
parent 1e654ff079
commit d3e2b1928a
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -2,6 +2,9 @@ package ru.dbotthepony.mc.otm.client
import com.mojang.blaze3d.platform.InputConstants
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap
import net.minecraft.client.gui.components.Widget
import net.minecraft.client.gui.components.events.GuiEventListener
import net.minecraft.client.gui.screens.Screen
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
import net.minecraft.client.gui.screens.inventory.InventoryScreen
import net.minecraft.world.inventory.InventoryMenu
@ -11,6 +14,7 @@ import net.minecraftforge.client.event.ScreenEvent
import net.minecraftforge.client.event.ScreenEvent.MouseDragged
import net.minecraftforge.client.event.ScreenEvent.MouseScrolled
import ru.dbotthepony.mc.otm.android.feature.JumpBoostFeature
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
import ru.dbotthepony.mc.otm.capability.matteryPlayer
import ru.dbotthepony.mc.otm.client.render.UVWindingOrder
import ru.dbotthepony.mc.otm.client.render.Widgets18
@ -27,6 +31,7 @@ import ru.dbotthepony.mc.otm.core.integerDivisionUp
import ru.dbotthepony.mc.otm.menu.MatteryMenu
import ru.dbotthepony.mc.otm.network.MenuNetworkChannel
import ru.dbotthepony.mc.otm.registry.AndroidFeatures
import java.util.function.Consumer
fun onMovementInputUpdate(event: MovementInputUpdateEvent) {
val ply = event.entity
@ -103,7 +108,14 @@ private fun inventoryLogic(event: ScreenEvent.Init.Post) {
}
}
private fun exosuitInventoryLogic(event: ScreenEvent.Init.Post) {
private class InventoryScrollbarPanel<S : Screen>(screen: S, matteryPlayer: MatteryPlayerCapability) : DiscreteScrollBarPanel<S>(
screen, null, { integerDivisionUp(matteryPlayer.exoSuitContainer.containerSize, 9) }, { _, _, newScroll ->
inventoryScroll = newScroll
MenuNetworkChannel.sendToServer(InventoryScrollPacket(newScroll).also { it.play(matteryPlayer.ply) })
}, isSlim = true
)
private fun exosuitInventoryLogic(screen: Screen, addListener: (GuiEventListener) -> Unit) {
val player = minecraft.player ?: return
val matteryPlayer = player.matteryPlayer ?: return
@ -111,8 +123,6 @@ private fun exosuitInventoryLogic(event: ScreenEvent.Init.Post) {
return
}
val screen = event.screen
if (screen !is AbstractContainerScreen<*> || screen.menu is MatteryMenu || screen.menu is InventoryMenu) {
return
}
@ -146,18 +156,18 @@ private fun exosuitInventoryLogic(event: ScreenEvent.Init.Post) {
.max { o1, o2 -> o1.x.compareTo(o2.x) }
.get().x.toFloat() + 26f
val scrollbar = DiscreteScrollBarPanel(screen, null, { integerDivisionUp(matteryPlayer.exoSuitContainer.containerSize, 9) }, { _, _, newScroll ->
inventoryScroll = newScroll
MenuNetworkChannel.sendToServer(InventoryScrollPacket(newScroll).also { it.play(player) })
}, isSlim = true)
val findScrollbar = (screen.renderables.firstOrNull { it is Panel2Widget<*, *> && it.panel is InventoryScrollbarPanel } as Panel2Widget<*, *>?)?.panel as InventoryScrollbarPanel?
val scrollbar = findScrollbar ?: InventoryScrollbarPanel(screen, matteryPlayer)
// HOW
scrollbar.x = mostLeft + screen.guiLeft - 9f
scrollbar.y = mostTop + screen.guiTop - 1f
scrollbar.height = mostBottom - mostTop + AbstractSlotPanel.SIZE
val widget = Panel2Widget(scrollbar)
event.addListener(widget)
if (findScrollbar == null) {
val widget = Panel2Widget(scrollbar)
addListener(widget)
}
scrollbar.scroll = inventoryScroll
}
@ -196,7 +206,7 @@ fun onMouseScrolled(event: MouseScrolled.Pre) {
fun onPostScreenInit(event: ScreenEvent.Init.Post) {
inventoryLogic(event)
exosuitInventoryLogic(event)
exosuitInventoryLogic(event.screen, event::addListener)
}
fun onScreenOpen(event: ScreenEvent.Opening) {