diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt index 10f1dd8e8..c8dc31551 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EntityRendererPanel.kt @@ -170,14 +170,16 @@ class EntityRendererPanel @JvmOverloads constructor( return } + val renderX = width.toInt() / 2 + val renderY = (height * 0.9f).toInt() + InventoryScreen.renderEntityInInventoryFollowsMouse( graphics, - 0, 0, - this.width.toInt(), this.height.toInt(), + renderX, + renderY, renderScale, - 0f, - mouseX - absoluteX.toInt(), - mouseY - absoluteY + height * 0.15f, + absoluteX.toInt() + renderX - mouseX, + absoluteY + height * 0.15f - mouseY, entity ) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/Codecs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/Codecs.kt index 6b4f17f3b..d7e90cc59 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/data/Codecs.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/Codecs.kt @@ -1,29 +1,39 @@ package ru.dbotthepony.mc.otm.data import com.mojang.serialization.Codec +import com.mojang.serialization.DataResult import com.mojang.serialization.Dynamic +import com.mojang.serialization.DynamicOps import com.mojang.serialization.JsonOps import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.advancements.critereon.DamagePredicate import net.minecraft.advancements.critereon.DamageSourcePredicate import net.minecraft.advancements.critereon.EntityPredicate import net.minecraft.advancements.critereon.MinMaxBounds +import java.util.Optional import kotlin.reflect.KProperty1 +val DoublesCodec: Codec = RecordCodecBuilder.create { + it.group( + Codec.DOUBLE.optionalFieldOf("min").forGetter { Optional.ofNullable(it.min) }, + Codec.DOUBLE.optionalFieldOf("max").forGetter { Optional.ofNullable(it.max) }, + ).apply(it) { a, b -> MinMaxBounds.Doubles.between(a.orElse(null), b.orElse(null)) } +} + private val dealtReceived: Codec> = RecordCodecBuilder.create { it.group( - MinMaxBounds.Doubles.CODEC.fieldOf("dealt").forGetter { it.first }, - MinMaxBounds.Doubles.CODEC.fieldOf("taken").forGetter { it.second }, + DoublesCodec.fieldOf("dealt").forGetter { it.first }, + DoublesCodec.fieldOf("taken").forGetter { it.second }, ).apply(it, ::Pair) } val DamagePredicateCodec: Codec = RecordCodecBuilder.create { it.group( dealtReceived.fieldOf("damage").forGetter { it.dealtDamage to it.takenDamage }, - Codec.BOOL.optionalFieldOf("blocked").forGetter { it.blocked }, - EntityPredicate.CODEC.optionalFieldOf("source_entity").forGetter { it.sourceEntity }, - DamageSourcePredicate.CODEC.optionalFieldOf("type").forGetter { it.type }, - ).apply(it) { damage, blocked, source, type -> DamagePredicate(damage.first, damage.second, source, blocked, type) } + Codec.BOOL.optionalFieldOf("blocked").forGetter { Optional.ofNullable(it.blocked) }, + Codec.PASSTHROUGH.xmap({ EntityPredicate.fromJson(it.cast(JsonOps.INSTANCE)) }, { Dynamic(JsonOps.INSTANCE, it.serializeToJson()) }).fieldOf("source_entity").forGetter { it.sourceEntity }, + Codec.PASSTHROUGH.xmap({ DamageSourcePredicate.fromJson(it.cast(JsonOps.INSTANCE)) }, { Dynamic(JsonOps.INSTANCE, it.serializeToJson()) }).fieldOf("type").forGetter { it.type }, + ).apply(it) { damage, blocked, source, type -> DamagePredicate(damage.first, damage.second, source, blocked.orElse(null), type) } } fun simpleCodec(factory: (T1) -> V, field1: KProperty1, codec1: Codec): Codec { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/NanobotsArmorTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/NanobotsArmorTrigger.kt index 9c290969e..6ad2e65c6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/NanobotsArmorTrigger.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/NanobotsArmorTrigger.kt @@ -7,12 +7,13 @@ import net.minecraft.advancements.critereon.MinMaxBounds.Doubles import net.minecraft.resources.ResourceLocation import net.minecraft.server.level.ServerPlayer import ru.dbotthepony.mc.otm.OverdriveThatMatters +import ru.dbotthepony.mc.otm.data.DoublesCodec import java.util.* object NanobotsArmorTrigger : MCriterionTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "nanobots_armor")) { override val codec: Codec = RecordCodecBuilder.create { it.group( - Doubles.CODEC.fieldOf("predicate").forGetter(Instance::predicate), + DoublesCodec.fieldOf("predicate").forGetter(Instance::predicate), playerPredicateCodec.forGetter(Instance::playerPredicate), ).apply(it, ::Instance) } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index f500880b3..86504a276 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -179,3 +179,9 @@ public net.minecraft.advancements.critereon.ItemPredicate f_45036_ public net.minecraft.advancements.critereon.ItemPredicate f_45035_ public net.minecraft.advancements.critereon.ItemPredicate f_45034_ public net.minecraft.advancements.critereon.ItemPredicate f_45029_ + +public net.minecraft.advancements.critereon.DamagePredicate f_24906_ # blocked +public net.minecraft.advancements.critereon.DamagePredicate f_24903_ # dealtDamage +public net.minecraft.advancements.critereon.DamagePredicate f_24905_ # sourceEntity +public net.minecraft.advancements.critereon.DamagePredicate f_24904_ # takenDamage +public net.minecraft.advancements.critereon.DamagePredicate f_24907_ # type