156 lines
5.0 KiB
Kotlin
156 lines
5.0 KiB
Kotlin
package net.shadowfacts.phycon.block.redstone_emitter
|
|
|
|
import com.mojang.blaze3d.systems.RenderSystem
|
|
import net.minecraft.client.MinecraftClient
|
|
import net.minecraft.client.render.GameRenderer
|
|
import net.minecraft.client.util.math.MatrixStack
|
|
import net.minecraft.entity.player.PlayerInventory
|
|
import net.minecraft.text.Text
|
|
import net.minecraft.text.TranslatableText
|
|
import net.minecraft.util.Identifier
|
|
import net.shadowfacts.cacao.CacaoHandledScreen
|
|
import net.shadowfacts.cacao.geometry.Axis
|
|
import net.shadowfacts.cacao.util.Color
|
|
import net.shadowfacts.cacao.view.Label
|
|
import net.shadowfacts.cacao.view.StackView
|
|
import net.shadowfacts.cacao.view.View
|
|
import net.shadowfacts.cacao.view.textfield.NumberField
|
|
import net.shadowfacts.cacao.window.ScreenHandlerWindow
|
|
import net.shadowfacts.kiwidsl.dsl
|
|
import net.shadowfacts.phycon.PhysicalConnectivity
|
|
import net.shadowfacts.phycon.init.PhyBlocks
|
|
import net.shadowfacts.phycon.networking.C2SConfigureDevice
|
|
import no.birkett.kiwi.Variable
|
|
import kotlin.math.ceil
|
|
|
|
/**
|
|
* @author shadowfacts
|
|
*/
|
|
class RedstoneEmitterScreen(
|
|
handler: RedstoneEmitterScreenHandler,
|
|
playerInv: PlayerInventory,
|
|
title: Text
|
|
): CacaoHandledScreen<RedstoneEmitterScreenHandler>(
|
|
handler,
|
|
playerInv,
|
|
title
|
|
) {
|
|
|
|
companion object {
|
|
val BACKGROUND = Identifier(PhysicalConnectivity.MODID, "textures/gui/redstone_emitter.png")
|
|
}
|
|
|
|
init {
|
|
backgroundWidth = 176
|
|
backgroundHeight = 166
|
|
|
|
addWindow(ScreenHandlerWindow(handler, ViewController(handler.emitter)))
|
|
}
|
|
|
|
override fun drawBackground(matrixStack: MatrixStack, delta: Float, mouseX: Int, mouseY: Int) {
|
|
super.drawBackground(matrixStack, delta, mouseX, mouseY)
|
|
|
|
RenderSystem.setShader(GameRenderer::getPositionTexShader)
|
|
RenderSystem.setShaderTexture(0, BACKGROUND)
|
|
val x = (width - backgroundWidth) / 2
|
|
val y = (height - backgroundHeight) / 2
|
|
drawTexture(matrixStack, x, y, 0, 0, backgroundWidth, backgroundHeight)
|
|
}
|
|
|
|
class ViewController(
|
|
private val emitter: RedstoneEmitterBlockEntity,
|
|
): net.shadowfacts.cacao.viewcontroller.ViewController() {
|
|
|
|
lateinit var halfLabel: Label
|
|
lateinit var fullLabel: Label
|
|
|
|
override fun viewDidLoad() {
|
|
super.viewDidLoad()
|
|
|
|
val title = Label(PhyBlocks.REDSTONE_EMITTER.name)
|
|
title.textColor = Color.TEXT
|
|
view.addSubview(title)
|
|
|
|
val inv = Label(MinecraftClient.getInstance().player!!.inventory.displayName)
|
|
inv.textColor = Color.TEXT
|
|
view.addSubview(inv)
|
|
|
|
val field = NumberField(emitter.maxAmount) {
|
|
if (it.number != null) {
|
|
emitter.maxAmount = it.number!!
|
|
MinecraftClient.getInstance().player!!.networkHandler.sendPacket(C2SConfigureDevice(emitter))
|
|
}
|
|
updateLabelTexts()
|
|
}
|
|
field.validator = { it >= 0 }
|
|
field.drawBackground = false
|
|
view.addSubview(field)
|
|
|
|
val hStack = StackView(Axis.HORIZONTAL, StackView.Distribution.FILL, spacing = 2.0)
|
|
view.addSubview(hStack)
|
|
|
|
val zeroStack = hStack.addArrangedSubview(StackView(Axis.VERTICAL))
|
|
zeroStack.addArrangedSubview(Label(TranslatableText("gui.phycon.emitter.count", 0), textAlignment = Label.TextAlignment.CENTER)).apply {
|
|
textColor = Color.TEXT
|
|
}
|
|
zeroStack.addArrangedSubview(View())
|
|
zeroStack.addArrangedSubview(Label("0", textAlignment = Label.TextAlignment.CENTER)).apply {
|
|
textColor = Color.RED
|
|
}
|
|
|
|
val halfStack = hStack.addArrangedSubview(StackView(Axis.VERTICAL))
|
|
halfLabel = halfStack.addArrangedSubview(Label("half", textAlignment = Label.TextAlignment.CENTER)).apply {
|
|
textColor = Color.TEXT
|
|
}
|
|
halfStack.addArrangedSubview(View())
|
|
halfStack.addArrangedSubview(Label("8", textAlignment = Label.TextAlignment.CENTER)).apply {
|
|
textColor = Color.RED
|
|
}
|
|
|
|
val fullStack = hStack.addArrangedSubview(StackView(Axis.VERTICAL))
|
|
fullLabel = fullStack.addArrangedSubview(Label("full", textAlignment = Label.TextAlignment.CENTER)).apply {
|
|
textColor = Color.TEXT
|
|
}
|
|
fullStack.addArrangedSubview(View())
|
|
fullStack.addArrangedSubview(Label("15", textAlignment = Label.TextAlignment.CENTER)).apply {
|
|
textColor = Color.RED
|
|
}
|
|
|
|
updateLabelTexts()
|
|
|
|
view.solver.dsl {
|
|
val minX = Variable("minX")
|
|
val minY = Variable("minY")
|
|
minX equalTo ((view.widthAnchor - 176) / 2)
|
|
minY equalTo ((view.heightAnchor - 166) / 2)
|
|
|
|
title.leftAnchor equalTo (minX + 8)
|
|
title.topAnchor equalTo (minY + 6)
|
|
|
|
inv.leftAnchor equalTo (minX + 8)
|
|
inv.topAnchor equalTo (minY + 72)
|
|
|
|
field.widthAnchor equalTo 82
|
|
field.heightAnchor equalTo 11
|
|
field.leftAnchor equalTo (minX + 57)
|
|
field.topAnchor equalTo (minY + 23)
|
|
|
|
hStack.centerXAnchor equalTo view.centerXAnchor
|
|
hStack.widthAnchor equalTo (176 - 4)
|
|
hStack.topAnchor equalTo (field.bottomAnchor + 8)
|
|
hStack.bottomAnchor equalTo inv.topAnchor
|
|
|
|
zeroStack.widthAnchor equalTo halfStack.widthAnchor
|
|
halfStack.widthAnchor equalTo fullStack.widthAnchor
|
|
}
|
|
}
|
|
|
|
private fun updateLabelTexts() {
|
|
halfLabel.text = TranslatableText("gui.phycon.emitter.count", ceil(emitter.maxAmount / 2.0).toInt())
|
|
fullLabel.text = TranslatableText("gui.phycon.emitter.count", emitter.maxAmount)
|
|
window!!.layout()
|
|
}
|
|
}
|
|
|
|
}
|