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.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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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!! })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user