BooleanPlayerInputWidget
This commit is contained in:
parent
8dad391b28
commit
1e49ec57ef
@ -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()));
|
||||
}
|
||||
}
|
@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
@ -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_)
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user