Energy counter direction switch right in gui

This commit is contained in:
DBotThePony 2022-01-31 17:50:48 +07:00
parent 02882509e5
commit 34f6d8e3aa
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 133 additions and 4 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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",