Update item monitor screen
This commit is contained in:
parent
6ec20989e6
commit
64c60abf3f
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user