diff --git a/src/main/java/ru/dbotthepony/mc/otm/network/MatterBottlerSwitchPacket.java b/src/main/java/ru/dbotthepony/mc/otm/network/MatterBottlerSwitchPacket.java deleted file mode 100644 index b4944232d..000000000 --- a/src/main/java/ru/dbotthepony/mc/otm/network/MatterBottlerSwitchPacket.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.dbotthepony.mc.otm.network; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent; -import ru.dbotthepony.mc.otm.menu.MenuMatterBottler; - -import java.util.function.Supplier; - -public record MatterBottlerSwitchPacket() { - public void write(FriendlyByteBuf buffer) { - - } - - public static MatterBottlerSwitchPacket read(FriendlyByteBuf buffer) { - return new MatterBottlerSwitchPacket(); - } - - public void playServer(ServerPlayer ply) { - if (ply.containerMenu instanceof MenuMatterBottler menu) { - menu.switchBottlerMode(); - } - } - - public void play(Supplier context) { - context.get().setPacketHandled(true); - context.get().enqueueWork(() -> playServer(context.get().getSender())); - } -} 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 e8ea8688e..ce2e32091 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java +++ b/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java @@ -14,6 +14,7 @@ import ru.dbotthepony.mc.otm.matter.RegistryPacketRemove; 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.network.android.*; import java.util.Optional; @@ -173,15 +174,6 @@ public class MatteryNetworking { Optional.of(NetworkDirection.PLAY_TO_CLIENT) ); - CHANNEL.registerMessage( - next_network_id++, - MatterBottlerSwitchPacket.class, - MatterBottlerSwitchPacket::write, - MatterBottlerSwitchPacket::read, - MatterBottlerSwitchPacket::play, - Optional.of(NetworkDirection.PLAY_TO_SERVER) - ); - CHANNEL.registerMessage( next_network_id++, ClearPacket.class, @@ -262,5 +254,14 @@ public class MatteryNetworking { EnergyCounterPacket::play, Optional.of(NetworkDirection.PLAY_TO_CLIENT) ); + + CHANNEL.registerMessage( + next_network_id++, + BooleanPlayerInputPacket.class, + BooleanPlayerInputPacket::write, + BooleanPlayerInputPacket.Companion::read, + BooleanPlayerInputPacket::play, + Optional.of(NetworkDirection.PLAY_TO_SERVER) + ); } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenMatterBottler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenMatterBottler.kt index 942b35b35..fd1c2d319 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenMatterBottler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ScreenMatterBottler.kt @@ -35,7 +35,7 @@ class ScreenMatterBottler(menu: MenuMatterBottler, inventory: Inventory, title: progress = ProgressGaugePanel(this, frame, menu.progressWidget, 90f, PROGRESS_ARROW_TOP) val mode = ButtonPanel(this, frame, 46f, 69f, 100f, 20f, TranslatableComponent("otm.matter_bottler.switch_mode")) - mode.bindOnPress { menu.switchBottlerMode() } + mode.bindOnPress { menu.workFlow.switchValue() } return frame } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuMatterBottler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuMatterBottler.kt index ea65f3f13..820452a98 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuMatterBottler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuMatterBottler.kt @@ -6,11 +6,9 @@ import net.minecraft.world.item.ItemStack import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatterBottler import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.matter.MatterDirection -import ru.dbotthepony.mc.otm.menu.data.BooleanDataContainer +import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputWidget import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget -import ru.dbotthepony.mc.otm.network.MatterBottlerSwitchPacket -import ru.dbotthepony.mc.otm.network.MatteryNetworking import ru.dbotthepony.mc.otm.registry.MMenus class MenuMatterBottler @JvmOverloads constructor( @@ -20,7 +18,7 @@ class MenuMatterBottler @JvmOverloads constructor( ) : MenuMatteryPowered( MMenus.MATTER_BOTTLER, p_38852_, inventory, tile ) { - var workFlow = BooleanDataContainer() + val workFlow: BooleanPlayerInputWidget val progressWidget: ProgressGaugeWidget val matterWidget: LevelGaugeWidget @@ -32,9 +30,11 @@ class MenuMatterBottler @JvmOverloads constructor( if (tile == null) { progressWidget = ProgressGaugeWidget(this) matterWidget = LevelGaugeWidget(this) + workFlow = BooleanPlayerInputWidget(this).asClient() } else { progressWidget = ProgressGaugeWidget(this) { tile.getWorkProgress() } matterWidget = LevelGaugeWidget(this, tile.matter) + workFlow = BooleanPlayerInputWidget(this).withSupplier { tile.workFlow }.withClicker { tile.workFlow = it } } for (i in 0 until container.containerSize) { @@ -54,7 +54,6 @@ class MenuMatterBottler @JvmOverloads constructor( addSlot(this.container[i]!!) } - addDataSlots(workFlow) addInventorySlots() } @@ -70,12 +69,4 @@ class MenuMatterBottler @JvmOverloads constructor( override fun getWorkingSlotEnd(): Int { return 7 } - - fun switchBottlerMode() { - if (tile == null) { - MatteryNetworking.CHANNEL.sendToServer(MatterBottlerSwitchPacket()) - } else { - (tile as BlockEntityMatterBottler).switchWorkFlow() - } - } } \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuMattery.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuMattery.kt index 760fe7d52..590f9a6be 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuMattery.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MenuMattery.kt @@ -38,11 +38,23 @@ abstract class MatteryMenu protected @JvmOverloads constructor( super.setSynchronizer(p_150417_) } - fun addWidget(widget: AbstractWidget, consumer: Consumer>) { - if (!matteryWidgets.contains(widget)) { + fun addWidget(widget: AbstractWidget): Int { + val indexOf = matteryWidgets.indexOf(widget) + + if (indexOf == -1) { matteryWidgets.add(widget) - consumer.accept(Consumer { p_38885_: ContainerData -> addDataSlots(p_38885_) }) + return matteryWidgets.size - 1 } + + return indexOf + } + + fun getWidget(index: Int): AbstractWidget? { + if (index !in 0 until matteryWidgets.size) { + return null + } + + return matteryWidgets[index] } @JvmField @@ -288,4 +300,8 @@ abstract class MatteryMenu protected @JvmOverloads constructor( return MoveResult(mergeOccurred, stackToMove, changed) } -} \ No newline at end of file + + public override fun addDataSlots(p_38885_: ContainerData) { + super.addDataSlots(p_38885_) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/AbstractWidget.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/AbstractWidget.kt index beff0f127..3a33193f6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/AbstractWidget.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/AbstractWidget.kt @@ -8,17 +8,11 @@ import java.util.function.Consumer abstract class AbstractWidget constructor( @JvmField val menu: MatteryMenu, ) { - lateinit var data_registry: Consumer - - init { - menu.addWidget(this) { - data_registry = it - } - } + val slotID: Int = menu.addWidget(this) abstract fun updateServer() protected fun addDataSlots(slots: ContainerData) { - data_registry.accept(slots) + menu.addDataSlots(slots) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/BooleanPlayerInputWidget.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/BooleanPlayerInputWidget.kt new file mode 100644 index 000000000..437d6388f --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/widget/BooleanPlayerInputWidget.kt @@ -0,0 +1,81 @@ +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.BooleanDataContainer +import ru.dbotthepony.mc.otm.network.MatteryNetworking +import java.util.function.Supplier + +class BooleanPlayerInputPacket(val id: Int, val value: Boolean) { + fun play(context: Supplier) { + context.get().packetHandled = true + + context.get().enqueueWork { + ((context.get().sender?.containerMenu as? MatteryMenu)?.getWidget(id) as? BooleanPlayerInputWidget)?.userInput(value) + } + } + + fun write(buff: FriendlyByteBuf) { + buff.writeInt(id) + buff.writeBoolean(value) + } + + companion object { + fun read(buff: FriendlyByteBuf): BooleanPlayerInputPacket { + return BooleanPlayerInputPacket(buff.readInt(), buff.readBoolean()) + } + } +} + +class BooleanPlayerInputWidget(menu: MatteryMenu) : AbstractWidget(menu) { + private val container = BooleanDataContainer() + + init { + addDataSlots(container) + } + + var supplier: (() -> Boolean)? = null + var clicker: ((Boolean) -> Unit)? = null + var value by container::value + + fun withSupplier(func: () -> Boolean): BooleanPlayerInputWidget { + supplier = func + return this + } + + fun withClicker(func: (Boolean) -> Unit): BooleanPlayerInputWidget { + clicker = func + return this + } + + fun asClient(): BooleanPlayerInputWidget { + supplier = null + clicker = { + MatteryNetworking.CHANNEL.sendToServer(BooleanPlayerInputPacket(slotID, it)) + } + + return this + } + + fun userInput(newValue: Boolean) { + val clicker = clicker + + if (clicker != null) { + clicker.invoke(newValue) + updateServer() + } + } + + fun switchValue() { + userInput(!value) + } + + override fun updateServer() { + val supplier = supplier + + if (supplier != null) { + container.value = supplier.invoke() + } + } +}