From 2ca00563e82ddd84dc65a011f5a9768e96199bfe Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 8 May 2023 00:09:49 +0700 Subject: [PATCH] Codec2Serializer.embed --- .../mc/otm/data/Codec2Serializer.kt | 20 ++++++- .../condition/ChanceWithPlaytimeCondition.kt | 44 +++++---------- .../condition/ItemInInventoryCondition.kt | 55 +++++-------------- .../mc/otm/registry/MLootItemConditions.kt | 4 +- 4 files changed, 47 insertions(+), 76 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/Codec2Serializer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/Codec2Serializer.kt index d6bc931c5..dec230f36 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/data/Codec2Serializer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/Codec2Serializer.kt @@ -10,9 +10,25 @@ import ru.dbotthepony.mc.otm.core.fromJsonStrict import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.toJsonStrict -class Codec2Serializer(val codec: Codec) : Serializer { +class Codec2Serializer(val codec: Codec, val embed: Boolean = true) : Serializer { override fun serialize(p_79325_: JsonObject, p_79326_: T, p_79327_: JsonSerializationContext) { - p_79325_["value"] = codec.toJsonStrict(p_79326_) + if (embed) { + val json = codec.toJsonStrict(p_79326_) + + if (json !is JsonObject) { + throw RuntimeException("It was specified to embed result from codec into target json, but codec returned ${json::class.qualifiedName}, while was expecting JsonObject") + } + + for ((k, v) in json.entrySet()) { + if (p_79325_.has(k)) { + throw RuntimeException("Codec returned object with '$k' as member, which is not allowed (it was written by upstream code into provided JsonObject)") + } + + p_79325_[k] = v + } + } else { + p_79325_["value"] = codec.toJsonStrict(p_79326_) + } } override fun deserialize(p_79323_: JsonObject, p_79324_: JsonDeserializationContext): T { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/condition/ChanceWithPlaytimeCondition.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/condition/ChanceWithPlaytimeCondition.kt index ba23eea7d..2a2b19d08 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/data/condition/ChanceWithPlaytimeCondition.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/condition/ChanceWithPlaytimeCondition.kt @@ -1,17 +1,13 @@ package ru.dbotthepony.mc.otm.data.condition -import com.google.gson.JsonDeserializationContext -import com.google.gson.JsonObject -import com.google.gson.JsonPrimitive -import com.google.gson.JsonSerializationContext +import com.mojang.serialization.Codec +import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.world.level.storage.loot.LootContext -import net.minecraft.world.level.storage.loot.Serializer import net.minecraft.world.level.storage.loot.parameters.LootContextParams import net.minecraft.world.level.storage.loot.predicates.LootItemCondition import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType import ru.dbotthepony.mc.otm.capability.matteryPlayer -import ru.dbotthepony.mc.otm.core.nbt.set -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.data.Codec2Serializer import ru.dbotthepony.mc.otm.data.get import ru.dbotthepony.mc.otm.registry.MLootItemConditions @@ -52,28 +48,16 @@ data class ChanceWithPlaytimeCondition( return this } - companion object : Serializer { - override fun serialize( - p_79325_: JsonObject, - p_79326_: ChanceWithPlaytimeCondition, - p_79327_: JsonSerializationContext - ) { - p_79325_["minPlaytime"] = JsonPrimitive(p_79326_.minPlaytime) - p_79325_["maxPlaytime"] = JsonPrimitive(p_79326_.maxPlaytime) - p_79325_["minProbability"] = JsonPrimitive(p_79326_.minProbability) - p_79325_["maxProbability"] = JsonPrimitive(p_79326_.maxProbability) - } - - override fun deserialize( - p_79323_: JsonObject, - p_79324_: JsonDeserializationContext - ): ChanceWithPlaytimeCondition { - return ChanceWithPlaytimeCondition( - minPlaytime = p_79323_["minPlaytime"].asInt, - maxPlaytime = p_79323_["maxPlaytime"].asInt, - minProbability = p_79323_["minProbability"].asDouble, - maxProbability = p_79323_["maxProbability"].asDouble, - ) - } + companion object { + val SERIALIZER = Codec2Serializer( + RecordCodecBuilder.create { + it.group( + Codec.INT.optionalFieldOf("minPlaytime", 0).forGetter(ChanceWithPlaytimeCondition::minPlaytime), + Codec.INT.fieldOf("maxPlaytime").forGetter(ChanceWithPlaytimeCondition::maxPlaytime), + Codec.DOUBLE.fieldOf("minProbability").forGetter(ChanceWithPlaytimeCondition::minProbability), + Codec.DOUBLE.fieldOf("maxProbability").forGetter(ChanceWithPlaytimeCondition::maxProbability), + ).apply(it, ::ChanceWithPlaytimeCondition) + } + ) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/condition/ItemInInventoryCondition.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/condition/ItemInInventoryCondition.kt index 353f5a8c0..d4f088d3c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/data/condition/ItemInInventoryCondition.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/condition/ItemInInventoryCondition.kt @@ -1,23 +1,14 @@ package ru.dbotthepony.mc.otm.data.condition -import com.google.gson.JsonDeserializationContext -import com.google.gson.JsonObject -import com.google.gson.JsonPrimitive -import com.google.gson.JsonSerializationContext -import com.google.gson.JsonSyntaxException -import net.minecraft.resources.ResourceLocation +import com.mojang.serialization.Codec +import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Items import net.minecraft.world.level.storage.loot.LootContext -import net.minecraft.world.level.storage.loot.Serializer import net.minecraft.world.level.storage.loot.parameters.LootContextParams import net.minecraft.world.level.storage.loot.predicates.LootItemCondition import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType -import net.minecraftforge.registries.ForgeRegistries import ru.dbotthepony.mc.otm.capability.itemsStream -import ru.dbotthepony.mc.otm.core.registryName -import ru.dbotthepony.mc.otm.core.nbt.set -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.data.Codec2Serializer import ru.dbotthepony.mc.otm.data.get import ru.dbotthepony.mc.otm.registry.MLootItemConditions @@ -65,36 +56,16 @@ data class ItemInInventoryCondition( return this } - companion object : Serializer { - override fun serialize( - p_79325_: JsonObject, - p_79326_: ItemInInventoryCondition, - p_79327_: JsonSerializationContext - ) { - p_79325_["item"] = JsonPrimitive(p_79326_.item.item.registryName!!.toString()) - p_79325_["itemCount"] = JsonPrimitive(p_79326_.item.count) - p_79325_["matchDamage"] = JsonPrimitive(p_79326_.matchDamage) - p_79325_["matchNBT"] = JsonPrimitive(p_79326_.matchNBT) - p_79325_["matchCosmetics"] = JsonPrimitive(p_79326_.matchCosmetics) - } - - override fun deserialize(p_79323_: JsonObject, p_79324_: JsonDeserializationContext): ItemInInventoryCondition { - val item = p_79323_["item"]?.asString ?: throw JsonSyntaxException("Missing item") - val itemCount = p_79323_["itemCount"]?.asInt ?: throw JsonSyntaxException("Missing itemCount") - val matchDamage = p_79323_["matchDamage"]?.asBoolean ?: false - val matchNBT = p_79323_["matchNBT"]?.asBoolean ?: false - val matchCosmetics = p_79323_["matchCosmetics"]?.asBoolean ?: true - - val getItem = ForgeRegistries.ITEMS.getValue(ResourceLocation(item)) - - if (getItem == null || getItem == Items.AIR) { - throw JsonSyntaxException("Invalid item $item") + companion object { + val SERIALIZER = Codec2Serializer( + RecordCodecBuilder.create { + it.group( + ItemStack.CODEC.fieldOf("item").forGetter(ItemInInventoryCondition::item), + Codec.BOOL.optionalFieldOf("matchDamage", false).forGetter(ItemInInventoryCondition::matchDamage), + Codec.BOOL.optionalFieldOf("matchNBT", false).forGetter(ItemInInventoryCondition::matchNBT), + Codec.BOOL.optionalFieldOf("matchCosmetics", false).forGetter(ItemInInventoryCondition::matchCosmetics), + ).apply(it, ::ItemInInventoryCondition) } - - return ItemInInventoryCondition( - ItemStack(getItem, itemCount), - matchDamage, matchNBT - ) - } + ) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MLootItemConditions.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MLootItemConditions.kt index 9149e0b10..c74c21fa6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MLootItemConditions.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MLootItemConditions.kt @@ -17,8 +17,8 @@ object MLootItemConditions { private val registry = DeferredRegister.create(Registries.LOOT_CONDITION_TYPE, OverdriveThatMatters.MOD_ID) val HAS_EXOPACK: LootItemConditionType by registry.register("has_exopack") { LootItemConditionType(HasExoPackCondition) } - val CHANCE_WITH_PLAYTIME: LootItemConditionType by registry.register("chance_with_playtime") { LootItemConditionType(ChanceWithPlaytimeCondition) } - val ITEM_IN_INVENTORY: LootItemConditionType by registry.register("item_in_inventory") { LootItemConditionType(ItemInInventoryCondition) } + val CHANCE_WITH_PLAYTIME: LootItemConditionType by registry.register("chance_with_playtime") { LootItemConditionType(ChanceWithPlaytimeCondition.SERIALIZER) } + val ITEM_IN_INVENTORY: LootItemConditionType by registry.register("item_in_inventory") { LootItemConditionType(ItemInInventoryCondition.SERIALIZER) } val KILLED_BY_REAL_PLAYER: LootItemConditionType by registry.register("killed_by_real_player") { LootItemConditionType(KilledByRealPlayer) } val KILLED_BY_REAL_PLAYER_OR_INDIRECTLY: LootItemConditionType by registry.register("killed_by_real_player_or_indirectly") { LootItemConditionType(KilledByRealPlayerOrIndirectly) } val CHANCE: LootItemConditionType by registry.register("chance") { LootItemConditionType(ChanceCondition.Companion) }