Revert "Forge seemingly removed its lootpool deserializer patches"
This reverts commit 926b9a2a17
.
This commit is contained in:
parent
d7e62690e1
commit
0648667480
@ -43,14 +43,35 @@ 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 {
|
||||
|
Loading…
Reference in New Issue
Block a user