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.data.*;
|
||||
import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputPacket;
|
||||
import ru.dbotthepony.mc.otm.menu.widget.OneWayPlayerInputPacket;
|
||||
import ru.dbotthepony.mc.otm.network.android.*;
|
||||
|
||||
import java.util.Optional;
|
||||
@ -263,5 +264,14 @@ public class MatteryNetworking {
|
||||
BooleanPlayerInputPacket::play,
|
||||
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.TranslatableComponent
|
||||
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.FramePanel
|
||||
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.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
|
||||
}
|
||||
}
|
@ -1,9 +1,14 @@
|
||||
package ru.dbotthepony.mc.otm.menu
|
||||
|
||||
import net.minecraft.core.Direction
|
||||
import kotlin.jvm.JvmOverloads
|
||||
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.menu.data.EnumDataContainer
|
||||
import ru.dbotthepony.mc.otm.menu.data.ImpreciseFractionDataContainer
|
||||
import ru.dbotthepony.mc.otm.menu.widget.OneWayPlayerInputWidget
|
||||
import ru.dbotthepony.mc.otm.registry.MMenus
|
||||
|
||||
class MenuEnergyCounter @JvmOverloads constructor(
|
||||
@ -11,19 +16,31 @@ class MenuEnergyCounter @JvmOverloads constructor(
|
||||
inventory: Inventory,
|
||||
tile: BlockEntityEnergyCounter? = null
|
||||
) : MatteryMenu(MMenus.ENERGY_COUNTER, p_38852_, inventory, tile) {
|
||||
@JvmField val passed = ImpreciseFractionDataContainer()
|
||||
@JvmField val average = ImpreciseFractionDataContainer()
|
||||
@JvmField val last20Ticks = ImpreciseFractionDataContainer()
|
||||
@JvmField val lastTick = ImpreciseFractionDataContainer()
|
||||
val passed = ImpreciseFractionDataContainer()
|
||||
val average = ImpreciseFractionDataContainer()
|
||||
val last20Ticks = ImpreciseFractionDataContainer()
|
||||
val lastTick = ImpreciseFractionDataContainer()
|
||||
|
||||
val switchDirection: OneWayPlayerInputWidget
|
||||
val inputDirection = EnumDataContainer(Direction::class.java)
|
||||
|
||||
// TODO: Graph and proper networking for it
|
||||
private var ticksPassed = 0
|
||||
|
||||
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(average)
|
||||
addDataSlots(last20Ticks)
|
||||
addDataSlots(lastTick)
|
||||
addDataSlots(inputDirection)
|
||||
}
|
||||
|
||||
override fun broadcastChanges() {
|
||||
@ -37,6 +54,7 @@ class MenuEnergyCounter @JvmOverloads constructor(
|
||||
}
|
||||
|
||||
ticksPassed = (ticksPassed + 1) % 20
|
||||
inputDirection.value = tile.blockState.getValue(BlockEnergyCounter.INPUT_DIRECTION)
|
||||
}
|
||||
|
||||
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.drive_viewer": "Drive Viewer",
|
||||
"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.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.drive_rack": "Condensation Drive Rack",
|
||||
"block.overdrive_that_matters.item_monitor": "Item Monitor",
|
||||
|
Loading…
Reference in New Issue
Block a user