From 7683cacc29ed244fcb6241db45bf3c9277a4e884 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 31 Dec 2023 20:42:20 +0700 Subject: [PATCH] More backporting --- .../mc/otm/android/AndroidResearchType.kt | 3 +- .../mc/otm/client/ClientEventHandler.kt | 4 +- .../mc/otm/data/ItemPredicateCodec.kt | 27 ++++++++++ .../mc/otm/data/loot/LootPoolAppender.kt | 50 ++++++++++++++++++- .../mc/otm/item/MinecartCargoCrateItem.kt | 7 +-- .../mc/otm/matter/MatterManager.kt | 4 +- .../mc/otm/triggers/HurtTrigger.kt | 7 +-- .../mc/otm/triggers/ItemTrigger.kt | 3 +- .../mc/otm/triggers/MCriterionTrigger.kt | 2 +- .../mc/otm/triggers/SingletonTrigger.kt | 2 +- 10 files changed, 92 insertions(+), 17 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/data/ItemPredicateCodec.kt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchType.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchType.kt index ad2610563..f4eb7a76a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchType.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchType.kt @@ -25,6 +25,7 @@ import ru.dbotthepony.mc.otm.core.collect.ListSet import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.isActuallyEmpty import ru.dbotthepony.mc.otm.data.ComponentCodec +import ru.dbotthepony.mc.otm.data.IngredientCodec import ru.dbotthepony.mc.otm.data.JsonElementCodec import ru.dbotthepony.mc.otm.isClient import java.util.Optional @@ -392,7 +393,7 @@ class AndroidResearchType( ListCodec( RecordCodecBuilder.create> { it.group( - Ingredient.CODEC.fieldOf("item").forGetter { it.first }, + IngredientCodec.fieldOf("item").forGetter { it.first }, Codec.intRange(1, Int.MAX_VALUE).optionalFieldOf("count", 1).forGetter { it.second } ).apply(it, ::Pair) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt index 66b76fa4a..510f353c8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/ClientEventHandler.kt @@ -224,7 +224,7 @@ fun onMouseScrolled(event: MouseScrolled.Pre) { for (widget in screen.renderables) { if (widget is Panel2Widget<*, *>) { - if (widget.panel.mouseScrolledChecked(event.mouseX, event.mouseY, event.deltaX)) { + if (widget.panel.mouseScrolledChecked(event.mouseX, event.mouseY, event.scrollDelta)) { event.isCanceled = true return } @@ -233,7 +233,7 @@ fun onMouseScrolled(event: MouseScrolled.Pre) { val slot = screen.slotUnderMouse if (slot != null && (slot.container == minecraft.player?.inventory && slot.containerSlot in 9 .. 35 || slot.container == minecraft.player?.matteryPlayer?.exopackContainer)) { - widget.panel.mouseScrolledInner(event.mouseX, event.mouseY, event.deltaX) + widget.panel.mouseScrolledInner(event.mouseX, event.mouseY, event.scrollDelta) event.isCanceled = true return } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/ItemPredicateCodec.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/ItemPredicateCodec.kt new file mode 100644 index 000000000..b37fb23a9 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/ItemPredicateCodec.kt @@ -0,0 +1,27 @@ +package ru.dbotthepony.mc.otm.data + +import com.google.gson.JsonObject +import com.google.gson.JsonParseException +import com.google.gson.JsonSyntaxException +import com.mojang.datafixers.util.Pair +import com.mojang.serialization.Codec +import com.mojang.serialization.DataResult +import com.mojang.serialization.DynamicOps +import com.mojang.serialization.JsonOps +import net.minecraft.advancements.critereon.ItemPredicate + +object ItemPredicateCodec : Codec { + override fun encode(input: ItemPredicate, ops: DynamicOps, prefix: T): DataResult { + return DataResult.success(JsonOps.INSTANCE.convertTo(ops, input.serializeToJson().let { if (it is JsonObject) it.getRidOfNulls() else it })) + } + + override fun decode(ops: DynamicOps, input: T): DataResult> { + return try { + DataResult.success(Pair(ItemPredicate.fromJson(ops.convertTo(JsonOps.INSTANCE, input)), ops.empty())) + } catch (err: JsonSyntaxException) { + DataResult.error { "Failed to deserialize ItemPredicate: ${err.message}" } + } catch (err: JsonParseException) { + DataResult.error { "Failed to deserialize ItemPredicate: ${err.message}" } + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/loot/LootPoolAppender.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/loot/LootPoolAppender.kt index 99556a944..4154609d1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/data/loot/LootPoolAppender.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/loot/LootPoolAppender.kt @@ -1,13 +1,20 @@ package ru.dbotthepony.mc.otm.data.loot import com.google.common.collect.ImmutableList +import com.google.gson.JsonSyntaxException import com.mojang.serialization.Codec +import com.mojang.serialization.DataResult +import com.mojang.serialization.Dynamic +import com.mojang.serialization.JsonOps import com.mojang.serialization.codecs.RecordCodecBuilder import it.unimi.dsi.fastutil.objects.ObjectArrayList +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.storage.loot.Deserializers import net.minecraft.world.level.storage.loot.LootContext import net.minecraft.world.level.storage.loot.LootPool import net.minecraft.world.level.storage.loot.predicates.LootItemCondition +import net.minecraftforge.common.ForgeHooks import net.minecraftforge.common.loot.IGlobalLootModifier import net.minecraftforge.common.loot.LootModifier import java.util.* @@ -32,10 +39,51 @@ class LootPoolAppender(conditions: Array, pools: Stream> + + private val forgeHooksLootContext by lazy { + val field = ForgeHooks::class.java.getDeclaredField("lootContext") + field.isAccessible = true + field + } + + private val lootTableContextConstructor by lazy { + val clazz = ForgeHooks::class.java.declaredClasses.firstOrNull { it.name.contains("LootTableContext") } ?: throw NoSuchElementException("Unable to find ForgeHooks\$LootTableContext!") + val constructor = clazz.getDeclaredConstructor(ResourceLocation::class.java, Boolean::class.java) + constructor.isAccessible = true + constructor + } + + init { + val serializer = Deserializers.createLootTableSerializer().create() + val notExistingLocation = ResourceLocation("null", "null") + + lootPoolCodec = Codec.list(Codec.PASSTHROUGH.flatXmap({ + val dequeueHolder = forgeHooksLootContext.get(null) as ThreadLocal> + val deque = dequeueHolder.get() ?: java.util.ArrayDeque() + dequeueHolder.set(deque) + + try { + deque.push(lootTableContextConstructor.newInstance(notExistingLocation, true)) + DataResult.success(serializer.fromJson(it.convert(JsonOps.INSTANCE).value, LootPool::class.java)) + } catch(err: JsonSyntaxException) { + DataResult.error { err.message } + } finally { + deque.pop() + } + }, { + try { + DataResult.success(Dynamic(JsonOps.INSTANCE, serializer.toJsonTree(it))) + } catch(err: JsonSyntaxException) { + DataResult.error { err.message } + } + })) + } + val CODEC: Codec = RecordCodecBuilder.create { codecStart(it).and( - LootPool.CODEC.listOf().fieldOf("pools").forGetter(LootPoolAppender::pools) + lootPoolCodec.fieldOf("pools").forGetter(LootPoolAppender::pools) ).apply(it, ::LootPoolAppender) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MinecartCargoCrateItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MinecartCargoCrateItem.kt index 9df929a39..25b520997 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MinecartCargoCrateItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MinecartCargoCrateItem.kt @@ -1,7 +1,7 @@ package ru.dbotthepony.mc.otm.item +import net.minecraft.core.BlockSource import net.minecraft.core.Direction -import net.minecraft.core.dispenser.BlockSource import net.minecraft.core.dispenser.DefaultDispenseItemBehavior import net.minecraft.core.dispenser.DispenseItemBehavior import net.minecraft.tags.BlockTags @@ -9,17 +9,14 @@ import net.minecraft.world.InteractionResult import net.minecraft.world.item.DyeColor import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.MinecartItem import net.minecraft.world.item.context.UseOnContext import net.minecraft.world.level.Level import net.minecraft.world.level.block.BaseRailBlock import net.minecraft.world.level.block.DispenserBlock import net.minecraft.world.level.block.state.properties.RailShape import net.minecraft.world.level.gameevent.GameEvent -import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.entity.MinecartCargoCrate import ru.dbotthepony.mc.otm.registry.MEntityTypes -import kotlin.math.floor class MinecartCargoCrateItem(val color: DyeColor?) : Item(Properties().stacksTo(16)) { init { @@ -67,7 +64,7 @@ class MinecartCargoCrateItem(val color: DyeColor?) : Item(Properties().stacksTo( private val default = DefaultDispenseItemBehavior() override fun dispense(blockSource: BlockSource, itemStack: ItemStack): ItemStack { - val direction = blockSource.state.getValue(DispenserBlock.FACING) + val direction = blockSource.blockState.getValue(DispenserBlock.FACING) val level: Level = blockSource.level val x = blockSource.pos.x + direction.stepX.toDouble() * 1.125 val y = blockSource.pos.y + direction.stepY.toDouble() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt index 18f0572ff..b8467b1db 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterManager.kt @@ -53,7 +53,6 @@ import net.minecraftforge.event.AddReloadListenerEvent import net.minecraftforge.event.OnDatapackSyncEvent import net.minecraftforge.event.RegisterCommandsEvent import net.minecraftforge.event.entity.player.ItemTooltipEvent -import net.minecraftforge.event.network.CustomPayloadEvent import net.minecraftforge.event.server.ServerStartedEvent import net.minecraftforge.eventbus.api.IEventBus import net.minecraftforge.fml.ModList @@ -94,6 +93,7 @@ import ru.dbotthepony.mc.otm.core.util.readBinaryComponent import ru.dbotthepony.mc.otm.core.util.readCollection import ru.dbotthepony.mc.otm.core.util.writeBinaryComponent import ru.dbotthepony.mc.otm.core.util.writeCollection +import ru.dbotthepony.mc.otm.core.value import ru.dbotthepony.mc.otm.core.writeItemType import ru.dbotthepony.mc.otm.milliTime import ru.dbotthepony.mc.otm.network.GenericNetworkChannel @@ -1703,7 +1703,7 @@ object MatterManager { if (event.player == null) { syncRegistry(PacketDistributor.ALL.noArg()) } else { - syncRegistry(PacketDistributor.PLAYER.with(event.player!!)) + syncRegistry(PacketDistributor.PLAYER.with { event.player!! }) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/HurtTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/HurtTrigger.kt index c5be0e2e5..a175050d3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/HurtTrigger.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/HurtTrigger.kt @@ -4,6 +4,7 @@ import com.mojang.serialization.Codec import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.advancements.critereon.ContextAwarePredicate 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 net.minecraft.resources.ResourceLocation @@ -35,9 +36,9 @@ class HurtTrigger(id: ResourceLocation) : MCriterionTrigger = Optional.of(DamagePredicate( MinMaxBounds.Doubles.atLeast(1.0), MinMaxBounds.Doubles.atLeast(1.0), - Optional.empty(), - Optional.empty(), - Optional.empty() + EntityPredicate.ANY, + null, + DamageSourcePredicate.ANY )), player: Optional = Optional.empty() ) : AbstractInstance(player) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ItemTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ItemTrigger.kt index a7cd9c923..c4acc7ccc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ItemTrigger.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ItemTrigger.kt @@ -7,6 +7,7 @@ import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.resources.ResourceLocation import net.minecraft.server.level.ServerPlayer import net.minecraft.world.item.ItemStack +import ru.dbotthepony.mc.otm.data.ItemPredicateCodec import java.util.* class ItemTrigger(id: ResourceLocation) : MCriterionTrigger(id) { @@ -16,7 +17,7 @@ class ItemTrigger(id: ResourceLocation) : MCriterionTrigger = RecordCodecBuilder.create { it.group( - ItemPredicate.CODEC.fieldOf("predicate").forGetter(Instance::predicate), + ItemPredicateCodec.fieldOf("predicate").forGetter(Instance::predicate), Codec.BOOL.optionalFieldOf("invert", false).forGetter(Instance::invert), playerPredicateCodec.forGetter(Instance::playerPredicate) ).apply(it, ::Instance) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/MCriterionTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/MCriterionTrigger.kt index 7274941f9..f422251f6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/MCriterionTrigger.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/MCriterionTrigger.kt @@ -73,7 +73,7 @@ abstract class MCriterionTrigger.AbstractInstance>(val } abstract inner class AbstractInstance(val playerPredicate: Optional) : CriterionTriggerInstance { - fun criterion() = this as T + fun criterion() = Criterion(this as T) override fun getCriterion(): ResourceLocation { return id diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SingletonTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SingletonTrigger.kt index 6ad9afd6d..8a7536d80 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SingletonTrigger.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SingletonTrigger.kt @@ -13,7 +13,7 @@ class SingletonTrigger(id: ResourceLocation) : MCriterionTrigger = Optional.empty()) : AbstractInstance(player) }