1
1
package dev .su5ed .sinytra .connector .locator ;
2
2
3
+ import com .google .common .collect .BiMap ;
4
+ import com .google .common .collect .HashBiMap ;
5
+ import com .google .common .collect .Multimap ;
3
6
import com .mojang .logging .LogUtils ;
4
7
import dev .su5ed .sinytra .connector .loader .ConnectorEarlyLoader ;
5
8
import dev .su5ed .sinytra .connector .transformer .JarTransformer ;
21
24
22
25
import java .nio .file .Path ;
23
26
import java .nio .file .Paths ;
27
+ import java .util .ArrayList ;
28
+ import java .util .Collection ;
24
29
import java .util .Collections ;
25
- import java .util .HashMap ;
26
30
import java .util .List ;
27
31
import java .util .Map ;
28
32
import java .util .Objects ;
@@ -37,28 +41,23 @@ public final class DependencyResolver {
37
41
public static final VersionOverrides VERSION_OVERRIDES = new VersionOverrides ();
38
42
public static final DependencyOverrides DEPENDENCY_OVERRIDES = new DependencyOverrides (FMLPaths .CONFIGDIR .get ());
39
43
40
- public static List <JarTransformer .TransformableJar > resolveDependencies (List < JarTransformer .TransformableJar > jars , Iterable <IModFile > loadedMods ) {
41
- Map < ModCandidate , JarTransformer .TransformableJar > candidateToJar = new HashMap <> ();
44
+ public static List <JarTransformer .TransformableJar > resolveDependencies (Collection < JarTransformer . TransformableJar > keys , Multimap < JarTransformer . TransformableJar , JarTransformer .TransformableJar > jars , Iterable <IModFile > loadedMods ) {
45
+ BiMap < JarTransformer .TransformableJar , ModCandidate > jarToCandidate = HashBiMap . create ();
42
46
// Fabric candidates
43
- Stream <ModCandidate > candidates = jars .stream ()
44
- .map (jar -> {
45
- ModCandidate candidate = ModCandidate .createPlain (List .of (jar .modPath ().path ()), jar .modPath ().metadata ().modMetadata (), false , List .of ());
46
- candidateToJar .put (candidate , jar );
47
- return candidate ;
48
- });
47
+ List <ModCandidate > candidates = createCandidatesRecursive (keys , jars , jarToCandidate );
49
48
// Forge dependencies
50
49
Stream <ModCandidate > forgeCandidates = StreamSupport .stream (loadedMods .spliterator (), false )
51
50
.flatMap (modFile -> modFile .getModFileInfo () != null ? modFile .getModInfos ().stream () : Stream .empty ())
52
51
.map (modInfo -> ModCandidate .createPlain (List .of (modInfo .getOwningFile ().getFile ().getFilePath ()), new BuiltinMetadataWrapper (new FMLModMetadata (modInfo )), false , List .of ()));
53
52
Stream <ModCandidate > builtinCandidates = Stream .of (createJavaMod (), createFabricLoaderMod ());
54
53
// Merge
55
- List <ModCandidate > allCandidates = Stream .of (candidates , forgeCandidates , builtinCandidates ).flatMap (Function .identity ()).toList ();
54
+ List <ModCandidate > allCandidates = Stream .of (candidates . stream () , forgeCandidates , builtinCandidates ).flatMap (Function .identity ()).toList ();
56
55
57
56
EnvType envType = FabricLoader .getInstance ().getEnvironmentType ();
58
57
try {
59
58
List <ModCandidate > resolved = ModResolver .resolve (allCandidates , envType , Map .of ());
60
59
List <JarTransformer .TransformableJar > candidateJars = resolved .stream ()
61
- .map (candidateToJar ::get )
60
+ .map (jarToCandidate . inverse () ::get )
62
61
.filter (Objects ::nonNull )
63
62
.toList ();
64
63
LOGGER .info ("Dependency resolution found {} candidates to load" , candidateJars .size ());
@@ -68,6 +67,24 @@ public static List<JarTransformer.TransformableJar> resolveDependencies(List<Jar
68
67
}
69
68
}
70
69
70
+ private static List <ModCandidate > createCandidatesRecursive (Collection <JarTransformer .TransformableJar > candidateJars , Multimap <JarTransformer .TransformableJar , JarTransformer .TransformableJar > parentsToChildren , Map <JarTransformer .TransformableJar , ModCandidate > jarToCandidate ) {
71
+ List <ModCandidate > candidates = new ArrayList <>();
72
+ for (JarTransformer .TransformableJar candidateJar : candidateJars ) {
73
+ ModCandidate candidate = jarToCandidate .computeIfAbsent (candidateJar , j -> {
74
+ Collection <JarTransformer .TransformableJar > children = parentsToChildren .containsKey (candidateJar ) ? parentsToChildren .get (candidateJar ) : List .of ();
75
+ List <ModCandidate > childCandidates = createCandidatesRecursive (children , parentsToChildren , jarToCandidate );
76
+ List <Path > paths = parentsToChildren .containsValue (candidateJar ) ? null : List .of (candidateJar .modPath ().path ());
77
+ ModCandidate parent = ModCandidate .createPlain (paths , candidateJar .modPath ().metadata ().modMetadata (), false , childCandidates );
78
+ for (ModCandidate childCandidate : childCandidates ) {
79
+ childCandidate .addParent (parent );
80
+ }
81
+ return parent ;
82
+ });
83
+ candidates .add (candidate );
84
+ }
85
+ return candidates ;
86
+ }
87
+
71
88
private static ModCandidate createJavaMod () {
72
89
ModMetadata metadata = new BuiltinModMetadata .Builder ("java" , System .getProperty ("java.specification.version" ).replaceFirst ("^1\\ ." , "" ))
73
90
.setName (System .getProperty ("java.vm.name" ))
0 commit comments