From d3e2b1928ac648243d1d44460313b79c09a5be12 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 24 Oct 2022 17:39:05 +0700 Subject: [PATCH] Try to prevent multiple scrollbars Fixes #168 --- .../mc/otm/client/ClientEventHandler.kt | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt index f117717ba..f3f4624ba 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt @@ -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(screen: S, matteryPlayer: MatteryPlayerCapability) : DiscreteScrollBarPanel( + 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) {