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,10 +10,26 @@ import ru.dbotthepony.mc.otm.core.fromJsonStrict
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.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) { override fun serialize(p_79325_: JsonObject, p_79326_: T, p_79327_: JsonSerializationContext) {
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_) p_79325_["value"] = codec.toJsonStrict(p_79326_)
} }
}
override fun deserialize(p_79323_: JsonObject, p_79324_: JsonDeserializationContext): T { override fun deserialize(p_79323_: JsonObject, p_79324_: JsonDeserializationContext): T {
return codec.fromJsonStrict(p_79323_["value"] ?: throw JsonSyntaxException("Missing 'value' element")) return codec.fromJsonStrict(p_79323_["value"] ?: throw JsonSyntaxException("Missing 'value' element"))

View File

@ -1,17 +1,13 @@
package ru.dbotthepony.mc.otm.data.condition package ru.dbotthepony.mc.otm.data.condition
import com.google.gson.JsonDeserializationContext import com.mojang.serialization.Codec
import com.google.gson.JsonObject import com.mojang.serialization.codecs.RecordCodecBuilder
import com.google.gson.JsonPrimitive
import com.google.gson.JsonSerializationContext
import net.minecraft.world.level.storage.loot.LootContext 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.parameters.LootContextParams
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType
import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.capability.matteryPlayer
import ru.dbotthepony.mc.otm.core.nbt.set import ru.dbotthepony.mc.otm.data.Codec2Serializer
import ru.dbotthepony.mc.otm.core.set
import ru.dbotthepony.mc.otm.data.get import ru.dbotthepony.mc.otm.data.get
import ru.dbotthepony.mc.otm.registry.MLootItemConditions import ru.dbotthepony.mc.otm.registry.MLootItemConditions
@ -52,28 +48,16 @@ data class ChanceWithPlaytimeCondition(
return this return this
} }
companion object : Serializer<ChanceWithPlaytimeCondition> { companion object {
override fun serialize( val SERIALIZER = Codec2Serializer<ChanceWithPlaytimeCondition>(
p_79325_: JsonObject, RecordCodecBuilder.create {
p_79326_: ChanceWithPlaytimeCondition, it.group(
p_79327_: JsonSerializationContext Codec.INT.optionalFieldOf("minPlaytime", 0).forGetter(ChanceWithPlaytimeCondition::minPlaytime),
) { Codec.INT.fieldOf("maxPlaytime").forGetter(ChanceWithPlaytimeCondition::maxPlaytime),
p_79325_["minPlaytime"] = JsonPrimitive(p_79326_.minPlaytime) Codec.DOUBLE.fieldOf("minProbability").forGetter(ChanceWithPlaytimeCondition::minProbability),
p_79325_["maxPlaytime"] = JsonPrimitive(p_79326_.maxPlaytime) Codec.DOUBLE.fieldOf("maxProbability").forGetter(ChanceWithPlaytimeCondition::maxProbability),
p_79325_["minProbability"] = JsonPrimitive(p_79326_.minProbability) ).apply(it, ::ChanceWithPlaytimeCondition)
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,
) )
} }
}
} }

View File

@ -1,23 +1,14 @@
package ru.dbotthepony.mc.otm.data.condition package ru.dbotthepony.mc.otm.data.condition
import com.google.gson.JsonDeserializationContext import com.mojang.serialization.Codec
import com.google.gson.JsonObject import com.mojang.serialization.codecs.RecordCodecBuilder
import com.google.gson.JsonPrimitive
import com.google.gson.JsonSerializationContext
import com.google.gson.JsonSyntaxException
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.item.ItemStack 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.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.parameters.LootContextParams
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType 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.capability.itemsStream
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.data.Codec2Serializer
import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.core.set
import ru.dbotthepony.mc.otm.data.get import ru.dbotthepony.mc.otm.data.get
import ru.dbotthepony.mc.otm.registry.MLootItemConditions import ru.dbotthepony.mc.otm.registry.MLootItemConditions
@ -65,36 +56,16 @@ data class ItemInInventoryCondition(
return this return this
} }
companion object : Serializer<ItemInInventoryCondition> { companion object {
override fun serialize( val SERIALIZER = Codec2Serializer<ItemInInventoryCondition>(
p_79325_: JsonObject, RecordCodecBuilder.create {
p_79326_: ItemInInventoryCondition, it.group(
p_79327_: JsonSerializationContext ItemStack.CODEC.fieldOf("item").forGetter(ItemInInventoryCondition::item),
) { Codec.BOOL.optionalFieldOf("matchDamage", false).forGetter(ItemInInventoryCondition::matchDamage),
p_79325_["item"] = JsonPrimitive(p_79326_.item.item.registryName!!.toString()) Codec.BOOL.optionalFieldOf("matchNBT", false).forGetter(ItemInInventoryCondition::matchNBT),
p_79325_["itemCount"] = JsonPrimitive(p_79326_.item.count) Codec.BOOL.optionalFieldOf("matchCosmetics", false).forGetter(ItemInInventoryCondition::matchCosmetics),
p_79325_["matchDamage"] = JsonPrimitive(p_79326_.matchDamage) ).apply(it, ::ItemInInventoryCondition)
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")
}
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) private val registry = DeferredRegister.create(Registries.LOOT_CONDITION_TYPE, OverdriveThatMatters.MOD_ID)
val HAS_EXOPACK: LootItemConditionType by registry.register("has_exopack") { LootItemConditionType(HasExoPackCondition) } 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 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) } 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: 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 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) } val CHANCE: LootItemConditionType by registry.register("chance") { LootItemConditionType(ChanceCondition.Companion) }