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.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<Pair<Ingredient, Int>> {
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)
}

View File

@ -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
}

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
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<out LootItemCondition>, pools: Stream<L
}
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> =
RecordCodecBuilder.create {
codecStart(it).and(
LootPool.CODEC.listOf().fieldOf("pools").forGetter(LootPoolAppender::pools)
lootPoolCodec.fieldOf("pools").forGetter(LootPoolAppender::pools)
).apply(it, ::LootPoolAppender)
}
}

View File

@ -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()

View File

@ -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!! })
}
}

View File

@ -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<HurtTrigger.Instance
val damagePredicate: Optional<DamagePredicate> = 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<ContextAwarePredicate> = Optional.empty()
) : AbstractInstance(player)

View File

@ -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<ItemTrigger.Instance>(id) {
@ -16,7 +17,7 @@ class ItemTrigger(id: ResourceLocation) : MCriterionTrigger<ItemTrigger.Instance
override val codec: Codec<Instance> = 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)

View File

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

View File

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