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 {
|
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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user