Codec2Serializer.embed

This commit is contained in:
DBotThePony 2023-05-08 00:09:49 +07:00
parent be43c59a2d
commit 2ca00563e8
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 47 additions and 76 deletions

View File

@ -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<T : Any>(val codec: Codec<T>) : Serializer<T> {
class Codec2Serializer<T : Any>(val codec: Codec<T>, val embed: Boolean = true) : Serializer<T> {
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 {

View File

@ -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<ChanceWithPlaytimeCondition> {
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<ChanceWithPlaytimeCondition>(
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)
}
)
}
}

View File

@ -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<ItemInInventoryCondition> {
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<ItemInInventoryCondition>(
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
)
}
)
}
}

View File

@ -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) }