From dd6d30e0113fb9f617f0ff8c40d8ef42a6235e4b Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 22 Feb 2022 18:39:03 +0700 Subject: [PATCH] Number client input, energy counter io limit --- .../mc/otm/client/render/RGBAColor.java | 65 ------------- .../mc/otm/client/render/RenderHelper.java | 19 ++-- .../otm/client/screen/MatterPanelScreen.java | 4 +- .../mc/otm/network/MatteryNetworking.java | 10 ++ .../client/render/EnergyCounterRenderer.kt | 17 ++-- .../dbotthepony/mc/otm/client/render/Ext.kt | 2 +- .../render/GravitationStabilizerRenderer.kt | 1 - .../otm/client/screen/ScreenAndroidStation.kt | 2 +- .../mc/otm/client/screen/ScreenDriveViewer.kt | 4 +- .../otm/client/screen/ScreenEnergyCounter.kt | 25 ++++- .../client/screen/panels/AbstractSlotPanel.kt | 2 +- .../otm/client/screen/panels/EditBoxPanel.kt | 11 ++- .../otm/client/screen/panels/EditablePanel.kt | 3 +- .../mc/otm/client/screen/panels/FramePanel.kt | 35 ++++--- .../mc/otm/client/screen/panels/Label.kt | 4 +- .../client/screen/panels/NumberInputPanel.kt | 42 +++++++++ .../ru/dbotthepony/mc/otm/core/RGBAColor.kt | 58 ++++++++++++ .../mc/otm/menu/MenuEnergyCounter.kt | 22 ++++- .../menu/widget/NumberPlayerInputWidget.kt | 93 +++++++++++++++++++ .../overdrive_that_matters/lang/en_us.json | 1 + 20 files changed, 306 insertions(+), 114 deletions(-) delete mode 100644 src/main/java/ru/dbotthepony/mc/otm/client/render/RGBAColor.java create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/NumberInputPanel.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/RGBAColor.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/NumberPlayerInputWidget.kt diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/render/RGBAColor.java b/src/main/java/ru/dbotthepony/mc/otm/client/render/RGBAColor.java deleted file mode 100644 index dc6fcccb2..000000000 --- a/src/main/java/ru/dbotthepony/mc/otm/client/render/RGBAColor.java +++ /dev/null @@ -1,65 +0,0 @@ -package ru.dbotthepony.mc.otm.client.render; - -import com.mojang.blaze3d.systems.RenderSystem; - -public record RGBAColor(float r, float g, float b, float a) { - public static final RGBAColor BLACK = new RGBAColor(0, 0, 0, 1f); - public static final RGBAColor WHITE = new RGBAColor(1f, 1f, 1f, 1f); - public static final RGBAColor SLATE_GRAY = new RGBAColor(64, 64, 64); - - public int whole() { - return - Math.min(255, Math.max(0, Math.round(r * 255))) << 16 | - Math.min(255, Math.max(0, Math.round(g * 255))) << 8 | - Math.min(255, Math.max(0, Math.round(b * 255))); - } - - public int wholeinv() { - return - Math.min(255, Math.max(0, Math.round(b * 255))) << 16 | - Math.min(255, Math.max(0, Math.round(g * 255))) << 8 | - Math.min(255, Math.max(0, Math.round(r * 255))); - } - - public RGBAColor(int r, int g, int b) { - this(r / 255F, g / 255F, b / 255F, 1F); - } - - public RGBAColor(int r, int g, int b, int a) { - this(r / 255F, g / 255F, b / 255F, a / 255F); - } - - public static RGBAColor inv(int color) { - var r = ((color & 0xFF000000) >>> 24) / 255F; - var g = ((color & 0xFF0000) >>> 16) / 255F; - var b = ((color & 0xFF00) >>> 8) / 255F; - var a = (color & 0xFF) / 255F; - - return new RGBAColor(a, b, g, r); - } - - public RGBAColor(int color) { - this(((color & 0xFF000000) >>> 24) / 255F, ((color & 0xFF0000) >>> 16) / 255F, ((color & 0xFF00) >>> 8) / 255F, (color & 0xFF) / 255F); - } - - public int toInt() { - var r = (int) this.r; - var g = (int) this.g; - var b = (int) this.b; - - return r << 16 | g << 8 | b; - } - - public void setSystemColor() { - setShaderColor(); - setDrawColor(); - } - - public void setShaderColor() { - RenderSystem.setShaderColor(r, g, b, a); - } - - public void setDrawColor() { - RenderHelper.setDrawColor(this); - } -} diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/render/RenderHelper.java b/src/main/java/ru/dbotthepony/mc/otm/client/render/RenderHelper.java index 52b7bb24e..0a4bd7405 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/client/render/RenderHelper.java +++ b/src/main/java/ru/dbotthepony/mc/otm/client/render/RenderHelper.java @@ -7,6 +7,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.resources.ResourceLocation; import ru.dbotthepony.mc.otm.OverdriveThatMatters; +import ru.dbotthepony.mc.otm.core.RGBAColor; import java.util.Stack; @@ -121,19 +122,19 @@ public class RenderHelper { final float y_post = (float) (Math.sin(tilt_post) + 0.5) * radius; builder.vertex(matrix, x_pre * (float) Math.cos(tilt_post), y_post, z_pre * (float) Math.cos(tilt_post)) - .color(draw_color.r(), draw_color.g(), draw_color.b(), draw_color.a()) + .color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()) .endVertex(); builder.vertex(matrix, x_post * (float) Math.cos(tilt_post), y_post, z_post * (float) Math.cos(tilt_post)) - .color(draw_color.r(), draw_color.g(), draw_color.b(), draw_color.a()) + .color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()) .endVertex(); builder.vertex(matrix, x_post * (float) Math.cos(tilt_pre), y_pre, z_post * (float) Math.cos(tilt_pre)) - .color(draw_color.r(), draw_color.g(), draw_color.b(), draw_color.a()) + .color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()) .endVertex(); builder.vertex(matrix, x_pre * (float) Math.cos(tilt_pre), y_pre, z_pre * (float) Math.cos(tilt_pre)) - .color(draw_color.r(), draw_color.g(), draw_color.b(), draw_color.a()) + .color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()) .endVertex(); } @@ -334,7 +335,7 @@ public class RenderHelper { } public static void setShaderColor(RGBAColor rect_color) { - RenderSystem.setShaderColor(rect_color.r(), rect_color.g(), rect_color.b(), rect_color.a()); + RenderSystem.setShaderColor(rect_color.getRed(), rect_color.getGreen(), rect_color.getBlue(), rect_color.getAlpha()); } private static RGBAColor draw_color = new RGBAColor(255, 255, 255, 255); @@ -367,10 +368,10 @@ public class RenderHelper { builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - builder.vertex(matrix, x, y + height, depth_z).color(draw_color.r(), draw_color.g(), draw_color.b(), draw_color.a()).endVertex(); - builder.vertex(matrix, x + width, y + height, depth_z).color(draw_color.r(), draw_color.g(), draw_color.b(), draw_color.a()).endVertex(); - builder.vertex(matrix, x + width, y, depth_z).color(draw_color.r(), draw_color.g(), draw_color.b(), draw_color.a()).endVertex(); - builder.vertex(matrix, x, y, depth_z).color(draw_color.r(), draw_color.g(), draw_color.b(), draw_color.a()).endVertex(); + builder.vertex(matrix, x, y + height, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex(); + builder.vertex(matrix, x + width, y + height, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex(); + builder.vertex(matrix, x + width, y, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex(); + builder.vertex(matrix, x, y, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex(); tess.end(); diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java b/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java index 159bbcd5b..24756d9cd 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java +++ b/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java @@ -53,7 +53,7 @@ public class MatterPanelScreen extends MatteryScreen { } }; - var patterns_tab = frame.addTab(FramePanel.FrameTabPosition.TOP, () -> { + var patterns_tab = frame.addTab(FramePanel.Position.TOP, () -> { for (var slot : pattern_slots) { slot.setVisible(true); } @@ -63,7 +63,7 @@ public class MatterPanelScreen extends MatteryScreen { } }); - var tasks_tab = frame.addTab(FramePanel.FrameTabPosition.TOP, () -> { + var tasks_tab = frame.addTab(FramePanel.Position.TOP, () -> { for (var slot : task_slots) { slot.setVisible(true); } diff --git a/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java b/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java index bd4c85924..f933ef041 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java +++ b/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java @@ -15,6 +15,7 @@ import ru.dbotthepony.mc.otm.matter.RegistryPacketUpdate; import ru.dbotthepony.mc.otm.menu.MenuDriveViewer; import ru.dbotthepony.mc.otm.menu.data.*; import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputPacket; +import ru.dbotthepony.mc.otm.menu.widget.NumberPlayerInputPacket; import ru.dbotthepony.mc.otm.menu.widget.OneWayPlayerInputPacket; import ru.dbotthepony.mc.otm.network.android.*; @@ -274,6 +275,15 @@ public class MatteryNetworking { Optional.of(NetworkDirection.PLAY_TO_SERVER) ); + CHANNEL.registerMessage( + next_network_id++, + NumberPlayerInputPacket.class, + NumberPlayerInputPacket::write, + NumberPlayerInputPacket.Companion::read, + NumberPlayerInputPacket::play, + Optional.of(NetworkDirection.PLAY_TO_SERVER) + ); + CHANNEL.registerMessage( next_network_id++, MultiByteDataContainerPacket.class, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/EnergyCounterRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/EnergyCounterRenderer.kt index d9dfaef96..b105c657b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/EnergyCounterRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/EnergyCounterRenderer.kt @@ -9,6 +9,7 @@ import net.minecraft.core.Direction import net.minecraft.network.chat.TranslatableComponent import ru.dbotthepony.mc.otm.block.BlockEnergyCounter import ru.dbotthepony.mc.otm.block.entity.BlockEntityEnergyCounter +import ru.dbotthepony.mc.otm.core.RGBAColor import ru.dbotthepony.mc.otm.core.asAngle import ru.dbotthepony.mc.otm.core.times import ru.dbotthepony.mc.otm.menu.FormattingHelper @@ -44,21 +45,21 @@ class EnergyCounterRenderer(private val context: BlockEntityRendererProvider.Con var y = -16f - val finalX = font.drawAligned(poseStack, "00000000", TextAlign.CENTER_CENTER, -4f, y, 0x2C2C2C) - font.drawAligned(poseStack, "00000000", TextAlign.CENTER_CENTER, -4f, y + font.lineHeight, 0x2C2C2C) - font.drawAligned(poseStack, "/t", TextAlign.CENTER_LEFT, finalX.toFloat(), y, 0x2C2C2C) - font.drawAligned(poseStack, "/s", TextAlign.CENTER_LEFT, finalX.toFloat(), y + font.lineHeight, 0x2C2C2C) + val finalX = font.drawAligned(poseStack, "00000000", TextAlign.CENTER_CENTER, -4f, y, RGBAColor.GRAY) + font.drawAligned(poseStack, "00000000", TextAlign.CENTER_CENTER, -4f, y + font.lineHeight, RGBAColor.GRAY) + font.drawAligned(poseStack, "/t", TextAlign.CENTER_LEFT, finalX.toFloat(), y, RGBAColor.GRAY) + font.drawAligned(poseStack, "/s", TextAlign.CENTER_LEFT, finalX.toFloat(), y + font.lineHeight, RGBAColor.GRAY) poseStack.pushPose() poseStack.translate(-0.1, -0.1, -0.1) - font.drawAligned(poseStack, tile.lastTick.toString(0), TextAlign.CENTER_RIGHT, finalX.toFloat(), y, 0xFFFFFF) - font.drawAligned(poseStack, tile.sumHistory(20).toString(0), TextAlign.CENTER_RIGHT, finalX.toFloat(), y + font.lineHeight, 0xFFFFFF) + font.drawAligned(poseStack, tile.lastTick.toString(0), TextAlign.CENTER_RIGHT, finalX.toFloat(), y, RGBAColor.WHITE) + font.drawAligned(poseStack, tile.sumHistory(20).toString(0), TextAlign.CENTER_RIGHT, finalX.toFloat(), y + font.lineHeight, RGBAColor.WHITE) poseStack.popPose() y += font.lineHeight * 3 - font.drawAligned(poseStack, TOTAL, TextAlign.CENTER_CENTER, 0f, y, 0xFFFFFF) - font.drawAligned(poseStack, FormattingHelper.formatPower(tile.passed), TextAlign.CENTER_CENTER, 0f, y + font.lineHeight, 0xFFFFFF) + font.drawAligned(poseStack, TOTAL, TextAlign.CENTER_CENTER, 0f, y, RGBAColor.WHITE) + font.drawAligned(poseStack, FormattingHelper.formatPower(tile.passed), TextAlign.CENTER_CENTER, 0f, y + font.lineHeight, RGBAColor.WHITE) poseStack.popPose() } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Ext.kt index 7c9c211d4..d6afbc393 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Ext.kt @@ -12,7 +12,7 @@ import ru.dbotthepony.mc.otm.core.* fun VertexConsumer.normal(vector: Vector) = normal(vector.x.toFloat(), vector.y.toFloat(), vector.z.toFloat()) fun VertexConsumer.vertex(matrix4f: Matrix4f, vector: Vector) = vertex(matrix4f, vector.x.toFloat(), vector.y.toFloat(), vector.z.toFloat()) -fun VertexConsumer.color(color: RGBAColor) = color(color.r, color.g, color.b, color.a) +fun VertexConsumer.color(color: RGBAColor) = color(color.red, color.green, color.blue, color.alpha) fun PoseStack.translate(vector: Vector) = translate(vector.x, vector.y, vector.z) fun PoseStack.translate(vector: Vec3i) = translate(vector.x.toDouble(), vector.y.toDouble(), vector.z.toDouble()) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/GravitationStabilizerRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/GravitationStabilizerRenderer.kt index 88451b92c..120f12793 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/GravitationStabilizerRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/GravitationStabilizerRenderer.kt @@ -11,7 +11,6 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider import net.minecraft.client.renderer.texture.OverlayTexture import net.minecraft.core.Direction import net.minecraft.network.chat.TranslatableComponent -import net.minecraft.world.level.block.BeaconBeamBlock import ru.dbotthepony.mc.otm.block.BlockBlackHole import ru.dbotthepony.mc.otm.block.BlockMatteryRotatable import ru.dbotthepony.mc.otm.block.entity.BlockEntityGravitationStabilizer diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenAndroidStation.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenAndroidStation.kt index a7c88d03f..b34fba199 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenAndroidStation.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenAndroidStation.kt @@ -12,7 +12,7 @@ import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.android.AndroidCapabilityPlayer import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability -import ru.dbotthepony.mc.otm.client.render.RGBAColor +import ru.dbotthepony.mc.otm.core.RGBAColor import ru.dbotthepony.mc.otm.client.render.RenderHelper import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenDriveViewer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenDriveViewer.kt index 8e5673c8a..6826bb363 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenDriveViewer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenDriveViewer.kt @@ -20,8 +20,8 @@ class ScreenDriveViewer(menu: MenuDriveViewer, inventory: Inventory, title: Comp val views = ArrayList() val settings = ArrayList() - val viewButton = frame.addTab(FramePanel.FrameTabPosition.TOP) - val settingsButton = frame.addTab(FramePanel.FrameTabPosition.TOP) + val viewButton = frame.addTab(FramePanel.Position.TOP) + val settingsButton = frame.addTab(FramePanel.Position.TOP) viewButton.bindOnOpen { for (panel in views) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenEnergyCounter.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenEnergyCounter.kt index 6e5e65f1e..3801429ec 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenEnergyCounter.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenEnergyCounter.kt @@ -3,10 +3,7 @@ package ru.dbotthepony.mc.otm.client.screen import net.minecraft.network.chat.Component import net.minecraft.network.chat.TranslatableComponent import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.client.screen.panels.ButtonPanel -import ru.dbotthepony.mc.otm.client.screen.panels.Dock -import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel -import ru.dbotthepony.mc.otm.client.screen.panels.Label +import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.menu.MenuEnergyCounter import ru.dbotthepony.mc.otm.menu.FormattingHelper @@ -85,6 +82,26 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title: button.setDockMargin(4f, 0f, 4f, 0f) button.bind { menu.switchDirection.userInput() } + val infoPanels = frame.fetchChildren() + + label = Label(this, frame, TranslatableComponent("block.overdrive_that_matters.energy_counter.limit")) + label.dock = Dock.TOP + label.setDockMargin(4f, 0f, 0f, 0f) + + val inputPanel = NumberInputPanel(this, frame, menu.maxIO) + inputPanel.dock = Dock.TOP + inputPanel.setDockMargin(4f, 0f, 4f, 0f) + + val limitsPanels = frame.fetchChildren().filter { !infoPanels.contains(it) } + + val informationTab = frame.addTab(FramePanel.Position.TOP) + val limitsTab = frame.addTab(FramePanel.Position.TOP) + + informationTab.showHidePanels(infoPanels) + limitsTab.showHidePanels(limitsPanels) + + limitsTab.onClose!!.run() + return frame } } \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt index d48c96b31..425c05d8d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt @@ -8,7 +8,7 @@ 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.core.RGBAColor import ru.dbotthepony.mc.otm.client.render.RenderHelper import ru.dbotthepony.mc.otm.client.screen.MatteryScreen diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditBoxPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditBoxPanel.kt index 1920a8f11..3ccee4299 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditBoxPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditBoxPanel.kt @@ -2,16 +2,17 @@ package ru.dbotthepony.mc.otm.client.screen.panels import net.minecraft.client.gui.components.EditBox import net.minecraft.network.chat.Component +import net.minecraft.network.chat.TextComponent import ru.dbotthepony.mc.otm.client.screen.MatteryScreen open class EditBoxPanel( screen: MatteryScreen<*>, parent: EditablePanel?, - x: Float, - y: Float, - width: Float, - height: Float, - val defaultText: Component + x: Float = 0f, + y: Float = 0f, + width: Float = 0f, + height: Float = 20f, + val defaultText: Component = TextComponent("") ) : MinecraftWidgetPanel(screen, parent, x, y, width, height) { override fun makeNew(): EditBox { return object : EditBox(font, 0, 0, width.toInt(), height.toInt().coerceAtMost(20), defaultText) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt index 9c78260c8..3fe29252b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditablePanel.kt @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.client.screen.panels +import com.google.common.collect.ImmutableList import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.client.Minecraft @@ -625,7 +626,7 @@ open class EditablePanel @JvmOverloads constructor( } fun fetchChildren(): List { - return java.util.List.copyOf(children) + return ImmutableList.copyOf(children) } fun getUndockedChildren(): List { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt index c592df638..5d8a39c0d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt @@ -9,7 +9,6 @@ import net.minecraft.client.gui.narration.NarrationElementOutput import net.minecraft.client.resources.sounds.SimpleSoundInstance import net.minecraft.network.chat.Component import net.minecraft.sounds.SoundEvents -import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL30 import ru.dbotthepony.mc.otm.client.render.* import ru.dbotthepony.mc.otm.client.screen.MatteryScreen @@ -23,7 +22,7 @@ open class FramePanel( height: Float, protected var title: Component ) : EditablePanel(screen, parent, x, y, width, height), NarratableEntry { - enum class FrameTabPosition(val width: Float, val height: Float, val active_width: Float, val active_height: Float) { + enum class Position(val width: Float, val height: Float, val active_width: Float, val active_height: Float) { TOP(28f, 28f, 28f, 32f), // TODO: а оно вообще нужно? LEFT(28f, 28f, 32f, 28f), @@ -31,7 +30,7 @@ open class FramePanel( BOTTOM(28f, 28f, 28f, 32f); } - open inner class FrameTabPanel(position: FrameTabPosition, on_open: Runnable? = null, on_close: Runnable? = null) : + open inner class FrameTabPanel(position: Position, on_open: Runnable? = null, on_close: Runnable? = null) : EditablePanel( this@FramePanel.screen, this@FramePanel, @@ -41,7 +40,7 @@ open class FramePanel( position.height ) { - val frameTabPosition: FrameTabPosition = position + val frameTabPosition: Position = position var isActive = false var initial = false @@ -56,8 +55,22 @@ open class FramePanel( onClose = value } + fun showHidePanels(input: List) { + onOpen = Runnable { + for (child in input) { + child.visible = true + } + } + + onClose = Runnable { + for (child in input) { + child.visible = false + } + } + } + override fun innerRender(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) { - if (frameTabPosition == FrameTabPosition.TOP) { + if (frameTabPosition == Position.TOP) { val width: Float val height: Float @@ -156,7 +169,7 @@ open class FramePanel( protected val tabsBottom = ArrayList() @JvmOverloads - fun addTab(position: FrameTabPosition, on_open: Runnable? = null, on_close: Runnable? = null): FrameTabPanel { + fun addTab(position: Position, on_open: Runnable? = null, on_close: Runnable? = null): FrameTabPanel { val tab = FrameTabPanel(position, on_open, on_close) doAddTab(tab) return tab @@ -168,17 +181,17 @@ open class FramePanel( } when (tab.frameTabPosition) { - FrameTabPosition.TOP -> tabsTop.add(tab) - FrameTabPosition.LEFT -> tabsLeft.add(tab) - FrameTabPosition.RIGHT -> tabsRight.add(tab) - FrameTabPosition.BOTTOM -> tabsBottom.add(tab) + Position.TOP -> tabsTop.add(tab) + Position.LEFT -> tabsLeft.add(tab) + Position.RIGHT -> tabsRight.add(tab) + Position.BOTTOM -> tabsBottom.add(tab) } } override fun performLayout() { for (i in tabsTop.indices) { val tab = tabsTop[i] - tab.setPos(i * FrameTabPosition.TOP.width, -FrameTabPosition.TOP.height) + tab.setPos(i * Position.TOP.width, -Position.TOP.height) tab.initial = i == 0 } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/Label.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/Label.kt index 57b1d48e7..305eb3b19 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/Label.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/Label.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.client.screen.panels import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.network.chat.Component import net.minecraft.network.chat.TextComponent -import ru.dbotthepony.mc.otm.client.render.RGBAColor +import ru.dbotthepony.mc.otm.core.RGBAColor import ru.dbotthepony.mc.otm.client.screen.MatteryScreen open class Label @JvmOverloads constructor( @@ -24,6 +24,6 @@ open class Label @JvmOverloads constructor( var color = RGBAColor.SLATE_GRAY override fun innerRender(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) { - font.draw(stack, text, 0f, 0f, color.wholeinv()) + font.draw(stack, text, 0f, 0f, color.toInt()) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/NumberInputPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/NumberInputPanel.kt new file mode 100644 index 000000000..ca362c1ad --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/NumberInputPanel.kt @@ -0,0 +1,42 @@ +package ru.dbotthepony.mc.otm.client.screen.panels + +import net.minecraft.network.chat.Component +import net.minecraft.network.chat.TextComponent +import ru.dbotthepony.mc.otm.client.screen.MatteryScreen +import ru.dbotthepony.mc.otm.menu.widget.NumberPlayerInputWidget +import java.math.BigDecimal + +open class NumberInputPanel( + screen: MatteryScreen<*>, + parent: EditablePanel?, + val inputWidget: NumberPlayerInputWidget, + x: Float = 0f, + y: Float = 0f, + width: Float = 0f, + height: Float = 20f, + defaultText: Component = TextComponent("") +) : EditBoxPanel(screen, parent, x, y, width, height, defaultText) { + protected var nextUpdateFromServer = 0L + protected var inputStr = "" + + override fun tick() { + super.tick() + + if (isFocused) { + nextUpdateFromServer = System.currentTimeMillis() + 2000L + } + + if (nextUpdateFromServer < System.currentTimeMillis()) { + getOrCreateWidget().value = inputWidget.value.toPlainString() + inputStr = getOrCreateWidget().value + } else { + if (inputStr != getOrCreateWidget().value) { + inputStr = getOrCreateWidget().value + + try { + inputWidget.userInput(BigDecimal(inputStr)) + } catch (_: Throwable) { } + } + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/RGBAColor.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/RGBAColor.kt new file mode 100644 index 000000000..78f675cb5 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/RGBAColor.kt @@ -0,0 +1,58 @@ +package ru.dbotthepony.mc.otm.core + +import com.mojang.blaze3d.systems.RenderSystem +import ru.dbotthepony.mc.otm.client.render.RenderHelper + +data class RGBAColor(val red: Float, val green: Float, val blue: Float, val alpha: Float = 1f) { + constructor(r: Int, g: Int, b: Int) : this((r / 255f), (g / 255f), (b / 255f), 1f) + constructor(r: Int, g: Int, b: Int, a: Int) : this((r / 255f), (g / 255f), (b / 255f), (a / 255f)) + + constructor(color: Long) : this( + (((color and -0x1000000) ushr 24) / 255f), + (((color and 0xFF0000) ushr 16) / 255f), + (((color and 0xFF00) ushr 8) / 255f), + (((color and 0xFF)) / 255f) + ) + + fun toInt(): Int { + val r = (this.red * 255).toInt() + val g = (this.green * 255).toInt() + val b = (this.blue * 255).toInt() + return (r shl 16) or (g shl 8) or b + } + + fun toIntInv(): Int { + val r = (this.red * 255).toInt() + val g = (this.green * 255).toInt() + val b = (this.blue * 255).toInt() + return (b shl 16) or (g shl 8) or r + } + + fun setSystemColor() { + setShaderColor() + setDrawColor() + } + + fun setShaderColor() { + RenderSystem.setShaderColor(red, green, blue, alpha) + } + + fun setDrawColor() { + RenderHelper.setDrawColor(this) + } + + companion object { + val BLACK = RGBAColor(0f, 0f, 0f, 1f) + val WHITE = RGBAColor(1f, 1f, 1f, 1f) + val SLATE_GRAY = RGBAColor(64, 64, 64) + val GRAY = RGBAColor(0x2C2C2CFFL) + + fun inv(color: Int): RGBAColor { + val r = (color and -0x1000000 ushr 24) / 255f + val g = (color and 0xFF0000 ushr 16) / 255f + val b = (color and 0xFF00 ushr 8) / 255f + val a = (color and 0xFF) / 255f + return RGBAColor(a, b, g, r) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuEnergyCounter.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuEnergyCounter.kt index ad116f0d3..9305b35ac 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuEnergyCounter.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuEnergyCounter.kt @@ -6,10 +6,13 @@ import net.minecraft.world.entity.player.Inventory import net.minecraft.world.level.block.Block import ru.dbotthepony.mc.otm.block.BlockEnergyCounter import ru.dbotthepony.mc.otm.block.entity.BlockEntityEnergyCounter +import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.menu.data.EnumDataContainer import ru.dbotthepony.mc.otm.menu.data.ImpreciseFractionDataContainer +import ru.dbotthepony.mc.otm.menu.widget.NumberPlayerInputWidget import ru.dbotthepony.mc.otm.menu.widget.OneWayPlayerInputWidget import ru.dbotthepony.mc.otm.registry.MMenus +import java.math.BigDecimal class MenuEnergyCounter @JvmOverloads constructor( p_38852_: Int, @@ -24,16 +27,29 @@ class MenuEnergyCounter @JvmOverloads constructor( val switchDirection: OneWayPlayerInputWidget val inputDirection = EnumDataContainer(Direction::class.java) + val maxIO = NumberPlayerInputWidget(this) + // TODO: Graph and proper networking for it private var ticksPassed = 0 init { if (tile == null) { switchDirection = OneWayPlayerInputWidget(this) + maxIO.asClient() } else { switchDirection = OneWayPlayerInputWidget(this) { tile.level?.setBlock(tile.blockPos, tile.blockState.setValue(BlockEnergyCounter.INPUT_DIRECTION, tile.blockState.getValue(BlockEnergyCounter.INPUT_DIRECTION).opposite), Block.UPDATE_ALL) } + + maxIO.withSupplier { + return@withSupplier if (tile.ioLimit == null) MINUS_ONE else tile.ioLimit!!.toBigDecmial() + }.withConsumer { + if (it.signum() < 0) { + tile.ioLimit = null + } else { + tile.ioLimit = ImpreciseFraction(it) + } + } } addDataContainer(passed) @@ -67,4 +83,8 @@ class MenuEnergyCounter @JvmOverloads constructor( override fun getWorkingSlotEnd(): Int { return 0 } -} \ No newline at end of file + + companion object { + private val MINUS_ONE = -BigDecimal.ONE + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/NumberPlayerInputWidget.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/NumberPlayerInputWidget.kt new file mode 100644 index 000000000..35e3ab8ac --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/NumberPlayerInputWidget.kt @@ -0,0 +1,93 @@ +package ru.dbotthepony.mc.otm.menu.widget + +import net.minecraft.network.FriendlyByteBuf +import net.minecraftforge.network.NetworkEvent +import ru.dbotthepony.mc.otm.menu.MatteryMenu +import ru.dbotthepony.mc.otm.menu.data.BigDecimalDataContainer +import ru.dbotthepony.mc.otm.network.MatteryNetworking +import ru.dbotthepony.mc.otm.network.NetworkHelper +import java.math.BigDecimal +import java.util.function.Supplier + +class NumberPlayerInputPacket(val id: Int, val value: BigDecimal) { + fun play(context: Supplier) { + context.get().packetHandled = true + + context.get().enqueueWork { + ((context.get().sender?.containerMenu as? MatteryMenu)?.getWidget(id) as? NumberPlayerInputWidget)?.userInput(value) + } + } + + fun write(buff: FriendlyByteBuf) { + buff.writeInt(id) + NetworkHelper.writeDecimal(buff, value) + } + + companion object { + fun read(buff: FriendlyByteBuf): NumberPlayerInputPacket { + return NumberPlayerInputPacket(buff.readInt(), NetworkHelper.readDecimal(buff)) + } + } +} + +class NumberPlayerInputWidget(menu: MatteryMenu) : AbstractWidget(menu) { + private val container = BigDecimalDataContainer() + val value by container::value + + var supplier: (() -> BigDecimal)? = null + var consumer: ((BigDecimal) -> Unit)? = null + var minValue: BigDecimal? = null + var maxValue: BigDecimal? = null + + init { + addDataContainer(container) + } + + fun withSupplier(func: () -> BigDecimal): NumberPlayerInputWidget { + supplier = func + return this + } + + fun withConsumer(func: (BigDecimal) -> Unit): NumberPlayerInputWidget { + consumer = func + return this + } + + fun asClient(): NumberPlayerInputWidget { + supplier = null + + consumer = { + MatteryNetworking.CHANNEL.sendToServer(NumberPlayerInputPacket(slotID, it)) + } + + return this + } + + fun userInput(newValue: BigDecimal) { + val consumer = consumer + + if (consumer != null) { + @Suppress("name_shadowing") + var newValue = newValue + + if (minValue != null) { + newValue = newValue.max(minValue!!) + } + + if (maxValue != null) { + newValue = newValue.min(maxValue!!) + } + + consumer.invoke(newValue) + updateServer() + } + } + + override fun updateServer() { + val supplier = supplier + + if (supplier != null) { + container.value = supplier.invoke() + } + } +} diff --git a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json b/src/main/resources/assets/overdrive_that_matters/lang/en_us.json index a585385a1..09f50165f 100644 --- a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json +++ b/src/main/resources/assets/overdrive_that_matters/lang/en_us.json @@ -190,6 +190,7 @@ "block.overdrive_that_matters.energy_counter": "Energy Counter", "block.overdrive_that_matters.energy_counter.facing": "Input facing: %s", "block.overdrive_that_matters.energy_counter.switch": "Switch input facing", + "block.overdrive_that_matters.energy_counter.limit": "I/O Limit. -1 means no limit", "block.overdrive_that_matters.chemical_generator": "Chemical Generator", "block.overdrive_that_matters.drive_rack": "Condensation Drive Rack",