Origins (Forge)

Origins (Forge)

7M Downloads

[1.19-1.5.0.5] Crash due to improper use of Stream.sorted()

RaymondBlaze opened this issue ยท 1 comments

commented

Log: https://pastebin.com/xUMSD8cn

Some stack trace:

Caused by: java.lang.ClassCastException: class net.minecraft.core.Holder$Reference cannot be cast to class java.lang.Comparable (net.minecraft.core.Holder$Reference is in module [email protected] of loader 'TRANSFORMER' @2aa7399c; java.lang.Comparable is in module java.base of loader 'bootstrap')
	at java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:47) ~[?:?]
	at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) ~[?:?]
	at java.util.TimSort.sort(TimSort.java:220) ~[?:?]
	at java.util.Arrays.sort(Arrays.java:1307) ~[?:?]
	at java.util.ArrayList.sort(ArrayList.java:1721) ~[?:?]
	at java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:392) ~[?:?]
	at java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[?:?]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510) ~[?:?]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) ~[?:?]
	at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) ~[?:?]
	at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) ~[?:?]
	at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) ~[?:?]
	at java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) ~[?:?]
	at io.github.edwinmindcraft.origins.api.OriginsAPI.getActiveLayers(OriginsAPI.java:52) ~[origins-forge-1.19.2-1.5.0.5_mapped_parchment_2022.08.14-1.19.2.jar%23193!/:1.19.2-1.5.0.5]
	at io.github.edwinmindcraft.origins.api.capabilities.IOriginContainer.hasAllOrigins(IOriginContainer.java:151) ~[origins-forge-1.19.2-1.5.0.5_mapped_parchment_2022.08.14-1.19.2.jar%23193!/:1.19.2-1.5.0.5]
	at io.github.edwinmindcraft.origins.common.capabilities.OriginContainer.serializeNBT(OriginContainer.java:304) ~[origins-forge-1.19.2-1.5.0.5_mapped_parchment_2022.08.14-1.19.2.jar%23193!/:1.19.2-1.5.0.5]
	at net.minecraftforge.common.capabilities.CapabilityDispatcher.serializeNBT(CapabilityDispatcher.java:115) ~[forge-1.19.2-43.0.19_mapped_parchment_2022.08.14-1.19.2-recomp.jar%23182%23189!/:?]
	at net.minecraftforge.common.capabilities.CapabilityProvider.serializeCaps(CapabilityProvider.java:131) ~[forge-1.19.2-43.0.19_mapped_parchment_2022.08.14-1.19.2-recomp.jar%23182%23189!/:?]
	at net.minecraft.world.entity.Entity.saveWithoutId(Entity.java:1660) ~[forge-1.19.2-43.0.19_mapped_parchment_2022.08.14-1.19.2-recomp.jar%23183!/:?]
	... 7 more

Wrong Code:

public static List<Holder.Reference<OriginLayer>> getActiveLayers() {
    return getLayersRegistry().holders().filter(x -> x.isBound() && x.value().enabled()).sorted().toList();
}

Apparently, OriginLayer implements Comparable but Holder.Reference does not, using Stream.sorted() will throw the ClassCastException above.

Solution:

public static List<Holder.Reference<OriginLayer>> getActiveLayers() {
    return getLayersRegistry().holders()
        .filter(x -> x.isBound() && x.value().enabled())
        .sorted(Comparator.comparing(Holder::get, OriginLayer::compareTo))
        .toList();
}
commented

Right, it didn't crash because I only had one active layer.
Will add it to the fixes I'm planning for .6.