diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/PatternState.java b/src/main/java/ru/dbotthepony/mc/otm/capability/PatternState.java index 60bf4a2d7..14c965819 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/PatternState.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/PatternState.java @@ -5,6 +5,7 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.RegistryManager; @@ -28,6 +29,10 @@ public record PatternState(@Nonnull UUID id, @Nonnull Item item, double research return false; } + public ItemStack stack() { + return new ItemStack(item, 1); + } + @Override public int hashCode() { return id.hashCode(); diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/MatterPanelScreen.java b/src/main/java/ru/dbotthepony/mc/otm/screen/MatterPanelScreen.java index e5ed2c0d1..d21a3870c 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/MatterPanelScreen.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/MatterPanelScreen.java @@ -21,18 +21,19 @@ import ru.dbotthepony.mc.otm.capability.PatternState; import ru.dbotthepony.mc.otm.menu.MatterPanelMenu; import ru.dbotthepony.mc.otm.network.MatteryNetworking; import ru.dbotthepony.mc.otm.network.PatternReplicationRequestPacket; +import ru.dbotthepony.mc.otm.screen.panels.*; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; import static org.lwjgl.opengl.GL11.GL_ALWAYS; import static org.lwjgl.opengl.GL11.GL_LESS; public class MatterPanelScreen extends MatteryScreen { - private static final int modal_width = 213; - private static final int modal_height = 110; - - private boolean open_task_list = false; + private static final int MODAL_WIDTH = 213; + private static final int MODAL_HEIGHT = 110; protected static final ResourceLocation CONTAINER = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/matter_panel.png"); @@ -47,599 +48,362 @@ public class MatterPanelScreen extends MatteryScreen { imageHeight = 187; titleLabelY = 5; + } - p_97741_.networkTaskWatcher(task -> { - if (open_task != null && open_task.equals(task)) { - open_task = task; + public static final int GRID_WIDTH = 8; + public static final int GRID_HEIGHT = 9; + + private final ArrayList pattern_slots = new ArrayList<>(); + private final ArrayList task_slots = new ArrayList<>(); + + @Nullable + @Override + protected FramePanel makeMainFrame() { + float width = GRID_WIDTH * AbstractSlotPanel.REGULAR_DIMENSIONS + ScrollBarPanel.WIDTH + FramePanel.PADDING * 2 + 8; + float height = GRID_HEIGHT * AbstractSlotPanel.REGULAR_DIMENSIONS + FramePanel.PADDING_TOP + FramePanel.PADDING; + + var scroll_panel = new ScrollBarPanel(this, null, 0, 0, 0); + + var frame = new FramePanel(this, null, 0, 0, width, height, getTitle()) { + @Override + protected boolean mouseScrolledInner(double mouse_x, double mouse_y, double scroll) { + return scroll_panel.mouseScrolledInner(mouse_x, mouse_y, scroll); } - }, task -> { - if (open_task != null && open_task.equals(task)) { - closeTask(); + }; + + var patterns_tab = frame.addTab(FramePanel.FrameTabPosition.TOP, () -> { + for (var slot : pattern_slots) { + slot.setVisible(true); + } + }, () -> { + for (var slot : pattern_slots) { + slot.setVisible(false); } }); - } - private PatternState open_pattern; - private MatterTask open_task; - private EditBox input_amount; + var tasks_tab = frame.addTab(FramePanel.FrameTabPosition.TOP, () -> { + for (var slot : task_slots) { + slot.setVisible(true); + } + }, () -> { + for (var slot : task_slots) { + slot.setVisible(false); + } + }); - private Button inc_8; - private Button inc_64; - private Button inc_256; + scroll_panel.setParent(frame); + scroll_panel.setDocking(Dock.RIGHT); + scroll_panel.setupRowMultiplier(() -> { + if (tasks_tab.isActive()) { + return menu.tasks.size() / 9; + } - private Button dec_8; - private Button dec_64; - private Button dec_256; + return menu.patterns.size() / 9; + }); - private Button send_modal; - private Button cancel_modal; + var grid = new GridPanel(this, frame, 0, 0, GRID_WIDTH * AbstractSlotPanel.REGULAR_DIMENSIONS, 0, GRID_WIDTH, GRID_HEIGHT) { + @Override + protected boolean mouseScrolledInner(double mouse_x, double mouse_y, double scroll) { + return scroll_panel.mouseScrolledInner(mouse_x, mouse_y, scroll); + } + }; - private Button cancel_task; - private Button close_task; + grid.setDocking(Dock.LEFT); + grid.setDockMargin(4, 0, 0, 0); - private PatternState hovered_pattern; - private MatterTask hovered_task; + for (int i = 0; i < GRID_WIDTH * GRID_HEIGHT; i++) { + int slot = i; - private double scroller_position = 0; + pattern_slots.add(new AbstractSlotPanel(this, grid, 0, 0) { + @Nonnull + @Override + protected ItemStack getItemStack() { + if (slot >= menu.patterns.size()) { + return ItemStack.EMPTY; + } - @Override - protected void init() { - super.init(); + return menu.patterns.get(slot).stack(); + } - int x = (width - modal_width) / 2; - int y = (height - modal_height) / 2; + @Override + protected List getItemStackTooltip(ItemStack stack) { + if (slot >= menu.patterns.size()) { + return List.of(); + } - // окно на создание запроса - int top_level = 15; - int button_width = 40; - int right = 5 + button_width; - int box_width = modal_width - 5 - 5 - 30; + return getPatternTooltip(super.getItemStackTooltip(stack), menu.patterns.get(slot)); + } - inc_8 = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 8), (btn) -> onChangeAmountPress(8)); - right += 2 + button_width; + @Override + protected boolean mouseScrolledInner(double mouse_x, double mouse_y, double scroll) { + return scroll_panel.mouseScrolledInner(mouse_x, mouse_y, scroll); + } - inc_64 = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 64), (btn) -> onChangeAmountPress(64)); - right += 2 + button_width; + @Override + protected boolean mouseClickedInner(double mouse_x, double mouse_y, int flag) { + if (slot >= menu.patterns.size()) { + return true; + } - inc_256 = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 256), (btn) -> onChangeAmountPress(256)); - right = 5 + button_width; + openPattern(menu.patterns.get(slot)); - top_level += 24; + return true; + } + }); - input_amount = new EditBox(font, x + modal_width - 5 - box_width, y + top_level, box_width, 16, new TranslatableComponent("otm.container.matter_panel.number_input")); - input_amount.setMaxLength(6); - input_amount.setValue("1"); - input_amount.visible = false; + task_slots.add(new AbstractSlotPanel(this, grid, 0, 0) { + @Nonnull + @Override + protected ItemStack getItemStack() { + if (slot >= menu.tasks.size()) { + return ItemStack.EMPTY; + } - top_level += 20; + var task = menu.tasks.get(slot); - dec_8 = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 8), (btn) -> onChangeAmountPress(-8)); - right += 2 + button_width; + return task.stack(Math.max(task.required(), 1)); + } - dec_64 = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 64), (btn) -> onChangeAmountPress(-64)); - right += 2 + button_width; + @Override + protected List getItemStackTooltip(ItemStack stack) { + if (slot >= menu.tasks.size()) { + return List.of(); + } - dec_256 = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 256), (btn) -> onChangeAmountPress(-256)); + return getTaskTooltip(super.getItemStackTooltip(stack), menu.tasks.get(slot)); + } - top_level += 24; - right = 5 + button_width; + @Override + protected boolean mouseScrolledInner(double mouse_x, double mouse_y, double scroll) { + return scroll_panel.mouseScrolledInner(mouse_x, mouse_y, scroll); + } - cancel_modal = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.cancel"), (btn) -> closePattern()); - right += 2 + button_width; + @Override + protected boolean mouseClickedInner(double mouse_x, double mouse_y, int flag) { + if (slot >= menu.tasks.size()) { + return true; + } - send_modal = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.send"), (btn) -> onSend()); - - inc_8.visible = false; - inc_64.visible = false; - inc_256.visible = false; - - dec_8.visible = false; - dec_64.visible = false; - dec_256.visible = false; - - send_modal.visible = false; - cancel_modal.visible = false; - - addWidget(input_amount); - addWidget(inc_8); - addWidget(inc_64); - addWidget(inc_256); - addWidget(dec_8); - addWidget(dec_64); - addWidget(dec_256); - addWidget(send_modal); - addWidget(cancel_modal); - - // окно на отмену запроса - right = 5 + button_width; - top_level = modal_height - 8 - 20; - - close_task = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.close"), (btn) -> closeTask()); - - button_width = 90; - right += 2 + button_width; - cancel_task = new Button(x + modal_width - right, y + top_level, button_width, 20, new TranslatableComponent("otm.container.matter_panel.cancel_task"), (btn) -> cancelTask()); - - close_task.visible = false; - cancel_task.visible = false; - - addWidget(close_task); - addWidget(cancel_task); - } - - private void onChangeAmountPress(int amount) { - int value = 1; - - try { - value = Integer.parseInt(input_amount.getValue()); - } catch (Exception ignored) { + openTask(menu.tasks.get(slot)); + return true; + } + }); } - if (value == 1 && amount > 0) - input_amount.setValue(Integer.toString(amount)); - else - input_amount.setValue(Integer.toString(Math.max(1, Math.min(99999, value + amount)))); - } - - private void onSend() { - int value = 1; - - try { - value = Integer.parseInt(input_amount.getValue()); - } catch (Exception ignored) { - + for (var slot : task_slots) { + slot.setVisible(false); } - MatteryNetworking.CHANNEL.sendToServer(new PatternReplicationRequestPacket(open_pattern, value)); - closePattern(); + return frame; } - private void closePattern() { - open_pattern = null; - input_amount.visible = false; - input_amount.changeFocus(false); - inc_8.visible = false; - inc_64.visible = false; - inc_256.visible = false; + private List getTaskTooltip(List input, MatterTask task) { + input.add(new TranslatableComponent("otm.gui.matter_task.total", task.total()).withStyle(ChatFormatting.GRAY)); + input.add(new TranslatableComponent("otm.gui.matter_task.required", task.required()).withStyle(ChatFormatting.GRAY)); + input.add(new TranslatableComponent("otm.gui.matter_task.in_progress", task.in_progress()).withStyle(ChatFormatting.GRAY)); + input.add(new TranslatableComponent("otm.gui.matter_task.finished", task.finished()).withStyle(ChatFormatting.GRAY)); - send_modal.visible = false; - cancel_modal.visible = false; + return input; + } - dec_8.visible = false; - dec_64.visible = false; - dec_256.visible = false; + private List getPatternTooltip(List input, PatternState pattern) { + input.add(new TranslatableComponent("otm.item.pattern.research", String.format("%.2f", pattern.research_percent() * 100d)).withStyle(ChatFormatting.AQUA)); + + return input; } private void openTask(MatterTask task) { - open_task = task; + var task_frame = new FramePanel(this, null, 0, 0, MODAL_WIDTH, MODAL_HEIGHT, new TranslatableComponent("otm.container.matter_panel.task")) { + @Override + public void tick() { + super.tick(); - close_task.visible = true; - cancel_task.visible = true; - } - - private void closeTask() { - open_task = null; - - close_task.visible = false; - cancel_task.visible = false; - } - - private void cancelTask() { - menu.requestTaskCancel(open_task.id()); - closeTask(); - } - - @Override - protected void containerTick() { - super.containerTick(); - - input_amount.tick(); - } - - @Override - public void resize(Minecraft p_96575_, int p_96576_, int p_96577_) { - var input_amount = this.input_amount; - - super.resize(p_96575_, p_96576_, p_96577_); - - if (open_task != null) { - openTask(open_task); - } - - if (open_pattern != null) { - openPattern(open_pattern); - } - - if (input_amount != null) { - this.input_amount.setValue(input_amount.getValue()); - } - } - - protected void renderForeground(PoseStack stack, int mouseX, int mouseY, float p_98421_) { - if (open_pattern != null) { - RenderSystem.disableDepthTest(); - - input_amount.render(stack, mouseX, mouseY, p_98421_); - - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL_ALWAYS); - - inc_8.render(stack, mouseX, mouseY, p_98421_); - - inc_64.render(stack, mouseX, mouseY, p_98421_); - - inc_256.render(stack, mouseX, mouseY, p_98421_); - - dec_8.render(stack, mouseX, mouseY, p_98421_); - dec_64.render(stack, mouseX, mouseY, p_98421_); - dec_256.render(stack, mouseX, mouseY, p_98421_); - dec_8.render(stack, mouseX, mouseY, p_98421_); - - send_modal.render(stack, mouseX, mouseY, p_98421_); - cancel_modal.render(stack, mouseX, mouseY, p_98421_); - - RenderSystem.depthFunc(GL_LESS); - } else if (open_task != null) { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL_ALWAYS); - - cancel_task.render(stack, mouseX, mouseY, p_98421_); - close_task.render(stack, mouseX, mouseY, p_98421_); - - RenderSystem.depthFunc(GL_LESS); - } - } - - @Override - protected void renderLabels(PoseStack p_97808_, int p_97809_, int p_97810_) {} - - @Nonnull - @Override - public List getTooltipFromItem(ItemStack p_96556_) { - List get_list = super.getTooltipFromItem(p_96556_); - - if (hovered_pattern != null) { - get_list.add(new TranslatableComponent("otm.item.pattern.research", String.format("%.2f", hovered_pattern.research_percent() * 100d)).withStyle(ChatFormatting.AQUA)); - } else if (hovered_task != null) { - get_list.add(new TranslatableComponent("otm.gui.matter_task.total", hovered_task.total()).withStyle(ChatFormatting.GRAY)); - get_list.add(new TranslatableComponent("otm.gui.matter_task.required", hovered_task.required()).withStyle(ChatFormatting.GRAY)); - get_list.add(new TranslatableComponent("otm.gui.matter_task.in_progress", hovered_task.in_progress()).withStyle(ChatFormatting.GRAY)); - get_list.add(new TranslatableComponent("otm.gui.matter_task.finished", hovered_task.finished()).withStyle(ChatFormatting.GRAY)); - } - - return get_list; - } - - @Override - protected void renderTooltip(PoseStack pose, int mouseX, int mouseY) { - if (open_pattern != null) { - int x = (width - modal_width) / 2 + 7; - int y = input_amount.y + 1; - - if (mouseX >= x && mouseX <= x + 16 && mouseY >= y && mouseY <= y + 16) { - this.renderTooltip(pose, new ItemStack(open_pattern.item(), 1), mouseX, mouseY); - return; + if (!menu.tasks.contains(task)) { + remove(); + } } - } else if (hovered_pattern != null) { - this.renderTooltip(pose, new ItemStack(hovered_pattern.item(), 1), mouseX, mouseY); - return; - } else if (hovered_task != null) { - this.renderTooltip(pose, new ItemStack(hovered_task.item(), hovered_task.total()), mouseX, mouseY); - return; - } + }; - super.renderTooltip(pose, mouseX, mouseY); + var row_1 = new EditablePanel(this, task_frame); + var row_2 = new EditablePanel(this, task_frame); + + row_1.setHeight(18); + row_2.setHeight(20); + + row_1.setDocking(Dock.TOP); + row_2.setDocking(Dock.TOP); + + row_1.setDockMargin(0, 2, 0, 0); + row_2.setDockMargin(0, 2, 0, 0); + + var slot = new AbstractSlotPanel(this, row_1, 0, 0) { + @Nonnull + @Override + protected ItemStack getItemStack() { + var task1_index = menu.tasks.indexOf(task); + + if (task1_index != -1) { + var task1 = menu.tasks.get(task1_index); + return task1.stack(Math.max(task1.required(), 1)); + } + + return ItemStack.EMPTY; + } + + @Override + protected List getItemStackTooltip(ItemStack stack) { + var task1_index = menu.tasks.indexOf(task); + List get_list = super.getItemStackTooltip(stack); + + if (task1_index != -1) { + getTaskTooltip(get_list, menu.tasks.get(task1_index)); + } + + return get_list; + } + }; + + slot.setDocking(Dock.LEFT); + + var button = new ButtonPanel(this, row_2, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.close")); + button.setDocking(Dock.RIGHT); + button.setDockMargin(2, 0, 0, 0); + button.bindOnPress(task_frame::remove); + + button = new ButtonPanel(this, row_2, 0, 0, 80, 20, new TranslatableComponent("otm.container.matter_panel.cancel_task")); + button.setDocking(Dock.RIGHT); + button.setDockMargin(2, 0, 0, 0); + button.bindOnPress(() -> { + menu.requestTaskCancel(task.id()); + task_frame.remove(); + }); + + task_frame.toScreenCenter(); + addPanel(task_frame); } private void openPattern(PatternState state) { - open_pattern = state; - input_amount.setValue("1"); - // input_amount.setFocus(true); // bugged - scrolling = false; + var pattern_frame = new FramePanel(this, null, 0, 0, MODAL_WIDTH, MODAL_HEIGHT, new TranslatableComponent("otm.container.matter_panel.label")); + var row_1 = new EditablePanel(this, pattern_frame); + var row_2 = new EditablePanel(this, pattern_frame); + var row_3 = new EditablePanel(this, pattern_frame); + var row_4 = new EditablePanel(this, pattern_frame); - input_amount.visible = true; - inc_8.visible = true; - inc_64.visible = true; - inc_256.visible = true; + row_1.setDocking(Dock.TOP); + row_2.setDocking(Dock.TOP); + row_3.setDocking(Dock.TOP); + row_4.setDocking(Dock.TOP); - dec_8.visible = true; - dec_64.visible = true; - dec_256.visible = true; + row_1.setHeight(20); + row_2.setHeight(20); + row_3.setHeight(20); + row_4.setHeight(20); - send_modal.visible = true; - cancel_modal.visible = true; - } + row_1.setDockMargin(0, 2, 0, 0); + row_2.setDockMargin(0, 2, 0, 0); + row_3.setDockMargin(0, 2, 0, 0); + row_4.setDockMargin(0, 2, 0, 0); - private double scroller_position_regular = 0; - private double scroller_position_tasks = 0; - - private void openTaskList() { - open_task_list = true; - scroller_position_regular = scroller_position; - scroller_position = scroller_position_tasks; - - } - - private void closeTaskList() { - open_task_list = false; - scroller_position_tasks = scroller_position; - scroller_position = scroller_position_regular; - } - - @Override - public boolean mouseClicked(double mouse_x, double mouse_y, int p_97750_) { - if (open_task == null && open_pattern == null) { - if (hovered_pattern != null) { - openPattern(hovered_pattern); - Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - return true; - } else if (hovered_task != null) { - openTask(hovered_task); - Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - return true; + var slot = new AbstractSlotPanel(this, row_2, 0, 0) { + @Nonnull + @Override + protected ItemStack getItemStack() { + return new ItemStack(state.item(), 1); } - } - int button_x = leftPos + 157; - int button_y = topPos + 20 + (int) ((scroller_position / maxScroll()) * 145); - int button_width = 12; - int button_height = 15; + @Override + protected List getItemStackTooltip(ItemStack stack) { + return getPatternTooltip(super.getItemStackTooltip(stack), state); + } + }; - scrolling = maxScroll() > 0 && mouse_x >= button_x && button_x + button_width >= mouse_x && mouse_y >= button_y && button_y + button_height >= mouse_y; + var input_amount = new EditBoxPanel(this, row_2, 0, 0, 10, 20, new TextComponent("Input amount")) { + @Override + protected void factorize(EditBox widget, boolean recreation) { + super.factorize(widget, recreation); - if (open_task == null && open_pattern == null) { - if (open_task_list) { - button_x = leftPos; - button_y = topPos - 28; - button_width = 28; - button_height = 30; + widget.setMaxLength(6); - if (mouse_x >= button_x && button_x + button_width >= mouse_x && mouse_y >= button_y && button_y + button_height >= mouse_y) { - closeTaskList(); - Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - } - } else { - button_x = leftPos + 28; - button_y = topPos - 28; - button_width = 28; - button_height = 30; - - if (mouse_x >= button_x && button_x + button_width >= mouse_x && mouse_y >= button_y && button_y + button_height >= mouse_y) { - openTaskList(); - Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + if (!recreation) { + widget.setValue("1"); } } - } - return super.mouseClicked(mouse_x, mouse_y, p_97750_); - } + private void increase(int amount) { + int value = 1; - @Override - public boolean mouseReleased(double p_97812_, double p_97813_, int p_97814_) { - scrolling = false; - return super.mouseReleased(p_97812_, p_97813_, p_97814_); - } + try { + value = Integer.parseInt(getOrCreateWidget().getValue()); + } catch (Exception ignored) { - @Override - public boolean mouseScrolled(double mouse_x, double mouse_y, double scroll) { - if (open_pattern != null) { - return true; - } - - if (super.mouseScrolled(mouse_x, mouse_y, scroll)) { - return true; - } - - scroller_position = Math.max(0, Math.min(maxScroll(), scroller_position - scroll)); - - return true; - } - - @Override - public boolean mouseDragged(double mouse_x, double mouse_y, int flag, double drag_x, double drag_y) { - if (scrolling && maxScroll() > 0) { - if (mouse_y < topPos + 20) { - scroller_position = 0; - } else if (mouse_y > topPos + 20 + 160) { - scroller_position = maxScroll(); - } else { - scroller_position = maxScroll() * (mouse_y - topPos - 20) / 160d; - } - } - - return super.mouseDragged(mouse_x, mouse_y, flag, drag_x, drag_y); - } - - private boolean scrolling = false; - - private int maxScroll() { - if (open_task_list) { - if (menu.tasks.size() < 16) { - return 0; - } - - return (int) Math.floor(menu.tasks.size() / 8d - 2d); - } - - if (menu.patterns.size() < 16) { - return 0; - } - - return (int) Math.floor(menu.patterns.size() / 8d - 2d); - } - - @Override - protected void renderBg(PoseStack pose, float p_97788_, int mouseX, int mouseY) { - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.setShaderTexture(0, CONTAINER_BACKGROUND()); - - if (open_task_list) { - // список паттернов - blit(pose, leftPos, topPos - 28, 176, 65, 28, 30); - } else { - // список задач - blit(pose, leftPos + 28, topPos - 28, 204, 65, 28, 30); - } - - super.renderBg(pose, p_97788_, mouseX, mouseY); - - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.setShaderTexture(0, CONTAINER_BACKGROUND()); - - if (maxScroll() > 0) { - if (scrolling) { - blit(pose, leftPos + 157, topPos + 20 + (int) ((scroller_position / maxScroll()) * 145), 188, 0, 12, 15); - } else { - blit(pose, leftPos + 157, topPos + 20 + (int) ((scroller_position / maxScroll()) * 145), 176, 0, 12, 15); - } - } else { - blit(pose, leftPos + 157, topPos + 20, 176, 0, 12, 15); - } - - if (open_task_list) { - // список задач - blit(pose, leftPos + 28, topPos - 28, 204, 33, 28, 32); - } else { - // список паттернов - blit(pose, leftPos, topPos - 28, 176, 33, 28, 32); - } - - this.font.draw(pose, this.title, (float) (leftPos + this.titleLabelX), (float) (topPos + this.titleLabelY), 4210752); - - hovered_pattern = null; - hovered_task = null; - - int cells_width = 8; - int cells_height = 9; - - int render_x = leftPos + 10; - int render_y = topPos + 20; - int cell_x = 0; - int cell_y = 0; - - RenderSystem.enableDepthTest(); - - if (open_task_list) { - for (int index = ((int) scroller_position) * 9; index < menu.tasks.size(); index++) { - var state = menu.tasks.get(index); - var itemstack = new ItemStack(state.item(), Math.max(1, state.required())); - - // player, itemstack, x, y, ?????????? - this.itemRenderer.renderAndDecorateItem(this.minecraft.player, itemstack, render_x, render_y, -1); - // font, itemstack, x, y, string - this.itemRenderer.renderGuiItemDecorations(this.font, itemstack, render_x, render_y, null); - - if (hovered_task == null && mouseX >= render_x && mouseX <= render_x + 16 && mouseY >= render_y && mouseY <= render_y + 16) { - hovered_task = state; } - cell_x++; - render_x += 18; - - if (cell_x >= cells_width) { - render_x = leftPos + 10; - render_y += 18; - cell_x = 0; - cell_y++; - - if (cell_y >= cells_height) - break; - } + if (value == 1 && amount > 0) + getOrCreateWidget().setValue(Integer.toString(amount)); + else + getOrCreateWidget().setValue(Integer.toString(Math.max(1, Math.min(99999, value + amount)))); } - } else { - for (int index = ((int) scroller_position) * 9; index < menu.patterns.size(); index++) { - var state = menu.patterns.get(index); - var itemstack = new ItemStack(state.item(), 1); + }; - // player, itemstack, x, y, ?????????? - this.itemRenderer.renderAndDecorateItem(this.minecraft.player, itemstack, render_x, render_y, -1); - // font, itemstack, x, y, string - this.itemRenderer.renderGuiItemDecorations(this.font, itemstack, render_x, render_y, null); + var button = new ButtonPanel(this, row_1, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 8)); + button.bindOnPress(() -> input_amount.increase(8)); + button.setDocking(Dock.RIGHT); + button.setDockMargin(2, 0, 0, 0); - if (hovered_pattern == null && mouseX >= render_x && mouseX <= render_x + 16 && mouseY >= render_y && mouseY <= render_y + 16) { - hovered_pattern = state; - } + button = new ButtonPanel(this, row_1, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 64)); + button.setDocking(Dock.RIGHT); + button.bindOnPress(() -> input_amount.increase(64)); + button.setDockMargin(2, 0, 0, 0); - cell_x++; - render_x += 18; + button = new ButtonPanel(this, row_1, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.increase_by", 256)); + button.setDocking(Dock.RIGHT); + button.bindOnPress(() -> input_amount.increase(256)); + button.setDockMargin(2, 0, 0, 0); - if (cell_x >= cells_width) { - render_x = leftPos + 10; - render_y += 18; - cell_x = 0; - cell_y++; + slot.setDocking(Dock.LEFT); + slot.setDockMargin(0, 0, 4, 0); + input_amount.setDocking(Dock.FILL); - if (cell_y >= cells_height) - break; - } - } - } + button = new ButtonPanel(this, row_3, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 8)); + button.bindOnPress(() -> input_amount.increase(-8)); + button.setDocking(Dock.RIGHT); + button.setDockMargin(2, 0, 0, 0); - if (open_pattern != null || open_task != null) { - RenderSystem.depthFunc(GL_ALWAYS); + button = new ButtonPanel(this, row_3, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 64)); + button.setDocking(Dock.RIGHT); + button.bindOnPress(() -> input_amount.increase(-64)); + button.setDockMargin(2, 0, 0, 0); - this.renderBackground(pose); + button = new ButtonPanel(this, row_3, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.decrease_by", 256)); + button.setDocking(Dock.RIGHT); + button.bindOnPress(() -> input_amount.increase(-256)); + button.setDockMargin(2, 0, 0, 0); - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.setShaderTexture(0, CONTAINER_BACKGROUND()); - // PoseStack, x, y, image_start_x, image_start_y, rect_size_x, rect_size_y + button = new ButtonPanel(this, row_4, 0, 0, 40, 20, new TranslatableComponent("otm.container.matter_panel.cancel")); + button.setDocking(Dock.RIGHT); + button.bindOnPress(pattern_frame::remove); + button.setDockMargin(2, 0, 0, 0); - int x = (width - modal_width) / 2; - int y = (height - modal_height) / 2; + button = new ButtonPanel(this, row_4, 0, 0, 82, 20, new TranslatableComponent("otm.container.matter_panel.send")); + button.setDocking(Dock.RIGHT); + button.bindOnPress(() -> { + int value = 1; - // заголовок - int dy = 0; - this.blit(pose, x, y, 0, 188, modal_width, 4); - dy += 4; + try { + value = Integer.parseInt(input_amount.getOrCreateWidget().getValue()); + } catch (Exception ignored) { - for (; dy < modal_height - 10; dy += 5) - this.blit(pose, x, y + dy, 0, 192, modal_width, 5); - - this.blit(pose, x, y + dy, 0, 197, modal_width, 4); - - if (open_pattern != null) { - // фон слота - this.blit(pose, x + 6, input_amount.y, 176, 15, 18, 18); - } else { - this.blit(pose, x + 6, y + 19, 176, 15, 18, 18); } - ItemStack itemstack; + MatteryNetworking.CHANNEL.sendToServer(new PatternReplicationRequestPacket(state, value)); + pattern_frame.remove(); + }); - if (open_pattern != null) { - itemstack = new ItemStack(open_pattern.item(), 1); - } else { - itemstack = new ItemStack(open_task.item(), 1); - } + button.setDockMargin(2, 0, 0, 0); - RenderSystem.enableDepthTest(); - - if (open_pattern != null) { - // player, itemstack, x, y, ?????????? - this.itemRenderer.renderAndDecorateItem(this.minecraft.player, itemstack, x + 7, input_amount.y + 1, 100); - // font, itemstack, x, y, string - this.itemRenderer.renderGuiItemDecorations(this.font, itemstack, x + 7, input_amount.y + 1, null); - } else { - // player, itemstack, x, y, ?????????? - this.itemRenderer.renderAndDecorateItem(this.minecraft.player, itemstack, x + 7, y + 20, 100); - // font, itemstack, x, y, string - // this.itemRenderer.renderGuiItemDecorations(this.font, itemstack, x + 7, input_amount.y + 1, null); - } - - if (open_pattern != null) { - this.font.draw(pose, new TranslatableComponent("otm.container.matter_panel.label"), (float) (x + 6), (float) (y + 5), 4210752); - this.font.draw(pose, new TranslatableComponent("otm.item.pattern.line", itemstack.getDisplayName(), String.format("%.2f", open_pattern.research_percent() * 100d)), (float) (x + 6), (float) (cancel_modal.y), ChatFormatting.AQUA.getColor()); - } else { - this.font.draw(pose, new TranslatableComponent("otm.container.matter_panel.task"), (float) (x + 6), (float) (y + 5), 4210752); - this.font.draw(pose, new TranslatableComponent("otm.container.matter_panel.task_line", itemstack.getDisplayName(), open_task.in_progress(), open_task.finished(), open_task.total()), (float) (x + 27), (float) (y + 20), 4210752); - this.font.draw(pose, new TextComponent(open_task.id().toString().substring(0, 8) + "..."), (float) (x + 27), (float) (y + 30), 4210752); - } - - RenderSystem.depthFunc(GL_LESS); - } + addPanel(pattern_frame); + pattern_frame.toScreenCenter(); + popup(pattern_frame); } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java b/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java index 8d9aff9b2..808a9f440 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/MatteryScreen.java @@ -105,6 +105,7 @@ public abstract class MatteryScreen extends AbstractConta protected final ArrayList panels = new ArrayList<>(); public FramePanel inventory_frame; public FramePanel main_frame; + private boolean made_main_frame = false; public MatteryScreen(T menu, Inventory inventory, Component title) { super(menu, inventory, title); @@ -125,22 +126,6 @@ public abstract class MatteryScreen extends AbstractConta slot); } } - - main_frame = makeMainFrame(); - - if (main_frame != null) { - addPanel(main_frame); - - for (var widget : menu.mattery_widgets) { - new MatteryWidgetPanel(this, main_frame, widget); - } - - for (var slot : menu.main_slots) { - new SlotPanel<>(this, main_frame, slot); - } - } - - movePanels(); } public void addPanel(EditablePanel panel) { @@ -148,6 +133,10 @@ public abstract class MatteryScreen extends AbstractConta panels.add(panel); } + public void removePanel(EditablePanel panel) { + panels.remove(panel); + } + @Nullable protected FramePanel makeMainFrame() { return new FramePanel(this, null, 0, 0, 18 * 9 + 16, 100, getTitle()); @@ -208,16 +197,18 @@ public abstract class MatteryScreen extends AbstractConta @Override public boolean mouseClicked(double p_97748_, double p_97749_, int p_97750_) { + var happen_to_click = false; + for (int i = panels.size() - 1; i >= 0; i--) { var panel = panels.get(i); - if (panel.mouseClickedChecked(p_97748_, p_97749_, p_97750_)) { - return true; + if (happen_to_click) { + panel.killFocus(); + } else if (panel.mouseClickedChecked(p_97748_, p_97749_, p_97750_)) { + happen_to_click = true; } } - // this.slotClicked(null, -999, p_97750_, ClickType.THROW); - return true; } @@ -263,6 +254,32 @@ public abstract class MatteryScreen extends AbstractConta return true; } + @Override + public boolean keyReleased(int p_94715_, int p_94716_, int p_94717_) { + for (int i = panels.size() - 1; i >= 0; i--) { + var panel = panels.get(i); + + if (panel.keyReleased(p_94715_, p_94716_, p_94717_)) { + return true; + } + } + + return true; + } + + @Override + public boolean charTyped(char p_94683_, int p_94684_) { + for (int i = panels.size() - 1; i >= 0; i--) { + var panel = panels.get(i); + + if (panel.charTyped(p_94683_, p_94684_)) { + return true; + } + } + + return true; + } + @Override public boolean keyPressed(int p_97765_, int p_97766_, int p_97767_) { InputConstants.Key mouseKey = InputConstants.getKey(p_97765_, p_97766_); @@ -319,6 +336,25 @@ public abstract class MatteryScreen extends AbstractConta @Override public void render(PoseStack pose, int mouse_x, int mouse_y, float flag) { + if (!made_main_frame) { + made_main_frame = true; + main_frame = makeMainFrame(); + + if (main_frame != null) { + addPanel(main_frame); + + for (var widget : menu.mattery_widgets) { + new MatteryWidgetPanel(this, main_frame, widget); + } + + for (var slot : menu.main_slots) { + new SlotPanel<>(this, main_frame, slot); + } + } + + movePanels(); + } + int render_x = this.leftPos; int render_y = this.topPos; @@ -381,7 +417,8 @@ public abstract class MatteryScreen extends AbstractConta RenderSystem.disableDepthTest(); - // forge's hard limit on tooltip Z position + // forge's hard limit tooltip Z position to 500 units + // so if we have anything drawn above 500 units, lift it up if (depth > 500) { pose.pushPose(); pose.translate(0, 0, depth - 500); @@ -391,8 +428,12 @@ public abstract class MatteryScreen extends AbstractConta if (this.hoveredSlot != null && this.hoveredSlot.hasItem()) { this.renderTooltip(pose, this.hoveredSlot.getItem(), mouse_x, mouse_y); } else { - for (var panel : panels) { - panel.renderTooltips(pose, mouse_x, mouse_y, flag); + for (int i = panels.size() - 1; i >= 0; i--) { + var panel = panels.get(i); + + if (panel.renderTooltips(pose, mouse_x, mouse_y, flag)) { + break; + } } } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java b/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java index 7a97a000e..80d4f0243 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java @@ -10,6 +10,8 @@ import ru.dbotthepony.mc.otm.OverdriveThatMatters; /** * I am too lazy to learn how Mojang's API works * so I just recreate part of GMod's API in here + * + * also contains texture widgets */ public class RenderHelper { private static final Matrix4f identity = new Matrix4f(); @@ -182,6 +184,8 @@ public class RenderHelper { public record SkinElement(ResourceLocation texture, float image_x, float image_y, float rect_w, float rect_h, float defined_width, float defined_height) { public void render(PoseStack stack, float x, float y, float width, float height) { RenderSystem.setShaderTexture(0, texture); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); drawTexturedRectUV( stack, @@ -195,6 +199,57 @@ public class RenderHelper { (image_y + rect_h) / defined_height); } + public void render(PoseStack stack, float x, float y) { + RenderSystem.setShaderTexture(0, texture); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + + drawTexturedRectUV( + stack, + x, + y, + rect_w, + rect_h, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } + + public void renderW(PoseStack stack, float x, float y, float width) { + RenderSystem.setShaderTexture(0, texture); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + + drawTexturedRectUV( + stack, + x, + y, + width, + rect_h, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } + + public void renderH(PoseStack stack, float x, float y, float height) { + RenderSystem.setShaderTexture(0, texture); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + + drawTexturedRectUV( + stack, + x, + y, + rect_w, + height, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } + public void renderRaw(PoseStack stack, float x, float y, float width, float height) { // RenderSystem.setShader(GameRenderer::getPositionTexShader); // RenderSystem.setShaderTexture(0, texture); @@ -210,9 +265,25 @@ public class RenderHelper { (image_x + rect_w) / defined_width, (image_y + rect_h) / defined_height); } + + public void renderRaw(PoseStack stack, float x, float y) { + // RenderSystem.setShader(GameRenderer::getPositionTexShader); + // RenderSystem.setShaderTexture(0, texture); + + drawTexturedRectUV( + stack, + x, + y, + rect_w, + rect_h, + image_x / defined_width, + image_y / defined_height, + (image_x + rect_w) / defined_width, + (image_y + rect_h) / defined_height); + } } - public static final SkinElement upper_left_window_corner = new SkinElement( + public static final SkinElement top_left_window_corner = new SkinElement( WIDGETS, 18, 0, @@ -222,7 +293,7 @@ public class RenderHelper { 256 ); - public static final SkinElement upper_right_window_corner = new SkinElement( + public static final SkinElement top_right_window_corner = new SkinElement( WIDGETS, 24, 0, @@ -294,14 +365,110 @@ public class RenderHelper { public static final SkinElement window_background = new SkinElement( WIDGETS, - 22, - 4, - 4, - 4, + 30, + 12, + 6, + 6, 256, 256 ); + public static final SkinElement scroll_bar_top = new SkinElement( + WIDGETS, + 18, + 57, + 14, + 2, + 256, + 256 + ); + + public static final SkinElement scroll_bar_bottom = new SkinElement( + WIDGETS, + 18, + 63, + 14, + 2, + 256, + 256 + ); + + public static final SkinElement scroll_bar_body = new SkinElement( + WIDGETS, + 18, + 58, + 14, + 6, + 256, + 256 + ); + + public static final SkinElement scroll_bar_button = new SkinElement( + WIDGETS, + 18, + 12, + 12, + 15, + 256, + 256 + ); + + public static final SkinElement scroll_bar_button_hover = new SkinElement( + WIDGETS, + 18, + 27, + 12, + 15, + 256, + 256 + ); + + public static final SkinElement scroll_bar_button_press = new SkinElement( + WIDGETS, + 18, + 42, + 12, + 15, + 256, + 256 + ); + + public static final SkinElement tab_right_connection = new SkinElement( + WIDGETS, + 30, + 0, + 3, + 5, + 256, + 256 + ); + + public static final SkinElement tab_left_connection = new SkinElement( + WIDGETS, + 33, + 0, + 3, + 5, + 256, + 256 + ); + + public static final SkinElement tab_background = new SkinElement( + WIDGETS, + 30, + 6, + 6, + 6, + 256, + 256 + ); + + public static void drawScrollBarBackground(PoseStack stack, float x, float y, float height) { + scroll_bar_body.render(stack, x, y + 2, 14, height - 4); + scroll_bar_top.render(stack, x, y, 14, 2); + scroll_bar_bottom.render(stack, x, y + height - 2, 14, 2); + } + public static void drawRegularSlot( PoseStack stack, float x, @@ -343,8 +510,8 @@ public class RenderHelper { bottom_window_border.renderRaw(stack, x + 4, y + height - 3, width - 8, 3); // corners - upper_left_window_corner.renderRaw(stack, x, y, 6, 6); - upper_right_window_corner.renderRaw(stack, x + width - 6, y, 6, 6); + top_left_window_corner.renderRaw(stack, x, y, 6, 6); + top_right_window_corner.renderRaw(stack, x + width - 6, y, 6, 6); bottom_left_window_corner.renderRaw(stack, x, y + height - 6, 6, 6); bottom_right_window_corner.renderRaw(stack, x + width - 6, y + height - 6, 6, 6); diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/AbstractSlotPanel.java b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/AbstractSlotPanel.java new file mode 100644 index 000000000..a996b23f3 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/AbstractSlotPanel.java @@ -0,0 +1,113 @@ +package ru.dbotthepony.mc.otm.screen.panels; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.ChatFormatting; +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.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import ru.dbotthepony.mc.otm.OverdriveThatMatters; +import ru.dbotthepony.mc.otm.menu.slot.MatterySlot; +import ru.dbotthepony.mc.otm.screen.MatteryScreen; +import ru.dbotthepony.mc.otm.screen.RGBAColor; +import ru.dbotthepony.mc.otm.screen.RenderHelper; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +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); + } + + public AbstractSlotPanel(@Nonnull MatteryScreen screen, @Nullable EditablePanel parent, float x, float y) { + super(screen, parent, x, y, REGULAR_DIMENSIONS, REGULAR_DIMENSIONS); + } + + 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); + + public static final int REGULAR_DIMENSIONS = 18; + + protected void renderSlotBackground(PoseStack stack, float mouse_x, float mouse_y, float flag) { + RenderHelper.drawRegularSlot(stack, 0, 0); + } + + 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(parent_x + 1, parent_y + 1, 0); + RenderSystem.applyModelViewMatrix(); + + // Thanks Mojang + // Very cool + // (for int x, int y, which are then cast into doubles anyway) + screen.getItemRenderer().blitOffset = accumulated_depth - 100; // force item to draw only 50 units "above" background + screen.getItemRenderer().renderAndDecorateItem(Minecraft.getInstance().player, itemstack, 0, 0, (int) (parent_x + parent_y * 1000) /* some kind of indexing ? */); + screen.getItemRenderer().renderGuiItemDecorations(screen.getFont(), itemstack, 0, 0, count_override); + + // too big accumulations can lead to Z near clipping issues + accumulate3DHeight(101); + height = 101; + + system_stack.popPose(); + RenderSystem.applyModelViewMatrix(); + } + + if (is_hovered) { + stack.pushPose(); + stack.translate(0, 0, height); + RenderHelper.setDrawColor(SLOT_HIGHLIGHT); + RenderHelper.drawRect(stack, 1, 1, getWidth() - 1, getHeight() - 1); + stack.popPose(); + } + } + + @Nonnull + abstract protected ItemStack getItemStack(); + + protected List getItemStackTooltip(ItemStack stack) { + 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 + protected boolean innerRenderTooltips(PoseStack stack, float mouse_x, float mouse_y, float flag) { + if (is_hovered) { + var itemstack = getItemStack(); + + if (!itemstack.isEmpty()) { + Font font = net.minecraftforge.client.RenderProperties.get(itemstack).getFont(itemstack); + net.minecraftforge.fmlclient.gui.GuiUtils.preItemToolTip(itemstack); + screen.renderComponentToolTip(stack, getItemStackTooltip(itemstack), (int) mouse_x, (int) mouse_y, (font == null ? screen.getFont() : font)); + net.minecraftforge.fmlclient.gui.GuiUtils.postItemToolTip(); + + return true; + } + } + + return false; + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/ButtonPanel.java b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/ButtonPanel.java new file mode 100644 index 000000000..aedf582b8 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/ButtonPanel.java @@ -0,0 +1,33 @@ +package ru.dbotthepony.mc.otm.screen.panels; + +import net.minecraft.client.gui.components.Button; +import net.minecraft.network.chat.Component; +import ru.dbotthepony.mc.otm.screen.MatteryScreen; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class ButtonPanel extends MinecraftWidgetPanel