Skip to content

Commit 328c396

Browse files
committed
Load v1 Mod Remappers again
1 parent dace534 commit 328c396

File tree

13 files changed

+215
-335
lines changed

13 files changed

+215
-335
lines changed

Diff for: src/main/java/io/github/fabriccompatibilitylayers/modremappingapi/api/v2/ModCandidate.java

+1
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ public interface ModCandidate {
1818
byte @Nullable [] getAccessWidener();
1919
void setDestination(Path destination);
2020
@Nullable Path getDestination();
21+
void setPath(Path path);
2122
}

Diff for: src/main/java/io/github/fabriccompatibilitylayers/modremappingapi/api/v2/ModDiscovererConfig.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,23 @@ static Builder builder(String folderName) {
1717
Pattern getFileNameMatcher();
1818
boolean searchRecursively();
1919
Predicate<String> getDirectoryFilter();
20-
BiFunction<Path, List<String>, List<ModCandidate>> getCandidateCollector();
20+
Collector getCandidateCollector();
2121
boolean getExportToOriginalFolder();
22+
boolean allowDirectoryMods();
2223

2324
interface Builder {
2425
Builder fileNameMatcher(String pattern);
2526
Builder searchRecursively(boolean searchRecursively);
2627
Builder directoryFilter(Predicate<String> filter);
27-
Builder candidateCollector(BiFunction<Path, List<String>, List<ModCandidate>> collector);
28+
Builder candidateCollector(Collector collector);
2829
Builder exportToOriginalFolder(boolean exportToOriginalFolder);
30+
Builder allowDirectoryMods(boolean allowDirectoryMods);
2931

3032
ModDiscovererConfig build();
3133
}
34+
35+
@FunctionalInterface
36+
interface Collector {
37+
List<ModCandidate> collect(ModDiscovererConfig config, Path modPath, List<String> entries);
38+
}
3239
}

Diff for: src/main/java/io/github/fabriccompatibilitylayers/modremappingapi/impl/DefaultModCandidate.java

+16-4
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,20 @@
77
import java.nio.file.Path;
88

99
public class DefaultModCandidate implements ModCandidate {
10-
private final String id;
11-
private final Path path;
10+
private String sanitizedFileName, id;
11+
private Path path;
1212
private final ModDiscovererConfig discovererConfig;
1313
private Path destination;
1414

1515
public DefaultModCandidate(Path path, ModDiscovererConfig discovererConfig) {
16-
this.id = path.getFileName().toString().replace(".jar", "").replace(".zip", "").replace(" ", "_");
16+
this.sanitizedFileName = path.getFileName().toString().replace(" ", "_");
17+
this.id = this.sanitizedFileName.replace(".jar", "").replace(".zip", "");
1718
this.path = path;
1819
this.discovererConfig = discovererConfig;
20+
21+
if (!this.sanitizedFileName.endsWith(".jar") && !this.sanitizedFileName.endsWith(".zip")) {
22+
this.sanitizedFileName += ".zip";
23+
}
1924
}
2025

2126
@Override
@@ -55,7 +60,7 @@ public String getType() {
5560

5661
@Override
5762
public String getDestinationName() {
58-
return this.path.getFileName().toString();
63+
return this.sanitizedFileName;
5964
}
6065

6166
@Override
@@ -82,4 +87,11 @@ public void setDestination(Path destination) {
8287
public Path getDestination() {
8388
return this.destination;
8489
}
90+
91+
@Override
92+
public void setPath(Path path) {
93+
this.path = path;
94+
}
95+
96+
8597
}

Diff for: src/main/java/io/github/fabriccompatibilitylayers/modremappingapi/impl/ModDiscovererConfigImpl.java

+30-8
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,18 @@ public class ModDiscovererConfigImpl implements ModDiscovererConfig {
1818
private final Pattern fileNameMatcher;
1919
private final boolean searchRecursively;
2020
private final Predicate<String> directoryFilter;
21-
private final @Nullable BiFunction<Path, List<String>, List<ModCandidate>> candidateCollector;
21+
private final @Nullable Collector candidateCollector;
2222
private final boolean exportToOriginalFolder;
23+
private final boolean allowDirectoryMods;
2324

24-
private ModDiscovererConfigImpl(String folderName, Pattern fileNameMatcher, boolean searchRecursively, Predicate<String> directoryFilter, @Nullable BiFunction<Path, List<String>, List<ModCandidate>> candidateCollector, boolean exportToOriginalFolder) {
25+
private ModDiscovererConfigImpl(String folderName, Pattern fileNameMatcher, boolean searchRecursively, Predicate<String> directoryFilter, @Nullable Collector candidateCollector, boolean exportToOriginalFolder, boolean allowDirectoryMods) {
2526
this.folderName = folderName;
2627
this.fileNameMatcher = fileNameMatcher;
2728
this.searchRecursively = searchRecursively;
2829
this.directoryFilter = directoryFilter;
2930
this.candidateCollector = candidateCollector;
3031
this.exportToOriginalFolder = exportToOriginalFolder;
32+
this.allowDirectoryMods = allowDirectoryMods;
3133
}
3234

3335
@Override
@@ -51,7 +53,7 @@ public Predicate<String> getDirectoryFilter() {
5153
}
5254

5355
@Override
54-
public BiFunction<Path, List<String>, List<ModCandidate>> getCandidateCollector() {
56+
public Collector getCandidateCollector() {
5557
return this.candidateCollector == null ? this::defaultCandidateCollector : this.candidateCollector;
5658
}
5759

@@ -60,26 +62,32 @@ public boolean getExportToOriginalFolder() {
6062
return this.exportToOriginalFolder;
6163
}
6264

63-
private List<ModCandidate> defaultCandidateCollector(Path modPath, List<String> fileList) {
65+
private List<ModCandidate> defaultCandidateCollector(ModDiscovererConfig config, Path modPath, List<String> fileList) {
6466
List<ModCandidate> candidates = new ArrayList<>();
6567

6668
for (String file : fileList) {
6769
if (file.endsWith(".class")) {
68-
candidates.add(new DefaultModCandidate(modPath, this));
70+
candidates.add(new DefaultModCandidate(modPath, config));
6971
break;
7072
}
7173
}
7274

7375
return candidates;
7476
}
7577

78+
@Override
79+
public boolean allowDirectoryMods() {
80+
return allowDirectoryMods;
81+
}
82+
7683
public static class BuilderImpl implements ModDiscovererConfig.Builder {
7784
private final String folderName;
7885
private String fileNameMatcher = "(.+).jar$";
7986
private boolean searchRecursively = false;
8087
private Predicate<String> directoryFilter = s -> true;
81-
private BiFunction<Path, List<String>, List<ModCandidate>> candidateCollector;
88+
private Collector candidateCollector;
8289
private boolean exportToOriginalFolder = false;
90+
private boolean allowDirectoryMods = false;
8391

8492
public BuilderImpl(String folderName) {
8593
this.folderName = folderName;
@@ -104,7 +112,7 @@ public Builder directoryFilter(Predicate<String> filter) {
104112
}
105113

106114
@Override
107-
public Builder candidateCollector(BiFunction<Path, List<String>, List<ModCandidate>> collector) {
115+
public Builder candidateCollector(Collector collector) {
108116
this.candidateCollector = collector;
109117
return this;
110118
}
@@ -115,9 +123,23 @@ public Builder exportToOriginalFolder(boolean exportToOriginalFolder) {
115123
return this;
116124
}
117125

126+
@Override
127+
public Builder allowDirectoryMods(boolean allowDirectoryMods) {
128+
this.allowDirectoryMods = allowDirectoryMods;
129+
return this;
130+
}
131+
118132
@Override
119133
public ModDiscovererConfig build() {
120-
return new ModDiscovererConfigImpl(folderName, Pattern.compile(fileNameMatcher), searchRecursively, directoryFilter, candidateCollector, exportToOriginalFolder);
134+
return new ModDiscovererConfigImpl(
135+
folderName,
136+
Pattern.compile(fileNameMatcher),
137+
searchRecursively,
138+
directoryFilter,
139+
candidateCollector,
140+
exportToOriginalFolder,
141+
allowDirectoryMods
142+
);
121143
}
122144
}
123145
}

Diff for: src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModCandidate.java

-26
This file was deleted.

Diff for: src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModRemapper.java renamed to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/compatibility/V1DefaultModRemapper.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.github.fabriccompatibiltylayers.modremappingapi.impl;
1+
package io.github.fabriccompatibiltylayers.modremappingapi.impl.compatibility;
22

33
import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingBuilder;
44
import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper;
@@ -8,10 +8,10 @@
88

99
import java.util.List;
1010

11-
public class DefaultModRemapper implements ModRemapper {
11+
public class V1DefaultModRemapper implements ModRemapper {
1212
@Override
1313
public String[] getJarFolders() {
14-
return new String[] {"mods"};
14+
return new String[]{"mods"};
1515
}
1616

1717
@Override

Diff for: src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/v1/ModRemapperV1Context.java

+106-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package io.github.fabriccompatibiltylayers.modremappingapi.impl.context.v1;
22

33
import fr.catcore.modremapperapi.utils.Constants;
4+
import io.github.fabriccompatibilitylayers.modremappingapi.api.v2.ModCandidate;
5+
import io.github.fabriccompatibilitylayers.modremappingapi.api.v2.ModDiscovererConfig;
6+
import io.github.fabriccompatibilitylayers.modremappingapi.impl.DefaultModCandidate;
47
import io.github.fabriccompatibilitylayers.modremappingapi.impl.InternalCacheHandler;
58
import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingBuilder;
69
import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper;
@@ -9,20 +12,24 @@
912
import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.BaseModRemapperContext;
1013
import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.MappingsRegistryInstance;
1114
import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.MixinData;
15+
import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.v2.V2ModDiscoverer;
1216
import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry;
1317
import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.ModTrRemapper;
1418
import io.github.fabriccompatibilitylayers.modremappingapi.api.v2.RemappingFlags;
1519
import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.SoftLockFixer;
1620
import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor;
21+
import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils;
1722
import net.fabricmc.loader.api.FabricLoader;
18-
import net.fabricmc.loader.impl.launch.FabricLauncherBase;
1923
import net.fabricmc.tinyremapper.TinyRemapper;
2024

2125
import java.io.IOException;
2226
import java.io.InputStream;
27+
import java.net.URISyntaxException;
28+
import java.nio.file.Files;
2329
import java.nio.file.Path;
2430
import java.util.*;
2531
import java.util.function.Supplier;
32+
import java.util.stream.Collectors;
2633

2734
public class ModRemapperV1Context extends BaseModRemapperContext<ModRemapper> {
2835
private final Set<RemappingFlags> remapFlags = new HashSet<>();
@@ -31,7 +38,6 @@ public class ModRemapperV1Context extends BaseModRemapperContext<ModRemapper> {
3138
private final InternalCacheHandler cacheHandler = new V1CacheHandler();
3239
private final MappingsRegistryInstance mappingsRegistry = new MappingsRegistryInstance(cacheHandler);
3340
private final LibraryHandler libraryHandler = new LibraryHandler();
34-
private final V1ModDiscoverer modDiscoverer = new V1ModDiscoverer();
3541

3642
public static ModRemapperV1Context INSTANCE;
3743

@@ -79,7 +85,7 @@ public void init() {
7985
this.mappingsRegistry.generateAdditionalMappings();
8086
}
8187

82-
public void remapMods(Map<io.github.fabriccompatibilitylayers.modremappingapi.api.v2.ModCandidate, Path> pathMap) {
88+
public void remapMods(Map<ModCandidate, Path> pathMap) {
8389
Constants.MAIN_LOGGER.debug("Starting jar remapping!");
8490
SoftLockFixer.preloadClasses();
8591
TinyRemapper remapper = ModTrRemapper.makeRemapper(this);
@@ -95,23 +101,115 @@ public void afterRemap() {
95101
remappers.forEach(ModRemapper::afterRemap);
96102
}
97103

104+
private List<ModCandidate> collectCandidates(ModDiscovererConfig config, Path modPath, List<String> entries) {
105+
boolean fabric = false;
106+
boolean hasClass = false;
107+
108+
for (String entry : entries) {
109+
if (entry.endsWith("fabric.mod.json") || entry.endsWith("quilt.mod.json") || entry.endsWith("quilt.mod.json5")) {
110+
fabric = true;
111+
break;
112+
}
113+
114+
if (entry.endsWith(".class")) {
115+
hasClass = true;
116+
}
117+
}
118+
119+
List<ModCandidate> list = new ArrayList<>();
120+
121+
if (hasClass && !fabric) {
122+
list.add(new DefaultModCandidate(modPath, config));
123+
}
124+
125+
return list;
126+
}
127+
98128
@Override
99129
public List<ModRemapper> discoverMods(boolean remapClassEdits) {
100-
Map<ModCandidate, Path> modPaths = this.modDiscoverer.init(remappers, remapClassEdits, this);
130+
Map<String, List<String>> excluded = new HashMap<>();
131+
132+
Set<String> modFolders = new HashSet<>();
101133

102-
for (ModCandidate candidate : modPaths.keySet()) {
103-
mappingsRegistry.addModMappings(candidate.original);
134+
for (ModRemapper remapper : remappers) {
135+
Collections.addAll(modFolders, remapper.getJarFolders());
136+
137+
if (remapper instanceof V0ModRemapper) {
138+
excluded.putAll(((V0ModRemapper) remapper).getExclusions());
139+
}
140+
}
141+
142+
List<ModCandidate> candidates = new ArrayList<>();
143+
Map<ModDiscovererConfig, V2ModDiscoverer> config2Discoverer = new HashMap<>();
144+
145+
for (String modFolder : modFolders) {
146+
ModDiscovererConfig config = ModDiscovererConfig.builder(modFolder)
147+
.fileNameMatcher("(.+).(jar|zip)$")
148+
.candidateCollector(this::collectCandidates)
149+
.build();
150+
V2ModDiscoverer discoverer = new V2ModDiscoverer(config);
151+
config2Discoverer.put(config, discoverer);
152+
candidates.addAll(discoverer.collect());
153+
}
154+
155+
try {
156+
this.handleV0Excluded(candidates, excluded);
157+
} catch (IOException | URISyntaxException e) {
158+
throw new RuntimeException(e);
159+
}
160+
161+
Map<ModDiscovererConfig, List<ModCandidate>> config2Candidates =
162+
candidates.stream().collect(Collectors.groupingBy(ModCandidate::getDiscovererConfig));
163+
164+
for (Map.Entry<ModDiscovererConfig, List<ModCandidate>> entry : config2Candidates.entrySet()) {
165+
ModDiscovererConfig config = entry.getKey();
166+
167+
try {
168+
config2Discoverer.get(config).excludeClassEdits(entry.getValue(), this.cacheHandler, this.mappingsRegistry);
169+
} catch (IOException | URISyntaxException e) {
170+
throw new RuntimeException(e);
171+
}
172+
}
173+
174+
for (ModCandidate candidate : candidates) {
175+
mappingsRegistry.addModMappings(candidate.getPath());
104176
}
105177

106178
mappingsRegistry.generateModMappings();
107179

108-
// this.remapMods(modPaths);
180+
Map<ModCandidate, Path> candidateToOutput = new HashMap<>();
109181

110-
modPaths.values().forEach(FabricLauncherBase.getLauncher()::addToClassPath);
182+
for (Map.Entry<ModDiscovererConfig, List<ModCandidate>> entry : config2Candidates.entrySet()) {
183+
ModDiscovererConfig config = entry.getKey();
184+
185+
candidateToOutput.putAll(
186+
config2Discoverer.get(config).computeDestinations(entry.getValue(), this.cacheHandler)
187+
);
188+
}
189+
190+
if (!candidateToOutput.isEmpty()) this.remapMods(candidateToOutput);
191+
192+
// modPaths.values().forEach(FabricLauncherBase.getLauncher()::addToClassPath);
111193

112194
return new ArrayList<>();
113195
}
114196

197+
private void handleV0Excluded(List<ModCandidate> mods, Map<String, List<String>> excludedMap) throws IOException, URISyntaxException {
198+
for (ModCandidate modCandidate : mods) {
199+
if (excludedMap.containsKey(modCandidate.getId())) {
200+
if (Files.isDirectory(modCandidate.getPath())) {
201+
for (String excluded : excludedMap.get(modCandidate.getId())) {
202+
if (Files.deleteIfExists(modCandidate.getPath().resolve(excluded))) {
203+
Constants.MAIN_LOGGER.debug("File deleted: " + modCandidate.getPath().resolve(excluded));
204+
}
205+
}
206+
} else {
207+
FileUtils.removeEntriesFromZip(modCandidate.getPath(), excludedMap.get(modCandidate.getId()));
208+
}
209+
}
210+
}
211+
}
212+
115213
private static final String v0EntrypointName = "mod-remapper-api:modremapper";
116214
private static final String v1EntrypointName = "mod-remapper-api:modremapper_v1";
117215

0 commit comments

Comments
 (0)