write/read json -> write/read binary json

This commit is contained in:
DBotThePony 2023-07-26 01:11:46 +07:00
parent 48fe9ada79
commit 662801df7d
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 30 additions and 40 deletions

View File

@ -11,10 +11,8 @@ import net.minecraft.resources.ResourceLocation
import net.minecraft.server.packs.resources.ResourceManager import net.minecraft.server.packs.resources.ResourceManager
import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener
import net.minecraft.util.profiling.ProfilerFiller import net.minecraft.util.profiling.ProfilerFiller
import net.minecraftforge.common.MinecraftForge
import net.minecraftforge.event.AddReloadListenerEvent import net.minecraftforge.event.AddReloadListenerEvent
import net.minecraftforge.event.OnDatapackSyncEvent import net.minecraftforge.event.OnDatapackSyncEvent
import net.minecraftforge.eventbus.api.Event
import net.minecraftforge.network.NetworkEvent import net.minecraftforge.network.NetworkEvent
import net.minecraftforge.network.PacketDistributor import net.minecraftforge.network.PacketDistributor
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
@ -26,10 +24,7 @@ import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.core.fromJsonStrict import ru.dbotthepony.mc.otm.core.fromJsonStrict
import ru.dbotthepony.mc.otm.core.fromNetwork import ru.dbotthepony.mc.otm.core.fromNetwork
import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.set
import ru.dbotthepony.mc.otm.core.toJsonStrict
import ru.dbotthepony.mc.otm.core.toNetwork import ru.dbotthepony.mc.otm.core.toNetwork
import ru.dbotthepony.mc.otm.core.util.readJson
import ru.dbotthepony.mc.otm.matter.MatterManager
import ru.dbotthepony.mc.otm.network.MatteryPacket import ru.dbotthepony.mc.otm.network.MatteryPacket
import ru.dbotthepony.mc.otm.network.RegistryNetworkChannel import ru.dbotthepony.mc.otm.network.RegistryNetworkChannel
import ru.dbotthepony.mc.otm.network.enqueueWork import ru.dbotthepony.mc.otm.network.enqueueWork

View File

@ -4,7 +4,6 @@ import com.google.gson.JsonElement
import com.google.gson.JsonSyntaxException import com.google.gson.JsonSyntaxException
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.JsonOps import com.mojang.serialization.JsonOps
import net.minecraft.core.BlockPos
import net.minecraft.core.Holder import net.minecraft.core.Holder
import net.minecraft.core.RegistryAccess import net.minecraft.core.RegistryAccess
import net.minecraft.core.registries.Registries import net.minecraft.core.registries.Registries
@ -23,11 +22,10 @@ import net.minecraft.world.damagesource.DamageType
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraft.world.level.material.Fluid import net.minecraft.world.level.material.Fluid
import net.minecraft.world.phys.Vec3
import net.minecraftforge.registries.ForgeRegistries import net.minecraftforge.registries.ForgeRegistries
import net.minecraftforge.registries.IForgeRegistry import net.minecraftforge.registries.IForgeRegistry
import ru.dbotthepony.mc.otm.core.util.readJson import ru.dbotthepony.mc.otm.core.util.readBinaryJson
import ru.dbotthepony.mc.otm.core.util.writeJson import ru.dbotthepony.mc.otm.core.util.writeBinaryJson
// because doing it inline is ugly // because doing it inline is ugly
fun <V : Any> Codec<V>.fromJson(value: JsonElement): V? { fun <V : Any> Codec<V>.fromJson(value: JsonElement): V? {
@ -63,11 +61,11 @@ fun <V : Any> Codec<V>.toNbtStrict(value: V, prefix: Tag = NbtOps.INSTANCE.empty
} }
fun <V : Any> Codec<V>.toNetwork(buff: FriendlyByteBuf, value: V) { fun <V : Any> Codec<V>.toNetwork(buff: FriendlyByteBuf, value: V) {
buff.writeJson(toJsonStrict(value)) buff.writeBinaryJson(toJsonStrict(value))
} }
fun <V : Any> Codec<V>.fromNetwork(buff: FriendlyByteBuf): V { fun <V : Any> Codec<V>.fromNetwork(buff: FriendlyByteBuf): V {
return fromJsonStrict(buff.readJson()) return fromJsonStrict(buff.readBinaryJson())
} }
// 1.19 being 1.19 // 1.19 being 1.19

View File

@ -20,8 +20,8 @@ import net.minecraft.nbt.ShortTag
import net.minecraft.nbt.StringTag import net.minecraft.nbt.StringTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.Tag
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import ru.dbotthepony.mc.otm.core.util.readJson import ru.dbotthepony.mc.otm.core.util.readBinaryJson
import ru.dbotthepony.mc.otm.core.util.writeJson import ru.dbotthepony.mc.otm.core.util.writeBinaryJson
import java.util.UUID import java.util.UUID
operator fun CompoundTag.set(index: String, value: Tag) = put(index, value) operator fun CompoundTag.set(index: String, value: Tag) = put(index, value)
@ -108,7 +108,7 @@ fun CompoundTag.getUUIDSafe(key: String): UUID? {
fun CompoundTag.putJson(key: String, json: JsonElement) { fun CompoundTag.putJson(key: String, json: JsonElement) {
val bytes = FastByteArrayOutputStream() val bytes = FastByteArrayOutputStream()
bytes.writeJson(json) bytes.writeBinaryJson(json)
putByteArray(key, bytes.array.copyOfRange(0, bytes.length)) putByteArray(key, bytes.array.copyOfRange(0, bytes.length))
} }
@ -118,7 +118,7 @@ fun CompoundTag.getJson(key: String, sizeLimit: NbtAccounter = NbtAccounter.UNLI
if (bytes.isEmpty()) if (bytes.isEmpty())
return null return null
return FastByteArrayInputStream(bytes).readJson(sizeLimit) return FastByteArrayInputStream(bytes).readBinaryJson(sizeLimit)
} }
fun CompoundTag.getBoolean(index: String, orElse: Boolean): Boolean { fun CompoundTag.getBoolean(index: String, orElse: Boolean): Boolean {

View File

@ -24,7 +24,6 @@ import net.minecraftforge.registries.ForgeRegistry
import java.io.* import java.io.*
import java.math.BigDecimal import java.math.BigDecimal
import java.math.BigInteger import java.math.BigInteger
import kotlin.math.absoluteValue
// But seriously, Mojang, why would you need to derive from ByteBuf directly, when you can implement // But seriously, Mojang, why would you need to derive from ByteBuf directly, when you can implement
// your own InputStream and OutputStream, since ByteBuf is meant to be operated on most time like a stream anyway? // your own InputStream and OutputStream, since ByteBuf is meant to be operated on most time like a stream anyway?
@ -154,21 +153,21 @@ private const val TYPE_OBJECT = 0x07
* *
* just copy pasted this code from my another project because i was lazy * just copy pasted this code from my another project because i was lazy
*/ */
fun OutputStream.writeJson(element: JsonElement) { fun OutputStream.writeBinaryJson(element: JsonElement) {
if (element is JsonObject) { if (element is JsonObject) {
write(TYPE_OBJECT) write(TYPE_OBJECT)
writeVarIntLE(element.size()) writeVarIntLE(element.size())
for ((k, v) in element.entrySet()) { for ((k, v) in element.entrySet()) {
writeBinaryString(k) writeBinaryString(k)
writeJson(v) writeBinaryJson(v)
} }
} else if (element is JsonArray) { } else if (element is JsonArray) {
write(TYPE_ARRAY) write(TYPE_ARRAY)
writeVarIntLE(element.size()) writeVarIntLE(element.size())
for (v in element) { for (v in element) {
writeJson(v) writeBinaryJson(v)
} }
} else if (element is JsonPrimitive) { } else if (element is JsonPrimitive) {
if (element.isNumber) { if (element.isNumber) {
@ -204,7 +203,7 @@ fun OutputStream.writeJson(element: JsonElement) {
* *
* just copy pasted this code from my another project because i was lazy * just copy pasted this code from my another project because i was lazy
*/ */
fun InputStream.readJson(sizeLimit: NbtAccounter = NbtAccounter(1L shl 18 /* 256 KiB */)): JsonElement { fun InputStream.readBinaryJson(sizeLimit: NbtAccounter = NbtAccounter(1L shl 18 /* 256 KiB */)): JsonElement {
sizeLimit.accountBytes(1L) sizeLimit.accountBytes(1L)
return when (val id = read()) { return when (val id = read()) {
@ -226,7 +225,7 @@ fun InputStream.readJson(sizeLimit: NbtAccounter = NbtAccounter(1L shl 18 /* 256
if (values < 0) throw JsonSyntaxException("Tried to read json array with $values elements in it") if (values < 0) throw JsonSyntaxException("Tried to read json array with $values elements in it")
val build = JsonArray(values) val build = JsonArray(values)
for (i in 0 until values) build.add(readJson(sizeLimit)) for (i in 0 until values) build.add(readBinaryJson(sizeLimit))
return build return build
} }
TYPE_OBJECT -> { TYPE_OBJECT -> {
@ -246,7 +245,7 @@ fun InputStream.readJson(sizeLimit: NbtAccounter = NbtAccounter(1L shl 18 /* 256
} }
try { try {
build.add(key, readJson(sizeLimit)) build.add(key, readBinaryJson(sizeLimit))
} catch(err: Throwable) { } catch(err: Throwable) {
throw JsonSyntaxException("Reading json object at $i with name $key", err) throw JsonSyntaxException("Reading json object at $i with name $key", err)
} }
@ -259,27 +258,27 @@ fun InputStream.readJson(sizeLimit: NbtAccounter = NbtAccounter(1L shl 18 /* 256
} }
fun InputStream.readBinaryComponent(): Component? { fun InputStream.readBinaryComponent(): Component? {
return Component.Serializer.fromJson(readJson()) return Component.Serializer.fromJson(readBinaryJson())
} }
fun OutputStream.writeBinaryComponent(component: Component) { fun OutputStream.writeBinaryComponent(component: Component) {
writeJson(Component.Serializer.toJsonTree(component)) writeBinaryJson(Component.Serializer.toJsonTree(component))
} }
fun FriendlyByteBuf.readJson(sizeLimit: NbtAccounter = NbtAccounter(1L shl 18)): JsonElement { fun FriendlyByteBuf.readBinaryJson(sizeLimit: NbtAccounter = NbtAccounter(1L shl 18)): JsonElement {
return ByteBufInputStream(this).readJson(sizeLimit) return ByteBufInputStream(this).readBinaryJson(sizeLimit)
} }
fun FriendlyByteBuf.writeJson(value: JsonElement) { fun FriendlyByteBuf.writeBinaryJson(value: JsonElement) {
ByteBufOutputStream(this).writeJson(value) ByteBufOutputStream(this).writeBinaryJson(value)
} }
fun FriendlyByteBuf.readBinaryComponent(): Component { fun FriendlyByteBuf.readBinaryComponent(): Component {
return Component.Serializer.fromJson(readJson()) ?: throw NullPointerException("Received null component") return Component.Serializer.fromJson(readBinaryJson()) ?: throw NullPointerException("Received null component")
} }
fun FriendlyByteBuf.writeBinaryComponent(component: Component) { fun FriendlyByteBuf.writeBinaryComponent(component: Component) {
writeJson(Component.Serializer.toJsonTree(component)) writeBinaryJson(Component.Serializer.toJsonTree(component))
} }
fun <S : OutputStream, V> S.writeCollection(collection: Collection<V>, writer: S.(V) -> Unit) { fun <S : OutputStream, V> S.writeCollection(collection: Collection<V>, writer: S.(V) -> Unit) {

View File

@ -17,15 +17,14 @@ import net.minecraft.world.item.crafting.RecipeType
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.block.entity.tech.PlatePressBlockEntity
import ru.dbotthepony.mc.otm.container.get import ru.dbotthepony.mc.otm.container.get
import ru.dbotthepony.mc.otm.core.fromJsonStrict import ru.dbotthepony.mc.otm.core.fromJsonStrict
import ru.dbotthepony.mc.otm.core.isActuallyEmpty import ru.dbotthepony.mc.otm.core.isActuallyEmpty
import ru.dbotthepony.mc.otm.registry.MRecipes import ru.dbotthepony.mc.otm.registry.MRecipes
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.toJsonStrict import ru.dbotthepony.mc.otm.core.toJsonStrict
import ru.dbotthepony.mc.otm.core.util.readJson import ru.dbotthepony.mc.otm.core.util.readBinaryJson
import ru.dbotthepony.mc.otm.core.util.writeJson import ru.dbotthepony.mc.otm.core.util.writeBinaryJson
class PlatePressRecipe( class PlatePressRecipe(
private val id: ResourceLocation, private val id: ResourceLocation,
@ -122,7 +121,7 @@ class PlatePressRecipe(
} }
override fun fromNetwork(loc: ResourceLocation, buff: FriendlyByteBuf): PlatePressRecipe { override fun fromNetwork(loc: ResourceLocation, buff: FriendlyByteBuf): PlatePressRecipe {
return PlatePressRecipe(loc, Ingredient.fromNetwork(buff), Ingredient.fromNetwork(buff), buff.readInt(), buff.readInt(), FloatProvider.CODEC.fromJsonStrict(buff.readJson())) return PlatePressRecipe(loc, Ingredient.fromNetwork(buff), Ingredient.fromNetwork(buff), buff.readInt(), buff.readInt(), FloatProvider.CODEC.fromJsonStrict(buff.readBinaryJson()))
} }
override fun toNetwork(buff: FriendlyByteBuf, recipe: PlatePressRecipe) { override fun toNetwork(buff: FriendlyByteBuf, recipe: PlatePressRecipe) {
@ -130,7 +129,7 @@ class PlatePressRecipe(
recipe.output.toNetwork(buff) recipe.output.toNetwork(buff)
buff.writeInt(recipe.count) buff.writeInt(recipe.count)
buff.writeInt(recipe.workTime) buff.writeInt(recipe.workTime)
buff.writeJson(FloatProvider.CODEC.toJsonStrict(recipe.experience)) buff.writeBinaryJson(FloatProvider.CODEC.toJsonStrict(recipe.experience))
} }
} }
} }

View File

@ -14,7 +14,6 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.crafting.CraftingBookCategory import net.minecraft.world.item.crafting.CraftingBookCategory
import net.minecraft.world.item.crafting.CraftingRecipe import net.minecraft.world.item.crafting.CraftingRecipe
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import net.minecraft.world.item.crafting.Recipe
import net.minecraft.world.item.crafting.RecipeSerializer import net.minecraft.world.item.crafting.RecipeSerializer
import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.item.crafting.RecipeType
import net.minecraft.world.item.crafting.ShapedRecipe import net.minecraft.world.item.crafting.ShapedRecipe
@ -25,8 +24,8 @@ import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.set
import ru.dbotthepony.mc.otm.core.tagNotNull import ru.dbotthepony.mc.otm.core.tagNotNull
import ru.dbotthepony.mc.otm.core.util.readJson import ru.dbotthepony.mc.otm.core.util.readBinaryJson
import ru.dbotthepony.mc.otm.core.util.writeJson import ru.dbotthepony.mc.otm.core.util.writeBinaryJson
import ru.dbotthepony.mc.otm.core.collect.stream import ru.dbotthepony.mc.otm.core.collect.stream
import java.util.stream.Stream import java.util.stream.Stream
@ -241,14 +240,14 @@ class UpgradeRecipe(
return UpgradeRecipe( return UpgradeRecipe(
recipe, recipe,
buff.readCollection({ ArrayList<Op>(it) }, { deserializeOp(it.readJson() as JsonObject) }).stream(), buff.readCollection({ ArrayList<Op>(it) }, { deserializeOp(it.readBinaryJson() as JsonObject) }).stream(),
buff.readResourceLocation() buff.readResourceLocation()
) )
} }
override fun toNetwork(buff: FriendlyByteBuf, value: UpgradeRecipe) { override fun toNetwork(buff: FriendlyByteBuf, value: UpgradeRecipe) {
ShapedRecipe.Serializer.SHAPED_RECIPE.toNetwork(buff, value.parent) ShapedRecipe.Serializer.SHAPED_RECIPE.toNetwork(buff, value.parent)
buff.writeCollection(value.copyPaths) { it, v -> it.writeJson(v.serialize()) } buff.writeCollection(value.copyPaths) { it, v -> it.writeBinaryJson(v.serialize()) }
buff.writeResourceLocation(value.source) buff.writeResourceLocation(value.source)
} }
} }