Number client input, energy counter io limit
This commit is contained in:
parent
dc535dd01a
commit
dd6d30e011
@ -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);
|
||||
}
|
||||
}
|
@ -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();
|
||||
|
||||
|
@ -53,7 +53,7 @@ public class MatterPanelScreen extends MatteryScreen<MenuMatterPanel> {
|
||||
}
|
||||
};
|
||||
|
||||
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<MenuMatterPanel> {
|
||||
}
|
||||
});
|
||||
|
||||
var tasks_tab = frame.addTab(FramePanel.FrameTabPosition.TOP, () -> {
|
||||
var tasks_tab = frame.addTab(FramePanel.Position.TOP, () -> {
|
||||
for (var slot : task_slots) {
|
||||
slot.setVisible(true);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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())
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -20,8 +20,8 @@ class ScreenDriveViewer(menu: MenuDriveViewer, inventory: Inventory, title: Comp
|
||||
|
||||
val views = ArrayList<EditablePanel>()
|
||||
val settings = ArrayList<EditablePanel>()
|
||||
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) {
|
||||
|
@ -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
|
||||
}
|
||||
}
|
@ -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
|
||||
|
||||
|
@ -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<EditBox>(screen, parent, x, y, width, height) {
|
||||
override fun makeNew(): EditBox {
|
||||
return object : EditBox(font, 0, 0, width.toInt(), height.toInt().coerceAtMost(20), defaultText) {
|
||||
|
@ -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<EditablePanel> {
|
||||
return java.util.List.copyOf(children)
|
||||
return ImmutableList.copyOf(children)
|
||||
}
|
||||
|
||||
fun getUndockedChildren(): List<EditablePanel> {
|
||||
|
@ -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<EditablePanel>) {
|
||||
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<FrameTabPanel>()
|
||||
|
||||
@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
|
||||
}
|
||||
|
||||
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
@ -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) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
58
src/main/kotlin/ru/dbotthepony/mc/otm/core/RGBAColor.kt
Normal file
58
src/main/kotlin/ru/dbotthepony/mc/otm/core/RGBAColor.kt
Normal file
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val MINUS_ONE = -BigDecimal.ONE
|
||||
}
|
||||
}
|
||||
|
@ -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<NetworkEvent.Context>) {
|
||||
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()
|
||||
}
|
||||
}
|
||||
}
|
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user