2021-02-28 18:48:39 +00:00
|
|
|
package net.shadowfacts.phycon.block.terminal
|
2021-02-14 02:37:39 +00:00
|
|
|
|
2021-02-20 19:24:40 +00:00
|
|
|
import com.mojang.blaze3d.systems.RenderSystem
|
|
|
|
import net.minecraft.client.MinecraftClient
|
2021-02-14 02:37:39 +00:00
|
|
|
import net.minecraft.client.gui.DrawableHelper
|
2021-03-21 02:31:53 +00:00
|
|
|
import net.minecraft.client.gui.Element
|
2021-02-16 03:51:33 +00:00
|
|
|
import net.minecraft.client.gui.widget.TextFieldWidget
|
2021-03-19 02:30:00 +00:00
|
|
|
import net.minecraft.client.render.Tessellator
|
|
|
|
import net.minecraft.client.render.VertexConsumerProvider
|
2021-02-14 02:37:39 +00:00
|
|
|
import net.minecraft.client.util.math.MatrixStack
|
|
|
|
import net.minecraft.entity.player.PlayerInventory
|
2021-02-20 19:24:40 +00:00
|
|
|
import net.minecraft.item.ItemStack
|
2021-02-14 02:37:39 +00:00
|
|
|
import net.minecraft.screen.slot.Slot
|
2021-02-18 04:24:17 +00:00
|
|
|
import net.minecraft.screen.slot.SlotActionType
|
2021-02-16 03:51:33 +00:00
|
|
|
import net.minecraft.text.LiteralText
|
2021-02-14 02:37:39 +00:00
|
|
|
import net.minecraft.text.Text
|
|
|
|
import net.minecraft.util.Identifier
|
2021-03-21 02:31:53 +00:00
|
|
|
import net.shadowfacts.cacao.CacaoHandledScreen
|
|
|
|
import net.shadowfacts.cacao.window.ScreenHandlerWindow
|
|
|
|
import net.shadowfacts.cacao.window.Window
|
2021-02-14 02:37:39 +00:00
|
|
|
import net.shadowfacts.phycon.PhysicalConnectivity
|
2021-02-21 17:13:06 +00:00
|
|
|
import net.shadowfacts.phycon.networking.C2STerminalRequestItem
|
2021-02-21 17:00:32 +00:00
|
|
|
import net.shadowfacts.phycon.networking.C2STerminalUpdateDisplayedItems
|
2021-02-21 16:13:49 +00:00
|
|
|
import net.shadowfacts.phycon.util.SortMode
|
2021-03-19 02:30:00 +00:00
|
|
|
import java.math.RoundingMode
|
|
|
|
import java.text.DecimalFormat
|
2021-02-20 19:24:40 +00:00
|
|
|
import kotlin.math.ceil
|
2021-02-21 17:13:06 +00:00
|
|
|
import kotlin.math.min
|
2021-02-14 02:37:39 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @author shadowfacts
|
|
|
|
*/
|
2021-03-21 02:31:53 +00:00
|
|
|
class TerminalScreen(handler: TerminalScreenHandler, playerInv: PlayerInventory, title: Text): CacaoHandledScreen<TerminalScreenHandler>(handler, playerInv, title) {
|
|
|
|
|
2021-02-14 02:37:39 +00:00
|
|
|
companion object {
|
2021-02-20 19:24:40 +00:00
|
|
|
private val BACKGROUND = Identifier(PhysicalConnectivity.MODID, "textures/gui/terminal.png")
|
2021-02-14 02:37:39 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 02:31:53 +00:00
|
|
|
val backgroundWidth: Int
|
|
|
|
get() = backgroundWidth
|
|
|
|
val backgroundHeight: Int
|
|
|
|
get() = backgroundHeight
|
2021-02-20 19:24:40 +00:00
|
|
|
|
2021-03-21 02:31:53 +00:00
|
|
|
val terminalVC = TerminalViewController(this, handler, handler.terminal)
|
|
|
|
var amountVC: TerminalRequestAmountViewController? = null
|
2021-03-07 19:02:39 +00:00
|
|
|
|
2021-03-21 02:31:53 +00:00
|
|
|
var searchQuery = ""
|
|
|
|
var scrollPosition = 0.0
|
|
|
|
var sortMode = SortMode.COUNT_HIGH_FIRST
|
2021-02-16 03:51:33 +00:00
|
|
|
|
2021-02-14 02:37:39 +00:00
|
|
|
init {
|
|
|
|
backgroundWidth = 252
|
|
|
|
backgroundHeight = 222
|
2021-02-20 19:24:40 +00:00
|
|
|
|
2021-03-21 02:31:53 +00:00
|
|
|
addWindow(ScreenHandlerWindow(handler, terminalVC))
|
2021-02-21 17:00:32 +00:00
|
|
|
|
|
|
|
requestUpdatedItems()
|
|
|
|
}
|
|
|
|
|
2021-03-21 02:31:53 +00:00
|
|
|
fun requestItem(stack: ItemStack, amount: Int) {
|
|
|
|
val netHandler = MinecraftClient.getInstance().player!!.networkHandler
|
|
|
|
val packet = C2STerminalRequestItem(handler.terminal, stack, amount)
|
|
|
|
netHandler.sendPacket(packet)
|
2021-03-09 23:35:57 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 02:31:53 +00:00
|
|
|
fun requestUpdatedItems() {
|
2021-02-21 17:00:32 +00:00
|
|
|
val player = MinecraftClient.getInstance().player!!
|
2021-03-21 02:31:53 +00:00
|
|
|
player.networkHandler.sendPacket(C2STerminalUpdateDisplayedItems(handler.terminal, searchQuery, sortMode, scrollPosition.toFloat()))
|
2021-02-14 02:37:39 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 02:31:53 +00:00
|
|
|
private fun showRequestAmountDialog(stack: ItemStack) {
|
|
|
|
val vc = TerminalRequestAmountViewController(this, stack)
|
|
|
|
addWindow(Window(vc))
|
|
|
|
amountVC = vc
|
2021-02-14 17:07:19 +00:00
|
|
|
}
|
|
|
|
|
2021-02-14 02:37:39 +00:00
|
|
|
@ExperimentalUnsignedTypes
|
|
|
|
fun drawSlotUnderlay(matrixStack: MatrixStack, slot: Slot) {
|
|
|
|
if (!handler.isBufferSlot(slot.id)) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
val mode = handler.terminal.internalBuffer.getMode(slot.id - handler.bufferSlotsStart)
|
|
|
|
val color: UInt = when (mode) {
|
|
|
|
TerminalBufferInventory.Mode.TO_NETWORK -> 0xFFFF0000u
|
|
|
|
TerminalBufferInventory.Mode.FROM_NETWORK -> 0xFF00FF00u
|
|
|
|
else -> return
|
|
|
|
}
|
|
|
|
DrawableHelper.fill(matrixStack, slot.x, slot.y, slot.x + 16, slot.y + 16, color.toInt())
|
|
|
|
}
|
|
|
|
|
2021-03-19 02:30:00 +00:00
|
|
|
private val DECIMAL_FORMAT = DecimalFormat("#.#").apply { roundingMode = RoundingMode.HALF_UP }
|
|
|
|
private val FORMAT = DecimalFormat("##").apply { roundingMode = RoundingMode.HALF_UP }
|
|
|
|
|
|
|
|
fun drawNetworkSlotAmount(stack: ItemStack, x: Int, y: Int, slot: Slot, matrixStack: MatrixStack) {
|
|
|
|
val amount = stack.count
|
|
|
|
val s = when {
|
|
|
|
amount < 1_000 -> amount.toString()
|
|
|
|
amount < 1_000_000 -> {
|
|
|
|
val format = if (amount < 10_000) DECIMAL_FORMAT else FORMAT
|
|
|
|
format.format(amount / 1_000.0) + "K"
|
|
|
|
}
|
|
|
|
amount < 1_000_000_000 -> {
|
|
|
|
val format = if (amount < 10_000_000) DECIMAL_FORMAT else FORMAT
|
|
|
|
format.format(amount / 1_000_000.0) + "M"
|
|
|
|
}
|
|
|
|
else -> {
|
|
|
|
DECIMAL_FORMAT.format(amount / 1000000000.0).toString() + "B"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// draw damage bar
|
|
|
|
// empty string for label because vanilla renders the count behind the damage bar
|
|
|
|
itemRenderer.renderGuiItemOverlay(textRenderer, stack, x, y, "")
|
|
|
|
|
|
|
|
matrixStack.push()
|
|
|
|
matrixStack.translate(x.toDouble(), y.toDouble(), itemRenderer.zOffset + 200.0)
|
|
|
|
val scale = 2 / 3f
|
|
|
|
matrixStack.scale(scale, scale, 1.0f)
|
|
|
|
val immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().buffer)
|
|
|
|
val textX = (1 / scale * 18) - textRenderer.getWidth(s).toFloat() - 3
|
|
|
|
val textY = (1 / scale * 18) - 11
|
|
|
|
textRenderer.draw(s, textX, textY, 0xffffff, true, matrixStack.peek().model, immediate, false, 0, 0xF000F0)
|
|
|
|
immediate.draw()
|
|
|
|
matrixStack.pop()
|
|
|
|
}
|
|
|
|
|
2021-03-21 02:31:53 +00:00
|
|
|
override fun drawBackground(matrixStack: MatrixStack, delta: Float, mouseX: Int, mouseY: Int) {
|
|
|
|
super.drawBackground(matrixStack, delta, mouseX, mouseY)
|
|
|
|
|
|
|
|
RenderSystem.color4f(1f, 1f, 1f, 1f)
|
|
|
|
client!!.textureManager.bindTexture(BACKGROUND)
|
2021-03-07 19:02:39 +00:00
|
|
|
val x = (width - backgroundWidth) / 2
|
|
|
|
val y = (height - backgroundHeight) / 2
|
2021-03-21 02:31:53 +00:00
|
|
|
drawTexture(matrixStack, x, y, 0, 0, backgroundWidth, backgroundHeight)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun tick() {
|
|
|
|
super.tick()
|
|
|
|
|
|
|
|
if (amountVC != null) {
|
|
|
|
amountVC!!.field.tick()
|
|
|
|
} else {
|
|
|
|
terminalVC.searchField.tick()
|
|
|
|
}
|
2021-03-07 19:02:39 +00:00
|
|
|
}
|
|
|
|
|
2021-02-20 19:24:40 +00:00
|
|
|
override fun onMouseClick(slot: Slot?, invSlot: Int, clickData: Int, type: SlotActionType?) {
|
|
|
|
super.onMouseClick(slot, invSlot, clickData, type)
|
2021-02-18 04:24:17 +00:00
|
|
|
|
2021-02-21 17:13:06 +00:00
|
|
|
if (slot != null && !slot.stack.isEmpty && handler.isNetworkSlot(slot.id)) {
|
|
|
|
val stack = slot.stack
|
|
|
|
|
|
|
|
if (type == SlotActionType.QUICK_MOVE) {
|
|
|
|
// shift click, request full stack
|
|
|
|
requestItem(stack, min(stack.count, stack.maxCount))
|
|
|
|
} else if (type == SlotActionType.PICKUP) {
|
|
|
|
if (clickData == 1) {
|
|
|
|
// right click, request half stack
|
|
|
|
requestItem(stack, ceil(min(stack.count, stack.maxCount) / 2f).toInt())
|
|
|
|
} else {
|
2021-03-21 02:31:53 +00:00
|
|
|
showRequestAmountDialog(stack)
|
2021-02-21 17:13:06 +00:00
|
|
|
}
|
|
|
|
}
|
2021-02-20 19:24:40 +00:00
|
|
|
}
|
2021-02-18 04:24:17 +00:00
|
|
|
}
|
|
|
|
|
2021-03-21 02:31:53 +00:00
|
|
|
private val fakeFocusedElement = TextFieldWidget(textRenderer, 0, 0, 0, 0, LiteralText(""))
|
|
|
|
override fun getFocused(): Element? {
|
|
|
|
return if (windows.last().firstResponder != null) {
|
|
|
|
fakeFocusedElement
|
2021-02-20 19:24:40 +00:00
|
|
|
} else {
|
2021-03-21 02:31:53 +00:00
|
|
|
null
|
2021-02-21 16:13:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-14 02:37:39 +00:00
|
|
|
}
|