Update item monitor screen

This commit is contained in:
DBotThePony 2022-01-02 16:08:00 +07:00
parent 6ec20989e6
commit 64c60abf3f
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 154 additions and 185 deletions

View File

@ -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.network.chat.Component
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack
import ru.dbotthepony.mc.otm.client.screen.panels.*; import ru.dbotthepony.mc.otm.client.screen.panels.*
import ru.dbotthepony.mc.otm.menu.ItemMonitorMenu; import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel
import ru.dbotthepony.mc.otm.menu.ItemMonitorMenu
import javax.annotation.Nonnull; class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Component) :
import javax.annotation.Nullable; MatteryScreen<ItemMonitorMenu>(menu, inventory, title) {
public class ItemMonitorScreen extends MatteryScreen<ItemMonitorMenu> { override fun makeMainFrame(): FramePanel {
public static final int FRAME_WIDTH = 210; val frame = FramePanel(this, null, 0f, 0f, FRAME_WIDTH, FRAME_HEIGHT, getTitle())
public static final int FRAME_HEIGHT = 110;
public static final int GRID_WIDTH = 9; PowerGaugePanel(this, frame, menu.battery_widget, 8f, 29f)
public static final int GRID_HEIGHT = 5; SlotPanel(this, frame, menu.battery_slot, 8f, 80f)
public ItemMonitorScreen(ItemMonitorMenu menu, Inventory inventory, Component title) { val scrollBar = ScrollBarPanel(this, frame, 192f, 14f, 92f)
super(menu, inventory, title); scrollBar.setupRowMultiplier { menu.view.items.size / GRID_WIDTH }
}
@Nullable val gridPanel = GridPanel(this, frame, 28f, 16f, GRID_WIDTH * 18f, GRID_HEIGHT * 18f, GRID_WIDTH, GRID_HEIGHT)
@Override
protected FramePanel makeMainFrame() {
var frame = new FramePanel(this, null, 0, 0, FRAME_WIDTH, FRAME_HEIGHT, getTitle());
var scroll_bar = new ScrollBarPanel(this, frame, 0, 0, 0); for (i in 0 until GRID_WIDTH * GRID_HEIGHT) {
scroll_bar.setDock(Dock.RIGHT); object : AbstractSlotPanel(this@ItemMonitorScreen, gridPanel) {
scroll_bar.setupRowMultiplier(() -> { override fun getItemStack(): ItemStack {
return menu.view.getItems().size() / GRID_WIDTH; 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()
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();
} }
@Override override fun mouseScrolledInner(mouse_x: Double, mouse_y: Double, scroll: Double): Boolean {
protected boolean mouseScrolledInner(double mouse_x, double mouse_y, double scroll) { return scrollBar.mouseScrolledInner(mouse_x, mouse_y, scroll)
return scroll_bar.mouseScrolledInner(mouse_x, mouse_y, scroll);
} }
@Override override fun mouseClickedInner(mouse_x: Double, mouse_y: Double, mouse_click_type: Int): Boolean {
protected boolean mouseClickedInner(double mouse_x, double mouse_y, int mouse_click_type) { val index = i + scrollBar.getScroll(GRID_WIDTH)
int findex = index + scroll_bar.getScroll(GRID_WIDTH); menu.view.mouseClick(index, mouse_click_type)
menu.view.mouseClick(findex, mouse_click_type); return true
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
} }
} }

View File

@ -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.systems.RenderSystem
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft
import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.GameRenderer
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component
import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.ItemStack; import net.minecraftforge.client.RenderProperties
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen; import org.lwjgl.opengl.GL11
import ru.dbotthepony.mc.otm.client.render.RGBAColor; import ru.dbotthepony.mc.otm.client.render.RGBAColor
import ru.dbotthepony.mc.otm.client.render.RenderHelper; import ru.dbotthepony.mc.otm.client.render.RenderHelper
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import javax.annotation.Nonnull; abstract class AbstractSlotPanel @JvmOverloads constructor(
import javax.annotation.Nullable; screen: MatteryScreen<*>,
import java.util.List; parent: EditablePanel?,
x: Float = 0f,
import static org.lwjgl.opengl.GL11.GL_ALWAYS; y: Float = 0f,
import static org.lwjgl.opengl.GL11.GL_LESS; width: Float = REGULAR_DIMENSIONS,
height: Float = REGULAR_DIMENSIONS
public abstract class AbstractSlotPanel extends EditablePanel { ) : EditablePanel(
public AbstractSlotPanel(@Nonnull MatteryScreen<?> screen, @Nullable EditablePanel parent, float x, float y, float width, float height) { screen, parent, x, y, width, height
super(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) { protected open fun renderRegular(stack: PoseStack, itemstack: ItemStack, count_override: String? = null) {
super(screen, parent, x, y, REGULAR_DIMENSIONS, REGULAR_DIMENSIONS); RenderSystem.setShader { GameRenderer.getPositionTexShader() }
}
public static final RGBAColor SLOT_HIGHLIGHT = new RGBAColor(255, 255, 255, 100); var zHeight = 0.0
public static final RGBAColor SLOT_HIGHLIGHT_DRAG = new RGBAColor(200, 200, 200, 150);
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) { val system_stack = RenderSystem.getModelViewStack()
RenderHelper.drawRegularSlot(stack, 0, 0);
}
protected void renderRegular(PoseStack stack, ItemStack itemstack) { system_stack.pushPose()
renderRegular(stack, itemstack, null); system_stack.translate((absoluteX + 1).toDouble(), (absoluteY + 1).toDouble(), 0.0)
} RenderSystem.applyModelViewMatrix()
RenderSystem.depthFunc(GL11.GL_LESS)
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);
// Thanks Mojang // Thanks Mojang
// Very cool // Very cool
// (for int x, int y, which are then cast into doubles anyway) // (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.itemRenderer.blitOffset = accumulatedDepth - 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 ? */);
RenderSystem.depthFunc(GL_ALWAYS); screen.itemRenderer.renderAndDecorateItem(
screen.getItemRenderer().renderGuiItemDecorations(screen.getFont(), itemstack, 0, 0, count_override); 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 // too big accumulations can lead to Z near clipping issues
accumulate3DHeight(101); accumulate3DHeight(101f)
height = 101; zHeight = 101.0
system_stack.popPose()
system_stack.popPose(); RenderSystem.applyModelViewMatrix()
RenderSystem.applyModelViewMatrix();
} }
if (isHovered()) { if (isHovered) {
stack.pushPose(); stack.pushPose()
stack.translate(0, 0, height); stack.translate(0.0, 0.0, zHeight)
RenderHelper.setDrawColor(SLOT_HIGHLIGHT); RenderHelper.setDrawColor(SLOT_HIGHLIGHT)
RenderHelper.drawRect(stack, 1, 1, getWidth() - 1, getHeight() - 1); RenderHelper.drawRect(stack, 1f, 1f, width - 1, height - 1)
stack.popPose(); stack.popPose()
} }
} }
@Nonnull protected abstract fun getItemStack(): ItemStack
abstract protected ItemStack getItemStack();
protected List<Component> getItemStackTooltip(ItemStack stack) { protected open fun getItemStackTooltip(stack: ItemStack): List<Component> {
return screen.getTooltipFromItem(stack); return screen.getTooltipFromItem(stack)
} }
@Override override fun innerRender(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) {
protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) { renderSlotBackground(stack, mouse_x, mouse_y, flag)
renderSlotBackground(stack, mouse_x, mouse_y, flag); renderRegular(stack, getItemStack())
renderRegular(stack, getItemStack());
} }
@Override override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean {
protected boolean innerRenderTooltips(PoseStack stack, float mouse_x, float mouse_y, float flag) { if (isHovered) {
if (isHovered()) { val itemstack = getItemStack()
var 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???????????? // TODO: WHERE????????????
// GuiUtils.preItemToolTip(itemstack); // 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(); // 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
} }
} }

View File

@ -6,8 +6,6 @@ import net.minecraft.client.Minecraft
import net.minecraft.client.gui.Font import net.minecraft.client.gui.Font
import net.minecraft.client.gui.components.events.GuiEventListener import net.minecraft.client.gui.components.events.GuiEventListener
import org.apache.logging.log4j.LogManager 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.render.RenderHelper
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import kotlin.math.max 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 return true
} }

View File

@ -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.inventory.MenuType
import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.entity.player.Inventory; import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPowered
import net.minecraft.world.inventory.MenuType; import ru.dbotthepony.mc.otm.menu.MatteryMenu
import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPowered; import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget
import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.menu.BatterySlot
import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget; 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 { @JvmField
public final BlockEntityMatteryPowered tile; var battery_slot: BatterySlot? = null
public LevelGaugeWidget battery_widget; init {
public BatterySlot battery_slot; if (tile == null || tile.getCapability(MatteryCapability.ENERGY).resolve().isEmpty) {
battery_widget = LevelGaugeWidget(this)
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);
} else { } 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() { @JvmOverloads
addBatterySlot(10, 66); 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)
protected void addBatterySlot(int x) { addSlot(battery_slot!!)
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);
} }
} }