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