More backporting

This commit is contained in:
DBotThePony 2023-12-31 20:42:20 +07:00
parent 520112df77
commit 7683cacc29
Signed by: DBot
GPG Key ID: DCC23B5715498507
10 changed files with 92 additions and 17 deletions

View File

@ -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.TranslatableComponent
import ru.dbotthepony.mc.otm.core.isActuallyEmpty import ru.dbotthepony.mc.otm.core.isActuallyEmpty
import ru.dbotthepony.mc.otm.data.ComponentCodec 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.data.JsonElementCodec
import ru.dbotthepony.mc.otm.isClient import ru.dbotthepony.mc.otm.isClient
import java.util.Optional import java.util.Optional
@ -392,7 +393,7 @@ class AndroidResearchType(
ListCodec( ListCodec(
RecordCodecBuilder.create<Pair<Ingredient, Int>> { RecordCodecBuilder.create<Pair<Ingredient, Int>> {
it.group( 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 } Codec.intRange(1, Int.MAX_VALUE).optionalFieldOf("count", 1).forGetter { it.second }
).apply(it, ::Pair) ).apply(it, ::Pair)
} }

View File

@ -224,7 +224,7 @@ fun onMouseScrolled(event: MouseScrolled.Pre) {
for (widget in screen.renderables) { for (widget in screen.renderables) {
if (widget is Panel2Widget<*, *>) { 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 event.isCanceled = true
return return
} }
@ -233,7 +233,7 @@ fun onMouseScrolled(event: MouseScrolled.Pre) {
val slot = screen.slotUnderMouse val slot = screen.slotUnderMouse
if (slot != null && (slot.container == minecraft.player?.inventory && slot.containerSlot in 9 .. 35 || slot.container == minecraft.player?.matteryPlayer?.exopackContainer)) { 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 event.isCanceled = true
return return
} }

View File

@ -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<ItemPredicate> {
override fun <T : Any> encode(input: ItemPredicate, ops: DynamicOps<T>, prefix: T): DataResult<T> {
return DataResult.success(JsonOps.INSTANCE.convertTo(ops, input.serializeToJson().let { if (it is JsonObject) it.getRidOfNulls() else it }))
}
override fun <T : Any> decode(ops: DynamicOps<T>, input: T): DataResult<Pair<ItemPredicate, T>> {
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}" }
}
}
}

View File

@ -1,13 +1,20 @@
package ru.dbotthepony.mc.otm.data.loot package ru.dbotthepony.mc.otm.data.loot
import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableList
import com.google.gson.JsonSyntaxException
import com.mojang.serialization.Codec 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 com.mojang.serialization.codecs.RecordCodecBuilder
import it.unimi.dsi.fastutil.objects.ObjectArrayList import it.unimi.dsi.fastutil.objects.ObjectArrayList
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.item.ItemStack 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.LootContext
import net.minecraft.world.level.storage.loot.LootPool import net.minecraft.world.level.storage.loot.LootPool
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition 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.IGlobalLootModifier
import net.minecraftforge.common.loot.LootModifier import net.minecraftforge.common.loot.LootModifier
import java.util.* import java.util.*
@ -32,10 +39,51 @@ class LootPoolAppender(conditions: Array<out LootItemCondition>, pools: Stream<L
} }
companion object { companion object {
private val lootPoolCodec: Codec<List<LootPool>>
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<Deque<Any>>
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<LootPoolAppender> = val CODEC: Codec<LootPoolAppender> =
RecordCodecBuilder.create { RecordCodecBuilder.create {
codecStart(it).and( codecStart(it).and(
LootPool.CODEC.listOf().fieldOf("pools").forGetter(LootPoolAppender::pools) lootPoolCodec.fieldOf("pools").forGetter(LootPoolAppender::pools)
).apply(it, ::LootPoolAppender) ).apply(it, ::LootPoolAppender)
} }
} }

View File

@ -1,7 +1,7 @@
package ru.dbotthepony.mc.otm.item package ru.dbotthepony.mc.otm.item
import net.minecraft.core.BlockSource
import net.minecraft.core.Direction import net.minecraft.core.Direction
import net.minecraft.core.dispenser.BlockSource
import net.minecraft.core.dispenser.DefaultDispenseItemBehavior import net.minecraft.core.dispenser.DefaultDispenseItemBehavior
import net.minecraft.core.dispenser.DispenseItemBehavior import net.minecraft.core.dispenser.DispenseItemBehavior
import net.minecraft.tags.BlockTags 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.DyeColor
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.MinecartItem
import net.minecraft.world.item.context.UseOnContext import net.minecraft.world.item.context.UseOnContext
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
import net.minecraft.world.level.block.BaseRailBlock import net.minecraft.world.level.block.BaseRailBlock
import net.minecraft.world.level.block.DispenserBlock import net.minecraft.world.level.block.DispenserBlock
import net.minecraft.world.level.block.state.properties.RailShape import net.minecraft.world.level.block.state.properties.RailShape
import net.minecraft.world.level.gameevent.GameEvent 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.entity.MinecartCargoCrate
import ru.dbotthepony.mc.otm.registry.MEntityTypes import ru.dbotthepony.mc.otm.registry.MEntityTypes
import kotlin.math.floor
class MinecartCargoCrateItem(val color: DyeColor?) : Item(Properties().stacksTo(16)) { class MinecartCargoCrateItem(val color: DyeColor?) : Item(Properties().stacksTo(16)) {
init { init {
@ -67,7 +64,7 @@ class MinecartCargoCrateItem(val color: DyeColor?) : Item(Properties().stacksTo(
private val default = DefaultDispenseItemBehavior() private val default = DefaultDispenseItemBehavior()
override fun dispense(blockSource: BlockSource, itemStack: ItemStack): ItemStack { 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 level: Level = blockSource.level
val x = blockSource.pos.x + direction.stepX.toDouble() * 1.125 val x = blockSource.pos.x + direction.stepX.toDouble() * 1.125
val y = blockSource.pos.y + direction.stepY.toDouble() val y = blockSource.pos.y + direction.stepY.toDouble()

View File

@ -53,7 +53,6 @@ import net.minecraftforge.event.AddReloadListenerEvent
import net.minecraftforge.event.OnDatapackSyncEvent import net.minecraftforge.event.OnDatapackSyncEvent
import net.minecraftforge.event.RegisterCommandsEvent import net.minecraftforge.event.RegisterCommandsEvent
import net.minecraftforge.event.entity.player.ItemTooltipEvent import net.minecraftforge.event.entity.player.ItemTooltipEvent
import net.minecraftforge.event.network.CustomPayloadEvent
import net.minecraftforge.event.server.ServerStartedEvent import net.minecraftforge.event.server.ServerStartedEvent
import net.minecraftforge.eventbus.api.IEventBus import net.minecraftforge.eventbus.api.IEventBus
import net.minecraftforge.fml.ModList 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.readCollection
import ru.dbotthepony.mc.otm.core.util.writeBinaryComponent import ru.dbotthepony.mc.otm.core.util.writeBinaryComponent
import ru.dbotthepony.mc.otm.core.util.writeCollection 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.core.writeItemType
import ru.dbotthepony.mc.otm.milliTime import ru.dbotthepony.mc.otm.milliTime
import ru.dbotthepony.mc.otm.network.GenericNetworkChannel import ru.dbotthepony.mc.otm.network.GenericNetworkChannel
@ -1703,7 +1703,7 @@ object MatterManager {
if (event.player == null) { if (event.player == null) {
syncRegistry(PacketDistributor.ALL.noArg()) syncRegistry(PacketDistributor.ALL.noArg())
} else { } else {
syncRegistry(PacketDistributor.PLAYER.with(event.player!!)) syncRegistry(PacketDistributor.PLAYER.with { event.player!! })
} }
} }

View File

@ -4,6 +4,7 @@ import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.advancements.critereon.ContextAwarePredicate import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.advancements.critereon.DamagePredicate import net.minecraft.advancements.critereon.DamagePredicate
import net.minecraft.advancements.critereon.DamageSourcePredicate
import net.minecraft.advancements.critereon.EntityPredicate import net.minecraft.advancements.critereon.EntityPredicate
import net.minecraft.advancements.critereon.MinMaxBounds import net.minecraft.advancements.critereon.MinMaxBounds
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
@ -35,9 +36,9 @@ class HurtTrigger(id: ResourceLocation) : MCriterionTrigger<HurtTrigger.Instance
val damagePredicate: Optional<DamagePredicate> = Optional.of(DamagePredicate( val damagePredicate: Optional<DamagePredicate> = Optional.of(DamagePredicate(
MinMaxBounds.Doubles.atLeast(1.0), MinMaxBounds.Doubles.atLeast(1.0),
MinMaxBounds.Doubles.atLeast(1.0), MinMaxBounds.Doubles.atLeast(1.0),
Optional.empty(), EntityPredicate.ANY,
Optional.empty(), null,
Optional.empty() DamageSourcePredicate.ANY
)), )),
player: Optional<ContextAwarePredicate> = Optional.empty() player: Optional<ContextAwarePredicate> = Optional.empty()
) : AbstractInstance(player) ) : AbstractInstance(player)

View File

@ -7,6 +7,7 @@ import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import ru.dbotthepony.mc.otm.data.ItemPredicateCodec
import java.util.* import java.util.*
class ItemTrigger(id: ResourceLocation) : MCriterionTrigger<ItemTrigger.Instance>(id) { class ItemTrigger(id: ResourceLocation) : MCriterionTrigger<ItemTrigger.Instance>(id) {
@ -16,7 +17,7 @@ class ItemTrigger(id: ResourceLocation) : MCriterionTrigger<ItemTrigger.Instance
override val codec: Codec<Instance> = RecordCodecBuilder.create { override val codec: Codec<Instance> = RecordCodecBuilder.create {
it.group( it.group(
ItemPredicate.CODEC.fieldOf("predicate").forGetter(Instance::predicate), ItemPredicateCodec.fieldOf("predicate").forGetter(Instance::predicate),
Codec.BOOL.optionalFieldOf("invert", false).forGetter(Instance::invert), Codec.BOOL.optionalFieldOf("invert", false).forGetter(Instance::invert),
playerPredicateCodec.forGetter(Instance::playerPredicate) playerPredicateCodec.forGetter(Instance::playerPredicate)
).apply(it, ::Instance) ).apply(it, ::Instance)

View File

@ -73,7 +73,7 @@ abstract class MCriterionTrigger<T : MCriterionTrigger<T>.AbstractInstance>(val
} }
abstract inner class AbstractInstance(val playerPredicate: Optional<ContextAwarePredicate>) : CriterionTriggerInstance { abstract inner class AbstractInstance(val playerPredicate: Optional<ContextAwarePredicate>) : CriterionTriggerInstance {
fun criterion() = this as T fun criterion() = Criterion(this as T)
override fun getCriterion(): ResourceLocation { override fun getCriterion(): ResourceLocation {
return id return id

View File

@ -13,7 +13,7 @@ class SingletonTrigger(id: ResourceLocation) : MCriterionTrigger<SingletonTrigge
} }
val empty = Instance() val empty = Instance()
val criterion = Criterion(this@SingletonTrigger, empty) val criterion = Criterion(empty)
inner class Instance(player: Optional<ContextAwarePredicate> = Optional.empty()) : AbstractInstance(player) inner class Instance(player: Optional<ContextAwarePredicate> = Optional.empty()) : AbstractInstance(player)
} }