Bump to 1.20.4

This commit is contained in:
Linnea Gräf
2024-01-21 14:06:34 +01:00
parent 18ebd21cb0
commit 3e1f75e322
11 changed files with 47 additions and 39 deletions

View File

@@ -21,6 +21,7 @@ import net.minecraft.nbt.NbtIo
import net.minecraft.nbt.NbtList
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import net.minecraft.nbt.NbtSizeTracker
@Serializable(with = VirtualInventory.Serializer::class)
data class VirtualInventory(
@@ -41,7 +42,7 @@ data class VirtualInventory(
override fun deserialize(decoder: Decoder): VirtualInventory {
val s = decoder.decodeString()
val n = NbtIo.readCompressed(ByteArrayInputStream(s.decodeBase64Bytes()))
val n = NbtIo.readCompressed(ByteArrayInputStream(s.decodeBase64Bytes()), NbtSizeTracker.of(100_000_000))
val items = n.getList(INVENTORY, NbtCompound.COMPOUND_TYPE.toInt())
return VirtualInventory(items.map { ItemStack.fromNbt(it as NbtCompound) })
}

View File

@@ -20,6 +20,7 @@ import moe.nea.firmament.events.TickEvent
import moe.nea.firmament.features.FirmamentFeature
import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.util.IdentityCharacteristics
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.item.decodeProfileTextureProperty
import moe.nea.firmament.util.skyBlockId
@@ -53,10 +54,9 @@ object CustomSkyBlockTextures : FirmamentFeature {
private val skullTextureCache = mutableMapOf<IdentityCharacteristics<GameProfile>, Any>()
private val sentinelPresentInvalid = Object()
val mcUrlRegex = "https?://textures.minecraft.net/texture/([a-fA-F0-9]+)".toRegex()
private val mcUrlRegex = "https?://textures.minecraft.net/texture/([a-fA-F0-9]+)".toRegex()
fun getSkullId(profile: GameProfile): String? {
val textures = profile.properties.get(PlayerSkinProvider.TEXTURES)
val textureProperty = textures.singleOrNull() ?: return null
val textureProperty = MC.instance.sessionService.getPackedTextures(profile) ?: return null
val texture = decodeProfileTextureProperty(textureProperty) ?: return null
val textureUrl =
texture.textures[MinecraftProfileTexture.Type.SKIN]?.url ?: return null

View File

@@ -116,8 +116,8 @@ object ItemCache : IReloadable {
lore.forEach {
newLore.add(
NbtString.of(
Text.Serializer.toJson(
Text.Serializer.fromJson(it.asString())!!.applyLoreReplacements(loreReplacements)
Text.Serialization.toJsonString(
Text.Serialization.fromJson(it.asString())!!.applyLoreReplacements(loreReplacements)
)
)
)

View File

@@ -17,17 +17,17 @@ fun ItemStack.appendLore(args: List<Text>) {
val compoundTag = getOrCreateSubNbt("display")
val loreList = compoundTag.getOrCreateList("Lore", NbtString.STRING_TYPE)
for (arg in args) {
loreList.add(NbtString.of(Text.Serializer.toJson(arg)))
loreList.add(NbtString.of(Text.Serialization.toJsonString(arg)))
}
}
fun ItemStack.modifyLore(update: (List<Text>) -> List<Text>) {
val compoundTag = getOrCreateSubNbt("display")
val loreList = compoundTag.getOrCreateList("Lore", NbtString.STRING_TYPE)
val parsed = loreList.map { Text.Serializer.fromJson(it.asString())!! }
val parsed = loreList.map { Text.Serialization.fromJson(it.asString())!! }
val updated = update(parsed)
loreList.clear()
loreList.addAll(updated.map { NbtString.of(Text.Serializer.toJson(it)) })
loreList.addAll(updated.map { NbtString.of(Text.Serialization.toJsonString(it)) })
}

View File

@@ -6,7 +6,8 @@
package moe.nea.firmament.util
import java.util.Optional
import java.util.*
import net.minecraft.client.gui.hud.InGameHud
import net.minecraft.scoreboard.ScoreboardDisplaySlot
import net.minecraft.scoreboard.Team
import net.minecraft.text.StringVisitable
@@ -17,10 +18,14 @@ import net.minecraft.util.Formatting
fun getScoreboardLines(): List<Text> {
val scoreboard = MC.player?.scoreboard ?: return listOf()
val activeObjective = scoreboard.getObjectiveForSlot(ScoreboardDisplaySlot.SIDEBAR) ?: return listOf()
return scoreboard.getAllPlayerScores(activeObjective).reversed().take(15).map {
val team = scoreboard.getPlayerTeam(it.playerName)
Team.decorateName(team, Text.literal(it.playerName))
}
return scoreboard.getScoreboardEntries(activeObjective)
.filter { !it.hidden() }
.sortedWith(InGameHud.SCOREBOARD_ENTRY_COMPARATOR)
.take(15).map {
val team = scoreboard.getScoreHolderTeam(it.owner)
val text = it.name()
Team.decorateName(team, text)
}
}

View File

@@ -17,12 +17,12 @@ fun textFromNbt() {
val ItemStack.loreAccordingToNbt
get() = getOrCreateSubNbt(ItemStack.DISPLAY_KEY).getList(ItemStack.LORE_KEY, NbtElement.STRING_TYPE.toInt())
.map { lazy(LazyThreadSafetyMode.NONE) { Text.Serializer.fromJson((it as NbtString).asString()) } }
.map { lazy(LazyThreadSafetyMode.NONE) { Text.Serialization.fromJson((it as NbtString).asString()) } }
val ItemStack.displayNameAccordingToNbt
get() = getOrCreateSubNbt(ItemStack.DISPLAY_KEY).let {
if (it.contains(ItemStack.NAME_KEY, NbtElement.STRING_TYPE.toInt()))
Text.Serializer.fromJson(it.getString(ItemStack.NAME_KEY))
Text.Serialization.fromJson(it.getString(ItemStack.NAME_KEY))
else
null
}

View File

@@ -42,11 +42,13 @@ data class MinecraftTexturesPayloadKt(
fun GameProfile.setTextures(textures: MinecraftTexturesPayloadKt) {
val json = Firmament.json.encodeToString(textures)
val encoded = java.util.Base64.getEncoder().encodeToString(json.encodeToByteArray())
properties.put(PlayerSkinProvider.TEXTURES, Property(PlayerSkinProvider.TEXTURES, encoded))
properties.put(propertyTextures, Property(propertyTextures, encoded))
}
private val propertyTextures = "textures"
fun decodeProfileTextureProperty(property: Property): MinecraftTexturesPayloadKt? {
assertTrueOr(property.name == PlayerSkinProvider.TEXTURES) { return null }
assertTrueOr(property.name == propertyTextures) { return null }
return try {
var encodedF: String = property.value
while (encodedF.length % 4 != 0 && encodedF.last() == '=') {

View File

@@ -6,9 +6,8 @@
package moe.nea.firmament.util
import net.minecraft.text.LiteralTextContent
import net.minecraft.text.PlainTextContent
import net.minecraft.text.Text
import net.minecraft.text.TextContent
import net.minecraft.text.TranslatableTextContent
import moe.nea.firmament.Firmament
@@ -33,8 +32,7 @@ class TextMatcher(text: Text) {
state.offset = 0
state.currentText = firstOrNull
state.textContent = when (val content = firstOrNull.content) {
is LiteralTextContent -> content.string
TextContent.EMPTY -> ""
is PlainTextContent.Literal -> content.string
else -> {
Firmament.logger.warn("TextContent of type ${content.javaClass} not understood.")
return false