diff --git a/build_forge.gradle b/build_forge.gradle index ef6b69ef73..6674d47a7a 100644 --- a/build_forge.gradle +++ b/build_forge.gradle @@ -127,8 +127,7 @@ dependencies { installer(libs.eventbus) installer(libs.jspecify) // Dep of EventBus installer(libs.forgespi) - installer(libs.coremods) - installer(libs.nashorn) // Dep of Coremods + installer(libs.coremods.api) installer(libs.modlauncher) installer(libs.mergetool.api) installer(libs.bundles.night.config) diff --git a/fmlloader/build.gradle b/fmlloader/build.gradle index 70cae8a9d0..1ee709ae2a 100644 --- a/fmlloader/build.gradle +++ b/fmlloader/build.gradle @@ -26,7 +26,6 @@ dependencies { api(libs.apache.commons) api(libs.bundles.night.config) api(libs.modlauncher) - api(libs.coremods) api(libs.mojang.logging) api(libs.jarjar.selector) api(libs.jarjar.meta) diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java index e210ecdf68..835d96733f 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java @@ -16,7 +16,6 @@ import net.minecraftforge.accesstransformer.service.AccessTransformerService; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.loading.targets.CommonLaunchHandler; import net.minecraftforge.forgespi.Environment; -import net.minecraftforge.forgespi.coremod.ICoreModProvider; import org.slf4j.Logger; import java.nio.file.Path; @@ -34,7 +33,6 @@ import static net.minecraftforge.fml.loading.LogMarkers.SCAN; public class FMLLoader { private static final Logger LOGGER = LogUtils.getLogger(); private static AccessTransformerService accessTransformer; - private static ICoreModProvider coreModProvider; private static LanguageLoadingProvider languageLoadingProvider; private static Dist dist; private static String naming; @@ -57,8 +55,6 @@ public class FMLLoader { checkPackage(ITransformationService.class, "4.0", "ModLauncher"); accessTransformer = getPlugin(env, "accesstransformer", "1.0", "AccessTransformer"); runtimeDistCleaner = getPlugin(env, "runtimedistcleaner", "1.0", "RuntimeDistCleaner"); - coreModProvider = getSingleService(ICoreModProvider.class, "CoreMod"); - LOGGER.debug(CORE, "FML found CoreMod version : {}", JarVersionLookupHandler.getInfo(coreModProvider.getClass()).impl().version().orElse("MISSING")); checkPackage(Environment.class, "2.0", "ForgeSPI"); try { @@ -96,6 +92,7 @@ public class FMLLoader { } } + @SuppressWarnings("unused") private static T getSingleService(Class clazz, String name) throws IncompatibleEnvironmentException { var providers = new ArrayList(); for (var itr = ServiceLoader.load(FMLLoader.class.getModule().getLayer(), clazz).iterator(); itr.hasNext(); ) { @@ -160,10 +157,6 @@ public class FMLLoader { return List.of(modValidator.getModResources()); } - public static ICoreModProvider getCoreModProvider() { - return coreModProvider; - } - public static LanguageLoadingProvider getLanguageLoadingProvider() { return languageLoadingProvider; } diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLServiceProvider.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLServiceProvider.java index 6f2dca80e3..f5b2258d1f 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLServiceProvider.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLServiceProvider.java @@ -68,7 +68,6 @@ public class FMLServiceProvider implements ITransformationService { @SuppressWarnings("rawtypes") @Override public @NotNull List transformers() { - LOGGER.debug(CORE, "Loading coremod transformers"); - return new ArrayList<>(FMLLoader.getCoreModProvider().getCoreModTransformers()); + return List.of(); } } diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/LoadingModList.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/LoadingModList.java index 7b7947821e..b12f480abb 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/LoadingModList.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/LoadingModList.java @@ -56,14 +56,6 @@ public class LoadingModList { return INSTANCE; } - public void addCoreMods() { - modFiles.stream() - .map(ModFileInfo::getFile) - .map(ModFile::getCoreMods) - .flatMap(List::stream) - .forEach(FMLLoader.getCoreModProvider()::addCoreMod); - } - public void addAccessTransformers() { for (ModFileInfo modFile : modFiles) { ModFile mod = modFile.getFile(); diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/CoreModFile.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/CoreModFile.java deleted file mode 100644 index f6328221d2..0000000000 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/CoreModFile.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.minecraftforge.fml.loading.moddiscovery; - -import net.minecraftforge.forgespi.coremod.ICoreModFile; - -import java.io.IOException; -import java.io.Reader; -import java.nio.file.Files; -import java.nio.file.Path; - -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public final class CoreModFile implements ICoreModFile { - private final Path internalPath; - private final ModFile file; - private final String name; - - CoreModFile(final String name, final Path path, final ModFile file) { - this.name = name; - this.internalPath = path; - this.file = file; - } - - @Override - public Reader readCoreMod() throws IOException { - return Files.newBufferedReader(this.internalPath); - } - - @Override - public Path getPath() { - return this.internalPath; - } - - @Override - public Reader getAdditionalFile(final String fileName) throws IOException { - return Files.newBufferedReader(file.findResource(fileName)); - } - - @Override - public String getOwnerId() { - return this.file.getModInfos().get(0).getModId(); - } - - @Override - public String toString() { - return "{Name: " + name + ", Owner: " + getOwnerId() + " @ " + getPath() + "}"; - } -} diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java index 3c033d878b..349784e41d 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java @@ -48,7 +48,6 @@ public class ModFile implements IModFile { private final IModFileInfo modFileInfo; private ModFileScanData fileModFileScanData; private CompletableFuture futureScanResult; - private List coreMods; private Path accessTransformer; static final Attributes.Name TYPE = new Attributes.Name("FMLModType"); @@ -99,19 +98,10 @@ public class ModFile implements IModFile { public boolean identifyMods() { if (this.modFileInfo == null) return this.getType() != Type.MOD; LOGGER.debug(LogMarkers.LOADING,"Loading mod file {} with languages {}", this.getFileName(), this.modFileInfo.requiredLanguageLoaders()); - this.coreMods = ModFileParser.getCoreMods(this); - if (!this.coreMods.isEmpty()) - LOGGER.warn("Mod file {} contains javascript coremods! JS CoreMods are deprecated and will be removed in a future release. Consider using Mixin or ModLauncher transformers.", this.getFileName()); - for (var mi : this.coreMods) - LOGGER.debug(LogMarkers.LOADING, "Found coremod {}", mi.getPath()); this.accessTransformer = findResource("META-INF", "accesstransformer.cfg"); return true; } - public List getCoreMods() { - return coreMods; - } - /** * Run in an executor thread to harvest the class and annotation list */ diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFileParser.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFileParser.java index 1d3c0dada3..9c25c42985 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFileParser.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFileParser.java @@ -6,8 +6,6 @@ package net.minecraftforge.fml.loading.moddiscovery; import com.electronwill.nightconfig.core.file.FileConfig; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import com.mojang.logging.LogUtils; import net.minecraftforge.fml.loading.LogMarkers; import net.minecraftforge.forgespi.language.IModFileInfo; @@ -16,13 +14,8 @@ import net.minecraftforge.forgespi.locating.ModFileFactory; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; -import java.io.IOException; -import java.lang.reflect.Type; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collections; -import java.util.List; -import java.util.Map; public class ModFileParser { private static final Logger LOGGER = LogUtils.getLogger(); @@ -46,25 +39,4 @@ public class ModFileParser { final NightConfigWrapper configWrapper = new NightConfigWrapper(fileConfig); return new ModFileInfo(modFile, configWrapper, configWrapper::setFile); } - - protected static List getCoreMods(final ModFile modFile) { - Map coreModPaths; - try { - final Path coremodsjson = modFile.findResource("META-INF", "coremods.json"); - if (!Files.exists(coremodsjson)) { - return Collections.emptyList(); - } - final Type type = new TypeToken>() {}.getType(); - final Gson gson = new Gson(); - coreModPaths = gson.fromJson(Files.newBufferedReader(coremodsjson), type); - } catch (IOException e) { - LOGGER.debug(LogMarkers.LOADING,"Failed to read coremod list coremods.json", e); - return Collections.emptyList(); - } - - return coreModPaths.entrySet().stream() - .peek(e-> LOGGER.debug(LogMarkers.LOADING,"Found coremod {} with Javascript path {}", e.getKey(), e.getValue())) - .map(e -> new CoreModFile(e.getKey(), modFile.findResource(e.getValue()),modFile)) - .toList(); - } } diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModValidator.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModValidator.java index b182043d08..a000f5d680 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModValidator.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModValidator.java @@ -125,7 +125,6 @@ public class ModValidator { allErrors.addAll(this.discoveryErrorData); loadingModList = ModSorter.sort(candidateMods, allErrors); - loadingModList.addCoreMods(); loadingModList.addAccessTransformers(); loadingModList.setBrokenFiles(brokenFiles); BackgroundScanHandler backgroundScanHandler = new BackgroundScanHandler(candidateMods); diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonDevLaunchHandler.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonDevLaunchHandler.java index 4298506f1b..570b6a680f 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonDevLaunchHandler.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/targets/CommonDevLaunchHandler.java @@ -156,7 +156,6 @@ abstract class CommonDevLaunchHandler extends CommonLaunchHandler { return new String[] { "net/minecraftforge/", "META-INF/services/", - "META-INF/coremods.json", "META-INF/mods.toml" }; } diff --git a/forge-transformers/build.gradle b/forge-transformers/build.gradle index e48c65d900..105a289c88 100644 --- a/forge-transformers/build.gradle +++ b/forge-transformers/build.gradle @@ -19,7 +19,7 @@ dependencies { implementation(libs.log4j.api) implementation(libs.gson) implementation(libs.modlauncher) - implementation(libs.coremods) // Used for ASMAPI (for now) + implementation(libs.coremods.api) testCompileOnly(libs.jetbrains.annotations) } diff --git a/forge-transformers/src/main/java/net/minecraftforge/forge/transformers/FieldToMethodTransformer.java b/forge-transformers/src/main/java/net/minecraftforge/forge/transformers/FieldToMethodTransformer.java index 3415744140..5f5df8e829 100644 --- a/forge-transformers/src/main/java/net/minecraftforge/forge/transformers/FieldToMethodTransformer.java +++ b/forge-transformers/src/main/java/net/minecraftforge/forge/transformers/FieldToMethodTransformer.java @@ -8,16 +8,27 @@ package net.minecraftforge.forge.transformers; import cpw.mods.modlauncher.api.ITransformer; import cpw.mods.modlauncher.api.ITransformerVotingContext; import cpw.mods.modlauncher.api.TransformerVoteResult; -import net.minecraftforge.coremod.api.ASMAPI; -import org.jetbrains.annotations.NotNull; -import org.objectweb.asm.tree.ClassNode; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.FieldNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; + +import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; record FieldToMethodTransformer(String className, Map fields) implements ITransformer { + private static final Logger LOGGER = LogManager.getLogger(); + // TODO [Forge][Transformer] Make this properly data driven or configurable. // It was hard-coded like this before when using JS CoreMods, though. static final Map> TARGETS = Map.of( @@ -60,7 +71,7 @@ record FieldToMethodTransformer(String className, Map fields) im @Override public @NotNull ClassNode transform(ClassNode input, ITransformerVotingContext context) { for (var entry : this.fields.entrySet()) { - ASMAPI.redirectFieldToMethod(input, entry.getKey(), entry.getValue()); + redirectFieldToMethod(input, entry.getKey(), entry.getValue()); } return input; @@ -75,4 +86,73 @@ record FieldToMethodTransformer(String className, Map fields) im public @NotNull Set targets() { return Set.of(Target.targetClass(this.className)); } + + private static final @Nullable FieldNode findField(final ClassNode classNode, final String name) { + FieldNode ret = null; + for (var fieldNode : classNode.fields) { + if (name.equals(fieldNode.name)) { + if (ret != null) + throw new IllegalStateException("Found multiple fields with name " + name); + ret = fieldNode; + } + } + return ret; + } + + private static final @Nullable MethodNode findMethod(final ClassNode classNode, final String name, final String desc) { + for (var methodNode : classNode.methods) { + if (name.equals(methodNode.name) && desc.equals(methodNode.desc)) + return methodNode; + } + return null; + } + + /** + * Rewrites accesses to a specific field in the given class to a method-call. + *

+ * The field specified by fieldName must be private and non-static. The method-call the field-access is redirected + * to does not take any parameters and returns an object of the same type as the field. If no methodName is passed, + * any method matching the described signature will be used as callable method. + * + * @param classNode the class to rewrite the accesses in + * @param fieldName the field accesses should be redirected to + * @param methodName the name of the method to redirect accesses through + * @apiNote This method was written as a special use case for Forge. It is not recommended to use this method + * unless you know what you are doing. + */ + private static void redirectFieldToMethod(final ClassNode classNode, final String fieldName, final String methodName) { + var foundField = findField(classNode, fieldName); + if (foundField == null) + throw new IllegalStateException("No field with name " + fieldName + " found"); + + if (!Modifier.isPrivate(foundField.access) || Modifier.isStatic(foundField.access)) + throw new IllegalStateException("Field " + fieldName + " is not private and an instance field"); + + var methodSignature = "()" + foundField.desc; + var foundMethod = findMethod(classNode, methodName, methodSignature); + if (foundMethod == null) + throw new IllegalStateException("Unable to find method " + methodName + methodSignature); + + for (MethodNode methodNode : classNode.methods) { + // skip the found getter method + if (methodNode == foundMethod) continue; + + // Why is this filtered? UI twas added in the beginning but would it matter? + if (methodSignature.equals(foundMethod)) { + LOGGER.debug("FieldToMethodTransformer " + classNode.name + " skipping " + methodNode.name + methodNode.hashCode()); + continue; + } + + for (var insn : methodNode.instructions) { + if (insn.getOpcode() != Opcodes.GETFIELD) + continue; + + var fieldInsnNode = (FieldInsnNode)insn; + if (fieldName.equals(fieldInsnNode.name)) { + var replace = new MethodInsnNode(Opcodes.INVOKEVIRTUAL, classNode.name, foundMethod.name, foundMethod.desc, false); + methodNode.instructions.set(insn, replace); + } + } + } + } } diff --git a/forge-transformers/src/main/java/net/minecraftforge/forge/transformers/MethodRedirector.java b/forge-transformers/src/main/java/net/minecraftforge/forge/transformers/MethodRedirector.java index 58f13fb406..dfa92c5f46 100644 --- a/forge-transformers/src/main/java/net/minecraftforge/forge/transformers/MethodRedirector.java +++ b/forge-transformers/src/main/java/net/minecraftforge/forge/transformers/MethodRedirector.java @@ -10,14 +10,15 @@ import com.google.gson.annotations.SerializedName; import cpw.mods.modlauncher.api.ITransformer; import cpw.mods.modlauncher.api.ITransformerVotingContext; import cpw.mods.modlauncher.api.TransformerVoteResult; -import net.minecraftforge.coremod.api.ASMAPI; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; import java.io.InputStreamReader; import java.util.ArrayList; @@ -36,15 +37,16 @@ record MethodRedirector() implements ITransformer { private static final Replacement[] REPLACEMENTS = { new Replacement( // finalizeSpawn redirection to ForgeEventFactory.onFinalizeSpawn - ASMAPI.MethodType.VIRTUAL, + Opcodes.INVOKEVIRTUAL, "finalizeSpawn", "(Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/world/DifficultyInstance;Lnet/minecraft/world/entity/EntitySpawnReason;Lnet/minecraft/world/entity/SpawnGroupData;)Lnet/minecraft/world/entity/SpawnGroupData;", GSON.fromJson(new InputStreamReader(sneak(() -> MethodRedirector.class.getModule().getResourceAsStream("coremods/finalize_spawn_targets.json"))), Target[].class), - insn -> ASMAPI.buildMethodCall( - ASMAPI.MethodType.STATIC, + insn -> new MethodInsnNode( + Opcodes.INVOKESTATIC, "net/minecraftforge/event/ForgeEventFactory", "onFinalizeSpawn", - "(Lnet/minecraft/world/entity/Mob;Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/world/DifficultyInstance;Lnet/minecraft/world/entity/EntitySpawnReason;Lnet/minecraft/world/entity/SpawnGroupData;)Lnet/minecraft/world/entity/SpawnGroupData;" + "(Lnet/minecraft/world/entity/Mob;Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/world/DifficultyInstance;Lnet/minecraft/world/entity/EntitySpawnReason;Lnet/minecraft/world/entity/SpawnGroupData;)Lnet/minecraft/world/entity/SpawnGroupData;", + false ) ) }; @@ -58,7 +60,7 @@ record MethodRedirector() implements ITransformer { } record Replacement( - ASMAPI.MethodType type, + int opcode, String name, String desc, Target[] targets, @@ -94,7 +96,7 @@ record MethodRedirector() implements ITransformer { var splitPos = methodString.indexOf('('); var methodName = methodString.substring(0, splitPos); var methodDesc = methodString.substring(splitPos); - var method = ASMAPI.findMethodNode(clazz, methodName, methodDesc); + var method = findMethodNode(clazz, methodName, methodDesc); if (method == null) { LOGGER.error("Failed to redirect method call for {}! Method {} not found in class {}! This is a Forge bug, and is likely due to a Minecraft update changing something.", replacement.name, methodString, clazz.name); @@ -107,7 +109,7 @@ record MethodRedirector() implements ITransformer { var methodInsn = (MethodInsnNode) insn; var redirection = replacement.factory.apply(methodInsn); LOGGER.debug("Redirecting method call {}{} to {}{} inside of {}.{}", methodInsn.name, methodInsn.desc, redirection.name, redirection.desc, clazz.name, method.name); - ASMAPI.insertInsn(method, methodInsn, redirection, ASMAPI.InsertMode.REMOVE_ORIGINAL); + method.instructions.set(insn, redirection); } } } @@ -115,8 +117,16 @@ record MethodRedirector() implements ITransformer { return clazz; } + private static @Nullable MethodNode findMethodNode(ClassNode clazz, String name, String desc) { + for (var method : clazz.methods) { + if (name.equals(method.name) && desc.equals(method.desc)) + return method; + } + return null; + } + private static boolean shouldReplace(AbstractInsnNode insn, Replacement replacement) { - return insn.getOpcode() == replacement.type.toOpcode() + return insn.getOpcode() == replacement.opcode && replacement.name.equals(((MethodInsnNode) insn).name) && replacement.desc.equals(((MethodInsnNode) insn).desc); } diff --git a/gradle.properties b/gradle.properties index 5c339d84c2..7190663170 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ org.gradle.parallel=true JAVA_VERSION=21 MC_VERSION=1.21.11 MC_NEXT_VERSION=1.22 -MCP_VERSION=20251209.095502 +MCP_VERSION=20251223.124241 MAPPING_CHANNEL=official MAPPING_VERSION=1.21.11 diff --git a/patches/minecraft/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch b/patches/minecraft/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch index 2bca880f42..2867c24686 100644 --- a/patches/minecraft/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch +++ b/patches/minecraft/net/minecraft/data/registries/RegistriesDatapackGenerator.java.patch @@ -37,7 +37,7 @@ return CompletableFuture.allOf( p_358460_.listElements() + .filter(holder -> shouldDump(holder.key())) - .map( + .>map( p_448721_ -> dumpValue( packoutput$pathprovider.json(p_448721_.key().identifier()), @@ -65,6 +_,10 @@ diff --git a/settings.gradle b/settings.gradle index 0c24a03308..38deb95e8b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -25,13 +25,12 @@ dependencyResolutionManagement { libs { plugin('apt', 'com.diffplug.eclipse.apt').version('4.2.0') - library('forgespi', 'net.minecraftforge:forgespi:7.1.5') // Needs modlauncher + library('forgespi', 'net.minecraftforge:forgespi:8.0.0') // Needs modlauncher library('modlauncher', 'net.minecraftforge:modlauncher:10.2.4') // Needs securemodules library('securemodules', 'net.minecraftforge:securemodules:2.2.24') // Needs unsafe library('unsafe', 'net.minecraftforge:unsafe:0.9.2') library('accesstransformers', 'net.minecraftforge:accesstransformers:8.2.2') - library('coremods', 'net.minecraftforge:coremods:5.2.6') - library('nashorn', 'org.openjdk.nashorn:nashorn-core:15.4') // Needed by coremods, because the JRE no longer ships JS + library('coremods-api', 'net.minecraftforge:coremods-api:5.3.0') library('eventbus', 'net.minecraftforge:eventbus:7.0-beta.12') library('eventbus-validator', 'net.minecraftforge:eventbus-validator:7.0-beta.12') library('mergetool-api', 'net.minecraftforge:mergetool-api:1.0') diff --git a/src/main/java/net/minecraftforge/network/tasks/ModVersionsTask.java b/src/main/java/net/minecraftforge/network/tasks/ModVersionsTask.java index 3cdc6cc95b..664af5222e 100644 --- a/src/main/java/net/minecraftforge/network/tasks/ModVersionsTask.java +++ b/src/main/java/net/minecraftforge/network/tasks/ModVersionsTask.java @@ -15,13 +15,11 @@ import net.minecraftforge.network.config.ConfigurationTaskContext; import net.minecraftforge.network.packets.ModVersions; /** - * Sends the list of known channels to the client using the - * Plugin Channel - * register messages. + * Sends a list of mods and their versions, this is easily spoofed so should not be relied on for anti-cheats. */ @ApiStatus.Internal public class ModVersionsTask implements ConfigurationTask { - public static final Type TYPE = new Type("forge:channel_list"); + public static final Type TYPE = new Type("forge:mod_versions"); @Override public void start(ConfigurationTaskContext ctx) {