22
22
*/
23
23
package com .falsepattern .lib .mixin ;
24
24
25
+ import com .falsepattern .lib .DeprecationDetails ;
25
26
import com .falsepattern .lib .StableAPI ;
26
27
import com .falsepattern .lib .util .FileUtil ;
27
28
import lombok .val ;
40
41
import java .nio .file .Paths ;
41
42
import java .util .ArrayList ;
42
43
import java .util .Arrays ;
44
+ import java .util .Collections ;
45
+ import java .util .HashSet ;
43
46
import java .util .List ;
44
47
import java .util .Set ;
45
48
import java .util .function .Predicate ;
@@ -57,6 +60,8 @@ static Logger createLogger(String modName) {
57
60
return LogManager .getLogger (modName + " Mixin Loader" );
58
61
}
59
62
63
+ @ Deprecated
64
+ @ DeprecationDetails (deprecatedSince = "1.4.0" )
60
65
@ StableAPI .Expose
61
66
static File findJarOf (final ITargetedMod mod ) {
62
67
File result = null ;
@@ -83,6 +88,32 @@ static File findJarOf(final ITargetedMod mod) {
83
88
return result ;
84
89
}
85
90
91
+ @ StableAPI .Expose (since = "1.4.0" )
92
+ static Set <File > findJarsOf (IMixinPlugin self , final ITargetedMod mod ) {
93
+ if (!self .useNewFindJar ()) {
94
+ val jar = findJarOf (mod );
95
+ return jar == null ? Collections .emptySet () : Set .of (jar );
96
+ }
97
+ val results = new HashSet <File >();
98
+ try (val stream = walk (MODS_DIRECTORY_PATH )) {
99
+ results .addAll (stream .filter (mod ::isMatchingJar ).map (Path ::toFile ).toList ());
100
+ } catch (Exception e ) {
101
+ e .printStackTrace ();
102
+ }
103
+ for (URL url : Launch .classLoader .getURLs ()) {
104
+ try {
105
+ String file = url .getFile ();
106
+ Path path = Paths .get (file );
107
+ if (mod .isMatchingJar (path )) {
108
+ results .add (path .toFile ());
109
+ break ;
110
+ }
111
+ } catch (Exception ignored ) {
112
+ }
113
+ }
114
+ return results ;
115
+ }
116
+
86
117
@ StableAPI .Expose
87
118
Logger getLogger ();
88
119
@@ -92,6 +123,11 @@ static File findJarOf(final ITargetedMod mod) {
92
123
@ StableAPI .Expose
93
124
ITargetedMod [] getTargetedModEnumValues ();
94
125
126
+ @ StableAPI .Expose (since = "1.4.0" )
127
+ default boolean useNewFindJar () {
128
+ return false ;
129
+ }
130
+
95
131
@ Override
96
132
@ StableAPI .Expose (since = "__INTERNAL__" )
97
133
default void onLoad (String mixinPackage ) {
@@ -126,8 +162,9 @@ default List<String> getMixins() {
126
162
.filter (new Predicate <ITargetedMod >() {
127
163
@ Override
128
164
public boolean test (ITargetedMod mod ) {
165
+ boolean loadJar = IMixinPlugin .this .loadJarOf (mod );
129
166
return (mod .isLoadInDevelopment () && isDevelopmentEnvironment )
130
- || IMixinPlugin . this . loadJarOf ( mod ) ;
167
+ || loadJar ;
131
168
}
132
169
})
133
170
.collect (Collectors .toList ());
@@ -153,24 +190,24 @@ public boolean test(ITargetedMod mod) {
153
190
154
191
@ StableAPI .Expose (since = "__INTERNAL__" )
155
192
default boolean loadJarOf (final ITargetedMod mod ) {
156
- boolean success = false ;
157
193
try {
158
- File jar = findJarOf ( mod );
159
- if (jar == null ) {
160
- getLogger ().info ("Jar not found for " + mod );
194
+ val jars = findJarsOf ( this , mod );
195
+ if (jars . isEmpty () ) {
196
+ getLogger ().info ("Jar not found for {}" , mod );
161
197
return false ;
162
198
}
163
- getLogger ().info ("Attempting to add " + jar + " to the URL Class Path" );
164
- success = true ;
165
- if (!jar .exists ()) {
166
- success = false ;
167
- throw new FileNotFoundException (jar .toString ());
199
+ for (val jar : jars ) {
200
+ getLogger ().info ("Attempting to add {} to the URL Class Path" , jar );
201
+ try {
202
+ MinecraftURLClassPath .addJar (jar );
203
+ } catch (Throwable e ) {
204
+ e .printStackTrace ();
205
+ }
168
206
}
169
- MinecraftURLClassPath .addJar (jar );
170
207
} catch (Throwable e ) {
171
208
e .printStackTrace ();
172
209
}
173
- return success ;
210
+ return true ;
174
211
}
175
212
176
213
@ StableAPI .Expose (since = "__INTERNAL__" )
0 commit comments