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.matter.RegistryPacketUpdate;
|
||||||
import ru.dbotthepony.mc.otm.menu.MenuDriveViewer;
|
import ru.dbotthepony.mc.otm.menu.MenuDriveViewer;
|
||||||
import ru.dbotthepony.mc.otm.menu.data.*;
|
import ru.dbotthepony.mc.otm.menu.data.*;
|
||||||
|
import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputPacket;
|
||||||
import ru.dbotthepony.mc.otm.network.android.*;
|
import ru.dbotthepony.mc.otm.network.android.*;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -173,15 +174,6 @@ public class MatteryNetworking {
|
|||||||
Optional.of(NetworkDirection.PLAY_TO_CLIENT)
|
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(
|
CHANNEL.registerMessage(
|
||||||
next_network_id++,
|
next_network_id++,
|
||||||
ClearPacket.class,
|
ClearPacket.class,
|
||||||
@ -262,5 +254,14 @@ public class MatteryNetworking {
|
|||||||
EnergyCounterPacket::play,
|
EnergyCounterPacket::play,
|
||||||
Optional.of(NetworkDirection.PLAY_TO_CLIENT)
|
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)
|
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"))
|
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
|
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.block.entity.BlockEntityMatterBottler
|
||||||
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
import ru.dbotthepony.mc.otm.capability.MatteryCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.matter.MatterDirection
|
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.LevelGaugeWidget
|
||||||
import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget
|
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
|
import ru.dbotthepony.mc.otm.registry.MMenus
|
||||||
|
|
||||||
class MenuMatterBottler @JvmOverloads constructor(
|
class MenuMatterBottler @JvmOverloads constructor(
|
||||||
@ -20,7 +18,7 @@ class MenuMatterBottler @JvmOverloads constructor(
|
|||||||
) : MenuMatteryPowered(
|
) : MenuMatteryPowered(
|
||||||
MMenus.MATTER_BOTTLER, p_38852_, inventory, tile
|
MMenus.MATTER_BOTTLER, p_38852_, inventory, tile
|
||||||
) {
|
) {
|
||||||
var workFlow = BooleanDataContainer()
|
val workFlow: BooleanPlayerInputWidget
|
||||||
|
|
||||||
val progressWidget: ProgressGaugeWidget
|
val progressWidget: ProgressGaugeWidget
|
||||||
val matterWidget: LevelGaugeWidget
|
val matterWidget: LevelGaugeWidget
|
||||||
@ -32,9 +30,11 @@ class MenuMatterBottler @JvmOverloads constructor(
|
|||||||
if (tile == null) {
|
if (tile == null) {
|
||||||
progressWidget = ProgressGaugeWidget(this)
|
progressWidget = ProgressGaugeWidget(this)
|
||||||
matterWidget = LevelGaugeWidget(this)
|
matterWidget = LevelGaugeWidget(this)
|
||||||
|
workFlow = BooleanPlayerInputWidget(this).asClient()
|
||||||
} else {
|
} else {
|
||||||
progressWidget = ProgressGaugeWidget(this) { tile.getWorkProgress() }
|
progressWidget = ProgressGaugeWidget(this) { tile.getWorkProgress() }
|
||||||
matterWidget = LevelGaugeWidget(this, tile.matter)
|
matterWidget = LevelGaugeWidget(this, tile.matter)
|
||||||
|
workFlow = BooleanPlayerInputWidget(this).withSupplier { tile.workFlow }.withClicker { tile.workFlow = it }
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i in 0 until container.containerSize) {
|
for (i in 0 until container.containerSize) {
|
||||||
@ -54,7 +54,6 @@ class MenuMatterBottler @JvmOverloads constructor(
|
|||||||
addSlot(this.container[i]!!)
|
addSlot(this.container[i]!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
addDataSlots(workFlow)
|
|
||||||
addInventorySlots()
|
addInventorySlots()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,12 +69,4 @@ class MenuMatterBottler @JvmOverloads constructor(
|
|||||||
override fun getWorkingSlotEnd(): Int {
|
override fun getWorkingSlotEnd(): Int {
|
||||||
return 7
|
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_)
|
super.setSynchronizer(p_150417_)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addWidget(widget: AbstractWidget, consumer: Consumer<Consumer<ContainerData>>) {
|
fun addWidget(widget: AbstractWidget): Int {
|
||||||
if (!matteryWidgets.contains(widget)) {
|
val indexOf = matteryWidgets.indexOf(widget)
|
||||||
|
|
||||||
|
if (indexOf == -1) {
|
||||||
matteryWidgets.add(widget)
|
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
|
@JvmField
|
||||||
@ -288,4 +300,8 @@ abstract class MatteryMenu protected @JvmOverloads constructor(
|
|||||||
|
|
||||||
return MoveResult(mergeOccurred, stackToMove, changed)
|
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(
|
abstract class AbstractWidget constructor(
|
||||||
@JvmField val menu: MatteryMenu,
|
@JvmField val menu: MatteryMenu,
|
||||||
) {
|
) {
|
||||||
lateinit var data_registry: Consumer<ContainerData>
|
val slotID: Int = menu.addWidget(this)
|
||||||
|
|
||||||
init {
|
|
||||||
menu.addWidget(this) {
|
|
||||||
data_registry = it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract fun updateServer()
|
abstract fun updateServer()
|
||||||
|
|
||||||
protected fun addDataSlots(slots: ContainerData) {
|
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