BooleanPlayerInputWidget

This commit is contained in:
DBotThePony 2022-01-31 16:49:21 +07:00
parent 8dad391b28
commit 1e49ec57ef
Signed by: DBot
GPG Key ID: DCC23B5715498507
7 changed files with 118 additions and 64 deletions

View File

@ -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<NetworkEvent.Context> context) {
context.get().setPacketHandled(true);
context.get().enqueueWork(() -> playServer(context.get().getSender()));
}
}

View File

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

View File

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

View File

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

View File

@ -38,11 +38,23 @@ abstract class MatteryMenu protected @JvmOverloads constructor(
super.setSynchronizer(p_150417_)
}
fun addWidget(widget: AbstractWidget, consumer: Consumer<Consumer<ContainerData>>) {
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)
}
}
public override fun addDataSlots(p_38885_: ContainerData) {
super.addDataSlots(p_38885_)
}
}

View File

@ -8,17 +8,11 @@ import java.util.function.Consumer
abstract class AbstractWidget constructor(
@JvmField val menu: MatteryMenu,
) {
lateinit var data_registry: Consumer<ContainerData>
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)
}
}

View File

@ -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<NetworkEvent.Context>) {
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()
}
}
}