Number client input, energy counter io limit

This commit is contained in:
DBotThePony 2022-02-22 18:39:03 +07:00
parent dc535dd01a
commit dd6d30e011
Signed by: DBot
GPG Key ID: DCC23B5715498507
20 changed files with 306 additions and 114 deletions

View File

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

View File

@ -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();

View File

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

View File

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

View File

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

View File

@ -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())

View File

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

View File

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

View File

@ -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) {

View File

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

View File

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

View File

@ -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) {

View File

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

View File

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

View File

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

View File

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

View 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)
}
}
}

View File

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

View File

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

View File

@ -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",