diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index 813a250e365..9019fd80827 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -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/") } } @@ -21,7 +24,7 @@ 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 @@ -29,12 +32,15 @@ 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 @@ -158,8 +164,8 @@ extensions.configure(LoomGradleExtensionAPI::class) { useLegacyMixinAp.set(false) } - forge { - useCustomMixin.set(false) + neoForge { + } mods { @@ -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 @@ -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 diff --git a/forge/gradle.properties b/forge/gradle.properties index 6617e1b146e..1c271bdaa7f 100644 --- a/forge/gradle.properties +++ b/forge/gradle.properties @@ -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 \ No newline at end of file diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginDependencyConfigurable.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginDependencyConfigurable.java index b72a3026397..a52ee64b10d 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginDependencyConfigurable.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginDependencyConfigurable.java @@ -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; diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginFileConfigurable.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginFileConfigurable.java index 05d3da27b42..547bf67c77c 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginFileConfigurable.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginFileConfigurable.java @@ -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; diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginMetadataConfigurable.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginMetadataConfigurable.java index 95584102d07..98567a39639 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginMetadataConfigurable.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginMetadataConfigurable.java @@ -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; diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginMetadataUtils.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginMetadataUtils.java index 1ffd3c8c854..3a40bca1feb 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginMetadataUtils.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/metadata/PluginMetadataUtils.java @@ -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; diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/ModFileParsers.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/ModFileParsers.java index de41a11126b..fa4d4c3a8c8 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/ModFileParsers.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/ModFileParsers.java @@ -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; @@ -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; } diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/SpongeForgeDependencyLocator.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/SpongeForgeDependencyLocator.java index 28a89f3a523..2757a0fde22 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/SpongeForgeDependencyLocator.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/SpongeForgeDependencyLocator.java @@ -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 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 scanMods(Iterable loadedMods) { - final List modFiles = new ArrayList<>(); - + public void scanMods(List loadedMods, IDiscoveryPipeline pipeline) { // Add Sponge-specific libraries if (FMLEnvironment.production) { try { @@ -63,36 +69,14 @@ public List scanMods(Iterable 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 getModFiles() { + return modFiles; } - @Override - public void initArguments(final Map 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") - ); - } } diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/SpongeForgeModLocator.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/SpongeForgeModLocator.java index e7c704b506b..c03d28ac3a0 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/SpongeForgeModLocator.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/SpongeForgeModLocator.java @@ -27,11 +27,16 @@ 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; @@ -39,47 +44,48 @@ 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 modFiles = new ArrayList<>(); @Override - public List 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 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 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 arguments) { final Environment env = Launcher.INSTANCE.environment(); ForgePluginPlatform.bootstrap(env); diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/locator/EnvironmentPluginLocator.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/locator/EnvironmentPluginLocator.java index 4aa59a6cd64..02b0b181508 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/locator/EnvironmentPluginLocator.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/locator/EnvironmentPluginLocator.java @@ -24,8 +24,12 @@ */ package org.spongepowered.forge.applaunch.loading.moddiscovery.locator; -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.language.ModFileScanData; +import net.neoforged.neoforgespi.locating.IDiscoveryPipeline; +import net.neoforged.neoforgespi.locating.IModFileCandidateLocator; + import org.spongepowered.forge.applaunch.loading.moddiscovery.ModFileParsers; import java.nio.file.Path; @@ -35,20 +39,34 @@ import java.util.Map; import java.util.stream.Stream; -public final class EnvironmentPluginLocator extends AbstractModProvider implements IModLocator { +public final class EnvironmentPluginLocator extends FMLJavaModLanguageProvider implements IModFileCandidateLocator { @Override - public List scanMods() { - final List modFiles = new ArrayList<>(); + public void findCandidates(ILaunchContext context, IDiscoveryPipeline pipeline) { + for(Path[] arrayPaths : getPluginsPaths()) for(Path path : arrayPaths) context.addLocated(path); + scanMods().forEach(scan -> { + scan.getIModInfoData().forEach(file -> { + pipeline.addModFile(file.getFile()); + context.addLocated(file.getFile().getFilePath()); + }); + }); + } + + //@Override + public List scanMods() { + final List modFiles = new ArrayList<>(); for (final Path[] paths : getPluginsPaths()) { - modFiles.add(new ModFileOrException(ModFileParsers.newPluginInstance(this, paths), null)); + ModFileScanData data = new ModFileScanData(); + data.addModFileInfo(ModFileParsers.newPluginInstance(this, paths).getModFileInfo()); } return modFiles; } - @Override - protected ModFileOrException createMod(Path path) { - return new ModFileOrException(ModFileParsers.newPluginInstance(this, path), null); + //@Override + protected ModFileScanData createMod(Path path) { + ModFileScanData data = new ModFileScanData(); + data.addModFileInfo(ModFileParsers.newPluginInstance(this, path).getModFileInfo()); + return data; } @Override @@ -56,7 +74,7 @@ public String name() { return "environment plugin"; } - @Override + //@Override public void initArguments(final Map arguments) { } diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/locator/PluginsDirectoryLocator.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/locator/PluginsDirectoryLocator.java index f4911cae3b5..8a1211aae7f 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/locator/PluginsDirectoryLocator.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/loading/moddiscovery/locator/PluginsDirectoryLocator.java @@ -24,14 +24,20 @@ */ package org.spongepowered.forge.applaunch.loading.moddiscovery.locator; -import cpw.mods.modlauncher.api.LamdbaExceptionUtils; -import net.minecraftforge.fml.loading.ModDirTransformerDiscoverer; -import net.minecraftforge.fml.loading.StringUtils; -import net.minecraftforge.fml.loading.moddiscovery.AbstractModProvider; -import net.minecraftforge.fml.loading.moddiscovery.ModFile; -import net.minecraftforge.forgespi.locating.IModLocator; +import cpw.mods.util.LambdaExceptionUtils; + +import net.neoforged.fml.javafmlmod.FMLJavaModLanguageProvider; +import net.neoforged.fml.loading.ModDirTransformerDiscoverer; +import net.neoforged.fml.loading.StringUtils; +import net.neoforged.fml.loading.moddiscovery.ModFile; +import net.neoforged.neoforgespi.ILaunchContext; +import net.neoforged.neoforgespi.language.ModFileScanData; +import net.neoforged.neoforgespi.locating.IDiscoveryPipeline; +import net.neoforged.neoforgespi.locating.IModFileCandidateLocator; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; + import org.spongepowered.common.applaunch.AppLaunch; import org.spongepowered.forge.applaunch.loading.moddiscovery.ModFileParsers; @@ -43,26 +49,28 @@ import java.util.Map; import java.util.stream.Stream; -public final class PluginsDirectoryLocator extends AbstractModProvider implements IModLocator { +public final class PluginsDirectoryLocator extends FMLJavaModLanguageProvider implements IModFileCandidateLocator { private static final Logger LOGGER = LogManager.getLogger(); + final List modFiles = new ArrayList<>(); + @Override - public List scanMods() { + public void findCandidates(ILaunchContext context, IDiscoveryPipeline pipeline) { final List pluginDirectories = AppLaunch.pluginPlatform().pluginDirectories(); - final List modFiles = new ArrayList<>(); - - for (final Path pluginDirectory : pluginDirectories) { - PluginsDirectoryLocator.LOGGER.debug("Scanning plugins directory '{}' for plugins", pluginDirectory); - this.scanForModsIn(pluginDirectory).map((f) -> new ModFileOrException(f, null)).forEach(modFiles::add); + for (final Path paths : pluginDirectories) { + this.scanForModsIn(paths).forEach(this::addData); } + } + public List getScanData() { return modFiles; } private Stream scanForModsIn(final Path pluginsDirectory) { + final List excluded = ModDirTransformerDiscoverer.allExcluded(); - return LamdbaExceptionUtils.uncheck(() -> Files.list(pluginsDirectory)) + return LambdaExceptionUtils.uncheck(() -> Files.list(pluginsDirectory)) .filter((p) -> !excluded.contains(p) && StringUtils.toLowerCase(p.getFileName().toString()).endsWith(".jar")) .sorted(Comparator.comparing((path) -> StringUtils.toLowerCase(path.getFileName().toString()))) .map((p) -> ModFileParsers.newPluginInstance(this, p)) @@ -74,7 +82,13 @@ public String name() { return "plugins directory"; } - @Override + //@Override public void initArguments(final Map arguments) { } + + private void addData(ModFile modFile) { + ModFileScanData data = new ModFileScanData(); + data.addModFileInfo(modFile.getModFileInfo()); + modFiles.add(data); + } } diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/plugin/ForgePluginPlatform.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/plugin/ForgePluginPlatform.java index f054ca99da1..6ba748612e1 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/plugin/ForgePluginPlatform.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/plugin/ForgePluginPlatform.java @@ -26,7 +26,9 @@ import cpw.mods.modlauncher.Environment; import cpw.mods.modlauncher.api.IEnvironment; -import net.minecraftforge.fml.loading.FMLPaths; + +import net.neoforged.fml.loading.FMLPaths; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.common.applaunch.AppLaunch; diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/transformation/ListenerTransformer.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/transformation/ListenerTransformer.java index 62daa6ab20e..3990525693b 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/transformation/ListenerTransformer.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/transformation/ListenerTransformer.java @@ -24,29 +24,19 @@ */ package org.spongepowered.forge.applaunch.transformation; -import static org.objectweb.asm.Opcodes.ACC_STATIC; -import static org.objectweb.asm.Opcodes.INVOKESTATIC; -import static org.objectweb.asm.Opcodes.RETURN; - -import cpw.mods.modlauncher.api.ITransformer; -import cpw.mods.modlauncher.api.ITransformerActivity; -import cpw.mods.modlauncher.api.ITransformerVotingContext; -import cpw.mods.modlauncher.api.TransformerVoteResult; -import net.minecraftforge.fml.loading.LoadingModList; -import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; -import net.minecraftforge.forgespi.language.ModFileScanData; +import cpw.mods.modlauncher.api.*; +import net.neoforged.fml.loading.LoadingModList; +import net.neoforged.fml.loading.moddiscovery.ModFileInfo; +import net.neoforged.neoforgespi.language.ModFileScanData; import org.checkerframework.checker.nullness.qual.NonNull; import org.objectweb.asm.Type; -import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.InsnList; -import org.objectweb.asm.tree.InsnNode; -import org.objectweb.asm.tree.LdcInsnNode; -import org.objectweb.asm.tree.MethodInsnNode; -import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.*; import java.util.HashSet; import java.util.Set; +import static org.objectweb.asm.Opcodes.*; + public class ListenerTransformer implements ITransformer { @NonNull @@ -83,9 +73,8 @@ public TransformerVoteResult castVote(final ITransformerVotingContext context) { return context.getReason().equals(ITransformerActivity.CLASSLOADING_REASON) ? TransformerVoteResult.YES : TransformerVoteResult.NO; } - @NonNull @Override - public Set targets() { + public Set> targets() { final Type listenerType = Type.getType("Lorg/spongepowered/api/event/Listener;"); final Set listenerClasses = new HashSet<>(); @@ -97,10 +86,15 @@ public Set targets() { } } - final Set targets = new HashSet<>(); + final Set> targets = new HashSet<>(); for (Type listener : listenerClasses) { targets.add(Target.targetClass(listener.getInternalName())); } return targets; } + + @Override + public TargetType getTargetType() { + return TargetType.CLASS; + } } diff --git a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/transformation/SpongeForgeTransformationService.java b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/transformation/SpongeForgeTransformationService.java index 2bde9d692b7..0849a65b284 100644 --- a/forge/src/applaunch/java/org/spongepowered/forge/applaunch/transformation/SpongeForgeTransformationService.java +++ b/forge/src/applaunch/java/org/spongepowered/forge/applaunch/transformation/SpongeForgeTransformationService.java @@ -27,15 +27,13 @@ import cpw.mods.jarhandling.SecureJar; import cpw.mods.modlauncher.Environment; import cpw.mods.modlauncher.Launcher; -import cpw.mods.modlauncher.api.IEnvironment; -import cpw.mods.modlauncher.api.IModuleLayerManager; -import cpw.mods.modlauncher.api.ITransformationService; -import cpw.mods.modlauncher.api.ITransformer; -import cpw.mods.modlauncher.api.TypesafeMap; +import cpw.mods.modlauncher.api.*; + import joptsimple.OptionSpec; import joptsimple.OptionSpecBuilder; -import net.minecraftforge.fml.loading.LoadingModList; -import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; + +import net.neoforged.fml.loading.LoadingModList; +import net.neoforged.fml.loading.moddiscovery.ModFileInfo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.checkerframework.checker.nullness.qual.NonNull; @@ -140,10 +138,8 @@ public List completeScan(IModuleLayerManager layerManager) { return List.of(); } - @NonNull @Override - @SuppressWarnings("rawtypes") // :) - public List transformers() { + public List> transformers() { return List.of(new ListenerTransformer()); } diff --git a/forge/src/lang/java/org/spongepowered/forge/lang/provider/JavaPluginLanguageProvider.java b/forge/src/lang/java/org/spongepowered/forge/lang/provider/JavaPluginLanguageProvider.java index 5bdcef45012..c0ecc3175d5 100644 --- a/forge/src/lang/java/org/spongepowered/forge/lang/provider/JavaPluginLanguageProvider.java +++ b/forge/src/lang/java/org/spongepowered/forge/lang/provider/JavaPluginLanguageProvider.java @@ -24,13 +24,15 @@ */ package org.spongepowered.forge.lang.provider; -import cpw.mods.modlauncher.api.LamdbaExceptionUtils; -import net.minecraftforge.fml.Logging; -import net.minecraftforge.fml.ModLoadingStage; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLanguageProvider; -import net.minecraftforge.forgespi.language.IModInfo; -import net.minecraftforge.forgespi.language.IModLanguageProvider; -import net.minecraftforge.forgespi.language.ModFileScanData; +import cpw.mods.util.LambdaExceptionUtils; +import net.neoforged.fml.Logging; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.ModLoadingException; +import net.neoforged.fml.javafmlmod.FMLJavaModLanguageProvider; +import net.neoforged.neoforgespi.language.IModInfo; +import net.neoforged.neoforgespi.language.IModLanguageLoader; +import net.neoforged.neoforgespi.language.ModFileScanData; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.objectweb.asm.Type; @@ -56,7 +58,7 @@ public JavaPluginLanguageProvider() { public String name() { return "java_plain"; } - +/* @Override public Consumer getFileVisitor() { return scanResult -> { @@ -67,9 +69,9 @@ public Consumer getFileVisitor() { .collect(Collectors.toMap(PluginTarget::getPlugin, Function.identity(), (a,b)->a)); scanResult.addLanguageLoader(modTargetMap); }; - } + }*/ - private static final class PluginTarget implements IModLanguageProvider.IModLanguageLoader { + private static final class PluginTarget implements IModLanguageLoader { private final Logger logger; private final String className; @@ -82,7 +84,7 @@ private PluginTarget(final String className, final String plugin) { } @Override - public T loadMod(final IModInfo info, final ModFileScanData modFileScanData, final ModuleLayer gameLayer) { + public ModContainer loadMod(final IModInfo info, final ModFileScanData modFileScanData, final ModuleLayer gameLayer) { // The following is adapted from FMLJavaModLanguageProvider.FMLModTarget // This language class is loaded in the system level classloader - before the game even starts @@ -93,30 +95,40 @@ public T loadMod(final IModInfo info, final ModFileScanData modFileScanData, "org.spongepowered.forge.launch.plugin.PluginModContainer", true, Thread.currentThread().getContextClassLoader()); this.logger.debug(Logging.LOADING, "Loading PluginModContainer from classloader {} - got {}", Thread.currentThread().getContextClassLoader(), pluginContainer.getClassLoader()); final Constructor constructor = pluginContainer.getConstructor(IModInfo.class, String.class, ModFileScanData.class, ModuleLayer.class); - return (T) constructor.newInstance(info, className, modFileScanData, gameLayer); + return (ModContainer) constructor.newInstance(info, className, modFileScanData, gameLayer); } // ALL exception handling has to be done through the classloader, because we're loaded in the wrong context, so any classes we just blind load will be in the wrong // class loading context. Funky but works. catch (final InvocationTargetException e) { this.logger.fatal(Logging.LOADING, "Failed to build plugin", e); - final Class mle = (Class) LamdbaExceptionUtils.uncheck(()->Class.forName("net.minecraftforge.fml.ModLoadingException", true, Thread.currentThread().getContextClassLoader())); + final Class mle = (Class) LambdaExceptionUtils.uncheck(()->Class.forName("net.neoforged.fml.ModLoadingException", true, Thread.currentThread().getContextClassLoader())); if (mle.isInstance(e.getTargetException())) { throw mle.cast(e.getTargetException()); } else { - final Class mls = (Class) LamdbaExceptionUtils.uncheck(()->Class.forName("net.minecraftforge.fml.ModLoadingStage", true, Thread.currentThread().getContextClassLoader())); - throw LamdbaExceptionUtils.uncheck(()->LamdbaExceptionUtils.uncheck(()->mle.getConstructor(IModInfo.class, mls, String.class, Throwable.class)).newInstance(info, Enum.valueOf(mls, "CONSTRUCT"), "fml.modloading.failedtoloadmodclass", e)); + final Class mls = (Class) LambdaExceptionUtils.uncheck(()->Class.forName("net.neoforged.fml.ModLoadingContext", true, Thread.currentThread().getContextClassLoader())); + throw LambdaExceptionUtils.uncheck(()->LambdaExceptionUtils.uncheck(()->mle.getConstructor(IModInfo.class, mls, String.class, Throwable.class)).newInstance(info, mls, "fml.modloading.failedtoloadmodclass", e)); } } catch (final NoSuchMethodException | ClassNotFoundException | InstantiationException | IllegalAccessException e) { this.logger.fatal(Logging.LOADING,"Unable to load PluginModContainer, excuse me?", e); - final Class mle = (Class)LamdbaExceptionUtils.uncheck(()->Class.forName("net.minecraftforge.fml.ModLoadingException", true, Thread.currentThread().getContextClassLoader())); - final Class mls = (Class) LamdbaExceptionUtils.uncheck(()->Class.forName("net.minecraftforge.fml.ModLoadingStage", true, Thread.currentThread().getContextClassLoader())); - throw LamdbaExceptionUtils.uncheck(()->LamdbaExceptionUtils.uncheck(()->mle.getConstructor(IModInfo.class, mls, String.class, Throwable.class)).newInstance(info, Enum.valueOf(mls, "CONSTRUCT"), "fml.modloading.failedtoloadmodclass", e)); + final Class mle = (Class)LambdaExceptionUtils.uncheck(()->Class.forName("net.neoforged.fml.ModLoadingException", true, Thread.currentThread().getContextClassLoader())); + final Class mls = (Class) LambdaExceptionUtils.uncheck(()->Class.forName("net.neoforged.fml.ModLoadingContext", true, Thread.currentThread().getContextClassLoader())); + throw LambdaExceptionUtils.uncheck(()->LambdaExceptionUtils.uncheck(()->mle.getConstructor(IModInfo.class, mls, String.class, Throwable.class)).newInstance(info, mls, "fml.modloading.failedtoloadmodclass", e)); } } public String getPlugin() { return this.plugin; } + + @Override + public String name() { + return ""; + } + + @Override + public String version() { + return ""; + } } } diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/ForgeLaunch.java b/forge/src/launch/java/org/spongepowered/forge/launch/ForgeLaunch.java index 5fc342b4229..3c96f27755d 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/ForgeLaunch.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/ForgeLaunch.java @@ -29,9 +29,10 @@ import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Stage; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.loading.FMLLoader; -import net.minecraftforge.fml.loading.moddiscovery.ModInfo; + +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.moddiscovery.ModInfo; import org.spongepowered.common.applaunch.plugin.PluginPlatform; import org.spongepowered.common.inject.SpongeCommonModule; import org.spongepowered.common.inject.SpongeModule; diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/ForgeMappingManager.java b/forge/src/launch/java/org/spongepowered/forge/launch/ForgeMappingManager.java index c9f76a458db..5f994c49899 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/ForgeMappingManager.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/ForgeMappingManager.java @@ -25,7 +25,7 @@ package org.spongepowered.forge.launch; import com.google.common.collect.ImmutableMap; -import net.minecraftforge.fml.loading.FMLEnvironment; +import net.neoforged.fml.loading.FMLEnvironment; import org.spongepowered.common.launch.mapping.SpongeMappingManager; import java.util.Map; diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/bridge/event/SpongeEventBridge_Forge.java b/forge/src/launch/java/org/spongepowered/forge/launch/bridge/event/SpongeEventBridge_Forge.java index 883959d5d1e..c8e4b64be36 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/bridge/event/SpongeEventBridge_Forge.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/bridge/event/SpongeEventBridge_Forge.java @@ -24,9 +24,7 @@ */ package org.spongepowered.forge.launch.bridge.event; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.IEventBusInvokeDispatcher; -import net.minecraftforge.eventbus.api.IEventListener; +import net.neoforged.bus.api.Event; import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Collection; @@ -51,9 +49,11 @@ public interface SpongeEventBridge_Forge { * this given event, it can be defined here. * * @return The dispatcher to use. + * + * IEventBusInvokeDispatcher REMOVED IN NEOFORGE! */ - default IEventBusInvokeDispatcher bridge$eventDispatcher() { - return IEventListener::invoke; - } + /*default IEventBusInvokeDispatcher bridge$eventDispatcher() { + return EventListener::invoke; + }*/ } diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/command/ForgeCommandManager.java b/forge/src/launch/java/org/spongepowered/forge/launch/command/ForgeCommandManager.java index 973827201be..035b9af6f1e 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/command/ForgeCommandManager.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/command/ForgeCommandManager.java @@ -31,10 +31,14 @@ import com.mojang.brigadier.context.CommandContextBuilder; import com.mojang.brigadier.context.ParsedArgument; import com.mojang.brigadier.exceptions.CommandSyntaxException; + import net.kyori.adventure.text.Component; + import net.minecraft.commands.CommandSourceStack; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.CommandEvent; + +import net.neoforged.bus.api.EventPriority; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.CommandEvent; import org.spongepowered.api.Game; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.command.CommandResult; @@ -82,7 +86,7 @@ public CommandResult processCommand(final CommandCause cause, final CommandMappi // Relocated from Commands (injection short circuits it there) final CommandEvent event = new CommandEvent(parseResults); - if (MinecraftForge.EVENT_BUS.post(event)) { + if (!NeoForge.EVENT_BUS.post(EventPriority.NORMAL, event).isCanceled()) { if (event.getException() != null) { Throwables.throwIfUnchecked(event.getException()); } diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/event/ForgeEventManager.java b/forge/src/launch/java/org/spongepowered/forge/launch/event/ForgeEventManager.java index 936129a0765..4f604e67cc0 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/event/ForgeEventManager.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/event/ForgeEventManager.java @@ -25,13 +25,14 @@ package org.spongepowered.forge.launch.event; import com.google.inject.Singleton; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.GenericEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.IEventBusInvokeDispatcher; -import net.minecraftforge.eventbus.api.IEventListener; + +import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.EventListener; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.IEventBus; + import org.checkerframework.checker.nullness.qual.Nullable; + import org.spongepowered.common.event.manager.RegisteredListener; import org.spongepowered.common.event.manager.SpongeEventManager; import org.spongepowered.forge.launch.bridge.event.ForgeEventBridge_Forge; @@ -40,7 +41,6 @@ import java.lang.invoke.MethodHandles; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.function.Consumer; @@ -66,41 +66,38 @@ public void addListener(final Consumer consumer) { } @Override - public void addListener(final EventPriority priority, final Consumer consumer) { - this.wrappedEventBus.addListener(priority, consumer); + public void addListener(Class eventType, Consumer consumer) { + } @Override - public void addListener(final EventPriority priority, final boolean receiveCancelled, final Consumer consumer) { - this.wrappedEventBus.addListener(priority, receiveCancelled, consumer); + public void addListener(final EventPriority priority, final Consumer consumer) { + this.wrappedEventBus.addListener(priority, consumer); } @Override - public void addListener(final EventPriority priority, final boolean receiveCancelled, final Class eventType, final Consumer consumer) { - this.wrappedEventBus.addListener(priority, receiveCancelled, eventType, consumer); + public void addListener(EventPriority priority, Class eventType, Consumer consumer) { + this.wrappedEventBus.addListener(priority, eventType, consumer); } @Override - public , F> void addGenericListener(final Class genericClassFilter, final Consumer consumer) { - this.wrappedEventBus.addGenericListener(genericClassFilter, consumer); + public void addListener(final EventPriority priority, final boolean receiveCancelled, final Consumer consumer) { + this.wrappedEventBus.addListener(priority, receiveCancelled, consumer); } @Override - public , F> void addGenericListener(final Class genericClassFilter, final EventPriority priority, - final Consumer consumer) { - this.wrappedEventBus.addGenericListener(genericClassFilter, priority, consumer); + public void addListener(final EventPriority priority, final boolean receiveCancelled, final Class eventType, final Consumer consumer) { + this.wrappedEventBus.addListener(priority, receiveCancelled, eventType, consumer); } @Override - public , F> void addGenericListener(final Class genericClassFilter, final EventPriority priority, - final boolean receiveCancelled, final Consumer consumer) { - this.wrappedEventBus.addGenericListener(genericClassFilter, priority, receiveCancelled, consumer); + public void addListener(boolean receiveCanceled, Consumer consumer) { + this.wrappedEventBus.addListener(receiveCanceled, consumer); } @Override - public , F> void addGenericListener(final Class genericClassFilter, final EventPriority priority, - final boolean receiveCancelled, final Class eventType, final Consumer consumer) { - this.wrappedEventBus.addGenericListener(genericClassFilter, priority, receiveCancelled, eventType, consumer); + public void addListener(boolean receiveCanceled, Class eventType, Consumer consumer) { + this.wrappedEventBus.addListener(receiveCanceled, eventType, consumer); } @Override @@ -109,27 +106,13 @@ public void unregister(final Object object) { } @Override - public boolean post(final Event event) { - return this.post(event, IEventListener::invoke); - } - - @Override - public boolean post(final Event event, final IEventBusInvokeDispatcher wrapper) { - if (event instanceof ForgeEventBridge_Forge) { - // intercept! - final ForgeEventBridge_Forge forgeEvent = (ForgeEventBridge_Forge) event; - final org.spongepowered.api.event.@Nullable Event spongeEvent = forgeEvent.bridge$createSpongeEvent(); - if (spongeEvent != null) { - return this.postDualBus(spongeEvent, Collections.singleton(event), wrapper); - } - } - // Do as Forge does - SpongeVanilla has no role to play here. - return this.wrappedEventBus.post(event, wrapper); + public T post(T event) { + return wrappedEventBus.post(event); } @Override - public void shutdown() { - this.wrappedEventBus.shutdown(); + public T post(EventPriority phase, T event) { + return wrappedEventBus.post(phase, event); } @Override @@ -152,13 +135,12 @@ public boolean post(final org.spongepowered.api.event.Event event) { // Do as SpongeVanilla does - Forge has no role to play here. return super.post(event); } - return this.postDualBus(event, forgeEvents, eventBridge.bridge$eventDispatcher()); + return this.postDualBus(event, forgeEvents); } // Implementation - private boolean postDualBus(final org.spongepowered.api.event.Event spongeEvent, final Collection forgeEvents, - final IEventBusInvokeDispatcher dispatcher) { + private boolean postDualBus(final org.spongepowered.api.event.Event spongeEvent, final Collection forgeEvents) { try (final NoExceptionClosable ignored = this.preparePost(spongeEvent)) { final RegisteredListener.Cache listeners = this.getHandlerCache(spongeEvent); final List> beforeModifications = listeners.beforeModifications(); @@ -173,7 +155,7 @@ private boolean postDualBus(final org.spongepowered.api.event.Event spongeEvent, } // Then, we fire all our Forge events for (final Event forgeEvent : forgeEvents) { - this.wrappedEventBus.post(forgeEvent, dispatcher); + this.wrappedEventBus.post(forgeEvent); // We must sync back the event's changes, if there are any. // For complex events, this will be a partial sync. ((ForgeEventBridge_Forge) forgeEvent).bridge$syncTo(spongeEvent); diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/event/SpongeEventBus.java b/forge/src/launch/java/org/spongepowered/forge/launch/event/SpongeEventBus.java index 2d0bbcbacf6..69ff612bd03 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/event/SpongeEventBus.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/event/SpongeEventBus.java @@ -24,18 +24,8 @@ */ package org.spongepowered.forge.launch.event; -import net.minecraftforge.eventbus.BusBuilderImpl; -import net.minecraftforge.eventbus.EventBus; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.IEventBusInvokeDispatcher; -import net.minecraftforge.eventbus.api.IEventExceptionHandler; -import net.minecraftforge.eventbus.api.IEventListener; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.spongepowered.api.event.CauseStackManager; -import org.spongepowered.common.event.manager.SpongeEventManager; -import org.spongepowered.common.event.tracking.PhaseContext; -import org.spongepowered.common.event.tracking.PhaseTracker; +import net.neoforged.bus.*; +import net.neoforged.bus.api.*; import java.lang.reflect.Field; import java.util.Objects; @@ -105,48 +95,6 @@ public SpongeEventBus(final BusBuilderImpl busBuilder) { // Sponge End } - @Override - public boolean post(final Event event, final IEventBusInvokeDispatcher wrapper) { - // @formatter:off - - // Sponge - use the builder/member fields. Avoids reflection but remains very hacky... - if (this.rshutdown) return false; - if (this.rcheckTypesOnDispatch && !rbaseType.isInstance(event)) - { - throw new IllegalArgumentException("Cannot post event of type " + event.getClass().getSimpleName() + " to this event. Must match type: " + this.rbaseType.getSimpleName()); - } - - IEventListener[] listeners = event.getListenerList().getListeners(this.rbusID); - int index = 0; - for (; index < listeners.length; index++) - { - final IEventListener listener = listeners[index]; - if (!this.rtrackPhases && Objects.equals(listener.getClass(), EventPriority.class)) continue; - - try ( - final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame(); - final PhaseContext<@NonNull ?> context = SpongeEventManager.createListenerContext(null)) - { - if (context != null) { - context.buildAndSwitch(); - } - - wrapper.invoke(listener, event); - } catch (final Throwable t) { - this.rexceptionHandler.handleException(this, event, listeners, index, t); - } - } - return event.isCancelable() && event.isCanceled(); - - // @formatter:on - } - - @Override - public void shutdown() { - super.shutdown(); - this.rshutdown = true; - } - @Override public void start() { super.start(); diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/inject/SpongeForgeModule.java b/forge/src/launch/java/org/spongepowered/forge/launch/inject/SpongeForgeModule.java index b9187264f17..fa24af48809 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/inject/SpongeForgeModule.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/inject/SpongeForgeModule.java @@ -25,7 +25,9 @@ package org.spongepowered.forge.launch.inject; import com.google.inject.AbstractModule; -import net.minecraftforge.common.MinecraftForge; + +import net.neoforged.neoforge.common.NeoForge; + import org.spongepowered.api.Platform; import org.spongepowered.api.event.EventManager; import org.spongepowered.common.command.manager.SpongeCommandManager; @@ -38,7 +40,7 @@ public final class SpongeForgeModule extends AbstractModule { @Override protected void configure() { this.bind(Platform.class).to(ForgePlatform.class); - this.bind(EventManager.class).toProvider(() -> (ForgeEventManager) MinecraftForge.EVENT_BUS); + this.bind(EventManager.class).toProvider(() -> (ForgeEventManager) NeoForge.EVENT_BUS); this.bind(SpongeCommandManager.class).to(ForgeCommandManager.class); } diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/plugin/ForgePluginContainer.java b/forge/src/launch/java/org/spongepowered/forge/launch/plugin/ForgePluginContainer.java index 6fceac8462a..ebdbd9999a0 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/plugin/ForgePluginContainer.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/plugin/ForgePluginContainer.java @@ -25,8 +25,8 @@ package org.spongepowered.forge.launch.plugin; import com.google.common.collect.MapMaker; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.loading.moddiscovery.ModInfo; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.loading.moddiscovery.ModInfo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.common.launch.Launch; @@ -46,6 +46,7 @@ public class ForgePluginContainer implements PluginContainer { private Logger logger; private PluginMetadata pluginMetadata; + private Object instance; // Find a way to get the instance of a plugin/mod from NeoForge ForgePluginContainer(final ModContainer modContainer) { this.modContainer = modContainer; @@ -75,7 +76,7 @@ public Logger logger() { public Optional locateResource(URI relative) { Objects.requireNonNull(relative, "relative"); - final ClassLoader classLoader = this.modContainer.getMod().getClass().getClassLoader(); + final ClassLoader classLoader = this.modContainer.getClass().getClassLoader(); final URL resolved = classLoader.getResource(relative.getPath()); try { if (resolved == null) { @@ -89,7 +90,7 @@ public Optional locateResource(URI relative) { @Override public Object instance() { - return this.modContainer.getMod(); + return instance; } private static final Map containers = new MapMaker().weakKeys().makeMap(); diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/plugin/ForgePluginManager.java b/forge/src/launch/java/org/spongepowered/forge/launch/plugin/ForgePluginManager.java index 074f2e0992e..0c571c66c94 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/plugin/ForgePluginManager.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/plugin/ForgePluginManager.java @@ -26,9 +26,11 @@ import com.google.common.collect.ImmutableList; import com.google.inject.Singleton; -import net.minecraftforge.fml.ModList; +import net.neoforged.fml.ModList; +import net.neoforged.fml.common.Mod; import org.spongepowered.common.launch.plugin.SpongePluginManager; import org.spongepowered.plugin.PluginContainer; +import org.spongepowered.plugin.builtin.jvm.Plugin; import java.util.Collection; import java.util.Objects; @@ -40,7 +42,10 @@ public final class ForgePluginManager implements SpongePluginManager { @Override public Optional fromInstance(final Object instance) { - return ModList.get().getModContainerByObject(Objects.requireNonNull(instance, "instance")).map(ForgePluginContainer::of); + Objects.requireNonNull(instance, "instance"); + if(instance.getClass().isAnnotationPresent(Plugin.class)) return plugin(instance.getClass().getAnnotation(Plugin.class).value()); + if(instance.getClass().isAnnotationPresent(Mod.class)) return plugin(instance.getClass().getAnnotation(Mod.class).value()); + return Optional.empty(); } @Override diff --git a/forge/src/launch/java/org/spongepowered/forge/launch/plugin/PluginModContainer.java b/forge/src/launch/java/org/spongepowered/forge/launch/plugin/PluginModContainer.java index 73f92ca0389..807600dba94 100644 --- a/forge/src/launch/java/org/spongepowered/forge/launch/plugin/PluginModContainer.java +++ b/forge/src/launch/java/org/spongepowered/forge/launch/plugin/PluginModContainer.java @@ -25,20 +25,20 @@ package org.spongepowered.forge.launch.plugin; import com.google.inject.Injector; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.EventBusErrorMessage; -import net.minecraftforge.eventbus.api.BusBuilder; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.IEventListener; -import net.minecraftforge.fml.Logging; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModLoadingException; -import net.minecraftforge.fml.ModLoadingStage; -import net.minecraftforge.fml.event.IModBusEvent; -import net.minecraftforge.fml.javafmlmod.AutomaticEventSubscriber; -import net.minecraftforge.forgespi.language.IModInfo; -import net.minecraftforge.forgespi.language.ModFileScanData; +import net.neoforged.bus.EventBusErrorMessage; +import net.neoforged.bus.api.BusBuilder; +import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.EventListener; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.Logging; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModLoadingException; +import net.neoforged.fml.ModLoadingIssue; +import net.neoforged.fml.event.IModBusEvent; +import net.neoforged.fml.javafmlmod.AutomaticEventSubscriber; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforgespi.language.IModInfo; +import net.neoforged.neoforgespi.language.ModFileScanData; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.common.inject.plugin.PluginModule; @@ -46,8 +46,6 @@ import org.spongepowered.forge.launch.event.ForgeEventManager; import org.spongepowered.plugin.PluginContainer; -import java.util.Optional; - // Spongified FMLModContainer public final class PluginModContainer extends ModContainer { private static final Logger LOGGER = LogManager.getLogger(); @@ -56,30 +54,33 @@ public final class PluginModContainer extends ModContainer { private final IEventBus eventBus; private Object modInstance; private final Class modClass; + private final Module layer; public PluginModContainer(IModInfo info, String className, ModFileScanData modFileScanResults, ModuleLayer gameLayer) { super(info); LOGGER.debug(Logging.LOADING, "Creating PluginModContainer instance for {}", className); this.scanResults = modFileScanResults; - this.activityMap.put(ModLoadingStage.CONSTRUCT, this::constructPlugin); - this.eventBus = BusBuilder.builder().setExceptionHandler(this::onEventFailed).setTrackPhases(false).markerType(IModBusEvent.class).useModLauncher().build(); - this.configHandler = Optional.of(ce -> this.eventBus.post(ce.self())); - this.contextExtension = () -> null; + this.eventBus = BusBuilder.builder().setExceptionHandler(this::onEventFailed).markerType(IModBusEvent.class).build(); + this.layer = gameLayer.findModule(info.getOwningFile().moduleName()).orElseThrow(); try { - Module module = gameLayer.findModule(info.getOwningFile().moduleName()).orElseThrow(); - modClass = Class.forName(module, className); + modClass = Class.forName(this.layer, className); LOGGER.trace(Logging.LOADING, "Loaded modclass {} with {}", modClass.getName(), modClass.getClassLoader()); } catch (Throwable e) { LOGGER.error(Logging.LOADING, "Failed to load class {}", className, e); - throw new ModLoadingException(info, ModLoadingStage.CONSTRUCT, "fml.modloading.failedtoloadmodclass", e); + throw new ModLoadingException(ModLoadingIssue.error("fml.modloadingissue.failedtoloadmodclass").withCause(e).withAffectedMod(info)); } } - private void onEventFailed(IEventBus iEventBus, Event event, IEventListener[] iEventListeners, int i, Throwable throwable) { + private void onEventFailed(IEventBus iEventBus, Event event, EventListener[] iEventListeners, int i, Throwable throwable) { LOGGER.error(new EventBusErrorMessage(event, i, iEventListeners, throwable)); } + @Override + protected void constructMod() { + this.constructPlugin(); + } + private void constructPlugin() { try { LOGGER.trace(Logging.LOADING, "Loading plugin instance {} of type {}", getModId(), this.modClass.getName()); @@ -87,43 +88,26 @@ private void constructPlugin() { final PluginContainer pluginContainer = ForgePluginContainer.of(this); final Injector childInjector = Launch.instance().lifecycle().platformInjector().createChildInjector(new PluginModule(pluginContainer, this.modClass)); this.modInstance = childInjector.getInstance(this.modClass); - ((ForgeEventManager) MinecraftForge.EVENT_BUS).registerListeners(pluginContainer, this.modInstance); + ((ForgeEventManager) NeoForge.EVENT_BUS).registerListeners(pluginContainer, this.modInstance); LOGGER.trace(Logging.LOADING, "Loaded plugin instance {} of type {}", getModId(), this.modClass.getName()); } catch (Throwable e) { LOGGER.error(Logging.LOADING, "Failed to create plugin instance. PluginID: {}, class {}", getModId(), this.modClass.getName(), e); - throw new ModLoadingException(this.modInfo, ModLoadingStage.CONSTRUCT, "fml.modloading.failedtoloadmod", e, this.modClass); + throw new ModLoadingException(ModLoadingIssue.error("fml.modloadingissue.failedtoloadmod").withCause(e).withAffectedMod(modInfo)); } try { LOGGER.trace(Logging.LOADING, "Injecting Automatic event subscribers for {}", getModId()); - AutomaticEventSubscriber.inject(this, this.scanResults, this.modClass.getClassLoader()); + AutomaticEventSubscriber.inject(this, this.scanResults, this.layer); LOGGER.trace(Logging.LOADING, "Completed Automatic event subscribers for {}", getModId()); } catch (Throwable e) { LOGGER.error(Logging.LOADING, "Failed to register automatic subscribers. PluginID: {}, class {}", getModId(), this.modClass.getName(), e); - throw new ModLoadingException(this.modInfo, ModLoadingStage.CONSTRUCT, "fml.modloading.failedtoloadmod", e, this.modClass); + throw new ModLoadingException(ModLoadingIssue.error("fml.modloadingissue.failedtoloadmod").withCause(e).withAffectedMod(modInfo)); } } @Override - public boolean matches(Object mod) { - return mod == this.modInstance; - } - - @Override - public Object getMod() { - return this.modInstance; - } - - @Override - protected void acceptEvent(final T e) { - try { - LOGGER.trace(Logging.LOADING, "Firing event for modid {} : {}", this.getModId(), e); - this.eventBus.post(e); - LOGGER.trace(Logging.LOADING, "Fired event for modid {} : {}", this.getModId(), e); - } catch (Throwable t) { - LOGGER.error(Logging.LOADING, "Caught exception during event {} dispatch for modid {}", e, this.getModId(), t); - throw new ModLoadingException(this.modInfo, this.modLoadingStage, "fml.modloading.errorduringevent", t); - } + public IEventBus getEventBus() { + return this.eventBus; } } diff --git a/forge/src/main/java/org/spongepowered/forge/SpongeAPIMod.java b/forge/src/main/java/org/spongepowered/forge/SpongeAPIMod.java index 863a0654753..dbfdcc9ea0b 100644 --- a/forge/src/main/java/org/spongepowered/forge/SpongeAPIMod.java +++ b/forge/src/main/java/org/spongepowered/forge/SpongeAPIMod.java @@ -24,7 +24,7 @@ */ package org.spongepowered.forge; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.fml.common.Mod; @Mod("spongeapi") public class SpongeAPIMod { diff --git a/forge/src/main/java/org/spongepowered/forge/SpongeForgeMod.java b/forge/src/main/java/org/spongepowered/forge/SpongeForgeMod.java index 200740664e5..a1e2ba478c9 100644 --- a/forge/src/main/java/org/spongepowered/forge/SpongeForgeMod.java +++ b/forge/src/main/java/org/spongepowered/forge/SpongeForgeMod.java @@ -25,21 +25,20 @@ package org.spongepowered.forge; import net.minecraft.client.Minecraft; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.EntityAttributeCreationEvent; -import net.minecraftforge.event.server.ServerAboutToStartEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegisterEvent; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; +import net.neoforged.neoforge.event.server.ServerAboutToStartEvent; +import net.neoforged.neoforge.event.server.ServerStartedEvent; +import net.neoforged.neoforge.event.server.ServerStoppingEvent; +import net.neoforged.neoforge.registries.RegisterEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.api.Client; @@ -53,21 +52,17 @@ import org.spongepowered.common.launch.Lifecycle; import org.spongepowered.common.network.channel.SpongeChannelManager; import org.spongepowered.common.network.packet.SpongePacketHandler; -import org.spongepowered.forge.hook.ForgeChannelHooks; -import org.spongepowered.forge.hook.ForgeEventHooks; -import org.spongepowered.forge.hook.ForgeGeneralHooks; -import org.spongepowered.forge.hook.ForgeItemHooks; -import org.spongepowered.forge.hook.ForgeWorldHooks; +import org.spongepowered.forge.hook.*; -@Mod("spongeforge") +@Mod("spongeneoforge") public final class SpongeForgeMod { - private final Logger logger = LogManager.getLogger("spongeforge"); + private final Logger logger = LogManager.getLogger("SpongeNeoForge"); public SpongeForgeMod() { // WorldPersistenceHooks.addHook(SpongeLevelDataPersistence.INSTANCE); // TODO SF 1.19.4 - final IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); + final IEventBus modBus = NeoForge.EVENT_BUS; // modBus: add all FML events with it modBus.addListener(this::onCommonSetup); @@ -76,7 +71,7 @@ public SpongeForgeMod() { modBus.addListener(this::onEntityAttributeCreationEvent); // annotation events, for non-FML things - MinecraftForge.EVENT_BUS.register(this); + modBus.register(this); // Set platform hooks as required PlatformHooks.INSTANCE.setEventHooks(new ForgeEventHooks()); @@ -138,7 +133,7 @@ public void onServerStoppingEvent(final ServerStoppingEvent event) { } public void onRegister(RegisterEvent event) { - if (event.getRegistryKey() == ForgeRegistries.Keys.ENTITY_TYPES) { + if (event.getRegistryKey() == BuiltInRegistries.ENTITY_TYPE) { SpongeEntityTypes.HUMAN = EntityType.Builder.of(HumanEntity::new, MobCategory.MISC) .noSave() .sized(0.6F, 1.8F) @@ -147,7 +142,7 @@ public void onRegister(RegisterEvent event) { .build("sponge:human") ; - event.register(ForgeRegistries.Keys.ENTITY_TYPES, helper -> helper.register(HumanEntity.KEY, SpongeEntityTypes.HUMAN)); + event.register(BuiltInRegistries.ENTITY_TYPE.key(), helper -> helper.register(HumanEntity.KEY, SpongeEntityTypes.HUMAN)); } } public void onEntityAttributeCreationEvent(final EntityAttributeCreationEvent event) { diff --git a/forge/src/main/java/org/spongepowered/forge/SpongeMod.java b/forge/src/main/java/org/spongepowered/forge/SpongeMod.java index 3785f28e1e5..b6524043c06 100644 --- a/forge/src/main/java/org/spongepowered/forge/SpongeMod.java +++ b/forge/src/main/java/org/spongepowered/forge/SpongeMod.java @@ -24,7 +24,7 @@ */ package org.spongepowered.forge; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.fml.common.Mod; @Mod("sponge") public class SpongeMod { diff --git a/forge/src/main/java/org/spongepowered/forge/hook/ForgeChannelHooks.java b/forge/src/main/java/org/spongepowered/forge/hook/ForgeChannelHooks.java index 8f5b2ace635..82e03a96b29 100644 --- a/forge/src/main/java/org/spongepowered/forge/hook/ForgeChannelHooks.java +++ b/forge/src/main/java/org/spongepowered/forge/hook/ForgeChannelHooks.java @@ -24,13 +24,14 @@ */ package org.spongepowered.forge.hook; +import io.netty.buffer.Unpooled; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.network.ForgePayload; + import org.spongepowered.api.network.EngineConnectionSide; import org.spongepowered.api.network.channel.ChannelBuf; import org.spongepowered.common.hooks.ChannelHooks; @@ -48,9 +49,9 @@ public void registerPlatformChannels(final Consumer createRegisterPayload(final ChannelBuf payload, final EngineConnectionSide side) { if (side == EngineConnectionSide.CLIENT) { - return new ServerboundCustomPayloadPacket(new ForgePayload((ResourceLocation) (Object) Constants.Channels.REGISTER_KEY, null, b -> b.writeBytes((FriendlyByteBuf) payload))); + return ServerboundCustomPayloadPacket.CONFIG_STREAM_CODEC.decode(new FriendlyByteBuf(Unpooled.buffer()).writeResourceLocation((ResourceLocation) (Object) Constants.Channels.REGISTER_KEY).writeBytes(payload.array())); } else if (side == EngineConnectionSide.SERVER) { - return new ClientboundCustomPayloadPacket(new ForgePayload((ResourceLocation) (Object) Constants.Channels.REGISTER_KEY, null, b -> b.writeBytes((FriendlyByteBuf) payload))); + return ClientboundCustomPayloadPacket.CONFIG_STREAM_CODEC.decode(new FriendlyByteBuf(Unpooled.buffer()).writeResourceLocation((ResourceLocation) (Object) Constants.Channels.REGISTER_KEY).writeBytes(payload.array())); } else { throw new UnsupportedOperationException(); } diff --git a/forge/src/main/java/org/spongepowered/forge/hook/ForgeEventHooks.java b/forge/src/main/java/org/spongepowered/forge/hook/ForgeEventHooks.java index cb304532d82..003269199d8 100644 --- a/forge/src/main/java/org/spongepowered/forge/hook/ForgeEventHooks.java +++ b/forge/src/main/java/org/spongepowered/forge/hook/ForgeEventHooks.java @@ -28,9 +28,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.event.entity.player.CriticalHitEvent; +import net.neoforged.neoforge.common.CommonHooks; +import net.neoforged.neoforge.event.entity.player.CriticalHitEvent; import org.spongepowered.common.hooks.EventHooks; @SuppressWarnings("UnstableApiUsage") @@ -40,17 +39,14 @@ public final class ForgeEventHooks implements EventHooks { public void callItemDestroyedEvent( final Player player, final ItemStack stack, final InteractionHand hand ) { - ForgeEventFactory.onPlayerDestroyItem(player, stack, InteractionHand.MAIN_HAND); + net.neoforged.neoforge.event.EventHooks.onPlayerDestroyItem(player, stack, InteractionHand.MAIN_HAND); } @Override public CriticalHitResult callCriticalHitEvent( final Player player, final Entity targetEntity, final boolean isCriticalAttack, final float v ) { - final CriticalHitEvent hitResult = ForgeHooks.getCriticalHit(player, targetEntity, isCriticalAttack, v + 1.0F); - if (hitResult != null) { - return new CriticalHitResult(true, hitResult.getDamageModifier() - 1.0F); - } - return new CriticalHitResult(false, v); + final CriticalHitEvent hitResult = CommonHooks.fireCriticalHit(player, targetEntity, isCriticalAttack, v + 1.0F); + return new CriticalHitResult(hitResult.isCriticalHit(), hitResult.getDamageMultiplier() - 1.0F); } } diff --git a/forge/src/main/java/org/spongepowered/forge/hook/ForgeGeneralHooks.java b/forge/src/main/java/org/spongepowered/forge/hook/ForgeGeneralHooks.java index 8307f66555a..b5e184f002a 100644 --- a/forge/src/main/java/org/spongepowered/forge/hook/ForgeGeneralHooks.java +++ b/forge/src/main/java/org/spongepowered/forge/hook/ForgeGeneralHooks.java @@ -26,6 +26,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.status.ServerStatus; + import org.spongepowered.common.hooks.GeneralHooks; import java.util.Optional; @@ -33,6 +34,6 @@ public class ForgeGeneralHooks implements GeneralHooks { public ServerStatus createServerStatus(ServerStatus originalStatus, Component description, Optional players, Optional version, Optional favicon) { - return new ServerStatus(description, players, version, favicon, originalStatus.enforcesSecureChat(), originalStatus.forgeData()); + return new ServerStatus(description, players, version, favicon, originalStatus.enforcesSecureChat(), originalStatus.isModded()); } } diff --git a/forge/src/main/java/org/spongepowered/forge/hook/ForgeWorldHooks.java b/forge/src/main/java/org/spongepowered/forge/hook/ForgeWorldHooks.java index 7bb6d65098e..6da70fbb6e7 100644 --- a/forge/src/main/java/org/spongepowered/forge/hook/ForgeWorldHooks.java +++ b/forge/src/main/java/org/spongepowered/forge/hook/ForgeWorldHooks.java @@ -30,8 +30,10 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.level.LevelEvent; + +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.level.LevelEvent; + import org.spongepowered.common.hooks.WorldHooks; public class ForgeWorldHooks implements WorldHooks { @@ -59,6 +61,6 @@ public boolean isRestoringBlocks(final Level world) { @Override public void postLoadWorld(final ServerLevel world) { - MinecraftForge.EVENT_BUS.post(new LevelEvent.Load(world)); + NeoForge.EVENT_BUS.post(new LevelEvent.Load(world)); } } diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/block/ChangeBlockEvent_AllMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/block/ChangeBlockEvent_AllMixin_Forge.java index d9ad83e55f4..0f5d74b2181 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/block/ChangeBlockEvent_AllMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/block/ChangeBlockEvent_AllMixin_Forge.java @@ -27,8 +27,8 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.eventbus.api.Event; +import net.neoforged.bus.api.Event; +import net.neoforged.neoforge.event.level.BlockEvent; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.block.transaction.BlockTransaction; import org.spongepowered.api.block.transaction.Operation; diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/entity/ChangeEntityWorldEvent_PreMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/entity/ChangeEntityWorldEvent_PreMixin_Forge.java index 30a236eefe4..2b42a80c563 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/entity/ChangeEntityWorldEvent_PreMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/entity/ChangeEntityWorldEvent_PreMixin_Forge.java @@ -26,8 +26,8 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; -import net.minecraftforge.event.entity.EntityTravelToDimensionEvent; -import net.minecraftforge.eventbus.api.Event; +import net.neoforged.bus.api.Event; +import net.neoforged.neoforge.event.entity.EntityTravelToDimensionEvent; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.event.entity.ChangeEntityWorldEvent; import org.spongepowered.asm.mixin.Mixin; diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/entity/ChangeEventWorldEvent_PostMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/entity/ChangeEventWorldEvent_PostMixin_Forge.java index f85995d0727..5fcebabc2a9 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/entity/ChangeEventWorldEvent_PostMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/api/event/entity/ChangeEventWorldEvent_PostMixin_Forge.java @@ -26,8 +26,8 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.Event; +import net.neoforged.bus.api.Event; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.event.entity.ChangeEntityWorldEvent; import org.spongepowered.asm.mixin.Mixin; diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/commands/CommandsMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/commands/CommandsMixin_Forge.java index 94dbf3edd68..15fc4eb52d8 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/commands/CommandsMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/commands/CommandsMixin_Forge.java @@ -31,9 +31,8 @@ import net.minecraft.commands.Commands; import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.server.command.CommandHelper; +import net.neoforged.neoforge.event.CommandEvent; +import net.neoforged.neoforge.server.command.CommandHelper; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.event.CauseStackManager; import org.spongepowered.api.event.EventContextKeys; @@ -59,8 +58,8 @@ public abstract class CommandsMixin_Forge { // The event fired by Forge is fired in SpongeForgeCommandManager at the appropriate time. @Redirect(method = "performCommand", - at = @At(value = "INVOKE", target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z")) - private boolean forge$redirectToSpongeCommandManager(IEventBus instance, Event event) { + at = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/event/CommandEvent;isCanceled()Z")) + private boolean forge$redirectToSpongeCommandManager(CommandEvent event) { return false; } @@ -68,7 +67,7 @@ public abstract class CommandsMixin_Forge { @SuppressWarnings("unchecked") @Redirect(method = "sendCommands", at = @At( value = "INVOKE", - target = "Lnet/minecraftforge/server/command/CommandHelper;mergeCommandNode(Lcom/mojang/brigadier/tree/CommandNode;Lcom/mojang/brigadier/tree/CommandNode;Ljava/util/Map;Ljava/lang/Object;Lcom/mojang/brigadier/Command;Ljava/util/function/Function;)V", + target = "Lnet/neoforged/neoforge/server/command/CommandHelper;mergeCommandNode(Lcom/mojang/brigadier/tree/CommandNode;Lcom/mojang/brigadier/tree/CommandNode;Ljava/util/Map;Ljava/lang/Object;Lcom/mojang/brigadier/Command;Ljava/util/function/Function;)V", remap = false )) private void impl$addNonBrigSuggestions( diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/MinecraftForgeMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/MinecraftForgeMixin_Forge.java index 1f23d293092..536ca09e693 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/MinecraftForgeMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/MinecraftForgeMixin_Forge.java @@ -24,21 +24,21 @@ */ package org.spongepowered.forge.mixin.core.minecraftforge; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.BusBuilderImpl; -import net.minecraftforge.eventbus.api.BusBuilder; -import net.minecraftforge.eventbus.api.IEventBus; +import net.neoforged.bus.BusBuilderImpl; +import net.neoforged.bus.api.BusBuilder; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.common.NeoForge; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.forge.launch.event.ForgeEventManager; import org.spongepowered.forge.launch.event.SpongeEventBus; -@Mixin(MinecraftForge.class) +@Mixin(NeoForge.class) public abstract class MinecraftForgeMixin_Forge { @Redirect(method = "", at = @At(value = "INVOKE", - target = "Lnet/minecraftforge/eventbus/api/BusBuilder;build()Lnet/minecraftforge/eventbus/api/IEventBus;", remap = false)) + target = "Lnet/neoforged/bus/api/BusBuilder;build()Lnet/neoforged/bus/api/IEventBus;", remap = false)) private static IEventBus forge$substituteForgeEventBus(final BusBuilder builder) { return new ForgeEventManager(new SpongeEventBus((BusBuilderImpl) builder)); } diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/EntityTravelToDimensionEventMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/EntityTravelToDimensionEventMixin_Forge.java index bb964ccbbfe..29b5b8acf58 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/EntityTravelToDimensionEventMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/EntityTravelToDimensionEventMixin_Forge.java @@ -28,8 +28,8 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; -import net.minecraftforge.event.entity.EntityEvent; -import net.minecraftforge.event.entity.EntityTravelToDimensionEvent; +import net.neoforged.neoforge.event.entity.EntityEvent; +import net.neoforged.neoforge.event.entity.EntityTravelToDimensionEvent; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.event.Event; import org.spongepowered.api.event.SpongeEventFactory; @@ -52,7 +52,7 @@ public abstract class EntityTravelToDimensionEventMixin_Forge implements ForgeEv @Override public void bridge$syncFrom(final Event event) { if (event instanceof ChangeEntityWorldEvent.Pre) { - ((net.minecraftforge.eventbus.api.Event) (Object) this).setCanceled(((ChangeEntityWorldEvent.Pre) event).isCancelled()); + ((EntityTravelToDimensionEvent) (Object) this).setCanceled(((ChangeEntityWorldEvent.Pre) event).isCancelled()); this.dimension = ((ServerLevel) ((ChangeEntityWorldEvent.Pre) event).destinationWorld()).dimension(); } } @@ -60,7 +60,7 @@ public abstract class EntityTravelToDimensionEventMixin_Forge implements ForgeEv @Override public void bridge$syncTo(final Event event) { if (event instanceof ChangeEntityWorldEvent.Pre) { - ((ChangeEntityWorldEvent.Pre) event).setCancelled(((net.minecraftforge.eventbus.api.Event) (Object) this).isCanceled()); + ((ChangeEntityWorldEvent.Pre) event).setCancelled(((EntityTravelToDimensionEvent) (Object) this).isCanceled()); } } diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/player/PlayerEvent_PlayerChangedDimensionEventMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/player/PlayerEvent_PlayerChangedDimensionEventMixin_Forge.java index f7490394fde..54df86a54be 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/player/PlayerEvent_PlayerChangedDimensionEventMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/entity/player/PlayerEvent_PlayerChangedDimensionEventMixin_Forge.java @@ -26,7 +26,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; -import net.minecraftforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; import org.spongepowered.api.entity.Entity; import org.spongepowered.api.event.Event; import org.spongepowered.api.event.SpongeEventFactory; diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEventMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEventMixin_Forge.java index 166b9201a39..4b435265efb 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEventMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEventMixin_Forge.java @@ -27,7 +27,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.event.level.BlockEvent; +import net.neoforged.neoforge.event.level.BlockEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEvent_BreakEventMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEvent_BreakEventMixin_Forge.java index 55845d3e685..34f2abf99c5 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEvent_BreakEventMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/event/world/BlockEvent_BreakEventMixin_Forge.java @@ -25,7 +25,7 @@ package org.spongepowered.forge.mixin.core.minecraftforge.event.world; import net.minecraft.world.level.LevelAccessor; -import net.minecraftforge.event.level.BlockEvent; +import net.neoforged.neoforge.event.level.BlockEvent; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.block.BlockState; import org.spongepowered.api.block.BlockTypes; @@ -57,14 +57,14 @@ public abstract class BlockEvent_BreakEventMixin_Forge extends BlockEventMixin_F .stream() .filter(x -> x.original().position().equals(pos)) .anyMatch(x -> !x.isValid() || x.operation() != Operations.BREAK.get() || x.custom().isPresent())) { - ((net.minecraftforge.eventbus.api.Event) (Object) this).setCanceled(true); + ((BlockEvent.BreakEvent) (Object) this).setCanceled(true); } } } @Override public void bridge$syncTo(final Event event) { - if (event instanceof ChangeBlockEvent.All && ((net.minecraftforge.eventbus.api.Event) (Object) this).isCanceled()) { + if (event instanceof ChangeBlockEvent.All && ((BlockEvent.BreakEvent) (Object) this).isCanceled()) { final Vector3i pos = VecHelper.toVector3i(this.shadow$getPos()); ((ChangeBlockEvent.All) event).transactions(Operations.BREAK.get()).filter(x -> x.original().position().equals(pos)) .forEach(x -> x.setValid(false)); diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/internal/BrandingControlMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/internal/BrandingControlMixin_Forge.java index 841f6ba78ea..7333f3437d1 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/internal/BrandingControlMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/internal/BrandingControlMixin_Forge.java @@ -24,7 +24,7 @@ */ package org.spongepowered.forge.mixin.core.minecraftforge.internal; -import net.minecraftforge.internal.BrandingControl; +import net.neoforged.neoforge.internal.BrandingControl; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/registries/ForgeRegistryMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/registries/ForgeRegistryMixin_Forge.java index d382d4bd688..5f9b36b560f 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/registries/ForgeRegistryMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/registries/ForgeRegistryMixin_Forge.java @@ -25,10 +25,9 @@ package org.spongepowered.forge.mixin.core.minecraftforge.registries; import com.google.common.collect.Maps; +import net.minecraft.core.MappedRegistry; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.registries.ForgeRegistry; -import net.minecraftforge.registries.IForgeRegistry; import org.spongepowered.api.ResourceKey; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -45,7 +44,11 @@ import java.util.Map; import java.util.StringJoiner; -@Mixin(ForgeRegistry.class) +// TODO +// IForgeRegistry -> IRegistryExtension +// ForgeRegistry -> BaseMappedRegistry, также имеет некоторую реализацию в ванильном MappedRegistry +// Хрен пойми, нужен ли этот миксин вообще. Я так и не смог понять, на что заменили SlaveMap (и заменили ли вообще) +@Mixin(MappedRegistry.class)//@Mixin(ForgeRegistry.class) public abstract class ForgeRegistryMixin_Forge { // @formatter:off @@ -55,7 +58,7 @@ public abstract class ForgeRegistryMixin_Forge { private final Map> forge$parents = Maps.newHashMap(); private boolean forge$warnedIfNoParent; - @Inject(method = "add(ILnet/minecraft/resources/ResourceLocation;Ljava/lang/Object;Ljava/lang/String;)I", at = @At("TAIL")) + /*@Inject(method = "add(ILnet/minecraft/resources/ResourceLocation;Ljava/lang/Object;Ljava/lang/String;)I", at = @At("TAIL")) public void forge$writeToParent(final int id, final ResourceLocation key, final V value, final String owner, final CallbackInfoReturnable cir) { final ResourceKey root = (ResourceKey) (Object) this.key.registry(); final ResourceKey location = (ResourceKey) (Object) this.key.location(); @@ -83,6 +86,6 @@ public abstract class ForgeRegistryMixin_Forge { if (obj instanceof RegistryBridge) { this.forge$parents.put((ResourceKey) (Object) key.name(), (RegistryBridge) obj); } - } + }*/ } diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/registries/RegistryManagerMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/registries/RegistryManagerMixin_Forge.java index f591b0f1463..b5d1bd817d0 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/registries/RegistryManagerMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/minecraftforge/registries/RegistryManagerMixin_Forge.java @@ -25,8 +25,8 @@ package org.spongepowered.forge.mixin.core.minecraftforge.registries; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.registries.ForgeRegistry; -import net.minecraftforge.registries.RegistryManager; +import net.neoforged.neoforge.registries.RegistryManager; +import net.neoforged.neoforge.registries.RegistrySnapshot; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -39,13 +39,13 @@ public class RegistryManagerMixin_Forge { @SuppressWarnings("UnstableApiUsage") @Inject(method = "takeSnapshot", at = @At("RETURN")) - public void forge$dontSendSpongeDataToClient(boolean savingToDisc, CallbackInfoReturnable> cir) { - if (savingToDisc) { + public void forge$dontSendSpongeDataToClient(RegistryManager.SnapshotType snapshotType, CallbackInfoReturnable> cir) { + if (snapshotType == RegistryManager.SnapshotType.FULL) { return; } - for (ForgeRegistry.Snapshot snapshot : cir.getReturnValue().values()) { - snapshot.ids.keySet().removeIf(loc -> loc.getNamespace().equals("sponge")); + for (RegistrySnapshot snapshot : cir.getReturnValue().values()) { + snapshot.getIds().values().removeIf(loc -> loc.getNamespace().equals("sponge")); } } } diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/server/commands/SpreadPlayersCommandMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/server/commands/SpreadPlayersCommandMixin_Forge.java index 94adf0c914b..770381f25cb 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/server/commands/SpreadPlayersCommandMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/server/commands/SpreadPlayersCommandMixin_Forge.java @@ -26,8 +26,8 @@ import net.minecraft.server.commands.SpreadPlayersCommand; import net.minecraft.world.entity.Entity; -import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.event.entity.EntityTeleportEvent; +import net.neoforged.neoforge.event.EventHooks; +import net.neoforged.neoforge.event.entity.EntityTeleportEvent; import org.spongepowered.api.event.CauseStackManager; import org.spongepowered.api.event.EventContextKeys; import org.spongepowered.api.event.cause.entity.MovementTypes; @@ -41,13 +41,13 @@ public abstract class SpreadPlayersCommandMixin_Forge { @Redirect(method = "setPlayerPositions", at = @At( value = "INVOKE", - target = "Lnet/minecraftforge/event/ForgeEventFactory;onEntityTeleportSpreadPlayersCommand(Lnet/minecraft/world/entity/Entity;DDD)Lnet/minecraftforge/event/entity/EntityTeleportEvent$SpreadPlayersCommand;" + target = "Lnet/neoforged/neoforge/event/EventHooks;onEntityTeleportSpreadPlayersCommand(Lnet/minecraft/world/entity/Entity;DDD)Lnet/neoforged/neoforge/event/entity/EntityTeleportEvent$SpreadPlayersCommand;" )) private static EntityTeleportEvent.SpreadPlayersCommand vanilla$createCauseFrameForTeleport(Entity entity, double targetX, double targetY, double targetZ) { try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) { frame.addContext(EventContextKeys.MOVEMENT_TYPE, MovementTypes.COMMAND); - return ForgeEventFactory.onEntityTeleportSpreadPlayersCommand(entity, targetX, targetY, targetZ); + return EventHooks.onEntityTeleportSpreadPlayersCommand(entity, targetX, targetY, targetZ); } } } diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/world/entity/LivingEntityMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/world/entity/LivingEntityMixin_Forge.java index 819262550c7..64bcc4351c9 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/world/entity/LivingEntityMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/world/entity/LivingEntityMixin_Forge.java @@ -26,7 +26,8 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.common.ForgeHooks; +import net.neoforged.neoforge.common.CommonHooks; +import net.neoforged.neoforge.common.damagesource.DamageContainer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -49,16 +50,18 @@ public abstract class LivingEntityMixin_Forge implements PlatformLivingEntityBri @Override public boolean bridge$onLivingAttack(final LivingEntity entity, final DamageSource source, final float amount) { - return ForgeHooks.onLivingAttack(entity, source, amount); + return CommonHooks.onEntityIncomingDamage(entity, new DamageContainer(source, amount)); } @Override public float bridge$applyModDamage(final LivingEntity entity, final DamageSource source, final float damage) { - return ForgeHooks.onLivingHurt(entity, source, damage); + return CommonHooks.onLivingDamagePre(entity, new DamageContainer(source, damage)); } @Override public float bridge$applyModDamageBeforeFunctions(final LivingEntity entity, final DamageSource source, final float damage) { - return ForgeHooks.onLivingDamage(entity, source, damage); + // TODO This was + // return ForgeHooks.onLivingDamage(entity, source, damage); + return damage; } } diff --git a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin_Forge.java b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin_Forge.java index ebff4495789..fa068009ebe 100644 --- a/forge/src/mixins/java/org/spongepowered/forge/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin_Forge.java +++ b/forge/src/mixins/java/org/spongepowered/forge/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin_Forge.java @@ -57,13 +57,12 @@ import org.spongepowered.common.inventory.adapter.impl.slots.SlotAdapter; import org.spongepowered.common.item.util.ItemStackUtil; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; -import javax.annotation.Nullable; - @Mixin(AbstractFurnaceBlockEntity.class) public abstract class AbstractFurnaceBlockEntityMixin_Forge implements AbstractFurnaceBlockEntityBridge { diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml old mode 100644 new mode 100755 index dc6fd67f2f8..4da99591ddd --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -146,6 +146,14 @@ + + + + + + + + @@ -178,6 +186,14 @@ + + + + + + + + @@ -555,6 +571,14 @@ + + + + + + + + @@ -651,6 +675,11 @@ + + + + + @@ -744,6 +773,14 @@ + + + + + + + + @@ -795,6 +832,11 @@ + + + + + @@ -867,6 +909,14 @@ + + + + + + + + @@ -1292,6 +1342,14 @@ + + + + + + + + @@ -1300,6 +1358,14 @@ + + + + + + + + @@ -1324,6 +1390,14 @@ + + + + + + + + @@ -1332,6 +1406,14 @@ + + + + + + + + @@ -1562,6 +1644,14 @@ + + + + + + + + @@ -1863,12 +1953,12 @@ - - - - - - + + + + + + @@ -1886,6 +1976,14 @@ + + + + + + + + @@ -2449,6 +2547,14 @@ + + + + + + + + @@ -3032,6 +3138,14 @@ + + + + + + + + @@ -3091,6 +3205,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3251,6 +3512,11 @@ + + + + + @@ -3349,6 +3615,11 @@ + + + + + @@ -4000,6 +4271,14 @@ + + + + + + + + @@ -4078,6 +4357,11 @@ + + + + + @@ -4088,6 +4372,24 @@ + + + + + + + + + + + + + + + + + + @@ -5357,6 +5659,14 @@ + + + + + + + + @@ -5389,6 +5699,14 @@ + + + + + + + + @@ -5426,6 +5744,14 @@ + + + + + + + + @@ -5442,6 +5768,14 @@ + + + + + + + + diff --git a/settings.gradle.kts b/settings.gradle.kts old mode 100644 new mode 100755 index 6ad57d49c5e..a1c0d1e5333 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -93,6 +93,22 @@ if (spongeForgeEnabledInCi.toBoolean()) { include(":SpongeForge") project(":SpongeForge").projectDir = file("forge") } +val spongeNeoForge = file("spongeneoforge.settings.gradle.kts") +if (spongeNeoForge.exists()) { + apply(from = spongeNeoForge) +} else { + spongeNeoForge.writeText(listOf( + "// Uncomment to enable SpongeForge module.", + "// By default only Sponge and SpongeVanilla are made available", + "//include(\":SpongeNeoForge\")", + "//project(\":SpongeNeoForge\").projectDir = file(\"neoforge\")" + ).joinToString(separator = System.lineSeparator(), postfix = System.lineSeparator())) +} +val spongeNeoForgeEnabledInCi: String = startParameter.projectProperties.getOrDefault("enableSpongeNeoForge", "true") +if (spongeForgeEnabledInCi.toBoolean()) { + include(":SpongeNeoForge") + project(":SpongeNeoForge").projectDir = file("neoforge") +} // Include properties from API project (with api prefix) val apiProps = file("SpongeAPI/gradle.properties") diff --git a/spongeneoforge.settings.gradle.kts b/spongeneoforge.settings.gradle.kts new file mode 100644 index 00000000000..47955515f69 --- /dev/null +++ b/spongeneoforge.settings.gradle.kts @@ -0,0 +1,4 @@ +// Uncomment to enable SpongeForge module. +// By default only Sponge and SpongeVanilla are made available +include(":SpongeNeoForge") +project(":SpongeNeoForge").projectDir = file("forge")