aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/util')
-rw-r--r--src/main/kotlin/util/CommonSoundEffects.kt14
-rw-r--r--src/main/kotlin/util/DurabilityBarEvent.kt2
-rw-r--r--src/main/kotlin/util/FirmFormatters.kt14
-rw-r--r--src/main/kotlin/util/FragmentGuiScreen.kt28
-rw-r--r--src/main/kotlin/util/HoveredItemStack.kt12
-rw-r--r--src/main/kotlin/util/IdentifierSerializer.kt10
-rw-r--r--src/main/kotlin/util/LegacyFormattingCode.kt4
-rw-r--r--src/main/kotlin/util/LegacyTagParser.kt52
-rw-r--r--src/main/kotlin/util/LegacyTagWriter.kt54
-rw-r--r--src/main/kotlin/util/LoadResource.kt6
-rw-r--r--src/main/kotlin/util/MC.kt126
-rw-r--r--src/main/kotlin/util/MinecraftDispatcher.kt4
-rw-r--r--src/main/kotlin/util/MoulConfigFragment.kt14
-rw-r--r--src/main/kotlin/util/MoulConfigUtils.kt26
-rw-r--r--src/main/kotlin/util/ScoreboardUtil.kt42
-rw-r--r--src/main/kotlin/util/ScreenUtil.kt10
-rw-r--r--src/main/kotlin/util/SkyblockId.kt46
-rw-r--r--src/main/kotlin/util/WarpUtil.kt22
-rw-r--r--src/main/kotlin/util/accessors/GetRectangle.kt4
-rw-r--r--src/main/kotlin/util/accessors/chathud.kt6
-rw-r--r--src/main/kotlin/util/async/input.kt2
-rw-r--r--src/main/kotlin/util/colorconversion.kt8
-rw-r--r--src/main/kotlin/util/customgui/CoordRememberingSlot.kt2
-rw-r--r--src/main/kotlin/util/customgui/CustomGui.kt34
-rw-r--r--src/main/kotlin/util/customgui/HasCustomGui.kt4
-rw-r--r--src/main/kotlin/util/json/BlockPosSerializer.kt2
-rw-r--r--src/main/kotlin/util/json/FirmCodecs.kt4
-rw-r--r--src/main/kotlin/util/math/Projections.kt12
-rw-r--r--src/main/kotlin/util/mc/ArmorUtil.kt6
-rw-r--r--src/main/kotlin/util/mc/CustomRenderPassHelper.kt46
-rw-r--r--src/main/kotlin/util/mc/FakeInventory.kt24
-rw-r--r--src/main/kotlin/util/mc/FakeSlot.kt12
-rw-r--r--src/main/kotlin/util/mc/FirmamentDataComponentTypes.kt28
-rw-r--r--src/main/kotlin/util/mc/IntrospectableItemModelManager.kt4
-rw-r--r--src/main/kotlin/util/mc/InventoryUtil.kt14
-rw-r--r--src/main/kotlin/util/mc/ItemUtil.kt18
-rw-r--r--src/main/kotlin/util/mc/MCTabListAPI.kt32
-rw-r--r--src/main/kotlin/util/mc/NbtItemData.kt24
-rw-r--r--src/main/kotlin/util/mc/NbtPrism.kt20
-rw-r--r--src/main/kotlin/util/mc/NbtUtil.kt10
-rw-r--r--src/main/kotlin/util/mc/PlayerUtil.kt6
-rw-r--r--src/main/kotlin/util/mc/SNbtFormatter.kt80
-rw-r--r--src/main/kotlin/util/mc/ScreenUtil.kt16
-rw-r--r--src/main/kotlin/util/mc/SkullItemData.kt12
-rw-r--r--src/main/kotlin/util/mc/SlotUtils.kt44
-rw-r--r--src/main/kotlin/util/mc/TolerantRegistriesOps.kt24
-rw-r--r--src/main/kotlin/util/mc/asFakeServer.kt24
-rw-r--r--src/main/kotlin/util/render/CustomRenderLayers.kt68
-rw-r--r--src/main/kotlin/util/render/DrawContextExt.kt108
-rw-r--r--src/main/kotlin/util/render/DumpTexture.kt6
-rw-r--r--src/main/kotlin/util/render/FacingThePlayerContext.kt94
-rw-r--r--src/main/kotlin/util/render/MultiSpecialGuiRenderState.kt36
-rw-r--r--src/main/kotlin/util/render/RenderCircleProgress.kt88
-rw-r--r--src/main/kotlin/util/render/RenderInWorldContext.kt206
-rw-r--r--src/main/kotlin/util/render/TintedOverlayTexture.kt10
-rw-r--r--src/main/kotlin/util/render/TranslatedScissors.kt8
-rw-r--r--src/main/kotlin/util/skyblock/AbilityUtils.kt12
-rw-r--r--src/main/kotlin/util/skyblock/ItemType.kt2
-rw-r--r--src/main/kotlin/util/skyblock/PartyUtil.kt6
-rw-r--r--src/main/kotlin/util/skyblock/Rarity.kt34
-rw-r--r--src/main/kotlin/util/skyblock/SBItemUtil.kt4
-rw-r--r--src/main/kotlin/util/skyblock/SackUtil.kt18
-rw-r--r--src/main/kotlin/util/skyblock/ScreenIdentification.kt14
-rw-r--r--src/main/kotlin/util/skyblock/TabListAPI.kt6
-rw-r--r--src/main/kotlin/util/textutil.kt114
65 files changed, 921 insertions, 921 deletions
diff --git a/src/main/kotlin/util/CommonSoundEffects.kt b/src/main/kotlin/util/CommonSoundEffects.kt
index a97a2cb..a4d7129 100644
--- a/src/main/kotlin/util/CommonSoundEffects.kt
+++ b/src/main/kotlin/util/CommonSoundEffects.kt
@@ -2,18 +2,18 @@
package moe.nea.firmament.util
-import net.minecraft.client.sound.PositionedSoundInstance
-import net.minecraft.sound.SoundEvent
-import net.minecraft.util.Identifier
+import net.minecraft.client.resources.sounds.SimpleSoundInstance
+import net.minecraft.sounds.SoundEvent
+import net.minecraft.resources.ResourceLocation
// TODO: Replace these with custom sound events that just re use the vanilla ogg s
object CommonSoundEffects {
- fun playSound(identifier: Identifier) {
- MC.soundManager.play(PositionedSoundInstance.master(SoundEvent.of(identifier), 1F))
+ fun playSound(identifier: ResourceLocation) {
+ MC.soundManager.play(SimpleSoundInstance.forUI(SoundEvent.createVariableRangeEvent(identifier), 1F))
}
fun playFailure() {
- playSound(Identifier.of("minecraft", "block.anvil.place"))
+ playSound(ResourceLocation.fromNamespaceAndPath("minecraft", "block.anvil.place"))
}
fun playSuccess() {
@@ -21,6 +21,6 @@ object CommonSoundEffects {
}
fun playDing() {
- playSound(Identifier.of("minecraft", "entity.arrow.hit_player"))
+ playSound(ResourceLocation.fromNamespaceAndPath("minecraft", "entity.arrow.hit_player"))
}
}
diff --git a/src/main/kotlin/util/DurabilityBarEvent.kt b/src/main/kotlin/util/DurabilityBarEvent.kt
index 993462c..c2f863f 100644
--- a/src/main/kotlin/util/DurabilityBarEvent.kt
+++ b/src/main/kotlin/util/DurabilityBarEvent.kt
@@ -2,7 +2,7 @@
package moe.nea.firmament.util
import me.shedaniel.math.Color
-import net.minecraft.item.ItemStack
+import net.minecraft.world.item.ItemStack
import moe.nea.firmament.events.FirmamentEvent
import moe.nea.firmament.events.FirmamentEventBus
diff --git a/src/main/kotlin/util/FirmFormatters.kt b/src/main/kotlin/util/FirmFormatters.kt
index 03dafc5..c4cffc3 100644
--- a/src/main/kotlin/util/FirmFormatters.kt
+++ b/src/main/kotlin/util/FirmFormatters.kt
@@ -12,8 +12,8 @@ import kotlin.math.absoluteValue
import kotlin.math.roundToInt
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
-import net.minecraft.text.Text
-import net.minecraft.util.math.BlockPos
+import net.minecraft.network.chat.Component
+import net.minecraft.core.BlockPos
object FirmFormatters {
@@ -103,7 +103,7 @@ object FirmFormatters {
return sb.toString()
}
- fun debugPath(path: Path): Text {
+ fun debugPath(path: Path): Component {
if (!path.exists()) {
return tr("firmament.path.missing", "$path (missing)").red()
}
@@ -127,13 +127,13 @@ object FirmFormatters {
fun formatBool(
boolean: Boolean,
trueIsGood: Boolean = true,
- ): Text {
- val text = Text.literal(boolean.toString())
+ ): Component {
+ val text = Component.literal(boolean.toString())
return if (boolean == trueIsGood) text.lime() else text.red()
}
- fun formatPosition(position: BlockPos): Text {
- return Text.literal("x: ${position.x}, y: ${position.y}, z: ${position.z}")
+ fun formatPosition(position: BlockPos): Component {
+ return Component.literal("x: ${position.x}, y: ${position.y}, z: ${position.z}")
}
fun formatPercent(value: Double, decimals: Int = 1): String {
diff --git a/src/main/kotlin/util/FragmentGuiScreen.kt b/src/main/kotlin/util/FragmentGuiScreen.kt
index 74558a0..8797a31 100644
--- a/src/main/kotlin/util/FragmentGuiScreen.kt
+++ b/src/main/kotlin/util/FragmentGuiScreen.kt
@@ -6,23 +6,23 @@ import io.github.notenoughupdates.moulconfig.gui.GuiContext
import me.shedaniel.math.Dimension
import me.shedaniel.math.Point
import me.shedaniel.math.Rectangle
-import net.minecraft.client.gui.Click
-import net.minecraft.client.gui.DrawContext
-import net.minecraft.client.gui.screen.Screen
-import net.minecraft.client.input.CharInput
-import net.minecraft.client.input.KeyInput
-import net.minecraft.text.Text
+import net.minecraft.client.input.MouseButtonEvent
+import net.minecraft.client.gui.GuiGraphics
+import net.minecraft.client.gui.screens.Screen
+import net.minecraft.client.input.CharacterEvent
+import net.minecraft.client.input.KeyEvent
+import net.minecraft.network.chat.Component
abstract class FragmentGuiScreen(
val dismissOnOutOfBounds: Boolean = true
-) : Screen(Text.literal("")) {
+) : Screen(Component.literal("")) {
var popup: MoulConfigFragment? = null
fun createPopup(context: GuiContext, position: Point) {
popup = MoulConfigFragment(context, position) { popup = null }
}
- fun renderPopup(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) {
+ fun renderPopup(context: GuiGraphics, mouseX: Int, mouseY: Int, delta: Float) {
popup?.render(context, mouseX, mouseY, delta)
}
@@ -32,13 +32,13 @@ abstract class FragmentGuiScreen(
return true
}
- override fun keyPressed(input: KeyInput): Boolean {
+ override fun keyPressed(input: KeyEvent): Boolean {
return ifPopup {
it.keyPressed(input)
}
}
- override fun keyReleased(input: KeyInput): Boolean {
+ override fun keyReleased(input: KeyEvent): Boolean {
return ifPopup {
it.keyReleased(input)
}
@@ -48,19 +48,19 @@ abstract class FragmentGuiScreen(
ifPopup { it.mouseMoved(mouseX, mouseY) }
}
- override fun mouseReleased(click: Click): Boolean {
+ override fun mouseReleased(click: MouseButtonEvent): Boolean {
return ifPopup {
it.mouseReleased(click)
}
}
- override fun mouseDragged(click: Click, offsetX: Double, offsetY: Double): Boolean {
+ override fun mouseDragged(click: MouseButtonEvent, offsetX: Double, offsetY: Double): Boolean {
return ifPopup {
it.mouseDragged(click, offsetX, offsetY)
}
}
- override fun mouseClicked(click: Click, doubled: Boolean): Boolean {
+ override fun mouseClicked(click: MouseButtonEvent, doubled: Boolean): Boolean {
return ifPopup {
if (!Rectangle(
it.position,
@@ -75,7 +75,7 @@ abstract class FragmentGuiScreen(
}|| super.mouseClicked(click, doubled)
}
- override fun charTyped(input: CharInput): Boolean {
+ override fun charTyped(input: CharacterEvent): Boolean {
return ifPopup { it.charTyped(input) }
}
diff --git a/src/main/kotlin/util/HoveredItemStack.kt b/src/main/kotlin/util/HoveredItemStack.kt
index 1b54562..c8d33fd 100644
--- a/src/main/kotlin/util/HoveredItemStack.kt
+++ b/src/main/kotlin/util/HoveredItemStack.kt
@@ -1,13 +1,13 @@
package moe.nea.firmament.util
import com.google.auto.service.AutoService
-import net.minecraft.client.gui.screen.ingame.HandledScreen
-import net.minecraft.item.ItemStack
+import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
+import net.minecraft.world.item.ItemStack
import moe.nea.firmament.mixins.accessor.AccessorHandledScreen
import moe.nea.firmament.util.compatloader.CompatLoader
interface HoveredItemStackProvider : Comparable<HoveredItemStackProvider> {
- fun provideHoveredItemStack(screen: HandledScreen<*>): ItemStack?
+ fun provideHoveredItemStack(screen: AbstractContainerScreen<*>): ItemStack?
override fun compareTo(other: HoveredItemStackProvider): Int {
return compareValues(this.prio, other.prio)
}
@@ -22,9 +22,9 @@ interface HoveredItemStackProvider : Comparable<HoveredItemStackProvider> {
@AutoService(HoveredItemStackProvider::class)
class VanillaScreenProvider : HoveredItemStackProvider {
- override fun provideHoveredItemStack(screen: HandledScreen<*>): ItemStack? {
+ override fun provideHoveredItemStack(screen: AbstractContainerScreen<*>): ItemStack? {
screen as AccessorHandledScreen
- val vanillaSlot = screen.focusedSlot_Firmament?.stack
+ val vanillaSlot = screen.focusedSlot_Firmament?.item
return vanillaSlot
}
@@ -32,7 +32,7 @@ class VanillaScreenProvider : HoveredItemStackProvider {
get() = -1
}
-val HandledScreen<*>.focusedItemStack: ItemStack?
+val AbstractContainerScreen<*>.focusedItemStack: ItemStack?
get() =
HoveredItemStackProvider.sorted
.firstNotNullOfOrNull { it.provideHoveredItemStack(this)?.takeIf { !it.isEmpty } }
diff --git a/src/main/kotlin/util/IdentifierSerializer.kt b/src/main/kotlin/util/IdentifierSerializer.kt
index 65c5b1c..2255255 100644
--- a/src/main/kotlin/util/IdentifierSerializer.kt
+++ b/src/main/kotlin/util/IdentifierSerializer.kt
@@ -8,18 +8,18 @@ import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
-import net.minecraft.util.Identifier
+import net.minecraft.resources.ResourceLocation
-object IdentifierSerializer : KSerializer<Identifier> {
+object IdentifierSerializer : KSerializer<ResourceLocation> {
val delegateSerializer = String.serializer()
override val descriptor: SerialDescriptor
get() = PrimitiveSerialDescriptor("Identifier", PrimitiveKind.STRING)
- override fun deserialize(decoder: Decoder): Identifier {
- return Identifier.of(decoder.decodeSerializableValue(delegateSerializer))
+ override fun deserialize(decoder: Decoder): ResourceLocation {
+ return ResourceLocation.parse(decoder.decodeSerializableValue(delegateSerializer))
}
- override fun serialize(encoder: Encoder, value: Identifier) {
+ override fun serialize(encoder: Encoder, value: ResourceLocation) {
encoder.encodeSerializableValue(delegateSerializer, value.toString())
}
}
diff --git a/src/main/kotlin/util/LegacyFormattingCode.kt b/src/main/kotlin/util/LegacyFormattingCode.kt
index 1a5d1dd..20574d8 100644
--- a/src/main/kotlin/util/LegacyFormattingCode.kt
+++ b/src/main/kotlin/util/LegacyFormattingCode.kt
@@ -1,6 +1,6 @@
package moe.nea.firmament.util
-import net.minecraft.util.Formatting
+import net.minecraft.ChatFormatting
enum class LegacyFormattingCode(val label: String, val char: Char, val index: Int) {
BLACK("BLACK", '0', 0),
@@ -30,7 +30,7 @@ enum class LegacyFormattingCode(val label: String, val char: Char, val index: In
val byCode = entries.associateBy { it.char }
}
- val modern = Formatting.byCode(char)!!
+ val modern = ChatFormatting.getByCode(char)!!
val formattingCode = "§$char"
diff --git a/src/main/kotlin/util/LegacyTagParser.kt b/src/main/kotlin/util/LegacyTagParser.kt
index 5a26335..0de4caa 100644
--- a/src/main/kotlin/util/LegacyTagParser.kt
+++ b/src/main/kotlin/util/LegacyTagParser.kt
@@ -3,17 +3,17 @@
package moe.nea.firmament.util
import java.util.Stack
-import net.minecraft.nbt.AbstractNbtNumber
-import net.minecraft.nbt.NbtByte
-import net.minecraft.nbt.NbtCompound
-import net.minecraft.nbt.NbtDouble
-import net.minecraft.nbt.NbtElement
-import net.minecraft.nbt.NbtFloat
-import net.minecraft.nbt.NbtInt
-import net.minecraft.nbt.NbtList
-import net.minecraft.nbt.NbtLong
-import net.minecraft.nbt.NbtShort
-import net.minecraft.nbt.NbtString
+import net.minecraft.nbt.NumericTag
+import net.minecraft.nbt.ByteTag
+import net.minecraft.nbt.CompoundTag
+import net.minecraft.nbt.DoubleTag
+import net.minecraft.nbt.Tag
+import net.minecraft.nbt.FloatTag
+import net.minecraft.nbt.IntTag
+import net.minecraft.nbt.ListTag
+import net.minecraft.nbt.LongTag
+import net.minecraft.nbt.ShortTag
+import net.minecraft.nbt.StringTag
class LegacyTagParser private constructor(string: String) {
data class TagParsingException(val baseString: String, val offset: Int, val mes0: String) :
@@ -93,7 +93,7 @@ class LegacyTagParser private constructor(string: String) {
companion object {
val digitRange = "0123456789-"
- fun parse(string: String): NbtCompound {
+ fun parse(string: String): CompoundTag {
return LegacyTagParser(string).baseTag
}
}
@@ -102,11 +102,11 @@ class LegacyTagParser private constructor(string: String) {
racer.consumeWhile { Character.isWhitespace(it.last()) } // Only check last since other chars are always checked before.
}
- fun parseTag(): NbtCompound {
+ fun parseTag(): CompoundTag {
skipWhitespace()
racer.expect("{", "Expected '{’ at start of tag")
skipWhitespace()
- val tag = NbtCompound()
+ val tag = CompoundTag()
while (!racer.tryConsume("}")) {
skipWhitespace()
val lhs = parseIdentifier()
@@ -121,7 +121,7 @@ class LegacyTagParser private constructor(string: String) {
return tag
}
- private fun parseAny(): NbtElement {
+ private fun parseAny(): Tag {
skipWhitespace()
val nextChar = racer.peekReq(1) ?: racer.error("Expected new object, found EOF")
return when {
@@ -133,11 +133,11 @@ class LegacyTagParser private constructor(string: String) {
}
}
- fun parseList(): NbtList {
+ fun parseList(): ListTag {
skipWhitespace()
racer.expect("[", "Expected '[' at start of tag")
skipWhitespace()
- val list = NbtList()
+ val list = ListTag()
while (!racer.tryConsume("]")) {
skipWhitespace()
racer.pushState()
@@ -183,8 +183,8 @@ class LegacyTagParser private constructor(string: String) {
return sb.toString()
}
- fun parseStringTag(): NbtString {
- return NbtString.of(parseQuotedString())
+ fun parseStringTag(): StringTag {
+ return StringTag.valueOf(parseQuotedString())
}
object Patterns {
@@ -198,7 +198,7 @@ class LegacyTagParser private constructor(string: String) {
val ROUGH_PATTERN = "[-+]?[0-9]*\\.?[0-9]*[dDbBfFlLsS]?".toRegex()
}
- fun parseNumericTag(): AbstractNbtNumber {
+ fun parseNumericTag(): NumericTag {
skipWhitespace()
val textForm = racer.consumeWhile { Patterns.ROUGH_PATTERN.matchEntire(it) != null }
if (textForm.isEmpty()) {
@@ -206,27 +206,27 @@ class LegacyTagParser private constructor(string: String) {
}
val floatMatch = Patterns.FLOAT.matchEntire(textForm)
if (floatMatch != null) {
- return NbtFloat.of(floatMatch.groups[1]!!.value.toFloat())
+ return FloatTag.valueOf(floatMatch.groups[1]!!.value.toFloat())
}
val byteMatch = Patterns.BYTE.matchEntire(textForm)
if (byteMatch != null) {
- return NbtByte.of(byteMatch.groups[1]!!.value.toByte())
+ return ByteTag.valueOf(byteMatch.groups[1]!!.value.toByte())
}
val longMatch = Patterns.LONG.matchEntire(textForm)
if (longMatch != null) {
- return NbtLong.of(longMatch.groups[1]!!.value.toLong())
+ return LongTag.valueOf(longMatch.groups[1]!!.value.toLong())
}
val shortMatch = Patterns.SHORT.matchEntire(textForm)
if (shortMatch != null) {
- return NbtShort.of(shortMatch.groups[1]!!.value.toShort())
+ return ShortTag.valueOf(shortMatch.groups[1]!!.value.toShort())
}
val integerMatch = Patterns.INTEGER.matchEntire(textForm)
if (integerMatch != null) {
- return NbtInt.of(integerMatch.groups[1]!!.value.toInt())
+ return IntTag.valueOf(integerMatch.groups[1]!!.value.toInt())
}
val doubleMatch = Patterns.DOUBLE.matchEntire(textForm) ?: Patterns.DOUBLE_UNTYPED.matchEntire(textForm)
if (doubleMatch != null) {
- return NbtDouble.of(doubleMatch.groups[1]!!.value.toDouble())
+ return DoubleTag.valueOf(doubleMatch.groups[1]!!.value.toDouble())
}
throw IllegalStateException("Could not properly parse numeric tag '$textForm', despite passing rough verification. This is a bug in the LegacyTagParser")
}
diff --git a/src/main/kotlin/util/LegacyTagWriter.kt b/src/main/kotlin/util/LegacyTagWriter.kt
index 9889b2c..eb755c4 100644
--- a/src/main/kotlin/util/LegacyTagWriter.kt
+++ b/src/main/kotlin/util/LegacyTagWriter.kt
@@ -1,27 +1,27 @@
package moe.nea.firmament.util
import kotlinx.serialization.json.JsonPrimitive
-import net.minecraft.nbt.AbstractNbtList
-import net.minecraft.nbt.NbtByte
-import net.minecraft.nbt.NbtCompound
-import net.minecraft.nbt.NbtDouble
-import net.minecraft.nbt.NbtElement
-import net.minecraft.nbt.NbtEnd
-import net.minecraft.nbt.NbtFloat
-import net.minecraft.nbt.NbtInt
-import net.minecraft.nbt.NbtLong
-import net.minecraft.nbt.NbtShort
-import net.minecraft.nbt.NbtString
+import net.minecraft.nbt.CollectionTag
+import net.minecraft.nbt.ByteTag
+import net.minecraft.nbt.CompoundTag
+import net.minecraft.nbt.DoubleTag
+import net.minecraft.nbt.Tag
+import net.minecraft.nbt.EndTag
+import net.minecraft.nbt.FloatTag
+import net.minecraft.nbt.IntTag
+import net.minecraft.nbt.LongTag
+import net.minecraft.nbt.ShortTag
+import net.minecraft.nbt.StringTag
import moe.nea.firmament.util.mc.SNbtFormatter.Companion.SIMPLE_NAME
class LegacyTagWriter(val compact: Boolean) {
companion object {
- fun stringify(nbt: NbtElement, compact: Boolean): String {
+ fun stringify(nbt: Tag, compact: Boolean): String {
return LegacyTagWriter(compact).also { it.writeElement(nbt) }
.stringWriter.toString()
}
- fun NbtElement.toLegacyString(pretty: Boolean = false): String {
+ fun Tag.toLegacyString(pretty: Boolean = false): String {
return stringify(this, !pretty)
}
}
@@ -36,22 +36,22 @@ class LegacyTagWriter(val compact: Boolean) {
}
}
- fun writeElement(nbt: NbtElement) {
+ fun writeElement(nbt: Tag) {
when (nbt) {
- is NbtInt -> stringWriter.append(nbt.value.toString())
- is NbtString -> stringWriter.append(escapeString(nbt.value))
- is NbtFloat -> stringWriter.append(nbt.value).append('F')
- is NbtDouble -> stringWriter.append(nbt.value).append('D')
- is NbtByte -> stringWriter.append(nbt.value).append('B')
- is NbtLong -> stringWriter.append(nbt.value).append('L')
- is NbtShort -> stringWriter.append(nbt.value).append('S')
- is NbtCompound -> writeCompound(nbt)
- is NbtEnd -> {}
- is AbstractNbtList -> writeArray(nbt)
+ is IntTag -> stringWriter.append(nbt.value.toString())
+ is StringTag -> stringWriter.append(escapeString(nbt.value))
+ is FloatTag -> stringWriter.append(nbt.value).append('F')
+ is DoubleTag -> stringWriter.append(nbt.value).append('D')
+ is ByteTag -> stringWriter.append(nbt.value).append('B')
+ is LongTag -> stringWriter.append(nbt.value).append('L')
+ is ShortTag -> stringWriter.append(nbt.value).append('S')
+ is CompoundTag -> writeCompound(nbt)
+ is EndTag -> {}
+ is CollectionTag -> writeArray(nbt)
}
}
- fun writeArray(nbt: AbstractNbtList) {
+ fun writeArray(nbt: CollectionTag) {
stringWriter.append('[')
indent++
newLine()
@@ -69,7 +69,7 @@ class LegacyTagWriter(val compact: Boolean) {
stringWriter.append(']')
}
- fun writeCompound(nbt: NbtCompound) {
+ fun writeCompound(nbt: CompoundTag) {
stringWriter.append('{')
indent++
newLine()
@@ -83,7 +83,7 @@ class LegacyTagWriter(val compact: Boolean) {
}
}
indent--
- if (nbt.size != 0)
+ if (nbt.size() != 0)
newLine()
stringWriter.append('}')
}
diff --git a/src/main/kotlin/util/LoadResource.kt b/src/main/kotlin/util/LoadResource.kt
index 4bc8704..d3a7ac2 100644
--- a/src/main/kotlin/util/LoadResource.kt
+++ b/src/main/kotlin/util/LoadResource.kt
@@ -4,17 +4,17 @@ package moe.nea.firmament.util
import java.io.InputStream
import kotlin.io.path.inputStream
import kotlin.jvm.optionals.getOrNull
-import net.minecraft.util.Identifier
+import net.minecraft.resources.ResourceLocation
import moe.nea.firmament.repo.RepoDownloadManager
-fun Identifier.openFirmamentResource(): InputStream {
+fun ResourceLocation.openFirmamentResource(): InputStream {
val resource = MC.resourceManager.getResource(this).getOrNull()
if (resource == null) {
if (namespace == "neurepo")
return RepoDownloadManager.repoSavedLocation.resolve(path).inputStream()
error("Could not read resource $this")
}
- return resource.inputStream
+ return resource.open()
}
diff --git a/src/main/kotlin/util/MC.kt b/src/main/kotlin/util/MC.kt
index 9f3fe99..e70c382 100644
--- a/src/main/kotlin/util/MC.kt
+++ b/src/main/kotlin/util/MC.kt
@@ -4,32 +4,32 @@ import io.github.moulberry.repo.data.Coordinate
import io.github.notenoughupdates.moulconfig.platform.MoulConfigScreenComponent
import java.util.concurrent.ConcurrentLinkedQueue
import kotlin.jvm.optionals.getOrNull
-import net.minecraft.client.MinecraftClient
-import net.minecraft.client.gui.hud.InGameHud
-import net.minecraft.client.gui.screen.Screen
-import net.minecraft.client.gui.screen.ingame.HandledScreen
-import net.minecraft.client.network.ClientPlayerEntity
-import net.minecraft.client.render.GameRenderer
-import net.minecraft.client.render.WorldRenderer
-import net.minecraft.client.render.item.ItemRenderer
-import net.minecraft.client.world.ClientWorld
-import net.minecraft.entity.Entity
-import net.minecraft.item.Item
-import net.minecraft.item.ItemStack
+import net.minecraft.client.Minecraft
+import net.minecraft.client.gui.Gui
+import net.minecraft.client.gui.screens.Screen
+import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
+import net.minecraft.client.player.LocalPlayer
+import net.minecraft.client.renderer.GameRenderer
+import net.minecraft.client.renderer.LevelRenderer
+import net.minecraft.client.renderer.entity.ItemRenderer
+import net.minecraft.client.multiplayer.ClientLevel
+import net.minecraft.world.entity.Entity
+import net.minecraft.world.item.Item
+import net.minecraft.world.item.ItemStack
import net.minecraft.nbt.NbtOps
-import net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket
-import net.minecraft.registry.BuiltinRegistries
-import net.minecraft.registry.Registry
-import net.minecraft.registry.RegistryKey
-import net.minecraft.registry.RegistryKeys
-import net.minecraft.registry.RegistryOps
-import net.minecraft.registry.RegistryWrapper
-import net.minecraft.resource.ReloadableResourceManagerImpl
-import net.minecraft.text.Text
-import net.minecraft.util.Identifier
-import net.minecraft.util.Util
-import net.minecraft.util.math.BlockPos
-import net.minecraft.world.World
+import net.minecraft.network.protocol.game.ServerboundChatCommandPacket
+import net.minecraft.data.registries.VanillaRegistries
+import net.minecraft.core.Registry
+import net.minecraft.resources.ResourceKey
+import net.minecraft.core.registries.Registries
+import net.minecraft.resources.RegistryOps
+import net.minecraft.core.HolderLookup
+import net.minecraft.server.packs.resources.ReloadableResourceManager
+import net.minecraft.network.chat.Component
+import net.minecraft.resources.ResourceLocation
+import net.minecraft.Util
+import net.minecraft.core.BlockPos
+import net.minecraft.world.level.Level
import moe.nea.firmament.Firmament
import moe.nea.firmament.events.TickEvent
import moe.nea.firmament.events.WorldReadyEvent
@@ -37,13 +37,13 @@ import moe.nea.firmament.util.mc.TolerantRegistriesOps
object MC {
- private val messageQueue = ConcurrentLinkedQueue<Text>()
+ private val messageQueue = ConcurrentLinkedQueue<Component>()
init {
TickEvent.subscribe("MC:push") {
- if (inGameHud.chatHud != null && world != null)
+ if (inGameHud.chat != null && world != null)
while (true) {
- inGameHud.chatHud.addMessage(messageQueue.poll() ?: break)
+ inGameHud.chat.addMessage(messageQueue.poll() ?: break)
}
while (true) {
(nextTickTodos.poll() ?: break).invoke()
@@ -54,42 +54,42 @@ object MC {
}
}
- fun sendChat(text: Text) {
+ fun sendChat(text: Component) {
if (TestUtil.isInTest) {
Firmament.logger.info("CHAT: ${text.string}")
return
}
- if (instance.isOnThread && inGameHud.chatHud != null && world != null)
- inGameHud.chatHud.addMessage(text)
+ if (instance.isSameThread && inGameHud.chat != null && world != null)
+ inGameHud.chat.addMessage(text)
else
messageQueue.add(text)
}
@Deprecated("Use checked method instead", replaceWith = ReplaceWith("sendCommand(command)"))
fun sendServerCommand(command: String) {
- val nh = player?.networkHandler ?: return
- nh.sendPacket(
- CommandExecutionC2SPacket(
+ val nh = player?.connection ?: return
+ nh.send(
+ ServerboundChatCommandPacket(
command,
)
)
}
fun sendServerChat(text: String) {
- player?.networkHandler?.sendChatMessage(text)
+ player?.connection?.sendChat(text)
}
fun sendCommand(command: String) {
// TODO: add a queue to this and sendServerChat
ErrorUtil.softCheck("Server commands have an implied /", !command.startsWith("/"))
- player?.networkHandler?.sendChatCommand(command)
+ player?.connection?.sendCommand(command)
}
fun onMainThread(block: () -> Unit) {
- if (instance.isOnThread)
+ if (instance.isSameThread)
block()
else
- instance.send(block)
+ instance.schedule(block)
}
private val nextTickTodos = ConcurrentLinkedQueue<() -> Unit>()
@@ -98,38 +98,38 @@ object MC {
}
- inline val resourceManager get() = (instance.resourceManager as ReloadableResourceManagerImpl)
+ inline val resourceManager get() = (instance.resourceManager as ReloadableResourceManager)
inline val itemRenderer: ItemRenderer get() = instance.itemRenderer
- inline val worldRenderer: WorldRenderer get() = instance.worldRenderer
+ inline val worldRenderer: LevelRenderer get() = instance.levelRenderer
inline val gameRenderer: GameRenderer get() = instance.gameRenderer
- inline val networkHandler get() = player?.networkHandler
- inline val instance get() = MinecraftClient.getInstance()
- inline val keyboard get() = instance.keyboard
- inline val interactionManager get() = instance.interactionManager
+ inline val networkHandler get() = player?.connection
+ inline val instance get() = Minecraft.getInstance()
+ inline val keyboard get() = instance.keyboardHandler
+ inline val interactionManager get() = instance.gameMode
inline val textureManager get() = instance.textureManager
inline val options get() = instance.options
- inline val inGameHud: InGameHud get() = instance.inGameHud
- inline val font get() = instance.textRenderer
+ inline val inGameHud: Gui get() = instance.gui
+ inline val font get() = instance.font
inline val soundManager get() = instance.soundManager
- inline val player: ClientPlayerEntity? get() = TestUtil.unlessTesting { instance.player }
+ inline val player: LocalPlayer? get() = TestUtil.unlessTesting { instance.player }
inline val camera: Entity? get() = instance.cameraEntity
- inline val stackInHand: ItemStack get() = player?.mainHandStack ?: ItemStack.EMPTY
- inline val world: ClientWorld? get() = TestUtil.unlessTesting { instance.world }
- inline val playerName: String get() = player?.name?.unformattedString ?: MC.instance.session.username
+ inline val stackInHand: ItemStack get() = player?.mainHandItem ?: ItemStack.EMPTY
+ inline val world: ClientLevel? get() = TestUtil.unlessTesting { instance.level }
+ inline val playerName: String get() = player?.name?.unformattedString ?: MC.instance.user.name
inline var screen: Screen?
- get() = TestUtil.unlessTesting { instance.currentScreen }
+ get() = TestUtil.unlessTesting { instance.screen }
set(value) = instance.setScreen(value)
val screenName get() = screen?.title?.unformattedString?.trim()
- inline val handledScreen: HandledScreen<*>? get() = instance.currentScreen as? HandledScreen<*>
+ inline val handledScreen: AbstractContainerScreen<*>? get() = instance.screen as? AbstractContainerScreen<*>
inline val window get() = instance.window
- inline val currentRegistries: RegistryWrapper.WrapperLookup? get() = world?.registryManager
- val defaultRegistries: RegistryWrapper.WrapperLookup by lazy { BuiltinRegistries.createWrapperLookup() }
- val defaultRegistryNbtOps by lazy { RegistryOps.of(NbtOps.INSTANCE, defaultRegistries) }
+ inline val currentRegistries: HolderLookup.Provider? get() = world?.registryAccess()
+ val defaultRegistries: HolderLookup.Provider by lazy { VanillaRegistries.createLookup() }
+ val defaultRegistryNbtOps by lazy { RegistryOps.create(NbtOps.INSTANCE, defaultRegistries) }
inline val currentOrDefaultRegistries get() = currentRegistries ?: defaultRegistries
val currentOrDefaultRegistryNbtOps get() = TolerantRegistriesOps(NbtOps.INSTANCE, currentOrDefaultRegistries)
- val defaultItems: RegistryWrapper.Impl<Item> by lazy { defaultRegistries.getOrThrow(RegistryKeys.ITEM) }
+ val defaultItems: HolderLookup.RegistryLookup<Item> by lazy { defaultRegistries.lookupOrThrow(Registries.ITEM) }
var currentTick = 0
- var lastWorld: World? = null
+ var lastWorld: Level? = null
get() {
field = world ?: field
return field
@@ -140,17 +140,17 @@ object MC {
get() = (screen as? MoulConfigScreenComponent)?.guiContext
fun openUrl(uri: String) {
- Util.getOperatingSystem().open(uri)
+ Util.getPlatform().openUri(uri)
}
- fun <T> unsafeGetRegistryEntry(registry: RegistryKey<out Registry<T>>, identifier: Identifier) =
- unsafeGetRegistryEntry(RegistryKey.of(registry, identifier))
+ fun <T> unsafeGetRegistryEntry(registry: ResourceKey<out Registry<T>>, identifier: ResourceLocation) =
+ unsafeGetRegistryEntry(ResourceKey.create(registry, identifier))
- fun <T> unsafeGetRegistryEntry(registryKey: RegistryKey<T>): T? {
+ fun <T> unsafeGetRegistryEntry(registryKey: ResourceKey<T>): T? {
return currentOrDefaultRegistries
- .getOrThrow(registryKey.registryRef)
- .getOptional(registryKey)
+ .lookupOrThrow(registryKey.registryKey())
+ .get(registryKey)
.getOrNull()
?.value()
}
diff --git a/src/main/kotlin/util/MinecraftDispatcher.kt b/src/main/kotlin/util/MinecraftDispatcher.kt
index d1f22a9..3e23f54 100644
--- a/src/main/kotlin/util/MinecraftDispatcher.kt
+++ b/src/main/kotlin/util/MinecraftDispatcher.kt
@@ -3,6 +3,6 @@
package moe.nea.firmament.util
import kotlinx.coroutines.asCoroutineDispatcher
-import net.minecraft.client.MinecraftClient
+import net.minecraft.client.Minecraft
-val MinecraftDispatcher by lazy { MinecraftClient.getInstance().asCoroutineDispatcher() }
+val MinecraftDispatcher by lazy { Minecraft.getInstance().asCoroutineDispatcher() }
diff --git a/src/main/kotlin/util/MoulConfigFragment.kt b/src/main/kotlin/util/MoulConfigFragment.kt
index 7e7f5db..200b780 100644
--- a/src/main/kotlin/util/MoulConfigFragment.kt
+++ b/src/main/kotlin/util/MoulConfigFragment.kt
@@ -4,19 +4,19 @@ import io.github.notenoughupdates.moulconfig.gui.GuiContext
import io.github.notenoughupdates.moulconfig.gui.GuiImmediateContext
import io.github.notenoughupdates.moulconfig.platform.MoulConfigScreenComponent
import me.shedaniel.math.Point
-import net.minecraft.client.gui.DrawContext
-import net.minecraft.text.Text
+import net.minecraft.client.gui.GuiGraphics
+import net.minecraft.network.chat.Component
class MoulConfigFragment(
context: GuiContext,
val position: Point,
val dismiss: () -> Unit
-) : MoulConfigScreenComponent(Text.empty(), context, null) {
+) : MoulConfigScreenComponent(Component.empty(), context, null) {
init {
this.init(MC.instance, MC.screen!!.width, MC.screen!!.height)
}
- override fun createContext(drawContext: DrawContext?): GuiImmediateContext {
+ override fun createContext(drawContext: GuiGraphics?): GuiImmediateContext {
val oldContext = super.createContext(drawContext)
return oldContext.translated(
position.x,
@@ -27,9 +27,9 @@ class MoulConfigFragment(
}
- override fun render(drawContext: DrawContext, i: Int, j: Int, f: Float) {
+ override fun render(drawContext: GuiGraphics, i: Int, j: Int, f: Float) {
val ctx = createContext(drawContext)
- val m = drawContext.matrices
+ val m = drawContext.pose()
m.pushMatrix()
m.translate(position.x.toFloat(), position.y.toFloat())
guiContext.root.render(ctx)
@@ -37,7 +37,7 @@ class MoulConfigFragment(
ctx.renderContext.renderExtraLayers()
}
- override fun close() {
+ override fun onClose() {
dismiss()
}
}
diff --git a/src/main/kotlin/util/MoulConfigUtils.kt b/src/main/kotlin/util/MoulConfigUtils.kt
index fb955ae..c0c7ef5 100644
--- a/src/main/kotlin/util/MoulConfigUtils.kt
+++ b/src/main/kotlin/util/MoulConfigUtils.kt
@@ -23,10 +23,10 @@ import me.shedaniel.math.Color
import org.w3c.dom.Element
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
-import net.minecraft.client.gui.DrawContext
-import net.minecraft.client.gui.screen.Screen
-import net.minecraft.client.util.InputUtil
-import net.minecraft.text.Text
+import net.minecraft.client.gui.GuiGraphics
+import net.minecraft.client.gui.screens.Screen
+import com.mojang.blaze3d.platform.InputConstants
+import net.minecraft.network.chat.Component
import moe.nea.firmament.gui.BarComponent
import moe.nea.firmament.gui.FirmButtonComponent
import moe.nea.firmament.gui.FirmHoverComponent
@@ -227,10 +227,10 @@ object MoulConfigUtils {
}
fun wrapScreen(guiContext: GuiContext, parent: Screen?, onClose: () -> Unit = {}): Screen {
- return object : MoulConfigScreenComponent(Text.empty(), guiContext, null) {
- override fun close() {
+ return object : MoulConfigScreenComponent(Component.empty(), guiContext, null) {
+ override fun onClose() {
if (guiContext.onBeforeClose() == CloseEventListener.CloseAction.NO_OBJECTIONS_TO_CLOSE) {
- client!!.setScreen(parent)
+ minecraft!!.setScreen(parent)
onClose()
}
}
@@ -270,7 +270,7 @@ object MoulConfigUtils {
return true
if (component.context.getFocusedElement() != null) {
if (keyboardEvent is KeyboardEvent.KeyPressed
- && keyboardEvent.pressed && keyboardEvent.keycode == InputUtil.GLFW_KEY_ESCAPE
+ && keyboardEvent.pressed && keyboardEvent.keycode == InputConstants.KEY_ESCAPE
) {
component.context.setFocusedElement(null)
}
@@ -292,7 +292,7 @@ object MoulConfigUtils {
return component.mouseEvent(mouseEvent, immContext.translated(x, y, w, h))
}
- fun createInPlaceFullContext(drawContext: DrawContext?, mouseX: Int, mouseY: Int): GuiImmediateContext {
+ fun createInPlaceFullContext(drawContext: GuiGraphics?, mouseX: Int, mouseY: Int): GuiImmediateContext {
ErrorUtil.softCheck(
"created moulconfig context with pre-existing translations.",
drawContext?.isUntranslatedGuiDrawContext() != false
@@ -310,7 +310,7 @@ object MoulConfigUtils {
return immContext
}
- fun DrawContext.drawMCComponentInPlace(
+ fun GuiGraphics.drawMCComponentInPlace(
component: GuiComponent,
x: Int,
y: Int,
@@ -320,10 +320,10 @@ object MoulConfigUtils {
mouseY: Int
) {
val immContext = createInPlaceFullContext(this, mouseX, mouseY)
- matrices.pushMatrix()
- matrices.translate(x.toFloat(), y.toFloat())
+ pose().pushMatrix()
+ pose().translate(x.toFloat(), y.toFloat())
component.render(immContext.translated(x, y, w, h))
- matrices.popMatrix()
+ pose().popMatrix()
}
diff --git a/src/main/kotlin/util/ScoreboardUtil.kt b/src/main/kotlin/util/ScoreboardUtil.kt
index f5f28b9..d94eb54 100644
--- a/src/main/kotlin/util/ScoreboardUtil.kt
+++ b/src/main/kotlin/util/ScoreboardUtil.kt
@@ -1,18 +1,18 @@
package moe.nea.firmament.util
import java.util.Optional
-import net.minecraft.client.gui.hud.InGameHud
-import net.minecraft.scoreboard.ScoreboardDisplaySlot
-import net.minecraft.scoreboard.Team
-import net.minecraft.text.StringVisitable
-import net.minecraft.text.Style
-import net.minecraft.text.Text
-import net.minecraft.util.Formatting
+import net.minecraft.client.gui.Gui
+import net.minecraft.world.scores.DisplaySlot
+import net.minecraft.world.scores.PlayerTeam
+import net.minecraft.network.chat.FormattedText
+import net.minecraft.network.chat.Style
+import net.minecraft.network.chat.Component
+import net.minecraft.ChatFormatting
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.events.TickEvent
object ScoreboardUtil {
- var scoreboardLines: List<Text> = listOf()
+ var scoreboardLines: List<Component> = listOf()
var simplifiedScoreboardLines: List<String> = listOf()
@Subscribe
@@ -21,26 +21,26 @@ object ScoreboardUtil {
simplifiedScoreboardLines = scoreboardLines.map { it.unformattedString }
}
- private fun getScoreboardLinesUncached(): List<Text> {
- val scoreboard = MC.instance.world?.scoreboard ?: return listOf()
- val activeObjective = scoreboard.getObjectiveForSlot(ScoreboardDisplaySlot.SIDEBAR) ?: return listOf()
- return scoreboard.getScoreboardEntries(activeObjective)
- .filter { !it.hidden() }
- .sortedWith(InGameHud.SCOREBOARD_ENTRY_COMPARATOR)
+ private fun getScoreboardLinesUncached(): List<Component> {
+ val scoreboard = MC.instance.level?.scoreboard ?: return listOf()
+ val activeObjective = scoreboard.getDisplayObjective(DisplaySlot.SIDEBAR) ?: return listOf()
+ return scoreboard.listPlayerScores(activeObjective)
+ .filter { !it.isHidden() }
+ .sortedWith(Gui.SCORE_DISPLAY_ORDER)
.take(15).map {
- val team = scoreboard.getScoreHolderTeam(it.owner)
- val text = it.name()
- Team.decorateName(team, text)
+ val team = scoreboard.getPlayersTeam(it.owner)
+ val text = it.ownerName()
+ PlayerTeam.formatNameForTeam(team, text)
}
}
}
-fun Text.formattedString(): String {
+fun Component.formattedString(): String {
val sb = StringBuilder()
- visit(StringVisitable.StyledVisitor<Unit> { style, string ->
- val c = Formatting.byName(style.color?.name)
+ visit(FormattedText.StyledContentConsumer<Unit> { style, string ->
+ val c = ChatFormatting.getByName(style.color?.serialize())
if (c != null) {
- sb.append("§${c.code}")
+ sb.append("§${c.char}")
}
if (style.isUnderlined) {
sb.append("§n")
diff --git a/src/main/kotlin/util/ScreenUtil.kt b/src/main/kotlin/util/ScreenUtil.kt
index 99d77fb..98875e0 100644
--- a/src/main/kotlin/util/ScreenUtil.kt
+++ b/src/main/kotlin/util/ScreenUtil.kt
@@ -3,8 +3,8 @@
package moe.nea.firmament.util
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
-import net.minecraft.client.MinecraftClient
-import net.minecraft.client.gui.screen.Screen
+import net.minecraft.client.Minecraft
+import net.minecraft.client.gui.screens.Screen
import moe.nea.firmament.Firmament
object ScreenUtil {
@@ -12,11 +12,11 @@ object ScreenUtil {
ClientTickEvents.START_CLIENT_TICK.register(::onTick)
}
- private fun onTick(minecraft: MinecraftClient) {
+ private fun onTick(minecraft: Minecraft) {
if (nextOpenedGui != null) {
val p = minecraft.player
- if (p?.currentScreenHandler != null) {
- p.closeHandledScreen()
+ if (p?.containerMenu != null) {
+ p.closeContainer()
}
minecraft.setScreen(nextOpenedGui)
nextOpenedGui = null
diff --git a/src/main/kotlin/util/SkyblockId.kt b/src/main/kotlin/util/SkyblockId.kt
index 8fd32c7..0d21559 100644
--- a/src/main/kotlin/util/SkyblockId.kt
+++ b/src/main/kotlin/util/SkyblockId.kt
@@ -17,15 +17,15 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.UseSerializers
import kotlinx.serialization.json.Json
import kotlin.jvm.optionals.getOrNull
-import net.minecraft.component.DataComponentTypes
-import net.minecraft.component.type.NbtComponent
-import net.minecraft.item.ItemStack
-import net.minecraft.item.Items
-import net.minecraft.nbt.NbtCompound
-import net.minecraft.network.RegistryByteBuf
-import net.minecraft.network.codec.PacketCodec
-import net.minecraft.network.codec.PacketCodecs
-import net.minecraft.util.Identifier
+import net.minecraft.core.component.DataComponents
+import net.minecraft.world.item.component.CustomData
+import net.minecraft.world.item.ItemStack
+import net.minecraft.world.item.Items
+import net.minecraft.nbt.CompoundTag
+import net.minecraft.network.RegistryFriendlyByteBuf
+import net.minecraft.network.codec.StreamCodec
+import net.minecraft.network.codec.ByteBufCodecs
+import net.minecraft.resources.ResourceLocation
import moe.nea.firmament.repo.ExpLadders
import moe.nea.firmament.repo.ExpensiveItemCacheApi
import moe.nea.firmament.repo.ItemCache.asItemStack
@@ -50,7 +50,7 @@ import moe.nea.firmament.util.skyblock.ScreenType
@Serializable
value class SkyblockId(val neuItem: String) : Comparable<SkyblockId> {
val identifier
- get() = Identifier.of(
+ get() = ResourceLocation.fromNamespaceAndPath(
"skyblockitem",
neuItem.lowercase().replace(";", "__")
.replace(":", "___")
@@ -91,8 +91,8 @@ value class SkyblockId(val neuItem: String) : Comparable<SkyblockId> {
val PET_NULL: SkyblockId = SkyblockId("null_pet")
private val illlegalPathRegex = "[^a-z0-9_.-/]".toRegex()
val CODEC = Codec.STRING.xmap({ SkyblockId(it) }, { it.neuItem })
- val PACKET_CODEC: PacketCodec<in RegistryByteBuf, SkyblockId> =
- PacketCodecs.STRING.xmap({ SkyblockId(it) }, { it.neuItem })
+ val PACKET_CODEC: StreamCodec<in RegistryFriendlyByteBuf, SkyblockId> =
+ ByteBufCodecs.STRING_UTF8.map({ SkyblockId(it) }, { it.neuItem })
}
}
@@ -128,23 +128,23 @@ data class HypixelPetInfo(
private val jsonparser = Json { ignoreUnknownKeys = true }
-var ItemStack.extraAttributes: NbtCompound
+var ItemStack.extraAttributes: CompoundTag
set(value) {
- set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(value))
+ set(DataComponents.CUSTOM_DATA, CustomData.of(value))
}
get() {
- val customData = get(DataComponentTypes.CUSTOM_DATA) ?: run {
- val component = NbtComponent.of(NbtCompound())
- set(DataComponentTypes.CUSTOM_DATA, component)
+ val customData = get(DataComponents.CUSTOM_DATA) ?: run {
+ val component = CustomData.of(CompoundTag())
+ set(DataComponents.CUSTOM_DATA, component)
component
}
return customData.unsafeNbt
}
-fun ItemStack.modifyExtraAttributes(block: (NbtCompound) -> Unit) {
- val baseNbt = get(DataComponentTypes.CUSTOM_DATA)?.copyNbt() ?: NbtCompound()
+fun ItemStack.modifyExtraAttributes(block: (CompoundTag) -> Unit) {
+ val baseNbt = get(DataComponents.CUSTOM_DATA)?.copyTag() ?: CompoundTag()
block(baseNbt)
- set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(baseNbt))
+ set(DataComponents.CUSTOM_DATA, CustomData.of(baseNbt))
}
val ItemStack.skyBlockUUIDString: String?
@@ -266,7 +266,7 @@ val ItemStack.skyBlockId: SkyblockId?
"RUNE", "UNIQUE_RUNE" -> {
val runeData = extraAttributes.getCompound("runes")
.getOrNull()
- val runeKind = runeData?.keys?.singleOrNull()
+ val runeKind = runeData?.keySet()?.singleOrNull()
if (runeKind == null) SkyblockId("RUNE")
else SkyblockId("${runeKind.uppercase()}_RUNE;${runeData.getInt(runeKind).getOrNull()}")
}
@@ -278,14 +278,14 @@ val ItemStack.skyBlockId: SkyblockId?
"ENCHANTED_BOOK" -> {
val enchantmentData = extraAttributes.getCompound("enchantments")
.getOrNull()
- val enchantName = enchantmentData?.keys?.singleOrNull()
+ val enchantName = enchantmentData?.keySet()?.singleOrNull()
if (enchantName == null) SkyblockId("ENCHANTED_BOOK")
else SkyblockId("${enchantName.uppercase()};${enchantmentData.getInt(enchantName).getOrNull()}")
}
"ATTRIBUTE_SHARD" -> {
val attributeData = extraAttributes.getCompound("attributes").getOrNull()
- val attributeName = attributeData?.keys?.singleOrNull()
+ val attributeName = attributeData?.keySet()?.singleOrNull()
if (attributeName == null) SkyblockId("ATTRIBUTE_SHARD")
else SkyblockId(
"ATTRIBUTE_SHARD_${attributeName.uppercase()};${
diff --git a/src/main/kotlin/util/WarpUtil.kt b/src/main/kotlin/util/WarpUtil.kt
index 6783fa1..3008592 100644
--- a/src/main/kotlin/util/WarpUtil.kt
+++ b/src/main/kotlin/util/WarpUtil.kt
@@ -6,8 +6,8 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.serializer
import kotlin.math.sqrt
import kotlin.time.Duration.Companion.seconds
-import net.minecraft.text.Text
-import net.minecraft.util.math.Position
+import net.minecraft.network.chat.Component
+import net.minecraft.core.Position
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.commands.thenExecute
import moe.nea.firmament.events.CommandEvent
@@ -45,25 +45,25 @@ object WarpUtil {
}
private fun squaredDist(pos: Position, warp: Warp): Double {
- val dx = pos.x - warp.x
- val dy = pos.y - warp.y
- val dz = pos.z - warp.z
+ val dx = pos.x() - warp.x
+ val dy = pos.y() - warp.y
+ val dz = pos.z() - warp.z
return dx * dx + dy * dy + dz * dz
}
fun teleportToNearestWarp(island: SkyBlockIsland, pos: Position) {
val nearestWarp = findNearestWarp(island, pos)
if (nearestWarp == null) {
- MC.sendChat(Text.translatable("firmament.warp-util.no-warp-found", island.userFriendlyName))
+ MC.sendChat(Component.translatable("firmament.warp-util.no-warp-found", island.userFriendlyName))
return
}
if (island == SBData.skyblockLocation
- && sqrt(squaredDist(pos, nearestWarp)) > 1.1 * sqrt(squaredDist((MC.player ?: return).pos, nearestWarp))
+ && sqrt(squaredDist(pos, nearestWarp)) > 1.1 * sqrt(squaredDist((MC.player ?: return).position, nearestWarp))
) {
- MC.sendChat(Text.translatable("firmament.warp-util.already-close", nearestWarp.warp))
+ MC.sendChat(Component.translatable("firmament.warp-util.already-close", nearestWarp.warp))
return
}
- MC.sendChat(Text.translatable("firmament.warp-util.attempting-to-warp", nearestWarp.warp))
+ MC.sendChat(Component.translatable("firmament.warp-util.attempting-to-warp", nearestWarp.warp))
lastWarpAttempt = TimeMark.now()
lastAttemptedWarp = nearestWarp.warp
MC.sendCommand("warp ${nearestWarp.warp}")
@@ -75,7 +75,7 @@ object WarpUtil {
thenExecute {
DConfig.data?.excludedWarps?.clear()
DConfig.markDirty()
- source.sendFeedback(Text.translatable("firmament.warp-util.clear-excluded"))
+ source.sendFeedback(Component.translatable("firmament.warp-util.clear-excluded"))
}
}
}
@@ -87,7 +87,7 @@ object WarpUtil {
) {
DConfig.data?.excludedWarps?.add(lastAttemptedWarp)
DConfig.markDirty()
- MC.sendChat(Text.stringifiedTranslatable("firmament.warp-util.mark-excluded", lastAttemptedWarp))
+ MC.sendChat(Component.translatableEscape("firmament.warp-util.mark-excluded", lastAttemptedWarp))
lastWarpAttempt = TimeMark.farPast()
}
if (it.unformattedString.startsWith("You may now fast travel to")) {
diff --git a/src/main/kotlin/util/accessors/GetRectangle.kt b/src/main/kotlin/util/accessors/GetRectangle.kt
index 56f420c..05ecfa9 100644
--- a/src/main/kotlin/util/accessors/GetRectangle.kt
+++ b/src/main/kotlin/util/accessors/GetRectangle.kt
@@ -3,10 +3,10 @@
package moe.nea.firmament.util.accessors
import me.shedaniel.math.Rectangle
-import net.minecraft.client.gui.screen.ingame.HandledScreen
+import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
import moe.nea.firmament.mixins.accessor.AccessorHandledScreen
-fun HandledScreen<*>.getRectangle(): Rectangle {
+fun AbstractContainerScreen<*>.getProperRectangle(): Rectangle {
this as AccessorHandledScreen
return Rectangle(
getX_Firmament(),
diff --git a/src/main/kotlin/util/accessors/chathud.kt b/src/main/kotlin/util/accessors/chathud.kt
index effac7d..7935ad4 100644
--- a/src/main/kotlin/util/accessors/chathud.kt
+++ b/src/main/kotlin/util/accessors/chathud.kt
@@ -1,8 +1,8 @@
package moe.nea.firmament.util.accessors
-import net.minecraft.client.gui.hud.ChatHud
-import net.minecraft.client.gui.hud.ChatHudLine
+import net.minecraft.client.gui.components.ChatComponent
+import net.minecraft.client.GuiMessage
import moe.nea.firmament.mixins.accessor.AccessorChatHud
-val ChatHud.messages: MutableList<ChatHudLine>
+val ChatComponent.messages: MutableList<GuiMessage>
get() = (this as AccessorChatHud).messages_firmament
diff --git a/src/main/kotlin/util/async/input.kt b/src/main/kotlin/util/async/input.kt
index 35265f5..65479e9 100644
--- a/src/main/kotlin/util/async/input.kt
+++ b/src/main/kotlin/util/async/input.kt
@@ -9,7 +9,7 @@ import io.github.notenoughupdates.moulconfig.gui.component.TextFieldComponent
import io.github.notenoughupdates.moulconfig.observer.GetSetter
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
-import net.minecraft.client.gui.screen.Screen
+import net.minecraft.client.gui.screens.Screen
import moe.nea.firmament.events.HandledScreenKeyPressedEvent
import moe.nea.firmament.gui.FirmButtonComponent
import moe.nea.firmament.keybindings.SavedKeyBinding
diff --git a/src/main/kotlin/util/colorconversion.kt b/src/main/kotlin/util/colorconversion.kt
index d7a5dad..758e354 100644
--- a/src/main/kotlin/util/colorconversion.kt
+++ b/src/main/kotlin/util/colorconversion.kt
@@ -2,12 +2,12 @@
package moe.nea.firmament.util
-import net.minecraft.text.TextColor
-import net.minecraft.util.DyeColor
+import net.minecraft.network.chat.TextColor
+import net.minecraft.world.item.DyeColor
fun DyeColor.toShedaniel(): me.shedaniel.math.Color =
- me.shedaniel.math.Color.ofOpaque(this.signColor)
+ me.shedaniel.math.Color.ofOpaque(this.textColor)
fun DyeColor.toTextColor(): TextColor =
- TextColor.fromRgb(this.signColor)
+ TextColor.fromRgb(this.textColor)
diff --git a/src/main/kotlin/util/customgui/CoordRememberingSlot.kt b/src/main/kotlin/util/customgui/CoordRememberingSlot.kt
index c61c711..e565850 100644
--- a/src/main/kotlin/util/customgui/CoordRememberingSlot.kt
+++ b/src/main/kotlin/util/customgui/CoordRememberingSlot.kt
@@ -1,7 +1,7 @@
package moe.nea.firmament.util.customgui
-import net.minecraft.screen.slot.Slot
+import net.minecraft.world.inventory.Slot
interface CoordRememberingSlot {
fun rememberCoords_firmament()
diff --git a/src/main/kotlin/util/customgui/CustomGui.kt b/src/main/kotlin/util/customgui/CustomGui.kt
index 457632b..f64bf4d 100644
--- a/src/main/kotlin/util/customgui/CustomGui.kt
+++ b/src/main/kotlin/util/customgui/CustomGui.kt
@@ -1,11 +1,11 @@
package moe.nea.firmament.util.customgui
import me.shedaniel.math.Rectangle
-import net.minecraft.client.gui.Click
-import net.minecraft.client.gui.DrawContext
-import net.minecraft.client.input.CharInput
-import net.minecraft.client.input.KeyInput
-import net.minecraft.screen.slot.Slot
+import net.minecraft.client.input.MouseButtonEvent
+import net.minecraft.client.gui.GuiGraphics
+import net.minecraft.client.input.CharacterEvent
+import net.minecraft.client.input.KeyEvent
+import net.minecraft.world.inventory.Slot
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.events.HandledScreenPushREIEvent
@@ -26,19 +26,19 @@ abstract class CustomGui {
}
open fun render(
- drawContext: DrawContext,
- delta: Float,
- mouseX: Int,
- mouseY: Int
+ drawContext: GuiGraphics,
+ delta: Float,
+ mouseX: Int,
+ mouseY: Int
) {
}
- open fun mouseClick(click: Click, doubled: Boolean): Boolean {
+ open fun mouseClick(click: MouseButtonEvent, doubled: Boolean): Boolean {
return false
}
- open fun afterSlotRender(context: DrawContext, slot: Slot) {}
- open fun beforeSlotRender(context: DrawContext, slot: Slot) {}
+ open fun afterSlotRender(context: GuiGraphics, slot: Slot) {}
+ open fun beforeSlotRender(context: GuiGraphics, slot: Slot) {}
open fun mouseScrolled(mouseX: Double, mouseY: Double, horizontalAmount: Double, verticalAmount: Double): Boolean {
return false
}
@@ -72,23 +72,23 @@ abstract class CustomGui {
return true
}
- open fun mouseReleased(click: Click): Boolean {
+ open fun mouseReleased(click: MouseButtonEvent): Boolean {
return false
}
- open fun mouseDragged(click: Click, offsetX: Double, offsetY: Double): Boolean {
+ open fun mouseDragged(click: MouseButtonEvent, offsetX: Double, offsetY: Double): Boolean {
return false
}
- open fun keyPressed(input: KeyInput): Boolean {
+ open fun keyPressed(input: KeyEvent): Boolean {
return false
}
- open fun charTyped(input: CharInput): Boolean {
+ open fun charTyped(input: CharacterEvent): Boolean {
return false
}
- open fun keyReleased(input: KeyInput): Boolean {
+ open fun keyReleased(input: KeyEvent): Boolean {
return false
}
}
diff --git a/src/main/kotlin/util/customgui/HasCustomGui.kt b/src/main/kotlin/util/customgui/HasCustomGui.kt
index edead2e..7182979 100644
--- a/src/main/kotlin/util/customgui/HasCustomGui.kt
+++ b/src/main/kotlin/util/customgui/HasCustomGui.kt
@@ -1,7 +1,7 @@
package moe.nea.firmament.util.customgui
-import net.minecraft.client.gui.screen.ingame.HandledScreen
+import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
@Suppress("FunctionName")
interface HasCustomGui {
@@ -9,7 +9,7 @@ interface HasCustomGui {
fun setCustomGui_Firmament(gui: CustomGui?)
}
-var <T : HandledScreen<*>> T.customGui: CustomGui?
+var <T : AbstractContainerScreen<*>> T.customGui: CustomGui?
get() = (this as HasCustomGui).getCustomGui_Firmament()
set(value) {
(this as HasCustomGui).setCustomGui_Firmament(value)
diff --git a/src/main/kotlin/util/json/BlockPosSerializer.kt b/src/main/kotlin/util/json/BlockPosSerializer.kt
index 144b0a0..5906544 100644
--- a/src/main/kotlin/util/json/BlockPosSerializer.kt
+++ b/src/main/kotlin/util/json/BlockPosSerializer.kt
@@ -5,7 +5,7 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.serializer
-import net.minecraft.util.math.BlockPos
+import net.minecraft.core.BlockPos
object BlockPosSerializer : KSerializer<BlockPos> {
val delegate = serializer<List<Int>>()
diff --git a/src/main/kotlin/util/json/FirmCodecs.kt b/src/main/kotlin/util/json/FirmCodecs.kt
index c0863bc..d7b8f57 100644
--- a/src/main/kotlin/util/json/FirmCodecs.kt
+++ b/src/main/kotlin/util/json/FirmCodecs.kt
@@ -4,11 +4,11 @@ import com.mojang.serialization.Codec
import com.mojang.serialization.DataResult
import com.mojang.serialization.Lifecycle
import com.mojang.util.UndashedUuid
-import net.minecraft.util.Uuids
+import net.minecraft.core.UUIDUtil
object FirmCodecs {
@JvmField
- val UUID_LENIENT_PREFER_INT_STREAM = Codec.withAlternative(Uuids.INT_STREAM_CODEC, Codec.STRING.comapFlatMap(
+ val UUID_LENIENT_PREFER_INT_STREAM = Codec.withAlternative(UUIDUtil.CODEC, Codec.STRING.comapFlatMap(
{
try {
DataResult.success(UndashedUuid.fromStringLenient(it), Lifecycle.stable())
diff --git a/src/main/kotlin/util/math/Projections.kt b/src/main/kotlin/util/math/Projections.kt
index 359b21b..9e9f844 100644
--- a/src/main/kotlin/util/math/Projections.kt
+++ b/src/main/kotlin/util/math/Projections.kt
@@ -3,7 +3,7 @@ package moe.nea.firmament.util.math
import kotlin.math.absoluteValue
import kotlin.math.cos
import kotlin.math.sin
-import net.minecraft.util.math.Vec2f
+import net.minecraft.world.phys.Vec2
import moe.nea.firmament.util.render.wrapAngle
object Projections {
@@ -14,14 +14,14 @@ object Projections {
fun isNullish(float: Float) = float.absoluteValue < ε
- fun xInterceptOfLine(origin: Vec2f, direction: Vec2f): Vec2f? {
+ fun xInterceptOfLine(origin: Vec2, direction: Vec2): Vec2? {
if (isNullish(direction.x))
- return Vec2f(origin.x, 0F)
+ return Vec2(origin.x, 0F)
if (isNullish(direction.y))
return null
val slope = direction.y / direction.x
- return Vec2f(origin.x - origin.y / slope, 0F)
+ return Vec2(origin.x - origin.y / slope, 0F)
}
fun interceptAlongCardinal(distanceFromAxis: Float, slope: Float): Float? {
@@ -30,7 +30,7 @@ object Projections {
return -distanceFromAxis / slope
}
- fun projectAngleOntoUnitBox(angleRadians: Double): Vec2f {
+ fun projectAngleOntoUnitBox(angleRadians: Double): Vec2 {
val angleRadians = wrapAngle(angleRadians)
val cx = cos(angleRadians)
val cy = sin(angleRadians)
@@ -40,7 +40,7 @@ object Projections {
val e = minOf(ex, ey)
- return Vec2f((cx * e).toFloat(), (cy * e).toFloat())
+ return Vec2((cx * e).toFloat(), (cy * e).toFloat())
}
}
}
diff --git a/src/main/kotlin/util/mc/ArmorUtil.kt b/src/main/kotlin/util/mc/ArmorUtil.kt
index fd1867c..3bb1768 100644
--- a/src/main/kotlin/util/mc/ArmorUtil.kt
+++ b/src/main/kotlin/util/mc/ArmorUtil.kt
@@ -1,8 +1,8 @@
package moe.nea.firmament.util.mc
-import net.minecraft.entity.EquipmentSlot
-import net.minecraft.entity.LivingEntity
+import net.minecraft.world.entity.EquipmentSlot
+import net.minecraft.world.entity.LivingEntity
val LivingEntity.iterableArmorItems
get() = EquipmentSlot.entries.asSequence()
- .map { it to getEquippedStack(it) }
+ .map { it to getItemBySlot(it) }
diff --git a/src/main/kotlin/util/mc/CustomRenderPassHelper.kt b/src/main/kotlin/util/mc/CustomRenderPassHelper.kt
index 67fb2f8..93cd7c1 100644
--- a/src/main/kotlin/util/mc/CustomRenderPassHelper.kt
+++ b/src/main/kotlin/util/mc/CustomRenderPassHelper.kt
@@ -13,22 +13,22 @@ import java.util.OptionalDouble
import java.util.OptionalInt
import org.joml.Vector3f
import org.joml.Vector4f
-import net.minecraft.client.gl.Framebuffer
-import net.minecraft.client.render.BufferBuilder
-import net.minecraft.client.render.BuiltBuffer
-import net.minecraft.client.texture.AbstractTexture
-import net.minecraft.client.util.BufferAllocator
-import net.minecraft.util.Identifier
-import net.minecraft.util.math.MathHelper
+import com.mojang.blaze3d.pipeline.RenderTarget
+import com.mojang.blaze3d.vertex.BufferBuilder
+import com.mojang.blaze3d.vertex.MeshData
+import net.minecraft.client.renderer.texture.AbstractTexture
+import com.mojang.blaze3d.vertex.ByteBufferBuilder
+import net.minecraft.resources.ResourceLocation
+import net.minecraft.util.Mth
import moe.nea.firmament.util.ErrorUtil
import moe.nea.firmament.util.MC
class CustomRenderPassHelper(
val labelSupplier: () -> String,
- val drawMode: VertexFormat.DrawMode,
+ val drawMode: VertexFormat.Mode,
val vertexFormat: VertexFormat,
- val frameBuffer: Framebuffer,
+ val frameBuffer: RenderTarget,
val hasDepth: Boolean,
) : AutoCloseable {
private val scope = mutableListOf<AutoCloseable>()
@@ -45,12 +45,12 @@ class CustomRenderPassHelper(
}
}
- fun bindSampler(name: String, texture: Identifier) {
+ fun bindSampler(name: String, texture: ResourceLocation) {
bindSampler(name, MC.textureManager.getTexture(texture))
}
fun bindSampler(name: String, texture: AbstractTexture) {
- queueAction { it.bindSampler(name, texture.glTextureView) }
+ queueAction { it.bindSampler(name, texture.textureView) }
}
@@ -65,7 +65,7 @@ class CustomRenderPassHelper(
}
setUniform(
"DynamicTransforms", RenderSystem.getDynamicUniforms()
- .write(
+ .writeTransform(
RenderSystem.getModelViewMatrix(),
Vector4f(1.0F, 1.0F, 1.0F, 1.0F),
Vector3f(), // TODO: 1.21.10
@@ -83,25 +83,25 @@ class CustomRenderPassHelper(
setUniform(name, buffer)
}
- var vertices: BuiltBuffer? = null
+ var vertices: MeshData? = null
fun uploadVertices(size: Int, init: (BufferBuilder) -> Unit) {
uploadVertices(
- BufferBuilder(queueClose(BufferAllocator(size)), drawMode, vertexFormat)
+ BufferBuilder(queueClose(ByteBufferBuilder(size)), drawMode, vertexFormat)
.also(init)
- .end()
+ .buildOrThrow()
)
}
- fun uploadVertices(buffer: BuiltBuffer) {
+ fun uploadVertices(buffer: MeshData) {
queueClose(buffer)
ErrorUtil.softCheck("Vertices have already been uploaded", vertices == null)
vertices = buffer
- val vertexBuffer = vertexFormat.uploadImmediateVertexBuffer(buffer.buffer)
+ val vertexBuffer = vertexFormat.uploadImmediateVertexBuffer(buffer.vertexBuffer())
val indexBufferConstructor = RenderSystem.getSequentialBuffer(drawMode)
- val indexBuffer = indexBufferConstructor.getIndexBuffer(buffer.drawParameters.indexCount)
+ val indexBuffer = indexBufferConstructor.getBuffer(buffer.drawState().indexCount)
queueAction {
- it.setIndexBuffer(indexBuffer, indexBufferConstructor.indexType)
+ it.setIndexBuffer(indexBuffer, indexBufferConstructor.type())
it.setVertexBuffer(0, vertexBuffer)
}
}
@@ -119,7 +119,7 @@ class CustomRenderPassHelper(
fun allocateByteBuf(size: Int, init: (Std140Builder) -> Unit): ByteBuffer {
return Std140Builder.intoBuffer( // TODO: i really dont know about this 16 align? but it seems to be generally correct.
ByteBuffer
- .allocateDirect(MathHelper.roundUpToMultiple(size, 16))
+ .allocateDirect(Mth.roundToward(size, 16))
.order(ByteOrder.nativeOrder())
).also(init).get()
}
@@ -142,10 +142,10 @@ class CustomRenderPassHelper(
val renderPass = queueClose(
commandEncoder.createRenderPass(
labelSupplier::invoke,
- RenderSystem.outputColorTextureOverride ?: frameBuffer.getColorAttachmentView(),
+ RenderSystem.outputColorTextureOverride ?: frameBuffer.colorTextureView!!,
OptionalInt.empty(),
(RenderSystem.outputDepthTextureOverride
- ?: frameBuffer.getDepthAttachmentView()).takeIf { frameBuffer.useDepthAttachment && hasDepth },
+ ?: frameBuffer.depthTextureView).takeIf { frameBuffer.useDepth && hasDepth },
OptionalDouble.empty()
)
)
@@ -153,7 +153,7 @@ class CustomRenderPassHelper(
renderPass.drawIndexed(
0,
0,
- vertexData.drawParameters.indexCount,
+ vertexData.drawState().indexCount,
1
)
return DrawToken
diff --git a/src/main/kotlin/util/mc/FakeInventory.kt b/src/main/kotlin/util/mc/FakeInventory.kt
index 26c04bc..198ec68 100644
--- a/src/main/kotlin/util/mc/FakeInventory.kt
+++ b/src/main/kotlin/util/mc/FakeInventory.kt
@@ -1,14 +1,14 @@
package util.mc
-import net.minecraft.entity.player.PlayerEntity
-import net.minecraft.inventory.Inventory
-import net.minecraft.item.ItemStack
+import net.minecraft.world.entity.player.Player
+import net.minecraft.world.Container
+import net.minecraft.world.item.ItemStack
-class FakeInventory(val stack: ItemStack) : Inventory {
- override fun clear() {
+class FakeInventory(val stack: ItemStack) : Container {
+ override fun clearContent() {
}
- override fun size(): Int {
+ override fun getContainerSize(): Int {
return 1
}
@@ -16,26 +16,26 @@ class FakeInventory(val stack: ItemStack) : Inventory {
return stack.isEmpty
}
- override fun getStack(slot: Int): ItemStack {
+ override fun getItem(slot: Int): ItemStack {
require(slot == 0)
return stack
}
- override fun removeStack(slot: Int, amount: Int): ItemStack {
+ override fun removeItem(slot: Int, amount: Int): ItemStack {
return ItemStack.EMPTY
}
- override fun removeStack(slot: Int): ItemStack {
+ override fun removeItemNoUpdate(slot: Int): ItemStack {
return ItemStack.EMPTY
}
- override fun setStack(slot: Int, stack: ItemStack?) {
+ override fun setItem(slot: Int, stack: ItemStack?) {
}
- override fun markDirty() {
+ override fun setChanged() {
}
- override fun canPlayerUse(player: PlayerEntity?): Boolean {
+ override fun stillValid(player: Player?): Boolean {
return true
}
}
diff --git a/src/main/kotlin/util/mc/FakeSlot.kt b/src/main/kotlin/util/mc/FakeSlot.kt
index a9be484..9793fdf 100644
--- a/src/main/kotlin/util/mc/FakeSlot.kt
+++ b/src/main/kotlin/util/mc/FakeSlot.kt
@@ -1,15 +1,15 @@
package moe.nea.firmament.util.mc
import util.mc.FakeInventory
-import net.minecraft.item.ItemStack
-import net.minecraft.screen.slot.Slot
+import net.minecraft.world.item.ItemStack
+import net.minecraft.world.inventory.Slot
class FakeSlot(
- stack: ItemStack,
- x: Int,
- y: Int
+ stack: ItemStack,
+ x: Int,
+ y: Int
) : Slot(FakeInventory(stack), 0, x, y) {
init {
- id = 0
+ index = 0
}
}
diff --git a/src/main/kotlin/util/mc/FirmamentDataComponentTypes.kt b/src/main/kotlin/util/mc/FirmamentDataComponentTypes.kt
index 0866665..79536e5 100644
--- a/src/main/kotlin/util/mc/FirmamentDataComponentTypes.kt
+++ b/src/main/kotlin/util/mc/FirmamentDataComponentTypes.kt
@@ -2,10 +2,10 @@ package moe.nea.firmament.util.mc
import com.mojang.serialization.Codec
import io.netty.buffer.ByteBuf
-import net.minecraft.component.ComponentType
-import net.minecraft.network.codec.PacketCodec
-import net.minecraft.registry.Registries
-import net.minecraft.registry.Registry
+import net.minecraft.core.component.DataComponentType
+import net.minecraft.network.codec.StreamCodec
+import net.minecraft.core.registries.BuiltInRegistries
+import net.minecraft.core.Registry
import moe.nea.firmament.Firmament
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.events.ClientInitEvent
@@ -19,18 +19,18 @@ object FirmamentDataComponentTypes {
private fun <T> register(
id: String,
- builderOperator: (ComponentType.Builder<T>) -> Unit
- ): ComponentType<T> {
+ builderOperator: (DataComponentType.Builder<T>) -> Unit
+ ): DataComponentType<T> {
return Registry.register(
- Registries.DATA_COMPONENT_TYPE,
+ BuiltInRegistries.DATA_COMPONENT_TYPE,
Firmament.identifier(id),
- ComponentType.builder<T>().also(builderOperator)
+ DataComponentType.builder<T>().also(builderOperator)
.build()
)
}
- fun <T> errorCodec(message: String): PacketCodec<in ByteBuf, T> =
- object : PacketCodec<ByteBuf, T> {
+ fun <T> errorCodec(message: String): StreamCodec<in ByteBuf, T> =
+ object : StreamCodec<ByteBuf, T> {
override fun decode(buf: ByteBuf?): T? {
error(message)
}
@@ -40,16 +40,16 @@ object FirmamentDataComponentTypes {
}
}
- fun <T, B : ComponentType.Builder<T>> B.neverEncode(message: String = "This element should never be encoded or decoded"): B {
- packetCodec(errorCodec(message))
- codec(null)
+ fun <T, B : DataComponentType.Builder<T>> B.neverEncode(message: String = "This element should never be encoded or decoded"): B {
+ networkSynchronized(errorCodec(message))
+ persistent(null)
return this
}
val IS_BROKEN = register<Boolean>(
"is_broken"
) {
- it.codec(Codec.BOOL.fieldOf("is_broken").codec())
+ it.persistent(Codec.BOOL.fieldOf("is_broken").codec())
}
val CUSTOM_MINING_BLOCK_DATA = register<MiningRepoData.CustomMiningBlock>("custom_mining_block") {
diff --git a/src/main/kotlin/util/mc/IntrospectableItemModelManager.kt b/src/main/kotlin/util/mc/IntrospectableItemModelManager.kt
index e546fd3..537ca5b 100644
--- a/src/main/kotlin/util/mc/IntrospectableItemModelManager.kt
+++ b/src/main/kotlin/util/mc/IntrospectableItemModelManager.kt
@@ -1,7 +1,7 @@
package moe.nea.firmament.util.mc
-import net.minecraft.util.Identifier
+import net.minecraft.resources.ResourceLocation
interface IntrospectableItemModelManager {
- fun hasModel_firmament(identifier: Identifier): Boolean
+ fun hasModel_firmament(identifier: ResourceLocation): Boolean
}
diff --git a/src/main/kotlin/util/mc/InventoryUtil.kt b/src/main/kotlin/util/mc/InventoryUtil.kt
index 74f7b9f..0509138 100644
--- a/src/main/kotlin/util/mc/InventoryUtil.kt
+++ b/src/main/kotlin/util/mc/InventoryUtil.kt
@@ -2,26 +2,26 @@ package moe.nea.firmament.util.mc
import java.util.Spliterator
import java.util.Spliterators
-import net.minecraft.inventory.Inventory
-import net.minecraft.item.ItemStack
+import net.minecraft.world.Container
+import net.minecraft.world.item.ItemStack
-val Inventory.indices get() = 0 until size()
-val Inventory.iterableView
+val Container.indices get() = 0 until containerSize
+val Container.iterableView
get() = object : Iterable<ItemStack> {
override fun spliterator(): Spliterator<ItemStack> {
- return Spliterators.spliterator(iterator(), size().toLong(), 0)
+ return Spliterators.spliterator(iterator(), containerSize.toLong(), 0)
}
override fun iterator(): Iterator<ItemStack> {
return object : Iterator<ItemStack> {
var i = 0
override fun hasNext(): Boolean {
- return i < size()
+ return i < containerSize
}
override fun next(): ItemStack {
if (!hasNext()) throw NoSuchElementException()
- return getStack(i++)
+ return getItem(i++)
}
}
}
diff --git a/src/main/kotlin/util/mc/ItemUtil.kt b/src/main/kotlin/util/mc/ItemUtil.kt
index 3cabb8e..91b6409 100644
--- a/src/main/kotlin/util/mc/ItemUtil.kt
+++ b/src/main/kotlin/util/mc/ItemUtil.kt
@@ -1,15 +1,15 @@
package moe.nea.firmament.util.mc
import kotlin.jvm.optionals.getOrNull
-import net.minecraft.item.ItemStack
-import net.minecraft.nbt.NbtCompound
+import net.minecraft.world.item.ItemStack
+import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.NbtOps
-import net.minecraft.registry.RegistryOps
-import net.minecraft.registry.RegistryWrapper
-import net.minecraft.text.Text
+import net.minecraft.resources.RegistryOps
+import net.minecraft.core.HolderLookup
+import net.minecraft.network.chat.Component
import moe.nea.firmament.util.MC
-fun ItemStack.appendLore(args: List<Text>) {
+fun ItemStack.appendLore(args: List<Component>) {
if (args.isEmpty()) return
modifyLore {
val loreList = loreAccordingToNbt.toMutableList()
@@ -20,11 +20,11 @@ fun ItemStack.appendLore(args: List<Text>) {
}
}
-fun ItemStack.modifyLore(update: (List<Text>) -> List<Text>) {
+fun ItemStack.modifyLore(update: (List<Component>) -> List<Component>) {
val loreList = loreAccordingToNbt
loreAccordingToNbt = update(loreList)
}
-fun loadItemFromNbt(nbt: NbtCompound, registries: RegistryWrapper.WrapperLookup = MC.defaultRegistries): ItemStack? {
- return ItemStack.CODEC.decode(RegistryOps.of(NbtOps.INSTANCE, registries), nbt).result().getOrNull()?.first
+fun loadItemFromNbt(nbt: CompoundTag, registries: HolderLookup.Provider = MC.defaultRegistries): ItemStack? {
+ return ItemStack.CODEC.decode(RegistryOps.create(NbtOps.INSTANCE, registries), nbt).result().getOrNull()?.first
}
diff --git a/src/main/kotlin/util/mc/MCTabListAPI.kt b/src/main/kotlin/util/mc/MCTabListAPI.kt
index 66bdd55..56933d9 100644
--- a/src/main/kotlin/util/mc/MCTabListAPI.kt
+++ b/src/main/kotlin/util/mc/MCTabListAPI.kt
@@ -4,11 +4,11 @@ import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder
import java.util.Optional
import org.jetbrains.annotations.TestOnly
-import net.minecraft.client.gui.hud.PlayerListHud
+import net.minecraft.client.gui.components.PlayerTabOverlay
import net.minecraft.nbt.NbtOps
-import net.minecraft.scoreboard.Team
-import net.minecraft.text.Text
-import net.minecraft.text.TextCodecs
+import net.minecraft.world.scores.PlayerTeam
+import net.minecraft.network.chat.Component
+import net.minecraft.network.chat.ComponentSerialization
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.commands.thenExecute
import moe.nea.firmament.commands.thenLiteral
@@ -24,7 +24,7 @@ import moe.nea.firmament.util.mc.SNbtFormatter.Companion.toPrettyString
object MCTabListAPI {
- fun PlayerListHud.cast() = this as AccessorPlayerListHud
+ fun PlayerTabOverlay.cast() = this as AccessorPlayerListHud
@Subscribe
fun onTick(event: TickEvent) {
@@ -37,7 +37,7 @@ object MCTabListAPI {
thenLiteral("copytablist") {
thenExecute {
currentTabList.body.forEach {
- MC.sendChat(Text.literal(TextCodecs.CODEC.encodeStart(NbtOps.INSTANCE, it).orThrow.toString()))
+ MC.sendChat(Component.literal(ComponentSerialization.CODEC.encodeStart(NbtOps.INSTANCE, it).orThrow.toString()))
}
var compound = CurrentTabList.CODEC.encodeStart(NbtOps.INSTANCE, currentTabList).orThrow
compound = ExportedTestConstantMeta.SOURCE_CODEC.encode(
@@ -60,16 +60,16 @@ object MCTabListAPI {
val currentTabList get() = _currentTabList ?: getTabListNow().also { _currentTabList = it }
data class CurrentTabList(
- val header: Optional<Text>,
- val footer: Optional<Text>,
- val body: List<Text>,
+ val header: Optional<Component>,
+ val footer: Optional<Component>,
+ val body: List<Component>,
) {
companion object {
val CODEC: Codec<CurrentTabList> = RecordCodecBuilder.create {
it.group(
- TextCodecs.CODEC.optionalFieldOf("header").forGetter(CurrentTabList::header),
- TextCodecs.CODEC.optionalFieldOf("footer").forGetter(CurrentTabList::footer),
- TextCodecs.CODEC.listOf().fieldOf("body").forGetter(CurrentTabList::body),
+ ComponentSerialization.CODEC.optionalFieldOf("header").forGetter(CurrentTabList::header),
+ ComponentSerialization.CODEC.optionalFieldOf("footer").forGetter(CurrentTabList::footer),
+ ComponentSerialization.CODEC.listOf().fieldOf("body").forGetter(CurrentTabList::body),
).apply(it, ::CurrentTabList)
}
}
@@ -78,13 +78,13 @@ object MCTabListAPI {
private fun getTabListNow(): CurrentTabList {
// This is a precondition for PlayerListHud.collectEntries to be valid
MC.networkHandler ?: return CurrentTabList(Optional.empty(), Optional.empty(), emptyList())
- val hud = MC.inGameHud.playerListHud.cast()
+ val hud = MC.inGameHud.tabList.cast()
val entries = hud.collectPlayerEntries_firmament()
.map {
- it.displayName ?: run {
- val team = it.scoreboardTeam
+ it.tabListDisplayName ?: run {
+ val team = it.team
val name = it.profile.name
- Team.decorateName(team, Text.literal(name))
+ PlayerTeam.formatNameForTeam(team, Component.literal(name))
}
}
return CurrentTabList(
diff --git a/src/main/kotlin/util/mc/NbtItemData.kt b/src/main/kotlin/util/mc/NbtItemData.kt
index 0c49862..55bfac3 100644
--- a/src/main/kotlin/util/mc/NbtItemData.kt
+++ b/src/main/kotlin/util/mc/NbtItemData.kt
@@ -1,22 +1,22 @@
package moe.nea.firmament.util.mc
-import net.minecraft.component.DataComponentTypes
-import net.minecraft.component.type.LoreComponent
-import net.minecraft.item.ItemStack
-import net.minecraft.text.Text
+import net.minecraft.core.component.DataComponents
+import net.minecraft.world.item.component.ItemLore
+import net.minecraft.world.item.ItemStack
+import net.minecraft.network.chat.Component
-var ItemStack.loreAccordingToNbt: List<Text>
- get() = get(DataComponentTypes.LORE)?.lines ?: listOf()
+var ItemStack.loreAccordingToNbt: List<Component>
+ get() = get(DataComponents.LORE)?.lines ?: listOf()
set(value) {
- set(DataComponentTypes.LORE, LoreComponent(value))
+ set(DataComponents.LORE, ItemLore(value))
}
-var ItemStack.displayNameAccordingToNbt: Text
- get() = get(DataComponentTypes.CUSTOM_NAME) ?: get(DataComponentTypes.ITEM_NAME) ?: item.name
+var ItemStack.displayNameAccordingToNbt: Component
+ get() = get(DataComponents.CUSTOM_NAME) ?: get(DataComponents.ITEM_NAME) ?: item.name
set(value) {
- set(DataComponentTypes.CUSTOM_NAME, value)
+ set(DataComponents.CUSTOM_NAME, value)
}
-fun ItemStack.setCustomName(text: Text) {
- set(DataComponentTypes.CUSTOM_NAME, text)
+fun ItemStack.setCustomName(text: Component) {
+ set(DataComponents.CUSTOM_NAME, text)
}
diff --git a/src/main/kotlin/util/mc/NbtPrism.kt b/src/main/kotlin/util/mc/NbtPrism.kt
index f13fad5..6ac7cb2 100644
--- a/src/main/kotlin/util/mc/NbtPrism.kt
+++ b/src/main/kotlin/util/mc/NbtPrism.kt
@@ -9,11 +9,11 @@ import com.mojang.brigadier.arguments.ArgumentType
import com.mojang.brigadier.arguments.StringArgumentType
import com.mojang.serialization.JsonOps
import kotlin.jvm.optionals.getOrNull
-import net.minecraft.nbt.NbtCompound
-import net.minecraft.nbt.NbtElement
-import net.minecraft.nbt.NbtList
+import net.minecraft.nbt.CompoundTag
+import net.minecraft.nbt.Tag
+import net.minecraft.nbt.ListTag
import net.minecraft.nbt.NbtOps
-import net.minecraft.nbt.NbtString
+import net.minecraft.nbt.StringTag
import moe.nea.firmament.util.Base64Util
class NbtPrism(val path: List<String>) {
@@ -42,9 +42,9 @@ class NbtPrism(val path: List<String>) {
return "Prism($path)"
}
- fun access(root: NbtElement): Collection<NbtElement> {
+ fun access(root: Tag): Collection<Tag> {
var rootSet = mutableListOf(root)
- var switch = mutableListOf<NbtElement>()
+ var switch = mutableListOf<Tag>()
for (pathSegment in path) {
if (pathSegment == ".") continue
if (pathSegment != "*" && pathSegment.startsWith("*")) {
@@ -57,21 +57,21 @@ class NbtPrism(val path: List<String>) {
} else if (pathSegment == "*base64") {
for (element in rootSet) {
val string = element.asString().getOrNull() ?: continue
- switch.add(NbtString.of(Base64Util.decodeString(string)))
+ switch.add(StringTag.valueOf(Base64Util.decodeString(string)))
}
}
}
for (element in rootSet) {
- if (element is NbtList) {
+ if (element is ListTag) {
if (pathSegment == "*")
switch.addAll(element)
val index = pathSegment.toIntOrNull() ?: continue
if (index !in element.indices) continue
switch.add(element[index])
}
- if (element is NbtCompound) {
+ if (element is CompoundTag) {
if (pathSegment == "*")
- element.keys.mapTo(switch) { element.get(it)!! }
+ element.keySet().mapTo(switch) { element.get(it)!! }
switch.add(element.get(pathSegment) ?: continue)
}
}
diff --git a/src/main/kotlin/util/mc/NbtUtil.kt b/src/main/kotlin/util/mc/NbtUtil.kt
index 5c47c28..cfd4184 100644
--- a/src/main/kotlin/util/mc/NbtUtil.kt
+++ b/src/main/kotlin/util/mc/NbtUtil.kt
@@ -1,15 +1,15 @@
package moe.nea.firmament.util.mc
-import net.minecraft.component.type.NbtComponent
-import net.minecraft.nbt.NbtElement
-import net.minecraft.nbt.NbtList
+import net.minecraft.world.item.component.CustomData
+import net.minecraft.nbt.Tag
+import net.minecraft.nbt.ListTag
import moe.nea.firmament.mixins.accessor.AccessorNbtComponent
-fun Iterable<NbtElement>.toNbtList() = NbtList().also {
+fun Iterable<Tag>.toNbtList() = ListTag().also {
for (element in this) {
it.add(element)
}
}
@Suppress("CAST_NEVER_SUCCEEDS")
-val NbtComponent.unsafeNbt get() = (this as AccessorNbtComponent).unsafeNbt_firmament
+val CustomData.unsafeNbt get() = (this as AccessorNbtComponent).unsafeNbt_firmament
diff --git a/src/main/kotlin/util/mc/PlayerUtil.kt b/src/main/kotlin/util/mc/PlayerUtil.kt
index 53ef1f4..7c21987 100644
--- a/src/main/kotlin/util/mc/PlayerUtil.kt
+++ b/src/main/kotlin/util/mc/PlayerUtil.kt
@@ -1,7 +1,7 @@
package moe.nea.firmament.util.mc
-import net.minecraft.entity.EquipmentSlot
-import net.minecraft.entity.player.PlayerEntity
+import net.minecraft.world.entity.EquipmentSlot
+import net.minecraft.world.entity.player.Player
-val PlayerEntity.mainHandStack get() = this.getEquippedStack(EquipmentSlot.MAINHAND)
+val Player.mainHandStack get() = this.getItemBySlot(EquipmentSlot.MAINHAND)
diff --git a/src/main/kotlin/util/mc/SNbtFormatter.kt b/src/main/kotlin/util/mc/SNbtFormatter.kt
index 7617d17..0e630eb 100644
--- a/src/main/kotlin/util/mc/SNbtFormatter.kt
+++ b/src/main/kotlin/util/mc/SNbtFormatter.kt
@@ -1,23 +1,23 @@
package moe.nea.firmament.util.mc
-import net.minecraft.nbt.AbstractNbtList
-import net.minecraft.nbt.NbtByte
-import net.minecraft.nbt.NbtByteArray
-import net.minecraft.nbt.NbtCompound
-import net.minecraft.nbt.NbtDouble
-import net.minecraft.nbt.NbtElement
-import net.minecraft.nbt.NbtEnd
-import net.minecraft.nbt.NbtFloat
-import net.minecraft.nbt.NbtInt
-import net.minecraft.nbt.NbtIntArray
-import net.minecraft.nbt.NbtList
-import net.minecraft.nbt.NbtLong
-import net.minecraft.nbt.NbtLongArray
-import net.minecraft.nbt.NbtShort
-import net.minecraft.nbt.NbtString
-import net.minecraft.nbt.visitor.NbtElementVisitor
-
-class SNbtFormatter private constructor() : NbtElementVisitor {
+import net.minecraft.nbt.CollectionTag
+import net.minecraft.nbt.ByteTag
+import net.minecraft.nbt.ByteArrayTag
+import net.minecraft.nbt.CompoundTag
+import net.minecraft.nbt.DoubleTag
+import net.minecraft.nbt.Tag
+import net.minecraft.nbt.EndTag
+import net.minecraft.nbt.FloatTag
+import net.minecraft.nbt.IntTag
+import net.minecraft.nbt.IntArrayTag
+import net.minecraft.nbt.ListTag
+import net.minecraft.nbt.LongTag
+import net.minecraft.nbt.LongArrayTag
+import net.minecraft.nbt.ShortTag
+import net.minecraft.nbt.StringTag
+import net.minecraft.nbt.TagVisitor
+
+class SNbtFormatter private constructor() : TagVisitor {
private val result = StringBuilder()
private var indent = 0
private fun writeIndent() {
@@ -32,41 +32,41 @@ class SNbtFormatter private constructor() : NbtElementVisitor {
indent--
}
- fun apply(element: NbtElement): StringBuilder {
+ fun apply(element: Tag): StringBuilder {
element.accept(this)
return result
}
- override fun visitString(element: NbtString) {
- result.append(NbtString.escape(element.value))
+ override fun visitString(element: StringTag) {
+ result.append(StringTag.quoteAndEscape(element.value))
}
- override fun visitByte(element: NbtByte) {
- result.append(element.numberValue()).append("b")
+ override fun visitByte(element: ByteTag) {
+ result.append(element.box()).append("b")
}
- override fun visitShort(element: NbtShort) {
+ override fun visitShort(element: ShortTag) {
result.append(element.shortValue()).append("s")
}
- override fun visitInt(element: NbtInt) {
+ override fun visitInt(element: IntTag) {
result.append(element.intValue())
}
- override fun visitLong(element: NbtLong) {
+ override fun visitLong(element: LongTag) {
result.append(element.longValue()).append("L")
}
- override fun visitFloat(element: NbtFloat) {
+ override fun visitFloat(element: FloatTag) {
result.append(element.floatValue()).append("f")
}
- override fun visitDouble(element: NbtDouble) {
+ override fun visitDouble(element: DoubleTag) {
result.append(element.doubleValue()).append("d")
}
- private fun visitArrayContents(array: AbstractNbtList) {
+ private fun visitArrayContents(array: CollectionTag) {
array.forEachIndexed { index, element ->
writeIndent()
element.accept(this)
@@ -77,7 +77,7 @@ class SNbtFormatter private constructor() : NbtElementVisitor {
}
}
- private fun writeArray(arrayTypeTag: String, array: AbstractNbtList) {
+ private fun writeArray(arrayTypeTag: String, array: CollectionTag) {
result.append("[").append(arrayTypeTag).append("\n")
pushIndent()
visitArrayContents(array)
@@ -87,26 +87,26 @@ class SNbtFormatter private constructor() : NbtElementVisitor {
}
- override fun visitByteArray(element: NbtByteArray) {
+ override fun visitByteArray(element: ByteArrayTag) {
writeArray("B;", element)
}
- override fun visitIntArray(element: NbtIntArray) {
+ override fun visitIntArray(element: IntArrayTag) {
writeArray("I;", element)
}
- override fun visitLongArray(element: NbtLongArray) {
+ override fun visitLongArray(element: LongArrayTag) {
writeArray("L;", element)
}
- override fun visitList(element: NbtList) {
+ override fun visitList(element: ListTag) {
writeArray("", element)
}
- override fun visitCompound(compound: NbtCompound) {
+ override fun visitCompound(compound: CompoundTag) {
result.append("{\n")
pushIndent()
- val keys = compound.keys.sorted()
+ val keys = compound.keySet().sorted()
keys.forEachIndexed { index, key ->
writeIndent()
val element = compound[key] ?: error("Key '$key' found but not present in compound: $compound")
@@ -123,19 +123,19 @@ class SNbtFormatter private constructor() : NbtElementVisitor {
result.append("}")
}
- override fun visitEnd(element: NbtEnd) {
+ override fun visitEnd(element: EndTag) {
result.append("END")
}
companion object {
- fun prettify(nbt: NbtElement): String {
+ fun prettify(nbt: Tag): String {
return SNbtFormatter().apply(nbt).toString()
}
- fun NbtElement.toPrettyString() = prettify(this)
+ fun Tag.toPrettyString() = prettify(this)
fun escapeName(key: String): String =
- if (key.matches(SIMPLE_NAME)) key else NbtString.escape(key)
+ if (key.matches(SIMPLE_NAME)) key else StringTag.quoteAndEscape(key)
val SIMPLE_NAME = "[A-Za-z0-9._+-]+".toRegex()
}
diff --git a/src/main/kotlin/util/mc/ScreenUtil.kt b/src/main/kotlin/util/mc/ScreenUtil.kt
index 36feb6b..4e3dbf1 100644
--- a/src/main/kotlin/util/mc/ScreenUtil.kt
+++ b/src/main/kotlin/util/mc/ScreenUtil.kt
@@ -1,9 +1,9 @@
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
+import net.minecraft.client.gui.screens.Screen
+import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
+import net.minecraft.world.entity.player.Inventory
+import net.minecraft.world.inventory.Slot
object ScreenUtil {
private var lastScreen: Screen? = null
@@ -12,15 +12,15 @@ object ScreenUtil {
data class SlotIndex(val index: Int, val isPlayerInventory: Boolean)
fun Screen.getSlotsByIndex(): Map<SlotIndex, Slot> {
- if (this !is HandledScreen<*>) return mapOf()
+ if (this !is AbstractContainerScreen<*>) return mapOf()
if (lastScreen === this) return slotsByIndex
lastScreen = this
- slotsByIndex = this.screenHandler.slots.associate {
- SlotIndex(it.index, it.inventory is PlayerInventory) to it
+ slotsByIndex = this.menu.slots.associate {
+ SlotIndex(it.containerSlot, it.container is Inventory) to it
}
return slotsByIndex
}
- fun Screen.getSlotByIndex( index: Int, isPlayerInventory: Boolean): Slot? =
+ fun Screen.getSlotByIndex(index: Int, isPlayerInventory: Boolean): Slot? =
getSlotsByIndex()[SlotIndex(index, isPlayerInventory)]
}
diff --git a/src/main/kotlin/util/mc/SkullItemData.kt b/src/main/kotlin/util/mc/SkullItemData.kt
index 6f8f24b..cfe5d21 100644
--- a/src/main/kotlin/util/mc/SkullItemData.kt
+++ b/src/main/kotlin/util/mc/SkullItemData.kt
@@ -9,10 +9,10 @@ import java.time.Instant
import java.util.UUID
import kotlinx.serialization.Serializable
import kotlinx.serialization.UseSerializers
-import net.minecraft.component.DataComponentTypes
-import net.minecraft.component.type.ProfileComponent
-import net.minecraft.item.ItemStack
-import net.minecraft.item.Items
+import net.minecraft.core.component.DataComponents
+import net.minecraft.world.item.component.ResolvableProfile
+import net.minecraft.world.item.ItemStack
+import net.minecraft.world.item.Items
import moe.nea.firmament.Firmament
import moe.nea.firmament.util.Base64Util.padToValidBase64
import moe.nea.firmament.util.assertTrueOr
@@ -46,7 +46,7 @@ fun ItemStack.setEncodedSkullOwner(uuid: UUID, encodedData: String) {
assert(this.item == Items.PLAYER_HEAD)
val gameProfile = GameProfile(uuid, "LameGuy123")
gameProfile.properties.put(propertyTextures, Property(propertyTextures, encodedData.padToValidBase64()))
- this.set(DataComponentTypes.PROFILE, ProfileComponent.ofStatic(gameProfile))
+ this.set(DataComponents.PROFILE, ResolvableProfile.createResolved(gameProfile))
}
val arbitraryUUID = UUID.fromString("d3cb85e2-3075-48a1-b213-a9bfb62360c1")
@@ -63,7 +63,7 @@ fun ItemStack.setSkullOwner(uuid: UUID, url: String) {
profileName = "nea89",
)
)
- this.set(DataComponentTypes.PROFILE, ProfileComponent.ofStatic(gameProfile))
+ this.set(DataComponents.PROFILE, ResolvableProfile.createResolved(gameProfile))
}
diff --git a/src/main/kotlin/util/mc/SlotUtils.kt b/src/main/kotlin/util/mc/SlotUtils.kt
index 9eb4918..2f5fd49 100644
--- a/src/main/kotlin/util/mc/SlotUtils.kt
+++ b/src/main/kotlin/util/mc/SlotUtils.kt
@@ -1,46 +1,46 @@
package moe.nea.firmament.util.mc
import org.lwjgl.glfw.GLFW
-import net.minecraft.screen.ScreenHandler
-import net.minecraft.screen.slot.Slot
-import net.minecraft.screen.slot.SlotActionType
+import net.minecraft.world.inventory.AbstractContainerMenu
+import net.minecraft.world.inventory.Slot
+import net.minecraft.world.inventory.ClickType
import moe.nea.firmament.util.MC
object SlotUtils {
- fun Slot.clickMiddleMouseButton(handler: ScreenHandler) {
- MC.interactionManager?.clickSlot(
- handler.syncId,
- this.id,
+ fun Slot.clickMiddleMouseButton(handler: AbstractContainerMenu) {
+ MC.interactionManager?.handleInventoryMouseClick(
+ handler.containerId,
+ this.index,
GLFW.GLFW_MOUSE_BUTTON_MIDDLE,
- SlotActionType.CLONE,
+ ClickType.CLONE,
MC.player
)
}
- fun Slot.swapWithHotBar(handler: ScreenHandler, hotbarIndex: Int) {
- MC.interactionManager?.clickSlot(
- handler.syncId, this.id,
- hotbarIndex, SlotActionType.SWAP,
+ fun Slot.swapWithHotBar(handler: AbstractContainerMenu, hotbarIndex: Int) {
+ MC.interactionManager?.handleInventoryMouseClick(
+ handler.containerId, this.index,
+ hotbarIndex, ClickType.SWAP,
MC.player
)
}
- fun Slot.clickRightMouseButton(handler: ScreenHandler) {
- MC.interactionManager?.clickSlot(
- handler.syncId,
- this.id,
+ fun Slot.clickRightMouseButton(handler: AbstractContainerMenu) {
+ MC.interactionManager?.handleInventoryMouseClick(
+ handler.containerId,
+ this.index,
GLFW.GLFW_MOUSE_BUTTON_RIGHT,
- SlotActionType.PICKUP,
+ ClickType.PICKUP,
MC.player
)
}
- fun Slot.clickLeftMouseButton(handler: ScreenHandler) {
- MC.interactionManager?.clickSlot(
- handler.syncId,
- this.id,
+ fun Slot.clickLeftMouseButton(handler: AbstractContainerMenu) {
+ MC.interactionManager?.handleInventoryMouseClick(
+ handler.containerId,
+ this.index,
GLFW.GLFW_MOUSE_BUTTON_LEFT,
- SlotActionType.PICKUP,
+ ClickType.PICKUP,
MC.player
)
}
diff --git a/src/main/kotlin/util/mc/TolerantRegistriesOps.kt b/src/main/kotlin/util/mc/TolerantRegistriesOps.kt
index ce596a0..833aca9 100644
--- a/src/main/kotlin/util/mc/TolerantRegistriesOps.kt
+++ b/src/main/kotlin/util/mc/TolerantRegistriesOps.kt
@@ -2,27 +2,27 @@ package moe.nea.firmament.util.mc
import com.mojang.serialization.DynamicOps
import java.util.Optional
-import net.minecraft.registry.Registry
-import net.minecraft.registry.RegistryKey
-import net.minecraft.registry.RegistryOps
-import net.minecraft.registry.RegistryWrapper
-import net.minecraft.registry.entry.RegistryEntryOwner
+import net.minecraft.core.Registry
+import net.minecraft.resources.ResourceKey
+import net.minecraft.resources.RegistryOps
+import net.minecraft.core.HolderLookup
+import net.minecraft.core.HolderOwner
class TolerantRegistriesOps<T>(
delegate: DynamicOps<T>,
- registryInfoGetter: RegistryInfoGetter
+ registryInfoGetter: RegistryInfoLookup
) : RegistryOps<T>(delegate, registryInfoGetter) {
- constructor(delegate: DynamicOps<T>, registry: RegistryWrapper.WrapperLookup) :
- this(delegate, CachedRegistryInfoGetter(registry))
+ constructor(delegate: DynamicOps<T>, registry: HolderLookup.Provider) :
+ this(delegate, HolderLookupAdapter(registry))
- class TolerantOwner<E> : RegistryEntryOwner<E> {
- override fun ownerEquals(other: RegistryEntryOwner<E>?): Boolean {
+ class TolerantOwner<E> : HolderOwner<E> {
+ override fun canSerializeIn(other: HolderOwner<E>?): Boolean {
return true
}
}
- override fun <E : Any?> getOwner(registryRef: RegistryKey<out Registry<out E>>?): Optional<RegistryEntryOwner<E>> {
- return super.getOwner(registryRef).map {
+ override fun <E : Any?> owner(registryRef: ResourceKey<out Registry<out E>>?): Optional<HolderOwner<E>> {
+ return super.owner(registryRef).map {
TolerantOwner()
}
}
diff --git a/src/main/kotlin/util/mc/asFakeServer.kt b/src/main/kotlin/util/mc/asFakeServer.kt
index d3811bd..1075d62 100644
--- a/src/main/kotlin/util/mc/asFakeServer.kt
+++ b/src/main/kotlin/util/mc/asFakeServer.kt
@@ -1,27 +1,27 @@
package moe.nea.firmament.util.mc
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource
-import net.minecraft.server.command.CommandOutput
-import net.minecraft.server.command.ServerCommandSource
-import net.minecraft.text.Text
+import net.minecraft.commands.CommandSource
+import net.minecraft.commands.CommandSourceStack
+import net.minecraft.network.chat.Component
-fun FabricClientCommandSource.asFakeServer(): ServerCommandSource {
+fun FabricClientCommandSource.asFakeServer(): CommandSourceStack {
val source = this
- return ServerCommandSource(
- object : CommandOutput {
- override fun sendMessage(message: Text?) {
- source.player.sendMessage(message, false)
+ return CommandSourceStack(
+ object : CommandSource {
+ override fun sendSystemMessage(message: Component?) {
+ source.player.displayClientMessage(message, false)
}
- override fun shouldReceiveFeedback(): Boolean {
+ override fun acceptsSuccess(): Boolean {
return true
}
- override fun shouldTrackOutput(): Boolean {
+ override fun acceptsFailure(): Boolean {
return true
}
- override fun shouldBroadcastConsoleToOps(): Boolean {
+ override fun shouldInformAdmins(): Boolean {
return true
}
},
@@ -30,7 +30,7 @@ fun FabricClientCommandSource.asFakeServer(): ServerCommandSource {
null,
0,
"FakeServerCommandSource",
- Text.literal("FakeServerCommandSource"),
+ Component.literal("FakeServerCommandSource"),
null,
source.player
)
diff --git a/src/main/kotlin/util/render/CustomRenderLayers.kt b/src/main/kotlin/util/render/CustomRenderLayers.kt
index d88a1e4..4a85c17 100644
--- a/src/main/kotlin/util/render/CustomRenderLayers.kt
+++ b/src/main/kotlin/util/render/CustomRenderLayers.kt
@@ -3,38 +3,38 @@ package util.render
import com.mojang.blaze3d.pipeline.BlendFunction
import com.mojang.blaze3d.pipeline.RenderPipeline
import com.mojang.blaze3d.platform.DepthTestFunction
-import com.mojang.blaze3d.vertex.VertexFormat.DrawMode
+import com.mojang.blaze3d.vertex.VertexFormat.Mode
import java.util.function.Function
-import net.minecraft.client.gl.RenderPipelines
-import net.minecraft.client.gl.UniformType
-import net.minecraft.client.render.RenderLayer
-import net.minecraft.client.render.RenderPhase
-import net.minecraft.client.render.VertexFormats
-import net.minecraft.util.Identifier
-import net.minecraft.util.Util
+import net.minecraft.client.renderer.RenderPipelines
+import com.mojang.blaze3d.shaders.UniformType
+import net.minecraft.client.renderer.RenderType
+import net.minecraft.client.renderer.RenderStateShard
+import com.mojang.blaze3d.vertex.DefaultVertexFormat
+import net.minecraft.resources.ResourceLocation
+import net.minecraft.Util
import moe.nea.firmament.Firmament
object CustomRenderPipelines {
val GUI_TEXTURED_NO_DEPTH_TRIS =
- RenderPipeline.builder(RenderPipelines.POSITION_TEX_COLOR_SNIPPET)
- .withVertexFormat(VertexFormats.POSITION_TEXTURE_COLOR, DrawMode.TRIANGLES)
+ RenderPipeline.builder(RenderPipelines.GUI_TEXTURED_SNIPPET)
+ .withVertexFormat(DefaultVertexFormat.POSITION_TEX_COLOR, Mode.TRIANGLES)
.withLocation(Firmament.identifier("gui_textured_overlay_tris"))
.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST)
.withCull(false)
.withDepthWrite(false)
.build()
val OMNIPRESENT_LINES = RenderPipeline
- .builder(RenderPipelines.RENDERTYPE_LINES_SNIPPET)
+ .builder(RenderPipelines.LINES_SNIPPET)
.withLocation(Firmament.identifier("lines"))
.withDepthWrite(false)
.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST)
.build()
val COLORED_OMNIPRESENT_QUADS =
- RenderPipeline.builder(RenderPipelines.TRANSFORMS_AND_PROJECTION_SNIPPET)// TODO: split this up to support better transparent ordering.
+ RenderPipeline.builder(RenderPipelines.MATRICES_PROJECTION_SNIPPET)// TODO: split this up to support better transparent ordering.
.withLocation(Firmament.identifier("colored_omnipresent_quads"))
.withVertexShader("core/position_color")
.withFragmentShader("core/position_color")
- .withVertexFormat(VertexFormats.POSITION_COLOR, DrawMode.QUADS)
+ .withVertexFormat(DefaultVertexFormat.POSITION_COLOR, Mode.QUADS)
.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST)
.withCull(false)
.withDepthWrite(false)
@@ -42,8 +42,8 @@ object CustomRenderPipelines {
.build()
val CIRCLE_FILTER_TRANSLUCENT_GUI_TRIS =
- RenderPipeline.builder(RenderPipelines.POSITION_TEX_COLOR_SNIPPET)
- .withVertexFormat(VertexFormats.POSITION_TEXTURE_COLOR, DrawMode.TRIANGLES)
+ RenderPipeline.builder(RenderPipelines.GUI_TEXTURED_SNIPPET)
+ .withVertexFormat(DefaultVertexFormat.POSITION_TEX_COLOR, Mode.TRIANGLES)
.withLocation(Firmament.identifier("gui_textured_overlay_tris_circle"))
.withUniform("CutoutRadius", UniformType.UNIFORM_BUFFER)
.withFragmentShader(Firmament.identifier("circle_discard_color"))
@@ -61,45 +61,45 @@ object CustomRenderPipelines {
}
object CustomRenderLayers {
- inline fun memoizeTextured(crossinline func: (Identifier) -> RenderLayer.MultiPhase) = memoize(func)
+ inline fun memoizeTextured(crossinline func: (ResourceLocation) -> RenderType.CompositeRenderType) = memoize(func)
inline fun <T, R> memoize(crossinline func: (T) -> R): Function<T, R> {
return Util.memoize { it: T -> func(it) }
}
val GUI_TEXTURED_NO_DEPTH_TRIS = memoizeTextured { texture ->
- RenderLayer.of(
+ RenderType.create(
"firmament_gui_textured_overlay_tris",
- RenderLayer.DEFAULT_BUFFER_SIZE,
+ RenderType.TRANSIENT_BUFFER_SIZE,
CustomRenderPipelines.GUI_TEXTURED_NO_DEPTH_TRIS,
- RenderLayer.MultiPhaseParameters.builder().texture(
- RenderPhase.Texture(texture, false)
+ RenderType.CompositeState.builder().setTextureState(
+ RenderStateShard.TextureStateShard(texture, false)
)
- .build(false)
+ .createCompositeState(false)
)
}
- val LINES = RenderLayer.of(
+ val LINES = RenderType.create(
"firmament_lines",
- RenderLayer.DEFAULT_BUFFER_SIZE,
+ RenderType.TRANSIENT_BUFFER_SIZE,
CustomRenderPipelines.OMNIPRESENT_LINES,
- RenderLayer.MultiPhaseParameters.builder() // TODO: accept linewidth here
- .build(false)
+ RenderType.CompositeState.builder() // TODO: accept linewidth here
+ .createCompositeState(false)
)
- val COLORED_QUADS = RenderLayer.of(
+ val COLORED_QUADS = RenderType.create(
"firmament_quads",
- RenderLayer.DEFAULT_BUFFER_SIZE,
+ RenderType.TRANSIENT_BUFFER_SIZE,
false, true,
CustomRenderPipelines.COLORED_OMNIPRESENT_QUADS,
- RenderLayer.MultiPhaseParameters.builder()
- .lightmap(RenderPhase.DISABLE_LIGHTMAP)
- .build(false)
+ RenderType.CompositeState.builder()
+ .setLightmapState(RenderStateShard.NO_LIGHTMAP)
+ .createCompositeState(false)
)
val TRANSLUCENT_CIRCLE_GUI =
- RenderLayer.of(
+ RenderType.create(
"firmament_circle_gui",
- RenderLayer.DEFAULT_BUFFER_SIZE,
+ RenderType.TRANSIENT_BUFFER_SIZE,
CustomRenderPipelines.CIRCLE_FILTER_TRANSLUCENT_GUI_TRIS,
- RenderLayer.MultiPhaseParameters.builder()
- .build(false)
+ RenderType.CompositeState.builder()
+ .createCompositeState(false)
)
}
diff --git a/src/main/kotlin/util/render/DrawContextExt.kt b/src/main/kotlin/util/render/DrawContextExt.kt
index e96fab9..9ef66f3 100644
--- a/src/main/kotlin/util/render/DrawContextExt.kt
+++ b/src/main/kotlin/util/render/DrawContextExt.kt
@@ -5,30 +5,30 @@ import me.shedaniel.math.Color
import org.joml.Vector3f
import util.render.CustomRenderLayers
import kotlin.math.abs
-import net.minecraft.client.gl.RenderPipelines
-import net.minecraft.client.gui.DrawContext
-import net.minecraft.client.gui.ScreenRect
-import net.minecraft.client.render.VertexConsumerProvider
-import net.minecraft.client.util.math.MatrixStack
-import net.minecraft.util.Identifier
+import net.minecraft.client.renderer.RenderPipelines
+import net.minecraft.client.gui.GuiGraphics
+import net.minecraft.client.gui.navigation.ScreenRectangle
+import net.minecraft.client.renderer.MultiBufferSource
+import com.mojang.blaze3d.vertex.PoseStack
+import net.minecraft.resources.ResourceLocation
import moe.nea.firmament.util.MC
-fun DrawContext.isUntranslatedGuiDrawContext(): Boolean {
- return matrices.m00 == 1F && matrices.m11 == 1f && matrices.m01 == 0F && matrices.m10 == 0F && matrices.m20 == 0F && matrices.m21 == 0F
+fun GuiGraphics.isUntranslatedGuiDrawContext(): Boolean {
+ return pose().m00 == 1F && pose().m11 == 1f && pose().m01 == 0F && pose().m10 == 0F && pose().m20 == 0F && pose().m21 == 0F
}
@Deprecated("Use the other drawGuiTexture")
-fun DrawContext.drawGuiTexture(
- x: Int, y: Int, z: Int, width: Int, height: Int, sprite: Identifier
-) = this.drawGuiTexture(RenderPipelines.GUI_TEXTURED, sprite, x, y, width, height)
+fun GuiGraphics.drawGuiTexture(
+ x: Int, y: Int, z: Int, width: Int, height: Int, sprite: ResourceLocation
+) = this.blitSprite(RenderPipelines.GUI_TEXTURED, sprite, x, y, width, height)
-fun DrawContext.drawGuiTexture(
- sprite: Identifier,
+fun GuiGraphics.drawGuiTexture(
+ sprite: ResourceLocation,
x: Int, y: Int, width: Int, height: Int
-) = this.drawGuiTexture(RenderPipelines.GUI_TEXTURED, sprite, x, y, width, height)
+) = this.blitSprite(RenderPipelines.GUI_TEXTURED, sprite, x, y, width, height)
-fun DrawContext.drawTexture(
- sprite: Identifier,
+fun GuiGraphics.drawTexture(
+ sprite: ResourceLocation,
x: Int,
y: Int,
u: Float,
@@ -38,7 +38,7 @@ fun DrawContext.drawTexture(
textureWidth: Int,
textureHeight: Int
) {
- this.drawTexture(
+ this.blit(
RenderPipelines.GUI_TEXTURED,
sprite,
x,
@@ -60,7 +60,7 @@ data class LineRenderState(
override val y1: Int,
override val y2: Int,
override val scale: Float,
- override val bounds: ScreenRect,
+ override val bounds: ScreenRectangle,
val lineWidth: Float,
val w: Int,
val h: Int,
@@ -72,42 +72,42 @@ data class LineRenderState(
BOTTOM_LEFT_TO_TOP_RIGHT,
}
- override fun createRenderer(vertexConsumers: VertexConsumerProvider.Immediate): MultiSpecialGuiRenderer<out MultiSpecialGuiRenderState> {
+ override fun createRenderer(vertexConsumers: MultiBufferSource.BufferSource): MultiSpecialGuiRenderer<out MultiSpecialGuiRenderState> {
return LineRenderer(vertexConsumers)
}
override val scissorArea = null
}
-class LineRenderer(vertexConsumers: VertexConsumerProvider.Immediate) :
+class LineRenderer(vertexConsumers: MultiBufferSource.BufferSource) :
MultiSpecialGuiRenderer<LineRenderState>(vertexConsumers) {
- override fun getElementClass(): Class<LineRenderState> {
+ override fun getRenderStateClass(): Class<LineRenderState> {
return LineRenderState::class.java
}
- override fun getYOffset(height: Int, windowScaleFactor: Int): Float {
+ override fun getTranslateY(height: Int, windowScaleFactor: Int): Float {
return height / 2F
}
- override fun render(
+ override fun renderToTexture(
state: LineRenderState,
- matrices: MatrixStack
+ matrices: PoseStack
) {
val gr = MC.instance.gameRenderer
val client = MC.instance
- gr.globalSettings
- .set(
+ gr.globalSettingsUniform
+ .update(
state.bounds.width,
state.bounds.height,
- client.options.glintStrength.getValue(),
- client.world?.time ?: 0L,
- client.renderTickCounter,
- client.options.menuBackgroundBlurrinessValue
+ client.options.glintStrength().get(),
+ client.level?.gameTime ?: 0L,
+ client.deltaTracker,
+ client.options.menuBackgroundBlurriness
)
RenderSystem.lineWidth(state.lineWidth)
- val buf = vertexConsumers.getBuffer(CustomRenderLayers.LINES)
- val matrix = matrices.peek()
+ val buf = bufferSource.getBuffer(CustomRenderLayers.LINES)
+ val matrix = matrices.last()
val wh = state.w / 2F
val hh = state.h / 2F
val lowX = -wh
@@ -115,50 +115,50 @@ class LineRenderer(vertexConsumers: VertexConsumerProvider.Immediate) :
val highX = wh
val highY = -lowY
val norm = Vector3f(highX - lowX, highY - lowY, 0F).normalize()
- buf.vertex(matrix, lowX, lowY, 0F).color(state.color)
- .normal(matrix, norm)
- buf.vertex(matrix, highX, highY, 0F).color(state.color)
- .normal(matrix, norm)
- vertexConsumers.draw()
- gr.globalSettings
- .set(
- client.window.framebufferWidth,
- client.window.framebufferHeight,
- client.options.glintStrength.getValue(),
- client.world?.getTime() ?: 0L,
- client.renderTickCounter,
- client.options.menuBackgroundBlurrinessValue
+ buf.addVertex(matrix, lowX, lowY, 0F).setColor(state.color)
+ .setNormal(matrix, norm)
+ buf.addVertex(matrix, highX, highY, 0F).setColor(state.color)
+ .setNormal(matrix, norm)
+ bufferSource.endBatch()
+ gr.globalSettingsUniform
+ .update(
+ client.window.width,
+ client.window.height,
+ client.options.glintStrength().get(),
+ client.level?.gameTime ?: 0L,
+ client.deltaTracker,
+ client.options.menuBackgroundBlurriness
)
}
- override fun getName(): String? {
+ override fun getTextureLabel(): String? {
return "Firmament Line Renderer"
}
}
-fun DrawContext.drawLine(fromX: Int, fromY: Int, toX: Int, toY: Int, color: Color, lineWidth: Float = 1F) {
+fun GuiGraphics.drawLine(fromX: Int, fromY: Int, toX: Int, toY: Int, color: Color, lineWidth: Float = 1F) {
if (toY < fromY) {
drawLine(toX, toY, fromX, fromY, color)
return
}
- val originalRect = ScreenRect(
+ val originalRect = ScreenRectangle(
minOf(fromX, toX), minOf(toY, fromY),
abs(toX - fromX), abs(toY - fromY)
- ).transform(matrices)
+ ).transformAxisAligned(pose())
val expansionFactor = 3
- val rect = ScreenRect(
- originalRect.left - expansionFactor,
- originalRect.top - expansionFactor,
+ val rect = ScreenRectangle(
+ originalRect.left() - expansionFactor,
+ originalRect.top() - expansionFactor,
originalRect.width + expansionFactor * 2,
originalRect.height + expansionFactor * 2
)
// TODO: expand the bounds so that the thickness of the line can be used
// TODO: fix this up to work with scissorarea
- state.addSpecialElement(
+ guiRenderState.submitPicturesInPictureState(
LineRenderState(
- rect.left, rect.right, rect.top, rect.bottom, 1F, rect, lineWidth,
+ rect.left(), rect.right(), rect.top(), rect.bottom(), 1F, rect, lineWidth,
originalRect.width, originalRect.height, color.color,
if (fromX < toX) LineRenderState.LineDirection.TOP_LEFT_TO_BOTTOM_RIGHT else LineRenderState.LineDirection.BOTTOM_LEFT_TO_TOP_RIGHT
)
diff --git a/src/main/kotlin/util/render/DumpTexture.kt b/src/main/kotlin/util/render/DumpTexture.kt
index a7b4e78..2ac6a1c 100644
--- a/src/main/kotlin/util/render/DumpTexture.kt
+++ b/src/main/kotlin/util/render/DumpTexture.kt
@@ -4,7 +4,7 @@ import com.mojang.blaze3d.buffers.GpuBuffer
import com.mojang.blaze3d.systems.RenderSystem
import com.mojang.blaze3d.textures.GpuTexture
import java.io.File
-import net.minecraft.client.texture.NativeImage
+import com.mojang.blaze3d.platform.NativeImage
fun dumpTexture(gpuTexture: GpuTexture, name: String) {
val w = gpuTexture.getWidth(0)
@@ -23,12 +23,12 @@ fun dumpTexture(gpuTexture: GpuTexture, name: String) {
for (i in 0..<w) {
for (j in 0..<h) {
val color = mappedView.data().getInt((j + i * w) * gpuTexture.format.pixelSize())
- nativeImage.setColor(j, h - i - 1, color)
+ nativeImage.setPixelABGR(j, h - i - 1, color)
}
}
}
buffer.close()
- nativeImage.writeTo(File("$name.png"))
+ nativeImage.writeToFile(File("$name.png"))
}, 0
)
}
diff --git a/src/main/kotlin/util/render/FacingThePlayerContext.kt b/src/main/kotlin/util/render/FacingThePlayerContext.kt
index e5cb78a..dc45939 100644
--- a/src/main/kotlin/util/render/FacingThePlayerContext.kt
+++ b/src/main/kotlin/util/render/FacingThePlayerContext.kt
@@ -3,13 +3,13 @@ package moe.nea.firmament.util.render
import org.joml.Matrix4f
import util.render.CustomRenderLayers
-import net.minecraft.client.font.TextRenderer
-import net.minecraft.client.render.LightmapTextureManager
-import net.minecraft.client.render.RenderLayer
-import net.minecraft.client.render.VertexConsumer
-import net.minecraft.text.Text
-import net.minecraft.util.Identifier
-import net.minecraft.util.math.BlockPos
+import net.minecraft.client.gui.Font
+import net.minecraft.client.renderer.LightTexture
+import net.minecraft.client.renderer.RenderType
+import com.mojang.blaze3d.vertex.VertexConsumer
+import net.minecraft.network.chat.Component
+import net.minecraft.resources.ResourceLocation
+import net.minecraft.core.BlockPos
import moe.nea.firmament.util.FirmFormatters
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.assertTrueOr
@@ -17,76 +17,76 @@ import moe.nea.firmament.util.assertTrueOr
@RenderContextDSL
class FacingThePlayerContext(val worldContext: RenderInWorldContext) {
val matrixStack by worldContext::matrixStack
- fun waypoint(position: BlockPos, label: Text) {
+ fun waypoint(position: BlockPos, label: Component) {
text(
label,
- Text.literal("§e${FirmFormatters.formatDistance(MC.player?.pos?.distanceTo(position.toCenterPos()) ?: 42069.0)}")
+ Component.literal("§e${FirmFormatters.formatDistance(MC.player?.position?.distanceTo(position.center) ?: 42069.0)}")
)
}
fun text(
- vararg texts: Text,
- verticalAlign: RenderInWorldContext.VerticalAlign = RenderInWorldContext.VerticalAlign.CENTER,
- background: Int = 0x70808080,
+ vararg texts: Component,
+ verticalAlign: RenderInWorldContext.VerticalAlign = RenderInWorldContext.VerticalAlign.CENTER,
+ background: Int = 0x70808080,
) {
assertTrueOr(texts.isNotEmpty()) { return@text }
for ((index, text) in texts.withIndex()) {
- worldContext.matrixStack.push()
- val width = MC.font.getWidth(text)
+ worldContext.matrixStack.pushPose()
+ val width = MC.font.width(text)
worldContext.matrixStack.translate(-width / 2F, verticalAlign.align(index, texts.size), 0F)
val vertexConsumer: VertexConsumer =
- worldContext.vertexConsumers.getBuffer(RenderLayer.getTextBackgroundSeeThrough())
- val matrix4f = worldContext.matrixStack.peek().positionMatrix
- vertexConsumer.vertex(matrix4f, -1.0f, -1.0f, 0.0f).color(background)
- .light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE)
- vertexConsumer.vertex(matrix4f, -1.0f, MC.font.fontHeight.toFloat(), 0.0f).color(background)
- .light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE)
- vertexConsumer.vertex(matrix4f, width.toFloat(), MC.font.fontHeight.toFloat(), 0.0f)
- .color(background)
- .light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE)
- vertexConsumer.vertex(matrix4f, width.toFloat(), -1.0f, 0.0f).color(background)
- .light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE)
+ worldContext.vertexConsumers.getBuffer(RenderType.textBackgroundSeeThrough())
+ val matrix4f = worldContext.matrixStack.last().pose()
+ vertexConsumer.addVertex(matrix4f, -1.0f, -1.0f, 0.0f).setColor(background)
+ .setLight(LightTexture.FULL_BLOCK)
+ vertexConsumer.addVertex(matrix4f, -1.0f, MC.font.lineHeight.toFloat(), 0.0f).setColor(background)
+ .setLight(LightTexture.FULL_BLOCK)
+ vertexConsumer.addVertex(matrix4f, width.toFloat(), MC.font.lineHeight.toFloat(), 0.0f)
+ .setColor(background)
+ .setLight(LightTexture.FULL_BLOCK)
+ vertexConsumer.addVertex(matrix4f, width.toFloat(), -1.0f, 0.0f).setColor(background)
+ .setLight(LightTexture.FULL_BLOCK)
worldContext.matrixStack.translate(0F, 0F, 0.01F)
- MC.font.draw(
+ MC.font.drawInBatch(
text,
0F,
0F,
-1,
false,
- worldContext.matrixStack.peek().positionMatrix,
+ worldContext.matrixStack.last().pose(),
worldContext.vertexConsumers,
- TextRenderer.TextLayerType.SEE_THROUGH,
+ Font.DisplayMode.SEE_THROUGH,
0,
- LightmapTextureManager.MAX_LIGHT_COORDINATE
+ LightTexture.FULL_BRIGHT
)
- worldContext.matrixStack.pop()
+ worldContext.matrixStack.popPose()
}
}
fun texture(
- texture: Identifier, width: Int, height: Int,
- u1: Float, v1: Float,
- u2: Float, v2: Float,
+ texture: ResourceLocation, width: Int, height: Int,
+ u1: Float, v1: Float,
+ u2: Float, v2: Float,
) {
val buf = worldContext.vertexConsumers.getBuffer(CustomRenderLayers.GUI_TEXTURED_NO_DEPTH_TRIS.apply(texture)) // TODO: this is strictly an incorrect render layer
val hw = width / 2F
val hh = height / 2F
- val matrix4f: Matrix4f = worldContext.matrixStack.peek().positionMatrix
- buf.vertex(matrix4f, -hw, -hh, 0F)
- .color(-1)
- .texture(u1, v1)
- buf.vertex(matrix4f, -hw, +hh, 0F)
- .color(-1)
- .texture(u1, v2)
- buf.vertex(matrix4f, +hw, +hh, 0F)
- .color(-1)
- .texture(u2, v2)
- buf.vertex(matrix4f, +hw, -hh, 0F)
- .color(-1)
- .texture(u2, v1)
- worldContext.vertexConsumers.draw()
+ val matrix4f: Matrix4f = worldContext.matrixStack.last().pose()
+ buf.addVertex(matrix4f, -hw, -hh, 0F)
+ .setColor(-1)
+ .setUv(u1, v1)
+ buf.addVertex(matrix4f, -hw, +hh, 0F)
+ .setColor(-1)
+ .setUv(u1, v2)
+ buf.addVertex(matrix4f, +hw, +hh, 0F)
+ .setColor(-1)
+ .setUv(u2, v2)
+ buf.addVertex(matrix4f, +hw, -hh, 0F)
+ .setColor(-1)
+ .setUv(u2, v1)
+ worldContext.vertexConsumers.endBatch()
}
}
diff --git a/src/main/kotlin/util/render/MultiSpecialGuiRenderState.kt b/src/main/kotlin/util/render/MultiSpecialGuiRenderState.kt
index d05e71e..a58ffdc 100644
--- a/src/main/kotlin/util/render/MultiSpecialGuiRenderState.kt
+++ b/src/main/kotlin/util/render/MultiSpecialGuiRenderState.kt
@@ -1,47 +1,47 @@
package moe.nea.firmament.util.render
-import net.minecraft.client.gui.ScreenRect
-import net.minecraft.client.gui.render.SpecialGuiElementRenderer
+import net.minecraft.client.gui.navigation.ScreenRectangle
+import net.minecraft.client.gui.render.pip.PictureInPictureRenderer
import net.minecraft.client.gui.render.state.GuiRenderState
-import net.minecraft.client.gui.render.state.special.SpecialGuiElementRenderState
-import net.minecraft.client.render.VertexConsumerProvider
+import net.minecraft.client.gui.render.state.pip.PictureInPictureRenderState
+import net.minecraft.client.renderer.MultiBufferSource
-abstract class MultiSpecialGuiRenderState : SpecialGuiElementRenderState {
+abstract class MultiSpecialGuiRenderState : PictureInPictureRenderState {
// I wish i had manifolds @Self type here... Maybe i should switch to java after all :(
- abstract fun createRenderer(vertexConsumers: VertexConsumerProvider.Immediate): MultiSpecialGuiRenderer<out MultiSpecialGuiRenderState>
+ abstract fun createRenderer(vertexConsumers: MultiBufferSource.BufferSource): MultiSpecialGuiRenderer<out MultiSpecialGuiRenderState>
abstract val x1: Int
abstract val x2: Int
abstract val y1: Int
abstract val y2: Int
abstract val scale: Float
- abstract val bounds: ScreenRect?
- abstract val scissorArea: ScreenRect?
- override fun x1(): Int = x1
+ abstract val bounds: ScreenRectangle?
+ abstract val scissorArea: ScreenRectangle?
+ override fun x0(): Int = x1
- override fun x2(): Int = x2
+ override fun x1(): Int = x2
- override fun y1(): Int = y1
+ override fun y0(): Int = y1
- override fun y2(): Int = y2
+ override fun y1(): Int = y2
override fun scale(): Float = scale
- override fun scissorArea(): ScreenRect? = scissorArea
+ override fun scissorArea(): ScreenRectangle? = scissorArea
- override fun bounds(): ScreenRect? = bounds
+ override fun bounds(): ScreenRectangle? = bounds
}
abstract class MultiSpecialGuiRenderer<T : MultiSpecialGuiRenderState>(
- vertexConsumers: VertexConsumerProvider.Immediate
-) : SpecialGuiElementRenderer<T>(vertexConsumers) {
+ vertexConsumers: MultiBufferSource.BufferSource
+) : PictureInPictureRenderer<T>(vertexConsumers) {
var wasUsedThisFrame = false
fun consumeRender(): Boolean {
return wasUsedThisFrame.also { wasUsedThisFrame = false }
}
- override fun renderElement(element: T, state: GuiRenderState) {
+ override fun blitTexture(element: T, state: GuiRenderState) {
wasUsedThisFrame = true
- super.renderElement(element, state)
+ super.blitTexture(element, state)
}
}
diff --git a/src/main/kotlin/util/render/RenderCircleProgress.kt b/src/main/kotlin/util/render/RenderCircleProgress.kt
index c9b8e16..acd0210 100644
--- a/src/main/kotlin/util/render/RenderCircleProgress.kt
+++ b/src/main/kotlin/util/render/RenderCircleProgress.kt
@@ -2,14 +2,14 @@ package moe.nea.firmament.util.render
import com.mojang.blaze3d.vertex.VertexFormat
import util.render.CustomRenderLayers
-import net.minecraft.client.gui.DrawContext
-import net.minecraft.client.gui.ScreenRect
-import net.minecraft.client.render.BufferBuilder
-import net.minecraft.client.render.RenderLayer
-import net.minecraft.client.render.VertexConsumerProvider
-import net.minecraft.client.util.BufferAllocator
-import net.minecraft.client.util.math.MatrixStack
-import net.minecraft.util.Identifier
+import net.minecraft.client.gui.GuiGraphics
+import net.minecraft.client.gui.navigation.ScreenRectangle
+import com.mojang.blaze3d.vertex.BufferBuilder
+import net.minecraft.client.renderer.RenderType
+import net.minecraft.client.renderer.MultiBufferSource
+import com.mojang.blaze3d.vertex.ByteBufferBuilder
+import com.mojang.blaze3d.vertex.PoseStack
+import net.minecraft.resources.ResourceLocation
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.collections.nonNegligibleSubSectionsAlignedWith
import moe.nea.firmament.util.math.Projections
@@ -23,7 +23,7 @@ object RenderCircleProgress {
override val x2: Int,
override val y1: Int,
override val y2: Int,
- val layer: RenderLayer.MultiPhase,
+ val layer: RenderType.CompositeRenderType,
val u1: Float,
val u2: Float,
val v1: Float,
@@ -32,21 +32,21 @@ object RenderCircleProgress {
val color: Int,
val innerCutoutRadius: Float,
override val scale: Float,
- override val bounds: ScreenRect?,
- override val scissorArea: ScreenRect?,
+ override val bounds: ScreenRectangle?,
+ override val scissorArea: ScreenRectangle?,
) : MultiSpecialGuiRenderState() {
- override fun createRenderer(vertexConsumers: VertexConsumerProvider.Immediate): MultiSpecialGuiRenderer<out MultiSpecialGuiRenderState> {
+ override fun createRenderer(vertexConsumers: MultiBufferSource.BufferSource): MultiSpecialGuiRenderer<out MultiSpecialGuiRenderState> {
return Renderer(vertexConsumers)
}
}
- class Renderer(vertexConsumers: VertexConsumerProvider.Immediate) :
+ class Renderer(vertexConsumers: MultiBufferSource.BufferSource) :
MultiSpecialGuiRenderer<State>(vertexConsumers) {
- override fun render(
+ override fun renderToTexture(
state: State,
- matrices: MatrixStack
+ matrices: PoseStack
) {
- matrices.push()
+ matrices.pushPose()
matrices.translate(0F, -1F, 0F)
val sections = state.angleRadians.nonNegligibleSubSectionsAlignedWith((τ / 8f).toFloat())
.zipWithNext().toList()
@@ -55,10 +55,10 @@ object RenderCircleProgress {
val v1 = state.v1
val v2 = state.v2
val color = state.color
- val matrix = matrices.peek().positionMatrix
- BufferAllocator(state.layer.vertexFormat.vertexSize * sections.size * 3).use { allocator ->
+ val matrix = matrices.last().pose()
+ ByteBufferBuilder(state.layer.format().vertexSize * sections.size * 3).use { allocator ->
- val bufferBuilder = BufferBuilder(allocator, VertexFormat.DrawMode.TRIANGLES, state.layer.vertexFormat)
+ val bufferBuilder = BufferBuilder(allocator, VertexFormat.Mode.TRIANGLES, state.layer.format())
for ((sectionStart, sectionEnd) in sections) {
val firstPoint = Projections.Two.projectAngleOntoUnitBox(sectionStart.toDouble())
@@ -67,37 +67,37 @@ object RenderCircleProgress {
ilerp(-1f, 1f, f)
bufferBuilder
- .vertex(matrix, secondPoint.x, secondPoint.y, 0F)
- .texture(lerp(u1, u2, ilerp(secondPoint.x)), lerp(v1, v2, ilerp(secondPoint.y)))
- .color(color)
+ .addVertex(matrix, secondPoint.x, secondPoint.y, 0F)
+ .setUv(lerp(u1, u2, ilerp(secondPoint.x)), lerp(v1, v2, ilerp(secondPoint.y)))
+ .setColor(color)
bufferBuilder
- .vertex(matrix, firstPoint.x, firstPoint.y, 0F)
- .texture(lerp(u1, u2, ilerp(firstPoint.x)), lerp(v1, v2, ilerp(firstPoint.y)))
- .color(color)
+ .addVertex(matrix, firstPoint.x, firstPoint.y, 0F)
+ .setUv(lerp(u1, u2, ilerp(firstPoint.x)), lerp(v1, v2, ilerp(firstPoint.y)))
+ .setColor(color)
bufferBuilder
- .vertex(matrix, 0F, 0F, 0F)
- .texture(lerp(u1, u2, ilerp(0F)), lerp(v1, v2, ilerp(0F)))
- .color(color)
+ .addVertex(matrix, 0F, 0F, 0F)
+ .setUv(lerp(u1, u2, ilerp(0F)), lerp(v1, v2, ilerp(0F)))
+ .setColor(color)
}
- bufferBuilder.end().use { buffer ->
+ bufferBuilder.buildOrThrow().use { buffer ->
if (state.innerCutoutRadius <= 0) {
state.layer.draw(buffer)
return
}
CustomRenderPassHelper(
{ "RenderCircleProgress" },
- VertexFormat.DrawMode.TRIANGLES,
- state.layer.vertexFormat,
- MC.instance.framebuffer,
+ VertexFormat.Mode.TRIANGLES,
+ state.layer.format(),
+ MC.instance.mainRenderTarget,
false,
).use { renderPass ->
renderPass.uploadVertices(buffer)
renderPass.setAllDefaultUniforms()
- renderPass.setPipeline(state.layer.pipeline)
+ renderPass.setPipeline(state.layer.renderPipeline)
renderPass.setUniform("CutoutRadius", 4) {
it.putFloat(state.innerCutoutRadius)
}
@@ -105,21 +105,21 @@ object RenderCircleProgress {
}
}
}
- matrices.pop()
+ matrices.popPose()
}
- override fun getElementClass(): Class<State> {
+ override fun getRenderStateClass(): Class<State> {
return State::class.java
}
- override fun getName(): String {
+ override fun getTextureLabel(): String {
return "Firmament Circle"
}
}
fun renderCircularSlice(
- drawContext: DrawContext,
- layer: RenderLayer.MultiPhase,
+ drawContext: GuiGraphics,
+ layer: RenderType.CompositeRenderType,
u1: Float,
u2: Float,
v1: Float,
@@ -128,11 +128,11 @@ object RenderCircleProgress {
color: Int = -1,
innerCutoutRadius: Float = 0F
) {
- val screenRect = ScreenRect(-1, -1, 2, 2).transform(drawContext.matrices)
- drawContext.state.addSpecialElement(
+ val screenRect = ScreenRectangle(-1, -1, 2, 2).transformAxisAligned(drawContext.pose())
+ drawContext.guiRenderState.submitPicturesInPictureState(
State(
- screenRect.left, screenRect.right,
- screenRect.top, screenRect.bottom,
+ screenRect.left(), screenRect.right(),
+ screenRect.top(), screenRect.bottom(),
layer,
u1, u2, v1, v2,
angleRadians,
@@ -146,8 +146,8 @@ object RenderCircleProgress {
}
fun renderCircle(
- drawContext: DrawContext,
- texture: Identifier,
+ drawContext: GuiGraphics,
+ texture: ResourceLocation,
progress: Float,
u1: Float,
u2: Float,
diff --git a/src/main/kotlin/util/render/RenderInWorldContext.kt b/src/main/kotlin/util/render/RenderInWorldContext.kt
index 116ae5d..f6877c8 100644
--- a/src/main/kotlin/util/render/RenderInWorldContext.kt
+++ b/src/main/kotlin/util/render/RenderInWorldContext.kt
@@ -5,53 +5,53 @@ import org.joml.Matrix4f
import org.joml.Vector3f
import util.render.CustomRenderLayers
import kotlin.math.pow
-import net.minecraft.client.render.Camera
-import net.minecraft.client.render.RenderLayer
-import net.minecraft.client.render.RenderLayers
-import net.minecraft.client.render.RenderTickCounter
-import net.minecraft.client.render.TexturedRenderLayers
-import net.minecraft.client.render.VertexConsumer
-import net.minecraft.client.render.VertexConsumerProvider
-import net.minecraft.client.render.state.CameraRenderState
-import net.minecraft.client.texture.Sprite
-import net.minecraft.client.util.math.MatrixStack
-import net.minecraft.text.Text
-import net.minecraft.util.Identifier
-import net.minecraft.util.math.BlockPos
-import net.minecraft.util.math.Box
-import net.minecraft.util.math.Vec3d
+import net.minecraft.client.Camera
+import net.minecraft.client.renderer.RenderType
+import net.minecraft.client.renderer.ItemBlockRenderTypes
+import net.minecraft.client.DeltaTracker
+import net.minecraft.client.renderer.Sheets
+import com.mojang.blaze3d.vertex.VertexConsumer
+import net.minecraft.client.renderer.MultiBufferSource
+import net.minecraft.client.renderer.state.CameraRenderState
+import net.minecraft.client.renderer.texture.TextureAtlasSprite
+import com.mojang.blaze3d.vertex.PoseStack
+import net.minecraft.network.chat.Component
+import net.minecraft.resources.ResourceLocation
+import net.minecraft.core.BlockPos
+import net.minecraft.world.phys.AABB
+import net.minecraft.world.phys.Vec3
import moe.nea.firmament.events.WorldRenderLastEvent
import moe.nea.firmament.util.FirmFormatters
import moe.nea.firmament.util.MC
@RenderContextDSL
class RenderInWorldContext private constructor(
- val matrixStack: MatrixStack,
+ val matrixStack: PoseStack,
private val camera: CameraRenderState,
- val vertexConsumers: VertexConsumerProvider.Immediate,
+ val vertexConsumers: MultiBufferSource.BufferSource,
) {
fun block(blockPos: BlockPos, color: Int) {
- matrixStack.push()
+ matrixStack.pushPose()
matrixStack.translate(blockPos.x.toFloat(), blockPos.y.toFloat(), blockPos.z.toFloat())
- buildCube(matrixStack.peek().positionMatrix, vertexConsumers.getBuffer(CustomRenderLayers.COLORED_QUADS), color)
- matrixStack.pop()
+ buildCube(matrixStack.last().pose(), vertexConsumers.getBuffer(CustomRenderLayers.COLORED_QUADS), color)
+ matrixStack.popPose()
}
- fun box(aabb: Box, color: Int) {
- matrixStack.push()
+ fun box(aabb: AABB, color: Int) {
+ matrixStack.pushPose()
matrixStack.translate(aabb.minX, aabb.minY, aabb.minZ)
- matrixStack.scale(aabb.lengthX.toFloat(), aabb.lengthY.toFloat(), aabb.lengthZ.toFloat())
- buildCube(matrixStack.peek().positionMatrix, vertexConsumers.getBuffer(CustomRenderLayers.COLORED_QUADS), color)
- matrixStack.pop()
+ matrixStack.scale(aabb.xsize.toFloat(), aabb.ysize.toFloat(), aabb.zsize.toFloat())
+ buildCube(matrixStack.last().pose(), vertexConsumers.getBuffer(CustomRenderLayers.COLORED_QUADS), color)
+ matrixStack.popPose()
}
fun sharedVoxelSurface(blocks: Set<BlockPos>, color: Int) {
- val m = BlockPos.Mutable()
+ val m = BlockPos.MutableBlockPos()
val l = vertexConsumers.getBuffer(CustomRenderLayers.COLORED_QUADS)
blocks.forEach {
- matrixStack.push()
+ matrixStack.pushPose()
matrixStack.translate(it.x.toFloat(), it.y.toFloat(), it.z.toFloat())
- val p = matrixStack.peek().positionMatrix
+ val p = matrixStack.last().pose()
m.set(it)
if (m.setX(it.x + 1) !in blocks) {
buildFaceXP(p, l, color)
@@ -73,7 +73,7 @@ class RenderInWorldContext private constructor(
if (m.setZ(it.z - 1) !in blocks) {
buildFaceZN(p, l, color)
}
- matrixStack.pop()
+ matrixStack.popPose()
}
}
@@ -82,46 +82,46 @@ class RenderInWorldContext private constructor(
fun align(index: Int, count: Int): Float {
return when (this) {
- CENTER -> (index - count / 2F) * (1 + MC.font.fontHeight.toFloat())
- BOTTOM -> (index - count) * (1 + MC.font.fontHeight.toFloat())
- TOP -> (index) * (1 + MC.font.fontHeight.toFloat())
+ CENTER -> (index - count / 2F) * (1 + MC.font.lineHeight.toFloat())
+ BOTTOM -> (index - count) * (1 + MC.font.lineHeight.toFloat())
+ TOP -> (index) * (1 + MC.font.lineHeight.toFloat())
}
}
}
- fun waypoint(position: BlockPos, vararg label: Text) {
+ fun waypoint(position: BlockPos, vararg label: Component) {
text(
- position.toCenterPos(),
+ position.center,
*label,
- Text.literal("§e${FirmFormatters.formatDistance(MC.player?.pos?.distanceTo(position.toCenterPos()) ?: 42069.0)}"),
+ Component.literal("§e${FirmFormatters.formatDistance(MC.player?.position?.distanceTo(position.center) ?: 42069.0)}"),
background = 0xAA202020.toInt()
)
}
- fun withFacingThePlayer(position: Vec3d, block: FacingThePlayerContext.() -> Unit) {
- matrixStack.push()
+ fun withFacingThePlayer(position: Vec3, block: FacingThePlayerContext.() -> Unit) {
+ matrixStack.pushPose()
matrixStack.translate(position.x, position.y, position.z)
val actualCameraDistance = position.distanceTo(camera.pos)
val distanceToMoveTowardsCamera = if (actualCameraDistance < 10) 0.0 else -(actualCameraDistance - 10.0)
- val vec = position.subtract(camera.pos).multiply(distanceToMoveTowardsCamera / actualCameraDistance)
+ val vec = position.subtract(camera.pos).scale(distanceToMoveTowardsCamera / actualCameraDistance)
matrixStack.translate(vec.x, vec.y, vec.z)
- matrixStack.multiply(camera.orientation)
+ matrixStack.mulPose(camera.orientation)
matrixStack.scale(0.025F, -0.025F, 1F)
FacingThePlayerContext(this).run(block)
- matrixStack.pop()
- vertexConsumers.drawCurrentLayer()
+ matrixStack.popPose()
+ vertexConsumers.endLastBatch()
}
- fun sprite(position: Vec3d, sprite: Sprite, width: Int, height: Int) {
+ fun sprite(position: Vec3, sprite: TextureAtlasSprite, width: Int, height: Int) {
texture(
- position, sprite.atlasId, width, height, sprite.minU, sprite.minV, sprite.maxU, sprite.maxV
+ position, sprite.atlasLocation(), width, height, sprite.u0, sprite.v0, sprite.u1, sprite.v1
)
}
fun texture(
- position: Vec3d, texture: Identifier, width: Int, height: Int,
+ position: Vec3, texture: ResourceLocation, width: Int, height: Int,
u1: Float, v1: Float,
u2: Float, v2: Float,
) {
@@ -131,8 +131,8 @@ class RenderInWorldContext private constructor(
}
fun text(
- position: Vec3d,
- vararg texts: Text,
+ position: Vec3,
+ vararg texts: Component,
verticalAlign: VerticalAlign = VerticalAlign.CENTER,
background: Int = 0x70808080
) {
@@ -141,22 +141,22 @@ class RenderInWorldContext private constructor(
}
}
- fun tinyBlock(vec3d: Vec3d, size: Float, color: Int) {
- matrixStack.push()
+ fun tinyBlock(vec3d: Vec3, size: Float, color: Int) {
+ matrixStack.pushPose()
matrixStack.translate(vec3d.x, vec3d.y, vec3d.z)
matrixStack.scale(size, size, size)
matrixStack.translate(-.5, -.5, -.5)
- buildCube(matrixStack.peek().positionMatrix, vertexConsumers.getBuffer(CustomRenderLayers.COLORED_QUADS), color)
- matrixStack.pop()
- vertexConsumers.draw()
+ buildCube(matrixStack.last().pose(), vertexConsumers.getBuffer(CustomRenderLayers.COLORED_QUADS), color)
+ matrixStack.popPose()
+ vertexConsumers.endBatch()
}
fun wireframeCube(blockPos: BlockPos, lineWidth: Float = 10F) {
- val buf = vertexConsumers.getBuffer(RenderLayer.LINES)
- matrixStack.push()
+ val buf = vertexConsumers.getBuffer(RenderType.LINES)
+ matrixStack.pushPose()
// TODO: add color arg to this
// TODO: this does not render through blocks (or water layers) anymore
- RenderSystem.lineWidth(lineWidth / camera.pos.squaredDistanceTo(blockPos.toCenterPos()).pow(0.25).toFloat())
+ RenderSystem.lineWidth(lineWidth / camera.pos.distanceToSqr(blockPos.center).pow(0.25).toFloat())
val offset = 1 / 512F
matrixStack.translate(
blockPos.x.toFloat() - offset,
@@ -166,25 +166,25 @@ class RenderInWorldContext private constructor(
val scale = 1 + 2 * offset
matrixStack.scale(scale, scale, scale)
- buildWireFrameCube(matrixStack.peek(), buf)
- matrixStack.pop()
- vertexConsumers.draw()
+ buildWireFrameCube(matrixStack.last(), buf)
+ matrixStack.popPose()
+ vertexConsumers.endBatch()
}
- fun line(vararg points: Vec3d, color: Int, lineWidth: Float = 10F) {
+ fun line(vararg points: Vec3, color: Int, lineWidth: Float = 10F) {
line(points.toList(), color, lineWidth)
}
- fun tracer(toWhere: Vec3d, color: Int, lineWidth: Float = 3f) {
+ fun tracer(toWhere: Vec3, color: Int, lineWidth: Float = 3f) {
val cameraForward = Vector3f(0f, 0f, -1f).rotate(camera.orientation)
- line(camera.pos.add(Vec3d(cameraForward)), toWhere, color = color, lineWidth = lineWidth)
+ line(camera.pos.add(Vec3(cameraForward)), toWhere, color = color, lineWidth = lineWidth)
}
- fun line(points: List<Vec3d>, color: Int, lineWidth: Float = 10F) {
+ fun line(points: List<Vec3>, color: Int, lineWidth: Float = 10F) {
RenderSystem.lineWidth(lineWidth)
val buffer = vertexConsumers.getBuffer(CustomRenderLayers.LINES)
- val matrix = matrixStack.peek()
+ val matrix = matrixStack.last()
var lastNormal: Vector3f? = null
points.zipWithNext().forEach { (a, b) ->
val normal = Vector3f(b.x.toFloat(), b.y.toFloat(), b.z.toFloat())
@@ -192,13 +192,13 @@ class RenderInWorldContext private constructor(
.normalize()
val lastNormal0 = lastNormal ?: normal
lastNormal = normal
- buffer.vertex(matrix.positionMatrix, a.x.toFloat(), a.y.toFloat(), a.z.toFloat())
- .color(color)
- .normal(matrix, lastNormal0.x, lastNormal0.y, lastNormal0.z)
+ buffer.addVertex(matrix.pose(), a.x.toFloat(), a.y.toFloat(), a.z.toFloat())
+ .setColor(color)
+ .setNormal(matrix, lastNormal0.x, lastNormal0.y, lastNormal0.z)
- buffer.vertex(matrix.positionMatrix, b.x.toFloat(), b.y.toFloat(), b.z.toFloat())
- .color(color)
- .normal(matrix, normal.x, normal.y, normal.z)
+ buffer.addVertex(matrix.pose(), b.x.toFloat(), b.y.toFloat(), b.z.toFloat())
+ .setColor(color)
+ .setNormal(matrix, normal.x, normal.y, normal.z)
}
@@ -207,7 +207,7 @@ class RenderInWorldContext private constructor(
companion object {
private fun doLine(
- matrix: MatrixStack.Entry,
+ matrix: PoseStack.Pose,
buf: VertexConsumer,
i: Float,
j: Float,
@@ -219,18 +219,18 @@ class RenderInWorldContext private constructor(
val normal = Vector3f(x, y, z)
.sub(i, j, k)
.normalize()
- buf.vertex(matrix.positionMatrix, i, j, k)
- .normal(matrix, normal.x, normal.y, normal.z)
- .color(-1)
+ buf.addVertex(matrix.pose(), i, j, k)
+ .setNormal(matrix, normal.x, normal.y, normal.z)
+ .setColor(-1)
- buf.vertex(matrix.positionMatrix, x, y, z)
- .normal(matrix, normal.x, normal.y, normal.z)
- .color(-1)
+ buf.addVertex(matrix.pose(), x, y, z)
+ .setNormal(matrix, normal.x, normal.y, normal.z)
+ .setColor(-1)
}
- private fun buildWireFrameCube(matrix: MatrixStack.Entry, buf: VertexConsumer) {
+ private fun buildWireFrameCube(matrix: PoseStack.Pose, buf: VertexConsumer) {
for (i in 0..1) {
for (j in 0..1) {
val i = i.toFloat()
@@ -243,45 +243,45 @@ class RenderInWorldContext private constructor(
}
private fun buildFaceZP(matrix: Matrix4f, buf: VertexConsumer, rgba: Int) {
- buf.vertex(matrix, 0F, 0F, 1F).color(rgba)
- buf.vertex(matrix, 0F, 1F, 1F).color(rgba)
- buf.vertex(matrix, 1F, 1F, 1F).color(rgba)
- buf.vertex(matrix, 1F, 0F, 1F).color(rgba)
+ buf.addVertex(matrix, 0F, 0F, 1F).setColor(rgba)
+ buf.addVertex(matrix, 0F, 1F, 1F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 1F, 1F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 0F, 1F).setColor(rgba)
}
private fun buildFaceZN(matrix: Matrix4f, buf: VertexConsumer, rgba: Int) {
- buf.vertex(matrix, 0F, 0F, 0F).color(rgba)
- buf.vertex(matrix, 1F, 0F, 0F).color(rgba)
- buf.vertex(matrix, 1F, 1F, 0F).color(rgba)
- buf.vertex(matrix, 0F, 1F, 0F).color(rgba)
+ buf.addVertex(matrix, 0F, 0F, 0F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 0F, 0F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 1F, 0F).setColor(rgba)
+ buf.addVertex(matrix, 0F, 1F, 0F).setColor(rgba)
}
private fun buildFaceXP(matrix: Matrix4f, buf: VertexConsumer, rgba: Int) {
- buf.vertex(matrix, 1F, 0F, 0F).color(rgba)
- buf.vertex(matrix, 1F, 1F, 0F).color(rgba)
- buf.vertex(matrix, 1F, 1F, 1F).color(rgba)
- buf.vertex(matrix, 1F, 0F, 1F).color(rgba)
+ buf.addVertex(matrix, 1F, 0F, 0F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 1F, 0F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 1F, 1F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 0F, 1F).setColor(rgba)
}
private fun buildFaceXN(matrix: Matrix4f, buf: VertexConsumer, rgba: Int) {
- buf.vertex(matrix, 0F, 0F, 0F).color(rgba)
- buf.vertex(matrix, 0F, 0F, 1F).color(rgba)
- buf.vertex(matrix, 0F, 1F, 1F).color(rgba)
- buf.vertex(matrix, 0F, 1F, 0F).color(rgba)
+ buf.addVertex(matrix, 0F, 0F, 0F).setColor(rgba)
+ buf.addVertex(matrix, 0F, 0F, 1F).setColor(rgba)
+ buf.addVertex(matrix, 0F, 1F, 1F).setColor(rgba)
+ buf.addVertex(matrix, 0F, 1F, 0F).setColor(rgba)
}
private fun buildFaceYN(matrix: Matrix4f, buf: VertexConsumer, rgba: Int) {
- buf.vertex(matrix, 0F, 0F, 0F).color(rgba)
- buf.vertex(matrix, 0F, 0F, 1F).color(rgba)
- buf.vertex(matrix, 1F, 0F, 1F).color(rgba)
- buf.vertex(matrix, 1F, 0F, 0F).color(rgba)
+ buf.addVertex(matrix, 0F, 0F, 0F).setColor(rgba)
+ buf.addVertex(matrix, 0F, 0F, 1F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 0F, 1F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 0F, 0F).setColor(rgba)
}
private fun buildFaceYP(matrix: Matrix4f, buf: VertexConsumer, rgba: Int) {
- buf.vertex(matrix, 0F, 1F, 0F).color(rgba)
- buf.vertex(matrix, 1F, 1F, 0F).color(rgba)
- buf.vertex(matrix, 1F, 1F, 1F).color(rgba)
- buf.vertex(matrix, 0F, 1F, 1F).color(rgba)
+ buf.addVertex(matrix, 0F, 1F, 0F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 1F, 0F).setColor(rgba)
+ buf.addVertex(matrix, 1F, 1F, 1F).setColor(rgba)
+ buf.addVertex(matrix, 0F, 1F, 1F).setColor(rgba)
}
private fun buildCube(matrix4f: Matrix4f, buf: VertexConsumer, rgba: Int) {
@@ -295,7 +295,7 @@ class RenderInWorldContext private constructor(
fun renderInWorld(event: WorldRenderLastEvent, block: RenderInWorldContext. () -> Unit) {
- event.matrices.push()
+ event.matrices.pushPose()
event.matrices.translate(-event.camera.pos.x, -event.camera.pos.y, -event.camera.pos.z)
val ctx = RenderInWorldContext(
@@ -306,8 +306,8 @@ class RenderInWorldContext private constructor(
block(ctx)
- event.matrices.pop()
- event.vertexConsumers.draw()
+ event.matrices.popPose()
+ event.vertexConsumers.endBatch()
}
}
}
diff --git a/src/main/kotlin/util/render/TintedOverlayTexture.kt b/src/main/kotlin/util/render/TintedOverlayTexture.kt
index 0677846..6513574 100644
--- a/src/main/kotlin/util/render/TintedOverlayTexture.kt
+++ b/src/main/kotlin/util/render/TintedOverlayTexture.kt
@@ -1,8 +1,8 @@
package moe.nea.firmament.util.render
import me.shedaniel.math.Color
-import net.minecraft.client.render.OverlayTexture
-import net.minecraft.util.math.ColorHelper
+import net.minecraft.client.renderer.texture.OverlayTexture
+import net.minecraft.util.ARGB
import moe.nea.firmament.util.ErrorUtil
class TintedOverlayTexture : OverlayTexture() {
@@ -12,17 +12,17 @@ class TintedOverlayTexture : OverlayTexture() {
private var lastColor: Color? = null
fun setColor(color: Color): TintedOverlayTexture {
- val image = ErrorUtil.notNullOr(texture.image, "Disposed TintedOverlayTexture written to") { return this }
+ val image = ErrorUtil.notNullOr(texture.pixels, "Disposed TintedOverlayTexture written to") { return this }
if (color == lastColor) return this
lastColor = color
for (i in 0..<size) {
for (j in 0..<size) {
if (i < 8) {
- image.setColorArgb(j, i, 0xB2FF0000.toInt())
+ image.setPixel(j, i, 0xB2FF0000.toInt())
} else {
val k = ((1F - j / 15F * 0.75F) * 255F).toInt()
- image.setColorArgb(j, i, ColorHelper.withAlpha(k, color.color))
+ image.setPixel(j, i, ARGB.color(k, color.color))
}
}
}
diff --git a/src/main/kotlin/util/render/TranslatedScissors.kt b/src/main/kotlin/util/render/TranslatedScissors.kt
index ee90a2d..5c7e31d 100644
--- a/src/main/kotlin/util/render/TranslatedScissors.kt
+++ b/src/main/kotlin/util/render/TranslatedScissors.kt
@@ -2,14 +2,14 @@ package moe.nea.firmament.util.render
import org.joml.Matrix3x2f
import org.joml.Vector3f
-import net.minecraft.client.gui.DrawContext
+import net.minecraft.client.gui.GuiGraphics
-fun DrawContext.enableScissorWithTranslation(x1: Float, y1: Float, x2: Float, y2: Float) {
+fun GuiGraphics.enableScissorWithTranslation(x1: Float, y1: Float, x2: Float, y2: Float) {
enableScissor(x1.toInt(), y1.toInt(), x2.toInt(), y2.toInt())
}
-fun DrawContext.enableScissorWithoutTranslation(x1: Float, y1: Float, x2: Float, y2: Float) {
- val pMat = Matrix3x2f(matrices).invert()
+fun GuiGraphics.enableScissorWithoutTranslation(x1: Float, y1: Float, x2: Float, y2: Float) {
+ val pMat = Matrix3x2f(pose()).invert()
var target = Vector3f()
target.set(x1, y1, 1F)
diff --git a/src/main/kotlin/util/skyblock/AbilityUtils.kt b/src/main/kotlin/util/skyblock/AbilityUtils.kt
index 0d7d2b7..9ba182d 100644
--- a/src/main/kotlin/util/skyblock/AbilityUtils.kt
+++ b/src/main/kotlin/util/skyblock/AbilityUtils.kt
@@ -1,8 +1,8 @@
package moe.nea.firmament.util.skyblock
import kotlin.time.Duration
-import net.minecraft.item.ItemStack
-import net.minecraft.text.Text
+import net.minecraft.world.item.ItemStack
+import net.minecraft.network.chat.Component
import moe.nea.firmament.util.ErrorUtil
import moe.nea.firmament.util.directLiteralStringContent
import moe.nea.firmament.util.mc.loreAccordingToNbt
@@ -17,7 +17,7 @@ object AbilityUtils {
val hasPowerScroll: Boolean,
val activation: AbilityActivation,
val manaCost: Int?,
- val descriptionLines: List<Text>,
+ val descriptionLines: List<Component>,
val cooldown: Duration?,
)
@@ -40,7 +40,7 @@ object AbilityUtils {
}
private val abilityNameRegex = "Ability: (?<name>.*?) *".toPattern()
- private fun findAbility(iterator: ListIterator<Text>): ItemAbility? {
+ private fun findAbility(iterator: ListIterator<Component>): ItemAbility? {
if (!iterator.hasNext()) {
return null
}
@@ -72,7 +72,7 @@ object AbilityUtils {
return null
}
if (abilityName == null) return null
- val descriptionLines = mutableListOf<Text>()
+ val descriptionLines = mutableListOf<Component>()
var manaCost: Int? = null
var cooldown: Duration? = null
while (iterator.hasNext()) {
@@ -121,7 +121,7 @@ object AbilityUtils {
)
}
- fun getAbilities(lore: List<Text>): List<ItemAbility> {
+ fun getAbilities(lore: List<Component>): List<ItemAbility> {
val iterator = lore.listIterator()
val abilities = mutableListOf<ItemAbility>()
while (iterator.hasNext()) {
diff --git a/src/main/kotlin/util/skyblock/ItemType.kt b/src/main/kotlin/util/skyblock/ItemType.kt
index 9045646..887edef 100644
--- a/src/main/kotlin/util/skyblock/ItemType.kt
+++ b/src/main/kotlin/util/skyblock/ItemType.kt
@@ -1,6 +1,6 @@
package moe.nea.firmament.util.skyblock
-import net.minecraft.item.ItemStack
+import net.minecraft.world.item.ItemStack
import moe.nea.firmament.util.directLiteralStringContent
import moe.nea.firmament.util.mc.loreAccordingToNbt
import moe.nea.firmament.util.petData
diff --git a/src/main/kotlin/util/skyblock/PartyUtil.kt b/src/main/kotlin/util/skyblock/PartyUtil.kt
index 7d28868..46e1aa3 100644
--- a/src/main/kotlin/util/skyblock/PartyUtil.kt
+++ b/src/main/kotlin/util/skyblock/PartyUtil.kt
@@ -7,7 +7,7 @@ import net.hypixel.modapi.packet.impl.clientbound.ClientboundPartyInfoPacket.Par
import net.hypixel.modapi.packet.impl.serverbound.ServerboundPartyInfoPacket
import org.intellij.lang.annotations.Language
import kotlinx.coroutines.launch
-import net.minecraft.text.Text
+import net.minecraft.network.chat.Component
import moe.nea.firmament.Firmament
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.apis.Routes
@@ -53,7 +53,7 @@ object PartyUtil {
}
thenExecute {
val p = party
- val text = Text.empty()
+ val text = Component.empty()
text.append(
tr("firmament.dev.partyinfo", "Party Info: ")
.boolColour(p != null)
@@ -64,7 +64,7 @@ object PartyUtil {
text.append(tr("firmament.dev.partyinfo.count", "${p.members.size} members").grey())
p.members.forEach {
text.append("\n")
- .append(Text.literal(" - ${it.name}"))
+ .append(Component.literal(" - ${it.name}"))
.append(" (")
.append(
when (it.role) {
diff --git a/src/main/kotlin/util/skyblock/Rarity.kt b/src/main/kotlin/util/skyblock/Rarity.kt
index 2507256..95e5d87 100644
--- a/src/main/kotlin/util/skyblock/Rarity.kt
+++ b/src/main/kotlin/util/skyblock/Rarity.kt
@@ -7,10 +7,10 @@ import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
-import net.minecraft.item.ItemStack
-import net.minecraft.text.Style
-import net.minecraft.text.Text
-import net.minecraft.util.Formatting
+import net.minecraft.world.item.ItemStack
+import net.minecraft.network.chat.Style
+import net.minecraft.network.chat.Component
+import net.minecraft.ChatFormatting
import moe.nea.firmament.util.StringUtil.words
import moe.nea.firmament.util.collections.lastNotNullOfOrNull
import moe.nea.firmament.util.mc.loreAccordingToNbt
@@ -49,23 +49,23 @@ enum class Rarity(vararg altNames: String) {
}
val names = setOf(name) + altNames
- val text: Text get() = Text.literal(name).setStyle(Style.EMPTY.withColor(colourMap[this]))
+ val text: Component get() = Component.literal(name).setStyle(Style.EMPTY.withColor(colourMap[this]))
val neuRepoRarity: RepoRarity? = RepoRarity.entries.find { it.name == name }
companion object {
// TODO: inline those formattings as fields
val colourMap = mapOf(
- Rarity.COMMON to Formatting.WHITE,
- Rarity.UNCOMMON to Formatting.GREEN,
- Rarity.RARE to Formatting.BLUE,
- Rarity.EPIC to Formatting.DARK_PURPLE,
- Rarity.LEGENDARY to Formatting.GOLD,
- Rarity.MYTHIC to Formatting.LIGHT_PURPLE,
- Rarity.DIVINE to Formatting.AQUA,
- Rarity.SPECIAL to Formatting.RED,
- Rarity.VERY_SPECIAL to Formatting.RED,
- Rarity.SUPREME to Formatting.DARK_RED,
- Rarity.ULTIMATE to Formatting.DARK_RED,
+ Rarity.COMMON to ChatFormatting.WHITE,
+ Rarity.UNCOMMON to ChatFormatting.GREEN,
+ Rarity.RARE to ChatFormatting.BLUE,
+ Rarity.EPIC to ChatFormatting.DARK_PURPLE,
+ Rarity.LEGENDARY to ChatFormatting.GOLD,
+ Rarity.MYTHIC to ChatFormatting.LIGHT_PURPLE,
+ Rarity.DIVINE to ChatFormatting.AQUA,
+ Rarity.SPECIAL to ChatFormatting.RED,
+ Rarity.VERY_SPECIAL to ChatFormatting.RED,
+ Rarity.SUPREME to ChatFormatting.DARK_RED,
+ Rarity.ULTIMATE to ChatFormatting.DARK_RED,
)
val byName = entries.flatMap { en -> en.names.map { it to en } }.toMap()
val fromNeuRepo = entries.associateBy { it.neuRepoRarity }
@@ -89,7 +89,7 @@ enum class Rarity(vararg altNames: String) {
fun fromPetItem(itemStack: ItemStack): Rarity? =
itemStack.petData?.tier?.let(::fromNeuRepo)
- fun fromLore(lore: List<Text>): Rarity? =
+ fun fromLore(lore: List<Component>): Rarity? =
lore.lastNotNullOfOrNull {
it.unformattedString.words()
.firstNotNullOfOrNull(::fromString)
diff --git a/src/main/kotlin/util/skyblock/SBItemUtil.kt b/src/main/kotlin/util/skyblock/SBItemUtil.kt
index 3901b60..619a10b 100644
--- a/src/main/kotlin/util/skyblock/SBItemUtil.kt
+++ b/src/main/kotlin/util/skyblock/SBItemUtil.kt
@@ -1,12 +1,12 @@
package moe.nea.firmament.util.skyblock
-import net.minecraft.item.ItemStack
+import net.minecraft.world.item.ItemStack
import moe.nea.firmament.util.mc.loreAccordingToNbt
import moe.nea.firmament.util.unformattedString
object SBItemUtil {
fun ItemStack.getSearchName(): String {
- val name = this.name.unformattedString
+ val name = this.hoverName.unformattedString
if (name.contains("Enchanted Book")) {
val enchant = loreAccordingToNbt.firstOrNull()?.unformattedString
if (enchant != null) return enchant
diff --git a/src/main/kotlin/util/skyblock/SackUtil.kt b/src/main/kotlin/util/skyblock/SackUtil.kt
index af03363..a69309b 100644
--- a/src/main/kotlin/util/skyblock/SackUtil.kt
+++ b/src/main/kotlin/util/skyblock/SackUtil.kt
@@ -2,9 +2,9 @@ package moe.nea.firmament.util.skyblock
import kotlinx.serialization.Serializable
import kotlinx.serialization.serializer
-import net.minecraft.client.gui.screen.ingame.GenericContainerScreen
-import net.minecraft.text.HoverEvent
-import net.minecraft.text.Text
+import net.minecraft.client.gui.screens.inventory.ContainerScreen
+import net.minecraft.network.chat.HoverEvent
+import net.minecraft.network.chat.Component
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.events.ChestInventoryUpdateEvent
import moe.nea.firmament.events.ProcessChatEvent
@@ -46,11 +46,11 @@ object SackUtil {
@Subscribe
fun storeDataFromInventory(event: ChestInventoryUpdateEvent) {
- val screen = event.inventory as? GenericContainerScreen ?: return
+ val screen = event.inventory as? ContainerScreen ?: return
if (!screen.title.unformattedString.endsWith(" Sack")) return
- val inv = screen.screenHandler?.inventory ?: return
- if (inv.size() < 18) return
- val backSlot = inv.getStack(inv.size() - 5)
+ val inv = screen.menu?.container ?: return
+ if (inv.containerSize < 18) return
+ val backSlot = inv.getItem(inv.containerSize - 5)
if (backSlot.displayNameAccordingToNbt.unformattedString != "Go Back") return
if (backSlot.loreAccordingToNbt.map { it.unformattedString } != listOf("To Sack of Sacks")) return
for (itemStack in inv.iterableView) {
@@ -74,7 +74,7 @@ object SackUtil {
getUpdatesFromMessage(event.text)
}
- fun getUpdatesFromMessage(text: Text): List<SackUpdate> {
+ fun getUpdatesFromMessage(text: Component): List<SackUpdate> {
val update = ChatUpdate()
text.siblings.forEach(update::updateFromHoverText)
return update.updates
@@ -102,7 +102,7 @@ object SackUtil {
}
}
- fun updateFromHoverText(text: Text) {
+ fun updateFromHoverText(text: Component) {
text.siblings.forEach(::updateFromHoverText)
val hoverText = (text.style.hoverEvent as? HoverEvent.ShowText)?.value ?: return
val cleanedText = hoverText.unformattedString
diff --git a/src/main/kotlin/util/skyblock/ScreenIdentification.kt b/src/main/kotlin/util/skyblock/ScreenIdentification.kt
index 0e7797c..ff725fa 100644
--- a/src/main/kotlin/util/skyblock/ScreenIdentification.kt
+++ b/src/main/kotlin/util/skyblock/ScreenIdentification.kt
@@ -1,7 +1,7 @@
package moe.nea.firmament.util.skyblock
-import net.minecraft.client.gui.screen.Screen
-import net.minecraft.client.gui.screen.ingame.GenericContainerScreen
+import net.minecraft.client.gui.screens.Screen
+import net.minecraft.client.gui.screens.inventory.ContainerScreen
import moe.nea.firmament.util.mc.displayNameAccordingToNbt
import moe.nea.firmament.util.mc.loreAccordingToNbt
import moe.nea.firmament.util.unformattedString
@@ -24,13 +24,13 @@ object ScreenIdentification {
enum class ScreenType(val detector: (Screen) -> Boolean) {
BAZAAR_ANY({
- it is GenericContainerScreen && (
- it.screenHandler.getSlot(it.screenHandler.rows * 9 - 4)
- .stack
+ it is ContainerScreen && (
+ it.menu.getSlot(it.menu.rowCount * 9 - 4)
+ .item
.displayNameAccordingToNbt
.unformattedString == "Manage Orders"
- || it.screenHandler.getSlot(it.screenHandler.rows * 9 - 5)
- .stack
+ || it.menu.getSlot(it.menu.rowCount * 9 - 5)
+ .item
.loreAccordingToNbt
.any {
it.unformattedString == "To Bazaar"
diff --git a/src/main/kotlin/util/skyblock/TabListAPI.kt b/src/main/kotlin/util/skyblock/TabListAPI.kt
index 6b937da..43722e0 100644
--- a/src/main/kotlin/util/skyblock/TabListAPI.kt
+++ b/src/main/kotlin/util/skyblock/TabListAPI.kt
@@ -1,7 +1,7 @@
package moe.nea.firmament.util.skyblock
import org.intellij.lang.annotations.Language
-import net.minecraft.text.Text
+import net.minecraft.network.chat.Component
import moe.nea.firmament.util.StringUtil.title
import moe.nea.firmament.util.StringUtil.unwords
import moe.nea.firmament.util.mc.MCTabListAPI
@@ -9,7 +9,7 @@ import moe.nea.firmament.util.unformattedString
object TabListAPI {
- fun getWidgetLines(widgetName: WidgetName, includeTitle: Boolean = false, from: MCTabListAPI.CurrentTabList = MCTabListAPI.currentTabList): List<Text> {
+ fun getWidgetLines(widgetName: WidgetName, includeTitle: Boolean = false, from: MCTabListAPI.CurrentTabList = MCTabListAPI.currentTabList): List<Component> {
return from.body
.dropWhile { !widgetName.matchesTitle(it) }
.takeWhile { it.string.isNotBlank() && !it.string.startsWith(" ") }
@@ -25,7 +25,7 @@ object TabListAPI {
PET
;
- fun matchesTitle(it: Text): Boolean {
+ fun matchesTitle(it: Component): Boolean {
return regex.matches(it.unformattedString)
}
diff --git a/src/main/kotlin/util/textutil.kt b/src/main/kotlin/util/textutil.kt
index f7c7d1c..d8b2592 100644
--- a/src/main/kotlin/util/textutil.kt
+++ b/src/main/kotlin/util/textutil.kt
@@ -1,17 +1,17 @@
package moe.nea.firmament.util
import java.util.Optional
-import net.minecraft.text.ClickEvent
-import net.minecraft.text.HoverEvent
-import net.minecraft.text.MutableText
-import net.minecraft.text.OrderedText
-import net.minecraft.text.PlainTextContent
-import net.minecraft.text.StringVisitable
-import net.minecraft.text.Style
-import net.minecraft.text.Text
-import net.minecraft.text.TextColor
-import net.minecraft.text.TranslatableTextContent
-import net.minecraft.util.Formatting
+import net.minecraft.network.chat.ClickEvent
+import net.minecraft.network.chat.HoverEvent
+import net.minecraft.network.chat.MutableComponent
+import net.minecraft.util.FormattedCharSequence
+import net.minecraft.network.chat.contents.PlainTextContents
+import net.minecraft.network.chat.FormattedText
+import net.minecraft.network.chat.Style
+import net.minecraft.network.chat.Component
+import net.minecraft.network.chat.TextColor
+import net.minecraft.network.chat.contents.TranslatableContents
+import net.minecraft.ChatFormatting
val formattingChars = "kmolnrKMOLNR".toSet()
@@ -36,15 +36,15 @@ fun CharSequence.removeColorCodes(keepNonColorCodes: Boolean = false): String {
return stringBuffer.toString()
}
-fun OrderedText.reconstitute(): MutableText {
- val base = Text.literal("")
+fun FormattedCharSequence.reconstitute(): MutableComponent {
+ val base = Component.literal("")
base.setStyle(Style.EMPTY.withItalic(false))
var lastColorCode = Style.EMPTY
val text = StringBuilder()
this.accept { index, style, codePoint ->
if (style != lastColorCode) {
if (text.isNotEmpty())
- base.append(Text.literal(text.toString()).setStyle(lastColorCode))
+ base.append(Component.literal(text.toString()).setStyle(lastColorCode))
lastColorCode = style
text.clear()
}
@@ -52,20 +52,20 @@ fun OrderedText.reconstitute(): MutableText {
true
}
if (text.isNotEmpty())
- base.append(Text.literal(text.toString()).setStyle(lastColorCode))
+ base.append(Component.literal(text.toString()).setStyle(lastColorCode))
return base
}
-fun StringVisitable.reconstitute(): MutableText {
- val base = Text.literal("")
+fun FormattedText.reconstitute(): MutableComponent {
+ val base = Component.literal("")
base.setStyle(Style.EMPTY.withItalic(false))
var lastColorCode = Style.EMPTY
val text = StringBuilder()
this.visit({ style, string ->
if (style != lastColorCode) {
if (text.isNotEmpty())
- base.append(Text.literal(text.toString()).setStyle(lastColorCode))
+ base.append(Component.literal(text.toString()).setStyle(lastColorCode))
lastColorCode = style
text.clear()
}
@@ -73,17 +73,17 @@ fun StringVisitable.reconstitute(): MutableText {
Optional.empty<Unit>()
}, Style.EMPTY)
if (text.isNotEmpty())
- base.append(Text.literal(text.toString()).setStyle(lastColorCode))
+ base.append(Component.literal(text.toString()).setStyle(lastColorCode))
return base
}
-val Text.unformattedString: String
+val Component.unformattedString: String
get() = string.removeColorCodes() // TODO: maybe shortcircuit this with .visit
-val Text.directLiteralStringContent: String? get() = (this.content as? PlainTextContent)?.string()
+val Component.directLiteralStringContent: String? get() = (this.contents as? PlainTextContents)?.text()
-fun Text.getLegacyFormatString(trimmed: Boolean = false): String =
+fun Component.getLegacyFormatString(trimmed: Boolean = false): String =
run {
var lastCode = "§r"
val sb = StringBuilder()
@@ -126,65 +126,65 @@ fun Text.getLegacyFormatString(trimmed: Boolean = false): String =
it
}
-private val textColorLUT = Formatting.entries
- .mapNotNull { formatting -> formatting.colorValue?.let { it to formatting } }
+private val textColorLUT = ChatFormatting.entries
+ .mapNotNull { formatting -> formatting.color?.let { it to formatting } }
.toMap()
-fun TextColor.toChatFormatting(): Formatting? {
- return textColorLUT[this.rgb]
+fun TextColor.toChatFormatting(): ChatFormatting? {
+ return textColorLUT[this.value]
}
-fun Text.iterator(): Sequence<Text> {
+fun Component.iterator(): Sequence<Component> {
return sequenceOf(this) + siblings.asSequence()
.flatMap { it.iterator() } // TODO: in theory we want to properly inherit styles here
}
-fun Text.allSiblings(): List<Text> = listOf(this) + siblings.flatMap { it.allSiblings() }
+fun Component.allSiblings(): List<Component> = listOf(this) + siblings.flatMap { it.allSiblings() }
-fun MutableText.withColor(formatting: Formatting): MutableText = this.styled {
+fun MutableComponent.withColor(formatting: ChatFormatting): MutableComponent = this.withStyle {
it.withColor(formatting)
.withItalic(false)
.withBold(false)
}
-fun MutableText.blue() = withColor(Formatting.BLUE)
-fun MutableText.aqua() = withColor(Formatting.AQUA)
-fun MutableText.lime() = withColor(Formatting.GREEN)
-fun MutableText.darkGreen() = withColor(Formatting.DARK_GREEN)
-fun MutableText.purple() = withColor(Formatting.DARK_PURPLE)
-fun MutableText.pink() = withColor(Formatting.LIGHT_PURPLE)
-fun MutableText.yellow() = withColor(Formatting.YELLOW)
-fun MutableText.gold() = withColor(Formatting.GOLD)
-fun MutableText.grey() = withColor(Formatting.GRAY)
-fun MutableText.darkGrey() = withColor(Formatting.DARK_GRAY)
-fun MutableText.red() = withColor(Formatting.RED)
-fun MutableText.white() = withColor(Formatting.WHITE)
-fun MutableText.bold(): MutableText = styled { it.withBold(true) }
-fun MutableText.hover(text: Text): MutableText = styled { it.withHoverEvent(HoverEvent.ShowText(text)) }
-fun MutableText.boolColour(
- bool: Boolean,
- ifTrue: Formatting = Formatting.GREEN,
- ifFalse: Formatting = Formatting.DARK_RED
+fun MutableComponent.blue() = withColor(ChatFormatting.BLUE)
+fun MutableComponent.aqua() = withColor(ChatFormatting.AQUA)
+fun MutableComponent.lime() = withColor(ChatFormatting.GREEN)
+fun MutableComponent.darkGreen() = withColor(ChatFormatting.DARK_GREEN)
+fun MutableComponent.purple() = withColor(ChatFormatting.DARK_PURPLE)
+fun MutableComponent.pink() = withColor(ChatFormatting.LIGHT_PURPLE)
+fun MutableComponent.yellow() = withColor(ChatFormatting.YELLOW)
+fun MutableComponent.gold() = withColor(ChatFormatting.GOLD)
+fun MutableComponent.grey() = withColor(ChatFormatting.GRAY)
+fun MutableComponent.darkGrey() = withColor(ChatFormatting.DARK_GRAY)
+fun MutableComponent.red() = withColor(ChatFormatting.RED)
+fun MutableComponent.white() = withColor(ChatFormatting.WHITE)
+fun MutableComponent.bold(): MutableComponent = withStyle { it.withBold(true) }
+fun MutableComponent.hover(text: Component): MutableComponent = withStyle { it.withHoverEvent(HoverEvent.ShowText(text)) }
+fun MutableComponent.boolColour(
+ bool: Boolean,
+ ifTrue: ChatFormatting = ChatFormatting.GREEN,
+ ifFalse: ChatFormatting = ChatFormatting.DARK_RED
) =
if (bool) withColor(ifTrue) else withColor(ifFalse)
-fun MutableText.clickCommand(command: String): MutableText {
+fun MutableComponent.clickCommand(command: String): MutableComponent {
require(command.startsWith("/"))
- return this.styled {
+ return this.withStyle {
it.withClickEvent(ClickEvent.RunCommand(command))
}
}
-fun MutableText.prepend(text: Text): MutableText {
+fun MutableComponent.prepend(text: Component): MutableComponent {
siblings.addFirst(text)
return this
}
-fun Text.transformEachRecursively(function: (Text) -> Text): Text {
- val c = this.content
- if (c is TranslatableTextContent) {
- return Text.translatableWithFallback(c.key, c.fallback, *c.args.map {
- (it as? Text ?: Text.literal(it.toString())).transformEachRecursively(function)
+fun Component.transformEachRecursively(function: (Component) -> Component): Component {
+ val c = this.contents
+ if (c is TranslatableContents) {
+ return Component.translatableWithFallback(c.key, c.fallback, *c.args.map {
+ (it as? Component ?: Component.literal(it.toString())).transformEachRecursively(function)
}.toTypedArray()).also { new ->
new.style = this.style
new.siblings.clear()
@@ -201,8 +201,8 @@ fun Text.transformEachRecursively(function: (Text) -> Text): Text {
}
}
-fun tr(key: String, default: String): MutableText = error("Compiler plugin did not run.")
-fun trResolved(key: String, vararg args: Any): MutableText = Text.stringifiedTranslatable(key, *args)
+fun tr(key: String, default: String): MutableComponent = error("Compiler plugin did not run.")
+fun trResolved(key: String, vararg args: Any): MutableComponent = Component.translatableEscape(key, *args)
fun titleCase(str: String): String {
return str
.lowercase()