Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import net.neoforged.moddevgradle.internal.RunGameTask
plugins {
java
`maven-publish`
id("net.neoforged.moddev") version "2.0.78"
id("com.gradleup.shadow") version "9.0.0-beta12" apply false
id("net.neoforged.moddev") version "2.0.140"
id("com.gradleup.shadow") version "9.3.1" apply false
id("me.modmuss50.mod-publish-plugin") version "0.5.+"
id("net.neoforged.gradleutils") version "3.0.0"
id("net.neoforged.gradleutils") version "5.1.0"
id("org.sinytra.adapter.userdev") version "1.2.1-SNAPSHOT"
}

val versionConnector: String by project
val versionAdapterDefinition: String by project
val versionAdapterCore: String by project
val versionAdapterRuntime: String by project
val versionMc: String by project
val versionNeoForge: String by project
Expand Down Expand Up @@ -131,7 +131,7 @@ dependencies {
shade(group = "org.sinytra", name = "forgified-fabric-loader", version = versionForgifiedFabricLoader)
shade(group = "net.fabricmc", name = "access-widener", version = versionAccessWidener) { isTransitive = false }
shade(group = "org.sinytra", name = "ForgeAutoRenamingTool", version = versionForgeAutoRenamingTool) { isTransitive = false }
shade(group = "org.sinytra.adapter", name = "definition", version = versionAdapterDefinition) { isTransitive = false }
shade(group = "org.sinytra.adapter", name = "core", version = versionAdapterCore) { isTransitive = false }
shade(project(":transformer")) { isTransitive = false }

jarJar(implementation(group = "org.sinytra.adapter", name = "runtime", version = versionAdapterRuntime))
Expand All @@ -141,7 +141,7 @@ dependencies {

"modCompileOnly"(sourceSets.main.get().output)

implementation("curse.maven:connector-extras-913445:5618470")
// implementation("curse.maven:connector-extras-913445:5618470")
}

val modJar: Jar by tasks.creating(Jar::class) {
Expand Down
10 changes: 5 additions & 5 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,18 @@ org.gradle.caching=true
#org.gradle.configuration-cache=true

# Versions
versionConnector=2.0.0-beta.12
versionAdapterDefinition=1.13.58+1.21.1
versionConnector=2.0.0-beta.13
versionAdapterCore=2.0.25+1.21.1
versionAdapterRuntime=1.0.0+1.21.1

versionMc=1.21.1
versionNeoForge=21.1.208
versionNeoForge=21.1.219
versionParchmentMc=1.21.1
versionParchment=2024.11.17
versionForgeAutoRenamingTool=1.0.14
versionForgifiedFabricLoader=2.5.55+0.17.2+1.21.1
versionForgifiedFabricLoader=2.5.68+0.18.4+1.21.1
versionAccessWidener=2.1.0
versionForgifiedFabricApi=0.115.6+2.1.1+1.21.1
versionForgifiedFabricApi=0.116.7+2.2.1+1.21.1

# Publishing
curseForgeId=890127
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/sinytra/connector/ConnectorCoremods.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TypeInsnNode;
import org.objectweb.asm.tree.VarInsnNode;
import org.sinytra.adapter.patch.analysis.locals.LocalVariableLookup;
import org.sinytra.adapter.analysis.locals.LocalVariableLookup;
import org.slf4j.Logger;

import java.util.List;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/org/sinytra/connector/ConnectorEarlyLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.sinytra.connector.util.ConnectorUtil;
import org.slf4j.Logger;

import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
Expand All @@ -25,6 +26,7 @@ public class ConnectorEarlyLoader {
// A list of modids that use the connector language provider
private static final Set<String> CONNECTOR_MODIDS = new HashSet<>();
private static final List<IModInfo> CONNECTOR_MODS = new ArrayList<>();
private static final List<Path> CONNECTOR_MOD_PATHS = new ArrayList<>();
// If we encounter an exception during setup/load, we store it here and throw it later during FML mod loading,
// so that it is propagated to the forge error screen.
private static final List<ModLoadingIssue> LOADING_EXCEPTIONS = new ArrayList<>();
Expand Down Expand Up @@ -90,6 +92,14 @@ public static ModLoadingIssue createLoadingIssue(Throwable original, String mess
return new ModLoadingIssue(ModLoadingIssue.Severity.ERROR, message, Arrays.asList(args), keepOriginal ? original : null, null, null, null);
}

public static void addConnectorModPath(Path path) {
CONNECTOR_MOD_PATHS.add(path);
}

public static boolean isConnectorMod(Path path) {
return CONNECTOR_MOD_PATHS.contains(path);
}

/**
* Run initial fabric loader setup. Any exceptions thrown are ignored and re-thrown later during FML load.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public ConnectorFabricModMetadata(LoaderModMetadata wrapped) {
* Adjust version to accomodate Java Module System requirements
*/
private static String normalizeVersion(String version) {
return version.replace("+", "");
return version.replace("+", "_");
}

public String getNormalizedVersion() {
Expand Down Expand Up @@ -74,8 +74,8 @@ public Collection<String> getMixinConfigs(EnvType type) {
}

@Override
public String getAccessWidener() {
return this.wrapped.getAccessWidener();
public String getClassTweaker() {
return this.wrapped.getClassTweaker();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ public void scanMods(List<IModFile> loadedMods, IDiscoveryPipeline pipeline) {
LocationResult results = locateFabricMods(loadedMods);
if (results != null) {
results.mods().forEach(pipeline::addModFile);
results.originalPaths().forEach(ConnectorEarlyLoader::addConnectorModPath);

// Create mod file for generated adapter mixins jar
Path generatedAdapterJar = results.generatedJarPath();
Expand Down Expand Up @@ -163,7 +164,8 @@ private LocationResult locateFabricMods(List<IModFile> discoveredMods) {
List<SplitPackageMerger.FilteredModPath> moduleSafeJars = SplitPackageMerger.mergeSplitPackages(transformed.stream().map(JarTransformer.TransformedFabricModPath::output).toList(), loadedModFiles, ignoredModFiles);

List<IModFile> loadedMods = moduleSafeJars.stream().map(ConnectorLocator::createConnectorModFile).toList();
return new LocationResult(loadedMods, environment.getGeneratedJarPath());
List<Path> originalPaths = transformed.stream().map(JarTransformer.TransformedFabricModPath::input).toList();
return new LocationResult(loadedMods, originalPaths, environment.getGeneratedJarPath());
}

private static IModFile createConnectorModFile(SplitPackageMerger.FilteredModPath modPath) {
Expand Down Expand Up @@ -276,5 +278,5 @@ private static void loadEmbeddedJars(IDiscoveryPipeline pipeline) throws Excepti
private record SimpleModInfo(String modid, ArtifactVersion version, boolean library, @Nullable IModFile origin, @Nullable String moduleName) {
}

private record LocationResult(List<IModFile> mods, Path generatedJarPath) {}
private record LocationResult(List<IModFile> mods, List<Path> originalPaths, Path generatedJarPath) {}
}
62 changes: 41 additions & 21 deletions src/main/java/org/sinytra/connector/locator/DependencyResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
import com.google.common.collect.HashBiMap;
import com.google.common.collect.Multimap;
import com.mojang.logging.LogUtils;
import cpw.mods.jarhandling.SecureJar;
import net.fabricmc.api.EnvType;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.Version;
import net.fabricmc.loader.api.VersionParsingException;
import net.fabricmc.loader.api.metadata.ModDependency;
import net.fabricmc.loader.api.metadata.ModMetadata;
Expand All @@ -17,35 +19,29 @@
import net.fabricmc.loader.impl.discovery.ModResolutionException;
import net.fabricmc.loader.impl.discovery.ModResolver;
import net.fabricmc.loader.impl.game.GameProvider;
import net.fabricmc.loader.impl.metadata.BuiltinModMetadata;
import net.fabricmc.loader.impl.metadata.DependencyOverrides;
import net.fabricmc.loader.impl.metadata.LoaderModMetadata;
import net.fabricmc.loader.impl.metadata.ModDependencyImpl;
import net.fabricmc.loader.impl.metadata.VersionOverrides;
import net.fabricmc.loader.impl.metadata.*;
import net.fabricmc.loader.impl.util.version.VersionParser;
import net.neoforged.fml.ModLoadingException;
import net.neoforged.fml.loading.FMLPaths;
import net.neoforged.neoforgespi.locating.IModFile;
import org.jetbrains.annotations.Nullable;
import org.sinytra.connector.ConnectorEarlyLoader;
import org.sinytra.connector.transformer.jar.JarTransformer;
import org.sinytra.connector.util.ConnectorConfig;
import org.slf4j.Logger;

import java.lang.module.ModuleDescriptor;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Stream;

import static cpw.mods.modlauncher.api.LambdaExceptionUtils.uncheck;

public final class DependencyResolver {
private static final String MIXINEXTRAS_MODID = "mixinextras";
private static final Logger LOGGER = LogUtils.getLogger();
public static final VersionOverrides VERSION_OVERRIDES = new VersionOverrides();
public static final Supplier<DependencyOverrides> DEPENDENCY_OVERRIDES = Suppliers.memoize(() -> loadConfigFile("fabric_loader_dependencies.json", () -> new DependencyOverrides(FMLPaths.CONFIGDIR.get())));
Expand All @@ -60,7 +56,8 @@ public static List<JarTransformer.TransformableJar> resolveDependencies(Collecti
Stream<ModCandidateImpl> forgeCandidates = loadedMods.stream()
.flatMap(modFile -> modFile.getModFileInfo() != null ? modFile.getModInfos().stream() : Stream.empty())
.map(modInfo -> ModCandidateImpl.createPlain(List.of(modInfo.getOwningFile().getFile().getFilePath()), new BuiltinMetadataWrapper(new FMLModMetadata(modInfo)), false, List.of()));
Stream<ModCandidateImpl> builtinCandidates = Stream.of(createJavaMod(), createFabricLoaderMod());
Stream<ModCandidateImpl> builtinCandidates = Stream.of(createJavaMod(), createFabricLoaderMod(), createMixinExtrasMod(loadedMods))
.filter(Objects::nonNull);
// Merge
List<ModCandidateImpl> allCandidates = Stream.of(candidates.stream(), forgeCandidates, builtinCandidates).flatMap(Function.identity()).toList();

Expand Down Expand Up @@ -135,26 +132,49 @@ private static ModCandidateImpl createFabricLoaderMod() {
final String[] components = version.split("\\.");
version = components[0] + "." + components[1] + ".*";
}
ModMetadata metadata;

try {
metadata = new BuiltinModMetadata.Builder("fabricloader", VersionParser.parse(version, true))
.setName("Fabric Loader")
.build();
} catch (VersionParsingException e) {
throw new RuntimeException(e);
}

ModMetadata metadata = new BuiltinModMetadata.Builder("fabricloader", parseVersionUnchecked(version))
.setName("Fabric Loader")
.build();
GameProvider.BuiltinMod builtinMod = new GameProvider.BuiltinMod(Collections.singletonList(Path.of(uncheck(() -> FabricLoader.class.getProtectionDomain().getCodeSource().getLocation().toURI()))), metadata);

return ModCandidateImpl.createBuiltin(builtinMod, VERSION_OVERRIDES, DEPENDENCY_OVERRIDES.get());
}

@Nullable
private static ModCandidateImpl createMixinExtrasMod(Collection<IModFile> loadedMods) {
SecureJar mixinExJar = loadedMods.stream()
.map(IModFile::getSecureJar)
.filter(j -> j.name().contains(MIXINEXTRAS_MODID))
.findFirst()
.orElse(null);
if (mixinExJar == null) return null;

String version = mixinExJar.moduleDataProvider().descriptor().version()
.map(ModuleDescriptor.Version::toString)
.orElse(null);

ModMetadata metadata = new BuiltinModMetadata.Builder(MIXINEXTRAS_MODID, parseVersionUnchecked(version))
.setName(mixinExJar.name())
.build();
GameProvider.BuiltinMod builtinMod = new GameProvider.BuiltinMod(List.of(mixinExJar.getPrimaryPath()), metadata);

return ModCandidateImpl.createBuiltin(builtinMod, VERSION_OVERRIDES, DEPENDENCY_OVERRIDES.get());
}

private static <T> T loadConfigFile(String name, Supplier<T> supplier) {
try {
return supplier.get();
} catch (Throwable t) {
throw new ModLoadingException(ConnectorEarlyLoader.createGenericLoadingIssue(t, "Invalid config file " + name));
}
}

private static Version parseVersionUnchecked(String str) {
try {
return VersionParser.parse(str, true);
} catch (VersionParsingException e) {
throw new RuntimeException(e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import net.neoforged.fml.ModLoadingException;
import net.neoforged.fml.ModLoadingIssue;
import net.neoforged.fml.loading.progress.StartupNotificationManager;
import org.sinytra.adapter.patch.api.PatchAuditTrail;
import org.sinytra.adapter.env.ctx.AuditTrail;
import org.sinytra.connector.transformer.jar.JarTransformer;
import org.sinytra.connector.util.ConnectorConfig;
import org.sinytra.connector.util.PriorityModLoadingException;
Expand Down Expand Up @@ -35,7 +35,7 @@ public static void trigger(List<JarTransformer.TransformedFabricModPath> failing

failing.forEach(p -> {
builder.append("Mod file §e").append(p.input().getFileName().toString()).append("§r has failing mixins:\n");
for (PatchAuditTrail.Candidate failed : p.auditTrail().getFailingMixins()) {
for (AuditTrail.Candidate failed : p.auditTrail().getFailingMixins()) {
String[] parts = failed.classNode().name.split("/");
builder.append("- §c").append(parts[parts.length - 1]).append("§7#§3").append(failed.methodNode().name).append("§r\n");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ private static void injectUFSFilter(UnionFileSystem ufs, UnionPathFilter filter)
UnionPathFilter merged = existing != null ? (a, b) -> existing.test(a, b) && filter.test(a, b) : filter;

// Inject filter into UFS
UPFS_FILTER.set(ufs, merged); // TODO TEST
UPFS_FILTER.set(ufs, merged);
}

private static void forceRecomputeJarPackages(Jar jar) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import cpw.mods.niofs.union.UnionPathFilter;
import net.neoforged.neoforgespi.locating.IModFile;
import org.jetbrains.annotations.Nullable;
import org.sinytra.connector.transformer.jar.JarTransformer;
import org.sinytra.connector.transformer.jar.FabricModFileMetadata;
import org.sinytra.connector.transformer.jar.JarTransformer.FabricModPath;
import org.slf4j.Logger;

Expand Down Expand Up @@ -148,7 +148,7 @@ private static void analyzeJar(Map<String, JarMergeInfo> swap, JarMergeInfo mast
List<Path> additionalPaths = others.stream()
.flatMap(pair -> {
SecureJar sj = pair.getFirst();
JarTransformer.FabricModFileMetadata metadata = pair.getSecond().metadata();
FabricModFileMetadata metadata = pair.getSecond().metadata();
JarContents jarContents = new JarContentsBuilder().paths(sj.getPrimaryPath()).pathFilter(singlePackageFilter(pkg)).build();
SecureJar singlePackage = SecureJar.from(jarContents);
JarMergeInfo jarInfo = swap.computeIfAbsent(sj.name(), name -> new JarMergeInfo(sj, metadata));
Expand Down Expand Up @@ -187,11 +187,11 @@ private static UnionPathFilter mergeANDFilter(UnionPathFilter left, @Nullable Un
* @param additionalPaths additional paths to include in the jar
* @param excludedPackages packages to exlude from the jar
*/
private record JarMergeInfo(SecureJar jar, JarTransformer.FabricModFileMetadata metadata, Set<Path> additionalPaths, Set<String> excludedPackages) {
public JarMergeInfo(SecureJar jar, JarTransformer.FabricModFileMetadata metadata) {
private record JarMergeInfo(SecureJar jar, FabricModFileMetadata metadata, Set<Path> additionalPaths, Set<String> excludedPackages) {
public JarMergeInfo(SecureJar jar, FabricModFileMetadata metadata) {
this(jar, metadata, new HashSet<>(), new HashSet<>());
}
}

public record FilteredModPath(Path[] paths, @Nullable UnionPathFilter filter, JarTransformer.FabricModFileMetadata metadata) {}
public record FilteredModPath(Path[] paths, @Nullable UnionPathFilter filter, FabricModFileMetadata metadata) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
import net.neoforged.fml.loading.progress.StartupNotificationManager;
import net.neoforged.neoforgespi.locating.IModFile;
import org.jetbrains.annotations.Nullable;
import org.sinytra.adapter.patch.util.provider.ClassLookup;
import org.sinytra.adapter.patch.util.provider.ZipClassLookup;
import org.sinytra.adapter.util.provider.ClassLookup;
import org.sinytra.adapter.util.provider.ZipClassLookup;
import org.sinytra.connector.ConnectorEarlyLoader;
import org.sinytra.connector.locator.ConnectorFabricModMetadata;
import org.sinytra.connector.locator.DependencyResolver;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import java.lang.invoke.VarHandle;
import java.lang.reflect.Field;
import java.nio.file.Path;
import java.util.*;
import java.util.function.*;
import java.util.stream.Stream;
Expand Down Expand Up @@ -105,7 +106,11 @@ public void onLoad(IEnvironment env, Set<String> otherServices) {
@Override
public List<Resource> completeScan(IModuleLayerManager layerManager) {
// Ignore default Fabric mod locator warnings
LoadingModList.get().getModLoadingIssues().removeIf(issue -> issue.translationKey().equals("fml.modloadingissue.brokenfile.fabric"));
LoadingModList.get().getModLoadingIssues()
.removeIf(issue -> {
Path path = issue.affectedPath();
return ConnectorEarlyLoader.isConnectorMod(path) && issue.translationKey().startsWith("fml.modloadingissue.brokenfile.");
});

// Add our loading errors
LoadingModList.get().getModLoadingIssues().addAll(ConnectorEarlyLoader.getLoadingExceptions());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
@Mixin(value = ItemStack.class, priority = 500)
public abstract class ItemStackMixin implements ItemStackExtensions {

// TODO Make sure name is the same in prod
@Inject(method = "lambda$useOn$16", at = @At("HEAD"), cancellable = true)
private void appyUseOn(UseOnContext pContext, UseOnContext c, CallbackInfoReturnable<InteractionResult> cir) {
InteractionResult result = connector_useOn(c);
Expand Down
Loading