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.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<ItemMonitorMenu>(menu, inventory, title) {
public class ItemMonitorScreen extends MatteryScreen<ItemMonitorMenu> {
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
}
}

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.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<Component> getItemStackTooltip(ItemStack stack) {
return screen.getTooltipFromItem(stack);
protected open fun getItemStackTooltip(stack: ItemStack): List<Component> {
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
}
}

View File

@ -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
}

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.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);
}
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);
@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!!)
}
}