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.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"))
|
||||||
|
@ -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,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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) }
|
||||||
|
Loading…
Reference in New Issue
Block a user