Skip to content
Open
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
20 changes: 14 additions & 6 deletions forge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ buildscript {
maven("https://repo.spongepowered.org/repository/maven-public") {
name = "sponge"
}
maven("https://maven.neoforged.net/releases/") {
name = "neoforge"
}
maven("https://maven.architectury.dev/")
}
}
Expand All @@ -21,20 +24,23 @@ val commonProject = parent!!
val transformersProject = parent!!.project(":modlauncher-transformers")
val apiVersion: String by project
val minecraftVersion: String by project
val forgeVersion: String by project
val neoForgeVersion: String by project
val recommendedVersion: String by project
val organization: String by project
val projectUrl: String by project

val testPluginsProject: Project? = rootProject.subprojects.find { "testplugins" == it.name }

description = "The SpongeAPI implementation for MinecraftForge"
version = spongeImpl.generatePlatformBuildVersionString(apiVersion, minecraftVersion, recommendedVersion, forgeVersion)
version = spongeImpl.generatePlatformBuildVersionString(apiVersion, minecraftVersion, recommendedVersion, neoForgeVersion)

repositories {
maven("https://repo.spongepowered.org/repository/maven-public/") {
name = "sponge"
}
maven("https://maven.neoforged.net/releases/") {
name = "neoforge"
}
}

// SpongeForge libraries
Expand Down Expand Up @@ -158,8 +164,8 @@ extensions.configure(LoomGradleExtensionAPI::class) {
useLegacyMixinAp.set(false)
}

forge {
useCustomMixin.set(false)
neoForge {

}

mods {
Expand All @@ -180,13 +186,15 @@ extensions.configure(LoomGradleExtensionAPI::class) {

// Arch-loom bug, skip broken union-relauncher
runs.forEach {
// TODO find replacement
// net.minecraft.client.main.Main ? mcp.client.Start ?
it.mainClass.set("net.minecraftforge.bootstrap.ForgeBootstrap")
}
}

dependencies {
"minecraft"("com.mojang:minecraft:${minecraftVersion}")
"forge"("net.minecraftforge:forge:$minecraftVersion-$forgeVersion")
"neoForge"("net.neoforged:neoforge:$neoForgeVersion")
"mappings"(loom.layered {
officialMojangMappings {
nameSyntheticMembers = true
Expand Down Expand Up @@ -249,7 +257,7 @@ val forgeManifest = java.manifest {
"Specification-Vendor" to "SpongePowered",
"Specification-Version" to apiVersion,
"Implementation-Title" to project.name,
"Implementation-Version" to spongeImpl.generatePlatformBuildVersionString(apiVersion, minecraftVersion, recommendedVersion, forgeVersion),
"Implementation-Version" to spongeImpl.generatePlatformBuildVersionString(apiVersion, minecraftVersion, recommendedVersion, neoForgeVersion),
"Implementation-Vendor" to "SpongePowered"
)
// These two are included by most CI's
Expand Down
10 changes: 5 additions & 5 deletions forge/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
name=SpongeForge
implementation=Forge
description=The SpongeAPI implementation for MinecraftForge
name=SpongeNeoForge
implementation=NeoForge
description=The SpongeAPI implementation for MinecraftNeoForge

forgeVersion=52.0.3
loom.platform=forge
neoForgeVersion=21.1.1
loom.platform=neoforge
fabric.loom.dontRemap=true
mixinConfigs=mixins.spongeforge.accessors.json,mixins.spongeforge.api.json,mixins.spongeforge.inventory.json,mixins.spongeforge.core.json,mixins.spongeforge.tracker.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@
*/
package org.spongepowered.forge.applaunch.loading.metadata;

import net.minecraftforge.forgespi.language.IConfigurable;
import net.minecraftforge.forgespi.language.IModInfo;
import net.neoforged.neoforgespi.language.IConfigurable;
import net.neoforged.neoforgespi.language.IModInfo;

import org.spongepowered.plugin.metadata.PluginMetadata;
import org.spongepowered.plugin.metadata.model.PluginDependency;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
*/
package org.spongepowered.forge.applaunch.loading.metadata;

import net.minecraftforge.forgespi.language.IConfigurable;
import net.neoforged.neoforgespi.language.IConfigurable;
import org.spongepowered.plugin.metadata.PluginMetadata;
import org.spongepowered.plugin.metadata.builtin.MetadataContainer;
import org.spongepowered.plugin.metadata.model.PluginDependency;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
*/
package org.spongepowered.forge.applaunch.loading.metadata;

import net.minecraftforge.forgespi.language.IConfigurable;
import net.neoforged.neoforgespi.language.IConfigurable;

import org.spongepowered.plugin.metadata.PluginMetadata;

import java.util.Collections;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@
*/
package org.spongepowered.forge.applaunch.loading.metadata;

import net.minecraftforge.fml.loading.moddiscovery.ModInfo;
import net.minecraftforge.forgespi.language.IModInfo;
import net.neoforged.fml.loading.moddiscovery.ModInfo;
import net.neoforged.neoforgespi.language.IModInfo;

import org.spongepowered.plugin.metadata.PluginMetadata;
import org.spongepowered.plugin.metadata.builtin.StandardPluginMetadata;
import org.spongepowered.plugin.metadata.builtin.model.StandardPluginContributor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@
package org.spongepowered.forge.applaunch.loading.moddiscovery;

import cpw.mods.jarhandling.SecureJar;
import net.minecraftforge.fml.loading.moddiscovery.ModFile;
import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo;
import net.minecraftforge.fml.loading.moddiscovery.ModJarMetadata;
import net.minecraftforge.forgespi.language.IModFileInfo;
import net.minecraftforge.forgespi.locating.IModFile;
import net.minecraftforge.forgespi.locating.IModLocator;
import net.minecraftforge.forgespi.locating.ModFileFactory;

import net.neoforged.fml.loading.moddiscovery.ModFile;
import net.neoforged.fml.loading.moddiscovery.ModFileInfo;
import net.neoforged.fml.loading.moddiscovery.ModJarMetadata;
import net.neoforged.neoforgespi.language.IModFileInfo;
import net.neoforged.neoforgespi.locating.*;

import org.spongepowered.common.applaunch.AppLaunch;
import org.spongepowered.common.applaunch.plugin.PluginPlatformConstants;
import org.spongepowered.forge.applaunch.loading.metadata.PluginFileConfigurable;
Expand Down Expand Up @@ -89,9 +89,20 @@ private static ModJarMetadata newModJarMetadata() {
}
}

public static ModFile newPluginInstance(final IModLocator locator, final Path... path) {
public static ModFile newPluginInstance(final IModFileCandidateLocator locator, final Path... path) {
ModJarMetadata mjm = newModJarMetadata();
ModFile modFile = (ModFile) ModFileFactory.FACTORY.build(SecureJar.from(jar -> mjm, path), locator, ModFileParsers::parsePluginMetadata);
ModFileInfoParser parser = ModFileParsers::parsePluginMetadata;

ModFile modFile = new ModFile(SecureJar.from(path), parser, ModFileDiscoveryAttributes.DEFAULT.withLocator(locator));
mjm.setModFile(modFile);
return modFile;
}

public static ModFile newPluginInstance(final IDependencyLocator locator, final Path... path) {
ModJarMetadata mjm = newModJarMetadata();
ModFileInfoParser parser = ModFileParsers::parsePluginMetadata;

ModFile modFile = new ModFile(SecureJar.from(path), parser, ModFileDiscoveryAttributes.DEFAULT.withDependencyLocator(locator));
mjm.setModFile(modFile);
return modFile;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,31 +26,37 @@

import cpw.mods.modlauncher.Environment;
import cpw.mods.modlauncher.Launcher;
import net.minecraftforge.fml.loading.FMLEnvironment;
import net.minecraftforge.fml.loading.moddiscovery.AbstractModProvider;
import net.minecraftforge.forgespi.locating.IDependencyLocator;
import net.minecraftforge.forgespi.locating.IModFile;
import net.minecraftforge.forgespi.locating.IModLocator;

import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.fml.loading.moddiscovery.ModFile;
import net.neoforged.neoforgespi.locating.IDependencyLocator;
import net.neoforged.neoforgespi.locating.IDiscoveryPipeline;
import net.neoforged.neoforgespi.locating.IModFile;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import org.spongepowered.forge.applaunch.loading.moddiscovery.library.LibraryManager;
import org.spongepowered.forge.applaunch.transformation.SpongeForgeTransformationService;

import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

// works with ForgeProductionBootstrap to make this whole thing go
public class SpongeForgeDependencyLocator extends AbstractModProvider implements IDependencyLocator {
public class SpongeForgeDependencyLocator implements IDependencyLocator {
private static final Logger LOGGER = LogManager.getLogger();
private final List<IModFile> modFiles = new ArrayList<>();

private LibraryManager libraryManager;
final Environment env = Launcher.INSTANCE.environment();
private LibraryManager libraryManager = new LibraryManager(
env.getProperty(SpongeForgeTransformationService.Keys.CHECK_LIBRARY_HASHES.get()).orElse(true),
env.getProperty(SpongeForgeTransformationService.Keys.LIBRARIES_DIRECTORY.get())
.orElseThrow(() -> new IllegalStateException("no libraries available")),
SpongeForgeModLocator.class.getResource("libraries.json"));

@Override
public List<IModFile> scanMods(Iterable<IModFile> loadedMods) {
final List<IModFile> modFiles = new ArrayList<>();

public void scanMods(List<IModFile> loadedMods, IDiscoveryPipeline pipeline) {
// Add Sponge-specific libraries
if (FMLEnvironment.production) {
try {
Expand All @@ -63,36 +69,14 @@ public List<IModFile> scanMods(Iterable<IModFile> loadedMods) {
for (final LibraryManager.Library library : this.libraryManager.getAll().values()) {
final Path path = library.getFile();
SpongeForgeDependencyLocator.LOGGER.debug("Proposing jar {} as a game library", path);

final IModLocator.ModFileOrException fileOrException = createMod(path);
if (fileOrException.ex() != null) {
throw fileOrException.ex();
}
modFiles.add(fileOrException.file());
ModFile mod = ModFileParsers.newPluginInstance(this, path);
modFiles.add(mod);
}
}

return modFiles;
}

@Override
protected String getDefaultJarModType() {
return IModFile.Type.GAMELIBRARY.name();
}

@Override
public String name() {
return "spongeforge";
public List<IModFile> getModFiles() {
return modFiles;
}

@Override
public void initArguments(final Map<String, ?> arguments) {
final Environment env = Launcher.INSTANCE.environment();
this.libraryManager = new LibraryManager(
env.getProperty(SpongeForgeTransformationService.Keys.CHECK_LIBRARY_HASHES.get()).orElse(true),
env.getProperty(SpongeForgeTransformationService.Keys.LIBRARIES_DIRECTORY.get())
.orElseThrow(() -> new IllegalStateException("no libraries available")),
SpongeForgeModLocator.class.getResource("libraries.json")
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,59 +27,65 @@
import com.google.common.collect.ImmutableMap;
import cpw.mods.modlauncher.Environment;
import cpw.mods.modlauncher.Launcher;
import net.minecraftforge.fml.loading.FMLEnvironment;
import net.minecraftforge.fml.loading.moddiscovery.AbstractModProvider;
import net.minecraftforge.forgespi.locating.IModLocator;

import net.neoforged.fml.javafmlmod.FMLJavaModLanguageProvider;
import net.neoforged.neoforgespi.ILaunchContext;
import net.neoforged.neoforgespi.locating.IDiscoveryPipeline;
import net.neoforged.neoforgespi.locating.IModFile;
import net.neoforged.neoforgespi.locating.IModFileCandidateLocator;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import org.spongepowered.forge.applaunch.plugin.ForgePluginPlatform;

import java.net.URI;
import java.net.URL;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;

public final class SpongeForgeModLocator extends AbstractModProvider implements IModLocator {
public final class SpongeForgeModLocator extends FMLJavaModLanguageProvider implements IModFileCandidateLocator {
private static final Logger LOGGER = LogManager.getLogger();
private List<IModFile> modFiles = new ArrayList<>();

@Override
public List<ModFileOrException> scanMods() {
if (!FMLEnvironment.production) {
return List.of();
}

public void findCandidates(ILaunchContext context, IDiscoveryPipeline pipeline) {
try {
URL rootJar = SpongeForgeModLocator.class.getProtectionDomain().getCodeSource().getLocation();
FileSystem fs = FileSystems.getFileSystem(rootJar.toURI()); // FML has already opened a file system for this jar
return Files.list(fs.getPath("jars"))
.filter(path -> path.getFileName().toString().toLowerCase(Locale.ROOT).endsWith(".jar"))
.map(path -> {
try {
URI jij = new URI("jij:" + path.toAbsolutePath().toUri().getRawSchemeSpecificPart()).normalize();
final Map<String, ?> env = ImmutableMap.of("packagePath", path);
FileSystem jijFS = FileSystems.newFileSystem(jij, env);
return jijFS.getPath("/"); // root of the archive to load
} catch (Exception e) {
throw new RuntimeException(e);
}
}).map(this::createMod).toList();
modFiles = Files.list(fs.getPath("jars"))
.filter(path -> path.getFileName().toString().toLowerCase(Locale.ROOT).endsWith(".jar"))
.map(path -> {
try {
URI jij = new URI("jij:" + path.toAbsolutePath().toUri().getRawSchemeSpecificPart()).normalize();
final Map<String, ?> env = ImmutableMap.of("packagePath", path);
FileSystem jijFS = FileSystems.newFileSystem(jij, env);
return jijFS.getPath("/"); // root of the archive to load
} catch (Exception e) {
return null;
}
}).filter(path -> path != null).map(this::createMod).toList();
} catch (Exception e) {
LOGGER.error("Failed to scan mod candidates", e);
}
}

return List.of();
private IModFile createMod(Path path) {
return ModFileParsers.newPluginInstance(this, path);
}

@Override
public String name() {
return "spongeforge";
return "spongeneoforge";
}

@Override
//@Override
public void initArguments(Map<String, ?> arguments) {
final Environment env = Launcher.INSTANCE.environment();
ForgePluginPlatform.bootstrap(env);
Expand Down
Loading