Energy counter direction switch right in gui
This commit is contained in:
parent
02882509e5
commit
34f6d8e3aa
@ -15,6 +15,7 @@ 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.menu.widget.BooleanPlayerInputPacket;
|
||||||
|
import ru.dbotthepony.mc.otm.menu.widget.OneWayPlayerInputPacket;
|
||||||
import ru.dbotthepony.mc.otm.network.android.*;
|
import ru.dbotthepony.mc.otm.network.android.*;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -263,5 +264,14 @@ public class MatteryNetworking {
|
|||||||
BooleanPlayerInputPacket::play,
|
BooleanPlayerInputPacket::play,
|
||||||
Optional.of(NetworkDirection.PLAY_TO_SERVER)
|
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)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package ru.dbotthepony.mc.otm.client.screen
|
|||||||
import net.minecraft.network.chat.Component
|
import net.minecraft.network.chat.Component
|
||||||
import net.minecraft.network.chat.TranslatableComponent
|
import net.minecraft.network.chat.TranslatableComponent
|
||||||
import net.minecraft.world.entity.player.Inventory
|
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.Dock
|
||||||
import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel
|
import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel
|
||||||
import ru.dbotthepony.mc.otm.client.screen.panels.Label
|
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.dock = Dock.TOP
|
||||||
label.setDockMargin(4f, 0f, 0f, 0f)
|
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
|
return frame
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,9 +1,14 @@
|
|||||||
package ru.dbotthepony.mc.otm.menu
|
package ru.dbotthepony.mc.otm.menu
|
||||||
|
|
||||||
|
import net.minecraft.core.Direction
|
||||||
import kotlin.jvm.JvmOverloads
|
import kotlin.jvm.JvmOverloads
|
||||||
import net.minecraft.world.entity.player.Inventory
|
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.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.data.ImpreciseFractionDataContainer
|
||||||
|
import ru.dbotthepony.mc.otm.menu.widget.OneWayPlayerInputWidget
|
||||||
import ru.dbotthepony.mc.otm.registry.MMenus
|
import ru.dbotthepony.mc.otm.registry.MMenus
|
||||||
|
|
||||||
class MenuEnergyCounter @JvmOverloads constructor(
|
class MenuEnergyCounter @JvmOverloads constructor(
|
||||||
@ -11,19 +16,31 @@ class MenuEnergyCounter @JvmOverloads constructor(
|
|||||||
inventory: Inventory,
|
inventory: Inventory,
|
||||||
tile: BlockEntityEnergyCounter? = null
|
tile: BlockEntityEnergyCounter? = null
|
||||||
) : MatteryMenu(MMenus.ENERGY_COUNTER, p_38852_, inventory, tile) {
|
) : MatteryMenu(MMenus.ENERGY_COUNTER, p_38852_, inventory, tile) {
|
||||||
@JvmField val passed = ImpreciseFractionDataContainer()
|
val passed = ImpreciseFractionDataContainer()
|
||||||
@JvmField val average = ImpreciseFractionDataContainer()
|
val average = ImpreciseFractionDataContainer()
|
||||||
@JvmField val last20Ticks = ImpreciseFractionDataContainer()
|
val last20Ticks = ImpreciseFractionDataContainer()
|
||||||
@JvmField val lastTick = ImpreciseFractionDataContainer()
|
val lastTick = ImpreciseFractionDataContainer()
|
||||||
|
|
||||||
|
val switchDirection: OneWayPlayerInputWidget
|
||||||
|
val inputDirection = EnumDataContainer(Direction::class.java)
|
||||||
|
|
||||||
// TODO: Graph and proper networking for it
|
// TODO: Graph and proper networking for it
|
||||||
private var ticksPassed = 0
|
private var ticksPassed = 0
|
||||||
|
|
||||||
init {
|
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(passed)
|
||||||
addDataSlots(average)
|
addDataSlots(average)
|
||||||
addDataSlots(last20Ticks)
|
addDataSlots(last20Ticks)
|
||||||
addDataSlots(lastTick)
|
addDataSlots(lastTick)
|
||||||
|
addDataSlots(inputDirection)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun broadcastChanges() {
|
override fun broadcastChanges() {
|
||||||
@ -37,6 +54,7 @@ class MenuEnergyCounter @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
ticksPassed = (ticksPassed + 1) % 20
|
ticksPassed = (ticksPassed + 1) % 20
|
||||||
|
inputDirection.value = tile.blockState.getValue(BlockEnergyCounter.INPUT_DIRECTION)
|
||||||
}
|
}
|
||||||
|
|
||||||
super.broadcastChanges()
|
super.broadcastChanges()
|
||||||
|
@ -0,0 +1,30 @@
|
|||||||
|
package ru.dbotthepony.mc.otm.menu.data
|
||||||
|
|
||||||
|
import net.minecraft.world.inventory.ContainerData
|
||||||
|
|
||||||
|
class EnumDataContainer<T : Enum<T>>(val enum: Class<T>) : ContainerData {
|
||||||
|
val buffer = intArrayOf(0)
|
||||||
|
|
||||||
|
constructor(enum: Class<T>, 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
|
||||||
|
}
|
||||||
|
}
|
@ -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<NetworkEvent.Context>) {
|
||||||
|
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() {}
|
||||||
|
}
|
@ -186,7 +186,11 @@
|
|||||||
"block.overdrive_that_matters.matter_bottler": "Matter Bottler",
|
"block.overdrive_that_matters.matter_bottler": "Matter Bottler",
|
||||||
"block.overdrive_that_matters.drive_viewer": "Drive Viewer",
|
"block.overdrive_that_matters.drive_viewer": "Drive Viewer",
|
||||||
"block.overdrive_that_matters.black_hole": "Local Anomalous Singular Gravitation Field",
|
"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": "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.chemical_generator": "Chemical Generator",
|
||||||
"block.overdrive_that_matters.drive_rack": "Condensation Drive Rack",
|
"block.overdrive_that_matters.drive_rack": "Condensation Drive Rack",
|
||||||
"block.overdrive_that_matters.item_monitor": "Item Monitor",
|
"block.overdrive_that_matters.item_monitor": "Item Monitor",
|
||||||
|
Loading…
Reference in New Issue
Block a user