More backporting
This commit is contained in:
parent
520112df77
commit
7683cacc29
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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}" }
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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!! })
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user