From 64c60abf3f0106619bad61d980cd97811b9ff257 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 2 Jan 2022 16:08:00 +0700 Subject: [PATCH] Update item monitor screen --- .../mc/otm/client/screen/ItemMonitorScreen.kt | 96 ++++------ .../client/screen/panels/AbstractSlotPanel.kt | 170 +++++++++--------- .../otm/client/screen/panels/EditablePanel.kt | 4 +- .../mc/otm/menu/PoweredMatteryMenu.kt | 69 ++++--- 4 files changed, 154 insertions(+), 185 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt index e26b8bbf4..a53a0c854 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt @@ -1,73 +1,53 @@ -package ru.dbotthepony.mc.otm.client.screen; +package ru.dbotthepony.mc.otm.client.screen -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.item.ItemStack; -import ru.dbotthepony.mc.otm.client.screen.panels.*; -import ru.dbotthepony.mc.otm.menu.ItemMonitorMenu; +import net.minecraft.network.chat.Component +import net.minecraft.world.entity.player.Inventory +import net.minecraft.world.item.ItemStack +import ru.dbotthepony.mc.otm.client.screen.panels.* +import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel +import ru.dbotthepony.mc.otm.menu.ItemMonitorMenu -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Component) : + MatteryScreen(menu, inventory, title) { -public class ItemMonitorScreen extends MatteryScreen { - public static final int FRAME_WIDTH = 210; - public static final int FRAME_HEIGHT = 110; + override fun makeMainFrame(): FramePanel { + val frame = FramePanel(this, null, 0f, 0f, FRAME_WIDTH, FRAME_HEIGHT, getTitle()) - public static final int GRID_WIDTH = 9; - public static final int GRID_HEIGHT = 5; + PowerGaugePanel(this, frame, menu.battery_widget, 8f, 29f) + SlotPanel(this, frame, menu.battery_slot, 8f, 80f) - public ItemMonitorScreen(ItemMonitorMenu menu, Inventory inventory, Component title) { - super(menu, inventory, title); - } + val scrollBar = ScrollBarPanel(this, frame, 192f, 14f, 92f) + scrollBar.setupRowMultiplier { menu.view.items.size / GRID_WIDTH } - @Nullable - @Override - protected FramePanel makeMainFrame() { - var frame = new FramePanel(this, null, 0, 0, FRAME_WIDTH, FRAME_HEIGHT, getTitle()); + val gridPanel = GridPanel(this, frame, 28f, 16f, GRID_WIDTH * 18f, GRID_HEIGHT * 18f, GRID_WIDTH, GRID_HEIGHT) - var scroll_bar = new ScrollBarPanel(this, frame, 0, 0, 0); - scroll_bar.setDock(Dock.RIGHT); - scroll_bar.setupRowMultiplier(() -> { - return menu.view.getItems().size() / GRID_WIDTH; - }); - - var grid = new GridPanel(this, frame, 0, 0, GRID_WIDTH * 18, 0, GRID_WIDTH, GRID_HEIGHT); - grid.setDock(Dock.RIGHT); - grid.setDockMargin(2, 2, 2, 2); - - for (int i = 0; i < GRID_WIDTH * GRID_HEIGHT; i++) { - final int index = i; - - new AbstractSlotPanel(this, grid, 0, 0) { - @Nonnull - @Override - protected ItemStack getItemStack() { - int findex = index + scroll_bar.getScroll(menu.view.getItems().size() / GRID_WIDTH); - - var list = menu.view.getItems(); - - if (findex >= list.size()) { - return ItemStack.EMPTY; - } - - return list.get(findex).stack(); + for (i in 0 until GRID_WIDTH * GRID_HEIGHT) { + object : AbstractSlotPanel(this@ItemMonitorScreen, gridPanel) { + override fun getItemStack(): ItemStack { + val index = i + scrollBar.getScroll(menu.view.items.size / GRID_WIDTH) + val list = menu.view.items + return if (index >= list.size) ItemStack.EMPTY else list[index].stack() } - @Override - protected boolean mouseScrolledInner(double mouse_x, double mouse_y, double scroll) { - return scroll_bar.mouseScrolledInner(mouse_x, mouse_y, scroll); + override fun mouseScrolledInner(mouse_x: Double, mouse_y: Double, scroll: Double): Boolean { + return scrollBar.mouseScrolledInner(mouse_x, mouse_y, scroll) } - @Override - protected boolean mouseClickedInner(double mouse_x, double mouse_y, int mouse_click_type) { - int findex = index + scroll_bar.getScroll(GRID_WIDTH); - menu.view.mouseClick(findex, mouse_click_type); - - return true; + override fun mouseClickedInner(mouse_x: Double, mouse_y: Double, mouse_click_type: Int): Boolean { + val index = i + scrollBar.getScroll(GRID_WIDTH) + menu.view.mouseClick(index, mouse_click_type) + return true } - }; + } } - return frame; + return frame } -} + + companion object { + const val FRAME_WIDTH = 210f + const val FRAME_HEIGHT = 110f + const val GRID_WIDTH = 9 + const val GRID_HEIGHT = 5 + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt index 4f85de5de..d48c96b31 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt @@ -1,119 +1,119 @@ -package ru.dbotthepony.mc.otm.client.screen.panels; +package ru.dbotthepony.mc.otm.client.screen.panels -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import ru.dbotthepony.mc.otm.client.screen.MatteryScreen; -import ru.dbotthepony.mc.otm.client.render.RGBAColor; -import ru.dbotthepony.mc.otm.client.render.RenderHelper; +import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.vertex.PoseStack +import net.minecraft.client.Minecraft +import net.minecraft.client.renderer.GameRenderer +import net.minecraft.network.chat.Component +import net.minecraft.world.item.ItemStack +import net.minecraftforge.client.RenderProperties +import org.lwjgl.opengl.GL11 +import ru.dbotthepony.mc.otm.client.render.RGBAColor +import ru.dbotthepony.mc.otm.client.render.RenderHelper +import ru.dbotthepony.mc.otm.client.screen.MatteryScreen -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.List; - -import static org.lwjgl.opengl.GL11.GL_ALWAYS; -import static org.lwjgl.opengl.GL11.GL_LESS; - -public abstract class AbstractSlotPanel extends EditablePanel { - public AbstractSlotPanel(@Nonnull MatteryScreen screen, @Nullable EditablePanel parent, float x, float y, float width, float height) { - super(screen, parent, x, y, width, height); +abstract class AbstractSlotPanel @JvmOverloads constructor( + screen: MatteryScreen<*>, + parent: EditablePanel?, + x: Float = 0f, + y: Float = 0f, + width: Float = REGULAR_DIMENSIONS, + height: Float = REGULAR_DIMENSIONS +) : EditablePanel( + screen, parent, x, y, width, height +) { + protected open fun renderSlotBackground(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) { + RenderHelper.drawRegularSlot(stack, 0f, 0f) } - public AbstractSlotPanel(@Nonnull MatteryScreen screen, @Nullable EditablePanel parent, float x, float y) { - super(screen, parent, x, y, REGULAR_DIMENSIONS, REGULAR_DIMENSIONS); - } + protected open fun renderRegular(stack: PoseStack, itemstack: ItemStack, count_override: String? = null) { + RenderSystem.setShader { GameRenderer.getPositionTexShader() } - public static final RGBAColor SLOT_HIGHLIGHT = new RGBAColor(255, 255, 255, 100); - public static final RGBAColor SLOT_HIGHLIGHT_DRAG = new RGBAColor(200, 200, 200, 150); + var zHeight = 0.0 - public static final int REGULAR_DIMENSIONS = 18; + if (!itemstack.isEmpty) { + RenderSystem.enableDepthTest() - protected void renderSlotBackground(PoseStack stack, float mouse_x, float mouse_y, float flag) { - RenderHelper.drawRegularSlot(stack, 0, 0); - } + val system_stack = RenderSystem.getModelViewStack() - protected void renderRegular(PoseStack stack, ItemStack itemstack) { - renderRegular(stack, itemstack, null); - } - - protected void renderRegular(PoseStack stack, ItemStack itemstack, @Nullable String count_override) { - RenderSystem.setShader(GameRenderer::getPositionTexShader); - - float height = 0; - - if (!itemstack.isEmpty()) { - RenderSystem.enableDepthTest(); - - var system_stack = RenderSystem.getModelViewStack(); - - system_stack.pushPose(); - system_stack.translate(getAbsoluteX() + 1, getAbsoluteY() + 1, 0); - RenderSystem.applyModelViewMatrix(); - - RenderSystem.depthFunc(GL_LESS); + system_stack.pushPose() + system_stack.translate((absoluteX + 1).toDouble(), (absoluteY + 1).toDouble(), 0.0) + RenderSystem.applyModelViewMatrix() + RenderSystem.depthFunc(GL11.GL_LESS) // Thanks Mojang // Very cool // (for int x, int y, which are then cast into doubles anyway) - screen.getItemRenderer().blitOffset = getAccumulatedDepth() - 100; // force item to draw only 50 units "above" background - screen.getItemRenderer().renderAndDecorateItem(Minecraft.getInstance().player, itemstack, 0, 0, (int) (getAbsoluteX() + getAbsoluteY() * 1000) /* some kind of indexing ? */); + screen.itemRenderer.blitOffset = accumulatedDepth - 100 // force item to draw only 50 units "above" background - RenderSystem.depthFunc(GL_ALWAYS); - screen.getItemRenderer().renderGuiItemDecorations(screen.getFont(), itemstack, 0, 0, count_override); + screen.itemRenderer.renderAndDecorateItem( + Minecraft.getInstance().player, + itemstack, + 0, + 0, + (absoluteX + absoluteY * 1000).toInt() + ) - screen.getItemRenderer().blitOffset = 0; + RenderSystem.depthFunc(GL11.GL_ALWAYS) + screen.itemRenderer.renderGuiItemDecorations(screen.font, itemstack, 0, 0, count_override) + screen.itemRenderer.blitOffset = 0f // too big accumulations can lead to Z near clipping issues - accumulate3DHeight(101); - height = 101; - - system_stack.popPose(); - RenderSystem.applyModelViewMatrix(); + accumulate3DHeight(101f) + zHeight = 101.0 + system_stack.popPose() + RenderSystem.applyModelViewMatrix() } - if (isHovered()) { - stack.pushPose(); - stack.translate(0, 0, height); - RenderHelper.setDrawColor(SLOT_HIGHLIGHT); - RenderHelper.drawRect(stack, 1, 1, getWidth() - 1, getHeight() - 1); - stack.popPose(); + if (isHovered) { + stack.pushPose() + stack.translate(0.0, 0.0, zHeight) + RenderHelper.setDrawColor(SLOT_HIGHLIGHT) + RenderHelper.drawRect(stack, 1f, 1f, width - 1, height - 1) + stack.popPose() } } - @Nonnull - abstract protected ItemStack getItemStack(); + protected abstract fun getItemStack(): ItemStack - protected List getItemStackTooltip(ItemStack stack) { - return screen.getTooltipFromItem(stack); + protected open fun getItemStackTooltip(stack: ItemStack): List { + return screen.getTooltipFromItem(stack) } - @Override - protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) { - renderSlotBackground(stack, mouse_x, mouse_y, flag); - - renderRegular(stack, getItemStack()); + override fun innerRender(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) { + renderSlotBackground(stack, mouse_x, mouse_y, flag) + renderRegular(stack, getItemStack()) } - @Override - protected boolean innerRenderTooltips(PoseStack stack, float mouse_x, float mouse_y, float flag) { - if (isHovered()) { - var itemstack = getItemStack(); + override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { + if (isHovered) { + val itemstack = getItemStack() + + if (!itemstack.isEmpty) { + val font = RenderProperties.get(itemstack).getFont(itemstack) - if (!itemstack.isEmpty()) { - Font font = net.minecraftforge.client.RenderProperties.get(itemstack).getFont(itemstack); // TODO: WHERE???????????? // GuiUtils.preItemToolTip(itemstack); - screen.renderComponentTooltip(stack, getItemStackTooltip(itemstack), (int) mouse_x, (int) mouse_y, (font == null ? screen.getFont() : font)); + screen.renderComponentTooltip( + stack, + getItemStackTooltip(itemstack), + mouse_x.toInt(), + mouse_y.toInt(), + font ?: screen.font + ) // GuiUtils.postItemToolTip(); - return true; + return true } } - - return false; + return false } -} + + companion object { + @JvmField + val SLOT_HIGHLIGHT = RGBAColor(255, 255, 255, 100) + @JvmField + val SLOT_HIGHLIGHT_DRAG = RGBAColor(200, 200, 200, 150) + const val REGULAR_DIMENSIONS = 18f + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt index a9dcc6a74..788d8af84 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt @@ -6,8 +6,6 @@ import net.minecraft.client.Minecraft import net.minecraft.client.gui.Font import net.minecraft.client.gui.components.events.GuiEventListener import org.apache.logging.log4j.LogManager -import org.apache.logging.log4j.core.Logger -import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.client.render.RenderHelper import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import kotlin.math.max @@ -675,7 +673,7 @@ open class EditablePanel @JvmOverloads constructor( } - protected open fun mouseClickedInner(mouse_x: Double, mouse_y: Double, flag: Int): Boolean { + protected open fun mouseClickedInner(mouse_x: Double, mouse_y: Double, mouse_click_type: Int): Boolean { return true } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PoweredMatteryMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PoweredMatteryMenu.kt index 4d6b4bda5..624820cbf 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PoweredMatteryMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PoweredMatteryMenu.kt @@ -1,48 +1,39 @@ -package ru.dbotthepony.mc.otm.menu; +package ru.dbotthepony.mc.otm.menu -import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; -import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPowered; -import ru.dbotthepony.mc.otm.capability.MatteryCapability; -import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget; +import net.minecraft.world.inventory.MenuType +import net.minecraft.world.entity.player.Inventory +import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPowered +import ru.dbotthepony.mc.otm.menu.MatteryMenu +import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget +import ru.dbotthepony.mc.otm.menu.BatterySlot +import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage +import ru.dbotthepony.mc.otm.capability.MatteryCapability +import net.minecraft.world.SimpleContainer -import javax.annotation.Nullable; +abstract class PoweredMatteryMenu protected constructor( + menuType: MenuType<*>, + containerID: Int, + inventory: Inventory, + tile: BlockEntityMatteryPowered? = null +) : MatteryMenu(menuType, containerID, inventory, tile) { + @JvmField + val battery_widget: LevelGaugeWidget -abstract public class PoweredMatteryMenu extends MatteryMenu { - public final BlockEntityMatteryPowered tile; + @JvmField + var battery_slot: BatterySlot? = null - public LevelGaugeWidget battery_widget; - public BatterySlot battery_slot; - - protected PoweredMatteryMenu( - @Nullable MenuType menuType, - int containerID, - Inventory inventory, - @Nullable BlockEntityMatteryPowered tile - ) { - super(menuType, containerID, inventory, tile); - this.tile = tile; - - if (tile == null || tile.getCapability(MatteryCapability.ENERGY).resolve().isEmpty()) { - battery_widget = new LevelGaugeWidget(this); + init { + if (tile == null || tile.getCapability(MatteryCapability.ENERGY).resolve().isEmpty) { + battery_widget = LevelGaugeWidget(this) } else { - battery_widget = new LevelGaugeWidget(this, tile.getCapability(MatteryCapability.ENERGY).resolve().get()); + battery_widget = LevelGaugeWidget(this, tile.getCapability(MatteryCapability.ENERGY).resolve().get()) } } - protected void addBatterySlot() { - addBatterySlot(10, 66); + @JvmOverloads + protected fun addBatterySlot(x: Int = 10, y: Int = 66) { + val battery_container = if (tile is BlockEntityMatteryPowered) tile.battery_container else SimpleContainer(1) + battery_slot = BatterySlot(battery_container, 0, x, y) + addSlot(battery_slot!!) } - - protected void addBatterySlot(int x) { - addBatterySlot(x, 66); - } - - protected void addBatterySlot(int x, int y) { - Container battery_container = tile != null ? tile.battery_container : new SimpleContainer(1); - battery_slot = new BatterySlot(battery_container, 0, x, y); - addSlot(battery_slot); - } -} +} \ No newline at end of file