diff options
Diffstat (limited to 'src/main/kotlin/util')
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() |
