Add slot binding

This commit is contained in:
Linnea Gräf
2024-10-18 00:41:25 +02:00
parent 7de0e8e7e0
commit c89b663aca
9 changed files with 609 additions and 307 deletions

View File

@@ -0,0 +1,26 @@
package moe.nea.firmament.util.mc
import net.minecraft.client.gui.screen.Screen
import net.minecraft.client.gui.screen.ingame.HandledScreen
import net.minecraft.entity.player.PlayerInventory
import net.minecraft.screen.slot.Slot
object ScreenUtil {
private var lastScreen: Screen? = null
private var slotsByIndex: Map<SlotIndex, Slot> = mapOf()
data class SlotIndex(val index: Int, val isPlayerInventory: Boolean)
fun Screen.getSlotsByIndex(): Map<SlotIndex, Slot> {
if (this !is HandledScreen<*>) return mapOf()
if (lastScreen === this) return slotsByIndex
lastScreen = this
slotsByIndex = this.screenHandler.slots.associate {
SlotIndex(it.index, it.inventory is PlayerInventory) to it
}
return slotsByIndex
}
fun Screen.getSlotByIndex( index: Int, isPlayerInventory: Boolean): Slot? =
getSlotsByIndex()[SlotIndex(index, isPlayerInventory)]
}

View File

@@ -0,0 +1,35 @@
package moe.nea.firmament.util.mc
import net.minecraft.screen.ScreenHandler
import net.minecraft.screen.slot.Slot
import net.minecraft.screen.slot.SlotActionType
import moe.nea.firmament.util.MC
object SlotUtils {
fun Slot.clickMiddleMouseButton(handler: ScreenHandler) {
MC.interactionManager?.clickSlot(
handler.syncId,
this.id,
2,
SlotActionType.CLONE,
MC.player
)
}
fun Slot.swapWithHotBar(handler: ScreenHandler, hotbarIndex: Int) {
MC.interactionManager?.clickSlot(
handler.syncId, this.id,
hotbarIndex, SlotActionType.SWAP,
MC.player)
}
fun Slot.clickRightMouseButton(handler: ScreenHandler) {
MC.interactionManager?.clickSlot(
handler.syncId,
this.id,
1,
SlotActionType.PICKUP,
MC.player
)
}
}

View File

@@ -1,8 +1,27 @@
package moe.nea.firmament.util.render
import com.mojang.blaze3d.systems.RenderSystem
import me.shedaniel.math.Color
import org.joml.Matrix4f
import net.minecraft.client.gui.DrawContext
import moe.nea.firmament.util.MC
fun DrawContext.isUntranslatedGuiDrawContext(): Boolean {
return (matrices.peek().positionMatrix.properties() and Matrix4f.PROPERTY_IDENTITY.toInt()) != 0
}
fun DrawContext.drawLine(fromX: Int, fromY: Int, toX: Int, toY: Int, color: Color) {
// TODO: push scissors
if (toY < fromY) {
drawLine(toX, toY, fromX, fromY, color)
return
}
RenderSystem.lineWidth(MC.window.scaleFactor.toFloat())
val buf = this.vertexConsumers.getBuffer(RenderInWorldContext.RenderLayers.LINES)
buf.vertex(fromX.toFloat(), fromY.toFloat(), 0F).color(color.color)
.normal(toX - fromX.toFloat(), toY - fromY.toFloat(), 0F)
buf.vertex(toX.toFloat(), toY.toFloat(), 0F).color(color.color)
.normal(toX - fromX.toFloat(), toY - fromY.toFloat(), 0F)
this.draw()
}