diff --git a/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt b/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt index 45262d1ce..b3168d652 100644 --- a/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt +++ b/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt @@ -39,7 +39,7 @@ import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast data class ItemStack( val item: Item, private val connection: PlayConnection? = null, - var count: Int = 0, + var count: Int = 1, val enchantments: MutableMap = mutableMapOf(), val lore: MutableList = mutableListOf(), var repairCost: Int = 0, diff --git a/src/main/java/de/bixilon/minosoft/data/player/Abilities.kt b/src/main/java/de/bixilon/minosoft/data/player/Abilities.kt index 14127776b..3cc61af0b 100644 --- a/src/main/java/de/bixilon/minosoft/data/player/Abilities.kt +++ b/src/main/java/de/bixilon/minosoft/data/player/Abilities.kt @@ -17,7 +17,7 @@ data class Abilities( var isInvulnerable: Boolean = false, var isFlying: Boolean = false, var canFly: Boolean = false, - var canInstantBreak: Boolean = false, + var canInstantBreak: Boolean = false, // ToDo: This is the check if we are in creative mode, but no exactly sure... var flyingSpeed: Double = 0.05, var walkingSpeed: Double = 0.1, diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/PlayerInventory.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/PlayerInventory.kt index b46ecd8d5..2150224a5 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/PlayerInventory.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/PlayerInventory.kt @@ -55,8 +55,8 @@ class PlayerInventory(connection: PlayConnection) : Container( } companion object { - private const val HOTBAR_OFFSET = 36 - private const val ARMOR_OFFSET = 5 + const val HOTBAR_OFFSET = 36 + const val ARMOR_OFFSET = 5 const val HOTBAR_SLOTS = 9 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCardController.kt b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCardController.kt index 68c2958e9..4e259a8b0 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCardController.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/main/play/server/card/ServerCardController.kt @@ -38,15 +38,10 @@ import java.io.ByteArrayInputStream class ServerCardController : AbstractCard() { @FXML private lateinit var faviconFX: ImageView - @FXML private lateinit var serverNameFX: TextFlow - @FXML private lateinit var motdFX: TextFlow - @FXML private lateinit var pingFX: Label - @FXML private lateinit var playerCountFX: Label - @FXML private lateinit var serverVersionFX: Label diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt index a733051c9..573a5a743 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt @@ -16,15 +16,14 @@ package de.bixilon.minosoft.gui.rendering.font.renderer import de.bixilon.minosoft.data.text.BaseComponent import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.gui.elements.Element -import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import glm_.vec2.Vec2i object BaseComponentRenderer : ChatComponentRenderer { - override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: Element, fontAlignment: HorizontalAlignments, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, renderInfo: TextRenderInfo, text: BaseComponent): Boolean { + override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: Element, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, renderInfo: TextRenderInfo, text: BaseComponent): Boolean { for (part in text.parts) { - if (ChatComponentRenderer.render(initialOffset, offset, size, z, element, fontAlignment, renderWindow, consumer, renderInfo, part)) { + if (ChatComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, renderInfo, part)) { return true } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt index c95f34208..36b81838d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt @@ -18,7 +18,6 @@ import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.gui.elements.Element -import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import glm_.vec2.Vec2i @@ -27,15 +26,15 @@ interface ChatComponentRenderer { /** * Returns true if the text exceeded the maximum size */ - fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: Element, fontAlignment: HorizontalAlignments, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, renderInfo: TextRenderInfo, text: T): Boolean + fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: Element, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, renderInfo: TextRenderInfo, text: T): Boolean companion object : ChatComponentRenderer { - override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: Element, fontAlignment: HorizontalAlignments, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, renderInfo: TextRenderInfo, text: ChatComponent): Boolean { + override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: Element, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, renderInfo: TextRenderInfo, text: ChatComponent): Boolean { return when (text) { - is BaseComponent -> BaseComponentRenderer.render(initialOffset, offset, size, z, element, fontAlignment, renderWindow, consumer, renderInfo, text) - is TextComponent -> TextComponentRenderer.render(initialOffset, offset, size, z, element, fontAlignment, renderWindow, consumer, renderInfo, text) + is BaseComponent -> BaseComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, renderInfo, text) + is TextComponent -> TextComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, renderInfo, text) else -> TODO("Don't know how to render ${text::class.java}") } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt index 08a0d8362..88ae8f561 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt @@ -19,7 +19,6 @@ import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.font.CharData import de.bixilon.minosoft.gui.rendering.font.Font import de.bixilon.minosoft.gui.rendering.gui.elements.Element -import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments.Companion.getOffset import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import de.bixilon.minosoft.util.MMath.ceil @@ -27,7 +26,7 @@ import glm_.vec2.Vec2i object TextComponentRenderer : ChatComponentRenderer { - override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: Element, fontAlignment: HorizontalAlignments, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, renderInfo: TextRenderInfo, text: TextComponent): Boolean { + override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: Element, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, renderInfo: TextRenderInfo, text: TextComponent): Boolean { if (text.message.isEmpty()) { return false } @@ -52,17 +51,17 @@ object TextComponentRenderer : ChatComponentRenderer { } fun applyOffset() { - if (consumer == null && offset.x == initialOffset.x + Font.CHAR_MARGIN) { + if (consumer == null && offset.x == initialOffset.x + renderInfo.charMargin) { // preparing phase renderInfo.lines += TextLineInfo() } else { - alignmentXOffset = fontAlignment.getOffset(element.size.x, renderInfo.currentLine.width) + alignmentXOffset = renderInfo.fontAlignment.getOffset(element.size.x, renderInfo.currentLine.width) } } fun addY(height: Int): Boolean { val nextY = offset.y + height - val nextSizeY = nextY - initialOffset.y + Font.TOTAL_CHAR_HEIGHT // add initial height for chars + end margin + val nextSizeY = nextY - initialOffset.y + renderInfo.charMargin // add initial height for chars + end margin if (nextSizeY >= elementMaxSize.y) { return true } @@ -79,14 +78,14 @@ object TextComponentRenderer : ChatComponentRenderer { } pushLine() renderInfo.currentLineNumber++ - offset.x = initialOffset.x + Font.CHAR_MARGIN + offset.x = initialOffset.x + renderInfo.charMargin applyOffset() return false } fun addX(width: Int, wrap: Boolean = true): Boolean { val nextX = offset.x + width - val nextSizeX = nextX - initialOffset.x + Font.CHAR_MARGIN // end margin + val nextSizeX = nextX - initialOffset.x + renderInfo.charMargin // end margin if (nextSizeX > elementMaxSize.x) { if (!wrap) { return true @@ -109,13 +108,13 @@ object TextComponentRenderer : ChatComponentRenderer { if (size.y == 0) { // Add initial height of the letter for the first line - val nextSizeY = Font.TOTAL_CHAR_HEIGHT + val nextSizeY = renderInfo.charHeight if (nextSizeY > elementMaxSize.y) { return true } size.y = nextSizeY - size.x += Font.CHAR_MARGIN * 2 - offset += Font.CHAR_MARGIN + size.x += renderInfo.charMargin * 2 + offset += renderInfo.charMargin } applyOffset() @@ -130,7 +129,7 @@ object TextComponentRenderer : ChatComponentRenderer { } // skip spaces that are wrapped (because of a line break) - if (offset.y != initialOffset.y + Font.CHAR_MARGIN && offset.x == initialOffset.x + Font.CHAR_MARGIN && char == ' ') { + if (offset.y != initialOffset.y + renderInfo.charMargin && offset.x == initialOffset.x + renderInfo.charMargin && char == ' ') { continue } @@ -139,7 +138,7 @@ object TextComponentRenderer : ChatComponentRenderer { val charWidth = charData.calculateWidth(text) var width = charWidth - if (offset.x != initialOffset.x + Font.CHAR_MARGIN) { + if (offset.x != initialOffset.x + renderInfo.charMargin) { // add spacing between letters width += if (bold) { Font.HORIZONTAL_SPACING_BOLD diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextRenderInfo.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextRenderInfo.kt index c6c1949ac..70fb5afca 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextRenderInfo.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextRenderInfo.kt @@ -14,11 +14,15 @@ package de.bixilon.minosoft.gui.rendering.font.renderer import de.bixilon.minosoft.config.StaticConfiguration +import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType class TextRenderInfo( + val fontAlignment: HorizontalAlignments, + val charHeight: Int, + val charMargin: Int, val lines: MutableList = mutableListOf(), var currentLineNumber: Int = 0, ) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt index 2e835b93c..b4d6f12ee 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/Element.kt @@ -161,6 +161,9 @@ abstract class Element(val hudRenderer: HUDRenderer) { */ @Deprecated("Generally a bad idea to call") open fun forceApply() { + if (this is Pollable) { + poll() + } forceSilentApply() parent?.onChildChange(this) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ContainerItemsElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ContainerItemsElement.kt new file mode 100644 index 000000000..d793f0637 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ContainerItemsElement.kt @@ -0,0 +1,32 @@ +package de.bixilon.minosoft.gui.rendering.gui.elements.items + +import de.bixilon.minosoft.data.registries.other.containers.Container +import de.bixilon.minosoft.gui.rendering.gui.elements.Element +import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.gui.hud.atlas.Vec2iBinding +import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer +import glm_.vec2.Vec2i + +class ContainerItemsElement( + hudRenderer: HUDRenderer, + val container: Container, + val slots: Map, // ToDo: Use an array? +) : Element(hudRenderer) { + override var cacheEnabled: Boolean = false + + + override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int { + + for ((slot, item) in container.slots) { + slots[slot]?.let { + ItemElement(hudRenderer, it.size, item).render(offset + it.start, z, consumer) + } + } + + return 2 + } + + override fun forceSilentApply() { + cacheUpToDate = false + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ItemElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ItemElement.kt new file mode 100644 index 000000000..099f5528a --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/items/ItemElement.kt @@ -0,0 +1,58 @@ +package de.bixilon.minosoft.gui.rendering.gui.elements.items + +import de.bixilon.minosoft.data.inventory.ItemStack +import de.bixilon.minosoft.data.text.ChatColors +import de.bixilon.minosoft.data.text.TextComponent +import de.bixilon.minosoft.gui.rendering.gui.elements.Element +import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments +import de.bixilon.minosoft.gui.rendering.gui.elements.HorizontalAlignments.Companion.getOffset +import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable +import de.bixilon.minosoft.gui.rendering.gui.elements.VerticalAlignments +import de.bixilon.minosoft.gui.rendering.gui.elements.VerticalAlignments.Companion.getOffset +import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement +import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer +import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer +import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition +import de.bixilon.minosoft.util.KUtil.decide +import glm_.vec2.Vec2i + +class ItemElement( + hudRenderer: HUDRenderer, + size: Vec2i, + val item: ItemStack, +) : Element(hudRenderer), Pollable { + private var count = -1 + private var countText = TextElement(hudRenderer, "", background = false, noBorder = true) + + init { + _size = size + forceApply() + } + + override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int { + val size = size + val countSize = countText.size + countText.render(offset + Vec2i(HorizontalAlignments.RIGHT.getOffset(size.x, countSize.x), VerticalAlignments.BOTTOM.getOffset(size.y, countSize.y)), z + 1, consumer) + + return 2 + } + + override fun poll(): Boolean { + val count = item.count + if (this.count != count) { + this.count = count + return true + } + + return false + } + + override fun forceSilentApply() { + countText.text = when { + count < 0 -> TextComponent((count < -99).decide({ "-∞" }, { count }), color = ChatColors.RED) // No clue why I do this... + count == 0 -> TextComponent("0", color = ChatColors.YELLOW) + count > ProtocolDefinition.ITEM_STACK_MAX_SIZE -> TextComponent((count > 99).decide({ "∞" }, { count }), color = ChatColors.RED) + else -> TextComponent(count) + } + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/text/TextElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/text/TextElement.kt index b66765a37..5661ae9c0 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/text/TextElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/text/TextElement.kt @@ -27,6 +27,7 @@ import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import de.bixilon.minosoft.gui.rendering.util.vec.Vec2Util.EMPTY import de.bixilon.minosoft.gui.rendering.util.vec.Vec4Util.offset +import de.bixilon.minosoft.util.KUtil.decide import glm_.vec2.Vec2i open class TextElement( @@ -35,9 +36,23 @@ open class TextElement( override var fontAlignment: HorizontalAlignments = HorizontalAlignments.LEFT, var background: Boolean = true, var backgroundColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR, + noBorder: Boolean = false, parent: Element? = null, ) : LabeledElement(hudRenderer) { - var renderInfo = TextRenderInfo() + lateinit var renderInfo: TextRenderInfo + private set + + var noBorder: Boolean = noBorder + @Synchronized set(value) { + field = value + charHeight = value.decide(Font.CHAR_HEIGHT, Font.TOTAL_CHAR_HEIGHT) + charMargin = value.decide(0, Font.CHAR_MARGIN) + forceApply() + } + var charHeight: Int = 0 + private set + var charMargin: Int = 0 + private set override var text: Any = text set(value) { @@ -53,7 +68,12 @@ open class TextElement( emptyMessage = value.message.isEmpty() val prefSize = Vec2i.EMPTY if (!emptyMessage) { - ChatComponentRenderer.render(Vec2i.EMPTY, Vec2i.EMPTY, prefSize, 0, InfiniteSizeElement(hudRenderer), fontAlignment, renderWindow, null, TextRenderInfo(), value) + val renderInfo = TextRenderInfo( + fontAlignment = fontAlignment, + charHeight = charHeight, + charMargin = charMargin, + ) + ChatComponentRenderer.render(Vec2i.EMPTY, Vec2i.EMPTY, prefSize, 0, InfiniteSizeElement(hudRenderer), renderWindow, null, renderInfo, value) } _prefSize = prefSize forceApply() @@ -62,6 +82,7 @@ open class TextElement( init { this.parent = parent this.textComponent = ChatComponent.of(text) + this.noBorder = noBorder } override fun forceSilentApply() { @@ -71,8 +92,12 @@ open class TextElement( var b = 1 } if (!emptyMessage) { - val renderInfo = TextRenderInfo() - ChatComponentRenderer.render(Vec2i.EMPTY, Vec2i.EMPTY, size, 0, this, fontAlignment, renderWindow, null, renderInfo, textComponent) + val renderInfo = TextRenderInfo( + fontAlignment = fontAlignment, + charHeight = charHeight, + charMargin = charMargin, + ) + ChatComponentRenderer.render(Vec2i.EMPTY, Vec2i.EMPTY, size, 0, this, renderWindow, null, renderInfo, textComponent) renderInfo.currentLineNumber = 0 this.renderInfo = renderInfo } @@ -89,13 +114,13 @@ open class TextElement( } val initialOffset = offset + margin.offset - ChatComponentRenderer.render(initialOffset, Vec2i(initialOffset), Vec2i.EMPTY, z + 1, this, fontAlignment, renderWindow, consumer, renderInfo, textComponent) + ChatComponentRenderer.render(initialOffset, Vec2i(initialOffset), Vec2i.EMPTY, z + 1, this, renderWindow, consumer, renderInfo, textComponent) renderInfo.currentLineNumber = 0 if (background) { for ((line, info) in renderInfo.lines.withIndex()) { - val start = initialOffset + Vec2i(fontAlignment.getOffset(size.x, info.width), line * Font.TOTAL_CHAR_HEIGHT) - consumer.addQuad(start, start + Vec2i(info.width + Font.CHAR_MARGIN, Font.TOTAL_CHAR_HEIGHT), z, renderWindow.WHITE_TEXTURE, backgroundColor) + val start = initialOffset + Vec2i(fontAlignment.getOffset(size.x, info.width), line * charHeight) + consumer.addQuad(start, start + Vec2i(info.width + charMargin, charHeight), z, renderWindow.WHITE_TEXTURE, backgroundColor) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarBaseElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarBaseElement.kt index 73109c627..27878e4d8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarBaseElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/hotbar/HotbarBaseElement.kt @@ -13,8 +13,10 @@ package de.bixilon.minosoft.gui.rendering.gui.hud.elements.hotbar +import de.bixilon.minosoft.data.registries.other.containers.PlayerInventory import de.bixilon.minosoft.gui.rendering.gui.elements.Element import de.bixilon.minosoft.gui.rendering.gui.elements.Pollable +import de.bixilon.minosoft.gui.rendering.gui.elements.items.ContainerItemsElement import de.bixilon.minosoft.gui.rendering.gui.elements.primitive.ImageElement import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer @@ -26,6 +28,8 @@ class HotbarBaseElement(hudRenderer: HUDRenderer) : Element(hudRenderer), Pollab private val base = ImageElement(hudRenderer, baseAtlasElement) private val frame = ImageElement(hudRenderer, hudRenderer.atlasManager[FRAME]!!, size = Vec2i(FRAME_SIZE)) + private val inventoryElement = ContainerItemsElement(hudRenderer, hudRenderer.connection.player.inventory, baseAtlasElement.slots) + private var selectedSlot = 0 init { @@ -36,10 +40,12 @@ class HotbarBaseElement(hudRenderer: HUDRenderer) : Element(hudRenderer), Pollab override fun forceRender(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int { base.render(offset + HORIZONTAL_MARGIN, z, consumer) - baseAtlasElement.slots[selectedSlot]?.let { - frame.render(offset + it.start - HORIZONTAL_MARGIN + FRAME_OFFSET, z + 1, consumer) + baseAtlasElement.slots[selectedSlot + PlayerInventory.HOTBAR_OFFSET]?.let { + frame.render(offset + it.start - HORIZONTAL_MARGIN + FRAME_OFFSET, z + 2, consumer) } + inventoryElement.render(offset, z, consumer) + // ToDo: Item rendering return 2 // bar + frame diff --git a/src/main/resources/assets/minosoft/mapping/atlas.json b/src/main/resources/assets/minosoft/mapping/atlas.json index ec4df0541..417b9725b 100644 --- a/src/main/resources/assets/minosoft/mapping/atlas.json +++ b/src/main/resources/assets/minosoft/mapping/atlas.json @@ -5,39 +5,39 @@ "start": [0, 0], "end": [182, 22], "slots": { - "0": { + "36": { "start": [3, 3], "end": [19, 19] }, - "1": { + "37": { "start": [23, 3], "end": [39, 19] }, - "2": { + "38": { "start": [43, 3], "end": [59, 19] }, - "3": { + "39": { "start": [63, 3], "end": [79, 19] }, - "4": { + "40": { "start": [83, 3], "end": [99, 19] }, - "5": { + "41": { "start": [103, 3], "end": [119, 19] }, - "6": { + "42": { "start": [123, 3], "end": [139, 19] }, - "7": { + "43": { "start": [143, 3], "end": [159, 19] }, - "8": { + "44": { "start": [163, 3], "end": [179, 19] }