Forge seemingly removed its lootpool deserializer patches

This commit is contained in:
DBotThePony 2023-06-09 14:28:53 +07:00
parent 3fca6e0694
commit 926b9a2a17
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -43,35 +43,14 @@ class LootPoolAppender(conditions: Array<out LootItemCondition>, pools: Stream<L
companion object { companion object {
private val lootPoolCodec: Codec<List<LootPool>> 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 { init {
val serializer = Deserializers.createLootTableSerializer().create() val serializer = Deserializers.createLootTableSerializer().create()
val notExistingLocation = ResourceLocation("null", "null")
lootPoolCodec = Codec.list(Codec.PASSTHROUGH.flatXmap({ 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 { try {
deque.push(lootTableContextConstructor.newInstance(notExistingLocation, true))
DataResult.success(serializer.fromJson(it.convert(JsonOps.INSTANCE).value, LootPool::class.java)) DataResult.success(serializer.fromJson(it.convert(JsonOps.INSTANCE).value, LootPool::class.java))
} catch(err: JsonSyntaxException) { } catch(err: JsonSyntaxException) {
DataResult.error { err.message } DataResult.error { err.message }
} finally {
deque.pop()
} }
}, { }, {
try { try {