diff --git a/src/main/kotlin/net/shadowfacts/phycon/block/redstone_emitter/RedstoneEmitterBlockEntity.kt b/src/main/kotlin/net/shadowfacts/phycon/block/redstone_emitter/RedstoneEmitterBlockEntity.kt index 34a5475..077e1fd 100644 --- a/src/main/kotlin/net/shadowfacts/phycon/block/redstone_emitter/RedstoneEmitterBlockEntity.kt +++ b/src/main/kotlin/net/shadowfacts/phycon/block/redstone_emitter/RedstoneEmitterBlockEntity.kt @@ -3,6 +3,7 @@ package net.shadowfacts.phycon.block.redstone_emitter import alexiil.mc.lib.attributes.item.GroupedItemInvView import net.minecraft.item.ItemStack import net.minecraft.nbt.CompoundTag +import net.minecraft.text.TranslatableText import net.shadowfacts.phycon.api.packet.Packet import net.shadowfacts.phycon.api.util.IPAddress import net.shadowfacts.phycon.block.DeviceBlockEntity @@ -26,6 +27,11 @@ class RedstoneEmitterBlockEntity: DeviceBlockEntity(PhyBlockEntities.REDSTONE_EM var stackToMonitor: ItemStack = ItemStack.EMPTY var maxAmount = 64 + var mode = Mode.ANALOG + set(value) { + field = value + recalculateRedstone() + } override fun handle(packet: Packet) { when (packet) { @@ -61,6 +67,8 @@ class RedstoneEmitterBlockEntity: DeviceBlockEntity(PhyBlockEntities.REDSTONE_EM } private fun recalculateRedstone() { + if (world!!.isClient) return + if (stackToMonitor.isEmpty) { cachedEmittedPower = 0 updateWorld() @@ -70,11 +78,15 @@ class RedstoneEmitterBlockEntity: DeviceBlockEntity(PhyBlockEntities.REDSTONE_EM acc + inv.getAmount(stackToMonitor) } cachedEmittedPower = - if (networkAmount == 0) { - 0 - } else { - 1 + round(networkAmount / maxAmount.toDouble() * 14).toInt() + when (mode) { + Mode.ANALOG -> if (networkAmount == 0) { + 0 + } else { + 1 + round(networkAmount / maxAmount.toDouble() * 14).toInt() + } + Mode.DIGITAL -> if (networkAmount >= maxAmount) 15 else 0 } + updateWorld() } @@ -99,9 +111,18 @@ class RedstoneEmitterBlockEntity: DeviceBlockEntity(PhyBlockEntities.REDSTONE_EM override fun writeDeviceConfiguration(tag: CompoundTag) { tag.putInt("MaxAmount", maxAmount) + tag.putString("Mode", mode.name) } override fun loadDeviceConfiguration(tag: CompoundTag) { maxAmount = tag.getInt("MaxAmount") + mode = Mode.valueOf(tag.getString("Mode")) } + + enum class Mode { + ANALOG, DIGITAL; + + val friendlyName = TranslatableText("gui.phycon.redstone_emitter_mode.${name.toLowerCase()}") + } + } diff --git a/src/main/kotlin/net/shadowfacts/phycon/screen/console/RedstoneEmitterViewController.kt b/src/main/kotlin/net/shadowfacts/phycon/screen/console/RedstoneEmitterViewController.kt new file mode 100644 index 0000000..a988726 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/phycon/screen/console/RedstoneEmitterViewController.kt @@ -0,0 +1,46 @@ +package net.shadowfacts.phycon.screen.console + +import net.minecraft.client.MinecraftClient +import net.minecraft.text.TranslatableText +import net.shadowfacts.cacao.util.Color +import net.shadowfacts.cacao.view.Label +import net.shadowfacts.cacao.view.button.EnumButton +import net.shadowfacts.cacao.viewcontroller.ViewController +import net.shadowfacts.kiwidsl.dsl +import net.shadowfacts.phycon.block.redstone_emitter.RedstoneEmitterBlockEntity +import net.shadowfacts.phycon.networking.C2SConfigureDevice + +/** + * @author shadowfacts + */ +class RedstoneEmitterViewController( + val device: RedstoneEmitterBlockEntity, +): ViewController() { + + override fun viewDidLoad() { + super.viewDidLoad() + + val label = Label(TranslatableText("gui.phycon.console.emitter.mode")).apply { + textColor = Color.TEXT + } + view.addSubview(label) + + val mode = EnumButton(device.mode, RedstoneEmitterBlockEntity.Mode::friendlyName) + mode.handler = { + device.mode = it.value + MinecraftClient.getInstance().player!!.networkHandler.sendPacket(C2SConfigureDevice(device)) + } + view.addSubview(mode) + + view.solver.dsl { + mode.widthAnchor equalTo 100 + mode.heightAnchor equalTo 20 + mode.topAnchor equalTo view.topAnchor + mode.rightAnchor equalTo view.rightAnchor + + label.centerYAnchor equalTo mode.centerYAnchor + label.rightAnchor equalTo (mode.leftAnchor - 4) + } + } + +} diff --git a/src/main/resources/assets/phycon/lang/en_us.json b/src/main/resources/assets/phycon/lang/en_us.json index 1292d0e..5669076 100644 --- a/src/main/resources/assets/phycon/lang/en_us.json +++ b/src/main/resources/assets/phycon/lang/en_us.json @@ -32,6 +32,7 @@ "gui.phycon.console.receiver.priority": "Receiver Priority", "gui.phycon.console.receiver.priority_desc": "When a device puts items into the network, it starts with receiver (e.g., interfaces) with higher priorities. Priorities can be negative.", "gui.phycon.console.receiver.sync": "Sync with Provider Priority", + "gui.phycon.console.emitter.mode": "Measurement Mode", "gui.phycon.redstone_mode.high": "High", "gui.phycon.redstone_mode.low": "Low", "gui.phycon.redstone_mode.toggle": "Toggle", @@ -42,6 +43,8 @@ "gui.phycon.emitter.count": "%d Item(s)", "gui.phycon.miner_mode.automatic": "Automatic", "gui.phycon.miner_mode.on_demand": "On Demand", + "gui.phycon.redstone_emitter_mode.analog": "Analog", + "gui.phycon.redstone_emitter_mode.digital": "Digital", "tooltip.phycon.device.configured": "Configured", "tooltip.phycon.device.ip": "IP: "