Codec2Serializer.embed
This commit is contained in:
parent
be43c59a2d
commit
2ca00563e8
@ -10,10 +10,26 @@ 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) {
|
||||
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 {
|
||||
return codec.fromJsonStrict(p_79323_["value"] ?: throw JsonSyntaxException("Missing 'value' element"))
|
||||
|
@ -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)
|
||||
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)
|
||||
}
|
||||
|
||||
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,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
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)
|
||||
}
|
||||
|
||||
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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) }
|
||||
|
Loading…
Reference in New Issue
Block a user