From 34f6d8e3aa0a45d8c6be84ace81a219957105146 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 31 Jan 2022 17:50:48 +0700 Subject: [PATCH] Energy counter direction switch right in gui --- .../mc/otm/network/MatteryNetworking.java | 10 +++++ .../otm/client/screen/ScreenEnergyCounter.kt | 22 +++++++++ .../mc/otm/menu/MenuEnergyCounter.kt | 26 +++++++++-- .../mc/otm/menu/data/BasicContainers.kt | 30 +++++++++++++ .../menu/widget/OneWayPlayerInputWidget.kt | 45 +++++++++++++++++++ .../overdrive_that_matters/lang/en_us.json | 4 ++ 6 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/menu/data/BasicContainers.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/OneWayPlayerInputWidget.kt 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 ce2e32091..5d0b5fc57 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.OneWayPlayerInputPacket; import ru.dbotthepony.mc.otm.network.android.*; import java.util.Optional; @@ -263,5 +264,14 @@ public class MatteryNetworking { BooleanPlayerInputPacket::play, Optional.of(NetworkDirection.PLAY_TO_SERVER) ); + + CHANNEL.registerMessage( + next_network_id++, + OneWayPlayerInputPacket.class, + OneWayPlayerInputPacket::write, + OneWayPlayerInputPacket.Companion::read, + OneWayPlayerInputPacket::play, + Optional.of(NetworkDirection.PLAY_TO_SERVER) + ); } } 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 6012ac7bf..29aab8618 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,6 +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 @@ -73,6 +74,27 @@ class ScreenEnergyCounter(menu: MenuEnergyCounter, inventory: Inventory, title: label.dock = Dock.TOP label.setDockMargin(4f, 0f, 0f, 0f) + label = object : Label(this@ScreenEnergyCounter, frame) { + override fun tick() { + super.tick() + + setText( + TranslatableComponent( + "block.overdrive_that_matters.energy_counter.facing", + menu.inputDirection.value + ) + ) + } + } + + label.dock = Dock.TOP + label.setDockMargin(4f, 0f, 0f, 0f) + + val button = ButtonPanel(this, frame, 0f, 0f, 0f, 20f, TranslatableComponent("block.overdrive_that_matters.energy_counter.switch")) + button.dock = Dock.TOP + button.setDockMargin(4f, 0f, 4f, 0f) + button.bindOnPress { menu.switchDirection.userInput() } + return frame } } \ 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 de1e22e26..05239fe10 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuEnergyCounter.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuEnergyCounter.kt @@ -1,9 +1,14 @@ package ru.dbotthepony.mc.otm.menu +import net.minecraft.core.Direction import kotlin.jvm.JvmOverloads 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.menu.data.EnumDataContainer import ru.dbotthepony.mc.otm.menu.data.ImpreciseFractionDataContainer +import ru.dbotthepony.mc.otm.menu.widget.OneWayPlayerInputWidget import ru.dbotthepony.mc.otm.registry.MMenus class MenuEnergyCounter @JvmOverloads constructor( @@ -11,19 +16,31 @@ class MenuEnergyCounter @JvmOverloads constructor( inventory: Inventory, tile: BlockEntityEnergyCounter? = null ) : MatteryMenu(MMenus.ENERGY_COUNTER, p_38852_, inventory, tile) { - @JvmField val passed = ImpreciseFractionDataContainer() - @JvmField val average = ImpreciseFractionDataContainer() - @JvmField val last20Ticks = ImpreciseFractionDataContainer() - @JvmField val lastTick = ImpreciseFractionDataContainer() + val passed = ImpreciseFractionDataContainer() + val average = ImpreciseFractionDataContainer() + val last20Ticks = ImpreciseFractionDataContainer() + val lastTick = ImpreciseFractionDataContainer() + + val switchDirection: OneWayPlayerInputWidget + val inputDirection = EnumDataContainer(Direction::class.java) // TODO: Graph and proper networking for it private var ticksPassed = 0 init { + if (tile == null) { + switchDirection = OneWayPlayerInputWidget(this) + } 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) + } + } + addDataSlots(passed) addDataSlots(average) addDataSlots(last20Ticks) addDataSlots(lastTick) + addDataSlots(inputDirection) } override fun broadcastChanges() { @@ -37,6 +54,7 @@ class MenuEnergyCounter @JvmOverloads constructor( } ticksPassed = (ticksPassed + 1) % 20 + inputDirection.value = tile.blockState.getValue(BlockEnergyCounter.INPUT_DIRECTION) } super.broadcastChanges() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/data/BasicContainers.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/data/BasicContainers.kt new file mode 100644 index 000000000..66778218b --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/data/BasicContainers.kt @@ -0,0 +1,30 @@ +package ru.dbotthepony.mc.otm.menu.data + +import net.minecraft.world.inventory.ContainerData + +class EnumDataContainer>(val enum: Class) : ContainerData { + val buffer = intArrayOf(0) + + constructor(enum: Class, default: T) : this(enum) { + value = default + } + + var value: T + get() = enum.enumConstants[buffer[0]] + set(value) { + require(value::class.java == enum) { "Invalid enum provided (expected $enum, got ${value::class.java})" } + buffer[0] = value.ordinal + } + + override fun get(p_39284_: Int): Int { + return buffer[p_39284_] + } + + override fun set(p_39285_: Int, p_39286_: Int) { + buffer[p_39285_] = p_39286_ + } + + override fun getCount(): Int { + return 1 + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/OneWayPlayerInputWidget.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/OneWayPlayerInputWidget.kt new file mode 100644 index 000000000..f8c164ab4 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/OneWayPlayerInputWidget.kt @@ -0,0 +1,45 @@ +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.network.MatteryNetworking +import java.util.function.Supplier + +class OneWayPlayerInputPacket(val id: Int) { + fun play(context: Supplier) { + context.get().packetHandled = true + + context.get().enqueueWork { + ((context.get().sender?.containerMenu as? MatteryMenu)?.getWidget(id) as? OneWayPlayerInputWidget)?.userInput() + } + } + + fun write(buff: FriendlyByteBuf) { + buff.writeInt(id) + } + + companion object { + fun read(buff: FriendlyByteBuf): OneWayPlayerInputPacket { + return OneWayPlayerInputPacket(buff.readInt()) + } + } +} + +class OneWayPlayerInputWidget(menu: MatteryMenu, clicker: (() -> Unit)? = null) : AbstractWidget(menu) { + val clicker: () -> Unit + + init { + if (clicker != null) { + this.clicker = clicker + } else { + this.clicker = { MatteryNetworking.CHANNEL.sendToServer(OneWayPlayerInputPacket(slotID)) } + } + } + + fun userInput() { + clicker.invoke() + } + + override fun updateServer() {} +} 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 ed00092bd..a585385a1 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 @@ -186,7 +186,11 @@ "block.overdrive_that_matters.matter_bottler": "Matter Bottler", "block.overdrive_that_matters.drive_viewer": "Drive Viewer", "block.overdrive_that_matters.black_hole": "Local Anomalous Singular Gravitation Field", + "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.chemical_generator": "Chemical Generator", "block.overdrive_that_matters.drive_rack": "Condensation Drive Rack", "block.overdrive_that_matters.item_monitor": "Item Monitor",